@navios/di 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +211 -1
  2. package/coverage/clover.xml +1912 -1277
  3. package/coverage/coverage-final.json +37 -28
  4. package/coverage/docs/examples/basic-usage.mts.html +1 -1
  5. package/coverage/docs/examples/factory-pattern.mts.html +1 -1
  6. package/coverage/docs/examples/index.html +1 -1
  7. package/coverage/docs/examples/injection-tokens.mts.html +1 -1
  8. package/coverage/docs/examples/request-scope-example.mts.html +1 -1
  9. package/coverage/docs/examples/service-lifecycle.mts.html +1 -1
  10. package/coverage/index.html +71 -41
  11. package/coverage/lib/_tsup-dts-rollup.d.mts.html +682 -43
  12. package/coverage/lib/index.d.mts.html +7 -4
  13. package/coverage/lib/index.html +5 -5
  14. package/coverage/lib/testing/index.d.mts.html +91 -0
  15. package/coverage/lib/testing/index.html +116 -0
  16. package/coverage/src/base-instance-holder-manager.mts.html +589 -0
  17. package/coverage/src/container.mts.html +257 -74
  18. package/coverage/src/decorators/factory.decorator.mts.html +1 -1
  19. package/coverage/src/decorators/index.html +1 -1
  20. package/coverage/src/decorators/index.mts.html +1 -1
  21. package/coverage/src/decorators/injectable.decorator.mts.html +20 -20
  22. package/coverage/src/enums/index.html +1 -1
  23. package/coverage/src/enums/index.mts.html +1 -1
  24. package/coverage/src/enums/injectable-scope.enum.mts.html +1 -1
  25. package/coverage/src/enums/injectable-type.enum.mts.html +1 -1
  26. package/coverage/src/errors/di-error.mts.html +292 -0
  27. package/coverage/src/errors/errors.enum.mts.html +30 -21
  28. package/coverage/src/errors/factory-not-found.mts.html +31 -22
  29. package/coverage/src/errors/factory-token-not-resolved.mts.html +29 -26
  30. package/coverage/src/errors/index.html +56 -41
  31. package/coverage/src/errors/index.mts.html +15 -9
  32. package/coverage/src/errors/instance-destroying.mts.html +31 -22
  33. package/coverage/src/errors/instance-expired.mts.html +31 -22
  34. package/coverage/src/errors/instance-not-found.mts.html +31 -22
  35. package/coverage/src/errors/unknown-error.mts.html +31 -43
  36. package/coverage/src/event-emitter.mts.html +14 -14
  37. package/coverage/src/factory-context.mts.html +1 -1
  38. package/coverage/src/index.html +121 -46
  39. package/coverage/src/index.mts.html +7 -4
  40. package/coverage/src/injection-token.mts.html +28 -28
  41. package/coverage/src/injector.mts.html +1 -1
  42. package/coverage/src/instance-resolver.mts.html +1762 -0
  43. package/coverage/src/interfaces/factory.interface.mts.html +1 -1
  44. package/coverage/src/interfaces/index.html +1 -1
  45. package/coverage/src/interfaces/index.mts.html +1 -1
  46. package/coverage/src/interfaces/on-service-destroy.interface.mts.html +1 -1
  47. package/coverage/src/interfaces/on-service-init.interface.mts.html +1 -1
  48. package/coverage/src/registry.mts.html +28 -28
  49. package/coverage/src/request-context-holder.mts.html +183 -102
  50. package/coverage/src/request-context-manager.mts.html +532 -0
  51. package/coverage/src/service-instantiator.mts.html +49 -49
  52. package/coverage/src/service-invalidator.mts.html +1372 -0
  53. package/coverage/src/service-locator-event-bus.mts.html +48 -48
  54. package/coverage/src/service-locator-instance-holder.mts.html +2 -14
  55. package/coverage/src/service-locator-manager.mts.html +71 -335
  56. package/coverage/src/service-locator.mts.html +240 -2328
  57. package/coverage/src/symbols/index.html +1 -1
  58. package/coverage/src/symbols/index.mts.html +1 -1
  59. package/coverage/src/symbols/injectable-token.mts.html +1 -1
  60. package/coverage/src/testing/index.html +131 -0
  61. package/coverage/src/testing/index.mts.html +88 -0
  62. package/coverage/src/testing/test-container.mts.html +445 -0
  63. package/coverage/src/token-processor.mts.html +607 -0
  64. package/coverage/src/utils/defer.mts.html +28 -214
  65. package/coverage/src/utils/get-injectable-token.mts.html +7 -7
  66. package/coverage/src/utils/get-injectors.mts.html +99 -99
  67. package/coverage/src/utils/index.html +15 -15
  68. package/coverage/src/utils/index.mts.html +4 -7
  69. package/coverage/src/utils/types.mts.html +1 -1
  70. package/docs/injectable.md +51 -11
  71. package/docs/scopes.md +63 -29
  72. package/lib/_tsup-dts-rollup.d.mts +376 -213
  73. package/lib/_tsup-dts-rollup.d.ts +376 -213
  74. package/lib/{chunk-3NLYPYBY.mjs → chunk-44F3LXW5.mjs} +1021 -605
  75. package/lib/chunk-44F3LXW5.mjs.map +1 -0
  76. package/lib/index.d.mts +6 -4
  77. package/lib/index.d.ts +6 -4
  78. package/lib/index.js +1192 -776
  79. package/lib/index.js.map +1 -1
  80. package/lib/index.mjs +2 -2
  81. package/lib/testing/index.js +1258 -840
  82. package/lib/testing/index.js.map +1 -1
  83. package/lib/testing/index.mjs +1 -1
  84. package/package.json +1 -1
  85. package/src/__tests__/container.spec.mts +47 -13
  86. package/src/__tests__/errors.spec.mts +53 -27
  87. package/src/__tests__/injectable.spec.mts +73 -0
  88. package/src/__tests__/request-scope.spec.mts +0 -2
  89. package/src/__tests__/service-locator-manager.spec.mts +12 -82
  90. package/src/__tests__/service-locator.spec.mts +1009 -1
  91. package/src/__type-tests__/inject.spec-d.mts +30 -7
  92. package/src/__type-tests__/injectable.spec-d.mts +76 -37
  93. package/src/base-instance-holder-manager.mts +2 -9
  94. package/src/container.mts +61 -9
  95. package/src/decorators/injectable.decorator.mts +29 -5
  96. package/src/errors/di-error.mts +69 -0
  97. package/src/errors/index.mts +9 -7
  98. package/src/injection-token.mts +1 -0
  99. package/src/injector.mts +2 -0
  100. package/src/instance-resolver.mts +559 -0
  101. package/src/request-context-holder.mts +0 -2
  102. package/src/request-context-manager.mts +149 -0
  103. package/src/service-invalidator.mts +429 -0
  104. package/src/service-locator-instance-holder.mts +0 -4
  105. package/src/service-locator-manager.mts +10 -40
  106. package/src/service-locator.mts +86 -782
  107. package/src/token-processor.mts +174 -0
  108. package/src/utils/get-injectors.mts +161 -24
  109. package/src/utils/index.mts +0 -1
  110. package/src/utils/types.mts +12 -8
  111. package/lib/chunk-3NLYPYBY.mjs.map +0 -1
  112. package/src/__tests__/defer.spec.mts +0 -166
  113. package/src/errors/errors.enum.mts +0 -8
  114. package/src/errors/factory-not-found.mts +0 -8
  115. package/src/errors/factory-token-not-resolved.mts +0 -10
  116. package/src/errors/instance-destroying.mts +0 -8
  117. package/src/errors/instance-expired.mts +0 -8
  118. package/src/errors/instance-not-found.mts +0 -8
  119. package/src/errors/unknown-error.mts +0 -15
  120. package/src/utils/defer.mts +0 -73
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">86.19% </span>
26
+ <span class="strong">88.88% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>562/652</span>
28
+ <span class='fraction'>136/153</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">82.82% </span>
33
+ <span class="strong">96.29% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>135/163</span>
35
+ <span class='fraction'>26/27</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">97.36% </span>
40
+ <span class="strong">85% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>37/38</span>
42
+ <span class='fraction'>17/20</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">86.19% </span>
47
+ <span class="strong">88.88% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>562/652</span>
49
+ <span class='fraction'>136/153</span>
50
50
  </div>
51
51
 
52
52
 
@@ -309,703 +309,7 @@
309
309
  <a name='L244'></a><a href='#L244'>244</a>
310
310
  <a name='L245'></a><a href='#L245'>245</a>
311
311
  <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a>
