reviewflow 3.30.0 → 3.31.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 (99) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/dashboard/index.html +35 -11
  3. package/dist/dashboard/styles.css +139 -5
  4. package/dist/frameworks/claude/claudeInvoker.d.ts +7 -0
  5. package/dist/frameworks/claude/claudeInvoker.d.ts.map +1 -1
  6. package/dist/frameworks/claude/claudeInvoker.js +1 -1
  7. package/dist/frameworks/claude/claudeInvoker.js.map +1 -1
  8. package/dist/main/routes.d.ts.map +1 -1
  9. package/dist/main/routes.js +6 -16
  10. package/dist/main/routes.js.map +1 -1
  11. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.gateway.d.ts +1 -1
  12. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.gateway.d.ts.map +1 -1
  13. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.guard.d.ts +1 -1
  14. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.d.ts +2 -0
  15. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.d.ts.map +1 -1
  16. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.js +1 -1
  17. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.js.map +1 -1
  18. package/dist/modules/ember-chat/entities/emberAnswer/emberAnswerTransport.gateway.d.ts +24 -0
  19. package/dist/modules/ember-chat/entities/emberAnswer/emberAnswerTransport.gateway.d.ts.map +1 -0
  20. package/dist/modules/ember-chat/entities/emberAnswer/emberAnswerTransport.gateway.js +2 -0
  21. package/dist/modules/ember-chat/entities/emberAnswer/emberAnswerTransport.gateway.js.map +1 -0
  22. package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.d.ts +2 -3
  23. package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.d.ts.map +1 -1
  24. package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.js +6 -4
  25. package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.js.map +1 -1
  26. package/dist/modules/ember-chat/interface-adapters/gateways/emberAnswerTransport.claude.gateway.d.ts +46 -0
  27. package/dist/modules/ember-chat/interface-adapters/gateways/emberAnswerTransport.claude.gateway.d.ts.map +1 -0
  28. package/dist/modules/ember-chat/interface-adapters/gateways/emberAnswerTransport.claude.gateway.js +176 -0
  29. package/dist/modules/ember-chat/interface-adapters/gateways/emberAnswerTransport.claude.gateway.js.map +1 -0
  30. package/dist/modules/ember-chat/interface-adapters/gateways/emberStreamJson.parser.d.ts +2 -1
  31. package/dist/modules/ember-chat/interface-adapters/gateways/emberStreamJson.parser.d.ts.map +1 -1
  32. package/dist/modules/ember-chat/interface-adapters/gateways/emberStreamJson.parser.js +8 -2
  33. package/dist/modules/ember-chat/interface-adapters/gateways/emberStreamJson.parser.js.map +1 -1
  34. package/dist/modules/ember-chat/interface-adapters/presenters/emberStatus.presenter.d.ts +1 -1
  35. package/dist/modules/ember-chat/interface-adapters/presenters/emberStatus.presenter.d.ts.map +1 -1
  36. package/dist/modules/ember-chat/services/emberSystemPrompt.d.ts.map +1 -1
  37. package/dist/modules/ember-chat/services/emberSystemPrompt.js +47 -4
  38. package/dist/modules/ember-chat/services/emberSystemPrompt.js.map +1 -1
  39. package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.d.ts +5 -4
  40. package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.d.ts.map +1 -1
  41. package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.js +61 -9
  42. package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.js.map +1 -1
  43. package/dist/modules/ember-chat/usecases/askEmber/emberStream.d.ts +8 -0
  44. package/dist/modules/ember-chat/usecases/askEmber/emberStream.d.ts.map +1 -0
  45. package/dist/modules/ember-chat/usecases/askEmber/emberStream.js +2 -0
  46. package/dist/modules/ember-chat/usecases/askEmber/emberStream.js.map +1 -0
  47. package/dist/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.d.ts +2 -0
  48. package/dist/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.d.ts.map +1 -0
  49. package/dist/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.js +158 -0
  50. package/dist/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.js.map +1 -0
  51. package/dist/tests/stubs/emberAnswerTransport.stub.d.ts +21 -0
  52. package/dist/tests/stubs/emberAnswerTransport.stub.d.ts.map +1 -0
  53. package/dist/tests/stubs/emberAnswerTransport.stub.js +54 -0
  54. package/dist/tests/stubs/emberAnswerTransport.stub.js.map +1 -0
  55. package/dist/tests/units/modules/ember-chat/controllers/emberChat.routes.test.js +21 -14
  56. package/dist/tests/units/modules/ember-chat/controllers/emberChat.routes.test.js.map +1 -1
  57. package/dist/tests/units/modules/ember-chat/gateways/emberStreamJson.parser.test.js +13 -0
  58. package/dist/tests/units/modules/ember-chat/gateways/emberStreamJson.parser.test.js.map +1 -1
  59. package/dist/tests/units/modules/ember-chat/services/emberSystemPrompt.test.js +19 -0
  60. package/dist/tests/units/modules/ember-chat/services/emberSystemPrompt.test.js.map +1 -1
  61. package/dist/tests/units/modules/ember-chat/usecases/askEmber.usecase.test.js +53 -20
  62. package/dist/tests/units/modules/ember-chat/usecases/askEmber.usecase.test.js.map +1 -1
  63. package/package.json +1 -1
  64. package/dist/modules/ember-chat/entities/emberSession/emberSession.schema.d.ts +0 -7
  65. package/dist/modules/ember-chat/entities/emberSession/emberSession.schema.d.ts.map +0 -1
  66. package/dist/modules/ember-chat/entities/emberSession/emberSession.schema.js +0 -3
  67. package/dist/modules/ember-chat/entities/emberSession/emberSession.schema.js.map +0 -1
  68. package/dist/modules/ember-chat/entities/emberSession/emberSessionState.d.ts +0 -13
  69. package/dist/modules/ember-chat/entities/emberSession/emberSessionState.d.ts.map +0 -1
  70. package/dist/modules/ember-chat/entities/emberSession/emberSessionState.js +0 -35
  71. package/dist/modules/ember-chat/entities/emberSession/emberSessionState.js.map +0 -1
  72. package/dist/modules/ember-chat/entities/emberSession/emberSessionTransport.gateway.d.ts +0 -26
  73. package/dist/modules/ember-chat/entities/emberSession/emberSessionTransport.gateway.d.ts.map +0 -1
  74. package/dist/modules/ember-chat/entities/emberSession/emberSessionTransport.gateway.js +0 -2
  75. package/dist/modules/ember-chat/entities/emberSession/emberSessionTransport.gateway.js.map +0 -1
  76. package/dist/modules/ember-chat/interface-adapters/gateways/emberSessionTransport.claude.gateway.d.ts +0 -13
  77. package/dist/modules/ember-chat/interface-adapters/gateways/emberSessionTransport.claude.gateway.d.ts.map +0 -1
  78. package/dist/modules/ember-chat/interface-adapters/gateways/emberSessionTransport.claude.gateway.js +0 -130
  79. package/dist/modules/ember-chat/interface-adapters/gateways/emberSessionTransport.claude.gateway.js.map +0 -1
  80. package/dist/modules/ember-chat/usecases/emberSession/emberSessionRegistry.d.ts +0 -36
  81. package/dist/modules/ember-chat/usecases/emberSession/emberSessionRegistry.d.ts.map +0 -1
  82. package/dist/modules/ember-chat/usecases/emberSession/emberSessionRegistry.js +0 -59
  83. package/dist/modules/ember-chat/usecases/emberSession/emberSessionRegistry.js.map +0 -1
  84. package/dist/tests/acceptance/189-ember-readonly-review-chat.acceptance.test.d.ts +0 -2
  85. package/dist/tests/acceptance/189-ember-readonly-review-chat.acceptance.test.d.ts.map +0 -1
  86. package/dist/tests/acceptance/189-ember-readonly-review-chat.acceptance.test.js +0 -124
  87. package/dist/tests/acceptance/189-ember-readonly-review-chat.acceptance.test.js.map +0 -1
  88. package/dist/tests/stubs/emberSessionTransport.stub.d.ts +0 -18
  89. package/dist/tests/stubs/emberSessionTransport.stub.d.ts.map +0 -1
  90. package/dist/tests/stubs/emberSessionTransport.stub.js +0 -75
  91. package/dist/tests/stubs/emberSessionTransport.stub.js.map +0 -1
  92. package/dist/tests/units/modules/ember-chat/entities/emberSessionState.test.d.ts +0 -2
  93. package/dist/tests/units/modules/ember-chat/entities/emberSessionState.test.d.ts.map +0 -1
  94. package/dist/tests/units/modules/ember-chat/entities/emberSessionState.test.js +0 -42
  95. package/dist/tests/units/modules/ember-chat/entities/emberSessionState.test.js.map +0 -1
  96. package/dist/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.d.ts +0 -2
  97. package/dist/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.d.ts.map +0 -1
  98. package/dist/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.js +0 -88
  99. package/dist/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.js.map +0 -1
