AngularAtlased. 22.2

Ch. 11Quality & performance50 / 75

Performance — a checklist

What really matters: OnPush + signals, track, @defer, lazy routes, images, bundles and hydration.

~0 min read Official docs

In modern Angular, good performance comes mostly from the defaults: OnPush, signals, zoneless, lazy routes, @defer. The checklist below is what you check when something is slow — in the order it’s worth checking. If the app gets slower the longer the tab stays open, it’s usually not rendering but a memory leak.

Checklist

RENDERING
  [ ] OnPush components (default in v22) + state in signals
  [ ] @for with track on a stable id (not identity on reloaded data)
  [ ] Calculations in computed() / a pure pipe, not in methods called from the template
  [ ] Very large lists → virtual scroll (CDK ScrollingModule) or pagination

LOADING
  [ ] All pages lazy (loadComponent / loadChildren)
  [ ] Heavy components below the fold → @defer (on viewport / interaction)
  [ ] Heavy, rarely used services → injectAsync() (v22)
  [ ] Images with NgOptimizedImage (ngSrc, width/height, priority on the LCP)
  [ ] Bundle budgets in angular.json; check what goes in with source-map-explorer

SSR (if applicable)
  [ ] Incremental hydration (default in v22) + @defer (hydrate on ...)
  [ ] Event replay for the clicks made during hydration
  [ ] TransferCache for the requests made on the server

track matters more than you think

When data reloaded from the server arrives as new objects, track row (identity) makes Angular consider every row “new” and destroy/recreate the whole DOM. With track row.id, it reuses the existing rows and updates only what changed.

Bonus: in dev mode, Angular detects the problem itself and logs the warning NG0956 (“track by identity caused re-creation of the entire collection”).