435
- <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a>
437
- <a name='L372'></a><a href='#L372'>372</a>
438
- <a name='L373'></a><a href='#L373'>373</a>
439
- <a name='L374'></a><a href='#L374'>374</a>
440
- <a name='L375'></a><a href='#L375'>375</a>
441
- <a name='L376'></a><a href='#L376'>376</a>
442
- <a name='L377'></a><a href='#L377'>377</a>
443
- <a name='L378'></a><a href='#L378'>378</a>
444
- <a name='L379'></a><a href='#L379'>379</a>
445
- <a name='L380'></a><a href='#L380'>380</a>
446
- <a name='L381'></a><a href='#L381'>381</a>
447
- <a name='L382'></a><a href='#L382'>382</a>
448
- <a name='L383'></a><a href='#L383'>383</a>
449
- <a name='L384'></a><a href='#L384'>384</a>
450
- <a name='L385'></a><a href='#L385'>385</a>
451
- <a name='L386'></a><a href='#L386'>386</a>
452
- <a name='L387'></a><a href='#L387'>387</a>
453
- <a name='L388'></a><a href='#L388'>388</a>
454
- <a name='L389'></a><a href='#L389'>389</a>
455
- <a name='L390'></a><a href='#L390'>390</a>
456
- <a name='L391'></a><a href='#L391'>391</a>
457
- <a name='L392'></a><a href='#L392'>392</a>
458
- <a name='L393'></a><a href='#L393'>393</a>
459
- <a name='L394'></a><a href='#L394'>394</a>
460
- <a name='L395'></a><a href='#L395'>395</a>
461
- <a name='L396'></a><a href='#L396'>396</a>
462
- <a name='L397'></a><a href='#L397'>397</a>
463
- <a name='L398'></a><a href='#L398'>398</a>
464
- <a name='L399'></a><a href='#L399'>399</a>
465
- <a name='L400'></a><a href='#L400'>400</a>
466
- <a name='L401'></a><a href='#L401'>401</a>
467
- <a name='L402'></a><a href='#L402'>402</a>
468
- <a name='L403'></a><a href='#L403'>403</a>
469
- <a name='L404'></a><a href='#L404'>404</a>
470
- <a name='L405'></a><a href='#L405'>405</a>
471
- <a name='L406'></a><a href='#L406'>406</a>
472
- <a name='L407'></a><a href='#L407'>407</a>
473
- <a name='L408'></a><a href='#L408'>408</a>
474
- <a name='L409'></a><a href='#L409'>409</a>
475
- <a name='L410'></a><a href='#L410'>410</a>
476
- <a name='L411'></a><a href='#L411'>411</a>
477
- <a name='L412'></a><a href='#L412'>412</a>
478
- <a name='L413'></a><a href='#L413'>413</a>
479
- <a name='L414'></a><a href='#L414'>414</a>
480
- <a name='L415'></a><a href='#L415'>415</a>
481
- <a name='L416'></a><a href='#L416'>416</a>
482
- <a name='L417'></a><a href='#L417'>417</a>
483
- <a name='L418'></a><a href='#L418'>418</a>
484
- <a name='L419'></a><a href='#L419'>419</a>
485
- <a name='L420'></a><a href='#L420'>420</a>
486
- <a name='L421'></a><a href='#L421'>421</a>
487
- <a name='L422'></a><a href='#L422'>422</a>
488
- <a name='L423'></a><a href='#L423'>423</a>
489
- <a name='L424'></a><a href='#L424'>424</a>
490
- <a name='L425'></a><a href='#L425'>425</a>
491
- <a name='L426'></a><a href='#L426'>426</a>
492
- <a name='L427'></a><a href='#L427'>427</a>
493
- <a name='L428'></a><a href='#L428'>428</a>
494
- <a name='L429'></a><a href='#L429'>429</a>
495
- <a name='L430'></a><a href='#L430'>430</a>
496
- <a name='L431'></a><a href='#L431'>431</a>
497
- <a name='L432'></a><a href='#L432'>432</a>
498
- <a name='L433'></a><a href='#L433'>433</a>
499
- <a name='L434'></a><a href='#L434'>434</a>
500
- <a name='L435'></a><a href='#L435'>435</a>
501
- <a name='L436'></a><a href='#L436'>436</a>
502
- <a name='L437'></a><a href='#L437'>437</a>
503
- <a name='L438'></a><a href='#L438'>438</a>
504
- <a name='L439'></a><a href='#L439'>439</a>
505
- <a name='L440'></a><a href='#L440'>440</a>
506
- <a name='L441'></a><a href='#L441'>441</a>
507
- <a name='L442'></a><a href='#L442'>442</a>
508
- <a name='L443'></a><a href='#L443'>443</a>
509
- <a name='L444'></a><a href='#L444'>444</a>
510
- <a name='L445'></a><a href='#L445'>445</a>
511
- <a name='L446'></a><a href='#L446'>446</a>
512
- <a name='L447'></a><a href='#L447'>447</a>
513
- <a name='L448'></a><a href='#L448'>448</a>
514
- <a name='L449'></a><a href='#L449'>449</a>
515
- <a name='L450'></a><a href='#L450'>450</a>
516
- <a name='L451'></a><a href='#L451'>451</a>
517
- <a name='L452'></a><a href='#L452'>452</a>
518
- <a name='L453'></a><a href='#L453'>453</a>
519
- <a name='L454'></a><a href='#L454'>454</a>
520
- <a name='L455'></a><a href='#L455'>455</a>
521
- <a name='L456'></a><a href='#L456'>456</a>
522
- <a name='L457'></a><a href='#L457'>457</a>
523
- <a name='L458'></a><a href='#L458'>458</a>
524
- <a name='L459'></a><a href='#L459'>459</a>
525
- <a name='L460'></a><a href='#L460'>460</a>
526
- <a name='L461'></a><a href='#L461'>461</a>
527
- <a name='L462'></a><a href='#L462'>462</a>
528
- <a name='L463'></a><a href='#L463'>463</a>
529
- <a name='L464'></a><a href='#L464'>464</a>
530
- <a name='L465'></a><a href='#L465'>465</a>
531
- <a name='L466'></a><a href='#L466'>466</a>
532
- <a name='L467'></a><a href='#L467'>467</a>
533
- <a name='L468'></a><a href='#L468'>468</a>
534
- <a name='L469'></a><a href='#L469'>469</a>
535
- <a name='L470'></a><a href='#L470'>470</a>
536
- <a name='L471'></a><a href='#L471'>471</a>
537
- <a name='L472'></a><a href='#L472'>472</a>
538
- <a name='L473'></a><a href='#L473'>473</a>
539
- <a name='L474'></a><a href='#L474'>474</a>
540
- <a name='L475'></a><a href='#L475'>475</a>
541
- <a name='L476'></a><a href='#L476'>476</a>
542
- <a name='L477'></a><a href='#L477'>477</a>
543
- <a name='L478'></a><a href='#L478'>478</a>
544
- <a name='L479'></a><a href='#L479'>479</a>
545
- <a name='L480'></a><a href='#L480'>480</a>
546
- <a name='L481'></a><a href='#L481'>481</a>
547
- <a name='L482'></a><a href='#L482'>482</a>
548
- <a name='L483'></a><a href='#L483'>483</a>
549
- <a name='L484'></a><a href='#L484'>484</a>
550
- <a name='L485'></a><a href='#L485'>485</a>
551
- <a name='L486'></a><a href='#L486'>486</a>
552
- <a name='L487'></a><a href='#L487'>487</a>
553
- <a name='L488'></a><a href='#L488'>488</a>
554
- <a name='L489'></a><a href='#L489'>489</a>
555
- <a name='L490'></a><a href='#L490'>490</a>
556
- <a name='L491'></a><a href='#L491'>491</a>
557
- <a name='L492'></a><a href='#L492'>492</a>
558
- <a name='L493'></a><a href='#L493'>493</a>
559
- <a name='L494'></a><a href='#L494'>494</a>
560
- <a name='L495'></a><a href='#L495'>495</a>
561
- <a name='L496'></a><a href='#L496'>496</a>
562
- <a name='L497'></a><a href='#L497'>497</a>
563
- <a name='L498'></a><a href='#L498'>498</a>
564
- <a name='L499'></a><a href='#L499'>499</a>
565
- <a name='L500'></a><a href='#L500'>500</a>
566
- <a name='L501'></a><a href='#L501'>501</a>
567
- <a name='L502'></a><a href='#L502'>502</a>
568
- <a name='L503'></a><a href='#L503'>503</a>
569
- <a name='L504'></a><a href='#L504'>504</a>
570
- <a name='L505'></a><a href='#L505'>505</a>
571
- <a name='L506'></a><a href='#L506'>506</a>
572
- <a name='L507'></a><a href='#L507'>507</a>
573
- <a name='L508'></a><a href='#L508'>508</a>
574
- <a name='L509'></a><a href='#L509'>509</a>
575
- <a name='L510'></a><a href='#L510'>510</a>
576
- <a name='L511'></a><a href='#L511'>511</a>
577
- <a name='L512'></a><a href='#L512'>512</a>
578
- <a name='L513'></a><a href='#L513'>513</a>
579
- <a name='L514'></a><a href='#L514'>514</a>
580
- <a name='L515'></a><a href='#L515'>515</a>
581
- <a name='L516'></a><a href='#L516'>516</a>
582
- <a name='L517'></a><a href='#L517'>517</a>
583
- <a name='L518'></a><a href='#L518'>518</a>
584
- <a name='L519'></a><a href='#L519'>519</a>
585
- <a name='L520'></a><a href='#L520'>520</a>
586
- <a name='L521'></a><a href='#L521'>521</a>
587
- <a name='L522'></a><a href='#L522'>522</a>
588
- <a name='L523'></a><a href='#L523'>523</a>
589
- <a name='L524'></a><a href='#L524'>524</a>
590
- <a name='L525'></a><a href='#L525'>525</a>
591
- <a name='L526'></a><a href='#L526'>526</a>
592
- <a name='L527'></a><a href='#L527'>527</a>
593
- <a name='L528'></a><a href='#L528'>528</a>
594
- <a name='L529'></a><a href='#L529'>529</a>
595
- <a name='L530'></a><a href='#L530'>530</a>
596
- <a name='L531'></a><a href='#L531'>531</a>
597
- <a name='L532'></a><a href='#L532'>532</a>
598
- <a name='L533'></a><a href='#L533'>533</a>
599
- <a name='L534'></a><a href='#L534'>534</a>
600
- <a name='L535'></a><a href='#L535'>535</a>
601
- <a name='L536'></a><a href='#L536'>536</a>
602
- <a name='L537'></a><a href='#L537'>537</a>
603
- <a name='L538'></a><a href='#L538'>538</a>
604
- <a name='L539'></a><a href='#L539'>539</a>
605
- <a name='L540'></a><a href='#L540'>540</a>
606
- <a name='L541'></a><a href='#L541'>541</a>
607
- <a name='L542'></a><a href='#L542'>542</a>
608
- <a name='L543'></a><a href='#L543'>543</a>
609
- <a name='L544'></a><a href='#L544'>544</a>
610
- <a name='L545'></a><a href='#L545'>545</a>
611
- <a name='L546'></a><a href='#L546'>546</a>
612
- <a name='L547'></a><a href='#L547'>547</a>
613
- <a name='L548'></a><a href='#L548'>548</a>
614
- <a name='L549'></a><a href='#L549'>549</a>
615
- <a name='L550'></a><a href='#L550'>550</a>
616
- <a name='L551'></a><a href='#L551'>551</a>
617
- <a name='L552'></a><a href='#L552'>552</a>
618
- <a name='L553'></a><a href='#L553'>553</a>
619
- <a name='L554'></a><a href='#L554'>554</a>
620
- <a name='L555'></a><a href='#L555'>555</a>
621
- <a name='L556'></a><a href='#L556'>556</a>
622
- <a name='L557'></a><a href='#L557'>557</a>
623
- <a name='L558'></a><a href='#L558'>558</a>
624
- <a name='L559'></a><a href='#L559'>559</a>
625
- <a name='L560'></a><a href='#L560'>560</a>
626
- <a name='L561'></a><a href='#L561'>561</a>
627
- <a name='L562'></a><a href='#L562'>562</a>
628
- <a name='L563'></a><a href='#L563'>563</a>
629
- <a name='L564'></a><a href='#L564'>564</a>
630
- <a name='L565'></a><a href='#L565'>565</a>
631
- <a name='L566'></a><a href='#L566'>566</a>
632
- <a name='L567'></a><a href='#L567'>567</a>
633
- <a name='L568'></a><a href='#L568'>568</a>
634
- <a name='L569'></a><a href='#L569'>569</a>
635
- <a name='L570'></a><a href='#L570'>570</a>
636
- <a name='L571'></a><a href='#L571'>571</a>
637
- <a name='L572'></a><a href='#L572'>572</a>
638
- <a name='L573'></a><a href='#L573'>573</a>
639
- <a name='L574'></a><a href='#L574'>574</a>
640
- <a name='L575'></a><a href='#L575'>575</a>
641
- <a name='L576'></a><a href='#L576'>576</a>
642
- <a name='L577'></a><a href='#L577'>577</a>
643
- <a name='L578'></a><a href='#L578'>578</a>
644
- <a name='L579'></a><a href='#L579'>579</a>
645
- <a name='L580'></a><a href='#L580'>580</a>
646
- <a name='L581'></a><a href='#L581'>581</a>
647
- <a name='L582'></a><a href='#L582'>582</a>
648
- <a name='L583'></a><a href='#L583'>583</a>
649
- <a name='L584'></a><a href='#L584'>584</a>
650
- <a name='L585'></a><a href='#L585'>585</a>
651
- <a name='L586'></a><a href='#L586'>586</a>
652
- <a name='L587'></a><a href='#L587'>587</a>
653
- <a name='L588'></a><a href='#L588'>588</a>
654
- <a name='L589'></a><a href='#L589'>589</a>
655
- <a name='L590'></a><a href='#L590'>590</a>
656
- <a name='L591'></a><a href='#L591'>591</a>
657
- <a name='L592'></a><a href='#L592'>592</a>
658
- <a name='L593'></a><a href='#L593'>593</a>
659
- <a name='L594'></a><a href='#L594'>594</a>
660
- <a name='L595'></a><a href='#L595'>595</a>
661
- <a name='L596'></a><a href='#L596'>596</a>
662
- <a name='L597'></a><a href='#L597'>597</a>
663
- <a name='L598'></a><a href='#L598'>598</a>
664
- <a name='L599'></a><a href='#L599'>599</a>
665
- <a name='L600'></a><a href='#L600'>600</a>
666
- <a name='L601'></a><a href='#L601'>601</a>
667
- <a name='L602'></a><a href='#L602'>602</a>
668
- <a name='L603'></a><a href='#L603'>603</a>
669
- <a name='L604'></a><a href='#L604'>604</a>
670
- <a name='L605'></a><a href='#L605'>605</a>
671
- <a name='L606'></a><a href='#L606'>606</a>
672
- <a name='L607'></a><a href='#L607'>607</a>
673
- <a name='L608'></a><a href='#L608'>608</a>
674
- <a name='L609'></a><a href='#L609'>609</a>
675
- <a name='L610'></a><a href='#L610'>610</a>
676
- <a name='L611'></a><a href='#L611'>611</a>
677
- <a name='L612'></a><a href='#L612'>612</a>
678
- <a name='L613'></a><a href='#L613'>613</a>
679
- <a name='L614'></a><a href='#L614'>614</a>
680
- <a name='L615'></a><a href='#L615'>615</a>
681
- <a name='L616'></a><a href='#L616'>616</a>
682
- <a name='L617'></a><a href='#L617'>617</a>
683
- <a name='L618'></a><a href='#L618'>618</a>
684
- <a name='L619'></a><a href='#L619'>619</a>
685
- <a name='L620'></a><a href='#L620'>620</a>
686
- <a name='L621'></a><a href='#L621'>621</a>
687
- <a name='L622'></a><a href='#L622'>622</a>
688
- <a name='L623'></a><a href='#L623'>623</a>
689
- <a name='L624'></a><a href='#L624'>624</a>
690
- <a name='L625'></a><a href='#L625'>625</a>
691
- <a name='L626'></a><a href='#L626'>626</a>
692
- <a name='L627'></a><a href='#L627'>627</a>
693
- <a name='L628'></a><a href='#L628'>628</a>
694
- <a name='L629'></a><a href='#L629'>629</a>
695
- <a name='L630'></a><a href='#L630'>630</a>
696
- <a name='L631'></a><a href='#L631'>631</a>
697
- <a name='L632'></a><a href='#L632'>632</a>
698
- <a name='L633'></a><a href='#L633'>633</a>
699
- <a name='L634'></a><a href='#L634'>634</a>
700
- <a name='L635'></a><a href='#L635'>635</a>
701
- <a name='L636'></a><a href='#L636'>636</a>
702
- <a name='L637'></a><a href='#L637'>637</a>
703
- <a name='L638'></a><a href='#L638'>638</a>
704
- <a name='L639'></a><a href='#L639'>639</a>
705
- <a name='L640'></a><a href='#L640'>640</a>
706
- <a name='L641'></a><a href='#L641'>641</a>
707
- <a name='L642'></a><a href='#L642'>642</a>
708
- <a name='L643'></a><a href='#L643'>643</a>
709
- <a name='L644'></a><a href='#L644'>644</a>
710
- <a name='L645'></a><a href='#L645'>645</a>
711
- <a name='L646'></a><a href='#L646'>646</a>
712
- <a name='L647'></a><a href='#L647'>647</a>
713
- <a name='L648'></a><a href='#L648'>648</a>
714
- <a name='L649'></a><a href='#L649'>649</a>
715
- <a name='L650'></a><a href='#L650'>650</a>
716
- <a name='L651'></a><a href='#L651'>651</a>
717
- <a name='L652'></a><a href='#L652'>652</a>
718
- <a name='L653'></a><a href='#L653'>653</a>
719
- <a name='L654'></a><a href='#L654'>654</a>
720
- <a name='L655'></a><a href='#L655'>655</a>
721
- <a name='L656'></a><a href='#L656'>656</a>
722
- <a name='L657'></a><a href='#L657'>657</a>
723
- <a name='L658'></a><a href='#L658'>658</a>
724
- <a name='L659'></a><a href='#L659'>659</a>
725
- <a name='L660'></a><a href='#L660'>660</a>
726
- <a name='L661'></a><a href='#L661'>661</a>
727
- <a name='L662'></a><a href='#L662'>662</a>
728
- <a name='L663'></a><a href='#L663'>663</a>
729
- <a name='L664'></a><a href='#L664'>664</a>
730
- <a name='L665'></a><a href='#L665'>665</a>
731
- <a name='L666'></a><a href='#L666'>666</a>
732
- <a name='L667'></a><a href='#L667'>667</a>
733
- <a name='L668'></a><a href='#L668'>668</a>
734
- <a name='L669'></a><a href='#L669'>669</a>
735
- <a name='L670'></a><a href='#L670'>670</a>
736
- <a name='L671'></a><a href='#L671'>671</a>
737
- <a name='L672'></a><a href='#L672'>672</a>
738
- <a name='L673'></a><a href='#L673'>673</a>
739
- <a name='L674'></a><a href='#L674'>674</a>
740
- <a name='L675'></a><a href='#L675'>675</a>
741
- <a name='L676'></a><a href='#L676'>676</a>
742
- <a name='L677'></a><a href='#L677'>677</a>
743
- <a name='L678'></a><a href='#L678'>678</a>
744
- <a name='L679'></a><a href='#L679'>679</a>
745
- <a name='L680'></a><a href='#L680'>680</a>
746
- <a name='L681'></a><a href='#L681'>681</a>
747
- <a name='L682'></a><a href='#L682'>682</a>
748
- <a name='L683'></a><a href='#L683'>683</a>
749
- <a name='L684'></a><a href='#L684'>684</a>
750
- <a name='L685'></a><a href='#L685'>685</a>
751
- <a name='L686'></a><a href='#L686'>686</a>
752
- <a name='L687'></a><a href='#L687'>687</a>
753
- <a name='L688'></a><a href='#L688'>688</a>
754
- <a name='L689'></a><a href='#L689'>689</a>
755
- <a name='L690'></a><a href='#L690'>690</a>
756
- <a name='L691'></a><a href='#L691'>691</a>
757
- <a name='L692'></a><a href='#L692'>692</a>
758
- <a name='L693'></a><a href='#L693'>693</a>
759
- <a name='L694'></a><a href='#L694'>694</a>
760
- <a name='L695'></a><a href='#L695'>695</a>
761
- <a name='L696'></a><a href='#L696'>696</a>
762
- <a name='L697'></a><a href='#L697'>697</a>
763
- <a name='L698'></a><a href='#L698'>698</a>
764
- <a name='L699'></a><a href='#L699'>699</a>
765
- <a name='L700'></a><a href='#L700'>700</a>
766
- <a name='L701'></a><a href='#L701'>701</a>
767
- <a name='L702'></a><a href='#L702'>702</a>
768
- <a name='L703'></a><a href='#L703'>703</a>
769
- <a name='L704'></a><a href='#L704'>704</a>
770
- <a name='L705'></a><a href='#L705'>705</a>
771
- <a name='L706'></a><a href='#L706'>706</a>
772
- <a name='L707'></a><a href='#L707'>707</a>
773
- <a name='L708'></a><a href='#L708'>708</a>
774
- <a name='L709'></a><a href='#L709'>709</a>
775
- <a name='L710'></a><a href='#L710'>710</a>
776
- <a name='L711'></a><a href='#L711'>711</a>
777
- <a name='L712'></a><a href='#L712'>712</a>
778
- <a name='L713'></a><a href='#L713'>713</a>
779
- <a name='L714'></a><a href='#L714'>714</a>
780
- <a name='L715'></a><a href='#L715'>715</a>
781
- <a name='L716'></a><a href='#L716'>716</a>
782
- <a name='L717'></a><a href='#L717'>717</a>
783
- <a name='L718'></a><a href='#L718'>718</a>
784
- <a name='L719'></a><a href='#L719'>719</a>
785
- <a name='L720'></a><a href='#L720'>720</a>
786
- <a name='L721'></a><a href='#L721'>721</a>
787
- <a name='L722'></a><a href='#L722'>722</a>
788
- <a name='L723'></a><a href='#L723'>723</a>
789
- <a name='L724'></a><a href='#L724'>724</a>
790
- <a name='L725'></a><a href='#L725'>725</a>
791
- <a name='L726'></a><a href='#L726'>726</a>
792
- <a name='L727'></a><a href='#L727'>727</a>
793
- <a name='L728'></a><a href='#L728'>728</a>
794
- <a name='L729'></a><a href='#L729'>729</a>
795
- <a name='L730'></a><a href='#L730'>730</a>
796
- <a name='L731'></a><a href='#L731'>731</a>
797
- <a name='L732'></a><a href='#L732'>732</a>
798
- <a name='L733'></a><a href='#L733'>733</a>
799
- <a name='L734'></a><a href='#L734'>734</a>
800
- <a name='L735'></a><a href='#L735'>735</a>
801
- <a name='L736'></a><a href='#L736'>736</a>
802
- <a name='L737'></a><a href='#L737'>737</a>
803
- <a name='L738'></a><a href='#L738'>738</a>
804
- <a name='L739'></a><a href='#L739'>739</a>
805
- <a name='L740'></a><a href='#L740'>740</a>
806
- <a name='L741'></a><a href='#L741'>741</a>
807
- <a name='L742'></a><a href='#L742'>742</a>
808
- <a name='L743'></a><a href='#L743'>743</a>
809
- <a name='L744'></a><a href='#L744'>744</a>
810
- <a name='L745'></a><a href='#L745'>745</a>
811
- <a name='L746'></a><a href='#L746'>746</a>
812
- <a name='L747'></a><a href='#L747'>747</a>
813
- <a name='L748'></a><a href='#L748'>748</a>
814
- <a name='L749'></a><a href='#L749'>749</a>
815
- <a name='L750'></a><a href='#L750'>750</a>
816
- <a name='L751'></a><a href='#L751'>751</a>
817
- <a name='L752'></a><a href='#L752'>752</a>
818
- <a name='L753'></a><a href='#L753'>753</a>
819
- <a name='L754'></a><a href='#L754'>754</a>
820
- <a name='L755'></a><a href='#L755'>755</a>
821
- <a name='L756'></a><a href='#L756'>756</a>
822
- <a name='L757'></a><a href='#L757'>757</a>
823
- <a name='L758'></a><a href='#L758'>758</a>
824
- <a name='L759'></a><a href='#L759'>759</a>
825
- <a name='L760'></a><a href='#L760'>760</a>
826
- <a name='L761'></a><a href='#L761'>761</a>
827
- <a name='L762'></a><a href='#L762'>762</a>
828
- <a name='L763'></a><a href='#L763'>763</a>
829
- <a name='L764'></a><a href='#L764'>764</a>
830
- <a name='L765'></a><a href='#L765'>765</a>
831
- <a name='L766'></a><a href='#L766'>766</a>
832
- <a name='L767'></a><a href='#L767'>767</a>
833
- <a name='L768'></a><a href='#L768'>768</a>
834
- <a name='L769'></a><a href='#L769'>769</a>
835
- <a name='L770'></a><a href='#L770'>770</a>
836
- <a name='L771'></a><a href='#L771'>771</a>
837
- <a name='L772'></a><a href='#L772'>772</a>
838
- <a name='L773'></a><a href='#L773'>773</a>
839
- <a name='L774'></a><a href='#L774'>774</a>
840
- <a name='L775'></a><a href='#L775'>775</a>
841
- <a name='L776'></a><a href='#L776'>776</a>
842
- <a name='L777'></a><a href='#L777'>777</a>
843
- <a name='L778'></a><a href='#L778'>778</a>
844
- <a name='L779'></a><a href='#L779'>779</a>
845
- <a name='L780'></a><a href='#L780'>780</a>
846
- <a name='L781'></a><a href='#L781'>781</a>
847
- <a name='L782'></a><a href='#L782'>782</a>
848
- <a name='L783'></a><a href='#L783'>783</a>
849
- <a name='L784'></a><a href='#L784'>784</a>
850
- <a name='L785'></a><a href='#L785'>785</a>
851
- <a name='L786'></a><a href='#L786'>786</a>
852
- <a name='L787'></a><a href='#L787'>787</a>
853
- <a name='L788'></a><a href='#L788'>788</a>
854
- <a name='L789'></a><a href='#L789'>789</a>
855
- <a name='L790'></a><a href='#L790'>790</a>
856
- <a name='L791'></a><a href='#L791'>791</a>
857
- <a name='L792'></a><a href='#L792'>792</a>
858
- <a name='L793'></a><a href='#L793'>793</a>
859
- <a name='L794'></a><a href='#L794'>794</a>
860
- <a name='L795'></a><a href='#L795'>795</a>
861
- <a name='L796'></a><a href='#L796'>796</a>
862
- <a name='L797'></a><a href='#L797'>797</a>
863
- <a name='L798'></a><a href='#L798'>798</a>
864
- <a name='L799'></a><a href='#L799'>799</a>
865
- <a name='L800'></a><a href='#L800'>800</a>
866
- <a name='L801'></a><a href='#L801'>801</a>
867
- <a name='L802'></a><a href='#L802'>802</a>
868
- <a name='L803'></a><a href='#L803'>803</a>
869
- <a name='L804'></a><a href='#L804'>804</a>
870
- <a name='L805'></a><a href='#L805'>805</a>
871
- <a name='L806'></a><a href='#L806'>806</a>
872
- <a name='L807'></a><a href='#L807'>807</a>
873
- <a name='L808'></a><a href='#L808'>808</a>
874
- <a name='L809'></a><a href='#L809'>809</a>
875
- <a name='L810'></a><a href='#L810'>810</a>
876
- <a name='L811'></a><a href='#L811'>811</a>
877
- <a name='L812'></a><a href='#L812'>812</a>
878
- <a name='L813'></a><a href='#L813'>813</a>
879
- <a name='L814'></a><a href='#L814'>814</a>
880
- <a name='L815'></a><a href='#L815'>815</a>
881
- <a name='L816'></a><a href='#L816'>816</a>
882
- <a name='L817'></a><a href='#L817'>817</a>
883
- <a name='L818'></a><a href='#L818'>818</a>
884
- <a name='L819'></a><a href='#L819'>819</a>
885
- <a name='L820'></a><a href='#L820'>820</a>
886
- <a name='L821'></a><a href='#L821'>821</a>
887
- <a name='L822'></a><a href='#L822'>822</a>
888
- <a name='L823'></a><a href='#L823'>823</a>
889
- <a name='L824'></a><a href='#L824'>824</a>
890
- <a name='L825'></a><a href='#L825'>825</a>
891
- <a name='L826'></a><a href='#L826'>826</a>
892
- <a name='L827'></a><a href='#L827'>827</a>
893
- <a name='L828'></a><a href='#L828'>828</a>
894
- <a name='L829'></a><a href='#L829'>829</a>
895
- <a name='L830'></a><a href='#L830'>830</a>
896
- <a name='L831'></a><a href='#L831'>831</a>
897
- <a name='L832'></a><a href='#L832'>832</a>
898
- <a name='L833'></a><a href='#L833'>833</a>
899
- <a name='L834'></a><a href='#L834'>834</a>
900
- <a name='L835'></a><a href='#L835'>835</a>
901
- <a name='L836'></a><a href='#L836'>836</a>
902
- <a name='L837'></a><a href='#L837'>837</a>
903
- <a name='L838'></a><a href='#L838'>838</a>
904
- <a name='L839'></a><a href='#L839'>839</a>
905
- <a name='L840'></a><a href='#L840'>840</a>
906
- <a name='L841'></a><a href='#L841'>841</a>
907
- <a name='L842'></a><a href='#L842'>842</a>
908
- <a name='L843'></a><a href='#L843'>843</a>
909
- <a name='L844'></a><a href='#L844'>844</a>
910
- <a name='L845'></a><a href='#L845'>845</a>
911
- <a name='L846'></a><a href='#L846'>846</a>
912
- <a name='L847'></a><a href='#L847'>847</a>
913
- <a name='L848'></a><a href='#L848'>848</a>
914
- <a name='L849'></a><a href='#L849'>849</a>
915
- <a name='L850'></a><a href='#L850'>850</a>
916
- <a name='L851'></a><a href='#L851'>851</a>
917
- <a name='L852'></a><a href='#L852'>852</a>
918
- <a name='L853'></a><a href='#L853'>853</a>
919
- <a name='L854'></a><a href='#L854'>854</a>
920
- <a name='L855'></a><a href='#L855'>855</a>
921
- <a name='L856'></a><a href='#L856'>856</a>
922
- <a name='L857'></a><a href='#L857'>857</a>
923
- <a name='L858'></a><a href='#L858'>858</a>
924
- <a name='L859'></a><a href='#L859'>859</a>
925
- <a name='L860'></a><a href='#L860'>860</a>
926
- <a name='L861'></a><a href='#L861'>861</a>
927
- <a name='L862'></a><a href='#L862'>862</a>
928
- <a name='L863'></a><a href='#L863'>863</a>
929
- <a name='L864'></a><a href='#L864'>864</a>
930
- <a name='L865'></a><a href='#L865'>865</a>
931
- <a name='L866'></a><a href='#L866'>866</a>
932
- <a name='L867'></a><a href='#L867'>867</a>
933
- <a name='L868'></a><a href='#L868'>868</a>
934
- <a name='L869'></a><a href='#L869'>869</a>
935
- <a name='L870'></a><a href='#L870'>870</a>
936
- <a name='L871'></a><a href='#L871'>871</a>
937
- <a name='L872'></a><a href='#L872'>872</a>
938
- <a name='L873'></a><a href='#L873'>873</a>
939
- <a name='L874'></a><a href='#L874'>874</a>
940
- <a name='L875'></a><a href='#L875'>875</a>
941
- <a name='L876'></a><a href='#L876'>876</a>
942
- <a name='L877'></a><a href='#L877'>877</a>
943
- <a name='L878'></a><a href='#L878'>878</a>
944
- <a name='L879'></a><a href='#L879'>879</a>
945
- <a name='L880'></a><a href='#L880'>880</a>
946
- <a name='L881'></a><a href='#L881'>881</a>
947
- <a name='L882'></a><a href='#L882'>882</a>
948
- <a name='L883'></a><a href='#L883'>883</a>
949
- <a name='L884'></a><a href='#L884'>884</a>
950
- <a name='L885'></a><a href='#L885'>885</a>
951
- <a name='L886'></a><a href='#L886'>886</a>
952
- <a name='L887'></a><a href='#L887'>887</a>
953
- <a name='L888'></a><a href='#L888'>888</a>
954
- <a name='L889'></a><a href='#L889'>889</a>
955
- <a name='L890'></a><a href='#L890'>890</a>
956
- <a name='L891'></a><a href='#L891'>891</a>
957
- <a name='L892'></a><a href='#L892'>892</a>
958
- <a name='L893'></a><a href='#L893'>893</a>
959
- <a name='L894'></a><a href='#L894'>894</a>
960
- <a name='L895'></a><a href='#L895'>895</a>
961
- <a name='L896'></a><a href='#L896'>896</a>
962
- <a name='L897'></a><a href='#L897'>897</a>
963
- <a name='L898'></a><a href='#L898'>898</a>
964
- <a name='L899'></a><a href='#L899'>899</a>
965
- <a name='L900'></a><a href='#L900'>900</a>
966
- <a name='L901'></a><a href='#L901'>901</a>
967
- <a name='L902'></a><a href='#L902'>902</a>
968
- <a name='L903'></a><a href='#L903'>903</a>
969
- <a name='L904'></a><a href='#L904'>904</a>
970
- <a name='L905'></a><a href='#L905'>905</a>
971
- <a name='L906'></a><a href='#L906'>906</a>
972
- <a name='L907'></a><a href='#L907'>907</a>
973
- <a name='L908'></a><a href='#L908'>908</a>
974
- <a name='L909'></a><a href='#L909'>909</a>
975
- <a name='L910'></a><a href='#L910'>910</a>
976
- <a name='L911'></a><a href='#L911'>911</a>
977
- <a name='L912'></a><a href='#L912'>912</a>
978
- <a name='L913'></a><a href='#L913'>913</a>
979
- <a name='L914'></a><a href='#L914'>914</a>
980
- <a name='L915'></a><a href='#L915'>915</a>
981
- <a name='L916'></a><a href='#L916'>916</a>
982
- <a name='L917'></a><a href='#L917'>917</a>
983
- <a name='L918'></a><a href='#L918'>918</a>
984
- <a name='L919'></a><a href='#L919'>919</a>
985
- <a name='L920'></a><a href='#L920'>920</a>
986
- <a name='L921'></a><a href='#L921'>921</a>
987
- <a name='L922'></a><a href='#L922'>922</a>
988
- <a name='L923'></a><a href='#L923'>923</a>
989
- <a name='L924'></a><a href='#L924'>924</a>
990
- <a name='L925'></a><a href='#L925'>925</a>
991
- <a name='L926'></a><a href='#L926'>926</a>
992
- <a name='L927'></a><a href='#L927'>927</a>
993
- <a name='L928'></a><a href='#L928'>928</a>
994
- <a name='L929'></a><a href='#L929'>929</a>
995
- <a name='L930'></a><a href='#L930'>930</a>
996
- <a name='L931'></a><a href='#L931'>931</a>
997
- <a name='L932'></a><a href='#L932'>932</a>
998
- <a name='L933'></a><a href='#L933'>933</a>
999
- <a name='L934'></a><a href='#L934'>934</a>
1000
- <a name='L935'></a><a href='#L935'>935</a>
1001
- <a name='L936'></a><a href='#L936'>936</a>
1002
- <a name='L937'></a><a href='#L937'>937</a>
1003
- <a name='L938'></a><a href='#L938'>938</a>
1004
- <a name='L939'></a><a href='#L939'>939</a>
1005
- <a name='L940'></a><a href='#L940'>940</a>
1006
- <a name='L941'></a><a href='#L941'>941</a>
1007
- <a name='L942'></a><a href='#L942'>942</a>
1008
- <a name='L943'></a><a href='#L943'>943</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
312
+ <a name='L247'></a><a href='#L247'>247</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
1009
313
  <span class="cline-any cline-neutral">&nbsp;</span>