@@ -1,42 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { createIdleEmberSessionState } from '../../../../../modules/ember-chat/entities/emberSession/emberSessionState.js';
3
- const IDLE_TIMEOUT_MS = 60_000;
4
- describe('EmberSessionState', () => {
5
- it('starts idle with no live process', () => {
6
- const state = createIdleEmberSessionState();
7
- expect(state.phase).toBe('idle');
8
- });
9
- it('becomes live when a question is asked', () => {
10
- const state = createIdleEmberSessionState().onQuestion(new Date('2026-05-28T10:00:00Z'));
11
- expect(state.phase).toBe('live');
12
- });
13
- it('stays live after an answer completes', () => {
14
- const state = createIdleEmberSessionState()
15
- .onQuestion(new Date('2026-05-28T10:00:00Z'))
16
- .onAnswerDone(new Date('2026-05-28T10:00:05Z'));
17
- expect(state.phase).toBe('live');
18
- });
19
- it('releases to idle when inactivity exceeds the timeout', () => {
20
- const state = createIdleEmberSessionState()
21
- .onQuestion(new Date('2026-05-28T10:00:00Z'))
22
- .onAnswerDone(new Date('2026-05-28T10:00:05Z'))
23
- .onIdleTick(new Date('2026-05-28T10:02:00Z'), IDLE_TIMEOUT_MS);
24
- expect(state.phase).toBe('idle');
25
- });
26
- it('stays live when inactivity is within the timeout', () => {
27
- const state = createIdleEmberSessionState()
28
- .onQuestion(new Date('2026-05-28T10:00:00Z'))
29
- .onAnswerDone(new Date('2026-05-28T10:00:05Z'))
30
- .onIdleTick(new Date('2026-05-28T10:00:30Z'), IDLE_TIMEOUT_MS);
31
- expect(state.phase).toBe('live');
32
- });
33
- it('reports needing a process when idle and a question arrives', () => {
34
- const idle = createIdleEmberSessionState();
35
- expect(idle.needsProcess()).toBe(true);
36
- });
37
- it('does not need a new process when already live', () => {
38
- const live = createIdleEmberSessionState().onQuestion(new Date('2026-05-28T10:00:00Z'));
39
- expect(live.needsProcess()).toBe(false);
40
- });
41
- });
42
- //# sourceMappingURL=emberSessionState.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"emberSessionState.test.js","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/ember-chat/entities/emberSessionState.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,2BAA2B,EAAE,MAAM,iEAAiE,CAAC;AAE9G,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAG,2BAA2B,EAAE,CAAC;QAE5C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,KAAK,GAAG,2BAA2B,EAAE,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAEzF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,KAAK,GAAG,2BAA2B,EAAE;aACxC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;aAC5C,YAAY,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAElD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,KAAK,GAAG,2BAA2B,EAAE;aACxC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;aAC5C,YAAY,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;aAC9C,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,eAAe,CAAC,CAAC;QAEjE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,KAAK,GAAG,2BAA2B,EAAE;aACxC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;aAC5C,YAAY,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;aAC9C,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,eAAe,CAAC,CAAC;QAEjE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,IAAI,GAAG,2BAA2B,EAAE,CAAC;QAE3C,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,2BAA2B,EAAE,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAExF,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=emberSessionRegistry.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"emberSessionRegistry.test.d.ts","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.ts"],"names":[],"mappings":""}
@@ -1,88 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { StubEmberSessionTransportGateway } from '../../../../../tests/stubs/emberSessionTransport.stub.js';
3
- import { EmberSessionRegistry } from '../../../../../modules/ember-chat/usecases/emberSession/emberSessionRegistry.js';
4
- const SYSTEM_PROMPT = 'you are ember';
5
- const PROJECT_PATH = '/projects/alpha';
6
- function drain(subscribe) {
7
- return new Promise((resolve) => {
8
- let answer = '';
9
- const statuses = [];
10
- subscribe({
11
- onStatus: (state) => statuses.push(state),
12
- onChunk: (text) => {
13
- answer += text;
14
- },
15
- onDone: () => resolve({ answer, statuses }),
16
- onError: () => resolve({ answer, statuses }),
17
- });
18
- });
19
- }
20
- describe('EmberSessionRegistry', () => {
21
- it('reuses one transport handle across consecutive questions', async () => {
22
- const transport = new StubEmberSessionTransportGateway();
23
- let clock = new Date('2026-05-28T10:00:00Z');
24
- const registry = new EmberSessionRegistry({
25
- transport,
26
- now: () => clock,
27
- idleTimeoutMs: 60_000,
28
- });
29
- const first = registry.ask({ question: 'q1', systemPrompt: SYSTEM_PROMPT, projectPath: PROJECT_PATH });
30
- if (first.status === 'streaming') {
31
- await drain(first.subscribe);
32
- }
33
- clock = new Date('2026-05-28T10:00:10Z');
34
- const second = registry.ask({ question: 'q2', systemPrompt: SYSTEM_PROMPT, projectPath: PROJECT_PATH });
35
- if (second.status === 'streaming') {
36
- await drain(second.subscribe);
37
- }
38
- expect(transport.spawnCount).toBe(1);
39
- });
40
- it('emits a working then idle status sequence for one question', async () => {
41
- const transport = new StubEmberSessionTransportGateway();
42
- const registry = new EmberSessionRegistry({
43
- transport,
44
- now: () => new Date('2026-05-28T10:00:00Z'),
45
- idleTimeoutMs: 60_000,
46
- });
47
- const result = registry.ask({ question: 'q', systemPrompt: SYSTEM_PROMPT, projectPath: PROJECT_PATH });
48
- expect(result.status).toBe('streaming');
49
- if (result.status !== 'streaming') {
50
- return;
51
- }
52
- const { statuses } = await drain(result.subscribe);
53
- expect(statuses[0]).toBe('working');
54
- expect(statuses.at(-1)).toBe('idle');
55
- });
56
- it('transparently revives with a fresh spawn after the idle timeout releases the session', async () => {
57
- const transport = new StubEmberSessionTransportGateway();
58
- let clock = new Date('2026-05-28T10:00:00Z');
59
- const registry = new EmberSessionRegistry({
60
- transport,
61
- now: () => clock,
62
- idleTimeoutMs: 60_000,
63
- });
64
- const first = registry.ask({ question: 'q1', systemPrompt: SYSTEM_PROMPT, projectPath: PROJECT_PATH });
65
- if (first.status === 'streaming') {
66
- await drain(first.subscribe);
67
- }
68
- clock = new Date('2026-05-28T10:05:00Z');
69
- registry.onIdle(clock);
70
- const second = registry.ask({ question: 'q2', systemPrompt: SYSTEM_PROMPT, projectPath: PROJECT_PATH });
71
- if (second.status === 'streaming') {
72
- await drain(second.subscribe);
73
- }
74
- expect(transport.spawnCount).toBe(2);
75
- });
76
- it('returns unavailable when the transport fails to spawn', () => {
77
- const transport = new StubEmberSessionTransportGateway();
78
- transport.failSpawn();
79
- const registry = new EmberSessionRegistry({
80
- transport,
81
- now: () => new Date('2026-05-28T10:00:00Z'),
82
- idleTimeoutMs: 60_000,
83
- });
84
- const result = registry.ask({ question: 'q', systemPrompt: SYSTEM_PROMPT, projectPath: PROJECT_PATH });
85
- expect(result.status).toBe('unavailable');
86
- });
87
- });
88
- //# sourceMappingURL=emberSessionRegistry.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"emberSessionRegistry.test.js","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gCAAgC,EAAE,MAAM,6CAA6C,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,oEAAoE,CAAC;AAG1G,MAAM,aAAa,GAAG,eAAe,CAAC;AACtC,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAEvC,SAAS,KAAK,CACZ,SAAsD;IAEtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,SAAS,CAAC;YACR,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YACzC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChB,MAAM,IAAI,IAAI,CAAC;YACjB,CAAC;YACD,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;YAC3C,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,SAAS,GAAG,IAAI,gCAAgC,EAAE,CAAC;QACzD,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC;YACxC,SAAS;YACT,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK;YAChB,aAAa,EAAE,MAAM;SACtB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;QACvG,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACjC,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;QACxG,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,SAAS,GAAG,IAAI,gCAAgC,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC;YACxC,SAAS;YACT,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC;YAC3C,aAAa,EAAE,MAAM;SACtB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;QACvG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QACD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEnD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sFAAsF,EAAE,KAAK,IAAI,EAAE;QACpG,MAAM,SAAS,GAAG,IAAI,gCAAgC,EAAE,CAAC;QACzD,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC;YACxC,SAAS;YACT,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK;YAChB,aAAa,EAAE,MAAM;SACtB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;QACvG,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACjC,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QAED,KAAK,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACzC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEvB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;QACxG,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,SAAS,GAAG,IAAI,gCAAgC,EAAE,CAAC;QACzD,SAAS,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC;YACxC,SAAS;YACT,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC;YAC3C,aAAa,EAAE,MAAM;SACtB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;QAEvG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}