Live3000 rows: track id vs track identity
“Refetch” (NEW objects, same ids) for 3000 rows:
Element 0961
Element 1109
Element 2761
Element 3283
Element 4637
Element 5310
Element 6834
Element 7180
Element 8301
Element 9845
Element 10586
Element 1156
Element 12942
Element 13145
Element 14891
Element 1555
Element 16430
Element 17175
Element 18657
Element 19291
Element 20783
Element 21684
Element 22549
Element 23141
Element 2460
Element 25815
Element 266
Element 27228
Element 28128
Element 29394
Element 30774
Element 3162
Element 3272
Element 3353
Element 346
Element 35258
Element 36476
Element 37164
Element 38540
Element 39893
Element 40381
Element 41716
Element 42702
Element 43468
Element 44623
Element 45888
Element 46440
Element 47910
Element 4897
Element 49995
Element 50706
Element 51272
Element 527
Element 531
Element 54506
Element 55967
Element 56683
Element 57725
Element 58604
Element 59265
Element 60841
Element 61986
Element 62112
Element 6318
Element 64152
Element 65184
Element 66700
Element 67459
Element 68893
Element 69846
Element 70142
Element 7167
Element 72434
Element 73778
Element 74923
Element 75163
Element 76404
Element 7773
Element 78711
Element 79740
Element 80838
Element 81344
Element 82289
Element 83427
Element 84698
Element 85255
Element 86623
Element 87936
Element 88544
Element 89298
Element 90790
Element 91958
Element 92480
Element 93407
Element 94584
Element 95418
Element 96593
Element 97215
Element 98703
Element 998
Element 100640
Element 101849
Element 102647
Element 103571
Element 104373
Element 105270
Element 106617
Element 107145
Element 108185
Element 109964
Element 110742
Element 111961
Element 112267
Element 113772
Element 114499
Element 115582
Element 116170
Element 117634
Element 118265
Element 119730
Element 120173
Element 121269
Element 122466
Element 123762
Element 124698
Element 125126
Element 126150
Element 12754
Element 128325
Element 129214
Element 13031
Element 131996
Element 13256
Element 133998
Element 134199
Element 13595
Element 136669
Element 137797
Element 138563
Element 139826
Element 140780
Element 141530
Element 142300
Element 143225
Element 144726
Element 145893
Element 146923
Element 147489
Element 148726
Element 149732
Element 150756
Element 151683
Element 152403
Element 153267
Element 15474
Element 155952
Element 156160
Element 157673
Element 158926
Element 15945
Element 160589
Element 161188
Element 162773
Element 163404
Element 16410
Element 165549
Element 16650
Element 167670
Element 168418
Element 169575
Element 170801
Element 171209
Element 172813
Element 173794
Element 174749
Element 175762
Element 176681
Element 177144
Element 178431
Element 179486
Element 180977
Element 181300
Element 182695
Element 183397
Element 184123
Element 185504
Element 186174
Element 187379
Element 188308
Element 189422
Element 19071
Element 191983
Element 192926
Element 193187
Element 194488
Element 195418
Element 196494
Element 197715
Element 198256
Element 199321
Element 20075
Element 201188
Element 202455
Element 203403
Element 204177
Element 205618
Element 206359
Element 207508
Element 208431
Element 209887
Element 21036
Element 211351
Element 212366
Element 21351
Element 214943
Element 215479
Element 21627
Element 217501
Element 218392
Element 219299
Element 220815
Element 221931
Element 22225
Element 223923
Element 224614
Element 225728
Element 226772
Element 227382
Element 228327
Element 229787
Element 230467
Element 231434
Element 23256
Element 233564
Element 234682
Element 235673
Element 236430
Element 237499
Element 238276
Element 239516
Element 240982
Element 241574
Element 242480
Element 243171
Element 244827
Element 245524
Element 246466
Element 24761
Element 248667
Element 249826
Element 250159
Element 251281
Element 252927
Element 253424
Element 254904
Element 255112
Element 256401
Element 257283
Element 258548
Element 259541
Element 260474
Element 261714
Element 262701
Element 263408
Element 264378
Element 265915
Element 266995
Element 267604
Element 268477
Element 269214
Element 270822
Element 271943
Element 27254
Element 273206
Element 274553
Element 275532
Element 276935
Element 277267
Element 278859
Element 279448
Element 280749
Element 281635
Element 282766
Element 283209
Element 284204
Element 285788
Element 286190
Element 287683
Element 288820
Element 289476
Element 290921
Element 291996
Element 29245
Element 29381
Element 294801
Element 295548
Element 296765
Element 297930
Element 29863
Element 299311
Element 300801
Element 301440
Element 302742
Element 30371
Element 304517
Element 305210
Element 306639
Element 307522
Element 308733
Element 30999
Element 310778
Element 311345
Element 312189
Element 313185
Element 314172
Element 315933
Element 316456
Element 317562
Element 318476
Element 319205
Element 320688
Element 321599
Element 32253
Element 32381
Element 324579
Element 325270
Element 326483
Element 327433
Element 328187
Element 329237
Element 330514
Element 331306
Element 332909
Element 333170
Element 334455
Element 335912
Element 336951
Element 337218
Element 338416
Element 33928
Element 340353
Element 341909
Element 342285
Element 343401
Element 344612
Element 345413
Element 346760
Element 34730
Element 348881
Element 349326
Element 350495
Element 351925
Element 352460
Element 35346
Element 354693
Element 355757
Element 356142
Element 357756
Element 358791
Element 359738
Element 36032
Element 361853
Element 362990
Element 363155
Element 364545
Element 365609
Element 366203
Element 367882
Element 368218
Element 369887
Element 370385
Element 371538
Element 372917
Element 373752
Element 374324
Element 375565
Element 376557
Element 377640
Element 378811
Element 379390
Element 380448
Element 381689
Element 38281
Element 383353
Element 384984
Element 385726
Element 386820
Element 387179
Element 388459
Element 389997
Element 390288
Element 391958
Element 392811
Element 393930
Element 394637
Element 395764
Element 396388
Element 397653
Element 398766
Element 399229
Element 400374
Element 401589
Element 402144
Element 403851
Element 404119
Element 405797
Element 406561
Element 407162
Element 408901
Element 409535
Element 410201
Element 411587
Element 412925
Element 413150
Element 414507
Element 415608
Element 416720
Element 417428
Element 418463
Element 419812
Element 42047
Element 421869
Element 422619
Element 423720
Element 424788
Element 425968
Element 426436
Element 427749
Element 428534
Element 429668
Element 430736
Element 431502
Element 432970
Element 433521
Element 434142
Element 435931
Element 436268
Element 437824
Element 438855
Element 439960
Element 440364
Element 441745
Element 442328
Element 44321
Element 444797
Element 44521
Element 446566
Element 44749
Element 448618
Element 449675
Element 450205
Element 451894
Element 452451
Element 453659
Element 454797
Element 455969
Element 456265
Element 457645
Element 458408
Element 459508
Element 460972
Element 461704
Element 462653
Element 463533
Element 464694
Element 465360
Element 466144
Element 467827
Element 468752
Element 469732
Element 470442
Element 47179
Element 472458
Element 473606
Element 474675
Element 475127
Element 476371
Element 47737
Element 478314
Element 479829
Element 48063
Element 481927
Element 482532
Element 483601
Element 484940
Element 485844
Element 486191
Element 487555
Element 488833
Element 489461
Element 490150
Element 491596
Element 492776
Element 493271
Element 494857
Element 495982
Element 496390
Element 497619
Element 498728
Element 499394
Element 50096
Element 501839
Element 502646
Element 503489
Element 504687
Element 505351
Element 506783
Element 507670
Element 508943
Element 50959
Element 510810
Element 511411
Element 512265
Element 513153
Element 514290
Element 515584
Element 516602
Element 517724
Element 518418
Element 519154
Element 520479
Element 521334
Element 52280
Element 523295
Element 524648
Element 525177
Element 526619
Element 527410
Element 528792
Element 529329
Element 530381
Element 531409
Element 532279
Element 533136
Element 534117
Element 535702
Element 536938
Element 537830
Element 538779
Element 539687
Element 540530
Element 541141
Element 54280
Element 543171
Element 544173
Element 545760
Element 546733
Element 547880
Element 548547
Element 549359
Element 550403
Element 55151
Element 552708
Element 553274
Element 554547
Element 555256
Element 556726
Element 557692
Element 558522
Element 559292
Element 560955
Element 561362
Element 562587
Element 563777
Element 564823
Element 565427
Element 56689
Element 567308
Element 568554
Element 569628
Element 570120
Element 571629
Element 572883
Element 573950
Element 574853
Element 575945
Element 576710
Element 57763
Element 578281
Element 57927
Element 580809
Element 581873
Element 582729
Element 583639
Element 584795
Element 585967
Element 586329
Element 587175
Element 588842
Element 589665
Element 590853
Element 591536
Element 592260
Element 593252
Element 594547
Element 595840
Element 5963
Element 597816
Element 59849
Element 599375
Element 600488
Element 601439
Element 602470
Element 603790
Element 60491
Element 605405
Element 606962
Element 607423
Element 60828
Element 609397
Element 610135
Element 611698
Element 612905
Element 613838
Element 614780
Element 615934
Element 61661
Element 617339
Element 618270
Element 619926
Element 620590
Element 621676
Element 622839
Element 623231
Element 624389
Element 625386
Element 626869
Element 627832
Element 628535
Element 629489
Element 630193
Element 631663
Element 632100
Element 633531
Element 634750
Element 635738
Element 636412
Element 6377
Element 638910
Element 639567
Element 640701
Element 641324
Element 642165
Element 643671
Element 644332
Element 645383
Element 64638
Element 647187
Element 648802
Element 649174
Element 650515
Element 651169
Element 652357
Element 653629
Element 654458
Element 655151
Element 656872
Element 65780
Element 658376
Element 659543
Element 660391
Element 661965
Element 662337
Element 663334
Element 664780
Element 665462
Element 66616
Element 667947
Element 668212
Element 669658
Element 670807
Element 671726
Element 672564
Element 673308
Element 674352
Element 67550
Element 676843
Element 677512
Element 67890
Element 679271
Element 680751
Element 681698
Element 682420
Element 683210
Element 684807
Element 685804
Element 686788
Element 687191
Element 688212
Element 689415
Element 690205
Element 691789
Element 692478
Element 693521
Element 694491
Element 69545
Element 69647
Element 697421
Element 698787
Element 699203
Element 700461
Element 701139
Element 702682
Element 703242
Element 704716
Element 705351
Element 706748
Element 707763
Element 708915
Element 709684
Element 710350
Element 711831
Element 712596
Element 713154
Element 714596
Element 7151
Element 716972
Element 717834
Element 718998
Element 719476
Element 720532
Element 721487
Element 72269
Element 723189
Element 724233
Element 725495
Element 726629
Element 727594
Element 728197
Element 729941
Element 730997
Element 731819
Element 732269
Element 733523
Element 73474
Element 735424
Element 736418
Element 737412
Element 738493
Element 739277
Element 740481
Element 741970
Element 742986
Element 743367
Element 744727
Element 745858
Element 746169
Element 747424
Element 74864
Element 74991
Element 75065
Element 751598
Element 752451
Element 753317
Element 754376
Element 755415
Element 756901
Element 757438
Element 758389
Element 759923
Element 760690
Element 761557
Element 762981
Element 76329
Element 76473
Element 765174
Element 76681
Element 767704
Element 768303
Element 769547
Element 770166
Element 771483
Element 772697
Element 773233
Element 774681
Element 775976
Element 776936
Element 777321
Element 778320
Element 77938
Element 780732
Element 781942
Element 782925
Element 783504
Element 784866
Element 785425
Element 786461
Element 787118
Element 788978
Element 789151
Element 790302
Element 791394
Element 792545
Element 79340
Element 794689
Element 795793
Element 796189
Element 797597
Element 798371
Element 799537
Element 800615
Element 801322
Element 802101
Element 803406
Element 804552
Element 805683
Element 80627
Element 807377
Element 808121
Element 809151
Element 81071
Element 811794
Element 812355
Element 813582
Element 814370
Element 815656
Element 81694
Element 817702
Element 818347
Element 819935
Element 820531
Element 821825
Element 822863
Element 823394
Element 824984
Element 825892
Element 826652
Element 827575
Element 828375
Element 829781
Element 83024
Element 83175
Element 83278
Element 83314
Element 834475
Element 835958
Element 836860
Element 837633
Element 838226
Element 839582
Element 840227
Element 841599
Element 842803
Element 843719
Element 84495
Element 845658
Element 846619
Element 847545
Element 84820
Element 849493
Element 850475
Element 851381
Element 85215
Element 853313
Element 854876
Element 855618
Element 856983
Element 857605
Element 858756
Element 85961
Element 860256
Element 861295
Element 862194
Element 863678
Element 864969
Element 865709
Element 866245
Element 867243
Element 868406
Element 869859
Element 870408
Element 871786
Element 87270
Element 873944
Element 87411
Element 875452
Element 876766
Element 87773
Element 87848
Element 879750
Element 880116
Element 881409
Element 882188
Element 883184
Element 884573
Element 885681
Element 886733
Element 887389
Element 888295
Element 889228
Element 890853
Element 891246
Element 892995
Element 893526
Element 894470
Element 895506
Element 896149
Element 897503
Element 898107
Element 899934
Element 900627
Element 901812
Element 902295
Element 90326
Element 904762
Element 905650
Element 906499
Element 907502
Element 908536
Element 909246
Element 910696
Element 91152
Element 912174
Element 913821
Element 914488
Element 915578
Element 916548
Element 917493
Element 91853
Element 919311
Element 920388
Element 921475
Element 922794
Element 923420
Element 924590
Element 925746
Element 926558
Element 927842
Element 928457
Element 929883
Element 930752
Element 931902
Element 932309
Element 933438
Element 93495
Element 935902
Element 936725
Element 937158
Element 938943
Element 939500
Element 940563
Element 941189
Element 942339
Element 943661
Element 94445
Element 945627
Element 946230
Element 947881
Element 948481
Element 949363
Element 950547
Element 951117
Element 952904
Element 953645
Element 95422
Element 955918
Element 956573
Element 957821
Element 958389
Element 959708
Element 960299
Element 961678
Element 962858
Element 963344
Element 964466
Element 965197
Element 966987
Element 967657
Element 968688
Element 969439
Element 970618
Element 971905
Element 972976
Element 973153
Element 974801
Element 975733
Element 976810
Element 977969
Element 978846
Element 979363
Element 980763
Element 981962
Element 982619
Element 98382
Element 984546
Element 985875
Element 986983
Element 987494
Element 988134
Element 989385
Element 990223
Element 991508
Element 992661
Element 993411
Element 99492
Element 99575
Element 996202
Element 997307
Element 998751
Element 999270
Element 100044
Element 1001928
Element 1002787
Element 1003181
Element 1004360
Element 1005447
Element 1006885
Element 1007310
Element 1008189
Element 1009224
Element 1010550
Element 1011847
Element 1012571
Element 1013739
Element 1014967
Element 1015991
Element 1016190
Element 1017578
Element 1018408
Element 1019838
Element 1020374
Element 102133
Element 1022171
Element 1023496
Element 1024507
Element 1025733
Element 1026342
Element 1027674
Element 102877
Element 10291
Element 1030518
Element 1031930
Element 1032109
Element 1033185
Element 1034314
Element 1035820
Element 1036882
Element 1037555
Element 1038986
Element 1039566
Element 1040685
Element 1041320
Element 104237
Element 1043718
Element 1044358
Element 1045356
Element 1046703
Element 1047812
Element 1048386
Element 1049277
Element 1050333
Element 1051178
Element 1052650
Element 1053251
Element 1054394
Element 1055150
Element 1056423
Element 1057308
Element 1058710
Element 1059571
Element 1060556
Element 1061443
Element 1062243
Element 1063270
Element 106440
Element 1065673
Element 106678
Element 1067624
Element 1068370
Element 1069388
Element 1070604
Element 1071389
Element 1072808
Element 1073455
Element 1074437
Element 1075169
Element 1076927
Element 1077290
Element 1078269
Element 1079266
Element 1080728
Element 1081606
Element 1082957
Element 1083532
Element 1084143
Element 1085591
Element 1086913
Element 1087853
Element 1088358
Element 1089649
Element 1090751
Element 1091467
Element 1092536
Element 1093957
Element 1094279
Element 1095634
Element 1096922
Element 1097203
Element 1098844
Element 1099552
Element 1100559
Element 1101674
Element 1102287
Element 1103455
Element 1104325
Element 1105956
Element 1106514
Element 1107760
Element 1108459
Element 1109817
Element 1110265
Element 1111611
Element 1112733
Element 1113315
Element 1114890
Element 111556
Element 1116945
Element 1117996
Element 1118359
Element 111971
Element 1120458
Element 1121882
Element 1122658
Element 11234
Element 1124369
Element 1125155
Element 1126651
Element 1127934
Element 1128731
Element 1129506
Element 1130753
Element 1131579
Element 1132736
Element 1133677
Element 113412
Element 1135749
Element 1136982
Element 1137808
Element 1138685
Element 1139693
Element 114022
Element 1141300
Element 1142814
Element 1143749
Element 1144688
Element 1145988
Element 114634
Element 1147415
Element 1148850
Element 1149258
Element 1150665
Element 115184
Element 1152167
Element 1153395
Element 1154290
Element 1155714
Element 1156987
Element 115732
Element 1158222
Element 1159765
Element 1160868
Element 1161756
Element 1162420
Element 1163964
Element 1164392
Element 1165922
Element 1166688
Element 1167806
Element 1168341
Element 1169459
Element 1170341
Element 1171731
Element 1172268
Element 1173754
Element 1174294
Element 1175703
Element 1176533
Element 1177857
Element 1178928
Element 117911
Element 1180955
Element 1181698
Element 1182608
Element 1183414
Element 1184180
Element 1185285
Element 1186694
Element 1187991
Element 1188248
Element 1189591
Element 1190120
Element 1191689
Element 1192136
Element 1193796
Element 1194112
Element 1195774
Element 1196274
Element 1197417
Element 1198515
Element 1199702
Element 1200243
Element 1201187
Element 1202623
Element 1203932
Element 1204571
Element 1205116
Element 1206117
Element 1207633
Element 1208565
Element 1209992
Element 1210479
Element 1211659
Element 1212642
Element 1213354
Element 121495
Element 1215861
Element 121617
Element 1217695
Element 1218872
Element 1219340
Element 1220776
Element 1221199
Element 1222552
Element 1223503
Element 1224763
Element 1225146
Element 1226298
Element 1227792
Element 1228700
Element 1229522
Element 1230821
Element 1231430
Element 1232797
Element 1233180
Element 1234364
Element 1235498
Element 1236573
Element 1237903
Element 1238329
Element 1239994
Element 1240349
Element 1241830
Element 1242360
Element 1243157
Element 1244399
Element 1245832
Element 1246637
Element 124789
Element 1248777
Element 1249139
Element 125038
Element 1251538
Element 1252688
Element 1253141
Element 1254667
Element 1255607
Element 125660
Element 1257137
Element 1258297
Element 1259685
Element 1260915
Element 1261650
Element 1262290
Element 1263537
Element 1264803
Element 1265716
Element 1266115
Element 1267484
Element 1268142
Element 126997
Element 1270658
Element 127194
Element 1272925
Element 1273571
Element 1274107
Element 1275310
Element 1276567
Element 1277668
Element 1278453
Element 1279794
Element 1280283
Element 1281904
Element 1282114
Element 12836
Element 1284209
Element 1285241
Element 1286251
Element 1287209
Element 1288176
Element 1289223
Element 1290493
Element 1291352
Element 1292457
Element 1293983
Element 1294172
Element 1295132
Element 1296616
Element 1297651
Element 1298390
Element 1299129
Element 1300712
Element 1301137
Element 1302999
Element 1303126
Element 1304547
Element 1305668
Element 1306621
Element 1307987
Element 1308135
Element 1309257
Element 131021
Element 1311744
Element 1312391
Element 1313629
Element 1314819
Element 1315830
Element 1316290
Element 1317559
Element 1318483
Element 1319549
Element 1320825
Element 1321244
Element 1322167
Element 1323203
Element 132462
Element 1325614
Element 13264
Element 1327773
Element 1328968
Element 1329537
Element 1330971
Element 1331200
Element 1332248
Element 1333785
Element 1334841
Element 133516
Element 1336236
Element 1337267
Element 1338482
Element 1339763
Element 1340359
Element 1341966
Element 1342139
Element 134360
Element 1344604
Element 1345901
Element 1346776
Element 1347185
Element 1348821
Element 1349259
Element 1350342
Element 1351575
Element 1352901
Element 1353898
Element 1354211
Element 1355299
Element 1356734
Element 1357984
Element 1358932
Element 1359303
Element 1360733
Element 1361102
Element 1362809
Element 136311
Element 1364857
Element 1365437
Element 1366720
Element 1367899
Element 1368737
Element 1369772
Element 1370904
Element 1371684
Element 1372937
Element 137355
Element 1374553
Element 1375949
Element 1376286
Element 1377931
Element 13782
Element 1379802
Element 1380632
Element 1381115
Element 1382968
Element 138372
Element 1384957
Element 1385949
Element 1386384
Element 1387497
Element 1388893
Element 1389243
Element 1390694
Element 139176
Element 1392541
Element 1393488
Element 1394342
Element 1395168
Element 139640
Element 1397953
Element 1398990
Element 1399218
Element 1400212
Element 1401283
Element 1402900
Element 1403206
Element 1404815
Element 1405591
Element 1406824
Element 1407826
Element 1408884
Element 1409169
Element 1410608
Element 14116
Element 1412313
Element 1413528
Element 1414850
Element 1415601
Element 1416806
Element 1417711
Element 1418588
Element 1419447
Element 1420844
Element 1421854
Element 1422282
Element 1423590
Element 142432
Element 1425459
Element 1426195
Element 1427139
Element 1428635
Element 1429464
Element 1430487
Element 1431920
Element 1432652
Element 1433177
Element 1434113
Element 1435285
Element 1436858
Element 1437129
Element 1438276
Element 1439993
Element 1440305
Element 1441633
Element 14423
Element 1443969
Element 1444276
Element 1445378
Element 144663
Element 1447385
Element 1448498
Element 1449648
Element 1450180
Element 1451198
Element 145289
Element 1453655
Element 1454594
Element 1455285
Element 145654
Element 1457246
Element 145846
Element 1459797
Element 1460690
Element 1461312
Element 1462833
Element 1463399
Element 1464211
Element 1465852
Element 1466241
Element 1467608
Element 14680
Element 1469160
Element 147022
Element 1471992
Element 1472564
Element 1473300
Element 1474778
Element 1475169
Element 147615
Element 1477908
Element 147835
Element 1479778
Element 1480764
Element 148113
Element 148284
Element 1483229
Element 1484594
Element 1485770
Element 1486815
Element 1487377
Element 1488572
Element 1489645
Element 1490995
Element 1491575
Element 1492258
Element 1493975
Element 1494864
Element 1495990
Element 1496274
Element 1497237
Element 1498657
Element 1499894
Element 1500168
Element 1501338
Element 1502621
Element 1503859
Element 1504397
Element 1505867
Element 1506562
Element 1507253
Element 1508985
Element 150984
Element 1510790
Element 1511899
Element 1512719
Element 1513929
Element 1514308
Element 151564
Element 1516121
Element 151762
Element 1518490
Element 1519564
Element 1520832
Element 1521226
Element 152268
Element 1523208
Element 1524566
Element 1525886
Element 1526798
Element 152760
Element 1528172
Element 1529538
Element 1530277
Element 1531623
Element 1532282
Element 1533143
Element 1534886
Element 1535345
Element 1536827
Element 1537310
Element 1538365
Element 1539526
Element 1540166
Element 1541927
Element 1542632
Element 1543624
Element 1544522
Element 1545497
Element 1546840
Element 1547682
Element 1548738
Element 1549736
Element 1550258
Element 1551631
Element 1552974
Element 155354
Element 1554143
Element 1555697
Element 155646
Element 1557807
Element 1558999
Element 1559421
Element 1560981
Element 1561106
Element 1562853
Element 1563439
Element 1564435
Element 1565753
Element 1566691
Element 156742
Element 1568756
Element 1569534
Element 1570276
Element 157166
Element 1572739
Element 1573782
Element 1574615
Element 1575233
Element 1576405
Element 1577708
Element 1578993
Element 1579936
Element 1580552
Element 1581190
Element 1582821
Element 1583197
Element 1584850
Element 1585235
Element 1586236
Element 1587977
Element 1588761
Element 1589172
Element 159087
Element 1591757
Element 1592515
Element 1593287
Element 1594414
Element 1595602
Element 159698
Element 1597298
Element 1598745
Element 1599953
Element 1600634
Element 1601687
Element 160220
Element 1603254
Element 1604562
Element 1605367
Element 1606218
Element 1607890
Element 1608565
Element 1609602
Element 1610981
Element 1611640
Element 1612844
Element 1613945
Element 1614508
Element 161587
Element 1616665
Element 1617292
Element 1618831
Element 1619823
Element 1620595
Element 1621213
Element 1622104
Element 1623994
Element 162496
Element 1625812
Element 1626351
Element 1627536
Element 1628270
Element 1629620
Element 1630369
Element 1631775
Element 163294
Element 1633490
Element 1634420
Element 1635283
Element 1636878
Element 1637779
Element 1638492
Element 1639553
Element 1640995
Element 1641623
Element 164281
Element 1643444
Element 1644912
Element 1645369
Element 164667
Element 1647614
Element 164841
Element 1649266
Element 1650878
Element 1651264
Element 1652469
Element 1653563
Element 1654812
Element 1655703
Element 1656805
Element 1657720
Element 1658311
Element 1659365
Element 1660957
Element 1661335
Element 1662181
Element 1663128
Element 1664155
Element 1665612
Element 1666862
Element 1667622
Element 1668902
Element 1669139
Element 167019
Element 1671712
Element 1672254
Element 1673383
Element 1674357
Element 1675466
Element 167687
Element 1677261
Element 1678575
Element 1679638
Element 168075
Element 1681601
Element 1682400
Element 1683512
Element 168423
Element 1685154
Element 1686586
Element 1687442
Element 1688776
Element 1689242
Element 1690121
Element 1691663
Element 1692744
Element 169386
Element 1694327
Element 1695195
Element 1696899
Element 1697685
Element 1698155
Element 1699407
Element 1700442
Element 1701567
Element 1702257
Element 1703700
Element 1704504
Element 1705965
Element 170620
Element 1707571
Element 1708391
Element 1709326
Element 1710776
Element 1711656
Element 1712841
Element 171324
Element 1714813
Element 1715819
Element 1716538
Element 1717868
Element 1718230
Element 1719843
Element 1720215
Element 1721757
Element 1722828
Element 172379
Element 1724160
Element 1725549
Element 172616
Element 1727467
Element 1728522
Element 1729288
Element 1730179
Element 1731687
Element 1732948
Element 1733314
Element 173454
Element 1735439
Element 1736529
Element 1737340
Element 1738362
Element 173920
Element 1740526
Element 1741720
Element 1742216
Element 1743552
Element 1744753
Element 1745661
Element 1746480
Element 1747475
Element 1748782
Element 1749528
Element 1750223
Element 1751576
Element 1752355
Element 1753821
Element 1754157
Element 1755990
Element 1756193
Element 1757790
Element 175835
Element 1759117
Element 1760145
Element 176126
Element 176269
Element 1763419
Element 1764807
Element 1765295
Element 1766358
Element 1767619
Element 1768205
Element 1769342
Element 1770104
Element 1771694
Element 1772761
Element 1773284
Element 1774119
Element 17758
Element 1776401
Element 1777173
Element 1778684
Element 1779620
Element 1780762
Element 1781525
Element 1782241
Element 1783923
Element 1784428
Element 178532
Element 1786665
Element 1787558
Element 1788253
Element 1789920
Element 1790979
Element 1791246
Element 1792203
Element 1793358
Element 1794205
Element 1795741
Element 1796687
Element 1797958
Element 1798164
Element 1799965
Element 1800566
Element 1801758
Element 1802724
Element 1803157
Element 1804743
Element 1805404
Element 1806432
Element 1807225
Element 1808206
Element 1809508
Element 1810943
Element 1811852
Element 1812398
Element 1813279
Element 1814774
Element 1815424
Element 1816711
Element 1817555
Element 181886
Element 1819313
Element 1820332
Element 1821502
Element 1822223
Element 1823359
Element 1824882
Element 1825445
Element 1826981
Element 1827606
Element 1828625
Element 1829112
Element 1830183
Element 1831147
Element 1832646
Element 183388
Element 1834202
Element 1835949
Element 1836425
Element 1837352
Element 1838722
Element 1839361
Element 1840624
Element 1841791
Element 1842653
Element 1843765
Element 1844605
Element 184544
Element 184662
Element 184754
Element 1848155
Element 1849108
Element 1850312
Element 185180
Element 1852274
Element 1853727
Element 1854148
Element 1855991
Element 1856390
Element 1857863
Element 1858190
Element 1859328
Element 1860251
Element 1861357
Element 1862718
Element 1863906
Element 1864267
Element 1865940
Element 186626
Element 1867501
Element 1868637
Element 1869436
Element 1870718
Element 1871783
Element 1872738
Element 1873139
Element 1874745
Element 187527
Element 1876758
Element 1877854
Element 1878382
Element 1879137
Element 1880853
Element 1881166
Element 1882923
Element 1883414
Element 1884309
Element 1885803
Element 1886933
Element 1887193
Element 1888536
Element 1889689
Element 1890749
Element 1891958
Element 1892827
Element 1893918
Element 1894921
Element 1895887
Element 1896145
Element 1897809
Element 1898498
Element 189929
Element 190024
Element 1901113
Element 1902609
Element 1903957
Element 1904739
Element 1905199
Element 1906377
Element 1907856
Element 1908551
Element 1909970
Element 1910953
Element 1911342
Element 1912792
Element 1913547
Element 1914591
Element 1915567
Element 1916359
Element 1917114
Element 1918323
Element 1919283
Element 192040
Element 1921662
Element 1922343
Element 1923106
Element 192441
Element 1925947
Element 1926787
Element 1927444
Element 1928673
Element 1929813
Element 1930853
Element 1931973
Element 1932271
Element 1933773
Element 1934894
Element 1935443
Element 1936783
Element 1937624
Element 1938858
Element 1939833
Element 1940774
Element 1941107
Element 1942988
Element 1943652
Element 1944847
Element 1945344
Element 1946930
Element 1947949
Element 1948606
Element 1949994
Element 1950360
Element 1951870
Element 1952671
Element 1953303
Element 1954835
Element 1955707
Element 1956564
Element 1957296
Element 1958709
Element 1959711
Element 1960517
Element 1961573
Element 196272
Element 1963192
Element 1964412
Element 1965452
Element 1966904
Element 1967915
Element 1968123
Element 1969303
Element 1970212
Element 1971778
Element 1972657
Element 1973311
Element 197443
Element 1975722
Element 1976862
Element 197769
Element 1978311
Element 1979146
Element 1980399
Element 1981959
Element 1982724
Element 1983501
Element 1984175
Element 1985238
Element 1986600
Element 1987987
Element 198855
Element 1989578
Element 1990347
Element 1991404
Element 1992814
Element 1993571
Element 1994361
Element 1995199
Element 1996976
Element 1997886
Element 1998634
Element 1999832
Element 2000105
Element 200135
Element 2002373
Element 2003428
Element 2004217
Element 2005500
Element 2006943
Element 2007176
Element 2008441
Element 200998
Element 2010854
Element 2011294
Element 201224
Element 2013312
Element 2014593
Element 2015875
Element 2016480
Element 2017383
Element 2018190
Element 2019239
Element 2020431
Element 202147
Element 2022284
Element 202323
Element 2024354
Element 2025566
Element 2026483
Element 2027891
Element 2028355
Element 2029972
Element 2030107
Element 2031818
Element 2032474
Element 2033404
Element 2034136
Element 2035952
Element 2036335
Element 2037138
Element 2038781
Element 2039633
Element 2040457
Element 2041519
Element 204281
Element 2043745
Element 2044509
Element 2045982
Element 2046417
Element 2047609
Element 2048297
Element 2049815
Element 2050741
Element 2051687
Element 2052193
Element 2053948
Element 2054824
Element 2055371
Element 205655
Element 2057243
Element 2058631
Element 2059985
Element 2060122
Element 2061880
Element 2062766
Element 2063495
Element 2064796
Element 2065891
Element 2066371
Element 2067396
Element 2068591
Element 2069575
Element 2070820
Element 207173
Element 2072911
Element 2073637
Element 2074632
Element 2075285
Element 2076240
Element 2077670
Element 2078655
Element 2079220
Element 2080518
Element 2081428
Element 2082921
Element 2083815
Element 2084300
Element 2085323
Element 2086780
Element 2087293
Element 2088274
Element 2089128
Element 2090825
Element 2091974
Element 2092981
Element 2093913
Element 2094820
Element 2095636
Element 2096223
Element 20977
Element 2098275
Element 2099641
Element 2100953
Element 2101428
Element 2102381
Element 210355
Element 2104311
Element 2105848
Element 2106859
Element 2107219
Element 2108872
Element 210983
Element 2110190
Element 2111820
Element 2112430
Element 211392
Element 2114338
Element 2115963
Element 2116430
Element 2117377
Element 211845
Element 2119857
Element 21200
Element 2121988
Element 2122511
Element 2123661
Element 2124880
Element 2125915
Element 212620
Element 2127245
Element 2128336
Element 2129339
Element 2130466
Element 2131875
Element 2132821
Element 2133721
Element 2134980
Element 2135362
Element 2136606
Element 2137945
Element 2138349
Element 2139628
Element 2140987
Element 2141626
Element 2142101
Element 2143287
Element 2144716
Element 2145996
Element 2146977
Element 214713
Element 2148779
Element 214985
Element 2150900
Element 2151692
Element 2152763
Element 2153728
Element 215462
Element 2155839
Element 2156392
Element 2157730
Element 2158750
Element 2159679
Element 2160568
Element 216113
Element 2162145
Element 2163740
Element 216455
Element 2165573
Element 216648
Element 2167128
Element 2168598
Element 2169758
Element 2170217
Element 2171649
Element 2172636
Element 2173941
Element 2174664
Element 2175550
Element 2176176
Element 2177952
Element 2178159
Element 2179445
Element 2180615
Element 2181234
Element 2182139
Element 2183181
Element 2184549
Element 2185965
Element 2186425
Element 2187726
Element 2188297
Element 2189463
Element 2190191
Element 2191343
Element 2192479
Element 2193280
Element 2194955
Element 2195439
Element 2196581
Element 219753
Element 2198185
Element 2199641
Element 2200897
Element 2201814
Element 2202496
Element 2203103
Element 2204659
Element 2205417
Element 22068
Element 220762
Element 2208152
Element 2209631
Element 2210325
Element 2211597
Element 2212558
Element 221326
Element 2214755
Element 2215407
Element 2216462
Element 2217792
Element 2218324
Element 2219595
Element 2220327
Element 2221381
Element 2222990
Element 2223179
Element 2224697
Element 2225677
Element 2226333
Element 222791
Element 2228224
Element 2229590
Element 2230723
Element 2231626
Element 2232698
Element 2233300
Element 2234309
Element 2235249
Element 2236177
Element 2237877
Element 2238955
Element 2239181
Element 2240979
Element 2241129
Element 2242570
Element 2243841
Element 2244875
Element 2245744
Element 2246327
Element 2247357
Element 2248713
Element 2249814
Element 2250522
Element 2251444
Element 2252919
Element 2253449
Element 2254223
Element 2255992
Element 2256692
Element 2257208
Element 2258756
Element 2259351
Element 2260316
Element 2261442
Element 2262145
Element 2263455
Element 2264355
Element 2265587
Element 2266171
Element 2267612
Element 2268908
Element 2269884
Element 2270700
Element 2271314
Element 2272493
Element 2273312
Element 2274411
Element 2275598
Element 227643
Element 2277618
Element 2278160
Element 2279658
Element 2280436
Element 2281211
Element 2282353
Element 2283956
Element 2284909
Element 2285937
Element 2286430
Element 2287462
Element 228891
Element 2289133
Element 2290896
Element 2291887
Element 2292325
Element 2293612
Element 2294360
Element 2295628
Element 2296816
Element 2297298
Element 2298555
Element 2299816
Element 2300801
Element 2301578
Element 2302747
Element 2303559
Element 2304440
Element 2305635
Element 2306480
Element 23074
Element 2308420
Element 2309416
Element 231067
Element 2311683
Element 2312235
Element 2313271
Element 2314294
Element 2315758
Element 2316224
Element 2317988
Element 2318738
Element 2319448
Element 232055
Element 2321884
Element 2322672
Element 2323985
Element 2324940
Element 2325315
Element 232657
Element 2327874
Element 2328329
Element 2329372
Element 2330407
Element 2331518
Element 2332581
Element 2333640
Element 2334923
Element 2335176
Element 233658
Element 2337272
Element 2338611
Element 2339553
Element 2340109
Element 2341800
Element 2342469
Element 2343578
Element 2344787
Element 2345893
Element 2346551
Element 2347829
Element 2348900
Element 2349879
Element 2350181
Element 2351911
Element 2352525
Element 2353555
Element 2354766
Element 235577
Element 235610
Element 2357969
Element 2358509
Element 2359139
Element 2360637
Element 2361290
Element 2362890
Element 2363818
Element 2364261
Element 2365459
Element 2366936
Element 2367295
Element 2368739
Element 2369593
Element 2370271
Element 2371635
Element 237283
Element 2373328
Element 2374988
Element 2375111
Element 2376830
Element 2377359
Element 2378315
Element 2379275
Element 2380129
Element 238135
Element 2382813
Element 2383500
Element 238448
Element 2385899
Element 2386435
Element 2387144
Element 2388259
Element 2389405
Element 2390919
Element 2391494
Element 2392422
Element 2393852
Element 2394812
Element 2395797
Element 2396378
Element 2397180
Element 2398925
Element 239979
Element 2400438
Element 2401326
Element 2402621
Element 2403983
Element 2404172
Element 2405124
Element 2406662
Element 2407600
Element 2408140
Element 2409936
Element 2410451
Element 2411402
Element 2412918
Element 241320
Element 241482
Element 2415411
Element 2416567
Element 2417256
Element 241854
Element 2419719
Element 2420392
Element 2421336
Element 2422876
Element 2423971
Element 2424387
Element 2425373
Element 2426105
Element 2427453
Element 2428738
Element 2429401
Element 243051
Element 2431305
Element 2432299
Element 2433403
Element 2434991
Element 2435292
Element 2436447
Element 2437147
Element 2438491
Element 2439434
Element 2440149
Element 2441193
Element 2442487
Element 2443433
Element 2444161
Element 2445700
Element 2446796
Element 2447603
Element 2448381
Element 2449841
Element 245043
Element 2451670
Element 2452318
Element 2453401
Element 2454626
Element 2455703
Element 2456853
Element 2457777
Element 2458663
Element 2459694
Element 2460526
Element 2461579
Element 2462414
Element 2463583
Element 2464365
Element 2465318
Element 2466218
Element 2467157
Element 2468852
Element 2469200
Element 2470742
Element 247124
Element 2472832
Element 2473233
Element 2474719
Element 2475379
Element 2476570
Element 2477225
Element 2478641
Element 2479614
Element 2480475
Element 2481433
Element 2482450
Element 2483655
Element 2484937
Element 2485815
Element 2486460
Element 2487419
Element 2488514
Element 2489275
Element 2490250
Element 2491110
Element 2492483
Element 2493266
Element 2494751
Element 2495238
Element 2496962
Element 2497580
Element 249868
Element 2499660
Element 2500730
Element 250115
Element 2502102
Element 2503800
Element 2504798
Element 2505566
Element 2506363
Element 2507917
Element 250848
Element 2509451
Element 2510365
Element 251169
Element 251252
Element 2513150
Element 2514137
Element 2515484
Element 2516966
Element 2517285
Element 2518955
Element 2519705
Element 252036
Element 2521588
Element 252224
Element 252375
Element 2524970
Element 2525857
Element 2526385
Element 2527974
Element 2528228
Element 2529254
Element 2530239
Element 2531277
Element 2532987
Element 2533769
Element 253424
Element 253517
Element 2536413
Element 2537569
Element 2538655
Element 2539558
Element 2540103
Element 254163
Element 2542816
Element 2543184
Element 2544657
Element 2545625
Element 2546663
Element 2547592
Element 254828
Element 254930
Element 2550155
Element 2551294
Element 2552231
Element 2553322
Element 2554475
Element 2555859
Element 255626
Element 2557553
Element 2558200
Element 2559182
Element 2560872
Element 2561460
Element 2562730
Element 2563655
Element 2564985
Element 2565915
Element 2566330
Element 2567696
Element 2568340
Element 2569563
Element 2570599
Element 2571421
Element 2572640
Element 2573294
Element 2574660
Element 2575704
Element 2576162
Element 257751
Element 257842
Element 2579804
Element 2580236
Element 2581749
Element 2582959
Element 2583317
Element 2584710
Element 2585738
Element 2586109
Element 2587879
Element 258815
Element 2589826
Element 2590337
Element 2591916
Element 2592920
Element 2593465
Element 2594301
Element 2595520
Element 2596984
Element 2597222
Element 259874
Element 2599403
Element 2600785
Element 2601615
Element 2602638
Element 2603439
Element 2604540
Element 2605771
Element 2606829
Element 2607538
Element 2608572
Element 2609893
Element 2610231
Element 2611660
Element 2612783
Element 2613228
Element 2614208
Element 261537
Element 2616326
Element 2617788
Element 2618128
Element 2619406
Element 2620860
Element 2621797
Element 2622674
Element 2623544
Element 2624272
Element 2625335
Element 2626731
Element 2627791
Element 262851
Element 2629540
Element 263055
Element 2631513
Element 2632278
Element 2633603
Element 263462
Element 263551
Element 2636465
Element 2637442
Element 2638662
Element 263917
Element 2640717
Element 2641638
Element 2642431
Element 2643387
Element 2644304
Element 2645248
Element 2646533
Element 2647858
Element 2648995
Element 2649632
Element 265052
Element 2651944
Element 2652765
Element 2653398
Element 265499
Element 2655754
Element 2656137
Element 2657231
Element 2658412
Element 2659637
Element 266081
Element 2661733
Element 2662914
Element 2663708
Element 266496
Element 2665529
Element 2666509
Element 2667577
Element 2668463
Element 2669532
Element 2670736
Element 2671982
Element 2672957
Element 2673396
Element 2674249
Element 2675769
Element 2676203
Element 2677665
Element 2678530
Element 267965
Element 2680120
Element 2681165
Element 2682453
Element 2683109
Element 2684511
Element 2685448
Element 2686647
Element 2687468
Element 2688683
Element 2689337
Element 2690989
Element 2691249
Element 2692626
Element 2693719
Element 2694939
Element 2695477
Element 2696219
Element 269721
Element 2698624
Element 2699662
Element 2700893
Element 270182
Element 2702619
Element 2703666
Element 2704298
Element 2705993
Element 2706186
Element 2707626
Element 2708526
Element 270978
Element 2710288
Element 271110
Element 2712272
Element 2713491
Element 2714205
Element 2715631
Element 271685
Element 2717213
Element 2718257
Element 2719294
Element 2720763
Element 2721823
Element 2722374
Element 2723234
Element 2724360
Element 2725567
Element 2726378
Element 27279
Element 27285
Element 2729872
Element 2730815
Element 2731847
Element 27321000
Element 2733740
Element 2734957
Element 2735773
Element 2736571
Element 273723
Element 2738161
Element 27392
Element 2740117
Element 2741810
Element 2742441
Element 2743321
Element 2744330
Element 2745903
Element 2746830
Element 2747930
Element 2748119
Element 2749859
Element 2750647
Element 2751716
Element 2752512
Element 275314
Element 2754819
Element 2755143
Element 2756865
Element 2757586
Element 2758243
Element 2759231
Element 2760546
Element 2761516
Element 2762850
Element 276323
Element 2764644
Element 2765784
Element 2766998
Element 2767527
Element 2768951
Element 2769555
Element 277012
Element 2771318
Element 2772308
Element 2773279
Element 2774653
Element 2775574
Element 2776100
Element 2777633
Element 2778233
Element 2779921
Element 2780270
Element 2781491
Element 2782511
Element 2783478
Element 2784238
Element 2785692
Element 2786853
Element 278741
Element 278895
Element 2789488
Element 2790964
Element 2791958
Element 2792692
Element 2793524
Element 2794424
Element 2795587
Element 2796213
Element 2797181
Element 2798132
Element 2799171
Element 2800287
Element 2801468
Element 2802319
Element 2803325
Element 28047
Element 2805316
Element 2806743
Element 2807543
Element 2808561
Element 2809904
Element 2810975
Element 2811249
Element 2812252
Element 281336
Element 2814901
Element 2815280
Element 2816634
Element 281734
Element 2818802
Element 2819382
Element 2820586
Element 2821836
Element 2822455
Element 2823510
Element 2824881
Element 2825802
Element 2826776
Element 2827261
Element 2828824
Element 2829285
Element 2830606
Element 283195
Element 2832376
Element 2833928
Element 2834203
Element 2835170
Element 2836129
Element 2837753
Element 2838872
Element 283928
Element 2840554
Element 2841389
Element 2842712
Element 2843699
Element 2844910
Element 2845559
Element 2846181
Element 2847719
Element 2848553
Element 2849821
Element 2850628
Element 2851885
Element 2852193
Element 2853210
Element 2854404
Element 2855276
Element 2856158
Element 2857107
Element 2858345
Element 2859453
Element 2860165
Element 2861152
Element 2862771
Element 2863462
Element 2864183
Element 2865163
Element 2866301
Element 2867690
Element 2868159
Element 2869657
Element 2870819
Element 2871518
Element 2872321
Element 2873498
Element 2874812
Element 2875394
Element 2876496
Element 2877729
Element 2878921
Element 2879183
Element 2880181
Element 2881133
Element 2882631
Element 2883515
Element 288410
Element 2885875
Element 2886283
Element 2887322
Element 288854
Element 2889545
Element 2890408
Element 2891213
Element 289257
Element 2893228
Element 2894898
Element 2895652
Element 2896385
Element 2897753
Element 2898151
Element 2899189
Element 2900572
Element 2901961
Element 2902857
Element 2903822
Element 2904653
Element 2905308
Element 2906421
Element 2907369
Element 2908805
Element 2909586
Element 2910663
Element 2911498
Element 2912807
Element 2913231
Element 2914776
Element 2915380
Element 2916234
Element 2917732
Element 2918984
Element 291989
Element 292051
Element 292156
Element 2922550
Element 292320
Element 2924819
Element 2925245
Element 2926644
Element 2927343
Element 292886
Element 2929899
Element 2930848
Element 2931455
Element 293225
Element 29331
Element 2934492
Element 2935313
Element 2936743
Element 2937742
Element 2938882
Element 293912
Element 2940355
Element 2941205
Element 294230
Element 2943818
Element 2944538
Element 2945375
Element 2946304
Element 2947658
Element 2948822
Element 2949993
Element 2950399
Element 2951731
Element 295262
Element 29531000
Element 2954385
Element 2955923
Element 2956522
Element 2957553
Element 2958492
Element 2959949
Element 2960863
Element 2961866
Element 2962445
Element 2963340
Element 2964614
Element 2965490
Element 2966522
Element 2967608
Element 2968294
Element 2969739
Element 2970189
Element 2971625
Element 2972925
Element 2973353
Element 2974231
Element 2975288
Element 2976797
Element 2977623
Element 2978908
Element 2979432
Element 2980717
Element 2981298
Element 2982575
Element 2983542
Element 2984845
Element 2985859
Element 2986389
Element 2987317
Element 2988897
Element 2989572
Element 2990539
Element 2991284
Element 2992396
Element 2993335
Element 2994732
Element 2995897
Element 2996893
Element 2997797
Element 2998776
Element 2999151
Press each button a few times. The timings depend on your machine, but the difference is consistent.