1010
314
  <span class="cline-any cline-neutral">&nbsp;</span>
1011
315
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1018,216 +322,6 @@
1018
322
  <span class="cline-any cline-neutral">&nbsp;</span>
1019
323
  <span class="cline-any cline-neutral">&nbsp;</span>
1020
324
  <span class="cline-any cline-neutral">&nbsp;</span>
1021
- <span class="cline-any cline-neutral">&nbsp;</span>
1022
- <span class="cline-any cline-neutral">&nbsp;</span>
1023
- <span class="cline-any cline-neutral">&nbsp;</span>
1024
- <span class="cline-any cline-neutral">&nbsp;</span>
1025
- <span class="cline-any cline-yes">1x</span>
1026
- <span class="cline-any cline-yes">1x</span>
1027
- <span class="cline-any cline-neutral">&nbsp;</span>
1028
- <span class="cline-any cline-neutral">&nbsp;</span>
1029
- <span class="cline-any cline-neutral">&nbsp;</span>
1030
- <span class="cline-any cline-neutral">&nbsp;</span>
1031
- <span class="cline-any cline-neutral">&nbsp;</span>
1032
- <span class="cline-any cline-yes">1x</span>
1033
- <span class="cline-any cline-neutral">&nbsp;</span>
1034
- <span class="cline-any cline-neutral">&nbsp;</span>
1035
- <span class="cline-any cline-neutral">&nbsp;</span>
1036
- <span class="cline-any cline-neutral">&nbsp;</span>
1037
- <span class="cline-any cline-yes">1x</span>
1038
- <span class="cline-any cline-yes">1x</span>
1039
- <span class="cline-any cline-yes">1x</span>
1040
- <span class="cline-any cline-yes">1x</span>
1041
- <span class="cline-any cline-yes">1x</span>
1042
- <span class="cline-any cline-yes">1x</span>
1043
- <span class="cline-any cline-yes">1x</span>
1044
- <span class="cline-any cline-yes">1x</span>
1045
- <span class="cline-any cline-neutral">&nbsp;</span>
1046
- <span class="cline-any cline-yes">1x</span>
1047
- <span class="cline-any cline-yes">108x</span>
1048
- <span class="cline-any cline-yes">108x</span>
1049
- <span class="cline-any cline-yes">108x</span>
1050
- <span class="cline-any cline-yes">108x</span>
1051
- <span class="cline-any cline-yes">108x</span>
1052
- <span class="cline-any cline-neutral">&nbsp;</span>
1053
- <span class="cline-any cline-yes">108x</span>
1054
- <span class="cline-any cline-yes">108x</span>
1055
- <span class="cline-any cline-yes">108x</span>
1056
- <span class="cline-any cline-yes">108x</span>
1057
- <span class="cline-any cline-yes">108x</span>
1058
- <span class="cline-any cline-yes">108x</span>
1059
- <span class="cline-any cline-yes">108x</span>
1060
- <span class="cline-any cline-yes">108x</span>
1061
- <span class="cline-any cline-yes">108x</span>
1062
- <span class="cline-any cline-neutral">&nbsp;</span>
1063
- <span class="cline-any cline-neutral">&nbsp;</span>
1064
- <span class="cline-any cline-neutral">&nbsp;</span>
1065
- <span class="cline-any cline-neutral">&nbsp;</span>
1066
- <span class="cline-any cline-neutral">&nbsp;</span>
1067
- <span class="cline-any cline-yes">108x</span>
1068
- <span class="cline-any cline-no">&nbsp;</span>
1069
- <span class="cline-any cline-no">&nbsp;</span>
1070
- <span class="cline-any cline-neutral">&nbsp;</span>
1071
- <span class="cline-any cline-yes">108x</span>
1072
- <span class="cline-any cline-yes">116x</span>
1073
- <span class="cline-any cline-yes">116x</span>
1074
- <span class="cline-any cline-neutral">&nbsp;</span>
1075
- <span class="cline-any cline-yes">108x</span>
1076
- <span class="cline-any cline-yes">108x</span>
1077
- <span class="cline-any cline-yes">108x</span>
1078
- <span class="cline-any cline-yes">108x</span>
1079
- <span class="cline-any cline-no">&nbsp;</span>
1080
- <span class="cline-any cline-no">&nbsp;</span>
1081
- <span class="cline-any cline-yes">108x</span>
1082
- <span class="cline-any cline-yes">108x</span>
1083
- <span class="cline-any cline-neutral">&nbsp;</span>
1084
- <span class="cline-any cline-yes">108x</span>
1085
- <span class="cline-any cline-yes">266x</span>
1086
- <span class="cline-any cline-yes">266x</span>
1087
- <span class="cline-any cline-yes">266x</span>
1088
- <span class="cline-any cline-neutral">&nbsp;</span>
1089
- <span class="cline-any cline-neutral">&nbsp;</span>
1090
- <span class="cline-any cline-neutral">&nbsp;</span>
1091
- <span class="cline-any cline-neutral">&nbsp;</span>
1092
- <span class="cline-any cline-yes">266x</span>
1093
- <span class="cline-any cline-yes">266x</span>
1094
- <span class="cline-any cline-yes">266x</span>
1095
- <span class="cline-any cline-yes">266x</span>
1096
- <span class="cline-any cline-yes">266x</span>
1097
- <span class="cline-any cline-yes">266x</span>
1098
- <span class="cline-any cline-yes">3x</span>
1099
- <span class="cline-any cline-yes">3x</span>
1100
- <span class="cline-any cline-neutral">&nbsp;</span>
1101
- <span class="cline-any cline-yes">260x</span>
1102
- <span class="cline-any cline-yes">266x</span>
1103
- <span class="cline-any cline-neutral">&nbsp;</span>
1104
- <span class="cline-any cline-yes">266x</span>
1105
- <span class="cline-any cline-yes">266x</span>
1106
- <span class="cline-any cline-yes">266x</span>
1107
- <span class="cline-any cline-yes">266x</span>
1108
- <span class="cline-any cline-yes">266x</span>
1109
- <span class="cline-any cline-yes">266x</span>
1110
- <span class="cline-any cline-no">&nbsp;</span>
1111
- <span class="cline-any cline-no">&nbsp;</span>
1112
- <span class="cline-any cline-yes">259x</span>
1113
- <span class="cline-any cline-yes">266x</span>
1114
- <span class="cline-any cline-neutral">&nbsp;</span>
1115
- <span class="cline-any cline-yes">108x</span>
1116
- <span class="cline-any cline-yes">227x</span>
1117
- <span class="cline-any cline-yes">227x</span>
1118
- <span class="cline-any cline-yes">227x</span>
1119
- <span class="cline-any cline-yes">227x</span>
1120
- <span class="cline-any cline-yes">227x</span>
1121
- <span class="cline-any cline-yes">3x</span>
1122
- <span class="cline-any cline-yes">3x</span>
1123
- <span class="cline-any cline-yes">220x</span>
1124
- <span class="cline-any cline-yes">227x</span>
1125
- <span class="cline-any cline-neutral">&nbsp;</span>
1126
- <span class="cline-any cline-yes">108x</span>
1127
- <span class="cline-any cline-neutral">&nbsp;</span>
1128
- <span class="cline-any cline-neutral">&nbsp;</span>
1129
- <span class="cline-any cline-neutral">&nbsp;</span>
1130
- <span class="cline-any cline-yes">60x</span>
1131
- <span class="cline-any cline-yes">60x</span>
1132
- <span class="cline-any cline-neutral">&nbsp;</span>
1133
- <span class="cline-any cline-neutral">&nbsp;</span>
1134
- <span class="cline-any cline-neutral">&nbsp;</span>
1135
- <span class="cline-any cline-neutral">&nbsp;</span>
1136
- <span class="cline-any cline-yes">60x</span>
1137
- <span class="cline-any cline-yes">60x</span>
1138
- <span class="cline-any cline-yes">60x</span>
1139
- <span class="cline-any cline-yes">60x</span>
1140
- <span class="cline-any cline-no">&nbsp;</span>
1141
- <span class="cline-any cline-no">&nbsp;</span>
1142
- <span class="cline-any cline-yes">59x</span>
1143
- <span class="cline-any cline-neutral">&nbsp;</span>
1144
- <span class="cline-any cline-neutral">&nbsp;</span>
1145
- <span class="cline-any cline-yes">60x</span>
1146
- <span class="cline-any cline-yes">4x</span>
1147
- <span class="cline-any cline-yes">4x</span>
1148
- <span class="cline-any cline-yes">2x</span>
1149
- <span class="cline-any cline-yes">2x</span>
1150
- <span class="cline-any cline-yes">4x</span>
1151
- <span class="cline-any cline-neutral">&nbsp;</span>
1152
- <span class="cline-any cline-neutral">&nbsp;</span>
1153
- <span class="cline-any cline-yes">57x</span>
1154
- <span class="cline-any cline-yes">60x</span>
1155
- <span class="cline-any cline-yes">27x</span>
1156
- <span class="cline-any cline-yes">27x</span>
1157
- <span class="cline-any cline-yes">30x</span>
1158
- <span class="cline-any cline-yes">60x</span>
1159
- <span class="cline-any cline-neutral">&nbsp;</span>
1160
- <span class="cline-any cline-yes">108x</span>
1161
- <span class="cline-any cline-yes">12x</span>
1162
- <span class="cline-any cline-yes">12x</span>
1163
- <span class="cline-any cline-yes">12x</span>
1164
- <span class="cline-any cline-yes">12x</span>
1165
- <span class="cline-any cline-yes">12x</span>
1166
- <span class="cline-any cline-yes">12x</span>
1167
- <span class="cline-any cline-yes">12x</span>
1168
- <span class="cline-any cline-yes">12x</span>
1169
- <span class="cline-any cline-yes">16x</span>
1170
- <span class="cline-any cline-yes">16x</span>
1171
- <span class="cline-any cline-yes">12x</span>
1172
- <span class="cline-any cline-yes">12x</span>
1173
- <span class="cline-any cline-neutral">&nbsp;</span>
1174
- <span class="cline-any cline-neutral">&nbsp;</span>
1175
- <span class="cline-any cline-neutral">&nbsp;</span>
1176
- <span class="cline-any cline-neutral">&nbsp;</span>
1177
- <span class="cline-any cline-yes">108x</span>
1178
- <span class="cline-any cline-yes">16x</span>
1179
- <span class="cline-any cline-yes">16x</span>
1180
- <span class="cline-any cline-yes">16x</span>
1181
- <span class="cline-any cline-yes">16x</span>
1182
- <span class="cline-any cline-yes">16x</span>
1183
- <span class="cline-any cline-yes">16x</span>
1184
- <span class="cline-any cline-no">&nbsp;</span>
1185
- <span class="cline-any cline-no">&nbsp;</span>
1186
- <span class="cline-any cline-no">&nbsp;</span>
1187
- <span class="cline-any cline-neutral">&nbsp;</span>
1188
- <span class="cline-any cline-yes">16x</span>
1189
- <span class="cline-any cline-no">&nbsp;</span>
1190
- <span class="cline-any cline-no">&nbsp;</span>
1191
- <span class="cline-any cline-no">&nbsp;</span>
1192
- <span class="cline-any cline-no">&nbsp;</span>
1193
- <span class="cline-any cline-no">&nbsp;</span>
1194
- <span class="cline-any cline-no">&nbsp;</span>
1195
- <span class="cline-any cline-no">&nbsp;</span>
1196
- <span class="cline-any cline-no">&nbsp;</span>
1197
- <span class="cline-any cline-no">&nbsp;</span>
1198
- <span class="cline-any cline-no">&nbsp;</span>
1199
- <span class="cline-any cline-no">&nbsp;</span>
1200
- <span class="cline-any cline-no">&nbsp;</span>
1201
- <span class="cline-any cline-neutral">&nbsp;</span>
1202
- <span class="cline-any cline-yes">16x</span>
1203
- <span class="cline-any cline-yes">16x</span>
1204
- <span class="cline-any cline-yes">16x</span>
1205
- <span class="cline-any cline-yes">16x</span>
1206
- <span class="cline-any cline-yes">16x</span>
1207
- <span class="cline-any cline-neutral">&nbsp;</span>
1208
- <span class="cline-any cline-neutral">&nbsp;</span>
1209
- <span class="cline-any cline-neutral">&nbsp;</span>
1210
- <span class="cline-any cline-neutral">&nbsp;</span>
1211
- <span class="cline-any cline-yes">108x</span>
1212
- <span class="cline-any cline-yes">16x</span>
1213
- <span class="cline-any cline-yes">16x</span>
1214
- <span class="cline-any cline-yes">16x</span>
1215
- <span class="cline-any cline-yes">16x</span>
1216
- <span class="cline-any cline-yes">16x</span>
1217
- <span class="cline-any cline-yes">16x</span>
1218
- <span class="cline-any cline-yes">16x</span>
1219
- <span class="cline-any cline-neutral">&nbsp;</span>
1220
- <span class="cline-any cline-yes">16x</span>
1221
- <span class="cline-any cline-yes">16x</span>
1222
- <span class="cline-any cline-yes">16x</span>
1223
- <span class="cline-any cline-yes">16x</span>
1224
- <span class="cline-any cline-yes">16x</span>
1225
- <span class="cline-any cline-yes">16x</span>
1226
- <span class="cline-any cline-neutral">&nbsp;</span>
1227
- <span class="cline-any cline-yes">16x</span>
1228
- <span class="cline-any cline-yes">16x</span>
1229
- <span class="cline-any cline-neutral">&nbsp;</span>
1230
- <span class="cline-any cline-yes">108x</span>
1231
325
  <span class="cline-any cline-yes">1x</span>
1232
326
  <span class="cline-any cline-yes">1x</span>
1233
327
  <span class="cline-any cline-yes">1x</span>
@@ -1235,762 +329,263 @@
1235
329
  <span class="cline-any cline-yes">1x</span>
1236
330
  <span class="cline-any cline-yes">1x</span>
1237
331
  <span class="cline-any cline-yes">1x</span>
1238
- <span class="cline-any cline-neutral">&nbsp;</span>
1239
- <span class="cline-any cline-neutral">&nbsp;</span>
1240
- <span class="cline-any cline-neutral">&nbsp;</span>
1241
- <span class="cline-any cline-neutral">&nbsp;</span>
1242
- <span class="cline-any cline-yes">108x</span>
1243
- <span class="cline-any cline-yes">1x</span>
1244
- <span class="cline-any cline-yes">1x</span>
1245
332
  <span class="cline-any cline-yes">1x</span>
1246
333
  <span class="cline-any cline-yes">1x</span>
1247
- <span class="cline-any cline-no">&nbsp;</span>
1248
- <span class="cline-any cline-no">&nbsp;</span>
1249
- <span class="cline-any cline-yes">1x</span>
1250
- <span class="cline-any cline-no">&nbsp;</span>
1251
- <span class="cline-any cline-no">&nbsp;</span>
1252
334
  <span class="cline-any cline-neutral">&nbsp;</span>
1253
335
  <span class="cline-any cline-yes">1x</span>
1254
- <span class="cline-any cline-yes">1x</span>
1255
- <span class="cline-any cline-yes">1x</span>
1256
- <span class="cline-any cline-yes">1x</span>
1257
- <span class="cline-any cline-yes">1x</span>
1258
- <span class="cline-any cline-neutral">&nbsp;</span>
1259
- <span class="cline-any cline-neutral">&nbsp;</span>
1260
- <span class="cline-any cline-neutral">&nbsp;</span>
336
+ <span class="cline-any cline-yes">143x</span>
337
+ <span class="cline-any cline-yes">143x</span>
338
+ <span class="cline-any cline-yes">143x</span>
339
+ <span class="cline-any cline-yes">143x</span>
340
+ <span class="cline-any cline-yes">143x</span>
341
+ <span class="cline-any cline-yes">143x</span>
342
+ <span class="cline-any cline-yes">143x</span>
1261
343
  <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-yes">143x</span>
345
+ <span class="cline-any cline-yes">143x</span>
346
+ <span class="cline-any cline-yes">143x</span>
347
+ <span class="cline-any cline-yes">143x</span>
348
+ <span class="cline-any cline-yes">143x</span>
349
+ <span class="cline-any cline-yes">143x</span>
350
+ <span class="cline-any cline-yes">143x</span>
351
+ <span class="cline-any cline-yes">143x</span>
352
+ <span class="cline-any cline-yes">143x</span>
353
+ <span class="cline-any cline-yes">143x</span>
354
+ <span class="cline-any cline-yes">143x</span>
355
+ <span class="cline-any cline-yes">143x</span>
356
+ <span class="cline-any cline-yes">143x</span>
357
+ <span class="cline-any cline-yes">143x</span>
358
+ <span class="cline-any cline-yes">143x</span>
359
+ <span class="cline-any cline-yes">143x</span>
360
+ <span class="cline-any cline-yes">143x</span>
361
+ <span class="cline-any cline-yes">143x</span>
362
+ <span class="cline-any cline-yes">143x</span>
363
+ <span class="cline-any cline-yes">143x</span>
364
+ <span class="cline-any cline-yes">143x</span>
365
+ <span class="cline-any cline-yes">143x</span>
366
+ <span class="cline-any cline-yes">143x</span>
367
+ <span class="cline-any cline-yes">143x</span>
368
+ <span class="cline-any cline-yes">143x</span>
1262
369
  <span class="cline-any cline-neutral">&nbsp;</span>
1263
370
  <span class="cline-any cline-neutral">&nbsp;</span>
1264
371
  <span class="cline-any cline-neutral">&nbsp;</span>
1265
372
  <span class="cline-any cline-neutral">&nbsp;</span>
1266
373
  <span class="cline-any cline-neutral">&nbsp;</span>
374
+ <span class="cline-any cline-yes">143x</span>
375
+ <span class="cline-any cline-yes">44x</span>
376
+ <span class="cline-any cline-yes">44x</span>
1267
377
  <span class="cline-any cline-neutral">&nbsp;</span>
378
+ <span class="cline-any cline-yes">143x</span>
379
+ <span class="cline-any cline-yes">144x</span>
380
+ <span class="cline-any cline-yes">144x</span>
1268
381
  <span class="cline-any cline-neutral">&nbsp;</span>
1269
- <span class="cline-any cline-neutral">&nbsp;</span>
1270
- <span class="cline-any cline-yes">108x</span>
1271
- <span class="cline-any cline-yes">11x</span>
1272
- <span class="cline-any cline-yes">11x</span>
1273
- <span class="cline-any cline-yes">11x</span>
1274
- <span class="cline-any cline-yes">11x</span>
1275
- <span class="cline-any cline-yes">11x</span>
1276
- <span class="cline-any cline-no">&nbsp;</span>
1277
- <span class="cline-any cline-no">&nbsp;</span>
1278
- <span class="cline-any cline-no">&nbsp;</span>
1279
- <span class="cline-any cline-no">&nbsp;</span>
1280
- <span class="cline-any cline-neutral">&nbsp;</span>
1281
- <span class="cline-any cline-yes">11x</span>
1282
- <span class="cline-any cline-yes">11x</span>
1283
- <span class="cline-any cline-yes">11x</span>
1284
- <span class="cline-any cline-yes">11x</span>
1285
- <span class="cline-any cline-yes">11x</span>
1286
- <span class="cline-any cline-yes">11x</span>
1287
- <span class="cline-any cline-yes">11x</span>
1288
- <span class="cline-any cline-neutral">&nbsp;</span>
1289
- <span class="cline-any cline-yes">11x</span>
1290
- <span class="cline-any cline-yes">11x</span>
1291
- <span class="cline-any cline-yes">11x</span>
1292
- <span class="cline-any cline-neutral">&nbsp;</span>
1293
- <span class="cline-any cline-neutral">&nbsp;</span>
1294
- <span class="cline-any cline-neutral">&nbsp;</span>
1295
- <span class="cline-any cline-neutral">&nbsp;</span>
1296
- <span class="cline-any cline-neutral">&nbsp;</span>
1297
- <span class="cline-any cline-yes">108x</span>
1298
- <span class="cline-any cline-yes">11x</span>
1299
- <span class="cline-any cline-yes">11x</span>
1300
- <span class="cline-any cline-no">&nbsp;</span>
1301
- <span class="cline-any cline-no">&nbsp;</span>
382
+ <span class="cline-any cline-yes">143x</span>
1302
383
  <span class="cline-any cline-no">&nbsp;</span>
1303
384
  <span class="cline-any cline-no">&nbsp;</span>
1304
- <span class="cline-any cline-no">&nbsp;</span>
1305
- <span class="cline-any cline-neutral">&nbsp;</span>
1306
- <span class="cline-any cline-yes">11x</span>
1307
- <span class="cline-any cline-neutral">&nbsp;</span>
1308
385
  <span class="cline-any cline-neutral">&nbsp;</span>
1309
- <span class="cline-any cline-yes">11x</span>
1310
- <span class="cline-any cline-yes">11x</span>
1311
- <span class="cline-any cline-yes">9x</span>
1312
- <span class="cline-any cline-yes">2x</span>
1313
- <span class="cline-any cline-yes">2x</span>
386
+ <span class="cline-any cline-yes">143x</span>
1314
387
  <span class="cline-any cline-yes">2x</span>
1315
388
  <span class="cline-any cline-yes">2x</span>
1316
- <span class="cline-any cline-yes">9x</span>
1317
- <span class="cline-any cline-neutral">&nbsp;</span>
1318
- <span class="cline-any cline-yes">11x</span>
1319
- <span class="cline-any cline-neutral">&nbsp;</span>
1320
- <span class="cline-any cline-neutral">&nbsp;</span>
1321
- <span class="cline-any cline-yes">11x</span>
1322
- <span class="cline-any cline-yes">11x</span>
1323
- <span class="cline-any cline-neutral">&nbsp;</span>
1324
- <span class="cline-any cline-neutral">&nbsp;</span>
1325
- <span class="cline-any cline-yes">11x</span>
1326
- <span class="cline-any cline-yes">9x</span>
1327
- <span class="cline-any cline-yes">9x</span>
1328
- <span class="cline-any cline-yes">9x</span>
1329
- <span class="cline-any cline-neutral">&nbsp;</span>
1330
- <span class="cline-any cline-yes">11x</span>
1331
- <span class="cline-any cline-yes">11x</span>
1332
- <span class="cline-any cline-neutral">&nbsp;</span>
1333
- <span class="cline-any cline-neutral">&nbsp;</span>
1334
- <span class="cline-any cline-neutral">&nbsp;</span>
1335
- <span class="cline-any cline-neutral">&nbsp;</span>
1336
- <span class="cline-any cline-neutral">&nbsp;</span>
1337
- <span class="cline-any cline-yes">108x</span>
1338
- <span class="cline-any cline-yes">1x</span>
1339
- <span class="cline-any cline-yes">1x</span>
1340
- <span class="cline-any cline-neutral">&nbsp;</span>
1341
- <span class="cline-any cline-neutral">&nbsp;</span>
1342
- <span class="cline-any cline-neutral">&nbsp;</span>
1343
- <span class="cline-any cline-neutral">&nbsp;</span>
1344
- <span class="cline-any cline-neutral">&nbsp;</span>
1345
- <span class="cline-any cline-yes">108x</span>
1346
- <span class="cline-any cline-yes">3x</span>
1347
- <span class="cline-any cline-yes">3x</span>
1348
- <span class="cline-any cline-no">&nbsp;</span>
1349
- <span class="cline-any cline-no">&nbsp;</span>
1350
- <span class="cline-any cline-yes">3x</span>
1351
- <span class="cline-any cline-yes">3x</span>
1352
- <span class="cline-any cline-neutral">&nbsp;</span>
1353
- <span class="cline-any cline-neutral">&nbsp;</span>
1354
- <span class="cline-any cline-neutral">&nbsp;</span>
1355
- <span class="cline-any cline-neutral">&nbsp;</span>
1356
- <span class="cline-any cline-neutral">&nbsp;</span>
1357
- <span class="cline-any cline-neutral">&nbsp;</span>
1358
- <span class="cline-any cline-neutral">&nbsp;</span>
1359
- <span class="cline-any cline-neutral">&nbsp;</span>
1360
- <span class="cline-any cline-yes">108x</span>
1361
- <span class="cline-any cline-yes">448x</span>
1362
- <span class="cline-any cline-yes">448x</span>
1363
- <span class="cline-any cline-neutral">&nbsp;</span>
1364
- <span class="cline-any cline-neutral">&nbsp;</span>
1365
- <span class="cline-any cline-neutral">&nbsp;</span>
1366
- <span class="cline-any cline-yes">448x</span>
1367
- <span class="cline-any cline-yes">448x</span>
1368
- <span class="cline-any cline-yes">448x</span>
1369
- <span class="cline-any cline-yes">193x</span>
1370
- <span class="cline-any cline-yes">193x</span>
1371
- <span class="cline-any cline-yes">446x</span>
1372
- <span class="cline-any cline-yes">448x</span>
1373
- <span class="cline-any cline-yes">10x</span>
1374
- <span class="cline-any cline-yes">448x</span>
1375
- <span class="cline-any cline-yes">32x</span>
1376
- <span class="cline-any cline-yes">16x</span>
1377
- <span class="cline-any cline-yes">16x</span>
1378
- <span class="cline-any cline-yes">16x</span>
1379
- <span class="cline-any cline-yes">16x</span>
1380
- <span class="cline-any cline-yes">32x</span>
1381
- <span class="cline-any cline-yes">448x</span>
1382
- <span class="cline-any cline-yes">396x</span>
1383
- <span class="cline-any cline-yes">396x</span>
1384
- <span class="cline-any cline-yes">448x</span>
1385
- <span class="cline-any cline-yes">448x</span>
1386
- <span class="cline-any cline-yes">3x</span>
1387
- <span class="cline-any cline-yes">3x</span>
1388
- <span class="cline-any cline-yes">3x</span>
1389
- <span class="cline-any cline-yes">3x</span>
1390
- <span class="cline-any cline-yes">3x</span>
1391
- <span class="cline-any cline-yes">3x</span>
1392
- <span class="cline-any cline-yes">448x</span>
1393
- <span class="cline-any cline-yes">448x</span>
1394
- <span class="cline-any cline-neutral">&nbsp;</span>
1395
- <span class="cline-any cline-neutral">&nbsp;</span>
1396
- <span class="cline-any cline-neutral">&nbsp;</span>
1397
- <span class="cline-any cline-neutral">&nbsp;</span>
1398
389
  <span class="cline-any cline-neutral">&nbsp;</span>
1399
- <span class="cline-any cline-yes">108x</span>
1400
- <span class="cline-any cline-yes">280x</span>
1401
- <span class="cline-any cline-yes">280x</span>
1402
- <span class="cline-any cline-neutral">&nbsp;</span>
1403
- <span class="cline-any cline-neutral">&nbsp;</span>
1404
- <span class="cline-any cline-neutral">&nbsp;</span>
1405
- <span class="cline-any cline-neutral">&nbsp;</span>
1406
- <span class="cline-any cline-neutral">&nbsp;</span>
1407
- <span class="cline-any cline-neutral">&nbsp;</span>
1408
- <span class="cline-any cline-neutral">&nbsp;</span>
1409
- <span class="cline-any cline-neutral">&nbsp;</span>
1410
- <span class="cline-any cline-neutral">&nbsp;</span>
1411
- <span class="cline-any cline-neutral">&nbsp;</span>
1412
- <span class="cline-any cline-neutral">&nbsp;</span>
1413
- <span class="cline-any cline-yes">280x</span>
1414
- <span class="cline-any cline-yes">280x</span>
1415
- <span class="cline-any cline-yes">280x</span>
1416
- <span class="cline-any cline-yes">280x</span>
1417
- <span class="cline-any cline-yes">3x</span>
1418
- <span class="cline-any cline-yes">3x</span>
1419
- <span class="cline-any cline-yes">276x</span>
1420
- <span class="cline-any cline-yes">16x</span>
1421
- <span class="cline-any cline-yes">276x</span>
1422
- <span class="cline-any cline-yes">16x</span>
1423
- <span class="cline-any cline-yes">16x</span>
1424
- <span class="cline-any cline-yes">16x</span>
1425
- <span class="cline-any cline-yes">16x</span>
390
+ <span class="cline-any cline-yes">143x</span>
1426
391
  <span class="cline-any cline-yes">14x</span>
1427
392
  <span class="cline-any cline-yes">14x</span>
1428
- <span class="cline-any cline-yes">260x</span>
1429
393
  <span class="cline-any cline-neutral">&nbsp;</span>
1430
- <span class="cline-any cline-yes">260x</span>
1431
- <span class="cline-any cline-yes">260x</span>
1432
- <span class="cline-any cline-yes">254x</span>
1433
- <span class="cline-any cline-yes">22x</span>
1434
- <span class="cline-any cline-yes">238x</span>
1435
- <span class="cline-any cline-yes">280x</span>
1436
- <span class="cline-any cline-yes">280x</span>
1437
- <span class="cline-any cline-neutral">&nbsp;</span>
1438
- <span class="cline-any cline-neutral">&nbsp;</span>
1439
- <span class="cline-any cline-neutral">&nbsp;</span>
1440
- <span class="cline-any cline-neutral">&nbsp;</span>
1441
- <span class="cline-any cline-yes">108x</span>
1442
- <span class="cline-any cline-yes">260x</span>
1443
- <span class="cline-any cline-yes">260x</span>
1444
- <span class="cline-any cline-yes">260x</span>
1445
- <span class="cline-any cline-neutral">&nbsp;</span>
1446
- <span class="cline-any cline-neutral">&nbsp;</span>
1447
- <span class="cline-any cline-neutral">&nbsp;</span>
1448
- <span class="cline-any cline-yes">260x</span>
1449
- <span class="cline-any cline-neutral">&nbsp;</span>
1450
- <span class="cline-any cline-yes">260x</span>
1451
- <span class="cline-any cline-yes">260x</span>
1452
- <span class="cline-any cline-yes">260x</span>
1453
- <span class="cline-any cline-yes">260x</span>
1454
- <span class="cline-any cline-yes">260x</span>
1455
- <span class="cline-any cline-yes">22x</span>
1456
- <span class="cline-any cline-yes">22x</span>
1457
- <span class="cline-any cline-neutral">&nbsp;</span>
1458
- <span class="cline-any cline-neutral">&nbsp;</span>
1459
- <span class="cline-any cline-yes">238x</span>
1460
- <span class="cline-any cline-yes">238x</span>
1461
- <span class="cline-any cline-yes">238x</span>
1462
- <span class="cline-any cline-yes">238x</span>
1463
- <span class="cline-any cline-yes">238x</span>
1464
- <span class="cline-any cline-yes">260x</span>
394
+ <span class="cline-any cline-yes">143x</span>
395
+ <span class="cline-any cline-yes">182x</span>
396
+ <span class="cline-any cline-yes">182x</span>
397
+ <span class="cline-any cline-yes">182x</span>
1465
398
  <span class="cline-any cline-no">&nbsp;</span>
1466
399
  <span class="cline-any cline-no">&nbsp;</span>
400
+ <span class="cline-any cline-yes">182x</span>
401
+ <span class="cline-any cline-yes">182x</span>
1467
402
  <span class="cline-any cline-neutral">&nbsp;</span>
1468
- <span class="cline-any cline-yes">238x</span>
1469
- <span class="cline-any cline-yes">238x</span>
1470
- <span class="cline-any cline-yes">260x</span>
1471
- <span class="cline-any cline-neutral">&nbsp;</span>
1472
- <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-yes">143x</span>
404
+ <span class="cline-any cline-yes">337x</span>
405
+ <span class="cline-any cline-yes">337x</span>
406
+ <span class="cline-any cline-yes">337x</span>
1473
407
  <span class="cline-any cline-neutral">&nbsp;</span>
1474
408
  <span class="cline-any cline-neutral">&nbsp;</span>
1475
409
  <span class="cline-any cline-neutral">&nbsp;</span>
1476
- <span class="cline-any cline-yes">108x</span>
1477
- <span class="cline-any cline-yes">260x</span>
1478
- <span class="cline-any cline-yes">260x</span>
1479
410
  <span class="cline-any cline-neutral">&nbsp;</span>
1480
- <span class="cline-any cline-neutral">&nbsp;</span>
1481
- <span class="cline-any cline-yes">260x</span>
1482
- <span class="cline-any cline-neutral">&nbsp;</span>
1483
- <span class="cline-any cline-yes">260x</span>
1484
- <span class="cline-any cline-yes">260x</span>
1485
- <span class="cline-any cline-yes">260x</span>
1486
- <span class="cline-any cline-yes">260x</span>
1487
- <span class="cline-any cline-yes">260x</span>
411
+ <span class="cline-any cline-yes">337x</span>
412
+ <span class="cline-any cline-yes">337x</span>
413
+ <span class="cline-any cline-yes">337x</span>
414
+ <span class="cline-any cline-yes">337x</span>
415
+ <span class="cline-any cline-yes">337x</span>
416
+ <span class="cline-any cline-yes">337x</span>
417
+ <span class="cline-any cline-yes">337x</span>
1488
418
  <span class="cline-any cline-yes">5x</span>
1489
419
  <span class="cline-any cline-yes">5x</span>
1490
420
  <span class="cline-any cline-neutral">&nbsp;</span>
1491
421
  <span class="cline-any cline-neutral">&nbsp;</span>