Images

<!-- NgOptimizedImage: lazy by default, automatic srcset, warnings for missing dimensions -->
<img ngSrc="/assets/hero.jpg" width="1200" height="600" priority />   <!-- the LCP image -->
<img ngSrc="/assets/avatar.jpg" width="48" height="48" />            <!-- lazy -->
<img ngSrc="product.jpg" fill />                                       <!-- fills the container -->

Very large lists

import { ScrollingModule } from '@angular/cdk/scrolling';

@Component({
  imports: [ScrollingModule],
  template: `
    <cdk-virtual-scroll-viewport itemSize="48" class="viewport">
      <div *cdkVirtualFor="let row of rows(); trackBy: trackById" class="row">{{ row.name }}</div>
    </cdk-virtual-scroll-viewport>
  `,
  styles: `.viewport { height: 480px; }`,
})
export class BigList {
  readonly rows = input.required<Row[]>();
  protected trackById = (_: number, r: Row) => r.id;
}

Bundle

// angular.json → configurations.production.budgets
"budgets": [
  { "type": "initial", "maximumWarning": "500kB", "maximumError": "1MB" },
  { "type": "anyComponentStyle", "maximumWarning": "4kB", "maximumError": "8kB" }
]

SSR and hydration

// app.config.server / app.config.ts with SSR
provideClientHydration(
  withEventReplay(),          // clicks made during hydration aren’t lost
  // withIncrementalHydration() — default since v22
);