1492
- <span class="cline-any cline-yes">255x</span>
1493
- <span class="cline-any cline-yes">260x</span>
1494
- <span class="cline-any cline-neutral">&nbsp;</span>
1495
- <span class="cline-any cline-neutral">&nbsp;</span>
1496
- <span class="cline-any cline-neutral">&nbsp;</span>
1497
- <span class="cline-any cline-neutral">&nbsp;</span>
1498
- <span class="cline-any cline-yes">108x</span>
1499
- <span class="cline-any cline-yes">260x</span>
1500
- <span class="cline-any cline-yes">260x</span>
1501
- <span class="cline-any cline-neutral">&nbsp;</span>
1502
- <span class="cline-any cline-neutral">&nbsp;</span>
1503
- <span class="cline-any cline-yes">260x</span>
1504
- <span class="cline-any cline-yes">260x</span>
1505
- <span class="cline-any cline-yes">2x</span>
1506
- <span class="cline-any cline-yes">2x</span>
1507
- <span class="cline-any cline-neutral">&nbsp;</span>
1508
- <span class="cline-any cline-yes">258x</span>
1509
- <span class="cline-any cline-yes">258x</span>
1510
- <span class="cline-any cline-yes">244x</span>
1511
- <span class="cline-any cline-yes">244x</span>
1512
- <span class="cline-any cline-neutral">&nbsp;</span>
1513
- <span class="cline-any cline-yes">19x</span>
1514
- <span class="cline-any cline-no">&nbsp;</span>
1515
- <span class="cline-any cline-no">&nbsp;</span>
1516
- <span class="cline-any cline-no">&nbsp;</span>
1517
- <span class="cline-any cline-no">&nbsp;</span>
1518
- <span class="cline-any cline-no">&nbsp;</span>
1519
- <span class="cline-any cline-neutral">&nbsp;</span>
1520
- <span class="cline-any cline-yes">14x</span>
1521
- <span class="cline-any cline-yes">19x</span>
1522
- <span class="cline-any cline-yes">9x</span>
1523
- <span class="cline-any cline-yes">9x</span>
1524
- <span class="cline-any cline-neutral">&nbsp;</span>
1525
- <span class="cline-any cline-yes">5x</span>
1526
- <span class="cline-any cline-yes">260x</span>
1527
- <span class="cline-any cline-neutral">&nbsp;</span>
1528
- <span class="cline-any cline-neutral">&nbsp;</span>
1529
- <span class="cline-any cline-neutral">&nbsp;</span>
1530
- <span class="cline-any cline-neutral">&nbsp;</span>
1531
- <span class="cline-any cline-yes">108x</span>
1532
- <span class="cline-any cline-yes">255x</span>
1533
- <span class="cline-any cline-neutral">&nbsp;</span>
1534
- <span class="cline-any cline-neutral">&nbsp;</span>
1535
- <span class="cline-any cline-yes">255x</span>
1536
- <span class="cline-any cline-yes">255x</span>
1537
- <span class="cline-any cline-neutral">&nbsp;</span>
1538
- <span class="cline-any cline-yes">255x</span>
1539
- <span class="cline-any cline-yes">17x</span>
1540
- <span class="cline-any cline-yes">17x</span>
1541
- <span class="cline-any cline-neutral">&nbsp;</span>
1542
- <span class="cline-any cline-neutral">&nbsp;</span>
1543
- <span class="cline-any cline-yes">238x</span>
1544
- <span class="cline-any cline-yes">255x</span>
1545
- <span class="cline-any cline-no">&nbsp;</span>
1546
- <span class="cline-any cline-no">&nbsp;</span>
1547
- <span class="cline-any cline-no">&nbsp;</span>
1548
- <span class="cline-any cline-no">&nbsp;</span>
1549
- <span class="cline-any cline-neutral">&nbsp;</span>
1550
- <span class="cline-any cline-no">&nbsp;</span>
1551
- <span class="cline-any cline-neutral">&nbsp;</span>
1552
- <span class="cline-any cline-yes">255x</span>
1553
- <span class="cline-any cline-no">&nbsp;</span>
1554
- <span class="cline-any cline-no">&nbsp;</span>
1555
- <span class="cline-any cline-no">&nbsp;</span>
1556
- <span class="cline-any cline-no">&nbsp;</span>
1557
- <span class="cline-any cline-neutral">&nbsp;</span>
1558
- <span class="cline-any cline-no">&nbsp;</span>
1559
- <span class="cline-any cline-neutral">&nbsp;</span>
1560
- <span class="cline-any cline-yes">255x</span>
1561
- <span class="cline-any cline-yes">238x</span>
1562
- <span class="cline-any cline-neutral">&nbsp;</span>
1563
- <span class="cline-any cline-yes">255x</span>
1564
- <span class="cline-any cline-no">&nbsp;</span>
1565
- <span class="cline-any cline-yes">255x</span>
1566
- <span class="cline-any cline-yes">255x</span>
1567
- <span class="cline-any cline-neutral">&nbsp;</span>
1568
- <span class="cline-any cline-neutral">&nbsp;</span>
1569
- <span class="cline-any cline-neutral">&nbsp;</span>
1570
- <span class="cline-any cline-neutral">&nbsp;</span>
1571
- <span class="cline-any cline-yes">108x</span>
1572
- <span class="cline-any cline-yes">497x</span>
1573
- <span class="cline-any cline-yes">497x</span>
1574
- <span class="cline-any cline-yes">497x</span>
1575
- <span class="cline-any cline-yes">497x</span>
1576
- <span class="cline-any cline-yes">238x</span>
1577
- <span class="cline-any cline-yes">237x</span>
1578
- <span class="cline-any cline-neutral">&nbsp;</span>
1579
- <span class="cline-any cline-yes">497x</span>
1580
- <span class="cline-any cline-no">&nbsp;</span>
1581
- <span class="cline-any cline-neutral">&nbsp;</span>
1582
- <span class="cline-any cline-yes">497x</span>
1583
- <span class="cline-any cline-no">&nbsp;</span>
1584
- <span class="cline-any cline-neutral">&nbsp;</span>
1585
- <span class="cline-any cline-yes">497x</span>
1586
- <span class="cline-any cline-yes">259x</span>
1587
- <span class="cline-any cline-neutral">&nbsp;</span>
1588
- <span class="cline-any cline-yes">497x</span>
1589
- <span class="cline-any cline-no">&nbsp;</span>
1590
- <span class="cline-any cline-yes">497x</span>
1591
- <span class="cline-any cline-yes">497x</span>
1592
- <span class="cline-any cline-neutral">&nbsp;</span>
1593
- <span class="cline-any cline-neutral">&nbsp;</span>
1594
- <span class="cline-any cline-neutral">&nbsp;</span>
1595
- <span class="cline-any cline-neutral">&nbsp;</span>
1596
- <span class="cline-any cline-yes">108x</span>
1597
- <span class="cline-any cline-yes">253x</span>
1598
- <span class="cline-any cline-yes">253x</span>
1599
- <span class="cline-any cline-yes">253x</span>
1600
- <span class="cline-any cline-yes">253x</span>
1601
- <span class="cline-any cline-yes">253x</span>
1602
- <span class="cline-any cline-yes">253x</span>
1603
- <span class="cline-any cline-yes">253x</span>
1604
- <span class="cline-any cline-yes">253x</span>
1605
- <span class="cline-any cline-neutral">&nbsp;</span>
1606
- <span class="cline-any cline-neutral">&nbsp;</span>
1607
- <span class="cline-any cline-neutral">&nbsp;</span>
1608
- <span class="cline-any cline-neutral">&nbsp;</span>
1609
- <span class="cline-any cline-yes">108x</span>
1610
- <span class="cline-any cline-neutral">&nbsp;</span>
1611
- <span class="cline-any cline-neutral">&nbsp;</span>
1612
- <span class="cline-any cline-neutral">&nbsp;</span>
1613
- <span class="cline-any cline-yes">238x</span>
1614
- <span class="cline-any cline-yes">238x</span>
1615
- <span class="cline-any cline-yes">238x</span>
1616
- <span class="cline-any cline-neutral">&nbsp;</span>
1617
- <span class="cline-any cline-neutral">&nbsp;</span>
1618
- <span class="cline-any cline-neutral">&nbsp;</span>
1619
- <span class="cline-any cline-neutral">&nbsp;</span>
1620
- <span class="cline-any cline-neutral">&nbsp;</span>
1621
- <span class="cline-any cline-neutral">&nbsp;</span>
1622
- <span class="cline-any cline-neutral">&nbsp;</span>
1623
- <span class="cline-any cline-yes">238x</span>
1624
- <span class="cline-any cline-yes">238x</span>
1625
- <span class="cline-any cline-yes">238x</span>
1626
- <span class="cline-any cline-yes">238x</span>
1627
- <span class="cline-any cline-yes">238x</span>
1628
- <span class="cline-any cline-yes">238x</span>
1629
- <span class="cline-any cline-yes">238x</span>
1630
- <span class="cline-any cline-yes">238x</span>
1631
- <span class="cline-any cline-yes">238x</span>
1632
- <span class="cline-any cline-yes">238x</span>
1633
- <span class="cline-any cline-yes">238x</span>
1634
- <span class="cline-any cline-no">&nbsp;</span>
1635
- <span class="cline-any cline-no">&nbsp;</span>
1636
- <span class="cline-any cline-yes">238x</span>
1637
- <span class="cline-any cline-neutral">&nbsp;</span>
1638
- <span class="cline-any cline-neutral">&nbsp;</span>
1639
- <span class="cline-any cline-neutral">&nbsp;</span>
1640
- <span class="cline-any cline-neutral">&nbsp;</span>
1641
- <span class="cline-any cline-yes">108x</span>
1642
- <span class="cline-any cline-neutral">&nbsp;</span>
1643
- <span class="cline-any cline-neutral">&nbsp;</span>
1644
- <span class="cline-any cline-neutral">&nbsp;</span>
1645
- <span class="cline-any cline-neutral">&nbsp;</span>
1646
- <span class="cline-any cline-neutral">&nbsp;</span>
1647
- <span class="cline-any cline-neutral">&nbsp;</span>
1648
- <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-yes">337x</span>
423
+ <span class="cline-any cline-yes">55x</span>
424
+ <span class="cline-any cline-yes">55x</span>
425
+ <span class="cline-any cline-yes">55x</span>
426
+ <span class="cline-any cline-yes">55x</span>
427
+ <span class="cline-any cline-yes">55x</span>
428
+ <span class="cline-any cline-yes">55x</span>
429
+ <span class="cline-any cline-yes">55x</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-yes">326x</span>
432
+ <span class="cline-any cline-yes">337x</span>
433
+ <span class="cline-any cline-neutral">&nbsp;</span>
434
+ <span class="cline-any cline-yes">143x</span>
435
+ <span class="cline-any cline-yes">235x</span>
436
+ <span class="cline-any cline-yes">235x</span>
437
+ <span class="cline-any cline-yes">235x</span>
438
+ <span class="cline-any cline-yes">235x</span>
439
+ <span class="cline-any cline-yes">235x</span>
440
+ <span class="cline-any cline-yes">3x</span>
441
+ <span class="cline-any cline-yes">3x</span>
442
+ <span class="cline-any cline-yes">228x</span>
443
+ <span class="cline-any cline-yes">235x</span>
1649
444
  <span class="cline-any cline-neutral">&nbsp;</span>
1650
- <span class="cline-any cline-yes">238x</span>
1651
- <span class="cline-any cline-yes">238x</span>
1652
- <span class="cline-any cline-yes">238x</span>
1653
- <span class="cline-any cline-yes">238x</span>
1654
- <span class="cline-any cline-yes">238x</span>
1655
- <span class="cline-any cline-yes">238x</span>
1656
- <span class="cline-any cline-yes">238x</span>
1657
- <span class="cline-any cline-yes">238x</span>
1658
- <span class="cline-any cline-yes">238x</span>
1659
- <span class="cline-any cline-yes">238x</span>
1660
- <span class="cline-any cline-yes">238x</span>
1661
- <span class="cline-any cline-yes">238x</span>
445
+ <span class="cline-any cline-yes">143x</span>
1662
446
  <span class="cline-any cline-neutral">&nbsp;</span>
1663
447
  <span class="cline-any cline-neutral">&nbsp;</span>
1664
- <span class="cline-any cline-yes">238x</span>
1665
- <span class="cline-any cline-yes">238x</span>
1666
- <span class="cline-any cline-yes">238x</span>
1667
- <span class="cline-any cline-yes">238x</span>
1668
- <span class="cline-any cline-yes">238x</span>
1669
- <span class="cline-any cline-yes">238x</span>
1670
- <span class="cline-any cline-yes">238x</span>
1671
448
  <span class="cline-any cline-neutral">&nbsp;</span>
449
+ <span class="cline-any cline-yes">99x</span>
450
+ <span class="cline-any cline-yes">99x</span>
1672
451
  <span class="cline-any cline-neutral">&nbsp;</span>
1673
- <span class="cline-any cline-yes">238x</span>
1674
- <span class="cline-any cline-yes">238x</span>
1675
- <span class="cline-any cline-yes">238x</span>
1676
- <span class="cline-any cline-yes">238x</span>
1677
- <span class="cline-any cline-yes">238x</span>
1678
- <span class="cline-any cline-yes">238x</span>
1679
- <span class="cline-any cline-yes">238x</span>
1680
- <span class="cline-any cline-yes">238x</span>
1681
- <span class="cline-any cline-yes">238x</span>
1682
- <span class="cline-any cline-yes">238x</span>
1683
- <span class="cline-any cline-yes">238x</span>
1684
- <span class="cline-any cline-yes">238x</span>
1685
- <span class="cline-any cline-yes">238x</span>
1686
- <span class="cline-any cline-yes">238x</span>
1687
- <span class="cline-any cline-no">&nbsp;</span>
1688
- <span class="cline-any cline-no">&nbsp;</span>
1689
- <span class="cline-any cline-no">&nbsp;</span>
1690
- <span class="cline-any cline-no">&nbsp;</span>
1691
- <span class="cline-any cline-no">&nbsp;</span>
1692
- <span class="cline-any cline-no">&nbsp;</span>
1693
- <span class="cline-any cline-no">&nbsp;</span>
1694
- <span class="cline-any cline-yes">238x</span>
1695
452
  <span class="cline-any cline-neutral">&nbsp;</span>
1696
- <span class="cline-any cline-yes">238x</span>
1697
453
  <span class="cline-any cline-neutral">&nbsp;</span>
1698
- <span class="cline-any cline-yes">238x</span>
1699
- <span class="cline-any cline-yes">238x</span>
1700
454
  <span class="cline-any cline-neutral">&nbsp;</span>
455
+ <span class="cline-any cline-yes">99x</span>
456
+ <span class="cline-any cline-yes">99x</span>
457
+ <span class="cline-any cline-yes">99x</span>
458
+ <span class="cline-any cline-yes">99x</span>
459
+ <span class="cline-any cline-yes">99x</span>
460
+ <span class="cline-any cline-yes">99x</span>
461
+ <span class="cline-any cline-yes">99x</span>
1701
462
  <span class="cline-any cline-neutral">&nbsp;</span>
1702
- <span class="cline-any cline-neutral">&nbsp;</span>
1703
- <span class="cline-any cline-neutral">&nbsp;</span>
1704
- <span class="cline-any cline-yes">108x</span>
1705
- <span class="cline-any cline-yes">238x</span>
1706
- <span class="cline-any cline-yes">238x</span>
1707
- <span class="cline-any cline-yes">238x</span>
1708
- <span class="cline-any cline-yes">238x</span>
1709
- <span class="cline-any cline-yes">238x</span>
1710
- <span class="cline-any cline-yes">238x</span>
1711
- <span class="cline-any cline-yes">238x</span>
1712
- <span class="cline-any cline-yes">238x</span>
1713
- <span class="cline-any cline-yes">238x</span>
1714
- <span class="cline-any cline-yes">238x</span>
1715
- <span class="cline-any cline-neutral">&nbsp;</span>
1716
- <span class="cline-any cline-yes">238x</span>
1717
- <span class="cline-any cline-yes">1x</span>
1718
- <span class="cline-any cline-yes">1x</span>
1719
- <span class="cline-any cline-yes">1x</span>
1720
- <span class="cline-any cline-yes">1x</span>
1721
- <span class="cline-any cline-yes">1x</span>
1722
- <span class="cline-any cline-yes">1x</span>
1723
- <span class="cline-any cline-yes">1x</span>
1724
- <span class="cline-any cline-yes">238x</span>
1725
- <span class="cline-any cline-yes">237x</span>
1726
- <span class="cline-any cline-yes">237x</span>
1727
- <span class="cline-any cline-yes">237x</span>
1728
- <span class="cline-any cline-yes">237x</span>
1729
- <span class="cline-any cline-yes">237x</span>
1730
- <span class="cline-any cline-yes">237x</span>
1731
- <span class="cline-any cline-yes">237x</span>
1732
- <span class="cline-any cline-yes">237x</span>
1733
- <span class="cline-any cline-yes">238x</span>
1734
- <span class="cline-any cline-neutral">&nbsp;</span>
1735
- <span class="cline-any cline-neutral">&nbsp;</span>
1736
- <span class="cline-any cline-neutral">&nbsp;</span>
1737
- <span class="cline-any cline-neutral">&nbsp;</span>
1738
- <span class="cline-any cline-yes">108x</span>
1739
- <span class="cline-any cline-yes">237x</span>
1740
- <span class="cline-any cline-yes">237x</span>
1741
- <span class="cline-any cline-yes">237x</span>
1742
- <span class="cline-any cline-yes">237x</span>
1743
- <span class="cline-any cline-yes">237x</span>
1744
- <span class="cline-any cline-yes">237x</span>
1745
- <span class="cline-any cline-yes">237x</span>
1746
- <span class="cline-any cline-yes">237x</span>
1747
- <span class="cline-any cline-neutral">&nbsp;</span>
1748
- <span class="cline-any cline-neutral">&nbsp;</span>
1749
- <span class="cline-any cline-yes">237x</span>
1750
- <span class="cline-any cline-yes">36x</span>
1751
- <span class="cline-any cline-yes">38x</span>
1752
- <span class="cline-any cline-yes">38x</span>
1753
- <span class="cline-any cline-yes">2x</span>
1754
- <span class="cline-any cline-yes">38x</span>
1755
- <span class="cline-any cline-yes">38x</span>
1756
- <span class="cline-any cline-yes">36x</span>
1757
- <span class="cline-any cline-yes">36x</span>
1758
- <span class="cline-any cline-neutral">&nbsp;</span>
1759
- <span class="cline-any cline-yes">237x</span>
1760
- <span class="cline-any cline-yes">237x</span>
1761
- <span class="cline-any cline-yes">237x</span>
463
+ <span class="cline-any cline-yes">143x</span>
464
+ <span class="cline-any cline-yes">12x</span>
465
+ <span class="cline-any cline-yes">12x</span>
1762
466
  <span class="cline-any cline-neutral">&nbsp;</span>
1763
467
  <span class="cline-any cline-neutral">&nbsp;</span>
1764
468
  <span class="cline-any cline-neutral">&nbsp;</span>
1765
469
  <span class="cline-any cline-neutral">&nbsp;</span>
1766
- <span class="cline-any cline-yes">108x</span>
1767
- <span class="cline-any cline-yes">1x</span>
1768
- <span class="cline-any cline-yes">1x</span>
1769
- <span class="cline-any cline-yes">1x</span>
1770
- <span class="cline-any cline-yes">1x</span>
1771
- <span class="cline-any cline-yes">1x</span>
1772
- <span class="cline-any cline-yes">1x</span>
1773
- <span class="cline-any cline-yes">1x</span>
1774
- <span class="cline-any cline-yes">1x</span>
1775
- <span class="cline-any cline-yes">1x</span>
1776
- <span class="cline-any cline-yes">1x</span>
1777
470
  <span class="cline-any cline-neutral">&nbsp;</span>
1778
- <span class="cline-any cline-yes">1x</span>
1779
- <span class="cline-any cline-yes">1x</span>
1780
- <span class="cline-any cline-yes">1x</span>
1781
471
  <span class="cline-any cline-neutral">&nbsp;</span>
1782
- <span class="cline-any cline-yes">1x</span>
1783
- <span class="cline-any cline-yes">1x</span>
1784
- <span class="cline-any cline-yes">1x</span>
1785
472
  <span class="cline-any cline-neutral">&nbsp;</span>
1786
- <span class="cline-any cline-yes">1x</span>
1787
- <span class="cline-any cline-yes">1x</span>
1788
473
  <span class="cline-any cline-neutral">&nbsp;</span>
1789
474
  <span class="cline-any cline-neutral">&nbsp;</span>
475
+ <span class="cline-any cline-yes">143x</span>
476
+ <span class="cline-any cline-yes">10x</span>
477
+ <span class="cline-any cline-yes">10x</span>
1790
478
  <span class="cline-any cline-neutral">&nbsp;</span>
1791
479
  <span class="cline-any cline-neutral">&nbsp;</span>