Common pitfalls

  • Optimising without measuring: open the Profiler in Angular DevTools before you change any code.
  • Expensive methods in the template (sortedItems() as a method) → they run on every render. Make them computed.
  • Big libraries imported “for one function” (all of lodash, moment.js) → targeted imports or injectAsync.
  • @defer on the main content → a worse LCP. Defer only what’s below the fold.

Ch. 11 · 0 of 4 complete

Finished this lesson?

Mark it and it shows up on your map: in the contents and on the home page.

Marks itself as done once you have read the whole lesson.

  1. Performance — a checklist
  2. Testing with Vitest
  3. DevTools: look inside your app
  4. Angular Aria
See your whole map

All 75 pages · type to filter

  • 01What's new in Angular 21 & 22All the important changes in v21 and v22, briefly, with a link to the page that explains each one.Start
  • 01Your first app, step by stepA reading list built from an empty component to a finished app — signals, @for, inputs and outputs, a service and a form, one step at a time.Start
  • 01Quick decisions“Where do I put this?”, “Signal or Observable?”, “Shared or feature?” — short answers to everyday questions.Start
  • 01Angular interview questions60 real interview questions for junior, mid and senior, with the answer to give, the follow-up and the red flags. Plus a mock interview.Start
  • 02Standalone & bootstrapHow an app starts without NgModule: bootstrapApplication, app.config.ts, imports in the component.Modern fundamentals
  • 02Data binding & eventsInterpolation, property and attribute bindings, events with $event and key filters, and how [( )] is built — what goes into the DOM and what comes back.Modern fundamentals
  • 02Control flow: @if, @for, @switchThe block syntax that replaces *ngIf/*ngFor/ngSwitch, with track, @empty and exhaustive checks.Modern fundamentals
  • 02@let and the new template expressionsLocal variables with @let, arrow functions, spread, regex, instanceof, comments inside tags.Modern fundamentals
  • 02@defer — lazy loading in templatesLoad heavy components only when needed: triggers, prefetch, placeholder, loading, error.Modern fundamentals
  • 02Class & style bindingsWhy [class.x] and [style.x] replaced ngClass and ngStyle (with automatic migration from v21).Modern fundamentals
  • 02Component styles & encapsulation:host, the three encapsulation modes, theming with CSS variables, and why ::ng-deep is a last resort.Modern fundamentals
  • 02Pipes: when and howPure vs impure pipes, custom pipes, and how you choose between a pipe, computed() and a method.Modern fundamentals
  • 03signal() and computed()The reactive primitives: writable state, derived state, equality, untracked and immutability rules.Signals & reactivity
  • 03effect() — when YES, when NOSide effects synchronised with signals: localStorage, logging, imperative APIs. And their traps.Signals & reactivity
  • 03linkedSignal() — editable derived stateA signal that resets when its source changes, but that you can also set manually.Signals & reactivity
  • 03resource, rxResource, httpResourceAsync data as signals: status, value, error, reload, automatic cancellation. Stable since v22.Signals & reactivity
  • 03debounced() — delayed signalsThe “debounce” version of a signal, without RxJS. Perfect for search.Signals & reactivity
  • 03Lists: search, filter, sort, paginateA chain of computed signals that recalculates only what changed, with the filters kept in the URL so a link reopens the same view.Signals & reactivity
  • 03Observables from zeroWhat an Observable is, subscribe and unsubscribe, the operators you use every week, cold vs hot — and when a signal is enough.Signals & reactivity
  • 03Signals ↔ RxJStoSignal, toObservable, takeUntilDestroyed, outputFromObservable — and when RxJS remains the right choice.Signals & reactivity
  • 04input() and output()Inputs as signals (required, transform, alias) and typed outputs. Data down, events up.Components: communication
  • 04model() — two-way bindingBanana-in-a-box [( )] with a single API. When to use it, and when input + output is better.Components: communication
  • 04viewChild & contentChildQueries as signals: viewChild, viewChildren, contentChild, contentChildren, the read option.Components: communication
  • 04Lifecycle & DestroyRefWhich hooks still matter in the signals era, afterNextRender, DestroyRef and typed ngOnChanges.Components: communication
  • 04Content projectionng-content with select, multiple slots, default content and the trap of conditional projection.Components: communication
  • 04ng-template & ngTemplateOutletTemplates as values: render props in Angular, typed context and customising components.Components: communication
  • 05Smart vs DumbContainer vs presentational: who holds the state, who only displays, and how to split them properly.Component design
  • 05Generic components <T>A correctly typed DataTable<T> or Select<T>, with templates for cells.Component design
  • 05Dynamic componentsNgComponentOutlet, createComponent with inputBinding/outputBinding, and a dashboard built from config.Component design
  • 05Directives & host compositionAttribute directives, the host: {} metadata and the Directive Composition API (hostDirectives).Component design
  • 05Custom form controlsFormValueControl (Signal Forms) vs ControlValueAccessor: a star rating, in both variants.Component design
  • 05Change detectionOnPush is the default from v22, zone.js is gone from v21. What triggers rendering and how not to get burned.Component design
  • 06inject() & @Service()The new @Service() decorator from v22, inject() vs the constructor, and the injection context.Dependency Injection
  • 06Providers & the injector hierarchyRoot vs route vs component, useClass/useValue/useFactory/useExisting, and the optional/self/skipSelf modifiers.Dependency Injection
  • 06InjectionToken & provideX()Typed configuration, provideFeature() functions, makeEnvironmentProviders and initializers.Dependency Injection
  • 06injectAsync() — lazy servicesLoad a heavy service only when you need it, with prefetch on idle.Dependency Injection
  • 07Folder structurecore / shared / features, what goes into each, and what a feature looks like inside.Application architecture
  • 07Shared vs featureWhen to move a component into shared and (especially) when NOT to. A concrete checklist.Application architecture
  • 07Interfaces & modelsInline interface or separate file? DTO vs domain model, type vs interface, where to put them.Application architecture
  • 07State management with signalsSimple signal stores, facades, local vs global state, and when you need NgRx.Application architecture
  • 07Style guide & namingThe current official conventions: file names without suffixes, protected, readonly, member order.Application architecture
  • 07Barrels, aliases & boundariesindex.ts, path aliases, a feature’s public API and dependency rules that can be checked automatically.Application architecture
  • 07Errors: @boundary & ErrorHandlerThe new @boundary block from v22.2, the global ErrorHandler, HTTP errors and errors from resource.Application architecture
  • 08Modern routing & lazy loadingloadComponent, child routes, parameters as inputs and parameter inheritance (the new default in v22).Routing
  • 08Guards & resolverscanActivate, canMatch, canDeactivate and resolve as functions, with redirects via UrlTree / RedirectCommand.Routing
  • 09Signal Forms — the basicsForms built on signals: form(), [formField], schema-based validation. Stable since v22.Forms
  • 09Signal Forms — advancedCustom and cross-field validation, async/HTTP with debounce, dynamic lists, disabled/hidden, reusable schemas.Forms
  • 09Typed Reactive FormsTyped FormGroup, nonNullable, FormArray — and how they coexist with Signal Forms.Forms
  • 10HttpClient, interceptors & the API layerHttpClient without setup (v21), Fetch by default (v22), functional interceptors and an API layer with DTO mapping.HTTP & data
  • 11Performance — a checklistWhat really matters: OnPush + signals, track, @defer, lazy routes, images, bundles and hydration.Quality & performance
  • 11Testing with VitestVitest is the default runner from v21. TestBed, components with signals, services, HTTP and harnesses.Quality & performance
  • 11DevTools: look inside your appChrome DevTools and Angular DevTools step by step: what each panel shows, with exercises that work on this site.Quality & performance
  • 11Angular AriaHeadless, accessible components that you style however you like: tabs, accordion, menu, listbox...Quality & performance
  • 12SSR, prerender & render modesWhen to render on the server, when at build time and when only in the browser: RenderMode per route, app.routes.server.ts and the real costs.SSR & hydration
  • 12Hydration: event replay & incrementalHow the browser takes over server HTML without re-rendering it: full hydration, event replay, @defer (hydrate on …) and mismatch errors.SSR & hydration
  • 12Server-compatible codewindow doesn’t exist on the server: PLATFORM_ID, afterNextRender, DOCUMENT, TransferState, the HTTP cache and PendingTasks.SSR & hydration
  • 13Micro frontendsWhen it is worth splitting an app into several deployments and when it is just complexity: Native Federation, Module Federation, iframes, Web Components.Architecture at scale
  • 13Web Components with Angular ElementscreateCustomElement: an Angular component used as an HTML tag anywhere, plus communication between apps through events and BroadcastChannel.Architecture at scale
  • 13Monorepo, libraries & boundariesA workspace with several apps and libraries: ng generate library, Nx, secondary entry points, publishing and dependency rules.Architecture at scale
  • 13Hexagonal architecture (ports & adapters)A domain without Angular, ports as abstract classes and interchangeable adapters: HTTP, localStorage or in-memory, without touching the UI.Architecture at scale
  • 14Signals under the hoodThe reactive graph: producers and consumers, push-pull, why computed is lazy and glitch-free, the diamond problem and when effects run.Advanced reactivity
  • 14Advanced RxJS: higher-order operatorsswitchMap, mergeMap, concatMap and exhaustMap on a live diagram, plus retry with backoff, shareReplay and how to avoid leaks.Advanced reactivity
  • 14NgRx SignalStoreLarge-scale state management on signals: withState, withComputed, withMethods, rxMethod, entities and hooks — and when a simple store is enough.Advanced reactivity
  • 14State machines with signalsNo more impossible states: a typed machine on signals, with transitions, guards and a live state diagram.Advanced reactivity
  • 15WebSockets: real time that survives the networkA typed socket as signals: reconnect with backoff and jitter, heartbeat, an outbox while offline, and SSR safety.Real time & offline
  • 15Optimistic updates & rollbackAn instant UI that stays honest: snapshot and rollback, out-of-order responses, idempotency keys.Real time & offline
  • 15Offline-first: Service Worker & cachingThe Angular Service Worker: caching strategies, update prompts and an outbox for changes made offline.Real time & offline
  • 16Web WorkersHeavy computation without blocking the UI: a real worker in the page, message passing and when it is not worth it.Advanced UI & performance
  • 16Huge lists: virtual scroll100,000 rows without lag: CDK virtual scroll, itemSize, trackBy and the alternatives (pagination, infinite scroll).Advanced UI & performance
  • 16Modern animations & View Transitionsanimate.enter and animate.leave instead of the deprecated @angular/animations, CSS transitions and View Transitions on navigation.Advanced UI & performance
  • 16Memory leaks: finding and fixing themSubscriptions, timers and listeners that outlive their component — how to spot them in DevTools and close them.Advanced UI & performance
  • 17Security: XSS, sanitisation & CSPWhat Angular does automatically against XSS, when bypassSecurityTrust becomes dangerous, plus CSP with nonce, Trusted Types and XSRF.Security & globalisation
  • 17Authentication: tokens & refreshAn interceptor that attaches the token, refreshes once on 401 and replays the queued requests — plus where you keep the token.Security & globalisation
  • 17OAuth 2.1 & OpenID Connect with PKCEThe authorization code flow with PKCE, step by step: verifier and challenge, state and nonce, the ID token, and why a BFF is safer.Security & globalisation
  • 17Internationalisation (i18n)$localize, the i18n attribute, ICU plural/select, a build per language vs runtime translations, and locale-based formatting.Security & globalisation