1792
- <span class="cline-any cline-yes">108x</span>
1793
- <span class="cline-any cline-yes">238x</span>
1794
- <span class="cline-any cline-yes">238x</span>
1795
- <span class="cline-any cline-yes">238x</span>
1796
- <span class="cline-any cline-yes">238x</span>
1797
- <span class="cline-any cline-yes">238x</span>
1798
- <span class="cline-any cline-yes">238x</span>
1799
- <span class="cline-any cline-yes">217x</span>
1800
- <span class="cline-any cline-yes">217x</span>
1801
- <span class="cline-any cline-yes">217x</span>
1802
- <span class="cline-any cline-yes">217x</span>
1803
- <span class="cline-any cline-yes">217x</span>
1804
480
  <span class="cline-any cline-neutral">&nbsp;</span>
1805
- <span class="cline-any cline-yes">238x</span>
1806
- <span class="cline-any cline-yes">9x</span>
1807
- <span class="cline-any cline-yes">9x</span>
1808
- <span class="cline-any cline-yes">9x</span>
1809
- <span class="cline-any cline-yes">9x</span>
1810
- <span class="cline-any cline-yes">9x</span>
1811
- <span class="cline-any cline-yes">9x</span>
1812
- <span class="cline-any cline-yes">9x</span>
1813
- <span class="cline-any cline-yes">9x</span>
1814
- <span class="cline-any cline-yes">9x</span>
1815
- <span class="cline-any cline-yes">9x</span>
1816
- <span class="cline-any cline-yes">9x</span>
1817
481
  <span class="cline-any cline-neutral">&nbsp;</span>
1818
- <span class="cline-any cline-yes">238x</span>
1819
482
  <span class="cline-any cline-neutral">&nbsp;</span>
1820
- <span class="cline-any cline-yes">12x</span>
1821
- <span class="cline-any cline-yes">238x</span>
1822
- <span class="cline-any cline-yes">238x</span>
1823
483
  <span class="cline-any cline-neutral">&nbsp;</span>
1824
484
  <span class="cline-any cline-neutral">&nbsp;</span>
1825
485
  <span class="cline-any cline-neutral">&nbsp;</span>
1826
486
  <span class="cline-any cline-neutral">&nbsp;</span>
1827
- <span class="cline-any cline-yes">108x</span>
1828
- <span class="cline-any cline-yes">39x</span>
1829
- <span class="cline-any cline-yes">39x</span>
1830
- <span class="cline-any cline-yes">39x</span>
1831
- <span class="cline-any cline-yes">39x</span>
1832
487
  <span class="cline-any cline-neutral">&nbsp;</span>
1833
- <span class="cline-any cline-yes">39x</span>
1834
- <span class="cline-any cline-yes">1x</span>
1835
- <span class="cline-any cline-yes">1x</span>
1836
- <span class="cline-any cline-no">&nbsp;</span>
1837
- <span class="cline-any cline-no">&nbsp;</span>
1838
- <span class="cline-any cline-no">&nbsp;</span>
1839
- <span class="cline-any cline-no">&nbsp;</span>
1840
- <span class="cline-any cline-no">&nbsp;</span>
1841
- <span class="cline-any cline-no">&nbsp;</span>
1842
- <span class="cline-any cline-yes">1x</span>
1843
488
  <span class="cline-any cline-neutral">&nbsp;</span>
1844
489
  <span class="cline-any cline-neutral">&nbsp;</span>
1845
- <span class="cline-any cline-yes">39x</span>
1846
- <span class="cline-any cline-yes">39x</span>
1847
- <span class="cline-any cline-yes">1x</span>
1848
- <span class="cline-any cline-yes">39x</span>
1849
- <span class="cline-any cline-no">&nbsp;</span>
1850
- <span class="cline-any cline-no">&nbsp;</span>
1851
- <span class="cline-any cline-no">&nbsp;</span>
1852
- <span class="cline-any cline-no">&nbsp;</span>
1853
- <span class="cline-any cline-no">&nbsp;</span>
1854
- <span class="cline-any cline-no">&nbsp;</span>
1855
- <span class="cline-any cline-no">&nbsp;</span>
1856
- <span class="cline-any cline-no">&nbsp;</span>
1857
- <span class="cline-any cline-no">&nbsp;</span>
1858
- <span class="cline-any cline-no">&nbsp;</span>
490
+ <span class="cline-any cline-yes">143x</span>
491
+ <span class="cline-any cline-yes">32x</span>
492
+ <span class="cline-any cline-yes">32x</span>
493
+ <span class="cline-any cline-yes">32x</span>
494
+ <span class="cline-any cline-yes">32x</span>
495
+ <span class="cline-any cline-yes">32x</span>
496
+ <span class="cline-any cline-yes">32x</span>
497
+ <span class="cline-any cline-yes">32x</span>
498
+ <span class="cline-any cline-yes">32x</span>
499
+ <span class="cline-any cline-yes">32x</span>
500
+ <span class="cline-any cline-yes">32x</span>
501
+ <span class="cline-any cline-neutral">&nbsp;</span>
1859
502
  <span class="cline-any cline-neutral">&nbsp;</span>
1860
- <span class="cline-any cline-yes">39x</span>
1861
- <span class="cline-any cline-yes">39x</span>
1862
503
  <span class="cline-any cline-neutral">&nbsp;</span>
1863
504
  <span class="cline-any cline-neutral">&nbsp;</span>
1864
505
  <span class="cline-any cline-neutral">&nbsp;</span>
506
+ <span class="cline-any cline-yes">143x</span>
507
+ <span class="cline-any cline-yes">24x</span>
508
+ <span class="cline-any cline-yes">24x</span>
1865
509
  <span class="cline-any cline-neutral">&nbsp;</span>
1866
510
  <span class="cline-any cline-neutral">&nbsp;</span>
1867
- <span class="cline-any cline-yes">108x</span>
1868
- <span class="cline-any cline-yes">254x</span>
1869
511
  <span class="cline-any cline-neutral">&nbsp;</span>
1870
512
  <span class="cline-any cline-neutral">&nbsp;</span>
1871
513
  <span class="cline-any cline-neutral">&nbsp;</span>
1872
- <span class="cline-any cline-yes">254x</span>
1873
- <span class="cline-any cline-yes">254x</span>
1874
- <span class="cline-any cline-yes">254x</span>
514
+ <span class="cline-any cline-yes">143x</span>
515
+ <span class="cline-any cline-yes">9x</span>
516
+ <span class="cline-any cline-yes">9x</span>
1875
517
  <span class="cline-any cline-neutral">&nbsp;</span>
1876
- <span class="cline-any cline-yes">254x</span>
1877
518
  <span class="cline-any cline-neutral">&nbsp;</span>
1878
- <span class="cline-any cline-yes">254x</span>
1879
- <span class="cline-any cline-yes">1x</span>
1880
- <span class="cline-any cline-yes">1x</span>
1881
519
  <span class="cline-any cline-neutral">&nbsp;</span>
1882
- <span class="cline-any cline-yes">254x</span>
1883
- <span class="cline-any cline-yes">238x</span>
1884
- <span class="cline-any cline-yes">238x</span>
1885
520
  <span class="cline-any cline-neutral">&nbsp;</span>
1886
- <span class="cline-any cline-yes">254x</span>
1887
521
  <span class="cline-any cline-neutral">&nbsp;</span>
1888
- <span class="cline-any cline-yes">254x</span>
1889
- <span class="cline-any cline-yes">39x</span>
522
+ <span class="cline-any cline-yes">143x</span>
523
+ <span class="cline-any cline-yes">3x</span>
524
+ <span class="cline-any cline-yes">3x</span>
1890
525
  <span class="cline-any cline-neutral">&nbsp;</span>
1891
526
  <span class="cline-any cline-neutral">&nbsp;</span>
1892
- <span class="cline-any cline-yes">39x</span>
1893
- <span class="cline-any cline-yes">39x</span>
1894
- <span class="cline-any cline-yes">39x</span>
1895
- <span class="cline-any cline-yes">39x</span>
1896
- <span class="cline-any cline-yes">39x</span>
1897
- <span class="cline-any cline-yes">39x</span>
1898
- <span class="cline-any cline-no">&nbsp;</span>
1899
- <span class="cline-any cline-no">&nbsp;</span>
1900
527
  <span class="cline-any cline-neutral">&nbsp;</span>
1901
528
  <span class="cline-any cline-neutral">&nbsp;</span>
1902
- <span class="cline-any cline-yes">39x</span>
1903
- <span class="cline-any cline-yes">39x</span>
1904
- <span class="cline-any cline-yes">39x</span>
1905
- <span class="cline-any cline-yes">39x</span>
1906
- <span class="cline-any cline-yes">39x</span>
1907
- <span class="cline-any cline-yes">39x</span>
1908
- <span class="cline-any cline-yes">39x</span>
1909
- <span class="cline-any cline-yes">39x</span>
1910
- <span class="cline-any cline-no">&nbsp;</span>
1911
- <span class="cline-any cline-no">&nbsp;</span>
1912
- <span class="cline-any cline-yes">39x</span>
1913
- <span class="cline-any cline-yes">39x</span>
1914
- <span class="cline-any cline-yes">254x</span>
1915
- <span class="cline-any cline-yes">254x</span>
1916
- <span class="cline-any cline-yes">254x</span>
1917
- <span class="cline-any cline-yes">254x</span>
1918
- <span class="cline-any cline-yes">254x</span>
1919
- <span class="cline-any cline-yes">254x</span>
529
+ <span class="cline-any cline-yes">143x</span>
530
+ <span class="cline-any cline-yes">1x</span>
531
+ <span class="cline-any cline-yes">1x</span>
1920
532
  <span class="cline-any cline-neutral">&nbsp;</span>
1921
533
  <span class="cline-any cline-neutral">&nbsp;</span>
1922
534
  <span class="cline-any cline-neutral">&nbsp;</span>
1923
535
  <span class="cline-any cline-neutral">&nbsp;</span>
1924
- <span class="cline-any cline-yes">108x</span>
1925
- <span class="cline-any cline-yes">466x</span>
1926
- <span class="cline-any cline-yes">429x</span>
1927
- <span class="cline-any cline-yes">429x</span>
1928
536
  <span class="cline-any cline-neutral">&nbsp;</span>
1929
- <span class="cline-any cline-yes">37x</span>
1930
- <span class="cline-any cline-yes">37x</span>
1931
- <span class="cline-any cline-yes">37x</span>
1932
- <span class="cline-any cline-yes">37x</span>
537
+ <span class="cline-any cline-yes">143x</span>
538
+ <span class="cline-any cline-no">&nbsp;</span>
539
+ <span class="cline-any cline-no">&nbsp;</span>
540
+ <span class="cline-any cline-no">&nbsp;</span>
541
+ <span class="cline-any cline-no">&nbsp;</span>
542
+ <span class="cline-any cline-no">&nbsp;</span>
543
+ <span class="cline-any cline-no">&nbsp;</span>
544
+ <span class="cline-any cline-no">&nbsp;</span>
545
+ <span class="cline-any cline-no">&nbsp;</span>
546
+ <span class="cline-any cline-no">&nbsp;</span>
547
+ <span class="cline-any cline-no">&nbsp;</span>
548
+ <span class="cline-any cline-no">&nbsp;</span>
1933
549
  <span class="cline-any cline-neutral">&nbsp;</span>
1934
- <span class="cline-any cline-yes">37x</span>
1935
- <span class="cline-any cline-yes">466x</span>
1936
550
  <span class="cline-any cline-neutral">&nbsp;</span>
1937
551
  <span class="cline-any cline-neutral">&nbsp;</span>
1938
552
  <span class="cline-any cline-neutral">&nbsp;</span>
1939
553
  <span class="cline-any cline-neutral">&nbsp;</span>
1940
- <span class="cline-any cline-yes">108x</span>
1941
- <span class="cline-any cline-yes">44x</span>
1942
- <span class="cline-any cline-yes">1x</span>
1943
- <span class="cline-any cline-yes">1x</span>
1944
- <span class="cline-any cline-yes">44x</span>
554
+ <span class="cline-any cline-yes">143x</span>
1945
555
  <span class="cline-any cline-no">&nbsp;</span>
1946
556
  <span class="cline-any cline-no">&nbsp;</span>
1947
- <span class="cline-any cline-yes">43x</span>
1948
- <span class="cline-any cline-yes">44x</span>
1949
- <span class="cline-any cline-yes">108x</span>
557
+ <span class="cline-any cline-yes">143x</span>
1950
558
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/* eslint-disable @typescript-eslint/no-explicit-any */
1951
559
  /* eslint-disable @typescript-eslint/no-empty-object-type */
1952
560
  import type { z, ZodObject, ZodOptional } from 'zod/v4'
1953
561
  &nbsp;
1954
- import type { FactoryContext } from './factory-context.mjs'
1955
562
  import type {
1956
563
  AnyInjectableType,
1957
- BaseInjectionTokenSchemaType,
1958
564
  InjectionTokenSchemaType,
1959
- InjectionTokenType,
1960
- OptionalInjectionTokenSchemaType,
1961
565
  } from './injection-token.mjs'
1962
566
  import type { Registry } from './registry.mjs'
1963
567
  import type { RequestContextHolder } from './request-context-holder.mjs'
1964
- import type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'
568
+ import type { ClearAllOptions } from './service-invalidator.mjs'
1965
569
  import type { Injectors } from './utils/index.mjs'
1966
570
  &nbsp;
1967
- import { InjectableScope } from './enums/index.mjs'
1968
- import {
1969
- ErrorsEnum,
1970
- FactoryNotFound,
1971
- FactoryTokenNotResolved,
1972
- UnknownError,
1973
- } from './errors/index.mjs'
1974
- import {
1975
- BoundInjectionToken,
1976
- FactoryInjectionToken,
1977
- InjectionToken,
1978
- } from './injection-token.mjs'
1979
571
  import { defaultInjectors } from './injector.mjs'
572
+ import { InstanceResolver } from './instance-resolver.mjs'
1980
573
  import { globalRegistry } from './registry.mjs'
1981
- import { DefaultRequestContextHolder } from './request-context-holder.mjs'
574
+ import { RequestContextManager } from './request-context-manager.mjs'
1982
575
  import { ServiceInstantiator } from './service-instantiator.mjs'
576
+ import { ServiceInvalidator } from './service-invalidator.mjs'
1983
577
  import { ServiceLocatorEventBus } from './service-locator-event-bus.mjs'
1984
- import { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'
1985
578
  import { ServiceLocatorManager } from './service-locator-manager.mjs'
1986
- import { getInjectableToken } from './utils/index.mjs'
579
+ import { TokenProcessor } from './token-processor.mjs'
1987
580
  &nbsp;
1988
581
  export class ServiceLocator {
1989
582
  private readonly eventBus: ServiceLocatorEventBus
1990
583
  private readonly manager: ServiceLocatorManager
1991
584
  private readonly serviceInstantiator: ServiceInstantiator
1992
- private readonly requestContexts = new Map&lt;string, RequestContextHolder&gt;()
1993
- private currentRequestContext: RequestContextHolder | null = null
585
+ private readonly tokenProcessor: TokenProcessor
586
+ private readonly requestContextManager: RequestContextManager
587
+ private readonly serviceInvalidator: ServiceInvalidator
588
+ private readonly instanceResolver: InstanceResolver
1994
589
  &nbsp;
1995
590
  constructor(
1996
591
  private readonly registry: Registry = globalRegistry,
@@ -2000,27 +595,55 @@ export class ServiceLocator {
2000
595
  this.eventBus = new ServiceLocatorEventBus(logger)
2001
596
  this.manager = new ServiceLocatorManager(logger)
2002
597
  this.serviceInstantiator = new ServiceInstantiator(injectors)
598
+ this.tokenProcessor = new TokenProcessor(logger)
599
+ this.requestContextManager = new RequestContextManager(logger)
600
+ this.serviceInvalidator = new ServiceInvalidator(
601
+ this.manager,
602
+ this.requestContextManager,
603
+ this.eventBus,
604
+ logger,
605
+ )
606
+ this.instanceResolver = new InstanceResolver(
607
+ this.registry,
608
+ this.manager,
609
+ this.serviceInstantiator,
610
+ this.tokenProcessor,
611
+ logger,
612
+ this,
613
+ )
2003
614
  }
2004
615
  &nbsp;
2005
616
  // ============================================================================
2006
617
  // PUBLIC METHODS
2007
618
  // ============================================================================
2008
619
  &nbsp;
2009
- <span class="fstat-no" title="function not covered" > getEventBus() {</span>
2010
- <span class="cstat-no" title="statement not covered" > return this.eventBus</span>
2011
- <span class="cstat-no" title="statement not covered" > }</span>
620
+ getEventBus() {
621
+ return this.eventBus
622
+ }
2012
623
  &nbsp;
2013
624
  getManager() {
2014
625
  return this.manager
2015
626
  }
627
+ &nbsp;
628
+ <span class="fstat-no" title="function not covered" > getRequestContexts() {</span>
629
+ <span class="cstat-no" title="statement not covered" > return this.requestContextManager.getRequestContexts()</span>
630
+ <span class="cstat-no" title="statement not covered" > }</span>
631
+ &nbsp;
632
+ getRequestContextManager() {
633
+ return this.requestContextManager
634
+ }
635
+ &nbsp;
636
+ getServiceInvalidator() {
637
+ return this.serviceInvalidator
638
+ }
2016
639
  &nbsp;
2017
640
  public getInstanceIdentifier(token: AnyInjectableType, args?: any): string {
2018
641
  const [err, { actualToken, validatedArgs }] =
2019
- this.validateAndResolveTokenArgs(token, args)
642
+ this.tokenProcessor.validateAndResolveTokenArgs(token, args)
2020
643
  if (err) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2021
644
  <span class="cstat-no" title="statement not covered" > throw err</span>
2022
645
  <span class="cstat-no" title="statement not covered" > }</span>
2023
- return this.generateInstanceName(actualToken, validatedArgs)
646
+ return this.tokenProcessor.generateInstanceName(actualToken, validatedArgs)
2024
647
  }
2025
648
  &nbsp;
2026
649
  public async getInstance(
@@ -2028,30 +651,30 @@ export class ServiceLocator {
2028
651
  args?: any,
2029
652
  onPrepare?: (data: {
2030
653
  instanceName: string
2031
- actualToken: InjectionTokenType
654
+ actualToken: any
2032
655
  validatedArgs?: any
2033
656
  }) =&gt; void,
2034
657
  ) {
2035
- const [err, data] = await this.resolveTokenAndPrepareInstanceName(
658
+ const [err, data] = await this.instanceResolver.resolveInstance(
2036
659
  token,
2037
660
  args,
661
+ this.requestContextManager.getCurrentRequestContext() || undefined,
2038
662
  )
2039
663
  if (err) {
2040
664
  return [err]
2041
665
  }
2042
666
  &nbsp;
2043
- const { instanceName, validatedArgs, actualToken, realToken } = data
2044
- onPrepare?.({ instanceName, actualToken, validatedArgs })
667
+ // Call onPrepare callback if provided
668
+ if (onPrepare) {
669
+ const instanceName = this.getInstanceIdentifier(token, args)
670
+ const [tokenErr, { actualToken, validatedArgs }] =
671
+ this.tokenProcessor.validateAndResolveTokenArgs(token, args)
672
+ if (!tokenErr) {
673
+ onPrepare({ instanceName, actualToken, validatedArgs })
674
+ }
675
+ }
2045
676
  &nbsp;
2046
- const [error, holder] = await this.retrieveOrCreateInstanceByInstanceName(
2047
- instanceName,
2048
- realToken,
2049
- validatedArgs,
2050
- )
2051
- if (error) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2052
- <span class="cstat-no" title="statement not covered" > return [error]</span>
2053
- <span class="cstat-no" title="statement not covered" > }</span>
2054
- return [undefined, holder.instance]
677
+ return [undefined, data]
2055
678
  }
2056
679
  &nbsp;
2057
680
  public async getOrThrowInstance&lt;Instance&gt;(
@@ -2076,126 +699,27 @@ export class ServiceLocator {
2076
699
  ? z.input&lt;Schema&gt; | undefined
2077
700
  : undefined,
2078
701
  ): Instance | null {
2079
- const [err, { actualToken, validatedArgs }] =
2080
- this.validateAndResolveTokenArgs(token, args)
2081
- if (err) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2082
- <span class="cstat-no" title="statement not covered" > return null</span>
2083
- <span class="cstat-no" title="statement not covered" > }</span>
2084
- const instanceName = this.generateInstanceName(actualToken, validatedArgs)
2085
- &nbsp;
2086
- // Try request context first
2087
- if (this.currentRequestContext) {
2088
- const requestHolder = this.currentRequestContext.getHolder(instanceName)
2089
- if (requestHolder) {
2090
- return requestHolder.instance as Instance
2091
- }
2092
- }
2093
- &nbsp;
2094
- // Try singleton manager
2095
- const [error, holder] = this.manager.get(instanceName)
2096
- if (error) {
2097
- return null
2098
- }
2099
- return holder.instance as Instance
2100
- }
2101
- &nbsp;
2102
- invalidate(service: string, round = 1): Promise&lt;any&gt; {
2103
- this.logger?.log(
2104
- `[ServiceLocator] Starting invalidation process for ${service}`,
2105
- )
2106
- const toInvalidate = this.manager.filter(
2107
- (holder) =&gt; holder.name === service || holder.deps.has(service),
2108
- )
2109
- const promises = []
2110
- for (const [key, holder] of toInvalidate.entries()) {
2111
- promises.push(this.invalidateHolder(key, holder, round))
2112
- }
2113
- return Promise.all(promises)
2114
- }
2115
- &nbsp;
2116
- /**
2117
- * Invalidates a single holder based on its current status.
2118
- */
2119
- private async invalidateHolder(
2120
- key: string,
2121
- holder: ServiceLocatorInstanceHolder&lt;any&gt;,
2122
- round: number,
2123
- ): Promise&lt;void&gt; {
2124
- switch (holder.status) {
2125
- <span class="branch-0 cbranch-no" title="branch not covered" > case ServiceLocatorInstanceHolderStatus.Destroying:</span>
2126
- <span class="cstat-no" title="statement not covered" > this.logger?.trace(`[ServiceLocator] ${key} is already being destroyed`)</span>
2127
- <span class="cstat-no" title="statement not covered" > await holder.destroyPromise</span>
2128
- <span class="cstat-no" title="statement not covered" > break</span>
2129
- &nbsp;
2130
- <span class="branch-0 cbranch-no" title="branch not covered" > case ServiceLocatorInstanceHolderStatus.Creating:</span>
2131
- <span class="cstat-no" title="statement not covered" > this.logger?.trace(</span>
2132
- <span class="cstat-no" title="statement not covered" > `[ServiceLocator] ${key} is being created, waiting...`,</span>
2133
- <span class="cstat-no" title="statement not covered" > )</span>
2134
- <span class="cstat-no" title="statement not covered" > await holder.creationPromise</span>
2135
- <span class="cstat-no" title="statement not covered" > if (round &gt; 3) {</span>
2136
- <span class="cstat-no" title="statement not covered" > this.logger?.error(</span>
2137
- <span class="cstat-no" title="statement not covered" > `[ServiceLocator] ${key} creation triggered too many invalidation rounds`,</span>
2138
- <span class="cstat-no" title="statement not covered" > )</span>
2139
- <span class="cstat-no" title="statement not covered" > return</span>
2140
- <span class="cstat-no" title="statement not covered" > }</span>
2141
- <span class="cstat-no" title="statement not covered" > await this.invalidate(key, round + 1)</span>
2142
- <span class="cstat-no" title="statement not covered" > break</span>
2143
- &nbsp;
2144
- default:
2145
- await this.destroyHolder(key, holder)
2146
- break
2147
- }
2148
- }
2149
- &nbsp;
2150
- /**
2151
- * Destroys a holder and cleans up its resources.
2152
- */
2153
- private async destroyHolder(
2154
- key: string,
2155
- holder: ServiceLocatorInstanceHolder&lt;any&gt;,
2156
- ): Promise&lt;void&gt; {
2157
- holder.status = ServiceLocatorInstanceHolderStatus.Destroying
2158
- this.logger?.log(
2159
- `[ServiceLocator] Invalidating ${key} and notifying listeners`,
702
+ return this.instanceResolver.getSyncInstance(
703
+ token,
704
+ args as any,
705
+ this.requestContextManager.getCurrentRequestContext(),
2160
706
  )
2161
- &nbsp;
2162
- holder.destroyPromise = Promise.all(
2163
- holder.destroyListeners.map((listener) =&gt; listener()),
2164
- ).then(async () =&gt; {
2165
- this.manager.delete(key)
2166
- await this.emitInstanceEvent(key, 'destroy')
2167
- })
2168
- &nbsp;
2169
- await holder.destroyPromise
2170
707
  }
2171
708
  &nbsp;
2172
- async ready() {
2173
- const holders = Array.from(this.manager.filter(() =&gt; true)).map(
2174
- ([, holder]) =&gt; holder,
2175
- )
2176
- await Promise.all(
2177
- holders.map((holder) =&gt; this.waitForHolderToSettle(holder)),
2178
- )
709
+ invalidate(service: string, round = 1): Promise&lt;any&gt; {
710
+ return this.serviceInvalidator.invalidate(service, round)
2179
711
  }
2180
712
  &nbsp;
2181
713
  /**
2182
- * Waits for a holder to settle (either created, destroyed, or error state).
714
+ * Gracefully clears all services in the ServiceLocator using invalidation logic.
715
+ * This method respects service dependencies and ensures proper cleanup order.
716
+ * Services that depend on others will be invalidated first, then their dependencies.
717
+ *
718
+ * @param options Optional configuration for the clearing process
719
+ * @returns Promise that resolves when all services have been cleared
2183
720
  */
2184
- private async waitForHolderToSettle(
2185
- holder: ServiceLocatorInstanceHolder&lt;any&gt;,
2186
- ): Promise&lt;void&gt; {
2187
- switch (holder.status) {
2188
- <span class="branch-0 cbranch-no" title="branch not covered" > case ServiceLocatorInstanceHolderStatus.Creating:</span>
2189
- <span class="cstat-no" title="statement not covered" > await holder.creationPromise</span>
2190
- <span class="cstat-no" title="statement not covered" > break</span>
2191
- <span class="branch-0 cbranch-no" title="branch not covered" > case ServiceLocatorInstanceHolderStatus.Destroying:</span>
2192
- <span class="cstat-no" title="statement not covered" > await holder.destroyPromise</span>
2193
- <span class="cstat-no" title="statement not covered" > break</span>
2194
- // Already settled states
2195
- case ServiceLocatorInstanceHolderStatus.Created:
2196
- case ServiceLocatorInstanceHolderStatus.Error:
2197
- break
2198
- }
721
+ async clearAll(options: ClearAllOptions = {}): Promise&lt;void&gt; {
722
+ return this.serviceInvalidator.clearAll(options)
2199
723
  }
2200
724
  &nbsp;
2201
725
  // ============================================================================
@@ -2214,22 +738,11 @@ export class ServiceLocator {
2214
738
  metadata?: Record&lt;string, any&gt;,
2215
739
  priority: number = 100,
2216
740
  ): RequestContextHolder {
2217
- if (this.requestContexts.has(requestId)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2218
- <span class="cstat-no" title="statement not covered" > throw new Error(</span>
2219
- <span class="cstat-no" title="statement not covered" > `[ServiceLocator] Request context ${requestId} already exists`,</span>
2220
- <span class="cstat-no" title="statement not covered" > )</span>
2221
- <span class="cstat-no" title="statement not covered" > }</span>
2222
- &nbsp;
2223
- const contextHolder = new DefaultRequestContextHolder(
741
+ return this.requestContextManager.beginRequest(
2224
742
  requestId,
2225
- priority,
2226
743
  metadata,
744
+ priority,
2227
745
  )
2228
- this.requestContexts.set(requestId, contextHolder)
2229
- this.currentRequestContext = contextHolder
2230
- &nbsp;
2231
- this.<span class="branch-0 cbranch-no" title="branch not covered" >logger?.log(`</span>[ServiceLocator] Started request context: ${requestId}`)
2232
- return contextHolder
2233
746
  }
2234
747
  &nbsp;
2235
748
  /**
@@ -2237,39 +750,7 @@ export class ServiceLocator {
2237
750
  * @param requestId The request ID to end
2238
751
  */
2239
752
  async endRequest(requestId: string): Promise&lt;void&gt; {
2240
- const contextHolder = this.requestContexts.get(requestId)
2241
- if (!contextHolder) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2242
- <span class="cstat-no" title="statement not covered" > this.logger?.warn(</span>
2243
- <span class="cstat-no" title="statement not covered" > `[ServiceLocator] Request context ${requestId} not found`,</span>
2244
- <span class="cstat-no" title="statement not covered" > )</span>
2245
- <span class="cstat-no" title="statement not covered" > return</span>
2246
- <span class="cstat-no" title="statement not covered" > }</span>
2247
- &nbsp;
2248
- this.<span class="branch-0 cbranch-no" title="branch not covered" >logger?.log(`</span>[ServiceLocator] Ending request context: ${requestId}`)
2249
- &nbsp;
2250
- // Clean up all request-scoped instances
2251
- const cleanupPromises: Promise&lt;any&gt;[] = []
2252
- for (const [, holder] of contextHolder.holders) {
2253
- if (holder.destroyListeners.length &gt; 0) {
2254
- cleanupPromises.push(
2255
- Promise.all(holder.destroyListeners.map((listener) =&gt; listener())),
2256
- )
2257
- }
2258
- }
2259
- &nbsp;
2260
- await Promise.all(cleanupPromises)
2261
- &nbsp;
2262
- // Clear the context
2263
- contextHolder.clear()
2264
- this.requestContexts.delete(requestId)
2265
- &nbsp;
2266
- // Reset current context if it was the one being ended
2267
- if (this.currentRequestContext === contextHolder) {
2268
- this.currentRequestContext =
2269
- Array.from(this.requestContexts.values()).at(-1) ?? null
2270
- }
2271
- &nbsp;
2272
- this.<span class="branch-0 cbranch-no" title="branch not covered" >logger?.log(`</span>[ServiceLocator] Request context ${requestId} ended`)
753
+ return this.requestContextManager.endRequest(requestId)
2273
754
  }
2274
755
  &nbsp;
2275
756
  /**
@@ -2277,7 +758,7 @@ export class ServiceLocator {
2277
758
  * @returns The current request context holder or null
2278
759
  */
2279
760
  getCurrentRequestContext(): RequestContextHolder | null {
2280
- return this.currentRequestContext
761
+ return this.requestContextManager.getCurrentRequestContext()
2281
762
  }
2282
763
  &nbsp;
2283
764
  /**
@@ -2285,609 +766,40 @@ export class ServiceLocator {
2285
766
  * @param requestId The request ID to set as current
2286
767
  */
2287
768
  setCurrentRequestContext(requestId: string): void {
2288
- const contextHolder = this.requestContexts.get(requestId)
2289
- if (!contextHolder) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2290
- <span class="cstat-no" title="statement not covered" > throw new Error(`[ServiceLocator] Request context ${requestId} not found`)</span>
2291
- <span class="cstat-no" title="statement not covered" > }</span>
2292
- this.currentRequestContext = contextHolder
2293
- }
2294
- &nbsp;
2295
- // ============================================================================
2296
- // PRIVATE METHODS
2297
- // ============================================================================
2298
- &nbsp;
2299
- /**
2300
- * Validates and resolves token arguments, handling factory token resolution and validation.
2301
- */
2302
- private validateAndResolveTokenArgs(
2303
- token: AnyInjectableType,
2304
- args?: any,
2305
- ): [
2306
- FactoryTokenNotResolved | UnknownError | undefined,
2307
- { actualToken: InjectionTokenType; validatedArgs?: any },
2308
- ] {
2309
- let actualToken = token as InjectionToken&lt;any, any&gt;
2310
- if (typeof token === 'function') {
2311
- actualToken = getInjectableToken(token)
2312
- }
2313
- let realArgs = args
2314
- if (actualToken instanceof BoundInjectionToken) {
2315
- realArgs = actualToken.value
2316
- } else if (actualToken instanceof FactoryInjectionToken) {
2317
- if (actualToken.resolved) {
2318
- realArgs = actualToken.value
2319
- } else {
2320
- return [new FactoryTokenNotResolved(token.name), { actualToken }]
2321
- }
2322
- }
2323
- if (!actualToken.schema) {
2324
- return [undefined, { actualToken, validatedArgs: realArgs }]
2325
- }
2326
- const validatedArgs = actualToken.schema?.safeParse(realArgs)
2327
- if (validatedArgs &amp;&amp; !validatedArgs.success) {
2328
- this.logger?.error(
2329
- `[ServiceLocator]#validateAndResolveTokenArgs(): Error validating args for ${actualToken.name.toString()}`,
2330
- validatedArgs.error,
2331
- )
2332
- return [new UnknownError(validatedArgs.error), { actualToken }]
2333
- }
2334
- return [undefined, { actualToken, validatedArgs: validatedArgs?.data }]
2335
- }
2336
- &nbsp;
2337
- /**
2338
- * Internal method to resolve token args and create instance name.
2339
- * Handles factory token resolution and validation.
2340
- */
2341
- private async resolveTokenAndPrepareInstanceName(
2342
- token: AnyInjectableType,
2343
- args?: any,
2344
- ): Promise&lt;
2345
- | [
2346
- undefined,
2347
- {
2348
- instanceName: string
2349
- validatedArgs: any
2350
- actualToken: InjectionTokenType
2351
- realToken: InjectionToken&lt;any, any&gt;
2352
- },
2353
- ]
2354
- | [UnknownError | FactoryTokenNotResolved]
2355
- &gt; {
2356
- const [err, { actualToken, validatedArgs }] =
2357
- this.validateAndResolveTokenArgs(token, args)
2358
- if (err instanceof UnknownError) {
2359
- return [err]
2360
- } else if (
2361
- (err as any) instanceof FactoryTokenNotResolved &amp;&amp;
2362
- actualToken instanceof FactoryInjectionToken
2363
- ) {
2364
- this.logger?.log(
2365
- `[ServiceLocator]#resolveTokenAndPrepareInstanceName() Factory token not resolved, resolving it`,
2366
- )
2367
- await actualToken.resolve(this.createFactoryContext())
2368
- return this.resolveTokenAndPrepareInstanceName(token)
2369
- }
2370
- const instanceName = this.generateInstanceName(actualToken, validatedArgs)
2371
- // Determine the real token (the actual InjectionToken that will be used for resolution)
2372
- const realToken =
2373
- actualToken instanceof BoundInjectionToken ||
2374
- actualToken instanceof FactoryInjectionToken
2375
- ? actualToken.token
2376
- : actualToken
2377
- return [undefined, { instanceName, validatedArgs, actualToken, realToken }]
2378
- }
2379
- &nbsp;
2380
- /**
2381
- * Gets an instance by its instance name, handling all the logic after instance name creation.
2382
- */
2383
- private async retrieveOrCreateInstanceByInstanceName(
2384
- instanceName: string,
2385
- realToken: InjectionToken&lt;any, any&gt;,
2386
- realArgs: any,
2387
- ): Promise&lt;
2388
- | [undefined, ServiceLocatorInstanceHolder&lt;any&gt;]
2389
- | [UnknownError | FactoryNotFound]
2390
- &gt; {
2391
- // Try to get existing instance (handles both request-scoped and singleton)
2392
- const existingHolder = await this.tryGetExistingInstance(
2393
- instanceName,
2394
- realToken,
2395
- )
2396
- if (existingHolder) {
2397
- return existingHolder
2398
- }
2399
- &nbsp;
2400
- // No existing instance found, create a new one
2401
- const result = await this.createNewInstance(
2402
- instanceName,
2403
- realToken,
2404
- realArgs,
2405
- )
2406
- if (result[0]) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2407
- <span class="cstat-no" title="statement not covered" > return [result[0]]</span>
2408
- <span class="cstat-no" title="statement not covered" > }</span>
2409
- &nbsp;
2410
- const [, holder] = result
2411
- return this.waitForInstanceReady(holder)
2412
- }
2413
- &nbsp;
2414
- /**
2415
- * Attempts to retrieve an existing instance, handling request-scoped and singleton instances.
2416
- * Returns null if no instance exists and a new one should be created.
2417
- */
2418
- private async tryGetExistingInstance(
2419
- instanceName: string,
2420
- realToken: InjectionToken&lt;any, any&gt;,
2421
- ): Promise&lt;
2422
- [undefined, ServiceLocatorInstanceHolder&lt;any&gt;] | [UnknownError] | null
2423
- &gt; {
2424
- // Check request-scoped instances first
2425
- const requestResult = await this.tryGetRequestScopedInstance(
2426
- instanceName,
2427
- realToken,
2428
- )
2429
- if (requestResult) {
2430
- return requestResult
2431
- }
2432
- &nbsp;
2433
- // Check singleton instances
2434
- return this.tryGetSingletonInstance(instanceName)
2435
- }
2436
- &nbsp;
2437
- /**
2438
- * Attempts to get a request-scoped instance if applicable.
2439
- */
2440
- private async tryGetRequestScopedInstance(
2441
- instanceName: string,
2442
- realToken: InjectionToken&lt;any, any&gt;,
2443
- ): Promise&lt;
2444
- [undefined, ServiceLocatorInstanceHolder&lt;any&gt;] | [UnknownError] | null
2445
- &gt; {
2446
- if (!this.registry.has(realToken)) {
2447
- return null
2448
- }
2449
- &nbsp;
2450
- const record = this.registry.get(realToken)
2451
- if (record.scope !== InjectableScope.Request) {
2452
- return null
2453
- }
2454
- &nbsp;
2455
- if (!this.currentRequestContext) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2456
- <span class="cstat-no" title="statement not covered" > this.logger?.log(</span>
2457
- <span class="cstat-no" title="statement not covered" > `[ServiceLocator] No current request context available for request-scoped service ${instanceName}`,</span>
2458
- <span class="cstat-no" title="statement not covered" > )</span>
2459
- <span class="cstat-no" title="statement not covered" > return [new UnknownError(ErrorsEnum.InstanceNotFound)]</span>
2460
- <span class="cstat-no" title="statement not covered" > }</span>
2461
- &nbsp;
2462
- const requestHolder = this.currentRequestContext.getHolder(instanceName)
2463
- if (!requestHolder) {
2464
- return null
2465
- }
2466
- &nbsp;
2467
- return this.waitForInstanceReady(requestHolder)
2468
- }
2469
- &nbsp;
2470
- /**
2471
- * Attempts to get a singleton instance from the manager.
2472
- */
2473
- private async tryGetSingletonInstance(
2474
- instanceName: string,
2475
- ): Promise&lt;
2476
- [undefined, ServiceLocatorInstanceHolder&lt;any&gt;] | [UnknownError] | null
2477
- &gt; {
2478
- const [error, holder] = this.manager.get(instanceName)
2479
- &nbsp;
2480
- if (!error) {
2481
- return this.waitForInstanceReady(holder)
2482
- }
2483
- &nbsp;
2484
- // Handle recovery scenarios
2485
- switch (error.code) {
2486
- <span class="branch-0 cbranch-no" title="branch not covered" > case ErrorsEnum.InstanceDestroying:</span>
2487
- <span class="cstat-no" title="statement not covered" > this.logger?.log(</span>
2488
- <span class="cstat-no" title="statement not covered" > `[ServiceLocator] Instance ${instanceName} is being destroyed, waiting...`,</span>
2489
- <span class="cstat-no" title="statement not covered" > )</span>
2490
- <span class="cstat-no" title="statement not covered" > await holder?.destroyPromise</span>
2491
- // Retry after destruction is complete
2492
- <span class="cstat-no" title="statement not covered" > return this.tryGetSingletonInstance(instanceName)</span>
2493
- &nbsp;
2494
- <span class="branch-0 cbranch-no" title="branch not covered" > case ErrorsEnum.InstanceExpired:</span>
2495
- <span class="cstat-no" title="statement not covered" > this.logger?.log(</span>
2496
- <span class="cstat-no" title="statement not covered" > `[ServiceLocator] Instance ${instanceName} expired, invalidating...`,</span>
2497
- <span class="cstat-no" title="statement not covered" > )</span>
2498
- <span class="cstat-no" title="statement not covered" > await this.invalidate(instanceName)</span>
2499
- // Retry after invalidation
2500
- <span class="cstat-no" title="statement not covered" > return this.tryGetSingletonInstance(instanceName)</span>
2501
- &nbsp;
2502
- case ErrorsEnum.InstanceNotFound:
2503
- return null // Instance doesn't exist, should create new one
2504
- &nbsp;
2505
- <span class="branch-0 cbranch-no" title="branch not covered" > default:</span>
2506
- <span class="cstat-no" title="statement not covered" > return [error]</span>
2507
- }
2508
- }
2509
- &nbsp;
2510
- /**
2511
- * Waits for an instance holder to be ready and returns the appropriate result.
2512
- */
2513
- private async waitForInstanceReady&lt;T&gt;(
2514
- holder: ServiceLocatorInstanceHolder&lt;T&gt;,
2515
- ): Promise&lt;[undefined, ServiceLocatorInstanceHolder&lt;T&gt;] | [UnknownError]&gt; {
2516
- switch (holder.status) {
2517
- case ServiceLocatorInstanceHolderStatus.Creating:
2518
- await holder.creationPromise
2519
- return this.waitForInstanceReady(holder)
2520
- &nbsp;
2521
- <span class="branch-0 cbranch-no" title="branch not covered" > case ServiceLocatorInstanceHolderStatus.Destroying:</span>
2522
- <span class="cstat-no" title="statement not covered" > return [new UnknownError(ErrorsEnum.InstanceDestroying)]</span>
2523
- &nbsp;
2524
- <span class="branch-0 cbranch-no" title="branch not covered" > case ServiceLocatorInstanceHolderStatus.Error:</span>
2525
- <span class="cstat-no" title="statement not covered" > return [holder.instance as UnknownError]</span>
2526
- &nbsp;
2527
- case ServiceLocatorInstanceHolderStatus.Created:
2528
- return [undefined, holder]
2529
- &nbsp;
2530
- <span class="branch-0 cbranch-no" title="branch not covered" > default:</span>
2531
- <span class="cstat-no" title="statement not covered" > return [new UnknownError(ErrorsEnum.InstanceNotFound)]</span>
2532
- }
2533
- }
2534
- &nbsp;
2535
- /**
2536
- * Emits events to listeners for instance lifecycle events.
2537
- */
2538
- private emitInstanceEvent(
2539
- name: string,
2540
- event: 'create' | 'destroy' = 'create',
2541
- ) {
2542
- this.logger?.log(
2543
- `[ServiceLocator]#emitInstanceEvent() Notifying listeners for ${name} with event ${event}`,
2544
- )
2545
- return this.eventBus.emit(name, event)
2546
- }
2547
- &nbsp;
2548
- /**
2549
- * Creates a new instance for the given token and arguments.
2550
- */
2551
- private async createNewInstance&lt;
2552
- Instance,
2553
- Schema extends InjectionTokenSchemaType | undefined,
2554
- &gt;(
2555
- instanceName: string,
2556
- realToken: InjectionToken&lt;Instance, Schema&gt;,
2557
- args: Schema extends ZodObject
2558
- ? z.output&lt;Schema&gt;
2559
- : Schema extends ZodOptional&lt;ZodObject&gt;
2560
- ? z.output&lt;Schema&gt; | undefined
2561
- : undefined,
2562
- ): Promise&lt;
2563
- | [undefined, ServiceLocatorInstanceHolder&lt;Instance&gt;]
2564
- | [FactoryNotFound | UnknownError]
2565
- &gt; {
2566
- this.logger?.log(
2567
- `[ServiceLocator]#createNewInstance() Creating instance for ${instanceName}`,
2568
- )
2569
- if (this.registry.has(realToken)) {
2570
- return this.instantiateServiceFromRegistry&lt;Instance, Schema, any&gt;(
2571
- instanceName,
2572
- realToken,
2573
- args,
2574
- )
2575
- <span class="branch-0 cbranch-no" title="branch not covered" > } else {</span>
2576
- <span class="cstat-no" title="statement not covered" > return [new FactoryNotFound(realToken.name.toString())]</span>
2577
- <span class="cstat-no" title="statement not covered" > }</span>
2578
- }
2579
- &nbsp;
2580
- /**
2581
- * Instantiates a service from the registry using the service instantiator.
2582
- */
2583
- private instantiateServiceFromRegistry&lt;
2584
- Instance,
2585
- Schema extends InjectionTokenSchemaType | undefined,
2586
- Args extends Schema extends BaseInjectionTokenSchemaType
2587
- ? z.output&lt;Schema&gt;
2588
- : Schema extends OptionalInjectionTokenSchemaType
2589
- ? z.output&lt;Schema&gt; | undefined
2590
- : undefined,
2591
- &gt;(
2592
- instanceName: string,
2593
- token: InjectionToken&lt;Instance, Schema&gt;,
2594
- args: Args,
2595
- ): Promise&lt;[undefined, ServiceLocatorInstanceHolder&lt;Instance&gt;]&gt; {
2596
- this.logger?.log(
2597
- `[ServiceLocator]#instantiateServiceFromRegistry(): Creating instance for ${instanceName} from abstract factory`,
2598
- )
2599
- const ctx = this.createFactoryContext(
2600
- this.currentRequestContext || undefined,
2601
- )
2602
- let record = this.registry.get&lt;Instance, Schema&gt;(token)
2603
- let { scope, type } = record
2604
- &nbsp;
2605
- // Use createCreatingHolder from manager
2606
- const [deferred, holder] = this.manager.createCreatingHolder&lt;Instance&gt;(
2607
- instanceName,
2608
- type,
2609
- scope,
2610
- ctx.deps,
2611
- Infinity,
2612
- )
2613
- &nbsp;
2614
- // Start the instantiation process
2615
- this.serviceInstantiator
2616
- .instantiateService(ctx, record, args)
2617
- .then(async ([error, instance]) =&gt; {
2618
- await this.handleInstantiationResult(
2619
- instanceName,
2620
- holder,
2621
- ctx,
2622
- deferred,
2623
- scope,
2624
- error,
2625
- instance,
2626
- )
2627
- })
2628
- .catch(async (error) =&gt; {
2629
- <span class="cstat-no" title="statement not covered" > await this.handleInstantiationError(</span>
2630
- <span class="cstat-no" title="statement not covered" > instanceName,</span>
2631
- <span class="cstat-no" title="statement not covered" > holder,</span>
2632
- <span class="cstat-no" title="statement not covered" > deferred,</span>
2633
- <span class="cstat-no" title="statement not covered" > scope,</span>
2634
- <span class="cstat-no" title="statement not covered" > error,</span>
2635
- <span class="cstat-no" title="statement not covered" > )</span>
2636
- })
2637
- &nbsp;
2638
- this.storeInstanceByScope(scope, instanceName, holder)
2639
- // @ts-expect-error TS2322 This is correct type
2640
- return [undefined, holder]
2641
- }
2642
- &nbsp;
2643
- /**
2644
- * Handles the result of service instantiation.
2645
- */
2646
- private async handleInstantiationResult(
2647
- instanceName: string,
2648
- holder: ServiceLocatorInstanceHolder&lt;any&gt;,
2649
- ctx: any,
2650
- deferred: any,
2651
- scope: InjectableScope,
2652
- error: any,
2653
- instance: any,
2654
- ): Promise&lt;void&gt; {
2655
- holder.destroyListeners = ctx.getDestroyListeners()
2656
- holder.creationPromise = null
2657
- &nbsp;
2658
- if (error) {
2659
- await this.handleInstantiationError(
2660
- instanceName,
2661
- holder,
2662
- deferred,
2663
- scope,
2664
- error,
2665
- )
2666
- } else {
2667
- await this.handleInstantiationSuccess(
2668
- instanceName,
2669
- holder,
2670
- ctx,
2671
- deferred,
2672
- instance,
2673
- )
2674
- }
2675
- }
2676
- &nbsp;
2677
- /**
2678
- * Handles successful service instantiation.
2679
- */
2680
- private async handleInstantiationSuccess(
2681
- instanceName: string,
2682
- holder: ServiceLocatorInstanceHolder&lt;any&gt;,
2683
- ctx: any,
2684
- deferred: any,
2685
- instance: any,
2686
- ): Promise&lt;void&gt; {
2687
- holder.instance = instance
2688
- holder.status = ServiceLocatorInstanceHolderStatus.Created
2689
- &nbsp;
2690
- // Set up dependency invalidation listeners
2691
- if (ctx.deps.size &gt; 0) {
2692
- ctx.deps.forEach((dependency: string) =&gt; {
2693
- holder.destroyListeners.push(
2694
- this.eventBus.on(dependency, 'destroy', () =&gt;
2695
- this.invalidate(instanceName),
2696
- ),
2697
- )
2698
- })
2699
- }
2700
- &nbsp;
2701
- await this.emitInstanceEvent(instanceName)
2702
- deferred.resolve([undefined, instance])
2703
- }
2704
- &nbsp;
2705
- /**
2706
- * Handles service instantiation errors.
2707
- */
2708
- private async handleInstantiationError(
2709
- instanceName: string,
2710
- holder: ServiceLocatorInstanceHolder&lt;any&gt;,
2711
- deferred: any,
2712
- scope: InjectableScope,
2713
- error: any,
2714
- ): Promise&lt;void&gt; {
2715
- this.logger?.error(
2716
- `[ServiceLocator] Error creating instance for ${instanceName}`,
2717
- error,
2718
- )
2719
- &nbsp;
2720
- holder.status = ServiceLocatorInstanceHolderStatus.Error
2721
- holder.instance = error
2722
- holder.creationPromise = null
2723
- &nbsp;
2724
- if (scope === InjectableScope.Singleton) {
2725
- setTimeout(() =&gt; this.invalidate(instanceName), 10)
2726
- }
2727
- &nbsp;
2728
- deferred.reject(error)
2729
- }
2730
- &nbsp;
2731
- /**
2732
- * Stores an instance holder based on its scope.
2733
- */
2734
- private storeInstanceByScope(
2735
- scope: InjectableScope,
2736
- instanceName: string,
2737
- holder: ServiceLocatorInstanceHolder&lt;any&gt;,
2738
- ): void {
2739
- switch (scope) {
2740
- case InjectableScope.Singleton:
2741
- this.logger?.debug(
2742
- `[ServiceLocator] Setting singleton instance for ${instanceName}`,
2743
- )
2744
- this.manager.set(instanceName, holder)
2745
- break
2746
- &nbsp;
2747
- case InjectableScope.Request:
2748
- if (this.currentRequestContext) {
2749
- this.<span class="branch-0 cbranch-no" title="branch not covered" >logger?.debug(</span>
2750
- `[ServiceLocator] Setting request-scoped instance for ${instanceName}`,
2751
- )
2752
- this.currentRequestContext.addInstance(
2753
- instanceName,
2754
- holder.instance,
2755
- holder,
2756
- )
2757
- }
2758
- break
2759
- &nbsp;
2760
- case InjectableScope.Transient:
2761
- // Transient instances are not stored anywhere
2762
- break
2763
- }
2764
- }
2765
- &nbsp;
2766
- /**
2767
- * Tries to get a pre-prepared instance from request contexts.
2768
- */
2769
- private tryGetPrePreparedInstance(
2770
- instanceName: string,
2771
- contextHolder: RequestContextHolder | undefined,
2772
- deps: Set&lt;string&gt;,
2773
- ): any {
2774
- // Check provided context holder first (if has higher priority)
2775
- if (contextHolder &amp;&amp; contextHolder.priority &gt; 0) {
2776
- const prePreparedInstance = contextHolder.getInstance(instanceName)
2777
- if (prePreparedInstance !== undefined) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2778
- <span class="cstat-no" title="statement not covered" > this.logger?.debug(</span>
2779
- <span class="cstat-no" title="statement not covered" > `[ServiceLocator] Using pre-prepared instance ${instanceName} from request context ${contextHolder.requestId}`,</span>
2780
- <span class="cstat-no" title="statement not covered" > )</span>
2781
- <span class="cstat-no" title="statement not covered" > deps.add(instanceName)</span>
2782
- <span class="cstat-no" title="statement not covered" > return prePreparedInstance</span>
2783
- <span class="cstat-no" title="statement not covered" > }</span>
2784
- }
2785
- &nbsp;
2786
- // Check current request context (if different from provided contextHolder)
2787
- if (
2788
- this.currentRequestContext &amp;&amp;
2789
- this.currentRequestContext !== contextHolder
2790
- ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2791
- <span class="cstat-no" title="statement not covered" > const prePreparedInstance =</span>
2792
- <span class="cstat-no" title="statement not covered" > this.currentRequestContext.getInstance(instanceName)</span>
2793
- <span class="cstat-no" title="statement not covered" > if (prePreparedInstance !== undefined) {</span>
2794
- <span class="cstat-no" title="statement not covered" > this.logger?.debug(</span>
2795
- <span class="cstat-no" title="statement not covered" > `[ServiceLocator] Using pre-prepared instance ${instanceName} from current request context ${this.currentRequestContext.requestId}`,</span>
2796
- <span class="cstat-no" title="statement not covered" > )</span>
2797
- <span class="cstat-no" title="statement not covered" > deps.add(instanceName)</span>
2798
- <span class="cstat-no" title="statement not covered" > return prePreparedInstance</span>
2799
- <span class="cstat-no" title="statement not covered" > }</span>
2800
- <span class="cstat-no" title="statement not covered" > }</span>
2801
- &nbsp;
2802
- return undefined
769
+ return this.requestContextManager.setCurrentRequestContext(requestId)
2803
770
  }
2804
771
  &nbsp;
2805
772
  /**
2806
- * Creates a factory context for dependency injection during service instantiation.
2807
- * @param contextHolder Optional request context holder for priority-based resolution
773
+ * Waits for all services to settle (either created, destroyed, or error state).
2808
774
  */
2809
- private createFactoryContext(
2810
- contextHolder?: RequestContextHolder,
2811
- ): FactoryContext &amp; {
2812
- getDestroyListeners: () =&gt; (() =&gt; void)[]
2813
- deps: Set&lt;string&gt;
2814
- } {
2815
- const destroyListeners = new Set&lt;() =&gt; void&gt;()
2816
- const deps = new Set&lt;string&gt;()
2817
- // eslint-disable-next-line @typescript-eslint/no-this-alias
2818
- const self = this
2819
- &nbsp;
2820
- function addDestroyListener(listener: () =&gt; void) {
2821
- destroyListeners.add(listener)
2822
- }
2823
- &nbsp;
2824
- function getDestroyListeners() {
2825
- return Array.from(destroyListeners)
2826
- }
2827
- &nbsp;
2828
- return {
2829
- // @ts-expect-error This is correct type
2830
- async inject(token, args) {
2831
- const instanceName = self.generateInstanceName(token, args)
2832
- &nbsp;
2833
- // Check request contexts for pre-prepared instances
2834
- const prePreparedInstance = self.tryGetPrePreparedInstance(
2835
- instanceName,
2836
- contextHolder,
2837
- deps,
2838
- )
2839
- if (prePreparedInstance !== undefined) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2840
- <span class="cstat-no" title="statement not covered" > return prePreparedInstance</span>
2841
- <span class="cstat-no" title="statement not covered" > }</span>
2842
- &nbsp;
2843
- // Fall back to normal resolution
2844
- const [error, instance] = await self.getInstance(
2845
- token,
2846
- args,
2847
- ({ instanceName }) =&gt; {
2848
- deps.add(instanceName)
2849
- },
2850
- )
2851
- if (error) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2852
- <span class="cstat-no" title="statement not covered" > throw error</span>
2853
- <span class="cstat-no" title="statement not covered" > }</span>
2854
- return instance
2855
- },
2856
- addDestroyListener,
2857
- getDestroyListeners,
2858
- locator: self,
2859
- deps,
2860
- }
775
+ async ready(): Promise&lt;void&gt; {
776
+ return this.serviceInvalidator.ready()
2861
777
  }
2862
778
  &nbsp;
2863
779
  /**
2864
- * Generates a unique instance name based on token and arguments.
780
+ * Helper method for TokenProcessor to access pre-prepared instances.
781
+ * This is needed for the factory context creation.
2865
782
  */
2866
- private generateInstanceName(token: InjectionTokenType, args: any) {
2867
- if (!args) {
2868
- return token.toString()
2869
- }
2870
- &nbsp;
2871
- const formattedArgs = Object.entries(args)
2872
- .sort(([keyA], [keyB]) =&gt; keyA.localeCompare(keyB))
2873
- .map(([key, value]) =&gt; `${key}=${this.formatArgValue(value)}`)
2874
- .join(',')
2875
- &nbsp;
2876
- return `${token.toString()}:${formattedArgs.replaceAll(/"/g, '').replaceAll(/:/g, '=')}`
2877
- }
783
+ <span class="fstat-no" title="function not covered" > tryGetPrePreparedInstance(</span>
784
+ <span class="cstat-no" title="statement not covered" > instanceName: string,</span>
785
+ <span class="cstat-no" title="statement not covered" > contextHolder: RequestContextHolder | undefined,</span>
786
+ <span class="cstat-no" title="statement not covered" > deps: Set&lt;string&gt;,</span>
787
+ <span class="cstat-no" title="statement not covered" > ): any {</span>
788
+ <span class="cstat-no" title="statement not covered" > return this.tokenProcessor.tryGetPrePreparedInstance(</span>
789
+ <span class="cstat-no" title="statement not covered" > instanceName,</span>
790
+ <span class="cstat-no" title="statement not covered" > contextHolder,</span>
791
+ <span class="cstat-no" title="statement not covered" > deps,</span>
792
+ <span class="cstat-no" title="statement not covered" > this.requestContextManager.getCurrentRequestContext(),</span>
793
+ <span class="cstat-no" title="statement not covered" > )</span>
794
+ <span class="cstat-no" title="statement not covered" > }</span>
2878
795
  &nbsp;
2879
796
  /**
2880
- * Formats a single argument value for instance name generation.
797
+ * Helper method for InstanceResolver to generate instance names.
798
+ * This is needed for the factory context creation.
2881
799
  */
2882
- private formatArgValue(value: any): string {
2883
- if (typeof value === 'function') {
2884
- return `fn_${value.name}(${value.length})`
2885
- }
2886
- if (typeof value === 'symbol') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2887
- <span class="cstat-no" title="statement not covered" > return value.toString()</span>
2888
- <span class="cstat-no" title="statement not covered" > }</span>
2889
- return JSON.stringify(value).slice(0, 40)
2890
- }
800
+ <span class="fstat-no" title="function not covered" > generateInstanceName(token: any, args: any): string {</span>
801
+ <span class="cstat-no" title="statement not covered" > return this.tokenProcessor.generateInstanceName(token, args)</span>
802
+ <span class="cstat-no" title="statement not covered" > }</span>
2891
803
  }
2892
804
  &nbsp;</pre></td></tr></table></pre>
2893
805
 
@@ -2896,7 +808,7 @@ export class ServiceLocator {
2896
808
  <div class='footer quiet pad2 space-top1 center small'>
2897
809
  Code coverage generated by
2898
810
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2899
- at 2025-09-19T12:38:51.382Z
811
+ at 2025-09-21T17:47:07.632Z
2900
812
  </div>
2901
813
  <script src="../prettify.js"></script>
2902
814
  <script>