@thanh01.pmt/domain-kit 0.2.1 → 0.4.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.
- package/README.md +42 -11
- package/dist/{chunk-CRN6D4HG.mjs → chunk-HILSUZOF.mjs} +32 -8
- package/dist/chunk-HILSUZOF.mjs.map +1 -0
- package/dist/{chunk-23TQPTHG.mjs → chunk-LZQLLAYP.mjs} +5 -5
- package/dist/{chunk-23TQPTHG.mjs.map → chunk-LZQLLAYP.mjs.map} +1 -1
- package/dist/{chunk-HH4UX65C.mjs → chunk-PKUEOSZ3.mjs} +42 -4
- package/dist/chunk-PKUEOSZ3.mjs.map +1 -0
- package/dist/{chunk-HUDFN4IX.mjs → chunk-QJF4QCBJ.mjs} +99 -4
- package/dist/chunk-QJF4QCBJ.mjs.map +1 -0
- package/dist/{chunk-WHBAGJWN.mjs → chunk-VCPIWJ7R.mjs} +4 -4
- package/dist/chunk-VCPIWJ7R.mjs.map +1 -0
- package/dist/curriculumFeedEmitter-6IK6PFDH.mjs +4 -0
- package/dist/{curriculumFeedEmitter-E5DAJYUZ.mjs.map → curriculumFeedEmitter-6IK6PFDH.mjs.map} +1 -1
- package/dist/{curriculumFeedSchema-TEeQg2bY.d.ts → curriculumFeedSchema-B66H3gEV.d.cts} +148 -8
- package/dist/{curriculumFeedSchema-TEeQg2bY.d.cts → curriculumFeedSchema-B66H3gEV.d.ts} +148 -8
- package/dist/feed/index.cjs +136 -3
- package/dist/feed/index.cjs.map +1 -1
- package/dist/feed/index.d.cts +1 -1
- package/dist/feed/index.d.ts +1 -1
- package/dist/feed/index.mjs +2 -2
- package/dist/graph/index.cjs +30 -5
- package/dist/graph/index.cjs.map +1 -1
- package/dist/graph/index.d.cts +2 -2
- package/dist/graph/index.d.ts +2 -2
- package/dist/graph/index.mjs +1 -1
- package/dist/{hybridGraphPipeline-DVZYLCAQ.d.ts → hybridGraphPipeline-DXQDbBEj.d.ts} +14 -2
- package/dist/{hybridGraphPipeline-DmWRKYXf.d.cts → hybridGraphPipeline-dT-bio-3.d.cts} +14 -2
- package/dist/{hybridGraphSchema-BCgXicgA.d.ts → hybridGraphSchema-nrUeSwpU.d.cts} +15 -15
- package/dist/{hybridGraphSchema-BCgXicgA.d.cts → hybridGraphSchema-nrUeSwpU.d.ts} +15 -15
- package/dist/index.cjs +168 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.mjs +5 -5
- package/dist/pipeline/index.cjs +165 -8
- package/dist/pipeline/index.cjs.map +1 -1
- package/dist/pipeline/index.d.cts +3 -3
- package/dist/pipeline/index.d.ts +3 -3
- package/dist/pipeline/index.mjs +4 -4
- package/dist/schemas/index.cjs +42 -4
- package/dist/schemas/index.cjs.map +1 -1
- package/dist/schemas/index.d.cts +2 -2
- package/dist/schemas/index.d.ts +2 -2
- package/dist/schemas/index.mjs +2 -2
- package/package.json +10 -9
- package/LICENSE +0 -21
- package/dist/chunk-CRN6D4HG.mjs.map +0 -1
- package/dist/chunk-HH4UX65C.mjs.map +0 -1
- package/dist/chunk-HUDFN4IX.mjs.map +0 -1
- package/dist/chunk-WHBAGJWN.mjs.map +0 -1
- package/dist/curriculumFeedEmitter-E5DAJYUZ.mjs +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/schemas/curriculumFeedSchema.ts","../../src/feed/curriculumFeedEmitter.ts","../../src/parsers/swift.ts","../../src/parsers/typescript.ts","../../src/parsers/python.ts","../../src/parsers/cpp.ts","../../src/extractors/keywordExtractor.ts","../../src/utils/llmClient.ts","../../src/graph/scaffoldExtractor.ts","../../src/graph/overviewExtractor.ts","../../src/graph/stepExtractor.ts","../../src/graph/graphVerifier.ts","../../src/graph/conceptEscalator.ts","../../src/concepts/conceptResolver.ts","../../src/assembly/roadmapAssembler.ts","../../src/extractors/fileSelector.ts","../../src/utils/fileUtils.ts","../../src/pipeline/projectGraphPipeline.ts","../../src/graph/loCodeStandard.ts","../../src/parsers/syllabusParser.ts","../../src/graph/knowledgeGraphVerifier.ts","../../src/graph/loExemplars.ts","../../src/graph/depthAudit.ts","../../src/graph/hierarchicalLoAuthoring.ts","../../src/graph/knowledgeTreeCatalog.ts","../../src/graph/conceptStandardizer.ts","../../src/graph/knowledgeGraphPipeline.ts","../../src/pipeline/knowledgeGraphPipeline.ts","../../src/graph/hybridGraphPipeline.ts","../../src/pipeline/hybridGraphPipeline.ts","../../src/detector/inputTypeDetector.ts","../../src/detector/domainDetector.ts","../../src/detector/learningModeDetector.ts","../../src/detector/domainProfileDetector.ts","../../src/pipeline/domainRouter.ts"],"names":["z","pad2","IMPORT_RE","TYPE_RE","FUNC_RE","resolve","buildSourceText","stepMinutes","execSync","extname","join","readdirSync","readFileSync","relative","tokens","mkdirSync","writeFileSync","arr","JSON_ONLY","tmpdir","raw","projectResult","emitCurriculumFeed"],"mappings":";;;;;;;;;;;;;;;;;AA2FO,SAAS,uBAAuB,IAAA,EAA+B;AACpE,EAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,KAAA,CAAM,IAAI,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,MAAA,CAAO,cAAA,CAAe,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAC1D,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,CAAO,cAAA,CAAe,MAAA,EAAQ;AAC7C,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC/D;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,gBAAA,EAAkB;AACvC,IAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,IAAK,CAAC,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACtC,MAAA,MAAM,IAAI,MAAM,uBAAA,GAA0B,CAAA,CAAE,OAAO,MAAA,GAAS,CAAA,CAAE,KAAK,0BAA0B,CAAA;AAAA,IAC/F;AACA,IAAA,IAAI,CAAA,CAAE,SAAS,CAAA,CAAE,EAAA,QAAU,IAAI,KAAA,CAAM,oCAAA,GAAuC,CAAA,CAAE,IAAI,CAAA;AAAA,EACpF;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,mBAAA,EAAqB;AAC1C,IAAA,KAAA,MAAW,EAAA,IAAM,EAAE,QAAA,EAAU;AAC3B,MAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,WAAA,GAAc,CAAA,CAAE,EAAA,GAAK,2BAAA,GAA8B,EAAE,CAAA;AAAA,IACzF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,MAAA,EAAQ;AAC9B,IAAA,KAAA,MAAW,EAAA,IAAM,GAAG,QAAA,EAAU;AAC5B,MAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,QAAA,GAAW,EAAA,CAAG,EAAA,GAAK,2BAAA,GAA8B,EAAE,CAAA;AAAA,IACvF;AAAA,EACF;AACA,EAAA,MAAM,WAAW,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAC9C,EAAA,IAAI,IAAI,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAA,KAAS,SAAS,MAAA,EAAQ,MAAM,IAAI,KAAA,CAAM,8CAA8C,CAAA;AAC9G,EAAA,OAAO,MAAA;AACT;AApHA,IAUa,kBAAA,EAMA,2BAAA,EAOA,cAAA,EAwBA,cAAA,EAOA,oBAOA,eAAA,EASA,oBAAA;AAtEb,IAAA,yBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AAUO,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,MACzC,GAAA,EAAKA,MAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,MACnC,GAAA,EAAKA,MAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,MACnC,YAAA,EAAcA,MAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE;AAAA,KAC7C,CAAA;AAEM,IAAM,2BAAA,GAA8BA,MAAE,MAAA,CAAO;AAAA,MAClD,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,MACf,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,EAAE,CAAA;AAAA,MAC7B,aAAA,EAAeA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA,MACvD,OAAA,EAASA,KAAA,CAAE,IAAA,CAAK,CAAC,cAAA,EAAgB,mBAAmB,mBAAmB,CAAC,CAAA,CAAE,OAAA,CAAQ,cAAc;AAAA,KACjG,CAAA;AAEM,IAAM,cAAA,GAAiBA,MAAE,MAAA,CAAO;AAAA,MACrC,EAAA,EAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,MACpB,MAAMA,KAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,SAAA,EAAW,cAAc,CAAC,CAAA;AAAA,MACjD,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,MACtB,aAAA,EAAeA,MAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,MAC7C,QAAA,EAAU,kBAAA;AAAA,MACV,mBAAmBA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,WAAA,EAAY;AAAA,MAChD,UAAA,EAAYA,KAAA,CAAE,IAAA,CAAK,CAAC,YAAY,YAAA,EAAc,OAAA,EAAS,SAAA,EAAW,UAAA,EAAY,QAAQ,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,MAChH,UAAA,EAAYA,KAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,MACjE,gBAAA,EAAkBA,KAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,YAAY,SAAS,CAAC,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,MAC3E,WAAA,EAAaA,MAAE,MAAA,CAAO;AAAA,QACpB,qBAAqBA,KAAA,CAAE,KAAA,CAAM,2BAA2B,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,QACpE,kBAAA,EAAoBA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,CAAC;AAAA,OAC7D,EAAE,OAAA,CAAQ,EAAE,qBAAqB,EAAC,EAAG,kBAAA,EAAoB,CAAA,EAAG,CAAA;AAAA,MAC7D,UAAA,EAAYA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,MAAA,CAAO,EAAE,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,GAAG,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,OAAA,CAAQ,EAAE,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,MACvG,YAAYA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,MAC9C,aAAaA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,MAI/C,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,EAAE,CAAA;AAAA,MAC/B,gBAAA,EAAkBA,KAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,UAAU,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAI;AAAA,KACtE,CAAA;AAEM,IAAM,cAAA,GAAiBA,MAAE,MAAA,CAAO;AAAA,MACrC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,MACtB,EAAA,EAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,MACpB,MAAMA,KAAA,CAAE,IAAA,CAAK,CAAC,WAAA,EAAa,MAAM,CAAC,CAAA;AAAA,MAClC,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,EAAE;AAAA,KAC9B,CAAA;AAEM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,MACzC,EAAA,EAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,MACpB,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,MACtB,QAAA,EAAUA,MAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,MACnC,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,EAAE;AAAA,KACjC,CAAA;AAEM,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,MACtC,EAAA,EAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,MACpB,OAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,MACjC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,MACtB,kBAAA,EAAoBA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,MACpC,QAAA,EAAUA,MAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ,CAAA,CAAE,IAAI,CAAC;AAAA,KACpC,CAAA;AAGM,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,MAC3C,cAAA,EAAgBA,KAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC3B,MAAA,EAAQA,MAAE,MAAA,CAAO;AAAA,QACf,YAAYA,KAAA,CAAE,IAAA,CAAK,CAAC,eAAA,EAAiB,iBAAA,EAAmB,cAAc,CAAC,CAAA;AAAA,QACvE,QAAA,EAAUA,MAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,QACxC,mBAAA,EAAqBA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,CAAC;AAAA,OAC9D,CAAA;AAAA,MACD,gBAAgBA,KAAA,CAAE,KAAA,CAAM,cAAc,CAAA,CAAE,GAAA,CAAI,GAAG,yDAAyD,CAAA;AAAA,MACxG,kBAAkBA,KAAA,CAAE,KAAA,CAAM,cAAc,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,MACpD,qBAAqBA,KAAA,CAAE,KAAA,CAAM,kBAAkB,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA;AAAA,MAG3D,QAAQA,KAAA,CAAE,KAAA,CAAM,eAAe,CAAA,CAAE,OAAA,CAAQ,EAAE;AAAA,KAC5C,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACnFD,IAAA,6BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,6BAAA,EAAA;AAAA,EAAA,kBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA+BA,SAAS,YAAY,IAAA,EAAmB;AACtC,EAAA,MAAM,MAAA,GAAU,IAAA,CAAK,MAAA,IAAU,EAAC;AAChC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAM,GAAA,CAAI,MAAA,CAAO,iBAAA,EAAmB,GAAA,CAAI,IAAA,CAAK,iBAAA,EAAmB,EAAE,CAAC,CAAC,CAAC,CAAA;AAC/F;AAEA,SAAS,mBAAmB,KAAA,EAAyB;AAEnD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,GAAA,GAAM,EAAE,QAAA,CAAS,GAAA;AACvB,IAAA,CAAA,CAAE,QAAA,CAAS,MAAM,EAAC;AAClB,IAAA,CAAA,CAAE,QAAA,CAAS,eAAe,EAAC;AAC3B,IAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,MAAA,IAAI,IAAA,CAAK,IAAI,CAAC,CAAA,IAAK,QAAA,CAAS,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,WAC1C,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AAC1B,MAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACZ;AAAA,EACF;AACF;AAEA,SAAS,gBAAA,CAAiB,MAAW,SAAA,EAA6B;AAChE,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACtB,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,IAAA,EAAM,cAAA;AAAA,IACN,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,EAAE,CAAA;AAAA,IACvB,aAAA,EAAe,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA;AAAA,IACtC,QAAA,EAAU,EAAE,GAAA,EAAK,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,EAAG,GAAA,EAAK,EAAC,EAAG,YAAA,EAAc,EAAC,EAAE;AAAA,IAChE,iBAAA,EAAmB,YAAY,IAAI,CAAA;AAAA,IACnC,UAAA,EAAY,OAAA;AAAA,IACZ,UAAA,EAAY,IAAA;AAAA,IACZ,gBAAA,EAAkB,UAAA;AAAA,IAClB,WAAA,EAAa,EAAE,mBAAA,EAAqB,IAAI,kBAAA,EAAoB,WAAA,CAAY,IAAI,CAAA,EAAE;AAAA,IAC9E,UAAA,EAAY,IAAI,IAAA,CAAK,KAAK,EAAE,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,IAAI,CAAC,CAAA,EAAG,UAAU,WAAA,EAAY,CAAE,EAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA;AAAA,IACtG,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EAAa,IAAA;AAAA,IACb,QAAA,EAAU,EAAA;AAAA,IACV,gBAAA,EAAkB;AAAA,GACpB;AACF;AAEA,SAAS,uBAAuB,OAAA,EAAsC;AACpE,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,UAAU,CAAA;AACvC,EAAA,IAAI,aAAa,KAAA,IAAS,QAAA,KAAa,KAAA,IAAS,QAAA,KAAa,OAAO,OAAO,QAAA;AAE3E,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,aAAa,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,aAAa,CAAA;AACrC,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,KAAM;AACnC,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,CAAE,WAAW,CAAA;AAC3B,IAAA,OAAO,MAAM,OAAA,IAAW,CAAA,KAAM,SAAA,IAAa,CAAA,KAAM,cAAc,CAAA,KAAM,QAAA;AAAA,EACvE,CAAC,CAAA;AAED,EAAA,IAAI,GAAA,CAAI,MAAA,IAAU,CAAA,IAAK,YAAA,EAAc,OAAO,KAAA;AAC5C,EAAA,IAAI,IAAI,OAAA,CAAQ,GAAG,KAAK,OAAA,CAAQ,MAAA,IAAU,GAAG,OAAO,KAAA;AACpD,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,oBAAoB,OAAA,EAAwB;AACnD,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA;AACzB,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,aAAa,CAAA,CAClC,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,YAAY,CAAC,CAAA,CAC3C,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAK,UAAU,CAAA,CAC7B,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,UAAA,CAAW,CAAC,CAAA,GAAI,UAAA,CAAW,CAAC,CAAC,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,IAAK,YAAA;AAExC,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,UAAU,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,GAAS,CAAA,GAChC,OAAA,CAAQ,IAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,GAAA,CAAI,CAAA,CAAE,MAAM,aAAa,CAAA,EAAG,QAAA,EAAU,GAAA,CAAI,CAAA,CAAE,QAAA,EAAU,IAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,EAAE,CAAE,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,GAC7H,CAAC,EAAE,IAAA,EAAM,aAAA,EAAe,QAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,QAAA,GAAW,wBAAwB,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAA,GAAK,GAAA,CAAI,QAAQ,IAAI,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA;AAEvI,EAAA,MAAM,mBAAmB,GAAA,CAAI,OAAA,CAAQ,aAAa,CAAA,CAAE,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,IAC/D,IAAA,EAAM,GAAA,CAAI,EAAA,CAAG,IAAA,EAAM,cAAc,CAAA;AAAA,IACjC,MAAA,EAAQ,GAAA,CAAI,EAAA,CAAG,WAAA,EAAa,0BAA0B,CAAA;AAAA,IACtD,aAAA,EAAe,GAAA,CAAI,EAAA,CAAG,iBAAA,EAAmB,EAAE,CAAA;AAAA,IAC3C,OAAA,EAAS;AAAA,GACX,CAAE,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,IAAA,EAAM,SAAA;AAAA,IACN,IAAA,EAAM,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAAA,IAC1B,aAAA,EAAe,CAAC,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,IAAK,EAAE,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAAA,IACvD,QAAA,EAAU,EAAE,GAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG,GAAA,EAAK,EAAC,EAAG,YAAA,EAAc,EAAC,EAAE;AAAA,IACnE,iBAAA,EAAmB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAC,CAAC,CAAA;AAAA,IAC7E,UAAA,EAAY,QAAA;AAAA,IACZ,UAAA,EAAY,uBAAuB,OAAO,CAAA;AAAA,IAC1C,gBAAA,EAAkB,UAAA;AAAA,IAClB,WAAA,EAAa;AAAA,MACX,mBAAA,EAAqB,gBAAA;AAAA,MACrB,kBAAA,EAAoB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAC,CAAC;AAAA,KAChF;AAAA,IACA,UAAA;AAAA,IACA,UAAA,EAAY,IAAA;AAAA,IACZ,WAAA,EAAa,EAAA;AAAA,IACb,QAAA,EAAU,EAAA;AAAA,IACV,gBAAA,EAAkB;AAAA,GACpB;AACF;AAEA,SAAS,eAAA,CACP,CAAA,EAAQ,GAAA,EAAa,KAAA,EAAmB,OAAmB,SAAA,EACjD;AACV,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA;AACzB,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,KAAA,CAAM,CAAC,GAAG,GAAG,CAAA;AAC/C,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAClB,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,EAAE,CAAA;AACxB,IAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,IAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,QAAA,CAAS,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,uBAAuB,CAAA;AACjG,IAAA,IAAA,GAAO,QAAA,CAAS,EAAA;AAAA,EAClB;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,CAAA,CAAE,UAAU,CAAA,EAAG;AACpC,IAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,GAAG,CAAA;AACvD,IAAA,IAAI,YAAY,OAAA,CAAQ,CAAC,GAAG,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,CAAS,IAAI,EAAA,EAAI,OAAA,CAAQ,CAAC,CAAA,EAAG,IAAA,EAAM,QAAQ,MAAA,EAAQ,qBAAA,GAAwB,KAAK,CAAA;AAAA,EACjI;AACA,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG,SAAA,CAAU,KAAK,EAAE,EAAA,EAAI,IAAA,GAAO,GAAA,EAAK,IAAA,EAAM,GAAA,CAAI,EAAE,IAAA,EAAM,GAAG,CAAA,EAAG,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,IAAI,CAAA,CAAE,WAAA,EAAa,EAAE,CAAA,EAAG,CAAA;AACvI,EAAA,OAAO,OAAA;AACT;AAoBA,SAAS,cAAA,CAAe,QAAa,IAAA,EAAuC;AAC1E,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,YAA4B,EAAC;AACnC,EAAA,MAAM,EAAA,GAAM,MAAA,CAAO,aAAA,IAAiB,EAAC;AACrC,EAAA,MAAM,EAAA,GAAM,MAAA,CAAO,eAAA,IAAmB,EAAC;AACvC,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAE5D,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,EAAA,CAAG,QAAQ,CAAA;AAChC,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,EAAA,CAAG,QAAQ,CAAA;AACnC,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,WAAA,CAAY,IAAI,CAAC,CAAA,KAAM,CAAC,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAGlE,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,MAAA,MAAM,IAAA,GAAO,oBAAoB,CAAC,CAAA;AAClC,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,MAAA,KAAA,MAAW,KAAK,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,QAAS,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,IAAA,CAAK,EAAA,EAAI,MAAM,WAAA,EAAa,MAAA,EAAQ,wBAAwB,CAAA;AAAA,IAC/H;AACA,IAAA,QAAA,CAAS,QAAQ,CAAC,CAAA,EAAG,OAAO,eAAA,CAAgB,CAAA,EAAG,IAAI,CAAA,CAAE,EAAA,EAAI,GAAA,GAAMC,KAAAA,CAAK,KAAK,CAAC,CAAC,GAAG,KAAA,EAAO,KAAA,EAAO,SAAS,CAAC,CAAA;AACtG,IAAA,wBAAA,CAAyB,MAAA,EAAQ,KAAA,EAAO,KAAW,CAAA;AACnD,IAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,IAAA,OAAO,sBAAA,CAAuB;AAAA,MAC5B,cAAA,EAAgB,CAAA;AAAA,MAChB,MAAA,EAAQ,EAAE,UAAA,EAAY,cAAA,EAAgB,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,EAAC,EAAG,mBAAA,EAAqB,IAAA,CAAK,kBAAA,IAAsB,CAAA,EAAE;AAAA,MACvH,cAAA,EAAgB,KAAA;AAAA,MAChB,gBAAA,EAAkB,KAAA;AAAA,MAClB,mBAAA,EAAqB,SAAA;AAAA,MACrB,QAAQ;AAAC,KACV,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,EAAA,QAAA,CAAS,QAAQ,CAAC,CAAA,EAAG,EAAA,KAAO,YAAA,CAAa,IAAI,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,GAAA,GAAMA,MAAK,EAAA,GAAK,CAAC,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;AAC/E,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAsB;AACnD,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACpB,IAAA,gBAAA,CAAiB,IAAI,GAAA,EAAK,GAAA,CAAI,CAAA,CAAE,KAAK,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,EAAE,EAAE,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EAC9E;AAEA,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAY;AACxC,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAEjC,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA;AACrB,IAAA,MAAM,QAAQ,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,OAAA,CAAQ,SAAS,CAAC,CAAA;AAC9C,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,EAAA,CAAG,UAAU,CAAA;AAEhC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,IAAI,CAAA,CAAE,MAAA,EAAQ,KAAK,CAAA,KAAM,KAAK,CAAA;AAChE,IAAA,MAAM,QAAA,GAAW,OAAO,MAAA,CAAO,CAAC,MAAM,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,KAAM,UAAU,CAAA;AAClE,IAAA,KAAA,MAAW,SAAS,CAAC,GAAG,IAAA,EAAM,GAAG,QAAQ,CAAA,EAAG;AAC1C,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA;AAChC,MAAA,MAAM,CAAA,GAAI,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAC7B,MAAA,IAAI,CAAC,CAAA,EAAG;AACN,QAAA,MAAM,IAAI,KAAA,CAAM,QAAA,GAAW,GAAA,GAAM,8BAAA,GAAiC,MAAM,gBAAgB,CAAA;AAAA,MAC1F;AACA,MAAA,IAAI,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,KAAM,cAAc,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AACxE,QAAA,MAAM,IAAI,KAAA,CAAM,QAAA,GAAW,GAAA,GAAM,6BAAA,GAAgC,MAAM,uCAAuC,CAAA;AAAA,MAChH;AACA,MAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,QAAA,MAAM,IAAA,GAAO,oBAAoB,CAAC,CAAA;AAClC,QAAA,IAAA,CAAK,QAAA,GAAW,GAAA;AAChB,QAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,QAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,EAAG;AACrC,UAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,EAAG;AAC3B,YAAA,MAAM,IAAI,MAAM,UAAA,GAAa,GAAA,GAAM,aAAa,GAAA,GAAM,qBAAA,GAAwB,IAAI,2DAA2D,CAAA;AAAA,UAC/I;AACA,UAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,KAAK,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,sBAAA,EAAwB,CAAA;AAAA,QACpF;AACA,QAAA,eAAA,CAAgB,IAAI,GAAG,CAAA;AACvB,QAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,MACvB,CAAA,MAAO;AAIL,QAAA,MAAM,SAAA,GAAY,GAAA,GAAM,OAAA,GAAUA,KAAAA,CAAK,KAAK,CAAA;AAC5C,QAAA,MAAM,IAAA,GAAO,oBAAoB,CAAC,CAAA;AAClC,QAAA,IAAA,CAAK,EAAA,GAAK,SAAA;AACV,QAAA,IAAA,CAAK,IAAA,GAAO,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,GAAG,CAAA,GAAI,aAAA;AAC/B,QAAA,IAAA,CAAK,QAAA,GAAW,GAAA;AAChB,QAAA,IAAA,CAAK,gBAAA,GAAmB,UAAA;AACxB,QAAA,IAAA,CAAK,iBAAA,GAAoB,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,KAAA,CAAM,IAAA,CAAK,iBAAA,GAAoB,GAAG,CAAC,CAAA;AAC9E,QAAA,IAAA,CAAK,gBAAgB,CAAC,GAAA,CAAI,CAAA,CAAE,IAAI,KAAK,GAAG,CAAA;AACxC,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,sBAAA,GAAyB,GAAA,GAAM,YAAA,GAAe,KAAK,CAAA;AACrH,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,QAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAAA,MAC7B;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,EAAA,CAAG,WAAW,CAAA,CACnC,OAAO,CAAC,GAAA,KAAQ,YAAA,CAAa,GAAA,CAAI,GAAG,CAAC,EACrC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,GAAK,YAAA,CAAa,GAAA,CAAI,CAAC,CAAE,CAAA;AAC7D,IAAA,OAAA,CAAQ,KAAK,EAAE,EAAA,EAAI,KAAK,KAAA,EAAO,IAAA,EAAM,IAAI,EAAA,CAAG,IAAA,EAAM,GAAG,CAAA,EAAG,mBAAmB,GAAA,CAAI,EAAA,CAAG,kBAAkB,CAAA,EAAG,YAAA,EAAc,YAAY,CAAA;AAAA,EACnI;AAGA,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,CAAA,CAAE,UAAU,CAAA;AAC5B,IAAA,IAAI,GAAA,IAAO,YAAY,GAAA,CAAI,GAAG,KAAK,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5D,MAAA,MAAM,IAAI,KAAA,CAAM,UAAA,GAAa,GAAA,GAAM,uEAAuE,CAAA;AAAA,IAC5G;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AACjE,EAAA,MAAM,kBAAkB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,EAAE,EAAE,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,IAAO,CAAC,YAAA,CAAa,GAAA,CAAI,GAAG,CAAC,CAAA;AACpG,EAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,KAAA,CAAM,qCAAA,GAAwC,gBAAgB,IAAA,CAAK,IAAI,IAAI,gBAAgB,CAAA;AAAA,EACvG;AAGA,EAAA,MAAM,eAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,MAAM,GAAA,GAAgB,CAAC,GAAG,GAAA,CAAI,YAAY,CAAA;AAC1C,IAAA,KAAA,MAAW,GAAA,IAAO,IAAI,UAAA,EAAY;AAChC,MAAA,MAAM,CAAA,GAAI,SAAS,IAAA,CAAK,CAAC,MAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,KAAM,GAAG,CAAA;AAChD,MAAA,MAAM,UAAU,eAAA,CAAgB,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,OAAO,SAAS,CAAA;AAC/D,MAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,QAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,GAAG,CAAA;AAC3C,QAAA,IAAA,CAAK,WAAW,GAAA,CAAI,EAAA;AAAA,MACtB;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,OAAO,CAAA;AAAA,IACrB;AACA,IAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,EACvB;AAIA,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,GAAA,GAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,EAAc,EAAA,EAAY,MAAA,KAAmB;AAC7D,IAAA,MAAM,GAAA,GAAM,OAAO,GAAA,GAAM,EAAA;AACzB,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,IAAA,QAAA,CAAS,IAAI,GAAG,CAAA;AAChB,IAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,IAAI,IAAA,EAAM,WAAA,EAAa,QAAQ,CAAA;AAAA,EACpD,CAAA;AACA,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,CAAA,CAAE,UAAU,CAAA;AAC5B,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,CAAA,CAAE,UAAU,CAAA;AAC5B,IAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,IAAA,MAAM,aAAa,gBAAA,CAAiB,GAAA,CAAI,GAAG,CAAA,IAAK,IAAI,CAAC,CAAA;AACrD,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,CAAA,CAAE,KAAA,EAAO,KAAK,CAAA;AAChC,IAAA,QAAA,CAAS,GAAA,EAAK,WAAW,GAAA,CAAI,CAAA,CAAE,cAAc,aAAa,CAAA,GAAI,IAAA,GAAO,KAAA,GAAQ,GAAG,CAAA;AAIhF,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,gBAAgB,GAAA,IAAO,CAAA,CAAE,gBAAA,KAAqB,UAAA,IAAc,CAAA,CAAE,QAAA,KAAa,GAAA,CAAI,CAAA,CAAE,QAAQ,CAAA,EAAG;AACxH,QAAA,QAAA,CAAS,CAAA,CAAE,EAAA,EAAI,SAAA,EAAW,wBAAA,GAA2B,QAAQ,GAAG,CAAA;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,kBAAA,CAAmB,KAAK,CAAA;AAQxB,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AACxD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,MAAW,CAAA,IAAK,EAAE,QAAA,EAAU,GAAA,IAAO,EAAC,EAAG;AAC5D,IAAA,MAAM,GAAA,GAAM,EAAE,WAAA,EAAY;AAC1B,IAAA,IAAI,CAAC,WAAW,GAAA,CAAI,GAAG,GAAG,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,CAAA,CAAE,EAAE,CAAA;AAAA,EACpD;AACA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,QAAA,EAAU,YAAA,IAAgB,EAAC,EAAG;AAC9C,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,aAAa,CAAA;AAC1C,MAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,CAAA,CAAE,EAAA,EAAI;AAC1B,MAAA,IAAI,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,GAAK,UAAU,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,WAAa,GAAA,EAAK,CAAA,CAAE,EAAA,EAAI,wBAAA,GAA2B,IAAI,GAAG,CAAA;AAAA,IACxG;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAK,CAAA,MAAO;AAAA,IACtC,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,kBAAA,EAAoB,GAAA,CAAI,iBAAA,IAAqB,QAAA,IAAY,IAAI,CAAA,CAAA,GAAK,cAAA;AAAA,IAClE,QAAA,EAAU,aAAa,CAAC;AAAA,GAC1B,CAAE,CAAA;AAEF,EAAA,OAAO,sBAAA,CAAuB;AAAA,IAC5B,cAAA,EAAgB,CAAA;AAAA,IAChB,MAAA,EAAQ,EAAE,UAAA,EAAY,cAAA,EAAgB,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,EAAC,EAAG,mBAAA,EAAqB,IAAA,CAAK,kBAAA,IAAsB,CAAA,EAAE;AAAA,IACvH,cAAA,EAAgB,KAAA;AAAA,IAChB,gBAAA,EAAkB,KAAA;AAAA,IAClB,mBAAA,EAAqB,SAAA;AAAA,IACrB;AAAA,GACD,CAAA;AACH;AAGA,SAAS,wBAAA,CAAyB,MAAA,EAAa,KAAA,EAAmB,KAAA,EAAmB,YAAA,EAA6B;AAChH,EAAA,MAAM,aAAa,IAAI,GAAA,CAAI,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,WAAA,IAAe,CAAA,CAAE,EAAE,CAAC,CAAA;AACtG,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,EAAG;AACjC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,CAAA,CAAE,UAAU,CAAA;AAClC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,CAAA,CAAE,UAAU,CAAA;AAClC,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA,EAAG;AAChC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,CAAA,CAAE,KAAA,EAAO,KAAK,CAAA;AAChC,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,SAAS,CAAA;AAC9D,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,WAAW,EAAA,EAAI,SAAA,CAAU,IAAI,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,GAAA,CAAI,EAAE,YAAA,EAAc,aAAa,IAAI,IAAA,GAAO,KAAA,GAAQ,KAAK,CAAA;AACpI,MAAA,IAAoB,CAAC,SAAA,CAAU,UAAA,EAAY;AACzC,QAAA,SAAA,CAAU,UAAA,GAAc,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA,CAAY,QAAA,CAAS,KAAc,CAAA,GAAK,KAAA,GAAmC,KAAA;AAAA,MACzH;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAA,CAAkB,IAAS,IAAA,EAAuC;AACzE,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,YAA4B,EAAC;AACnC,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,GAAA,CAAI,GAAG,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AACjE,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,EAAA,CAAG,QAAQ,CAAA,EAAG;AAChC,IAAA,MAAM,IAAA,GAAO,oBAAoB,CAAC,CAAA;AAClC,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,EAAG;AACrC,MAAA,IAAI,MAAM,IAAA,CAAK,EAAA,IAAM,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG;AACtC,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,IAAA,EAAM,CAAA;AAAA,UACN,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,IAAA,EAAM,WAAA;AAAA,UACN,MAAA,EAAQ,CAAA,sBAAA,EAAyB,CAAC,CAAA,2BAAA,EAA8B,KAAK,EAAE,CAAA;AAAA,SACxE,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,EAAA,CAAG,aAAa,CAAA,CAAE,SAAS,CAAA,EAAG;AACpC,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,IAAA,GAAA,CAAI,GAAG,aAAa,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAG,GAAA,KAAQ;AACxC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,CAAA,CAAE,UAAU,CAAA;AAC5B,MAAA,IAAI,GAAA,WAAc,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA,CAAE,KAAA,EAAO,GAAA,GAAM,CAAC,CAAC,CAAA;AAAA,IAClD,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,SAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,QAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,KAAK,GAAA,CAAI,CAAA;AAAA,EAChF;AAEA,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,KAAA,MAAW,GAAA,IAAO,GAAA,CAAI,EAAA,CAAG,UAAU,CAAA,EAAG;AACpC,IAAA,EAAA,IAAM,CAAA;AACN,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,WAAW,EAAE,MAAA,CAAO,CAAC,EAAA,KAAO,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AAC/E,IAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,EAAA,EAAI,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,QAAQ,EAAE,CAAA;AAAA,QAC1B,IAAA,EAAM,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,cAAc,EAAE,CAAA;AAAA,QACpC,QAAA,EAAU,GAAA;AAAA,QACV,SAAA,EAAW,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,EAAE;AAAA,OACnC,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,EAAA,OAAO,sBAAA,CAAuB;AAAA,IAC5B,cAAA,EAAgB,CAAA;AAAA,IAChB,MAAA,EAAQ,EAAE,UAAA,EAAY,iBAAA,EAAmB,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,EAAC,EAAG,mBAAA,EAAqB,IAAA,CAAK,kBAAA,IAAsB,CAAA,EAAE;AAAA,IAC1H,cAAA,EAAgB,KAAA;AAAA,IAChB,gBAAA,EAAkB,KAAA;AAAA,IAClB,mBAAA,EAAqB,SAAA;AAAA,IACrB,QAAQ;AAAC,GACV,CAAA;AACH;AAEA,SAAS,eAAA,CAAgB,IAAS,IAAA,EAAuC;AACvE,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,YAA4B,EAAC;AACnC,EAAA,GAAA,CAAI,EAAA,CAAG,QAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAA,KAAO,gBAAgB,CAAA,EAAG,GAAA,CAAI,EAAE,EAAA,EAAI,GAAA,GAAMA,MAAK,EAAA,GAAK,CAAC,CAAC,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,SAAS,CAAC,CAAA;AAC9G,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,IAAK,GAAA,CAAI,GAAG,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AACrD,IAAA,MAAM,QAAA,GAAW,GAAA,CAAK,EAAA,CAAG,cAAA,IAAkB,EAAU,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,GAAA,CAAK,EAAA,CAAG,cAAA,EAAoC,KAAK,EAAE,MAAA,GAAS,CAAA;AACjI,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,oBAAA,GAAuB,IAAI,EAAA,CAAG,QAAQ,EAAE,MAAA,GAAS,qFAAA,IAChD,WACG,oLAAA,GACA,mGAAA;AAAA,KACN;AAAA,EACF;AACA,EAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,EAAA,OAAO,sBAAA,CAAuB;AAAA,IAC5B,cAAA,EAAgB,CAAA;AAAA,IAChB,MAAA,EAAQ,EAAE,UAAA,EAAY,eAAA,EAAiB,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,EAAC,EAAG,mBAAA,EAAqB,IAAA,CAAK,kBAAA,IAAsB,CAAA,EAAE;AAAA,IACxH,cAAA,EAAgB,KAAA;AAAA,IAChB,gBAAA,EAAkB,KAAA;AAAA,IAClB,mBAAA,EAAqB,SAAA;AAAA,IACrB,QAAQ;AAAC,GACV,CAAA;AACH;AAGO,SAAS,kBAAA,CACd,KAAA,EACA,IAAA,GAAwB,EAAC,EACT;AAChB,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,IAAI,GAAA,CAAI,CAAA,CAAE,cAAc,CAAA,CAAE,SAAS,CAAA,EAAG;AACpC,IAAA,OAAO,uBAAuB,CAAC,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,CAAA,CAAE,aAAA,IAAiB,CAAA,CAAE,eAAA,IAAmB,IAAI,CAAA,CAAE,KAAK,CAAA,CAAE,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAC/F,IAAA,OAAO,cAAA,CAAe,GAAG,IAAI,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,GAAA,CAAI,CAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,CAAA,IAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,KAAM,iBAAA,EAAmB,OAAO,iBAAA,CAAkB,GAAG,IAAI,CAAA;AACrG,EAAA,OAAO,eAAA,CAAgB,GAAG,IAAI,CAAA;AAChC;AA7dA,IAsBM,UAAA,EACAA,KAAAA,EAGA,GAAA,EACA,GAAA,EACA,GAAA,EACA,IAAA;AA7BN,IAAA,0BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AAAA,IAAA,yBAAA,EAAA;AAsBA,IAAM,UAAA,GAAqC,EAAE,QAAA,EAAU,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,QAAQ,CAAA,EAAE;AACtH,IAAMA,KAAAA,GAAO,CAAC,CAAA,KAAsB,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAG7D,IAAM,GAAA,GAAM,CAAC,CAAA,KAAuB,KAAA,CAAM,QAAQ,CAAC,CAAA,GAAK,IAAc,EAAC;AACvE,IAAM,GAAA,GAAM,CAAC,CAAA,EAAY,CAAA,GAAI,OAAgB,OAAO,CAAA,KAAM,WAAW,CAAA,GAAI,CAAA;AACzE,IAAM,GAAA,GAAM,CAAC,CAAA,EAAY,CAAA,KAAuB,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AAClG,IAAM,IAAA,GAAO,CAAC,CAAA,KAA0B,KAAA,CAAM,QAAQ,CAAC,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAQ,IAAI,EAAC;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACHlH,IAAM,SAAA,GAAY,mBAAA;AAClB,IAAM,OAAA,GAAU,4DAAA;AAChB,IAAM,OAAA,GAAU,mDAAA;AAChB,IAAM,UAAA,GAAa,sIAAA;AACnB,IAAM,kBAAA,GAAqB,oJAAA;AAEpB,SAAS,cAAA,CAAe,UAAkB,OAAA,EAAmC;AAClF,EAAA,MAAM,MAAA,GAA2B;AAAA,IAC/B,SAAS,EAAC;AAAA,IACV,OAAO,EAAC;AAAA,IACR,WAAW,EAAC;AAAA,IACZ,mBAAmB,EAAC;AAAA,IACpB,gBAAgB,EAAC;AAAA,IACjB,iBAAiB;AAAC,GACpB;AAGA,EAAA,IAAI,KAAA;AACJ,EAAA,OAAA,CAAQ,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AACjD,IAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC9B;AAGA,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,OAAA,CAAQ,KAAA,GAAQ,kBAAA,CAAmB,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAC1D,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG;AACzB,MAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AACnB,MAAA,MAAA,CAAO,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACtC;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAC/C,IAAA,MAAM,QAAA,GAAA,CAAY,KAAA,CAAM,CAAC,CAAA,IAAK,IAC3B,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,OAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CACjB,OAAO,OAAO,CAAA;AACjB,IAAA,MAAA,CAAO,MAAM,IAAA,CAAK;AAAA,MAChB,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACb,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACb,WAAA,EAAa,QAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAC/C,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAC1B,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK;AAAA,MACpB,IAAA;AAAA,MACA,MAAA,EAAA,CAAS,KAAA,CAAM,CAAC,CAAA,IAAK,IAAI,IAAA,EAAK;AAAA,MAC9B,OAAA,EAAA,CAAU,KAAA,CAAM,CAAC,CAAA,IAAK,IAAI,IAAA,EAAK;AAAA,MAC/B,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,OAAA,CAAQ,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAClD,IAAA,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACzB;AACA,EAAA,MAAA,CAAO,iBAAA,GAAoB,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AAGhD,EAAA,IAAI,QAAQ,QAAA,CAAS,MAAM,KAAK,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AACvD,IAAA,MAAA,CAAO,cAAA,CAAe,KAAK,UAAU,CAAA;AAAA,EACvC;AACA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC9B,IAAA,MAAA,CAAO,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,EACrC;AACA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/B,IAAA,MAAA,CAAO,cAAA,CAAe,KAAK,aAAa,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,IAAA,MAAA,CAAO,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,EACnC;AACA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,IAAA,MAAA,CAAO,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,kBAAkB,OAAA,EAA+C;AAC/E,EAAA,MAAM,MAAA,GAA2B;AAAA,IAC/B,SAAS,EAAC;AAAA,IACV,OAAO,EAAC;AAAA,IACR,WAAW,EAAC;AAAA,IACZ,mBAAmB,EAAC;AAAA,IACpB,gBAAgB,EAAC;AAAA,IACjB,iBAAiB;AAAC,GACpB;AAEA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AAErC,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,OAAA,EAAS;AAC3B,MAAA,YAAA,CAAa,IAAI,GAAA,EAAA,CAAM,YAAA,CAAa,IAAI,GAAG,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACxD;AACA,IAAA,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,KAAK,CAAA;AAC5B,IAAA,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,CAAE,SAAS,CAAA;AACpC,IAAA,KAAA,MAAW,CAAA,IAAK,EAAE,iBAAA,EAAmB;AACnC,MAAA,aAAA,CAAc,IAAI,CAAA,EAAA,CAAI,aAAA,CAAc,IAAI,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACtD;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,EAAE,cAAA,EAAgB;AAChC,MAAA,WAAA,CAAY,IAAI,CAAA,EAAA,CAAI,WAAA,CAAY,IAAI,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IAClD;AACA,IAAA,KAAA,MAAW,EAAA,IAAM,EAAE,eAAA,EAAiB;AAClC,MAAA,YAAA,CAAa,IAAI,EAAE,CAAA;AAAA,IACrB;AAAA,EACF;AAGA,EAAA,MAAA,CAAO,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,CAAA,CAC/C,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAC1B,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACX,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,GAAG,CAAA;AAG5B,EAAA,MAAA,CAAO,iBAAA,GAAoB,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,CAAA,CAC1D,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAC1B,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACX,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA,KAAM,CAAC,CAAA;AAGjB,EAAA,MAAA,CAAO,cAAA,GAAiB,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAA,CACrD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAC1B,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACX,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA,KAAM,CAAC,CAAA;AAEjB,EAAA,MAAA,CAAO,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK,YAAY,EAAE,IAAA,EAAK;AAGvD,EAAA,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,GAAG,GAAG,CAAA;AACxC,EAAA,MAAA,CAAO,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,GAAG,GAAG,CAAA;AAEhD,EAAA,OAAO,MAAA;AACT;;;ACjJA,IAAMC,UAAAA,GAAY,sCAAA;AAClB,IAAMC,QAAAA,GAAU,wCAAA;AAChB,IAAMC,QAAAA,GAAU,mCAAA;AAChB,IAAM,QAAA,GAAW,sDAAA;AAEV,SAAS,WAAA,CAAY,UAAkB,OAAA,EAAgC;AAC5E,EAAA,MAAM,MAAA,GAAwB;AAAA,IAC5B,SAAS,EAAC;AAAA,IACV,OAAO,EAAC;AAAA,IACR,WAAW,EAAC;AAAA,IACZ,gBAAgB;AAAC,GACnB;AAEA,EAAA,IAAI,KAAA;AAGJ,EAAA,OAAA,CAAQ,KAAA,GAAQF,UAAAA,CAAU,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AACjD,IAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC9B;AAGA,EAAA,OAAA,CAAQ,KAAA,GAAQC,QAAAA,CAAQ,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAC/C,IAAA,MAAA,CAAO,MAAM,IAAA,CAAK;AAAA,MAChB,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACb,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,OAAA,CAAQ,KAAA,GAAQC,QAAAA,CAAQ,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAC/C,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACb,MAAA,EAAA,CAAS,KAAA,CAAM,CAAC,CAAA,IAAK,IAAI,IAAA,EAAK;AAAA,MAC9B,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,OAAA,CAAQ,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAChD,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACb,MAAA,EAAQ,EAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,QAAQ,QAAA,CAAS,OAAO,KAAK,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AACzD,IAAA,MAAA,CAAO,cAAA,CAAe,KAAK,WAAW,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/B,IAAA,MAAA,CAAO,cAAA,CAAe,KAAK,SAAS,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/B,IAAA,MAAA,CAAO,cAAA,CAAe,KAAK,UAAU,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,eAAe,OAAA,EAAyC;AACtE,EAAA,MAAM,MAAA,GAAwB;AAAA,IAC5B,SAAS,EAAC;AAAA,IACV,OAAO,EAAC;AAAA,IACR,WAAW,EAAC;AAAA,IACZ,gBAAgB;AAAC,GACnB;AAEA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAE5C,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,OAAA,EAAS;AAC3B,MAAA,YAAA,CAAa,IAAI,GAAA,EAAA,CAAM,YAAA,CAAa,IAAI,GAAG,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACxD;AACA,IAAA,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,KAAK,CAAA;AAC5B,IAAA,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,CAAE,SAAS,CAAA;AACpC,IAAA,KAAA,MAAW,CAAA,IAAK,EAAE,cAAA,EAAgB;AAChC,MAAA,WAAA,CAAY,IAAI,CAAA,EAAA,CAAI,WAAA,CAAY,IAAI,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,CAAA,CAC/C,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAC1B,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACX,GAAA,CAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAG,CAAA;AAErB,EAAA,MAAA,CAAO,cAAA,GAAiB,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAA,CACrD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAC1B,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACX,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA,KAAM,CAAC,CAAA;AAEjB,EAAA,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,GAAG,GAAG,CAAA;AACxC,EAAA,MAAA,CAAO,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,GAAG,GAAG,CAAA;AAEhD,EAAA,OAAO,MAAA;AACT;;;AC/FA,IAAMF,UAAAA,GAAY,4BAAA;AAClB,IAAM,QAAA,GAAW,qCAAA;AACjB,IAAME,QAAAA,GAAU,8BAAA;AAChB,IAAM,YAAA,GAAe,uBAAA;AAEd,SAAS,eAAA,CAAgB,UAAkB,OAAA,EAAoC;AACpF,EAAA,MAAM,MAAA,GAA4B;AAAA,IAChC,SAAS,EAAC;AAAA,IACV,OAAO,EAAC;AAAA,IACR,WAAW,EAAC;AAAA,IACZ,YAAY,EAAC;AAAA,IACb,gBAAgB;AAAC,GACnB;AAEA,EAAA,IAAI,KAAA;AAGJ,EAAA,OAAA,CAAQ,KAAA,GAAQF,UAAAA,CAAU,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AACjD,IAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC9B;AAGA,EAAA,OAAA,CAAQ,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AACpD,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,GAAG,CAAA;AACjE,IAAA,IAAI,aAAA,CAAc,SAAS,EAAA,EAAI;AAC7B,MAAA,MAAA,CAAO,UAAA,CAAW,KAAK,aAAa,CAAA;AAAA,IACtC;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAChD,IAAA,MAAM,KAAA,GAAA,CAAS,KAAA,CAAM,CAAC,CAAA,IAAK,IACxB,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,OAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CACjB,OAAO,OAAO,CAAA;AACjB,IAAA,MAAA,CAAO,MAAM,IAAA,CAAK;AAAA,MAChB,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACb,KAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,OAAA,CAAQ,KAAA,GAAQE,QAAAA,CAAQ,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAC/C,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AAEpB,IAAA,IAAI,KAAK,UAAA,CAAW,IAAI,KAAK,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AAClD,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK;AAAA,MACpB,IAAA;AAAA,MACA,MAAA,EAAA,CAAS,KAAA,CAAM,CAAC,CAAA,IAAK,IAAI,IAAA,EAAK;AAAA,MAC9B,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,IAAA,MAAA,CAAO,cAAA,CAAe,KAAK,YAAY,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAC7B,IAAA,MAAA,CAAO,cAAA,CAAe,KAAK,OAAO,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,mBAAmB,OAAA,EAAiD;AAClF,EAAA,MAAM,MAAA,GAA4B;AAAA,IAChC,SAAS,EAAC;AAAA,IACV,OAAO,EAAC;AAAA,IACR,WAAW,EAAC;AAAA,IACZ,YAAY,EAAC;AAAA,IACb,gBAAgB;AAAC,GACnB;AAEA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAE5C,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,OAAA,EAAS;AAC3B,MAAA,YAAA,CAAa,IAAI,GAAA,EAAA,CAAM,YAAA,CAAa,IAAI,GAAG,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACxD;AACA,IAAA,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,KAAK,CAAA;AAC5B,IAAA,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,CAAE,SAAS,CAAA;AACpC,IAAA,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,CAAE,UAAU,CAAA;AACtC,IAAA,KAAA,MAAW,CAAA,IAAK,EAAE,cAAA,EAAgB;AAChC,MAAA,WAAA,CAAY,IAAI,CAAA,EAAA,CAAI,WAAA,CAAY,IAAI,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,CAAA,CAC/C,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAC1B,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACX,GAAA,CAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAG,CAAA;AAErB,EAAA,MAAA,CAAO,cAAA,GAAiB,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAA,CACrD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAC1B,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACX,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA,KAAM,CAAC,CAAA;AAEjB,EAAA,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,GAAG,GAAG,CAAA;AACxC,EAAA,MAAA,CAAO,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,GAAG,GAAG,CAAA;AAChD,EAAA,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,GAAG,EAAE,CAAA;AAEjD,EAAA,OAAO,MAAA;AACT;;;AC5GA,IAAM,UAAA,GAAa,8BAAA;AACnB,IAAMD,QAAAA,GAAU,kCAAA;AAChB,IAAMC,QAAAA,GAAU,sFAAA;AAET,SAAS,YAAA,CAAa,UAAkB,OAAA,EAAiC;AAC9E,EAAA,MAAM,MAAA,GAAyB;AAAA,IAC7B,SAAS,EAAC;AAAA,IACV,OAAO,EAAC;AAAA,IACR,WAAW,EAAC;AAAA,IACZ,gBAAgB;AAAC,GACnB;AAEA,EAAA,IAAI,KAAA;AAGJ,EAAA,OAAA,CAAQ,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAClD,IAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC9B;AAGA,EAAA,OAAA,CAAQ,KAAA,GAAQD,QAAAA,CAAQ,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAC/C,IAAA,MAAA,CAAO,MAAM,IAAA,CAAK;AAAA,MAChB,IAAA,EAAM,KAAA;AAAA,MACN,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,OAAA,CAAQ,KAAA,GAAQC,QAAAA,CAAQ,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAC/C,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,6BAAA,CAA8B,IAAA,CAAK,OAAO,CAAA,EAAG;AAC/C,IAAA,MAAA,CAAO,cAAA,CAAe,KAAK,iBAAiB,CAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,gBAAgB,OAAA,EAA2C;AACzE,EAAA,MAAM,MAAA,GAAyB;AAAA,IAC7B,SAAS,EAAC;AAAA,IACV,OAAO,EAAC;AAAA,IACR,WAAW,EAAC;AAAA,IACZ,gBAAgB;AAAC,GACnB;AAEA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAE7C,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,OAAA,EAAS;AAC3B,MAAA,YAAA,CAAa,IAAI,GAAA,EAAA,CAAM,YAAA,CAAa,IAAI,GAAG,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACxD;AACA,IAAA,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,KAAK,CAAA;AAC5B,IAAA,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,CAAE,SAAS,CAAA;AACpC,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA,CAAE,cAAc,CAAA;AAAA,EAChD;AAEA,EAAA,MAAA,CAAO,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,CAAA,CAC/C,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAC1B,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACX,GAAA,CAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAG,CAAA;AAGrB,EAAA,MAAA,CAAO,iBAAiB,CAAC,GAAG,IAAI,GAAA,CAAI,MAAA,CAAO,cAAc,CAAC,CAAA;AAE1D,EAAA,OAAO,MAAA;AACT;;;AC7DA,IAAM,cAAA,uBAAqB,GAAA,CAAI;AAAA;AAAA,EAE7B,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,UAAA;AAAA,EAC/D,SAAA;AAAA,EAAW,aAAA;AAAA,EAAe,MAAA;AAAA,EAAQ,aAAA;AAAA,EAAe,WAAA;AAAA,EAAa,WAAA;AAAA,EAC9D,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY,YAAA;AAAA,EAAc,WAAA;AAAA,EAAa,iBAAA;AAAA,EAAmB,SAAA;AAAA,EACrE,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,SAAA;AAAA,EAC/D,QAAA;AAAA,EAAU,UAAA;AAAA,EAAY,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU,MAAA;AAAA,EAClE,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,WAAA;AAAA,EAAa,YAAA;AAAA,EAAc,OAAA;AAAA,EAAS,QAAA;AAAA,EAC9D,WAAA;AAAA,EAAa,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW,YAAA;AAAA,EAAc,UAAA;AAAA,EAAY,QAAA;AAAA,EAC9D,SAAA;AAAA,EAAW,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,SAAA;AAAA,EAAW,UAAA;AAAA;AAAA,EAE5C,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ;AACvD,CAAC,CAAA;AAKD,SAAS,iBAAiB,QAAA,EAA0B;AAClD,EAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,EAAA,MAAM,EAAA,GAAK,SAAS,WAAA,EAAY;AAChC,EAAA,IAAI,GAAG,QAAA,CAAS,MAAM,KAAK,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,IAAK,EAAA,CAAG,SAAS,IAAI,CAAA,IAAK,GAAG,QAAA,CAAS,MAAM,KAAK,EAAA,CAAG,QAAA,CAAS,IAAI,CAAA,EAAG;AAC/G,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,OAAA;AAChC,IAAA,IAAI,EAAA,CAAG,SAAS,UAAU,CAAA,IAAK,GAAG,QAAA,CAAS,KAAK,GAAG,OAAO,OAAA;AAC1D,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAQO,SAAS,eAAA,CACd,aAAA,EACA,aAAA,EACA,OAAA,EACA,OAAA,EACW;AACX,EAAA,MAAM,WAAsB,EAAC;AAG7B,EAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,cAAc,CAAA;AAS9C,EAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,IAAA,KAAA,MAAW,GAAA,IAAO,cAAc,OAAA,EAAS;AACvC,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,QAAA,GAAW,KAAA;AAEf,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,QAAA,MAAA,GAAS,GAAA;AAAA,MACX,WAAW,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,YAAY,GAAA,EAAK;AAC5D,QAAA,MAAM,MAAA,GAAS,GAAA;AACf,QAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAChB,QAAA,KAAA,GAAQ,OAAO,KAAA,IAAS,CAAA;AACxB,QAAA,QAAA,GAAW,gBAAA,CAAiB,MAAA,CAAO,IAAA,IAAQ,EAAE,CAAA;AAAA,MAC/C,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,MAAA,CAAO,WAAA,EAAa,CAAA,EAAG;AAE/C,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,MAAA;AAAA,QACT,MAAA,EAAQ,QAAA;AAAA,QACR,QAAA;AAAA,QACA,MAAA,EAAQ,CAAA,GAAA,CAAO,KAAA,GAAQ,CAAA,IAAK,GAAA;AAAA,QAC5B,OAAA,EAAS,YAAY,KAAK,CAAA,MAAA;AAAA,OAC3B,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,WAAW,aAAA,EAAe;AAC5B,IAAA,KAAA,MAAW,QAAA,IAAY,cAAc,KAAA,EAAO;AAC1C,MAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,MAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,MAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,QAAA,CAAS,IAAA,IAAQ,EAAE,CAAA;AAGrD,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAA,EAAS,WAAA,EAAa,YAAA,EAAc,WAAW,SAAS,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AAEvF,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,kBAAA;AAAA,QACR,QAAA;AAAA,QACA,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS,GAAG,IAAI,CAAA,YAAA;AAAA,OACjB,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,eAAe,aAAA,EAAe;AAChC,IAAA,KAAA,MAAW,IAAA,IAAQ,cAAc,SAAA,EAAW;AAC1C,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA;AAGjD,MAAA,IAAI,CAAC,QAAQ,OAAA,EAAS,WAAA,EAAa,YAAY,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AAEjE,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,oBAAA;AAAA,QACR,QAAA;AAAA,QACA,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,gBAAgB,aAAA,IAAiB,KAAA,CAAM,OAAA,CAAQ,aAAA,CAAc,UAAU,CAAA,EAAG;AAC5E,IAAA,KAAA,MAAW,GAAA,IAAO,cAAc,UAAA,EAAY;AAC1C,MAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,IAAA,EAAK,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC5D,MAAA,IAAI,aAAA,CAAc,SAAS,EAAA,EAAI;AAC7B,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,aAAA;AAAA,UACT,MAAA,EAAQ,WAAA;AAAA,UACR,QAAA,EAAU,KAAA;AAAA,UACV,MAAA,EAAQ,GAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,qBAAqB,aAAA,IAAiB,KAAA,CAAM,OAAA,CAAQ,aAAA,CAAc,eAAe,CAAA,EAAG;AACtF,IAAA,KAAA,MAAW,EAAA,IAAM,cAAc,eAAA,EAAiB;AAC9C,MAAA,MAAM,SAAS,OAAO,EAAA,KAAO,QAAA,GAAW,EAAA,GAAM,GAA8B,SAAA,IAAa,EAAA;AACzF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,MAAA;AAAA,UACT,MAAA,EAAQ,iBAAA;AAAA,UACR,QAAA,EAAU,KAAA;AAAA,UACV,MAAA,EAAQ,GAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,uBAAuB,aAAA,IAAiB,KAAA,CAAM,OAAA,CAAQ,aAAA,CAAc,iBAAiB,CAAA,EAAG;AAC1F,IAAA,KAAA,MAAW,OAAA,IAAW,cAAc,iBAAA,EAAmB;AACrD,MAAA,MAAM,cAAc,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAW,QAAiC,OAAA,IAAW,EAAA;AACzG,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,IAAI,WAAW,CAAA,CAAA;AAAA,UACxB,MAAA,EAAQ,kBAAA;AAAA,UACR,QAAA,EAAU,KAAA;AAAA,UACV,MAAA,EAAQ,CAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,gBAAA,IAAoB,aAAA,GACtC,aAAA,CAAc,cAAA,GACd,yBAAA,IAA6B,aAAA,GAC1B,aAAA,CAA0G,uBAAA,IAA2B,EAAC,GACvI,EAAC;AAEP,EAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAA,GAAU,KAAA;AAAA,IACZ,WAAW,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,aAAa,KAAA,EAAO;AACnE,MAAA,MAAM,MAAA,GAAS,KAAA;AACf,MAAA,OAAA,GAAU,MAAA,CAAO,OAAA;AACjB,MAAA,QAAA,GAAW,gBAAA,CAAiB,MAAA,CAAO,IAAA,IAAQ,EAAE,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,OAAA;AAAA,MACT,MAAA,EAAQ,gBAAA;AAAA,MACR,QAAA;AAAA,MACA,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,iBAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,MAAA,cAAA,CAAe,KAAK,EAAE,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,OAAO,cAAA;AACT;;;AChMO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EACxC,WAAA,CACE,OAAA,EACgB,MAAA,EACA,KAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHG,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF,CAAA;AAeO,SAAS,qBAAqB,MAAA,EAA0C;AAC7E,EAAA,MAAM,QAAwB,EAAC;AAC/B,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,EAAe,OAAA,EAAiB,QAAgB,KAAA,KAAwB;AACpF,IAAA,IAAI,MAAA,IAAU,OAAA,IAAW,KAAA,IAAS,CAAC,MAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,OAAA,IAAW,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA,EAAG;AAChG,MAAA,KAAA,CAAM,KAAK,EAAE,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC9C;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,IAAA,CAAK,QAAA,EAAU,OAAO,OAAA,IAAW,2BAAA,EAA6B,OAAO,MAAA,EAAQ,MAAA,CAAO,SAAS,aAAa,CAAA;AAAA,EAC5G;AAEA,EAAA,IAAA,CAAK,QAAA,EAAU,QAAQ,GAAA,CAAI,YAAA,IAAgB,QAAQ,GAAA,CAAI,eAAA,IAAmB,IAAI,OAAA,CAAQ,GAAA,CAAI,eAAe,OAAA,CAAQ,GAAA,CAAI,kBAAkB,EAAA,EAAI,OAAA,CAAQ,IAAI,SAAA,IAAa,OAAA,CAAQ,GAAA,CAAI,aAAA,IAAiB,EAAE,CAAA;AAEnM,EAAA,IAAA,CAAK,WAAA,EAAa,QAAQ,GAAA,CAAI,kBAAA,IAAsB,QAAQ,GAAA,CAAI,gBAAA,IAAoB,IAAI,OAAA,CAAQ,GAAA,CAAI,qBAAqB,OAAA,CAAQ,GAAA,CAAI,mBAAmB,EAAA,EAAI,OAAA,CAAQ,IAAI,eAAA,IAAmB,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,EAAE,CAAA;AAE7N,EAAA,IAAA,CAAK,QAAA,EAAU,uCAAuC,OAAA,CAAQ,GAAA,CAAI,kBAAkB,EAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,YAAA,IAAgB,wCAAwC,CAAA;AAE5J,EAAA,IAAA,CAAK,YAAA,EAAc,gCAAgC,OAAA,CAAQ,GAAA,CAAI,sBAAsB,EAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,wCAAwC,CAAA;AAEjK,EAAA,IAAI,OAAA,CAAQ,IAAI,gBAAA,EAAkB;AAChC,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,YAAY,CAAA;AACrD,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,MAAM,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,EAAE,CAAA;AACzC,MAAA,OAAO,CAAC,EAAA,EAAI,GAAG,IAAI,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAKA,IAAM,uBAAA,GAA0B,IAAA;AAChC,IAAI,aAAA,GAAgB,CAAA;AAEpB,eAAe,UAAA,GAA4B;AACzC,EAAA,MAAM,IAAA,GAAO,aAAA,GAAgB,uBAAA,GAA0B,IAAA,CAAK,GAAA,EAAI;AAChE,EAAA,IAAI,IAAA,GAAO,CAAA,EAAG,MAAM,IAAI,OAAA,CAAQ,CAACC,QAAAA,KAAY,UAAA,CAAWA,QAAAA,EAAS,IAAI,CAAC,CAAA;AACtE,EAAA,aAAA,GAAgB,KAAK,GAAA,EAAI;AAC3B;AAEO,SAAS,gBAAgB,MAAA,EAAqC;AACnE,EAAA,MAAM,KAAA,GAAQ,qBAAqB,MAAM,CAAA;AACzC,EAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,cAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAe,OAAA,CAAQ;AACvB,EAAgB,OAAA,CAAQ;AACxB,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AAEtB,EAAA,eAAe,IAAA,CACb,UACA,OAAA,EACwB;AACxB,IAAA,MAAM,WAAA,GAAc,OAAA,EAAS,WAAA,IAAe,MAAA,EAAQ,WAAA,IAAe,GAAA;AACnE,IAAA,MAAM,SAAA,GAAY,OAAA,EAAS,SAAA,IAAa,MAAA,EAAQ,SAAA,IAAa,SAAS,OAAA,CAAQ,GAAA,CAAI,cAAA,IAAkB,OAAA,EAAS,EAAE,CAAA;AAE/G,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,IAAI,SAAA,GAAmC,IAAA;AACvC,IAAA,MAAM,SAAA,mBAAY,IAAI,GAAA,CAAI,CAAC,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAKxD,IAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,0BAA0B,GAAO,CAAA;AAC/E,IAAA,MAAM,gBAAA,GAAmB,CAAA;AACzB,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,IAAS,gBAAA,EAAkB,KAAA,EAAA,EAAS;AACtD,MAAA,IAAI,QAAQ,CAAA,EAAG;AAGb,QAAA,QAAA,CAAS,IAAA,CAAK,QAAA,IAAY,KAAA,GAAQ,CAAA,CAAA,GAAK,2DAAsD,CAAA;AAC7F,QAAA,MAAM,IAAI,OAAA,CAAQ,CAACA,aAAY,UAAA,CAAWA,QAAAA,EAAS,GAAM,CAAC,CAAA;AAAA,MAC5D;AACA,MAAA,KAAA,MAAW,YAAY,KAAA,EAAO;AAC9B,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU;AAAA,YACd,cAAA,EAAgB,kBAAA;AAAA,YAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA;AAAA,WAC5C;AACA,UAAA,MAAM,OAAA,GAAU;AAAA,YACd,OAAO,QAAA,CAAS,KAAA;AAAA,YAChB,QAAA;AAAA,YACA,WAAA;AAAA,YACA,UAAA,EAAY;AAAA,WACd;AACA,UAAA,MAAM,UAAA,EAAW;AACjB,UAAA,MAAM,UAAU,MAAyB,KAAA,CAAM,CAAA,EAAG,QAAA,CAAS,OAAO,CAAA,iBAAA,CAAA,EAAqB;AAAA,YACrF,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS;AAAA,cACP,cAAA,EAAgB,kBAAA;AAAA,cAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA;AAAA,aAC5C;AAAA,YACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,cACnB,OAAO,QAAA,CAAS,KAAA;AAAA,cAChB,QAAA;AAAA,cACA,WAAA;AAAA,cACA,UAAA,EAAY;AAAA,aACb,CAAA;AAAA,YACD,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,kBAAkB;AAAA,WAC/C,CAAA;AAGD,UAAA,IAAI,QAAA;AACJ,UAAA,IAAI;AACF,YAAA,QAAA,GAAW,MAAM,OAAA,EAAQ;AAAA,UAC3B,SAAS,MAAA,EAAQ;AACf,YAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,iBAAA,EAAoB,MAAA,YAAkB,KAAA,GAAQ,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,MAAM,CAAC,CAAA,sBAAA,CAAmB,CAAA;AAC/H,YAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,GAAK,CAAC,CAAA;AAC7C,YAAA,aAAA,GAAgB,KAAK,GAAA,EAAI;AACzB,YAAA,QAAA,GAAW,MAAM,OAAA,EAAQ;AAAA,UAC3B;AACA,UAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,YAAA,MAAM,OAAO,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AACjD,YAAA,MAAM,MAAM,IAAI,cAAA;AAAA,cACd,CAAA,CAAA,EAAI,QAAA,CAAS,KAAK,CAAA,iBAAA,EAAoB,SAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,QAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,cACpG,QAAA,CAAS;AAAA,aACX;AACA,YAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAG3B,cAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACxD,cAAA,MAAM,eAAe,IAAA,CAAK,GAAA;AAAA,gBACxB,GAAA;AAAA,gBACA,IAAA,CAAK,GAAA,CAAI,IAAA,EAAA,CAAS,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,aAAa,CAAC,CAAA,GAAI,MAAA,CAAO,aAAa,CAAA,GAAI,MAAM,GAAK;AAAA,eAChG;AACA,cAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,sCAAA,EAAoC,KAAK,KAAA,CAAM,YAAA,GAAe,GAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AACrG,cAAA,MAAM,IAAI,OAAA,CAAQ,CAACA,aAAY,UAAA,CAAWA,QAAAA,EAAS,YAAY,CAAC,CAAA;AAChE,cAAA,aAAA,GAAgB,KAAK,GAAA,EAAI;AACzB,cAAA,MAAM,QAAQ,MAAM,KAAA,CAAM,CAAA,EAAG,QAAA,CAAS,OAAO,CAAA,iBAAA,CAAA,EAAqB;AAAA,gBAChE,MAAA,EAAQ,MAAA;AAAA,gBACR,OAAA;AAAA,gBACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,gBAC5B,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,kBAAkB;AAAA,eAC/C,CAAA;AACD,cAAA,IAAI,CAAC,KAAA,CAAM,EAAA,EAAI,MAAM,GAAA;AACrB,cAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,IAAA,EAAK;AAKnC,cAAA,MAAM,gBAAgB,SAAA,CAAU,OAAA,GAAU,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAClE,cAAA,IAAI,CAAC,aAAA,CAAc,IAAA,EAAK,EAAG,MAAM,GAAA;AACjC,cAAA,OAAO;AAAA,gBACL,OAAA,EAAS,aAAA;AAAA,gBACT,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,QAAA,CAAS,KAAA;AAAA,gBACnC,UAAU,QAAA,CAAS,KAAA;AAAA,gBACnB,QAAA,EAAU,SAAS,KAAA,EAAM;AAAA,gBACzB,OAAO,SAAA,CAAU,KAAA;AAAA,gBACjB,YAAA,EAAc,SAAA,CAAU,OAAA,GAAU,CAAC,CAAA,EAAG;AAAA,eACxC;AAAA,YACF;AACA,YAAA,IAAI,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,EAAG;AAClC,cAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,GAAI,CAAC,CAAA;AAC5C,cAAA,MAAM,QAAQ,MAAM,KAAA,CAAM,CAAA,EAAG,QAAA,CAAS,OAAO,CAAA,iBAAA,CAAA,EAAqB;AAAA,gBAChE,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,kBAAkB,CAAA;AAAA,gBAC9C,MAAA,EAAQ,MAAA;AAAA,gBACR,OAAA,EAAS;AAAA,kBACP,cAAA,EAAgB,kBAAA;AAAA,kBAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA;AAAA,iBAC5C;AAAA,gBACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,kBACnB,OAAO,QAAA,CAAS,KAAA;AAAA,kBAChB,QAAA;AAAA,kBACA,WAAA;AAAA,kBACA,UAAA,EAAY;AAAA,iBACb;AAAA,eACF,CAAA;AACD,cAAA,IAAI,CAAC,KAAA,CAAM,EAAA,EAAI,MAAM,GAAA;AACrB,cAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,IAAA,EAAK;AAKnC,cAAA,MAAM,eAAe,SAAA,CAAU,OAAA,GAAU,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AACjE,cAAA,OAAO;AAAA,gBACL,OAAA,EAAS,YAAA;AAAA,gBACT,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,QAAA,CAAS,KAAA;AAAA,gBACnC,UAAU,QAAA,CAAS,KAAA;AAAA,gBACnB,QAAA,EAAU,SAAS,KAAA,EAAM;AAAA,gBACzB,OAAO,SAAA,CAAU,KAAA;AAAA,gBACjB,YAAA,EAAc,SAAA,CAAU,OAAA,GAAU,CAAC,CAAA,EAAG;AAAA,eACxC;AAAA,YACF;AACA,YAAA,MAAM,GAAA;AAAA,UACR;AACA,UAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAKjC,UAAA,MAAM,eAAgB,IAAA,CAAyD,KAAA;AAC/E,UAAA,IAAI,YAAA,EAAc;AAGhB,YAAA,MAAM,IAAI,cAAA,CAAe,GAAA,GAAM,QAAA,CAAS,KAAA,GAAQ,mBAAA,IAAuB,YAAA,CAAa,IAAA,IAAQ,EAAA,CAAA,GAAM,IAAA,IAAQ,YAAA,CAAa,OAAA,IAAW,SAAA,CAAU,CAAA;AAAA,UAC9I;AACA,UAAA,MAAM,UAAU,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AACvD,UAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG;AAGnB,YAAA,MAAM,IAAI,cAAA,CAAe,GAAA,GAAM,QAAA,CAAS,QAAQ,6BAA6B,CAAA;AAAA,UAC/E;AACA,UAAA,OAAO;AAAA,YACL,OAAA;AAAA,YACA,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,QAAA,CAAS,KAAA;AAAA,YAC9B,UAAU,QAAA,CAAS,KAAA;AAAA,YACnB,QAAA,EAAU,SAAS,KAAA,EAAM;AAAA,YACzB,OAAO,IAAA,CAAK,KAAA;AAAA,YACZ,YAAA,EAAc,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA,EAAG;AAAA,WACnC;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,UAAA,QAAA,CAAS,KAAK,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACzC,UAAA,SAAA,GAAY,GAAA,YAAe,cAAA,GAAiB,GAAA,GAAM,IAAI,cAAA,CAAe,IAAI,QAAA,CAAS,KAAK,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAAA,QAEnG;AAAA,MACF;AACE,MAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC9B,MAAA,MAAM,SAAA,IAAa,IAAI,cAAA,CAAe,yCAAyC,CAAA;AAAA,IACjF;AACA,IAAA,MAAM,SAAA,IAAa,IAAI,cAAA,CAAe,iCAAA,GAAoC,mBAAmB,UAAU,CAAA;AAAA,EACzG;AAEA,EAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AACvB;AAKO,SAAS,iBAAiB,IAAA,EAAuC;AAEtE,EAAA,IAAI,OAAA,GAAU,KAAK,IAAA,EAAK;AACxB,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,IAAA,OAAA,GAAU,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,EAC3B,CAAA,MAAA,IAAW,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AACpC,IAAA,OAAA,GAAU,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EAC/B;AACA,EAAA,OAAA,GAAU,QAAQ,IAAA,EAAK;AAEvB,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACjC,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,QAAA,GAAW,KAAA;AACf,MAAA,IAAI,MAAA,GAAS,KAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC3C,QAAA,MAAM,EAAA,GAAK,QAAQ,CAAC,CAAA;AACpB,QAAA,IAAI,MAAA,EAAQ;AAAE,UAAA,MAAA,GAAS,KAAA;AAAO,UAAA;AAAA,QAAU;AACxC,QAAA,IAAI,OAAO,IAAA,EAAM;AAAE,UAAA,MAAA,GAAS,IAAA;AAAM,UAAA;AAAA,QAAU;AAC5C,QAAA,IAAI,OAAO,GAAA,EAAK;AAAE,UAAA,QAAA,GAAW,CAAC,QAAA;AAAU,UAAA;AAAA,QAAU;AAClD,QAAA,IAAI,QAAA,EAAU;AACd,QAAA,IAAI,OAAO,GAAA,EAAK,KAAA,EAAA;AAChB,QAAA,IAAI,OAAO,GAAA,EAAK;AACd,UAAA,KAAA,EAAA;AACA,UAAA,IAAI,UAAU,CAAA,EAAG;AACf,YAAA,IAAI;AACF,cAAA,OAAO,KAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,KAAA,EAAO,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,YAC/C,CAAA,CAAA,MAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,IAAI,eAAe,CAAA,wCAAA,EAA2C,OAAA,CAAQ,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EAC7F;AACF;AAKA,eAAsB,WAAA,CACpB,MAAA,EACA,YAAA,EACA,UAAA,EACA,OAAA,EACkC;AAClC,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA;AAAA,IAC1B;AAAA,MACE,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,YAAA,EAAa;AAAA,MACxC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,UAAA;AAAW,KACtC;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,gBAAA,CAAiB,OAAO,OAAO,CAAA;AACxC;;;AC5VA,eAAsB,gBAAgB,OAAA,EAA0D;AAC9F,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,WAAU,GAAI,OAAA;AACjD,EAAA,MAAM,MAAA,GAAS,gBAAgB,SAAS,CAAA;AACxC,EAAA,MAAM,cAAc,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,GAAI,SAAA;AAEhE,EAAA,MAAM,YAAA,GACJ,4iDAAA;AAsBF,EAAA,MAAM,UAAA,GACJ,aAAa,IAAI;AAAA,YAAA,EACA,SAAS;;AAAA;AAAA,EAErB,WAAW;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA4BlB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,MAAA,EAAQ,cAAc,UAAA,EAAY;AAAA,MACjE,WAAA,EAAa,GAAA;AAAA,MACb,WAAW,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,SAAS,EAAE;AAAA,KAChE,CAAA;AAED,IAAA,MAAM,OAAO,MAAA,CAAO,OAAA;AACpB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAClE,MAAA,OAAA,CAAQ,KAAK,0DAAqD,CAAA;AAClE,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,QAAS,IAAA,CAAK,KAAA,CAAoC,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,MACrE,EAAA,EAAI,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,MAChB,UAAU,CAAA,GAAI,CAAA;AAAA,MACd,MAAM,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAA,KAAA,EAAQ,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACtC,WAAA,EAAa,MAAA,CAAO,CAAA,CAAE,WAAA,IAAe,EAAE,CAAA;AAAA,MACvC,KAAA,EAAO,MAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA,GAAI,CAAA,CAAE,QAAQ,EAAC;AAAA,MAC3C,SAAA,EAAW,MAAM,OAAA,CAAQ,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA,CAAE,YAAY,EAAC;AAAA,MACvD,QAAA,EAAU,MAAM,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAA,GAAI,CAAA,CAAE,WAAW,EAAC;AAAA,MACpD,gBAAA,EAAkB,MAAA;AAAA,MAClB,QAAA,EAAU,MAAA,CAAO,CAAA,CAAE,QAAA,IAAY,KAAK,CAAA;AAAA,MACpC,MAAA,EAAQ,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,EAAE,CAAA;AAAA,MAC7B,OAAA,EAAS,EAAE,OAAA,IAAW,OAAO,EAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAA2D,KAAA,CAAA;AAAA,MACnH,UAAA,EAAY,MAAM,OAAA,CAAQ,CAAA,CAAE,UAAU,CAAA,GAAI,CAAA,CAAE,aAAa,EAAC;AAAA,MAC1D,MAAA,EAAQ,EAAE,MAAA,IAAU,OAAO,EAAE,MAAA,KAAW,QAAA,GAAW,EAAE,MAAA,GAAmF,KAAA,CAAA;AAAA,MACxI,iBAAiB,EAAC;AAAA,MAClB,eAAe;AAAC,KAClB,CAAE,CAAA;AAEF,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,oBAAoB,CAAA;AAAA,MAC9C,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,WAAA,IAAe,EAAE,CAAA;AAAA,MAC1C,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,QAAA,IAAY,KAAK,CAAA;AAAA,MACvC;AAAA,KACF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAAmC,GAAG,CAAA,CAAE,CAAA;AACtD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC1GA,SAAS,gBAAgB,eAAA,EAA8C;AACrE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,OAAO,CAAA,IAAK,eAAA,EAAiB;AAChD,IAAA,MAAA,CAAO,IAAA,CAAK,aAAa,OAAO;AAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,MAAA,CAAO,KAAK,MAAM,CAAA;AAC3B;AAMA,eAAsB,uBAAuB,OAAA,EAAmE;AAC9G,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,eAAA,EAAiB,WAAA,EAAa,WAAU,GAAI,OAAA;AAClF,EAAA,MAAM,MAAA,GAAS,gBAAgB,SAAS,CAAA;AAExC,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,QAAA,CAC7B,MAAA,CAAO,SAAO,GAAA,CAAI,YAAY,CAAA,CAC9B,GAAA,CAAI,SAAO,GAAA,CAAI,IAAI,CAAA,CACnB,KAAA,CAAM,GAAG,GAAI,CAAA;AAEhB,EAAA,MAAM,WAAA,GAAc,gBAAgB,eAAe,CAAA;AAGnD,EAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,EAAA,IAAI,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACzC,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,GAAA;AAAA,MAAI,QAC3C,CAAA,EAAA,EAAK,EAAA,CAAG,OAAO,CAAA,OAAA,EAAU,GAAG,MAAM,CAAA,CAAA;AAAA,KACpC;AACA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,cAAA,GACE,yFAAA,GACE,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GACjB,IAAA;AAAA,IAEN;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GACJ,05BAAA;AAcF,EAAA,MAAM,UAAA,GAAa,aAAa,IAAI;AAAA,YAAA,EACxB,SAAS;AAAA,EACrB,cAAc;AAAA;AAAA,EAEd,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,IAAA,EAAM,CAAC,CAAC;;AAAA;AAAA,EAGpC,WAAW;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AA6BX,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,MAAA,EAAQ,cAAc,UAAA,EAAY;AAAA,IACjE,WAAA,EAAa,GAAA;AAAA,IACb,WAAW,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,SAAS,EAAE;AAAA,GAChE,CAAA;AAGD,EAAA,MAAM,OAAO,MAAA,CAAO,OAAA;AACpB,EAAA,IAAI,QAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,kBAAkB,CAAA,EAAG;AACnD,IAAA,IAAA,CAAK,qBAAqB,EAAC;AAAA,EAC7B;AAEA,EAAA,OAAO,MAAA;AACT;;;ACpGA,SAASC,iBAAgB,eAAA,EAA8C;AACrE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,OAAO,CAAA,IAAK,eAAA,EAAiB;AAChD,IAAA,MAAA,CAAO,IAAA,CAAK,aAAa,OAAO;AAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,MAAA,CAAO,KAAK,MAAM,CAAA;AAC3B;AAKA,eAAsB,oBAAoB,OAAA,EAA+C;AACvF,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,eAAA,EAAiB,OAAA,EAAS,WAAU,GAAI,OAAA;AAC9E,EAAA,MAAM,MAAA,GAAS,gBAAgB,SAAS,CAAA;AAExC,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,QAAA,CAC7B,MAAA,CAAO,SAAO,GAAA,CAAI,YAAY,CAAA,CAC9B,GAAA,CAAI,SAAO,GAAA,CAAI,IAAI,CAAA,CACnB,KAAA,CAAM,GAAG,GAAI,CAAA;AAEhB,EAAA,MAAM,WAAA,GAAcA,iBAAgB,eAAe,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,QAAQ,EAAA,IAAM,OAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,QAAQ,IAAA,IAAQ,GAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,IAAe,EAAA;AAErC,EAAA,MAAM,YAAA,GACJ,izBAAA;AAgBF,EAAA,MAAM,UAAA,GAAa,aAAa,IAAI;AAAA,YAAA,EACxB,SAAS;;AAAA,kBAAA,EAEH,GAAG,WAAM,KAAK;AAAA,qBAAA,EACX,KAAK;;AAAA;AAAA,EAG1B,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC;;AAAA;AAAA,EAG3B,WAAW;;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAME,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAgBhB,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,MAAA,EAAQ,cAAc,UAAA,EAAY;AAAA,IACjE,WAAA,EAAa,GAAA;AAAA,IACb,WAAW,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,SAAS,EAAE;AAAA,GAChE,CAAA;AAED,EAAA,MAAM,QAAA,GAAY,MAAA,CAAO,KAAA,IAAS,EAAC;AAEnC,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,SAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA,IAAK,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,GAAW,QAAA;AAC1H,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,OAAA,CAAQ,KAAK,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA,WAAA,EAAc,GAAG,CAAA,cAAA,CAAgB,CAAA;AAAA,EACtF,CAAA,MAAA,IAAW,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gCAAA,EAAmC,GAAG,CAAA,CAAE,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO;AAAA,IACjC,EAAA,EAAI,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IACpB,UAAU,CAAA,GAAI,CAAA;AAAA,IACd,MAAM,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAA,KAAA,EAAQ,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACtC,WAAA,EAAa,MAAA,CAAO,CAAA,CAAE,WAAA,IAAe,EAAE,CAAA;AAAA,IACvC,KAAA,EAAO,MAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA,GAAI,CAAA,CAAE,QAAoB,EAAC;AAAA,IACvD,SAAA,EAAW,MAAM,OAAA,CAAQ,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA,CAAE,YAAwB,EAAC;AAAA,IACnE,QAAA,EAAU,MAAM,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAA,GAAI,CAAA,CAAE,WAAuB,EAAC;AAAA,IAChE,gBAAA,EAAmB,MAAA,CAAO,CAAA,CAAE,gBAAA,IAAoB,KAAK,CAAA;AAAA,IACrD,UAAU,MAAA,CAAO,CAAA,CAAE,QAAA,IAAY,OAAA,CAAQ,YAAY,KAAK,CAAA;AAAA,IACxD,MAAA,EAAQ,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,EAAE,CAAA;AAAA,IAC7B,SAAS,CAAA,CAAE,OAAA;AAAA,IACX,UAAA,EAAY,MAAM,OAAA,CAAQ,CAAA,CAAE,UAAU,CAAA,GAAI,CAAA,CAAE,aAAyB,EAAC;AAAA,IACtE,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,iBAAiB,EAAC;AAAA,IAClB,eAAe;AAAC,GAClB,CAAE,CAAA;AACJ;AAKA,eAAsB,2BACpB,IAAA,EACA,SAAA,EACA,WAAA,EACA,eAAA,EACA,cACA,SAAA,EAC8B;AAC9B,EAAA,MAAM,MAAA,GAAS,gBAAgB,SAAS,CAAA;AAExC,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,QAAA,CAC7B,MAAA,CAAO,SAAO,GAAA,CAAI,YAAY,CAAA,CAC9B,GAAA,CAAI,SAAO,GAAA,CAAI,IAAI,CAAA,CACnB,KAAA,CAAM,GAAG,GAAI,CAAA;AAEhB,EAAA,MAAM,UAAA,GAAaA,iBAAgB,eAAe,CAAA;AAElD,EAAA,MAAM,kBAAkB,YAAA,CAAa,GAAA;AAAA,IAAI,CAAA,CAAA,KACvC,CAAA,EAAA,EAAK,CAAA,CAAE,EAAA,IAAM,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,QAAA,EAAM,CAAA,CAAE,WAAA,IAAe,EAAE,CAAA;AAAA,GAC7D,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,MAAM,YAAA,GACJ,4cAAA;AAUF,EAAA,MAAM,UAAA,GAAa,aAAa,IAAI;AAAA,YAAA,EACxB,SAAS;;AAAA;AAAA,EAGrB,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC;;AAAA;AAAA,EAG3B,UAAU;;AAAA;AAAA,EAGV,eAAe;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AA6Bf,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,MAAA,EAAQ,cAAc,UAAA,EAAY;AAAA,IACjE,WAAA,EAAa,GAAA;AAAA,IACb,WAAW,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,SAAS,EAAE;AAAA,GAChE,CAAA;AAED,EAAA,MAAM,YAAY,MAAA,CAAO,KAAA;AACzB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AAEvC,EAAA,IAAI,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,EAAU;AAC9C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACvD,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC9B,MAAA,MAAM,WAAW,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,GAAG,CAAA;AACpD,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,QACpC,EAAA,EAAI,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QACpB,UAAU,CAAA,GAAI,CAAA;AAAA,QACd,MAAM,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAA,KAAA,EAAQ,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA;AAAA,QACtC,WAAA,EAAa,MAAA,CAAO,CAAA,CAAE,WAAA,IAAe,EAAE,CAAA;AAAA,QACvC,KAAA,EAAO,MAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA,GAAI,CAAA,CAAE,QAAoB,EAAC;AAAA,QACvD,SAAA,EAAW,MAAM,OAAA,CAAQ,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA,CAAE,YAAwB,EAAC;AAAA,QACnE,QAAA,EAAU,MAAM,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAA,GAAI,CAAA,CAAE,WAAuB,EAAC;AAAA,QAChE,gBAAA,EAAmB,MAAA,CAAO,CAAA,CAAE,gBAAA,IAAoB,KAAK,CAAA;AAAA,QACrD,UAAU,MAAA,CAAO,CAAA,CAAE,QAAA,IAAY,QAAA,EAAU,YAAY,KAAK,CAAA;AAAA,QAC1D,MAAA,EAAQ,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,EAAE,CAAA;AAAA,QAC7B,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,UAAA,EAAY,MAAM,OAAA,CAAQ,CAAA,CAAE,UAAU,CAAA,GAAI,CAAA,CAAE,aAAyB,EAAC;AAAA,QACtE,QAAQ,CAAA,CAAE,MAAA;AAAA,QACd,iBAAiB,EAAC;AAAA,QAClB,eAAe;AAAC,OACd,CAAE,CAAA;AACF,MAAA,MAAA,CAAO,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AC/MO,SAAS,kBAAA,CACd,cACA,OAAA,EAC0D;AAC1D,EAAA,MAAM,EAAE,WAAA,EAAa,eAAA,EAAgB,GAAI,OAAA;AACzC,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,WAAA,CAAY,SAAS,GAAA,CAAI,CAAA,GAAA,KAAO,GAAA,CAAI,IAAI,CAAC,CAAA;AACrE,EAAA,MAAM,iBAAkC,EAAC;AAEzC,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,IAAY,EAAC;AAE3C,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,GAAA,GAAM,QAAQ,EAAA,IAAM,OAAA;AAC1B,IAAA,MAAM,eAAe,GAAA,KAAQ,IAAA;AAE7B,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AACtC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,EAAA,IAAM,CAAA,EAAG,GAAG,CAAA,KAAA,CAAA;AAG7B,MAAA,MAAM,aAAuB,EAAC;AAC9B,MAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG;AAChC,QAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,EAAG;AAC1B,UAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,QACnB,CAAA,MAAO;AACL,UAAA,cAAA,CAAe,IAAA,CAAK;AAAA,YAClB,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA;AAAA,YACN,UAAA,EAAY,GAAA;AAAA,YACZ,OAAA,EAAS,GAAA;AAAA,YACT,MAAA,EAAQ,SAAS,CAAC,CAAA,yBAAA;AAAA,WACnB,CAAA;AAAA,QACH;AAAA,MACF;AACA,MAAA,IAAA,CAAK,KAAA,GAAQ,UAAA;AAGb,MAAA,MAAM,YAAsB,EAAC;AAC7B,MAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG;AACtC,QAAA,IAAI,YAAY,IAAA,KAAS,CAAA,IAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AAClD,UAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,QACpB,CAAA,MAAO;AACL,UAAA,cAAA,CAAe,IAAA,CAAK;AAAA,YAClB,IAAA,EAAM,KAAA;AAAA,YACN,IAAA,EAAM,GAAA;AAAA,YACN,UAAA,EAAY,GAAA;AAAA,YACZ,OAAA,EAAS,GAAA;AAAA,YACT,MAAA,EAAQ,QAAQ,GAAG,CAAA,4BAAA;AAAA,WACpB,CAAA;AAAA,QACH;AAAA,MACF;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAGjB,MAAA,IAAI,YAAA,EAAc;AAElB,MAAA,MAAM,WAAqB,EAAC;AAC5B,MAAA,KAAA,MAAW,EAAA,IAAM,IAAA,CAAK,QAAA,IAAY,EAAC,EAAG;AACpC,QAAA,MAAM,KAAA,GAAQ,GAAG,WAAA,EAAY;AAG7B,QAAA,MAAM,YAAA,GAAe,CAAC,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA;AACxC,QAAA,IAAI,KAAA,GAAQ,KAAA;AAEZ,QAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,UAAA,MAAM,WAAW,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,IAAK,IAAI,WAAA,EAAY;AAC3D,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,GAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAC,CAAA,GAAA,CAAK,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA;AAAA,UAC1F,CAAA,MAAO;AACL,YAAA,KAAA,GAAQ,OAAA,CAAQ,SAAS,KAAK,CAAA;AAAA,UAChC;AACA,UAAA,IAAI,KAAA,EAAO;AAAA,QACb;AAEA,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,KAAA,MAAW,OAAA,IAAW,eAAA,CAAgB,MAAA,EAAO,EAAG;AAC9C,YAAA,MAAM,EAAA,GAAK,QAAQ,WAAA,EAAY;AAC/B,YAAA,IAAI,YAAA,EAAc;AAChB,cAAA,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,GAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAC,CAAA,GAAA,CAAK,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,YACrF,CAAA,MAAO;AACL,cAAA,KAAA,GAAQ,EAAA,CAAG,SAAS,KAAK,CAAA;AAAA,YAC3B;AACA,YAAA,IAAI,KAAA,EAAO;AAAA,UACb;AAAA,QACF;AAEA,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,QAClB,CAAA,MAAO;AACL,UAAA,cAAA,CAAe,IAAA,CAAK;AAAA,YAClB,IAAA,EAAM,SAAA;AAAA,YACN,IAAA,EAAM,EAAA;AAAA,YACN,UAAA,EAAY,GAAA;AAAA,YACZ,OAAA,EAAS,GAAA;AAAA,YACT,MAAA,EAAQ,YAAY,EAAE,CAAA,2BAAA;AAAA,WACvB,CAAA;AAAA,QACH;AAAA,MACF;AACA,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,YAAA,EAAc,cAAA,EAAe;AAC/C;;;AChGA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,IAAI,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAClC,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,oBAAA,EAAsB,OAAO,CAAA;AAC3C,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA;AAC5B,EAAA,MAAM,MAAM,CAAA,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,YAAY,EAAE,CAAA;AAClD,EAAA,OAAO,GAAA,IAAO,SAAA;AAChB;AAEA,SAAS,mBAAA,CAAoB,IAAA,EAAc,eAAA,EAAsC,WAAA,GAAc,CAAA,EAAa;AAC1G,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,OAAA,GAAU,KAAK,WAAA,EAAY;AACjC,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,OAAO,CAAA,IAAK,eAAA,EAAiB;AAChD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,KAAA,CAAM,QAAQ,GAAA,EAAA,EAAO;AAC3C,MAAA,IAAI,MAAM,GAAG,CAAA,CAAE,aAAY,CAAE,QAAA,CAAS,OAAO,CAAA,EAAG;AAC9C,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AACjC,QAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,MAAM,CAAC,CAAA;AAC1C,QAAA,IAAI,UAAU,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,GAAG,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACjF,QAAA,IAAI,OAAA,CAAQ,SAAS,GAAA,EAAK,OAAA,GAAU,QAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAC5D,QAAA,IAAI,SAAS,QAAA,CAAS,IAAA,CAAK,IAAI,OAAO,CAAA,GAAA,EAAM,OAAO,CAAA,CAAE,CAAA;AACrD,QAAA,IAAI,QAAA,CAAS,UAAU,WAAA,EAAa;AAAA,MACtC;AAAA,IACF;AACA,IAAA,IAAI,QAAA,CAAS,UAAU,WAAA,EAAa;AAAA,EACtC;AACA,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,qBAAA,CACP,SACA,eAAA,EACqD;AACrD,EAAA,MAAM,EAAA,GAAK,QAAQ,WAAA,EAAY;AAG/B,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,IAAA;AAAA;AAAA,IACA,WAAA;AAAA;AAAA,IACA,OAAA;AAAA;AAAA,IACA,aAAA;AAAA;AAAA,IACA,QAAA;AAAA;AAAA,IACA,UAAA;AAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,YAAY,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,CAAK,OAAO,CAAC,CAAA,EAAG;AAC1C,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,CAAA,SAAA,EAAY,OAAO,CAAA,kCAAA,CAAA,EAAqC;AAAA,EAC5F;AAGA,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,UAAA;AAAA,IAAY,WAAA;AAAA,IAAa,eAAA;AAAA,IAAiB,YAAA;AAAA,IAC1C,WAAA;AAAA,IAAa,YAAA;AAAA,IAAc,UAAA;AAAA,IAAY,WAAA;AAAA,IACvC,qBAAA;AAAA,IAAuB,cAAA;AAAA,IAAgB,UAAA;AAAA,IACvC,OAAA;AAAA,IAAS,MAAA;AAAA,IAAQ,OAAA;AAAA,IAAS,QAAA;AAAA,IAC1B,iBAAA;AAAA,IAAmB,gBAAA;AAAA,IACnB,cAAA;AAAA,IAAgB,UAAA;AAAA,IAAY;AAAA,GAC9B;AAEA,EAAA,IAAI,YAAY,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,CAAK,OAAO,CAAC,CAAA,EAAG;AAC1C,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,CAAA,SAAA,EAAY,OAAO,CAAA,gCAAA,CAAA,EAAmC;AAAA,EAC1F;AAGA,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,oBAAA;AAAA,IAAsB,eAAA;AAAA,IAAiB,sBAAA;AAAA,IACvC,aAAA;AAAA,IAAe,QAAA;AAAA,IAAU,WAAA;AAAA,IAAa,eAAA;AAAA,IACtC,WAAA;AAAA,IAAa,gBAAA;AAAA,IAAkB;AAAA,GACjC;AAEA,EAAA,IAAI,YAAY,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,CAAK,OAAO,CAAC,CAAA,EAAG;AAC1C,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,CAAA,SAAA,EAAY,OAAO,CAAA,wCAAA,CAAA,EAA2C;AAAA,EAClG;AAGA,EAAA,KAAA,MAAW,OAAA,IAAW,eAAA,CAAgB,MAAA,EAAO,EAAG;AAC9C,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,EAAE,CAAA,EAAG;AACnC,QAAA,IAAI,sCAAA,CAAuC,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAC5D,UAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,CAAA,SAAA,EAAY,OAAO,CAAA,2BAAA,CAAA,EAA8B;AAAA,QACrF;AACA,QAAA,IAAI,qBAAA,CAAsB,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAC3C,UAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,CAAA,SAAA,EAAY,OAAO,CAAA,sBAAA,CAAA,EAAyB;AAAA,QAChF;AAEA,QAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,CAAA,SAAA,EAAY,OAAO,CAAA,6BAAA,CAAA,EAAgC;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,CAAA,mBAAA,EAAsB,OAAO,CAAA,+BAAA,CAAA,EAAkC;AACnG;AAKA,eAAsB,uBACpB,OAAA,EACwC;AACxC,EAAA,MAAM,EAAE,YAAA,EAAc,eAAA,EAAiB,iBAAA,EAAmB,kBAAA,EAAoB,WAAU,GAAI,OAAA;AAE5F,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,IAAY,EAAC;AAG3C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AACtC,MAAA,KAAA,MAAW,OAAO,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,QAAA,CAAS,IAAI,GAAG,CAAA;AACxD,MAAA,KAAA,MAAW,MAAM,IAAA,CAAK,QAAA,IAAY,EAAC,EAAG,QAAA,CAAS,IAAI,EAAE,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,CAAS,IAAA,KAAS,CAAA,EAAG,2BAAW,GAAA,EAAI;AAExC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,QAAQ,EAAE,IAAA,EAAK;AAC3C,EAAA,IAAI,aAA+F,EAAC;AAEpG,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,UAAA,GAAa,kBAAA;AAAA,EACf,CAAA,MAAO;AACL,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,gBAAgB,SAAS,CAAA;AACxC,MAAA,MAAM,WAAA,GAAA,CAAe,qBAAqB,EAAC,EAAG,MAAK,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,SAAA;AAEnE,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,CAAA,IAAA,KAAQ;AACvC,QAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,IAAA,EAAM,eAAe,CAAA;AAC1D,QAAA,OAAO,QAAA,CAAS,MAAA,GAAS,CAAA,GACrB,CAAA,EAAA,EAAK,IAAI,CAAA,iBAAA,EAAoB,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA,CAAA,GACxC,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA;AAAA,MACf,CAAC,CAAA;AAED,MAAA,MAAM,YAAA,GACJ,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,iBAAA,EAasB,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,IAAK,CAAC;AAAA;AAAA,+GAAA,CAAA;AAKnD,MAAA,MAAM,UAAA,GACJ,2IAAA,GAEE,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,GACrB,qHAAA;AAGJ,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,MAAA,EAAQ,cAAc,UAAA,EAAY;AAAA,QACjE,WAAA,EAAa,GAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACZ,CAAA;AAED,MAAA,UAAA,GAAc,MAAA,CAAO,WAAW,EAAC;AAAA,IACnC,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,sCAAA,EAAyC,GAAG,CAAA,iCAAA,CAAmC,CAAA;AAAA,IAC9F;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAA8B;AAE1D,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,GAAA,GAAM,QAAQ,EAAA,IAAM,OAAA;AAC1B,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AACtC,MAAA,KAAA,MAAW,KAAK,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,GAAI,OAAA,CAAQ,SAAA,IAAa,EAAC;AAAA,MAC1B,IAAI,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG,OAAA,CAAQ,OAAK,CAAC,GAAI,CAAA,CAAE,SAAA,IAAa,EAAC,EAAI,GAAI,EAAE,QAAA,IAAY,EAAG,CAAC;AAAA,KACvF;AAEA,IAAA,MAAM,QAA0B,EAAC;AACjC,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,EAAE,CAAA,IAAK,EAAC;AAChC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,IAAgB,YAAA,CAAa,EAAE,CAAA;AAClD,MAAA,MAAM,KAAA,GAAQ,KAAK,YAAA,IAAgB,EAAA;AAGnC,MAAA,IAAI,KAAA,GAA+B,KAAA;AACnC,MAAA,IAAI,cAAA,GAAiB,cAAA;AAErB,MAAA,IAAI,IAAA,CAAK,KAAA,IAAS,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,EAAG;AAC5D,QAAA,KAAA,GAAQ,IAAA,CAAK,KAAA;AACb,QAAA,cAAA,GAAiB,qBAAqB,KAAK,CAAA,CAAA;AAAA,MAC7C,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,EAAA,EAAI,eAAe,CAAA;AAC1D,QAAA,KAAA,GAAQ,QAAA,CAAS,KAAA;AACjB,QAAA,cAAA,GAAiB,QAAA,CAAS,SAAA;AAAA,MAC5B;AAGA,MAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA;AAC7B,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAGd,MAAA,MAAM,gBAA0B,EAAC;AACjC,MAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,QAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,IAAK,EAAA;AAC1C,QAAA,IAAI,QAAQ,WAAA,EAAY,CAAE,SAAS,EAAA,CAAG,WAAA,EAAa,CAAA,EAAG;AACpD,UAAA,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,QACtB;AAAA,MACF;AAEA,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,YAAA,EAAc,KAAA;AAAA,QACd,YAAA,EAAc,KAAA;AAAA,QACd,OAAA,EAAS,EAAA;AAAA,QACT,KAAA;AAAA,QACA,eAAA,EAAiB,cAAA;AAAA,QACjB,cAAA,EAAgB;AAAA,OACjB,CAAA;AAAA,IACH;AAEA,IAAA,eAAA,CAAgB,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO,eAAA;AACT;;;ACrMA,IAAM,iBAAA,GAA4C;AAAA,EAChD,SAAA,EAAW,IAAA;AAAA,EACX,kBAAA,EAAoB,IAAA;AAAA,EACpB,MAAA,EAAQ,GAAA;AAAA,EACR,gBAAA,EAAkB,IAAA;AAAA,EAClB,kBAAA,EAAoB,IAAA;AAAA,EACpB,MAAA,EAAQ,GAAA;AAAA,EACR,gBAAA,EAAkB,IAAA;AAAA,EAClB,cAAA,EAAgB,GAAA;AAAA,EAChB,MAAA,EAAQ,GAAA;AAAA,EACR,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,iBAAA,GAAoB,IAAA;AAkB1B,SAAS,gBAAA,CACP,KAAA,EACA,KAAA,EACA,WAAA,EACQ;AACR,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,KAAA,CAAM,aAAY,CAAE,KAAA,CAAM,KAAK,CAAC,CAAA;AAG3D,EAAA,IAAI,UAAA,GAAa,EAAA;AACjB,EAAA,IAAI,UAAU,KAAA,EAAO;AAEnB,IAAA,UAAA,GAAa,YAAY,QAAA,IAAY,EAAA;AAAA,EACvC,CAAA,MAAA,IAAW,UAAU,KAAA,EAAO;AAE1B,IAAA,UAAA,GAAa,CAAC,YAAY,WAAA,IAAe,EAAA,EAAI,YAAY,GAAA,IAAO,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,EAC9E,CAAA,MAAO;AAEL,IAAA,UAAA,GAAa,CAAC,YAAY,GAAA,IAAO,EAAA,EAAI,YAAY,WAAA,IAAe,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,EAC9E;AAEA,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,UAAA,CAAW,aAAY,CAAE,KAAA,CAAM,KAAK,CAAC,CAAA;AACjE,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,IAAQ,CAAC,WAAA,CAAY,MAAM,OAAO,CAAA;AAElD,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,EAAG,OAAA,EAAA;AAAA,EAC1B;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,UAAA,CAAW,MAAM,CAAG,CAAA;AAChD;AAGA,SAAS,oBAAoB,IAAA,EAAwB;AACnD,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AACnC,EAAA,MAAM,aAAA,GAA0C;AAAA,IAC9C,GAAA,EAAK,CAAC,WAAA,EAAa,UAAA,EAAY,eAAe,MAAA,EAAQ,SAAA,EAAW,SAAS,KAAK,CAAA;AAAA,IAC/E,KAAK,CAAC,MAAA,EAAQ,YAAY,SAAA,EAAW,OAAA,EAAS,OAAO,WAAW,CAAA;AAAA,IAChE,KAAK,CAAC,SAAA,EAAW,YAAY,QAAA,EAAU,QAAA,EAAU,OAAO,MAAM,CAAA;AAAA,IAC9D,KAAK,CAAC,MAAA,EAAQ,aAAa,IAAA,EAAM,IAAA,EAAM,eAAe,QAAQ,CAAA;AAAA,IAC9D,KAAK,CAAC,QAAA,EAAU,OAAO,SAAA,EAAW,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,IAC9D,KAAK,CAAC,KAAA,EAAO,QAAQ,KAAA,EAAO,YAAA,EAAc,SAAS,KAAK;AAAA,GAC1D;AAEA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AAC5D,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,CAAA,EAAA,KAAM,SAAA,CAAU,QAAA,CAAS,EAAE,CAAC,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,CAAC,KAAK,CAAA;AAC9C;AAKA,SAAS,qBAAqB,MAAA,EAAuC;AACnE,EAAA,MAAM,UAAA,GAAa,CAAC,WAAA,EAAa,QAAA,EAAU,sBAAsB,iBAAiB,CAAA;AAClF,EAAA,MAAM,UAAA,GAAa,CAAC,kBAAA,EAAoB,oBAAA,EAAsB,QAAQ,CAAA;AAEtE,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,KAAA;AACxC,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,KAAA;AACxC,EAAA,OAAO,KAAA;AACT;AAKA,eAAsB,gBACpB,OAAA,EACgC;AAChC,EAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAM,UAAA,EAAY,cAAA,EAAgB,OAAO,CAAA,EAAG,SAAA,GAAY,iBAA6B,CAAA,GAAI,OAAA;AAE3G,EAAuB,oBAAoB,IAAI;AAC/C,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,CAAK,UAAA,IAAc,EAAE,CAAA,CAAE,MAAA,GAAS,CAAA,IAC3D,MAAA,CAAO,MAAA,CAAO,cAAc,EAAE,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,SAAA,IAAa,CAAA,CAAE,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AACjF,EAAA,IAAI,WAAA,GAAc,gBAAgB,WAAA,GAAc,iBAAA;AAEhD,EAAA,MAAM,QAAA,GAAW,cAAc,EAAC;AAEhC,EAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,IAAA,MAAM,QAAQ,cAAA,EAAgB,GAAA,CAAI,OAAO,CAAA,IAAK,qBAAqB,MAAM,CAAA;AAGzE,IAAA,MAAM,SAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACnD,MAAA,MAAM,eAAA,GAAkB,KAAK,QAAA,IAAY,EAAA;AACzC,MAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,EAAA;AACxC,MAAA,MAAM,aAAc,IAAA,CAAiC,GAAA;AACrD,MAAA,MAAM,aAAc,IAAA,CAAiC,GAAA;AAGrD,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,OAAA,EAAS,KAAA,EAAO;AAAA,QAClD,QAAA,EAAU,eAAA;AAAA,QACV,WAAA,EAAa,WAAA;AAAA,QACb,GAAA,EAAK,UAAA;AAAA,QACL,GAAA,EAAK;AAAA,OACN,CAAA;AAGD,MAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,OAAA,CAAQ,aAAY,CAAE,KAAA,CAAM,KAAK,CAAC,CAAA;AAC7D,MAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI;AAAA,QACvB,GAAG,eAAA,CAAgB,WAAA,EAAY,CAAE,MAAM,KAAK,CAAA;AAAA,QAC5C,GAAG,WAAA,CAAY,WAAA,EAAY,CAAE,MAAM,KAAK,CAAA;AAAA,QACxC,IAAI,UAAA,IAAc,EAAA,EAAI,WAAA,EAAY,CAAE,MAAM,KAAK,CAAA;AAAA,QAC/C,IAAI,UAAA,IAAc,EAAA,EAAI,WAAA,EAAY,CAAE,MAAM,KAAK;AAAA,OACjD,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA;AACjB,MAAA,IAAI,YAAA,GAAe,CAAA;AACnB,MAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAAE,QAAA,IAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,YAAA,EAAA;AAAA,MAAgB;AACnE,MAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,IAAI,YAAA,GAAe,UAAA,CAAW,IAAA,EAAM,CAAG,CAAA,GAAI,CAAA;AAG5F,MAAA,MAAM,YAAY,UAAA,IAAc,aAAA;AAChC,MAAA,MAAM,UAAA,GAAa,YAAY,UAAA,GAAa,aAAA;AAE5C,MAAA,IAAI,aAAa,CAAA,EAAG;AAClB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA;AAAA,UACA,IAAA,EAAM,KAAK,IAAA,IAAQ,IAAA;AAAA,UACnB,WAAA,EAAa,WAAA;AAAA,UACb,QAAA,EAAU,eAAA;AAAA,UACV,GAAA,EAAK,UAAA;AAAA,UACL,GAAA,EAAK,UAAA;AAAA,UACL,KAAA,EAAO,UAAA;AAAA,UACP,aAAA,EAAe,YAAY,KAAA,GAAQ,KAAA;AAAA,UACnC,MAAA,EAAQ,iBAAiB,IAAA,CAAK,SAAA,IAAa,KAAK,SAAA,CAAU,MAAA,GAAS,IAAI,WAAA,GAAc;AAAA,SACtF,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AACvC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAEvC,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,OAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,MAAM,CAAA,IAAK,SAAA;AAClD,IAAA,MAAM,QAAA,GAAW,WAAW,CAAC,CAAA;AAE7B,IAAA,IAAI,QAAA,CAAS,SAAS,YAAA,EAAc;AAClC,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,OAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,aAAA,EAAe,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,IAAS,YAAY,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA;AAAA,QAC9E,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,OAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA,EAAY,QAAA;AAAA,QACZ,MAAA,EAAQ,mBAAmB,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAC,CAAC,MAAM,YAAY,CAAA,CAAA;AAAA,OACvE,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP,gBAAgB,QAAA,CAAS,MAAA;AAAA,MACzB,gBAAgB,QAAA,CAAS,MAAA;AAAA,MACzB,gBAAgB,QAAA,CAAS,MAAA;AAAA,MACzB;AAAA;AACF,GACF;AACF;;;AClNA,SAAS,iBAAA,CACP,YACA,cAAA,EACQ;AACR,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,UAAA,GAAa,cAAc,CAAA;AAC9C;AAQA,SAAS,0BAAA,CACP,OAAA,EACA,eAAA,EACA,UAAA,EACA,cAAA,EACsB;AACtB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,EAAC;AAChC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEhC,EAAA,MAAM,SAAA,GAAY,QAAQ,EAAA,IAAM,OAAA;AAGhC,EAAA,MAAMC,eAAc,KAAA,CAAM,GAAA,CAAI,OAAK,CAAA,CAAE,MAAA,EAAQ,qBAAqB,EAAE,CAAA;AACpE,EAAA,MAAM,eAAA,GAAkBA,aAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAG7D,EAAA,IAAI,iBAAA,CAAkB,eAAA,EAAiB,cAAc,CAAA,IAAK,UAAA,EAAY;AACpE,IAAA,OAAO,CAAC,eAAe,OAAA,EAAS,eAAA,EAAiB,OAAOA,YAAAA,EAAa,SAAA,EAAW,CAAC,CAAC,CAAA;AAAA,EACpF;AAGA,EAAA,MAAM,aAAmC,EAAC;AAC1C,EAAA,IAAI,eAAuB,EAAC;AAC5B,EAAA,IAAI,iBAA2B,EAAC;AAChC,EAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,MAAM,IAAA,GAAOA,aAAY,CAAC,CAAA;AAG1B,IAAA,MAAM,YAAA,GAAe,eAAe,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAC7D,IAAA,IAAI,iBAAA,CAAkB,eAAe,IAAA,EAAM,cAAc,IAAI,UAAA,IAAc,YAAA,CAAa,SAAS,CAAA,EAAG;AAElG,MAAA,UAAA,CAAW,IAAA,CAAK,cAAA;AAAA,QACd,OAAA;AAAA,QAAS,eAAA;AAAA,QAAiB,YAAA;AAAA,QAAc,cAAA;AAAA,QACxC,SAAA;AAAA,QAAW;AAAA,OACZ,CAAA;AACD,MAAA,cAAA,EAAA;AACA,MAAA,YAAA,GAAe,EAAC;AAChB,MAAA,cAAA,GAAiB,EAAC;AAAA,IACpB;AAEA,IAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AACtB,IAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,EAC1B;AAGA,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,UAAA,CAAW,IAAA,CAAK,cAAA;AAAA,MACd,OAAA;AAAA,MAAS,eAAA;AAAA,MAAiB,YAAA;AAAA,MAAc,cAAA;AAAA,MACxC,SAAA;AAAA,MAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,UAAA;AACT;AAMA,SAAS,eACP,OAAA,EACA,eAAA,EACA,KAAA,EACAA,YAAAA,EACA,WACA,cAAA,EACoB;AACpB,EAAA,MAAM,UAAA,GAAaA,aAAY,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACxD,EAAA,MAAM,SAAS,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,oBAAoB,KAAK,CAAA;AACzD,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,GAAI,WAChD,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GACzB,MAAA;AAGJ,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAY;AAC1C,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAY;AAC1C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,aAAA,IAAiB,EAAC;AAChD,IAAA,KAAA,MAAW,QAAQ,gBAAA,EAAkB;AACnC,MAAA,iBAAA,CAAkB,IAAI,IAAI,CAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,GAAI,IAAA,CAAK,QAAA,IAAY,EAAC,EAAI,GAAI,IAAA,CAAK,SAAA,IAAa,EAAG,CAAA;AACpE,IAAA,KAAA,MAAW,MAAM,eAAA,EAAiB;AAChC,MAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,EAAA,CAAG,OAAO,CAAA,EAAG;AAChC,QAAA,iBAAA,CAAkB,GAAA,CAAI,GAAG,YAAY,CAAA;AACrC,QAAA,iBAAA,CAAkB,GAAA,CAAI,GAAG,OAAO,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,cAAc,EAAE,GAAA,EAAK,GAAG,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,EAAE;AAC7C,EAAA,KAAA,MAAW,MAAM,eAAA,EAAiB;AAChC,IAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,EAAA,CAAG,OAAO,CAAA,EAAG;AACrC,MAAA,WAAA,CAAY,GAAG,KAAK,CAAA,EAAA;AAAA,IACtB;AAAA,EACF;AACA,EAAA,MAAM,aAAA,GACJ,WAAA,CAAY,GAAA,IAAO,WAAA,CAAY,OAAO,WAAA,CAAY,GAAA,IAAO,WAAA,CAAY,GAAA,GAAM,KAAA,GACzE,WAAA,CAAY,GAAA,IAAO,WAAA,CAAY,MAAM,KAAA,GACrC,KAAA;AAEJ,EAAA,OAAO;AAAA,IACL,IAAI,cAAA,KAAmB,CAAA,GAAI,YAAY,CAAA,EAAG,SAAS,KAAK,cAAc,CAAA,CAAA;AAAA,IACtE,IAAA,EAAM,cAAA,KAAmB,CAAA,GAAK,OAAA,CAAQ,IAAA,IAAQ,SAAA,GAAa,CAAA,EAAG,OAAA,CAAQ,IAAA,IAAQ,SAAS,CAAA,OAAA,EAAU,cAAc,CAAA,CAAA,CAAA;AAAA,IAC/G,WAAA,EAAa,QAAQ,WAAA,IAAe,EAAA;AAAA,IACpC,UAAA,EAAY,SAAA;AAAA,IACZ,YAAA,EAAc,QAAQ,IAAA,IAAQ,EAAA;AAAA,IAC9B,cAAc,CAAC,GAAG,iBAAiB,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IAC9C,KAAA,EAAO,aAAA;AAAA,IACP,cAAc,EAAC;AAAA,IACf,cAAc,EAAC;AAAA,IACf,uBAAuB,EAAC;AAAA,IACxB,KAAA;AAAA,IACA,iBAAA,EAAmB,UAAA;AAAA,IACnB,gBAAA,EAAkB,UAAA;AAAA;AAAA,IAClB,gBAAA,EAAkB;AAAA,GACpB;AACF;AAOA,SAAS,gBACP,eAAA,EACuB;AACvB,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsB;AACtC,EAAA,KAAA,MAAW,QAAA,IAAY,eAAA,CAAgB,MAAA,EAAO,EAAG;AAC/C,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,MAAM,WAAW,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,YAAY,KAAK,EAAC;AAC7C,MAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,CAAA,CAAE,OAAO,CAAA,EAAG;AACjC,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,OAAO,CAAA;AACvB,QAAA,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,YAAA,EAAc,QAAQ,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAKA,SAAS,0BAAA,CACP,YACA,UAAA,EACsB;AACtB,EAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAY;AAE3C,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAElC,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,IAAA,MAAM,YAAA,GAAe,SAAA,CAAU,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAc,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAClG,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,CAAI,IAAI,KAAK,EAAC;AACrC,MAAA,KAAA,MAAW,EAAA,IAAM,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAAA,IACpC;AAEA,IAAA,SAAA,CAAU,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,KAAK,EAAE,IAAA,EAAK;AAGhD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,EAAA,IAAM,UAAU,YAAA,EAAc;AACvC,MAAA,IAAI,kBAAA,CAAmB,GAAA,CAAI,EAAE,CAAA,EAAG;AAC9B,QAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,kBAAA,CAAmB,IAAI,EAAE,CAAA;AAAA,MAC3B;AAAA,IACF;AAEA,IAAA,SAAA,CAAU,YAAA,GAAe,KAAA;AACzB,IAAA,SAAA,CAAU,qBAAA,GAAwB,QAAA;AAAA,EACpC;AAEA,EAAA,OAAO,UAAA;AACT;AAOA,SAAS,eAAA,CACP,YACA,cAAA,EACkB;AAClB,EAAA,MAAM,SAA2B,EAAC;AAClC,EAAA,IAAI,oBAA0C,EAAC;AAC/C,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,mBAAmB,SAAA,CAAU,gBAAA;AAGnC,IAAA,IAAI,cAAA,GAAiB,gBAAA,GAAmB,cAAA,IAAkB,iBAAA,CAAkB,SAAS,CAAA,EAAG;AACtF,MAAA,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,iBAAA,EAAmB,QAAQ,CAAC,CAAA;AACnD,MAAA,QAAA,EAAA;AACA,MAAA,iBAAA,GAAoB,EAAC;AACrB,MAAA,cAAA,GAAiB,CAAA;AAAA,IACnB;AAEA,IAAA,iBAAA,CAAkB,KAAK,SAAS,CAAA;AAChC,IAAA,cAAA,IAAkB,gBAAA;AAAA,EACpB;AAGA,EAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,IAAA,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,iBAAA,EAAmB,QAAQ,CAAC,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAA,CAAW,YAAkC,QAAA,EAAkC;AACtF,EAAA,MAAM,YAAA,GAAe,WAAW,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,gBAAA,EAAkB,CAAC,CAAA;AAG9E,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,eAAe,CAAC,GAAG,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AACxC,EAAA,MAAM,WAAA,GAAc,aAAa,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,WAAA,EAAa,CAAA,CAAE,IAAA,CAAK,UAAK,CAAA;AAErE,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY,SAAS,QAAQ,CAAA,CAAA;AAAA,IAC7B,UAAA;AAAA,IACA,aAAA,EAAe,YAAA;AAAA,IACf,mBAAA,EAAqB;AAAA,GACvB;AACF;AAOO,SAAS,gBAAgB,OAAA,EAA4C;AAC1E,EAAA,MAAM;AAAA,IACJ,YAAA;AAAA,IACA,eAAA,uBAAsB,GAAA,EAAI;AAAA,IAC1B,cAAA,GAAiB,EAAA;AAAA,IACjB,cAAA,GAAiB,IAAA;AAAA,IACjB,mBAAA,GAAsB;AAAA,GACxB,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,IAAY,EAAC;AAC3C,EAAA,MAAM,UAAA,GAAa,gBAAgB,eAAe,CAAA;AAGlD,EAAA,MAAM,gBAAsC,EAAC;AAE7C,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,GAAA,GAAM,QAAQ,EAAA,IAAM,OAAA;AAC1B,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,GAAA,CAAI,GAAG,KAAK,EAAC;AAE/C,IAAA,MAAM,UAAA,GAAa,0BAAA;AAAA,MACjB,OAAA;AAAA,MACA,SAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,aAAA,CAAc,IAAA,CAAK,GAAG,UAAU,CAAA;AAAA,EAClC;AAGA,EAAA,KAAA,MAAW,aAAa,aAAA,EAAe;AACrC,IAAA,SAAA,CAAU,gBAAA,GAAmB,iBAAA,CAAkB,SAAA,CAAU,iBAAA,EAAmB,cAAc,CAAA;AAAA,EAC5F;AAGA,EAAA,0BAAA,CAA2B,eAAe,UAAU,CAAA;AAGpD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,aAAA,EAAe,cAAc,CAAA;AAG5D,EAAA,MAAM,qBAAA,GAAwB,cAAc,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,iBAAA,EAAmB,CAAC,CAAA;AAC3F,EAAA,MAAM,oBAAA,GAAuB,cAAc,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,gBAAA,EAAkB,CAAC,CAAA;AAEzF,EAAA,OAAO;AAAA,IACL,SAAS,YAAA,CAAa,OAAA;AAAA,IACtB,SAAS,YAAA,CAAa,OAAA;AAAA,IACtB,MAAA;AAAA,IACA,gBAAA,EAAkB,eAAA;AAAA,IAClB,WAAA,EAAa;AAAA,MACX,eAAA,EAAiB,cAAA;AAAA,MACjB,eAAA,EAAiB,cAAA;AAAA,MACjB,uBAAA,EAAyB,qBAAA;AAAA,MACzB,sBAAA,EAAwB;AAAA;AAC1B,GACF;AACF;;;ACvWA,eAAsB,kBAAA,CACpB,SAAA,EACA,IAAA,EACA,SAAA,EACA,SAAA,EAC8B;AAE9B,EAAA,IAAI,SAAA,CAAU,UAAU,EAAA,EAAI;AAC1B,IAAA,OAAO,EAAE,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,yBAAA,EAA0B;AAAA,EACrE;AAEA,EAAA,MAAM,MAAA,GAAS,gBAAgB,SAAS,CAAA;AAGxC,EAAA,MAAM,SAAA,GAAY,cAAc,SAAS,CAAA;AAEzC,EAAA,MAAM,YAAA,GACJ,wyBAAA;AAcF,EAAA,MAAM,UAAA,GACJ,iBAAiB,IAAI;AAAA,YAAA,EACJ,SAAS;;AAAA,WAAA,EACV,UAAU,MAAM,CAAA;AAAA,EAAa,SAAS;;AAAA,wDAAA,CAAA;AAIxD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,MAAA,EAAQ,cAAc,UAAA,EAAY;AAAA,MACjE,WAAA,EAAa,GAAA;AAAA,MACb,SAAA,EAAW;AAAA,KACZ,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA,CAAO,WAAuB,EAAC;AACjF,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,SAAA,IAAa,EAAE,CAAA;AAG/C,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,SAAS,CAAA;AACjC,IAAA,MAAM,gBAAgB,QAAA,CAAS,MAAA,CAAO,OAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA;AAEzD,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAE9B,MAAA,OAAO,EAAE,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,sCAAA,EAAuC;AAAA,IAClF;AAEA,IAAA,OAAO,EAAE,QAAA,EAAU,aAAA,EAAe,SAAA,EAAU;AAAA,EAC9C,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,kCAAA,EAAqC,GAAG,CAAA,kBAAA,CAAoB,CAAA;AACzE,IAAA,OAAO,EAAE,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,CAAA,YAAA,EAAe,GAAG,CAAA,CAAA,EAAG;AAAA,EAChE;AACF;AAMA,SAAS,cAAc,SAAA,EAA6B;AAClD,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAsB;AAExC,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA;AAC1B,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,QAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,IAAA,IAAI,CAAC,MAAM,GAAA,CAAI,GAAG,GAAG,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AACtC,IAAA,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,KAAA,EAAO;AAChC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,CAAA,CAAG,CAAA;AACpB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,IAAA,EAAK,EAAG;AAC5B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;ACjEO,SAAS,kBAAA,CACd,KACA,OAAA,EAKU;AACV,EAAA,MAAM,WAAA,GAA4C,CAAC,UAAU,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,MAAM,MAAM,CAAA;AACpI,EAAA,MAAM,QAAA,GAAgC,EAAA;AAGtC,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,EAAK,WAAA,EAAa,QAAQ,CAAA;AACzD,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,OAAO,QAAA;AAGhC,EAAA,OAAO,oBAAA,CAAqB,GAAA,EAAK,WAAA,EAAa,QAA2B,CAAA;AAC3E;AAMA,SAAS,aAAA,CAAc,GAAA,EAAa,WAAA,EAAuB,QAAA,EAA4B;AACrF,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMC,uBAAS,mDAAA,EAAqD;AAAA,MACxE,GAAA,EAAK,GAAA;AAAA,MACL,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,WAAW,IAAA,GAAO;AAAA,KACnB,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AAC5D,IAAA,OAAO,GAAA,CACJ,KAAA,CAAM,IAAI,CAAA,CACV,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAC9B,MAAA,CAAO,CAAA,IAAA,KAAQ,OAAO,GAAA,CAAIC,YAAA,CAAQ,IAAI,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA,CACtD,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,CACjB,GAAA,CAAI,CAAA,GAAA,KAAOC,SAAA,CAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAKA,SAAS,oBAAA,CACP,GAAA,EACA,WAAA,EACA,QAAA,EACA,QAAA,EACU;AACV,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAgB;AAAA,IAClC,cAAA;AAAA,IAAgB,QAAA;AAAA,IAAU,MAAA;AAAA,IAAQ,MAAA;AAAA,IAAQ,OAAA;AAAA,IAAS,MAAA;AAAA,IACnD,aAAA;AAAA,IAAe,OAAA;AAAA,IAAS,MAAA;AAAA,IAAQ,OAAA;AAAA,IAAS,SAAA;AAAA,IACzC,MAAA;AAAA,IAAQ,OAAA;AAAA,IAAS,MAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,SAAA;AAAA,IAAW;AAAA,GAC/C,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AAC5D,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,SAAS,KAAK,UAAA,EAAoB;AAChC,IAAA,IAAI,MAAA,CAAO,UAAU,QAAA,EAAU;AAC/B,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAUC,cAAA,CAAY,UAAA,EAAY,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,IAC3D,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,MAAA,CAAO,UAAU,QAAA,EAAU;AAC/B,MAAA,MAAM,QAAA,GAAWD,SAAA,CAAK,UAAA,EAAY,KAAA,CAAM,IAAI,CAAA;AAC5C,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAC5B,UAAA,IAAA,CAAK,QAAQ,CAAA;AAAA,QACf;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,EAAO,EAAG;AACzB,QAAA,MAAM,GAAA,GAAMD,YAAA,CAAQ,KAAA,CAAM,IAAI,EAAE,WAAA,EAAY;AAC5C,QAAA,IAAI,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,UAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,GAAG,CAAA;AACR,EAAA,OAAO,MAAA;AACT;AA6CO,SAAS,2BAAA,CACd,GAAA,EACA,aAAA,EACA,QAAA,GAAmB,GAAA,EACE;AACrB,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,IAAA,MAAM,QAAA,GAAWC,SAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUE,eAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC9C,MAAA,IAAI,UAAA,GAAa,OAAA,CAAQ,MAAA,GAAS,QAAA,EAAU;AAC1C,QAAA,MAAM,YAAY,QAAA,GAAW,UAAA;AAC7B,QAAA,IAAI,YAAY,GAAA,EAAK;AACnB,UAAA,QAAA,CAAS,IAAI,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,SAAS,CAAC,CAAA;AACjD,UAAA,UAAA,IAAc,SAAA;AAAA,QAChB;AACA,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,SAAS,OAAO,CAAA;AAC7B,MAAA,UAAA,IAAc,OAAA,CAAQ,MAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKO,SAAS,sBAAsB,SAAA,EAA6B;AACjE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,MAAM,GAAA,GAAMH,YAAA,CAAQ,EAAE,CAAA,CAAE,WAAA,EAAY;AACpC,IAAA,IAAI,IAAA,GAAO,SAAA;AACX,IAAA,IAAI,GAAA,KAAQ,UAAU,IAAA,GAAO,OAAA;AAAA,SAAA,IACpB,GAAA,KAAQ,KAAA,IAAS,GAAA,KAAQ,MAAA,EAAQ,IAAA,GAAO,YAAA;AAAA,SAAA,IACxC,GAAA,KAAQ,KAAA,IAAS,GAAA,KAAQ,MAAA,EAAQ,IAAA,GAAO,YAAA;AAAA,SAAA,IACxC,GAAA,KAAQ,OAAO,IAAA,GAAO,QAAA;AAAA,SAAA,IACtB,GAAA,KAAQ,UAAU,GAAA,KAAQ,MAAA,IAAU,QAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAM,IAAA,GAAO,KAAA;AAAA,SAAA,IACzE,GAAA,KAAQ,KAAA,IAAS,GAAA,KAAQ,MAAA,EAAQ,IAAA,GAAO,QAAA;AACjD,IAAA,MAAA,CAAO,IAAI,IAAA,EAAA,CAAO,MAAA,CAAO,IAAI,IAAI,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,OAAA,GAAU,SAAA;AACd,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,MAAA,EAAQ;AAClC,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;ACzLA,eAAsB,wBACpB,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAM,WAAW,SAAA,EAAW,UAAA,EAAY,YAAW,GAAI,OAAA;AAExE,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,EAAc,GAAA,KAAgB;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAC9B,IAAA,UAAA,GAAa,MAAM,GAAG,CAAA;AAAA,EACxB,CAAA;AAGA,EAAA,GAAA,CAAI,UAAU,oCAAoC,CAAA;AAElD,EAAA,MAAM,YAAA,GAAe,mBAAmB,OAAO,CAAA;AAC/C,EAAA,MAAM,cAAc,YAAA,CAAa,GAAA,CAAI,QAAMI,aAAAA,CAAS,OAAA,EAAS,EAAE,CAAC,CAAA;AAChE,EAAA,GAAA,CAAI,QAAA,EAAU,CAAA,MAAA,EAAS,WAAA,CAAY,MAAM,CAAA,2BAAA,CAA6B,CAAA;AAGtE,EAAA,GAAA,CAAI,UAAU,uDAAuD,CAAA;AAErE,EAAA,MAAM,EAAE,QAAA,EAAU,aAAA,EAAe,SAAA,KAAc,MAAM,kBAAA;AAAA,IACnD,WAAA;AAAA,IAAa,IAAA;AAAA,IAAM,SAAA;AAAA,IAAW;AAAA,GAChC;AACA,EAAA,GAAA,CAAI,QAAA,EAAU,CAAA,aAAA,EAAgB,aAAA,CAAc,MAAM,CAAA,CAAA,EAAI,WAAA,CAAY,MAAM,CAAA,QAAA,EAAW,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAG5G,EAAA,GAAA,CAAI,UAAU,uCAAuC,CAAA;AAErD,EAAA,MAAM,eAAA,GAAkB,2BAAA,CAA4B,OAAA,EAAS,aAAa,CAAA;AAC1E,EAAA,MAAM,SAAA,GAAY,aAAA;AAClB,EAAA,MAAM,WAAA,GAAc,sBAAsB,SAAS,CAAA;AACnD,EAAA,GAAA,CAAI,QAAA,EAAU,qBAAqB,WAAW,CAAA,EAAA,EAAK,UAAU,MAAM,CAAA,eAAA,EAAkB,eAAA,CAAgB,IAAI,CAAA,cAAA,CAAgB,CAAA;AAGzH,EAAA,GAAA,CAAI,UAAU,iDAAiD,CAAA;AAE/D,EAAA,MAAM,kBAAmC,EAAC;AAC1C,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,OAAO,CAAA,IAAK,eAAA,EAAiB;AAChD,IAAA,MAAM,QAAA,GAAW,OAAA;AACjB,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC/B,MAAA,eAAA,CAAgB,IAAA,CAAK,cAAA,CAAe,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,IACxD,WAAW,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAK,SAAS,QAAA,CAAS,MAAM,CAAA,IAAK,QAAA,CAAS,SAAS,KAAK,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AACzH,MAAA,eAAA,CAAgB,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,IACrD,CAAA,MAAA,IAAW,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,EAAG;AACnC,MAAA,eAAA,CAAgB,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,IACzD,WAAW,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,IAAK,SAAS,QAAA,CAAS,MAAM,CAAA,IAAK,QAAA,CAAS,SAAS,IAAI,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,EAAG;AACvH,MAAA,eAAA,CAAgB,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,IACtD;AAAA,EACF;AAGA,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,IAAA,aAAA,GAAgB,kBAAkB,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,KAA6B,mBAAA,IAAuB,CAAC,CAAC,CAAA;AAAA,EAClH,CAAA,MAAA,IAAW,WAAA,KAAgB,YAAA,IAAgB,WAAA,KAAgB,YAAA,EAAc;AACvE,IAAA,aAAA,GAAgB,cAAA,CAAe,eAAA,CAAgB,MAAA,CAAO,CAAC,MAA0B,EAAE,YAAA,IAAgB,CAAA,CAAA,IAAM,EAAE,mBAAA,IAAuB,CAAA,CAAA,IAAM,EAAE,iBAAA,IAAqB,EAAE,CAAC,CAAA;AAAA,EACpK,CAAA,MAAA,IAAW,gBAAgB,QAAA,EAAU;AACnC,IAAA,aAAA,GAAgB,mBAAmB,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,KAA8B,YAAA,IAAgB,CAAC,CAAC,CAAA;AAAA,EAC7G,CAAA,MAAO;AACL,IAAA,aAAA,GAAgB,eAAA,CAAgB,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,KAA2B,gBAAA,IAAoB,CAAA,IAAK,EAAE,YAAA,IAAgB,CAAA,CAAA,IAAM,EAAE,mBAAA,IAAuB,EAAE,CAAC,CAAA;AAAA,EAClK;AAGA,EAAA,GAAA,CAAI,UAAU,0CAA0C,CAAA;AAExD,EAAA,MAAM,WAAA,GAAc,gBAAgB,aAAa,CAAA;AACjD,EAAA,GAAA,CAAI,QAAA,EAAU,CAAA,UAAA,EAAa,WAAA,CAAY,MAAM,CAAA,SAAA,CAAW,CAAA;AAGxD,EAAA,GAAA,CAAI,UAAU,2BAA2B,CAAA;AAEzC,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,QAAA,EAAU,WAAA,CAAY,GAAA,CAAI,CAAA,EAAA,MAAO;AAAA,MAC/B,MAAM,EAAA,CAAG,OAAA;AAAA,MACT,MAAM,EAAA,CAAG,MAAA;AAAA,MACT,YAAA,EAAc;AAAA,KAChB,CAAE;AAAA,GACJ;AAGA,EAAA,GAAA,CAAI,UAAU,6EAA6E,CAAA;AAG3F,EAAA,GAAA,CAAI,aAAa,+CAA+C,CAAA;AAChE,EAAA,MAAM,eAAA,GAAkB,MAAM,eAAA,CAAgB;AAAA,IAC5C,IAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA,EAAU,SAAA;AAAA,IACV;AAAA,GACD,CAAA;AAGD,EAAA,GAAA,CAAI,aAAa,gDAAgD,CAAA;AACjE,EAAA,MAAM,QAAA,GAAW,MAAM,sBAAA,CAAuB;AAAA,IAC5C,IAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,EAAA,MAAM,OAAA,GAA4D;AAAA,IAChE,EAAA,EAAI,OAAA;AAAA,IACJ,QAAA,EAAU,CAAA;AAAA,IACV,IAAA,EAAM,6DAAA;AAAA,IACN,WAAA,EAAa,2EAAA;AAAA,IACb,OAAO,EAAC;AAAA,IACR,WAAW,EAAC;AAAA,IACZ,UAAU,CAAC,iBAAA,EAAmB,YAAA,EAAc,mBAAA,EAAqB,gBAAgB,KAAK,CAAA;AAAA,IACtF,gBAAA,EAAkB,MAAA;AAAA,IAClB,QAAA,EAAU,KAAA;AAAA,IACV,MAAA,EAAQ,6DAAA;AAAA,IACR,OAAA,EAAS,EAAE,YAAA,EAAc,2BAAA,EAA6B,WAAW,uBAAA,EAAwB;AAAA,IACzF,UAAA,EAAY,CAAC,4BAAA,EAA8B,0BAA0B,CAAA;AAAA,IACrE,iBAAiB,EAAC;AAAA,IAClB,eAAe,EAAC;AAAA,IAChB,MAAA,EAAQ,EAAE,iBAAA,EAAmB,EAAA,EAAI,YAAY,KAAA;AAAM,GACrD;AAGA,EAAA,IAAI,eAA0B,EAAC;AAC/B,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,aAAA,GAAgB,CAAC,OAAA,EAAS,GAAI,eAAA,CAAgB,KAAA,IAAS,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO;AAAA,MAC/E,GAAG,CAAA;AAAA,MACH,EAAA,EAAI,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,MAChB,UAAU,CAAA,GAAI;AAAA,KAChB,CAAE,CAAA;AACF,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,GAAG,eAAA;AAAA,MACH,EAAA,EAAI,IAAA;AAAA,MACJ,IAAA,EAAM,oBAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH,CAAA,MAAO;AACL,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,EAAA,EAAI,IAAA;AAAA,MACJ,IAAA,EAAM,oBAAA;AAAA,MACN,WAAA,EAAa,gDAAA;AAAA,MACb,KAAA,EAAO,CAAC,OAAO;AAAA,KACL,CAAA;AAAA,EACd;AAGA,EAAA,MAAM,gBAAA,GAAoB,OAAA,EAAS,QAAA,IAAY,EAAC;AAChD,EAAA,YAAA,GAAe,CAAC,GAAG,YAAA,EAAc,GAAG,gBAAgB,CAAA;AAGpD,EAAA,GAAA,CAAI,WAAA,EAAa,CAAA,qBAAA,EAAwB,gBAAA,CAAiB,MAAM,CAAA,YAAA,CAAc,CAAA;AAE9E,EAAA,MAAM,gBAAgB,gBAAA,CAAiB,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,IAAI,CAAA;AAChE,EAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,eAAe,MAAM,0BAAA;AAAA,QACzB,IAAA;AAAA,QAAM,SAAA;AAAA,QAAW,WAAA;AAAA,QAAa,eAAA;AAAA,QAAiB,aAAA;AAAA,QAAe;AAAA,OAChE;AACA,MAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,QAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,MAAM,EAAE,CAAA;AAC/C,QAAA,IAAI,KAAA,UAAe,KAAA,GAAQ,KAAA;AAAA,MAC7B;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,GAAA,CAAI,WAAA,EAAa,CAAA,yBAAA,EAA4B,GAAG,CAAA,iCAAA,CAAmC,CAAA;AACnF,MAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,MAAM,mBAAA,CAAoB;AAAA,YACtC,IAAA;AAAA,YAAM,SAAA;AAAA,YAAW,WAAA;AAAA,YAAa,eAAA;AAAA,YAAiB,OAAA;AAAA,YAAS;AAAA,WACzD,CAAA;AACD,UAAA,OAAA,CAAQ,KAAA,GAAQ,KAAA;AAAA,QAClB,SAAS,CAAA,EAAG;AACV,UAAA,GAAA,CAAI,aAAa,CAAA,WAAA,EAAc,OAAA,CAAQ,EAAE,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAA6B;AAAA,IACjC,cAAA,EAAgB,CAAA;AAAA,IAChB,OAAA,EAAS;AAAA,MACP,EAAA,EAAK,QAAA,CAAS,OAAA,EAAqC,IAAA,EAAM,QAAA,EAAS,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,IAAK,SAAA;AAAA,MAC1G,IAAA,EAAO,QAAA,CAAS,OAAA,EAAqC,IAAA,EAAM,UAAS,IAAK,SAAA;AAAA,MACzE,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,OAAA;AAAA,MACT,YAAA,EAAc,KAAA;AAAA,MACd,QAAA,EAAY,QAAA,CAAS,OAAA,EAAqC,SAAA,IAA0B,CAAC,KAAK,CAAA;AAAA,MAC1F,UAAA,EAAY,UAAU,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM;AAClD,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY;AACjC,QAAA,IAAI,KAAK,GAAA,CAAI,GAAG,IAAI,CAAC,CAAA,CAAE,MAAM,CAAA;AAC7B,QAAA,OAAO,GAAA;AAAA,MACT,CAAA,EAAG,EAA8B,CAAA;AAAA,MACjC,YAAA,EAAe,QAAA,CAAS,YAAA,EAA0C,MAAA,IAAsB;AAAC,KAC3F;AAAA,IACA,OAAA,EAAS;AAAA,MACP,KAAA,EAAQ,OAAA,EAAS,KAAA,IAAwD,EAAC;AAAA,MAC1E,KAAA,EAAQ,OAAA,EAAS,KAAA,IAAoD,EAAC;AAAA,MACtE,QAAA,EAAW,OAAA,EAAS,aAAA,IAA4H,EAAC;AAAA,MACjJ,cAAc,EAAC;AAAA,MACf,kBAAA,EAAqB,OAAA,EAAS,kBAAA,IAAwL,EAAC;AAAA,MACvN,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,OAAA,IAAW,EAAE,CAAA;AAAA,MACtC,iBAAA,EAAmB,MAAA,CAAO,OAAA,EAAS,iBAAA,IAAqB,EAAE,CAAA;AAAA,MAC1D,aAAA,EAAgB,OAAA,EAAS,aAAA,IAA8B;AAAC,KAC1D;AAAA,IACA,QAAA,EAAU,YAAA;AAAA,IACV,cAAc,EAAC;AAAA,IACf,cAAA,EAAgB;AAAA,MACd,OAAO;AAAC,KACV;AAAA,IACA,cAAc,EAAC;AAAA,IACf,WAAW;AAAC,GACd;AAGA,EAAA,GAAA,CAAI,UAAU,gDAAgD,CAAA;AAE9D,EAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,cAAA,EAAe,GAAI,mBAAmB,YAAA,EAAc;AAAA,IAEhF,WAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,EAAU,CAAA,uBAAA,EAA0B,cAAA,CAAe,MAAM,CAAA,qBAAA,CAAuB,CAAA;AAGpF,EAAA,GAAA,CAAI,UAAU,4CAA4C,CAAA;AAE1D,EAAA,MAAM,eAAA,GAAkB,MAAM,sBAAA,CAAuB;AAAA,IACnD,YAAA,EAAc,aAAA;AAAA,IACd,eAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,EAAU,CAAA,0BAAA,EAA6B,eAAA,CAAgB,IAAI,CAAA,gBAAA,CAAkB,CAAA;AAGjF,EAAA,KAAA,MAAW,OAAA,IAAW,aAAA,CAAc,QAAA,IAAY,EAAC,EAAG;AAClD,IAAA,MAAM,GAAA,GAAM,QAAQ,EAAA,IAAM,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,GAAA,CAAI,GAAG,KAAK,EAAC;AAC/C,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AACtC,MAAA,MAAM,YAAA,GAAe,SAAA,CAClB,MAAA,CAAO,CAAA,EAAA,KAAM;AAEZ,QAAA,MAAM,OAAA,GAAU,CAAC,GAAI,IAAA,CAAK,QAAA,IAAY,EAAC,EAAI,GAAI,IAAA,CAAK,SAAA,IAAa,EAAG,CAAA;AACpE,QAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,KAAM,GAAG,OAAO,CAAA;AAAA,MAC3C,CAAC,CAAA,CACA,GAAA,CAAI,CAAA,EAAA,KAAM,GAAG,YAAY,CAAA;AAE5B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,IAAiB,EAAC;AACxC,MAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,QAAA,EAAU,GAAG,YAAY,CAAC,CAAC,CAAA;AAAA,IAClE;AAAA,EACF;AAGA,EAAA,GAAA,CAAI,UAAU,+CAA+C,CAAA;AAG7D,EAAA,MAAM,cAAyB,EAAC;AAChC,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,KAAA,MAAW,OAAA,IAAW,aAAA,CAAc,QAAA,IAAY,EAAC,EAAG;AAClD,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AACtC,MAAA,KAAA,MAAW,EAAA,IAAM,CAAC,GAAI,IAAA,CAAK,QAAA,IAAY,EAAC,EAAI,GAAI,IAAA,CAAK,SAAA,IAAa,EAAG,CAAA,EAAG;AACtE,QAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,WAAA,EAAa,CAAA,EAAG;AACjC,UAAA,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,WAAA,EAAa,CAAA;AAC3B,UAAA,WAAA,CAAY,IAAA,CAAK,EAAE,OAAA,EAAS,EAAA,EAAI,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAK,OAAA,EAAS,4BAAA,EAA8B,CAAA;AAAA,QAC3H;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,OAAA,CAAQ,WAAA,EAAY,EAAG,CAAC,CAAC,CAAC,CAAA;AAC3E,EAAA,MAAM,iBAA4B,EAAC;AACnC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,MAAW,MAAM,CAAC,GAAG,WAAA,EAAa,GAAG,WAAW,CAAA,EAAG;AACjD,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACnC,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,MAAA,UAAA,CAAW,IAAI,GAAG,CAAA;AAClB,MAAA,cAAA,CAAe,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,KAAK,EAAE,CAAA;AAAA,IAC7C;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAmC;AAC9D,EAAA,KAAA,MAAW,QAAA,IAAY,eAAA,CAAgB,MAAA,EAAO,EAAG;AAC/C,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,EAAA,CAAG,OAAO,CAAA,EAAG;AACnC,QAAA,cAAA,CAAe,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,EAAA,CAAG,KAAK,CAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,gBAAA,GAAmB,MAAM,eAAA,CAAgB;AAAA,IAC7C,QAAA,EAAU,cAAA;AAAA,IACV,IAAA;AAAA,IACA,UAAA;AAAA,IACA,cAEF,CAAC,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,EAAU,CAAA,UAAA,EAAa,gBAAA,CAAiB,OAAA,CAAQ,cAAc,CAAA,YAAA,EAAe,gBAAA,CAAiB,OAAA,CAAQ,cAAc,CAAA,EAAA,EAAK,gBAAA,CAAiB,OAAA,CAAQ,WAAW,CAAA,CAAA,CAAG,CAAA;AAGpK,EAAA,GAAA,CAAI,UAAU,6CAA6C,CAAA;AAE3D,EAAA,MAAM,UAAU,eAAA,CAAgB;AAAA,IAC9B,YAAA,EAAc,aAAA;AAAA,IACd,eAAA;AAAA,IACA,cAAA,EAAgB,EAAA;AAAA,IAChB,cAAA,EAAgB,IAAA;AAAA,IAChB,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACD,EAAA,GAAA,CAAI,UAAU,CAAA,mBAAA,EAAsB,OAAA,CAAQ,OAAO,MAAM,CAAA,SAAA,EAAY,QAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,CAAE,WAAW,MAAA,EAAQ,CAAC,CAAC,CAAA,WAAA,CAAa,CAAA;AAE7I,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,aAAA;AAAA,IACd,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA,EAAU,WAAA;AAAA,IACV;AAAA,GACF;AACF;;;AC5VA,IAAM,YAAA,GAAuC;AAAA,EAC3C,MAAA,EAAQ,IAAA;AAAA,EAAM,KAAA,EAAO,IAAA;AAAA,EAAM,UAAA,EAAY,IAAA;AAAA,EAAM,UAAA,EAAY,IAAA;AAAA,EAAM,IAAA,EAAM,MAAA;AAAA,EACrE,MAAA,EAAQ,IAAA;AAAA,EAAM,EAAA,EAAI,IAAA;AAAA,EAAM,IAAA,EAAM,MAAA;AAAA,EAAQ,MAAA,EAAQ,IAAA;AAAA,EAAM,GAAA,EAAK,KAAA;AAAA,EAAO,IAAA,EAAM,IAAA;AAAA,EACtE,GAAA,EAAK,KAAA;AAAA,EAAO,IAAA,EAAM,IAAA;AAAA,EAAM,GAAA,EAAK,KAAA;AAAA,EAAO,IAAA,EAAM,MAAA;AAAA,EAAQ,GAAA,EAAK;AACzD,CAAA;AAGO,SAAS,WAAW,SAAA,EAA2B;AACpD,EAAA,MAAM,OAAA,GAAA,CAAW,SAAa,EAAI,IAAA,GAAO,WAAA,EAAY;AACrD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACrD,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,GAAA;AAAA,EACpC;AACA,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAC9C,EAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,KAAK,GAAG,OAAO,KAAA;AAClC,EAAA,OAAO,KAAA,CAAM,MAAA,IAAU,CAAA,GAAI,KAAA,CAAM,WAAA,EAAY,GAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAAY;AACjF;AAIA,IAAM,WAAA,mBAAc,IAAI,GAAA,CAAI,CAAC,OAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,IAAI,CAAC,CAAA;AAGnF,SAAS,oBAAoB,IAAA,EAAsB;AACxD,EAAA,MAAM,KAAA,GAAQ,KACX,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA,CAC7B,IAAA,EAAK,CACL,KAAA,CAAM,KAAK,CAAA,CACX,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAC,YAAY,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AAClE,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CAAE,OAAA,CAAQ,UAAU,GAAG,CAAA;AACxF,EAAA,MAAM,OAAA,GAAA,CAAW,QAAQ,SAAA,EAAW,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACnE,EAAA,OAAO,OAAA;AACT;AAOO,SAAS,mBAAmB,QAAA,EAAuE;AACxG,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,CAAA,CAAE,IAAI,CAAA;AACvC,IAAA,MAAM,CAAA,GAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAI,KAAK,CAAA,IAAK,CAAA;AAClC,IAAA,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA;AAChB,IAAA,GAAA,CAAI,EAAE,EAAE,CAAA,GAAI,MAAM,CAAA,GAAI,IAAA,GAAO,OAAO,GAAA,GAAM,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,GAAA;AACT;AAIA,IAAM,IAAA,GAAO,CAAC,CAAA,KAAsB,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAEtD,SAAS,OAAA,CAAQ,WAAA,EAAqB,GAAA,GAAM,CAAA,EAAW;AAC5D,EAAA,OAAO,MAAA,GAAS,WAAA,GAAc,GAAA,GAAM,IAAA,CAAK,GAAG,CAAA;AAC9C;AAEA,IAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA;AAAA,EAE5B,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,MAAA;AAAA;AAAA,EAEzB,GAAA;AAAA,EAAK,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,MAAA;AAAA,EACpE,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ;AAC1E,CAAC,CAAA;AAGM,SAAS,cAAc,OAAA,EAAyB;AACrD,EAAA,MAAM,IAAA,GAAO,QAAQ,UAAA,CAAW,cAAc,IAAI,OAAA,CAAQ,KAAA,CAAM,cAAA,CAAe,MAAM,CAAA,GAAI,OAAA;AACzF,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,KAAK,CAAA,CACjE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA,CAC1B,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAC,aAAA,CAAc,GAAA,CAAI,CAAC,CAAC,CAAA;AACtD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AAAE,MAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AAAG,MAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAAG;AACjD,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAAA,EAC3B;AACA,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAC,OAAO,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA,CAAE,WAAA,EAAY;AACxE;AAEO,SAAS,OAAA,CAAQ,WAAA,EAAqB,MAAA,EAAgB,UAAA,EAA4B;AACvF,EAAA,OAAO,SAAS,WAAA,GAAc,GAAA,GAAM,IAAA,CAAK,MAAM,IAAI,GAAA,GAAM,UAAA;AAC3D;AAEO,SAAS,OAAA,CAAQ,OAAA,EAAiB,WAAA,EAAqB,GAAA,EAAqB;AACjF,EAAA,OAAO,SAAS,OAAA,GAAU,GAAA,GAAM,WAAA,GAAc,GAAA,GAAM,KAAK,GAAG,CAAA;AAC9D;AAIO,IAAM,cAAA,GAAiB,8BAAA;AAGvB,SAAS,kBAAkB,IAAA,EAAsB;AACtD,EAAA,IAAI,IAAA,GAAA,CAAQ,IAAA,IAAQ,EAAA,EAAI,IAAA,EAAK,CAAE,OAAA,CAAQ,wCAAA,EAA0C,EAAE,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AACxG,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAE9B,EAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACxC,EAAA,MAAM,eAAe,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA,IAAK,UAAU,MAAA,GAAS,CAAA;AAC5E,EAAA,IAAI,CAAC,YAAA,EAAc,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACrE,EAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AACjC,EAAA,OAAO,iBAAiB,IAAA,GAAO,GAAA;AACjC;AAIO,IAAM,eAAA,GAAkB,mBAAA;AACxB,IAAM,WAAA,GAAc,6BAAA;AACpB,IAAM,WAAA,GAAc,6CAAA;AACpB,IAAM,WAAA,GAAc,uCAAA;;;ACzF3B,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA,EACzB,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EACrE,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,SAAA;AAAA,EACnE,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,MAAA;AAAA,EACxE,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM;AAC7C,CAAC,CAAA;AAKD,SAAS,cAAc,IAAA,EAAwB;AAC7C,EAAA,MAAM,KAAA,GAAQ,KACX,WAAA,EAAY,CACZ,QAAQ,mBAAA,EAAqB,GAAG,EAChC,KAAA,CAAM,KAAK,EACX,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,IAAU,KAAK,CAAC,UAAA,CAAW,GAAA,CAAI,CAAC,CAAC,CAAA;AACpD,EAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AAC3B;AAKA,SAAS,iBAAiB,IAAA,EAA4C;AACpE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,sGAAsG,CAAA;AACjI,EAAA,IAAI,WAAW,OAAA,CAAQ,CAAC,CAAA,IAAK,OAAA,CAAQ,CAAC,CAAA,EAAG;AACvC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAG,EAAE,CAAA;AACnC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAG,EAAE,CAAA;AACnC,IAAA,OAAO,CAAC,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAG,GAAG,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,cAAc,IAAA,EAAkC;AACvD,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,EAAA,IAAI,MAAM,QAAA,CAAS,kBAAkB,CAAA,IAAK,KAAA,CAAM,SAAS,mBAAW,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,UAAU,GAAG,OAAO,UAAA;AAC3I,EAAA,IAAI,KAAA,CAAM,SAAS,SAAM,CAAA,IAAK,MAAM,QAAA,CAAS,UAAU,KAAK,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,IAAK,KAAA,CAAM,SAAS,kBAAU,CAAA,IAAK,MAAM,QAAA,CAAS,aAAa,GAAG,OAAO,MAAA;AAC7J,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,gBAAQ,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,iBAAS,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,eAAU,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,EAAG,OAAO,SAAA;AACtN,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,YAAO,CAAA,IAAK,KAAA,CAAM,SAAS,mBAAS,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,IAAK,MAAM,QAAA,CAAS,UAAU,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,SAAS,KAAK,KAAA,CAAM,QAAA,CAAS,YAAY,CAAA,EAAG,OAAO,UAAA;AACzL,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,cAAc,OAAA,EAAiC;AAC7D,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AACnC,EAAA,IAAI,YAAA,GAAe,EAAA;AACnB,EAAA,IAAI,WAAA,GAAc,EAAA;AAElB,EAAA,MAAM,QAAwB,EAAC;AAC/B,EAAA,MAAM,YAA6B,EAAC;AACpC,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAY;AAE1C,EAAA,IAAI,WAAA,GAAmC,IAAA;AACvC,EAAA,IAAI,YAAA,GAAqC,IAAA;AACzC,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAG,IAAA,EAAK;AAC5B,IAAA,MAAM,UAAU,CAAA,GAAI,CAAA;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AAGX,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,IAAK,CAAC,YAAA,EAAc;AAC1C,MAAA,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,EAAE,EAAE,IAAA,EAAK;AAC9C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA,CAAW,kBAAU,CAAA,IAAK,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA,CAAW,UAAU,CAAA,EAAG;AAC1F,QAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,EAAG,MAAK,IAAK,EAAA;AAC1C,QAAA,IAAI,GAAA,IAAO,CAAC,YAAA,EAAc,YAAA,GAAe,GAAA;AAAA,MAC3C;AACA,MAAA,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA,CAAW,gBAAQ,CAAA,IAAK,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA,CAAW,cAAc,CAAA,EAAG;AAC5F,QAAA,WAAA,GAAc,KAAK,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,EAAG,MAAK,IAAK,EAAA;AAAA,MAC9C;AAAA,IACF;AAGA,IAAA,MAAM,gBAAgB,wEAAA,CAAyE,IAAA,CAAK,IAAI,CAAA,IACnG,gBAAA,CAAiB,KAAK,IAAI,CAAA;AAE/B,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,aAAa,OAAA,GAAU,CAAA;AACpC,QAAA,YAAA,GAAe,IAAA;AAAA,MACjB;AACA,MAAA,SAAA,IAAa,CAAA;AACb,MAAA,MAAM,aAAa,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,EAAE,EAAE,IAAA,EAAK;AACnD,MAAA,WAAA,GAAc;AAAA,QACZ,EAAA,EAAI,IAAI,MAAA,CAAO,SAAS,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,QAC1C,KAAA,EAAO,UAAA;AAAA,QACP,KAAA,EAAO,SAAA;AAAA,QACP,QAAQ;AAAC,OACX;AACA,MAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AACtB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,oFAAA,CAAqF,IAAA,CAAK,IAAI,KAC7G,mEAAA,CAAoE,IAAA,CAAK,IAAI,CAAA,IAC7E,qBAAqB,IAAA,CAAK,IAAI,CAAA,IAC9B,+FAAA,CAAgG,KAAK,IAAI,CAAA;AAE9G,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,aAAa,OAAA,GAAU,CAAA;AAAA,MACtC;AACA,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,SAAA,IAAa,CAAA;AACb,QAAA,WAAA,GAAc;AAAA,UACZ,EAAA,EAAI,IAAI,MAAA,CAAO,SAAS,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,UAC1C,OAAO,YAAA,IAAgB,SAAA;AAAA,UACvB,KAAA,EAAO,SAAA;AAAA,UACP,QAAQ;AAAC,SACX;AACA,QAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA,MACxB;AACA,MAAA,UAAA,IAAc,CAAA;AACd,MAAA,MAAM,OAAA,GAAA,CAAW,WAAA,CAAY,CAAC,CAAA,IAAK,WAAA,CAAY,CAAC,CAAA,IAAK,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA,MAAA,EAAS,UAAU,IAAI,IAAA,EAAK;AACnG,MAAA,YAAA,GAAe;AAAA,QACb,EAAA,EAAI,IAAI,MAAA,CAAO,UAAU,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,QAC3C,KAAA,EAAO,OAAA;AAAA,QACP,QAAQ,WAAA,CAAY,EAAA;AAAA,QACpB,WAAW,WAAA,CAAY,KAAA;AAAA,QACvB,WAAA,EAAa,EAAA;AAAA,QACb,oBAAoB,EAAC;AAAA,QACrB,UAAU,EAAC;AAAA,QACX,YAAA,EAAc,OAAA;AAAA,QACd,UAAA,EAAY;AAAA,OACd;AACA,MAAA,WAAA,CAAY,MAAA,CAAO,KAAK,YAAY,CAAA;AACpC,MAAA,SAAA,CAAU,KAAK,YAAY,CAAA;AAC3B,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,UAAA,GAAa,OAAA;AAC1B,MAAA,MAAM,WAAW,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,EAAE,EAAE,IAAA,EAAK;AAGpD,MAAA,IAAI,QAAA,CAAS,WAAA,EAAY,CAAE,UAAA,CAAW,mBAAW,CAAA,IAAK,QAAA,CAAS,WAAA,EAAY,CAAE,UAAA,CAAW,aAAa,CAAA,EAAG;AACtG,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA,CAAQ,+BAAA,EAAiC,EAAE,EAAE,IAAA,EAAK;AAC3E,QAAA,IAAI,OAAA,EAAS,YAAA,CAAa,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAA;AACzD,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,QAAA,CAAS,WAAA,EAAY,CAAE,UAAA,CAAW,kBAAU,CAAA,IAAK,QAAA,CAAS,WAAA,EAAY,CAAE,UAAA,CAAW,WAAW,CAAA,EAAG;AACnG,QAAA,MAAM,QAAQ,QAAA,CAAS,OAAA,CAAQ,4BAAA,EAA8B,EAAE,EAAE,IAAA,EAAK;AACtE,QAAA,MAAMC,OAAAA,GAAS,KAAA,CAAM,KAAA,CAAM,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACvE,QAAA,KAAA,MAAW,OAAOA,OAAAA,EAAQ;AACxB,UAAA,YAAA,CAAa,QAAA,CAAS,KAAK,GAAG,CAAA;AAC9B,UAAA,iBAAA,CAAkB,IAAI,GAAG,CAAA;AAAA,QAC3B;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,QAAA,YAAA,CAAa,eAAe,GAAA,GAAM,QAAA;AAAA,MACpC,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,WAAA,GAAc,QAAA;AAAA,MAC7B;AAGA,MAAA,KAAA,MAAW,GAAA,IAAO,aAAA,CAAc,QAAQ,CAAA,EAAG;AACzC,QAAA,IAAI,GAAA,CAAI,MAAA,IAAU,CAAA,EAAG,iBAAA,CAAkB,IAAI,GAAG,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,YAAA,CAAa,aAAa,KAAA,CAAM,MAAA;AAAA,EAClC;AAGA,EAAA,IAAI,CAAC,YAAA,IAAgB,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACrC,IAAA,YAAA,GAAe,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,IAAS,kBAAA;AAAA,EACpC;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,OAAO,YAAA,IAAgB,kBAAA;AAAA,MACvB,MAAA,EAAQ,cAAc,OAAO,CAAA;AAAA,MAC7B,SAAA,EAAW,iBAAiB,OAAO,CAAA;AAAA,MACnC,WAAA,EAAa;AAAA,KACf;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,iBAAA,EAAmB,CAAC,GAAG,iBAAiB,CAAA;AAAA,IACxC;AAAA,GACF;AACF;;;ACxNO,SAAS,yBAAyB,QAAA,EAAiC;AACxE,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,OAAiB,EAAC;AAExB,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsB;AAC5C,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,SAAA,CAAU,IAAI,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,aAAA,IAAiB,EAAE,CAAA;AAAA,EAC3C;AAEA,EAAA,SAAS,IAAI,SAAA,EAAmB;AAC9B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AAC1B,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AACzC,MAAA,IAAI,cAAc,CAAA,EAAG;AACnB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAC,GAAG,IAAA,CAAK,MAAM,UAAU,CAAA,EAAG,SAAS,CAAC,CAAA;AAAA,MACpD;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AAE5B,IAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,IAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAEnB,IAAA,KAAA,MAAW,UAAU,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA,IAAK,EAAC,EAAG;AACnD,MAAA,GAAA,CAAI,MAAM,CAAA;AAAA,IACZ;AAEA,IAAA,IAAA,CAAK,GAAA,EAAI;AACT,IAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AAAA,EAC1B;AAEA,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACtB,MAAA,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,IACV;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,uBAAA,CACd,UACA,MAAA,EACoE;AACpE,EAAA,MAAM,UAA+C,EAAC;AACtD,EAAA,MAAM,QAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,aAAA,EAAe,CAAC,GAAI,CAAA,CAAE,aAAA,IAAiB,EAAG,GAAE,CAAE,CAAA;AAEzF,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACtC,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAErC,MAAA,KAAA,MAAW,WAAW,KAAA,EAAO;AAC3B,QAAA,IAAI,OAAA,CAAQ,EAAA,KAAO,OAAA,IAAW,MAAA,EAAQ;AACpC,UAAA,OAAA,CAAQ,gBAAgB,OAAA,CAAQ,aAAA,CAAc,OAAO,CAAC,CAAA,KAAM,MAAM,MAAM,CAAA;AACxE,UAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,QAAQ,CAAA;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAC1B;AAMO,SAAS,qBAAA,CACd,UACA,QAAA,EAC4F;AAC5F,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,SAAA,CAAU,WAAW,CAAA,EAAG;AAChD,IAAA,OAAO,EAAE,eAAe,CAAA,EAAK,WAAA,EAAa,GAAG,aAAA,EAAe,CAAA,EAAG,SAAA,EAAW,EAAC,EAAE;AAAA,EAC/E;AAEA,EAAA,MAAM,SAAS,QAAA,CAAS,SAAA;AACxB,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AAEnC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA,MAC5B,GAAG,KAAA,CAAM,KAAA,CAAM,WAAA,EAAY,CAAE,MAAM,KAAK,CAAA;AAAA,MACxC,GAAA,CAAI,KAAA,CAAM,QAAA,IAAY,EAAC,EAAG,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa;AAAA,KACrD,CAAA;AAGD,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAc,OAAA,CAAQ,IAAA,CAAK,WAAA;AAC3B,MAAM,CAAS,OAAA,CAAQ,WAAA,IAAe,EAAA,EAAI,WAAA;AAC1C,MAAM,CAAa,OAAA,CAAQ,QAAA,IAAY,EAAC,EAAG,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa;AAGrE,MAAA,IAAI,QAAQ,EAAA,CAAG,WAAA,OAAkB,KAAA,CAAM,EAAA,CAAG,aAAY,EAAG;AACvD,QAAA,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AACvB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAQ,OAAA,CAAgB,UAAA,IAAc,EAAC;AAC7C,MAAA,MAAM,cAAc,IAAA,CAAK,IAAA;AAAA,QACvB,CAAC,CAAA,KAAW,CAAA,CAAE,EAAA,KAAO,MAAM,EAAA,IAAO,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA,CAAM,WAAA,EAAY,KAAM,KAAA,CAAM,MAAM,WAAA;AAAY,OACjG;AACA,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AACvB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,eAAA,GAAA,CAAmB,OAAA,CAAQ,QAAA,IAAY,EAAC,EAAG,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA;AAC3E,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,KAAM,aAAA,CAAc,GAAA,CAAI,CAAC,CAAC,CAAA,IACjE,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,WAAA,EAAa,CAAA,IAC7D,KAAA,CAAM,KAAA,CAAM,WAAA,EAAY,CAAE,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,CAAA;AAE/D,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AACvB,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,cAAc,MAAA,CAAO,MAAA;AAC3B,EAAA,MAAM,gBAAgB,UAAA,CAAW,IAAA;AACjC,EAAA,MAAM,aAAA,GAAgB,WAAA,GAAc,CAAA,GAAI,aAAA,GAAgB,WAAA,GAAc,CAAA;AACtE,EAAA,MAAM,SAAA,GAAY,OAAO,MAAA,CAAO,CAAC,MAAM,CAAC,UAAA,CAAW,IAAI,CAAA,CAAE,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,EAAE,EAAE,CAAA,EAAA,EAAK,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAE9F,EAAA,OAAO,EAAE,aAAA,EAAe,WAAA,EAAa,aAAA,EAAe,SAAA,EAAU;AAChE;AAKO,SAAS,oBAAA,CACd,IACA,iBAAA,EAC6E;AAC7E,EAAA,MAAM,QAAA,GAAW,iBAAA,IAAqB,gBAAA,IAAoB,iBAAA,GACtD,kBAAkB,cAAA,GACjB,iBAAA;AAEL,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,WAAW,CAAC,GAAI,EAAA,CAAG,QAAA,IAAY,EAAG,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAGpD,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAA,CAAK,EAAE,aAAA,IAAiB,IAAI,QAAA,CAAS,CAAA,CAAE,EAAE,CAAA,EAAG;AAC1C,MAAA,CAAA,CAAE,aAAA,GAAA,CAAiB,CAAA,CAAE,aAAA,IAAiB,EAAC,EAAG,OAAO,CAAC,CAAA,KAAM,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA;AAClE,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,6BAAA,EAAgC,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AAAA,IACtD;AAAA,EACF;AAGA,EAAA,MAAM,wBAA+E,EAAC;AACtF,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,aAAA,IAAiB,EAAC,EAAG;AACrC,MAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG;AACtB,QAAA,qBAAA,CAAsB,KAAK,EAAE,SAAA,EAAW,EAAE,EAAA,EAAI,eAAA,EAAiB,GAAG,CAAA;AAClE,QAAA,QAAA,CAAS,KAAK,CAAA,+BAAA,EAAkC,CAAA,CAAE,EAAE,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAA;AAAA,MAChE,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,MACrB;AAAA,IACF;AACA,IAAA,CAAA,CAAE,aAAA,GAAgB,YAAA;AAAA,EACpB;AAGA,EAAA,MAAM,aAAA,GAAgB,yBAAyB,QAAQ,CAAA;AACvD,EAAA,IAAI,eAAoD,EAAC;AACzD,EAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,IAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,QAAA,EAAU,aAAa,CAAA;AAC9D,IAAA,QAAA,GAAW,MAAA,CAAO,KAAA;AAClB,IAAA,YAAA,GAAe,MAAA,CAAO,OAAA;AACtB,IAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,MAAA,QAAA,CAAS,KAAK,CAAA,2BAAA,EAA8B,CAAA,CAAE,IAAI,CAAA,IAAA,EAAO,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AAAA,IACjE;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,QAAA,EAAU,QAAQ,CAAA;AACzD,EAAA,IAAI,QAAA,CAAS,gBAAgB,CAAA,EAAK;AAChC,IAAA,QAAA,CAAS,IAAA,CAAK,sBAAsB,QAAA,CAAS,aAAA,GAAgB,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,EAAM,QAAA,CAAS,aAAa,CAAA,CAAA,EAAI,QAAA,CAAS,WAAW,CAAA,qBAAA,EAAwB,QAAA,CAAS,UAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACzL;AAGA,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,CAAC,EAAE,GAAA,EAAK,QAAA,CAAS,KAAK,CAAA,QAAA,EAAW,CAAA,CAAE,EAAE,CAAA,yBAAA,CAA2B,CAAA;AACpE,IAAA,IAAI,CAAC,EAAE,GAAA,EAAK,QAAA,CAAS,KAAK,CAAA,QAAA,EAAW,CAAA,CAAE,EAAE,CAAA,4BAAA,CAA8B,CAAA;AACvE,IAAA,IAAI,CAAC,CAAA,CAAE,GAAA,IAAO,CAAA,CAAE,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,CAAA,QAAA,EAAW,CAAA,CAAE,EAAE,CAAA,iCAAA,CAAmC,CAAA;AAAA,EACpG;AAEA,EAAA,MAAM,KAAA,GAAQ,cAAc,MAAA,KAAW,CAAA,IAAK,sBAAsB,MAAA,KAAW,CAAA,IAAK,SAAS,aAAA,IAAiB,GAAA;AAE5G,EAAA,MAAM,aAAA,GAAgC;AAAA,IACpC,GAAG,EAAA;AAAA,IACH;AAAA,GACF;AAEA,EAAA,MAAM,MAAA,GAA2C;AAAA,IAC/C,KAAA;AAAA,IACA,MAAA,EAAQ,aAAA;AAAA,IACR,YAAA;AAAA,IACA,qBAAA;AAAA,IACA,eAAe,QAAA,CAAS,aAAA;AAAA,IACxB,qBAAqB,QAAA,CAAS,WAAA;AAAA,IAC9B,uBAAuB,QAAA,CAAS,aAAA;AAAA,IAChC,iBAAiB,QAAA,CAAS,SAAA;AAAA,IAC1B;AAAA,GACF;AAEA,EAAA,OAAO,EAAE,eAAe,MAAA,EAAO;AACjC;;;ACtOO,IAAM,aAAA,GAA0B;AAAA;AAAA,EAErC,iHAAA;AAAA,EACA,8HAAA;AAAA,EACA,sGAAA;AAAA,EACA,oHAAA;AAAA,EACA,gHAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,aAAA,GAA0B;AAAA;AAAA,EAErC,8IAAA;AAAA,EACA,6HAAA;AAAA,EACA,2IAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,aAAA,GAA0B;AAAA;AAAA,EAErC,sIAAA;AAAA,EACA,2IAAA;AAAA,EACA,+JAAA;AAAA,EACA;AACF,CAAA;;;ACfA,IAAM,eAAA,GAA4B;AAAA,EAChC,SAAA;AAAA,EACA,8BAAA;AAAA;AAAA,EAEA,mCAAA;AAAA;AAAA,EAEA,yCAAA;AAAA,EACA,eAAA;AAAA,EACA,sBAAA;AAAA,EACA,gBAAA;AAAA,EACA,8EAAA;AAAA;AAAA,EAEA,yDAAA;AAAA;AAAA,EAEA,kCAAA;AAAA;AAAA,EAEA;AACF,CAAA;AAGA,IAAM,+BAAe,IAAI,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAE5C,SAAS,eAAe,IAAA,EAAwB;AAC9C,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,MAAM,eAAA,EAAiB;AAChC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,MAAA,CAAO,GAAG,MAAA,EAAQ,GAAG,CAAC,CAAA,IAAK,EAAC;AACzD,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAAA,EAC5E;AACA,EAAA,OAAO,IAAA;AACT;AAoBO,SAAS,iBACd,QAAA,EAKmB;AACnB,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AACzB,IAAA,MAAM,GAAA,GAAA,CAAO,CAAA,CAAE,GAAA,IAAO,EAAA,EAAI,IAAA,EAAK;AAC/B,IAAA,MAAM,GAAA,GAAA,CAAO,CAAA,CAAE,GAAA,IAAO,EAAA,EAAI,IAAA,EAAK;AAC/B,IAAA,MAAM,QAAA,GAAA,CAAY,CAAA,CAAE,GAAA,IAAO,IAAI,GAAA,CAAI,CAAC,CAAA,KAAA,CAAO,CAAA,IAAK,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAC1E,IAAA,MAAM,cAAA,GAAiB,eAAe,GAAG,CAAA;AACzC,IAAA,MAAM,iBAAA,GAAoB,eAAe,MAAA,GAAS,CAAA;AAClD,IAAA,MAAM,UAAA,GAAa,2CAAA;AACnB,IAAA,MAAM,yBAAA,GAA4B,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AACrD,IAAA,MAAM,oBAAoB,CAAA,CAAE,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AAG7G,IAAA,MAAM,aAAa,MAAA,CAAO,CAAA,CAAE,IAAA,IAAQ,EAAE,EAAE,WAAA,EAAY,CAAE,KAAA,CAAM,YAAY,EAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AACrG,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAuB;AAC7C,MAAA,MAAM,KAAA,GAAQ,EAAE,WAAA,EAAY;AAC5B,MAAA,OAAO,iBAAiB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,SAAS,CAAC,CAAC,CAAA,IAAK,UAAA,CAAW,KAAK,CAAC,CAAA,KAAM,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IACpG,CAAA;AACA,IAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM;AAC7C,MAAA,IAAI,cAAA,CAAe,CAAC,CAAA,CAAE,MAAA,GAAS,GAAG,OAAO,KAAA;AAGzC,MAAA,OAAO,CAAC,eAAe,CAAC,CAAA;AAAA,IAC1B,CAAC,CAAA;AAIC,IAAA,MAAM,eAAA,GAAA,CAAmB,CAAA,CAAE,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA,CAAE,OAAO,OAAO,CAAA;AACrF,IAAA,MAAM,kBAAA,GAAqB,eAAA,CAAgB,MAAA,GAAS,CAAA,GAChD,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,cAAA,CAAe,CAAC,CAAC,IACzC,EAAC;AACL,IAAA,MAAM,WAAA,GAAc,0mBAAA;AACpB,IAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,MAAA,CAAO,CAAC,MAAM,CAAC,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,IAAK,CAAC,SAAA,CAAU,IAAA,CAAK,CAAC,CAAC,CAAA;AAC3F,IAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAyB;AACxC,MAAA,IAAI,CAAC,MAAM,OAAO,CAAA;AAClB,MAAA,OAAQ,cAAA,CAAe,IAAI,CAAA,CAAE,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,MAAM,CAAA,GAAK,GAAA;AAAA,IACjF,CAAA;AACA,IAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AACxB,IAAa,QAAQ,GAAG;AACxB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,GAAA,CAAI,OAAO,CAAC,CAAA,GAAI,CAAA;AACxE,IAAA,MAAM,wBAAwB,IAAA,GAAO,IAAA;AAErC,IAAA,MAAM,WACJ,GAAA,CAAI,UAAA,CAAW,cAAc,CAAA,IAC7B,IAAI,UAAA,CAAW,cAAc,CAAA,IAC7B,QAAA,CAAS,MAAM,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,cAAc,CAAC,CAAA;AACpD,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,cAAe,CAAA,CAAwB,IAAA;AAC7C,IAAA,IAAI,WAAA,KAAgB,MAAA,IAAa,CAAC,eAAA,CAAgB,IAAA,CAAK,WAAW,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,gCAAA,GAAmC,WAAW,CAAA;AACnI,IAAA,MAAM,aAAc,CAAA,CAA4B,QAAA;AAChD,IAAA,IAAI,UAAA,KAAe,MAAA,IAAa,UAAA,KAAe,EAAA,IAAM,CAAC,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,sBAAA,GAAyB,UAAU,CAAA;AACvI,IAAA,MAAM,aAAc,CAAA,CAA4B,QAAA;AAChD,IAAA,IAAI,UAAA,KAAe,MAAA,IAAa,UAAA,KAAe,EAAA,IAAM,CAAC,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,sBAAA,GAAyB,UAAU,CAAA;AACvI,IAAA,MAAM,cAAe,CAAA,CAA+B,SAAA;AACpD,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA,IAAI,YAAY,MAAA,KAAW,QAAA,CAAS,MAAA,EAAQ,UAAA,CAAW,KAAK,0BAA0B,CAAA;AACtF,MAAA,KAAA,MAAW,EAAA,IAAM,WAAA,EAAa,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,sBAAA,GAAyB,EAAE,CAAA;AAAA,IACtG;AACA,IAAA,MAAM,OAAA,GAAU,WAAW,MAAA,KAAW,CAAA;AACtC,IAAA,MAAM,MAAA,GACJ,CAAC,iBAAA,IACD,CAAC,6BACD,eAAA,CAAgB,MAAA,KAAW,CAAA,IAC3B,kBAAA,CAAmB,WAAW,CAAA,IAC9B,iBAAA,CAAkB,MAAA,KAAW,CAAA,IAC7B,yBACA,QAAA,IACA,OAAA;AACF,IAAA,OAAO;AAAA,MACL,WAAW,CAAA,CAAE,EAAA;AAAA,MACb,iBAAA;AAAA,MACA,cAAA;AAAA,MACA,yBAAA;AAAA,MACA,kBAAA,EAAoB,gBAAgB,MAAA,KAAW,CAAA;AAAA,MAC/C,eAAA;AAAA,MACA,sBAAA,EAAwB,mBAAmB,MAAA,KAAW,CAAA;AAAA,MACtD,kBAAA;AAAA,MACA,iBAAA,EAAmB,kBAAkB,MAAA,KAAW,CAAA;AAAA,MAChD,iBAAA;AAAA,MACA,qBAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;;;ACtHA,SAAS,OAAA,CAAQ,MAA0B,GAAA,EAAqB;AAC9D,EAAA,MAAM,CAAA,GAAA,CAAK,IAAA,IAAQ,EAAA,EAAI,IAAA,EAAK;AAC5B,EAAA,OAAO,CAAA,CAAE,SAAS,GAAA,GAAM,CAAA,CAAE,MAAM,CAAA,EAAG,GAAG,IAAI,KAAA,GAAQ,CAAA;AACpD;AAEA,eAAe,QAAA,CACb,MAAA,EACA,MAAA,EACA,IAAA,EACkC;AAClC,EAAA,MAAM,CAAA,GAAI,MAAM,MAAA,CAAO,IAAA;AAAA,IACrB,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAO,EAAG,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,IACrE,EAAE,WAAA,EAAa,GAAA,EAAK,SAAA,EAAW,QAAA,CAAS,QAAQ,GAAA,CAAI,aAAA,IAAiB,OAAA,EAAS,EAAE,CAAA;AAAE,GACpF;AACA,EAAA,OAAO,gBAAA,CAAiB,EAAE,OAAO,CAAA;AACnC;AAKA,IAAM,aAAA,GAAgB,CAAA;AACtB,SAAS,aAAA,CAAiB,OAAY,IAAA,EAAqB;AACzD,EAAA,MAAM,MAAa,EAAC;AACpB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAC9E,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,SAAA,GAAY,oDAAA;AAElB,eAAsB,+BAAA,CACpB,MAAA,EACA,QAAA,EACA,SAAA,EACA,QAAA,EAC+B;AAC/B,EAAA,MAAM,eAAuC,EAAC;AAC9C,EAAA,MAAM,eAAuC,EAAC;AAC9C,EAAA,MAAM,eAAyC,EAAC;AAEhD,EAAoB,SACjB,GAAA,CAAI,CAAC,MAAM,IAAA,GAAO,CAAA,CAAE,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,IAAA,IAAQ,EAAE,WAAA,GAAc,UAAA,GAAQ,QAAQ,CAAA,CAAE,WAAA,EAAa,GAAG,CAAA,GAAI,EAAA,CAAG,CAAA,CACnG,IAAA,CAAK,IAAI;AAGZ,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,iFAAA;AAAA,IACA,EAAA;AAAA,IACA,mGAAA;AAAA,IACA,8FAAA;AAAA,IACA,EAAA;AAAA,IACA,QAAA;AAAA,IACA,qFAAA;AAAA,IACA,sFAAA;AAAA,IACA,sFAAA;AAAA,IACA,uFAAA;AAAA,IACA,0FAAA;AAAA,IACA,sFAAA;AAAA,IACA,mEAAA;AAAA,IACA,4DAAA;AAAA,IACA,6FAAA;AAAA,IACA,qFAAA;AAAA,IACA,sCAAA;AAAA,IACA,EAAA;AAAA,IACA,6CAAA;AAAA,IACA,aAAA,CAAc,IAAI,CAAC,CAAA,KAAM,OAAO,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IAC5C,EAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AASX,EAAA,KAAA,MAAW,KAAA,IAAS,aAAA,CAAc,QAAA,EAAU,aAAa,CAAA,EAAG;AAC1D,IAAA,MAAM,SAAA,GAAY,MACf,GAAA,CAAI,CAAC,MAAM,IAAA,GAAO,CAAA,CAAE,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,OAAO,CAAA,CAAE,WAAA,GAAc,IAAA,GAAO,OAAA,CAAQ,CAAA,CAAE,WAAA,EAAa,GAAG,CAAA,GAAI,EAAA,CAAG,CAAA,CACxG,IAAA,CAAK,IAAI,CAAA;AACZ,IAAA,MAAM,SAAA,GAAY,gBAAgB,SAAA,GAAY,8DAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,EAAQ,WAAW,SAAS,CAAA;AAC1D,IAAA,KAAA,MAAW,CAAA,IAAM,MAAA,CAAO,IAAA,IAAQ,EAAC,EAAoD;AACnF,MAAA,IAAI,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,GAAA,EAAK,YAAA,CAAa,EAAE,UAAU,CAAA,GAAI,iBAAA,CAAkB,CAAA,CAAE,GAAG,CAAA;AAAA,IACjF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,CAAC,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA,EAAG;AACvB,MAAA,QAAA,CAAS,IAAA,CAAK,gCAAA,GAAmC,CAAA,CAAE,EAAA,GAAK,sCAAiC,CAAA;AACzF,MAAA,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA,GAAI,EAAA;AAAA,IACvB;AAAA,EACF;AAGA,EAAmB,QAAA,CAChB,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,GAAO,EAAE,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,QAAQ,YAAA,CAAa,CAAA,CAAE,EAAE,CAAC,CAAA,CACnE,KAAK,IAAI;AACZ,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,0FAAA;AAAA,IACA,EAAA;AAAA,IACA,wFAAA;AAAA,IACA,wDAAA;AAAA,IACA,EAAA;AAAA,IACA,QAAA;AAAA,IACA,sFAAA;AAAA,IACA,kDAAA;AAAA,IACA,oFAAA;AAAA,IACA,oFAAA;AAAA,IACA,iEAAA;AAAA,IACA,qFAAA;AAAA,IACA,+BAAA;AAAA,IACA,iEAAA;AAAA,IACA,6FAAA;AAAA,IACA,iDAAA;AAAA,IACA,EAAA;AAAA,IACA,6CAAA;AAAA,IACA,aAAA,CAAc,IAAI,CAAC,CAAA,KAAM,OAAO,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IAC5C,EAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AAQX,EAAA,KAAA,MAAW,KAAA,IAAS,aAAA,CAAc,QAAA,EAAU,aAAa,CAAA,EAAG;AAC1D,IAAiB,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC;AAC/C,IAAA,MAAM,kBAAkB,KAAA,CACrB,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,GAAO,EAAE,EAAA,GAAK,IAAA,GAAO,EAAE,IAAA,GAAO,KAAA,IAAS,aAAa,CAAA,CAAE,EAAE,KAAK,WAAA,CAAY,CAAA,CACpF,KAAK,IAAI,CAAA;AACZ,IAAA,MAAM,YAAA,GAAe,qBAAqB,eAAA,GAAkB,8DAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,EAAQ,WAAW,YAAY,CAAA;AAC7D,IAAA,KAAA,MAAW,CAAA,IAAM,MAAA,CAAO,IAAA,IAAQ,EAAC,EAAoD;AACnF,MAAA,IAAI,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,GAAA,EAAK,YAAA,CAAa,EAAE,UAAU,CAAA,GAAI,iBAAA,CAAkB,CAAA,CAAE,GAAG,CAAA;AAAA,IACjF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,CAAC,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA,EAAG;AACvB,MAAA,QAAA,CAAS,IAAA,CAAK,gCAAA,GAAmC,CAAA,CAAE,EAAA,GAAK,sCAAiC,CAAA;AACzF,MAAA,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA,GAAI,EAAA;AAAA,IACvB;AAAA,EACF;AAGA,EAAmB,SAChB,GAAA,CAAI,CAAC,MAAM,IAAA,GAAO,CAAA,CAAE,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,YAAY,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA,GAAI,SAAA,GAAY,YAAA,CAAa,EAAE,EAAE,CAAC,CAAA,CACxG,IAAA,CAAK,IAAI;AACZ,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,qFAAA;AAAA,IACA,EAAA;AAAA,IACA,uFAAA;AAAA,IACA,mEAAA;AAAA,IACA,EAAA;AAAA,IACA,QAAA;AAAA,IACA,mFAAA;AAAA,IACA,wEAAA;AAAA,IACA,uFAAA;AAAA,IACA,gFAAA;AAAA,IACA,sFAAA;AAAA,IACA,wFAAA;AAAA,IACA,wFAAA;AAAA,IACA,qFAAA;AAAA,IACA,yFAAA;AAAA,IACA,0FAAA;AAAA,IACA,uFAAA;AAAA,IACA,sFAAA;AAAA,IACA,2FAAA;AAAA,IACA,oFAAA;AAAA,IACA,oFAAA;AAAA,IACA,wFAAA;AAAA,IACA,yFAAA;AAAA,IACA,4EAAA;AAAA,IACA,6FAAA;AAAA,IACA,0CAAA;AAAA,IACA,EAAA;AAAA,IACA,6CAAA;AAAA,IACA,aAAA,CAAc,IAAI,CAAC,CAAA,KAAM,OAAO,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IAC5C,EAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACX,EAAkB,QAAA,CACf,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,GAAO,CAAA,CAAE,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,KAAA,IAAA,CAAU,CAAA,CAAE,QAAA,IAAY,EAAC,EAAG,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,iDAAA,GAA+C,SAAA,GAAY,GAAA,CAAI,CAAA,CAC/J,IAAA,CAAK,IAAI;AACV,EAAA,KAAA,MAAW,KAAA,IAAS,aAAA,CAAc,QAAA,EAAU,aAAa,CAAA,EAAG;AAC5D,IAAA,MAAM,OAAA,GAAU,KAAA,CACb,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,GAAO,CAAA,CAAE,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,KAAA,IAAA,CAAU,CAAA,CAAE,QAAA,IAAY,EAAC,EAAG,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,iDAAA,GAA+C,SAAA,GAAY,GAAA,CAAI,CAAA,CAC/J,IAAA,CAAK,IAAI,CAAA;AACZ,IAAA,MAAM,WAAA,GAAc,KAAA,CACjB,GAAA,CAAI,CAAC,CAAA,KAAM,OAAO,CAAA,CAAE,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,SAAA,IAAa,aAAa,CAAA,CAAE,EAAE,CAAA,IAAK,WAAA,CAAA,GAAe,SAAA,IAAa,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA,IAAK,WAAA,CAAY,CAAA,CAC1I,IAAA,CAAK,IAAI,CAAA;AACZ,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,qBAAA,GAAwB,SAAA;AAAA,MACxB,EAAA;AAAA,MACA,uFAAA;AAAA,MACA,OAAA;AAAA,MACA,EAAA;AAAA,MACA,yBAAA;AAAA,MACA,WAAA;AAAA,MACA,EAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF,CAAE,KAAK,IAAI,CAAA;AACX,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,EAAQ,WAAW,YAAY,CAAA;AAC7D,IAAA,KAAA,MAAW,CAAA,IAAM,MAAA,CAAO,IAAA,IAAQ,EAAC,EAAsD;AACrF,MAAA,IAAI,CAAA,CAAE,cAAc,KAAA,CAAM,OAAA,CAAQ,EAAE,GAAG,CAAA,eAAgB,CAAA,CAAE,UAAU,IAAI,CAAA,CAAE,GAAA,CAAI,IAAI,CAAC,IAAA,KAAS,kBAAkB,MAAA,CAAO,IAAI,CAAC,CAAC,CAAA;AAAA,IAC5H;AAAA,EACF;AACA,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,CAAC,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA,IAAK,aAAa,CAAA,CAAE,EAAE,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAC1D,MAAA,QAAA,CAAS,IAAA,CAAK,gCAAA,GAAmC,CAAA,CAAE,EAAA,GAAK,sCAAiC,CAAA;AACzF,MAAA,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA,GAAI,EAAC;AAAA,IACxB;AAAA,EACF;AAGA,EAAmB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE;AAC3C,EAAA,MAAM,YAAY,MAChB,gBAAA,CAAiB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACpC,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,QAAA,EAAU,CAAA,CAAE,QAAA,IAAY,EAAC;AAAA,IACzB,GAAA,EAAK,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA;AAAA,IACtB,GAAA,EAAK,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA;AAAA,IACtB,GAAA,EAAK,YAAA,CAAa,CAAA,CAAE,EAAE;AAAA,IACtB,CAAC,CAAA;AACL,EAAA,IAAI,SAAS,SAAA,EAAU;AACvB,EAAA,MAAM,WAAA,GAAc,OAAO,KAAA,KAAoC;AAC7D,IAAA,MAAM,aAAa,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,MAAM,CAAA;AACjD,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACpC,IAAA,IAAI,KAAA,GAAQ,GAAG,QAAA,CAAS,IAAA,CAAK,8BAA8B,KAAA,GAAQ,IAAA,GAAO,UAAA,CAAW,MAAA,GAAS,2BAA2B,CAAA;AACzH,IAAA,MAAM,OAAA,GAAU,UAAA;AAChB,IAAA;AACA,MAAA,QAAA,CAAS,KAAK,eAAA,GAAkB,OAAA,CAAQ,SAAS,GAAA,GAAM,QAAA,CAAS,SAAS,qDAAgD,CAAA;AACzH,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AACvC,QAAA,MAAM,CAAA,GAAI,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAE,SAAS,CAAA;AACnD,QAAA,MAAM,SAAmB,EAAC;AAC1B,QAAA,IAAI,CAAA,CAAE,iBAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,yCAAA,GAA4C,EAAE,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,GAAI,GAAG,CAAA;AAClH,QAAA,IAAI,CAAA,CAAE,yBAAA,EAA2B,MAAA,CAAO,IAAA,CAAK,sEAAsE,CAAA;AACnH,QAAA,KAAA,MAAW,IAAA,IAAQ,EAAE,eAAA,EAAiB,MAAA,CAAO,KAAK,yBAAA,GAA4B,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAC,CAAA;AAChG,QAAA,KAAA,MAAW,QAAQ,CAAA,CAAE,kBAAA,EAAoB,MAAA,CAAO,IAAA,CAAK,6DAA6D,CAAA,EAAG,QAAA,IAAY,EAAC,EAAG,KAAK,IAAI,CAAA,GAAI,QAAQ,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAC,CAAA;AAC5K,QAAA,KAAA,MAAW,IAAA,IAAQ,EAAE,iBAAA,EAAmB,MAAA,CAAO,KAAK,8BAAA,GAAiC,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAC,CAAA;AACvG,QAAA,IAAI,CAAC,CAAA,CAAE,qBAAA,EAAuB,MAAA,CAAO,KAAK,6EAAwE,CAAA;AAClH,QAAA,OAAO;AAAA,UACL,YAAY,CAAA,CAAE,SAAA;AAAA,UACd,IAAA,EAAM,CAAA,EAAG,IAAA,IAAQ,CAAA,CAAE,SAAA;AAAA,UACnB,QAAA,EAAU,CAAA,EAAG,QAAA,IAAY,EAAC;AAAA,UAC1B,SAAS,EAAE,GAAA,EAAK,YAAA,CAAa,CAAA,CAAE,SAAS,CAAA,EAAG,GAAA,EAAK,YAAA,CAAa,CAAA,CAAE,SAAS,CAAA,EAAG,GAAA,EAAK,YAAA,CAAa,CAAA,CAAE,SAAS,CAAA,EAAE;AAAA,UAC1G;AAAA,SACF;AAAA,MACF,CAAC,CAAA;AACD,MAAA,MAAM,YAAA,GAAe;AAAA,QACnB,wFAAA;AAAA,QACA,0FAAA;AAAA,QACA,WAAA;AAAA,QACA,iFAAA;AAAA,QACA,6FAAA;AAAA,QACA,qFAAqF,SAAA,GAAY,GAAA;AAAA,QACjG,qJAAA;AAAA,QACA,2eAAA;AAAA,QACA,EAAA;AAAA,QACA;AAAA,OACF,CAAE,KAAK,IAAI,CAAA;AACX,MAAA,MAAM,UAAA,GAAa;AAAA,QACjB,mBAAA;AAAA,QACA,IAAA,CAAK,SAAA,CAAU,aAAA,EAAe,IAAA,EAAM,CAAC,CAAA;AAAA,QACrC,EAAA;AAAA,QACA,iFAAA;AAAA,QACA;AAAA,OACF,CAAE,KAAK,IAAI,CAAA;AACX,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,MAAA,EAAQ,cAAc,UAAU,CAAA;AACjE,QAAA,KAAA,MAAW,CAAA,IAAM,SAAA,CAAU,OAAA,IAAW,EAAC,EAAkF;AACvH,UAAA,IAAI,CAAC,EAAE,UAAA,EAAY;AACnB,UAAA,IAAI,CAAA,CAAE,KAAK,YAAA,CAAa,CAAA,CAAE,UAAU,CAAA,GAAI,iBAAA,CAAkB,EAAE,GAAG,CAAA;AAC/D,UAAA,IAAI,CAAA,CAAE,KAAK,YAAA,CAAa,CAAA,CAAE,UAAU,CAAA,GAAI,iBAAA,CAAkB,EAAE,GAAG,CAAA;AAC/D,UAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,CAAE,GAAG,KAAK,CAAA,CAAE,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,YAAA,CAAa,CAAA,CAAE,UAAU,CAAA,GAAI,CAAA,CAAE,IAAI,GAAA,CAAI,CAAC,MAAM,iBAAA,CAAkB,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,QAC1H;AACA,QAAA,MAAA,GAAS,SAAA,EAAU;AAAA,MACrB,SAAS,GAAA,EAAK;AACZ,QAAA,QAAA,CAAS,IAAA,CAAK,iCAAiC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,CAAE,CAAA;AAAA,MAClG;AAAA,IACA;AACA,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAAA,EACrC,CAAA;AACA,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,IAAS,CAAA,EAAG,KAAA,EAAA,EAAS;AACvC,IAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,KAAK,CAAA;AACvC,IAAA,IAAI,OAAA,EAAS;AAAA,EACf;AAEA,EAAA,MAAM,eAAe,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,MAAM,CAAA;AACnD,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAE3B,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,WAAAC,UAAAA,EAAW,aAAA,EAAAC,gBAAc,GAAI,MAAM,OAAO,IAAS,CAAA;AAC3D,MAAA,MAAM,WAAW,MAAM,OAAO,IAAS,CAAA,EAAG,QAAO,GAAI,oBAAA;AACrD,MAAAD,UAAAA,CAAU,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AACtC,MAAAC,cAAAA,CAAc,OAAA,GAAU,wBAAA,EAA0B,IAAA,CAAK,SAAA;AAAA,QACrD,YAAA,CAAa,IAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,GAAA,EAAK,YAAA,CAAa,CAAA,CAAE,SAAS,GAAG,GAAA,EAAK,YAAA,CAAa,EAAE,SAAS,CAAA,EAAG,KAAK,YAAA,CAAa,CAAA,CAAE,SAAS,CAAA,EAAE,CAAE,CAAA;AAAA,QAAG,IAAA;AAAA,QAAM;AAAA,OAAE,CAAA;AAAA,IACrJ,CAAA,CAAA,MAAQ;AAAA,IAA4B;AACpC,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,GAAA,IAAO,CAAA,CAAE,iBAAA,GAAoB,WAAA,GAAc,EAAA,CAAA,IAAO,CAAA,CAAE,yBAAA,GAA4B,WAAA,GAAc,EAAA,CAAA,IAAO,CAAA,CAAE,eAAA,CAAgB,MAAA,GAAS,cAAA,GAAiB,EAAA,CAAA,IAAO,CAAA,CAAE,iBAAA,CAAkB,MAAA,GAAS,gBAAA,GAAmB,EAAA,CAAA,GAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACjR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,yDAAyD,MAAA,GACzD;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,YAAA,EAAc,YAAA,EAAc,YAAA,EAAc,QAAQ,QAAA,EAAS;AACtE;AC1TA,SAAS,KAAK,CAAA,EAAiC;AAC7C,EAAA,OAAA,CAAQ,CAAA,IAAK,EAAA,EAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACjE;AAEO,SAAS,yBAAyB,OAAA,EAA8B;AACrE,EAAA,MAAM,IAAA,GAAOJ,eAAAA,CAAa,OAAA,EAAS,MAAM,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AAChE,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,QAAS,IAAI,KAAA,CAAM,kCAAkC,OAAO,CAAA;AACjF,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,GAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACvD,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAAyB,MAAA,CAAO,QAAQ,IAAI,CAAA;AACzD,EAAA,MAAM,EAAA,GAAK,IAAI,WAAW,CAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,IAAI,MAAM,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,IAAI,MAAM,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,IAAI,aAAa,CAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,IAAI,gBAAgB,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,IAAI,aAAa,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,IAAI,4BAA4B,CAAA;AAC7C,EAAA,MAAM,GAAA,GAAM,IAAI,UAAU,CAAA;AAC1B,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,CAAC,CAAC,WAAA,EAAa,EAAE,CAAA,EAAG,CAAC,QAAQ,EAAE,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA,EAAY;AAClF,IAAA,IAAI,MAAM,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,wCAAwC,IAAI,CAAA;AAAA,EAC3E;AACA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAuD;AAC1E,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,EAAG;AACjC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAI,CAAA;AACzB,IAAA,MAAM,IAAA,GAAA,CAAQ,CAAA,CAAE,EAAE,CAAA,IAAK,IAAI,IAAA,EAAK;AAChC,IAAA,MAAM,IAAA,GAAA,CAAQ,CAAA,CAAE,EAAE,CAAA,IAAK,IAAI,IAAA,EAAK;AAChC,IAAA,MAAM,IAAA,GAAA,CAAQ,CAAA,CAAE,EAAE,CAAA,IAAK,IAAI,IAAA,EAAK;AAChC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AACpB,IAAA,IAAI,IAAA,KAAS,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,MAAM,IAAI,CAAA;AAClD,IAAA,IAAI,IAAA,KAAS,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,CAAK,CAAA,CAAE,IAAI,CAAC,GAAG,CAAA;AAC7E,IAAA,IAAI,SAAS,SAAA,EAAW;AACxB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAE/B,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,IAAA,KAAA,MAAW,CAAA,IAAK,UAAA,EAAY,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,aAAA,IAAiB,EAAC,EAAG,aAAA,CAAc,IAAI,EAAE,CAAA;AACrG,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA,EAAA,CAAc,CAAA,CAAE,EAAE,CAAA,IAAK,IAAI,IAAA,EAAK;AAAA,MAChC,QAAA,EAAU,IAAA,CAAK,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,MACrB,UAAA;AAAA,MACA,aAAA,EAAe,CAAC,GAAG,aAAa,CAAA;AAAA,MAChC,iBAAA,EAAmB,IAAA,CAAK,CAAA,CAAE,IAAI,CAAC;AAAA,KAChC,CAAA;AAAA,EACH;AACA,EAAA,IAAI,SAAS,MAAA,KAAW,CAAA,QAAS,IAAI,KAAA,CAAM,6CAA6C,OAAO,CAAA;AAC/F,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,YAAY,MAAA,EAAO;AACvD;AAEA,SAAS,OAAO,CAAA,EAAwB;AACtC,EAAA,OAAO,IAAI,GAAA;AAAA,IACT,CAAA,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,iBAAiB,GAAG,CAAA,CAAE,KAAA,CAAM,KAAK,EAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC;AAAA,GACxF;AACF;AAQO,SAAS,kBACd,OAAA,EACA,kBAAA,EACA,cAAA,EACA,gBAAA,EACA,cAAc,GAAA,EACC;AACf,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,cAAA,CAAe,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,WAAA,EAAa,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA;AACrF,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,WAAA,EAAa,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA;AAC1F,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,CAAA,CAAE,IAAA,GAAO,GAAA,GAAM,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA;AACrF,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO,KAAA,MAAW,KAAK,CAAA,EAAG,QAAA,CAAS,IAAI,CAAC,CAAA;AACxD,EAAA,MAAM,WAAA,GAAc,CAAC,EAAA,KACnB,EAAA,CAAG,WAAW,IAAA,CAAK,CAAC,MAAM,GAAA,CAAI,GAAA,CAAI,CAAC,CAAC,CAAA,IAAK,GAAG,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AACnF,EAAA,MAAM,YAAA,GAAe,CAAC,EAAA,KAA4B;AAChD,IAAA,MAAM,QAAQ,MAAA,CAAO,EAAA,CAAG,IAAA,GAAO,GAAA,GAAM,GAAG,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,GAAG,IAAI,GAAA,GAAM,EAAA,CAAG,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAA;AAC/F,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO,IAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,OAAA,EAAA;AAC5C,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM;AACzC,MAAA,MAAM,EAAA,GAAK,EAAE,WAAA,EAAY;AACzB,MAAA,OAAO,CAAC,GAAG,QAAQ,CAAA,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,KAAM,EAAA,IAAO,EAAE,MAAA,IAAU,CAAA,IAAK,EAAA,CAAG,QAAA,CAAS,CAAC,CAAE,CAAA;AAAA,IAChF,CAAC,CAAA,CAAE,MAAA;AACH,IAAA,OAAO,OAAA,GAAU,IAAI,QAAA,GAAW,CAAA;AAAA,EAClC,CAAA;AACA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,CAAC,EAAA,KAAO,WAAA,CAAY,EAAE,CAAA,IAAK,YAAA,CAAa,EAAE,CAAA,IAAK,CAAC,CAAA;AACrF,EAAA,OAAO,IAAA,CACJ,GAAA,CAAI,CAAC,EAAA,MAAQ,EAAE,EAAA,EAAI,CAAA,EAAG,YAAA,CAAa,EAAE,CAAA,EAAE,CAAE,CAAA,CACzC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CACxB,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA,CACpB,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AACpB;AAGO,SAAS,gBAAgB,SAAA,EAAkC;AAChE,EAAA,OAAO,SAAA,CACJ,GAAA,CAAI,CAAC,EAAA,KAAO,OAAO,EAAA,CAAG,IAAA,GAAO,KAAA,GAAQ,EAAA,CAAG,IAAA,GAAO,SAAA,GAAY,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAC1F,EAAA,CAAG,iBAAA,CAAkB,SAAS,cAAA,GAAiB,EAAA,CAAG,iBAAA,CAAkB,IAAA,CAAK,GAAG,CAAA,GAAI,EAAA,CAAG,CAAA,CACrF,KAAK,IAAI,CAAA;AACd;AAGO,SAAS,yBAAyB,OAAA,EAA8B;AACrE,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAoB;AAChD,EAAA,KAAA,MAAW,EAAA,IAAM,OAAA,CAAQ,QAAA,EAAU,KAAA,MAAW,KAAK,EAAA,CAAG,UAAA,EAAY,eAAA,CAAgB,GAAA,CAAI,IAAI,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AAC1H,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAsB;AACxC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,CAAA,IAAK,QAAQ,MAAA,EAAQ;AACzC,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,aAAA,EAAe;AACpC,MAAA,MAAMK,IAAAA,GAAM,KAAA,CAAM,GAAA,CAAI,GAAG,KAAK,EAAC;AAC/B,MAAAA,IAAAA,CAAI,IAAA,CAAK,IAAA,GAAO,GAAA,GAAM,IAAA,CAAK,IAAA,GAAO,IAAA,IAAQ,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA,IAAK,CAAA,CAAA,GAAK,YAAY,CAAA;AACxF,MAAA,KAAA,CAAM,GAAA,CAAI,KAAKA,IAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,CAAA,IAAK,QAAQ,UAAA,EAAY;AAC7C,IAAA,GAAA,CAAI,IAAA,CAAK,WAAA,GAAc,IAAA,GAAO,UAAA,GAAQ,IAAI,CAAA;AAC1C,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,IAAK,EAAC,EAAG,GAAA,CAAI,IAAA,CAAK,aAAA,GAAgB,CAAC,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,GAAA,CAAI,KAAK,IAAI,CAAA;AACtB;ACnGA,IAAMC,UAAAA,GACJ,+DAAA;AAEF,SAAS,eAAe,IAAA,EAAuB;AAC7C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAChC,EAAA,IAAI,QAAQ,CAAA,IAAK,GAAA,IAAO,OAAO,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAChG,EAAA,OAAO,KAAK,KAAA,CAAM,IAAA,CAAK,MAAM,KAAA,EAAO,GAAA,GAAM,CAAC,CAAC,CAAA;AAC9C;AAOA,eAAsB,oBAAoB,IAAA,EAOP;AACjC,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,SAAA,GAAY,QAAA,EAAU,eAAc,GAAI,IAAA;AACjE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,KAAe,MAAM;AAAA,EAAC,CAAA,CAAA;AACvC,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,IAAA,GAAO,CAAA;AACxC,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,4GAAA;AAAA,IACA,YACI,yJAAA,GACA,wFAAA;AAAA,IACJ,sGAAA;AAAA,IACA,kDAAA;AAAA,IACAA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACX,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,oBAAA;AAAA,IACA,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,OAAO,CAAA,CAAE,IAAA,GAAO,IAAA,GAAO,CAAA,CAAE,YAAY,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IACtF,EAAA;AAAA,IACA,uBAAA;AAAA,IACA,yBAAyB,OAAO,CAAA;AAAA,IAChC,EAAA;AAAA,IACA,YACI,iDAAA,GACA;AAAA,GACN,CAAE,KAAK,IAAI,CAAA;AACX,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA;AAAA,IAC1B,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,SAAA,EAAU,EAAG,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,CAAA;AAAA,IAC3E,EAAE,WAAA,EAAa,CAAA,EAAG,SAAA,EAAW,IAAA;AAAK,GACpC;AACA,EAAA,MAAM,GAAA,GAAM,cAAA,CAAe,MAAA,CAAO,OAAO,CAAA;AAGzC,EAAA,MAAM,MAAA,GAAS,SAAA,GAAA,CAAa,GAAA,CAAI,eAAA,IAAmB,EAAC,EAAG,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,GAAI,EAAC;AACtF,EAAA,MAAM,OAAA,GAAU,SAAA,GAAY,EAAC,GAAA,CAAK,GAAA,CAAI,mBAAA,IAAuB,EAAC,EAAG,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC3F,EAAA,GAAA,CAAI,UAAA,EAAY,+BAAA,IAAmC,SAAA,GAAY,QAAA,GAAW,gBAAgB,KAAA,IAAS,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAGpJ,EAAA,MAAM,YAAY,iBAAA,CAAkB,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAC3E,EAAA,GAAA,CAAI,UAAA,EAAY,6BAA6B,SAAA,CAAU,MAAA,GAAS,MAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,4BAA4B,CAAA;AAC5H,EAAA,IAAI,UAAU,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,MAAM,+EAA0E,CAAA;AAEtH,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,gFAAA;AAAA,IACA,+CAAA;AAAA,IACA,CAAA,kSAAA,CAAA;AAAA,IACA,sJAAA;AAAA,IACA,6KAAA;AAAA,IACA,4HAAA;AAAA,IACA,CAAA,gXAAA,CAAA;AAAA,IACA,QAAA;AAAA,IACA,uEAAA;AAAA,IACA,4YAAA;AAAA,IACA,wIAAA;AAAA,IACA,6GAAA;AAAA,IACA,+FAAA;AAAA,IACAA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,cAAA,GAAiB,SAAA;AAAA,IACjB,EAAA;AAAA,IACA,qCAAA;AAAA,IACA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,EAAE,IAAA,EAAM,WAAA,EAAa,CAAA,CAAE,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,UAAU,CAAA,CAAE,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAE,CAAE,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,IAC3J,EAAA;AAAA,IACA,0CAAA,GAA6C,UAAU,MAAA,GAAS,uBAAA;AAAA,IAChE,gBAAgB,SAAS,CAAA;AAAA,IACzB,EAAA;AAAA,IACA,0JAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,IAAA;AAAA,IACvB,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAO,EAAG,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,IACrE,EAAE,WAAA,EAAa,CAAA,EAAG,SAAA,EAAW,IAAA;AAAK,GACpC;AACA,EAAA,GAAA,CAAI,UAAA,EAAY,8CAAA,GAAkD,GAAA,CAAyC,QAAA,GAAW,GAAG,CAAA;AAEzH,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,IAAa,EAAC;AACvC,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,SAAA,CAAU,IAAI,CAAC,CAAA,KAAM,CAAC,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAE5D,EAAA,MAAM,iBAA4C,EAAC;AACnD,EAAA,MAAM,YAA4C,EAAC;AACnD,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AACvB,IAAA,IAAI,CAAC,CAAA,IAAM,CAAA,CAAE,aAAa,cAAA,IAAkB,CAAA,CAAE,aAAa,cAAA,EAAiB;AAE1E,MAAA,MAAM,IAAI,MAAM,UAAA,GAAa,CAAA,CAAE,KAAK,IAAA,GAAO,CAAA,CAAE,OAAO,sDAAiD,CAAA;AAAA,IACvG;AACA,IAAA,IAAI,CAAA,CAAE,aAAa,cAAA,EAAgB;AACjC,MAAA,MAAM,EAAA,GAAK,QAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,SAAS,CAAA;AAC9D,MAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,UAAA,GAAa,CAAA,CAAE,EAAA,GAAK,qCAAA,GAAwC,CAAA,CAAE,SAAA,GAAY,qBAAgB,CAAA;AAGnH,MAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AAC9D,MAAA,MAAM,OAAA,GAAA,CAAW,CAAA,CAAE,gBAAA,IAAoB,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM;AAC7E,QAAA,IAAI,OAAO,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,GAAG,OAAO,IAAA;AACxC,QAAA,MAAM,IAAI,KAAA,CAAM,UAAA,GAAa,CAAA,CAAE,EAAA,GAAK,uBAAuB,CAAA,GAAI,wBAAA,GAA2B,EAAA,CAAG,IAAA,GAAO,qBAAgB,CAAA;AAAA,MACtH,CAAC,CAAA;AACD,MAAA,IAAI,GAAG,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AAClD,QAAA,MAAM,IAAI,MAAM,UAAA,GAAa,CAAA,CAAE,KAAK,mBAAA,GAAsB,EAAA,CAAG,OAAO,8CAAyC,CAAA;AAAA,MAC/G;AACA,MAAA,cAAA,CAAe,IAAA,CAAK,EAAE,GAAG,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,IAAA,EAAM,gBAAA,EAAkB,OAAA,EAAS,CAAA;AACrF,MAAA,QAAA,CAAS,IAAA,CAAK,aAAa,CAAA,CAAE,EAAA,GAAK,sBAAsB,EAAA,CAAG,IAAA,GAAO,OAAO,EAAA,CAAG,IAAA,GAAO,0BAA0B,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,IAAK,CAAA,CAAE,OAAO,UAAA,GAAQ,CAAA,CAAE,OAAO,EAAA,CAAG,CAAA;AAAA,IAClK,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAA,CAAQ,EAAE,aAAA,IAAiB,EAAA,EAAI,aAAY,CAAE,OAAA,CAAQ,eAAe,GAAG,CAAA;AAC7E,MAAA,IAAI,CAAC,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,QAAA,MAAM,IAAI,MAAM,UAAA,GAAa,CAAA,CAAE,KAAK,0BAAA,GAA6B,CAAA,CAAE,gBAAgB,sBAAiB,CAAA;AAAA,MACtG;AACA,MAAA,cAAA,CAAe,IAAA,CAAK,EAAE,GAAG,CAAA,EAAG,IAAI,CAAA,CAAE,EAAA,EAAI,aAAA,EAAe,IAAA,EAAM,CAAA;AAC3D,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,IAAA;AAAA,QACA,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,aAAa,CAAA,CAAE,mBAAA,IAAuB,EAAE,WAAA,CAAY,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,QAChE,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,aAAA,EAAe,IAAA;AAAA,QACf,cAAA,EAAgB,EAAA;AAAA,QAChB,WAAA,EAAa,EAAA;AAAA,QACb,4BAA4B,EAAC;AAAA,QAC7B,MAAA,EAAQ,UAAA;AAAA,QACR,mBAAmB,CAAA,CAAE,EAAA;AAAA,QACrB,wBAAwB,CAAA,CAAE,qBAAA,IAAyB,EAAC,EAAG,OAAO,OAAO;AAAA,OACtE,CAAA;AACD,MAAA,QAAA,CAAS,KAAK,UAAA,GAAa,CAAA,CAAE,EAAA,GAAK,oBAAA,GAAuB,QAAQ,CAAA,CAAE,qBAAA,EAAuB,MAAA,GAAS,kBAAA,GAAqB,EAAE,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA,GAAI,MAAM,EAAA,CAAG,CAAA;AAAA,IACxK;AAAA,EACF;AAGA,EAAA,MAAM,UAAU,aAAA,IAAiBR,SAAAA,CAAKS,SAAA,EAAO,EAAG,oBAAoB,wBAAwB,CAAA;AAC5F,EAAA,IAAI;AACF,IAAAJ,YAAAA,CAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,WAAA,CAAY,GAAG,CAAC,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACzE,IAAAC,gBAAAA,CAAc,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,EAAE,YAAA,EAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,aAAY,EAAG,SAAA,EAAU,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AACrG,IAAA,GAAA,CAAI,UAAA,EAAY,qBAAA,GAAwB,SAAA,CAAU,MAAA,GAAS,SAAS,OAAO,CAAA;AAAA,EAC7E,SAAS,CAAA,EAAG;AACV,IAAA,QAAA,CAAS,IAAA,CAAK,0CAA0C,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA,CAAE,CAAA;AAAA,EACrG;AAEA,EAAA,OAAO,EAAE,SAAA,EAAW,cAAA,EAAgB,SAAA,EAAW,QAAA,EAAU,aAAA,EAAe,SAAA,CAAU,MAAA,EAAQ,WAAA,EAAa,OAAA,CAAQ,QAAA,CAAS,MAAA,EAAO;AACjI;;;AC9JA,SAAS,gBAAgB,QAAA,EAA+B;AACtD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsB;AAE5C,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,CAAC,CAAA;AAC1B,IAAA,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,EAAE,CAAA;AAAA,EAC9B;AAEA,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,KAAA,MAAW,MAAA,IAAU,OAAA,CAAQ,aAAA,IAAiB,EAAC,EAAG;AAEhD,MAAA,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,EAAE,CAAA;AACtC,MAAA,QAAA,CAAS,GAAA,CAAI,QAAQ,EAAA,EAAA,CAAK,QAAA,CAAS,IAAI,OAAA,CAAQ,EAAE,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAAA,IAC9D;AAAA,EACF;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,CAAA,IAAK,QAAA,EAAU;AACnC,IAAA,IAAI,MAAA,KAAW,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AAAA,EACjC;AAEA,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,IAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAEnB,IAAA,KAAA,MAAW,YAAY,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,IAAK,EAAC,EAAG;AACnD,MAAA,MAAM,SAAA,GAAA,CAAa,QAAA,CAAS,GAAA,CAAI,QAAQ,KAAK,CAAA,IAAK,CAAA;AAClD,MAAA,QAAA,CAAS,GAAA,CAAI,UAAU,SAAS,CAAA;AAChC,MAAA,IAAI,SAAA,KAAc,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC1C;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,QAAA,CAAS,MAAA,EAAQ;AAErC,IAAA,OAAA,CAAQ,KAAK,CAAA,oCAAA,EAAuC,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,gBAAA,CAAkB,CAAA;AAAA,EACxG;AAEA,EAAA,OAAO,MAAA;AACT;AA2CA,eAAsB,uBACpB,OAAA,EACuC;AACvC,EAAA,MAAM,EAAE,SAAS,WAAA,EAAa,YAAA,EAAc,WAAW,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,UAAA,EAAW,GAAI,OAAA;AACpG,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,EAAc,GAAA,KAAgB;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,IAAI,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACjC,IAAA,UAAA,GAAa,MAAM,GAAG,CAAA;AAAA,EACxB,CAAA;AAGA,EAAA,GAAA,CAAI,UAAU,sCAAsC,CAAA;AAEpD,EAAA,IAAI,iBAAiB,OAAA,CAAQ,cAAA;AAC7B,EAAA,IAAI,CAAC,kBAAkB,YAAA,EAAc;AACnC,IAAA,cAAA,GAAiB,cAAc,YAAY,CAAA;AAC3C,IAAA,GAAA,CAAI,QAAA,EAAU,oBAAoB,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA,QAAA,EAAW,cAAA,CAAe,SAAA,CAAU,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,EAClH;AAEA,EAAA,MAAM,MAAA,GAAS,gBAAgB,SAAS,CAAA;AAGxC,EAAA,MAAM,mBAAmB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,qBAAA,IAAyB,SAAS,EAAE,CAAA;AAClF,EAAA,IAAI,iBAAA,GAAoB,EAAA;AACxB,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,IAAI,YAAA,CAAa,SAAS,gBAAA,EAAkB;AAC1C,MAAA,iBAAA,GAAoB,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,gBAAgB,CAAA;AAC1D,MAAA,QAAA,CAAS,KAAK,CAAA,wBAAA,EAA2B,YAAA,CAAa,MAAM,CAAA,IAAA,EAAO,gBAAgB,CAAA,oCAAA,CAAiC,CAAA;AAAA,IACtH,CAAA,MAAO;AACL,MAAA,iBAAA,GAAoB,YAAA;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,MAAM,qBAAA,GAAwB,cAAA,IAAkB,cAAA,CAAe,SAAA,CAAU,SAAS,CAAA,GAC9E;AAAA;AAAA,CAAA,GACE,cAAA,CAAe,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,MAAM,CAAA,CAAE,SAAS,CAAA,EAAA,EAAK,CAAA,CAAE,EAAE,CAAA,EAAA,EAAK,EAAE,KAAK,CAAA,YAAA,EAAe,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,GAClI,EAAA;AAEJ,EAAA,MAAM,YAAA,GACJ,ysEAAA;AAgCF,EAAA,MAAM,UAAA,GAAa,YAAY,OAAO;AAAA,EAAK,WAAA,GAAc,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAA,GAAK,EAAE;AAAA,EAAK,qBAAqB,GAAG,iBAAA,GAAoB,CAAA;AAAA,EAAc,iBAAiB,KAAK,EAAE;AAAA,EAAK,SAAA,GAAY,CAAA,YAAA,EAAe,SAAA,CAAU,CAAC,CAAC,IAAI,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA,GAAK,EAAE;AAAA,EAAK,MAAA,GAAS,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA,GAAK,EAAE;;AAAA;AAAA;AAAA;AAAA,WAAA,EAAmD,OAAA,CAAQ,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,aAAA,EAAoB,OAAO,CAAA;AAAA;AAAA,eAAA,EAAiD,UAAU,OAAO,CAAA;AAAA,kBAAA,EAAyB,SAAA,GAAY,CAAA,CAAA,EAAI,SAAA,CAAU,CAAC,CAAC,KAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAA,GAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAEvjB,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,MAAA,EAAQ,cAAc,UAAA,EAAY;AAAA,IACjE,WAAA,EAAa,GAAA;AAAA,IACb,WAAW,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAA,IAAiB,SAAS,EAAE;AAAA,GAC7D,CAAA;AAGD,EAAA,GAAA,CAAI,UAAU,4CAA4C,CAAA;AAE1D,EAAA,MAAM,QAAA,GAAY,MAAA,CAAO,QAAA,IAAY,EAAC;AACtC,EAAA,MAAM,UAAA,GAAc,MAAA,CAAO,UAAA,IAAc,EAAC;AAI1C,EAAA;AACE,IAAA,MAAM,IAAA,mBAAO,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,OAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,OAAO,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,OAAO,CAAC,CAAA;AAC1L,IAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAA2B,IAAA,CAC5C,aAAY,CACZ,OAAA,CAAQ,eAAA,EAAiB,GAAG,CAAA,CAC5B,KAAA,CAAM,KAAK,CAAA,CACX,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,IAAU,KAAK,CAAC,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAC5C,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,MAAM,QAAA,GAAA,CAAY,CAAA,CAAE,QAAA,IAAY,IAAI,GAAA,CAAI,CAAA,CAAA,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAC7E,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,MAAM,OAAA,GAAU,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAG,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA,EAAG,GAAG,UAAA,CAAW,CAAA,CAAE,eAAe,EAAE,CAAC,CAAC,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACpG,QAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,UAAA,MAAM,IAAI,MAAM,UAAA,GAAa,CAAA,CAAE,KAAK,IAAA,GAAO,CAAA,CAAE,OAAO,sFAAiF,CAAA;AAAA,QACvI;AACA,QAAA,CAAA,CAAE,QAAA,GAAW,OAAA;AACb,QAAA,QAAA,CAAS,IAAA,CAAK,aAAa,CAAA,CAAE,EAAA,GAAK,mCAAmC,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,wBAAwB,CAAA;AAAA,MACpH,CAAA,MAAO;AACL,QAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,UAAU,MAAA,CAAO,aAAA;AACvB,EAAA,IAAI,gBAAoC,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAgC;AAAA,IACxF,UAAA,EAAY,MAAA,CAAO,CAAA,CAAE,UAAA,IAAc,EAAE,CAAA;AAAA,IACrC,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,KAAA,IAAS,CAAC,CAAA;AAAA,IAC1B,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,UAAU,CAAA,GAAI,CAAA,CAAE,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA,GAAI,EAAC;AAAA,IACtE,cAAA,EAAgB,MAAA,CAAO,CAAA,CAAE,cAAA,IAAkB,EAAE;AAAA,GAC/C,CAAE,CAAA;AAGJ,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAC,CAAA;AAClD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,KAAA,MAAW,MAAA,IAAU,OAAA,CAAQ,aAAA,IAAiB,EAAC,EAAG;AAChD,MAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA,EAAG;AAC3B,QAAA,QAAA,CAAS,KAAK,CAAA,QAAA,EAAW,OAAA,CAAQ,EAAE,CAAA,sCAAA,EAAyC,MAAM,CAAA,eAAA,CAAY,CAAA;AAC9F,QAAA,OAAA,CAAQ,aAAA,GAAA,CAAiB,QAAQ,aAAA,IAAiB,IAAI,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,MAAM,CAAA;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAMA,EAAA,IAAI,QAAQ,iBAAA,EAAmB;AAC7B,IAAA,MAAM,OAAA,GAAU,wBAAA,CAAyB,OAAA,CAAQ,iBAAiB,CAAA;AAClE,IAAA,GAAA,CAAI,UAAA,EAAY,yBAAA,GAA4B,OAAA,CAAQ,QAAA,CAAS,MAAA,GAAS,iBAAA,GAAoB,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAK,CAAA;AACvH,IAAA,MAAM,GAAA,GAAM,MAAM,mBAAA,CAAoB;AAAA,MACpC,MAAA;AAAA,MACA,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC7B,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,WAAA,EAAa,EAAE,WAAA,IAAe,EAAA;AAAA,QAC9B,QAAA,EAAU,CAAA,CAAE,QAAA,IAAY;AAAC,OAC3B,CAAE,CAAA;AAAA,MACF,OAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,UAAA,EAAY;AAAA,KACb,CAAA;AACD,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,GAAA,CAAI,QAAQ,CAAA;AAC7B,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAC7D,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC5B,MAAA,IAAI,CAAC,GAAG,MAAM,IAAI,MAAM,UAAA,GAAa,CAAA,CAAE,KAAK,sDAAiD,CAAA;AAC7F,MAAA,IAAI,CAAA,CAAE,aAAa,cAAA,EAAgB;AACjC,QAAA,CAAA,CAAE,eAAA,GAAkB,cAAA;AACpB,QAAA,CAAA,CAAE,YAAY,CAAA,CAAE,SAAA;AAChB,QAAA,CAAA,CAAE,OAAO,CAAA,CAAE,SAAA;AACX,QAAA,MAAM,EAAA,GAAK,QAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,SAAS,CAAA;AAC9D,QAAA,IAAI,EAAA,EAAI;AAGN,UAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,gBAAA,IAAoB,EAAC,EAAG;AACxC,YAAA,IAAI,CAAA,CAAE,CAAA,CAAE,QAAA,IAAY,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAY,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG;AACxE,cAAA,CAAA,CAAE,WAAW,CAAC,GAAI,EAAE,QAAA,IAAY,IAAK,CAAC,CAAA;AAAA,YACxC;AAAA,UACF;AACA,UAAA,CAAA,CAAE,qBAAqB,EAAA,CAAG,iBAAA;AAAA,QAC5B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,CAAA,CAAE,eAAA,GAAkB,cAAA;AACpB,QAAA,CAAA,CAAE,OAAO,CAAA,CAAE,aAAA;AAAA,MACb;AAAA,IACF;AAGA,IAAA,MAAM,eAAe,IAAI,GAAA,CAAI,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAS,EAAE,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,CAAE,WAAqB,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AAC1G,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,KAAA,MAAW,EAAA,IAAM,CAAA,CAAE,kBAAA,IAAsB,EAAC,EAAG;AAC3C,QAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AAClC,QAAA,IAAI,MAAA,IAAU,MAAA,KAAW,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,CAAA,CAAE,aAAA,IAAiB,EAAC,EAAG,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1E,UAAA,CAAA,CAAE,gBAAgB,CAAC,GAAI,EAAE,aAAA,IAAiB,IAAK,MAAM,CAAA;AACrD,UAAA,QAAA,CAAS,IAAA,CAAK,8BAA8B,CAAA,CAAE,EAAA,GAAK,SAAS,EAAA,GAAK,IAAA,GAAO,SAAS,GAAG,CAAA;AAAA,QACtF;AAAA,MACF;AAAA,IACF;AACA,IAAA,GAAA,CAAI,UAAA,EAAY,mBAAmB,GAAA,CAAI,SAAA,CAAU,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,cAAc,CAAA,CAAE,SAC1F,kBAAA,GAAqB,GAAA,CAAI,UAAU,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,cAAc,CAAA,CAAE,MAAM,CAAA;AAAA,EAC5F;AAGA,EAAA,GAAA,CAAI,UAAU,qCAAqC,CAAA;AAEnD,EAAA,MAAM,MAAA,GAAS,yBAAyB,QAAQ,CAAA;AAChD,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,GAAA,CAAI,QAAA,EAAU,CAAA,MAAA,EAAS,MAAA,CAAO,MAAM,CAAA,sDAAA,CAAmD,CAAA;AACvF,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,QAAA,CAAS,KAAK,CAAA,gBAAA,EAAmB,KAAA,CAAM,IAAA,CAAK,UAAK,CAAC,CAAA,gCAAA,CAA6B,CAAA;AAAA,IACjF;AAEA,IAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,uBAAA,CAAwB,UAAU,MAAM,CAAA;AAEnE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO,QAAA,CAAS,CAAC,CAAA,CAAE,EAAE,CAAA;AAC5D,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,QAAA,CAAS,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC,CAAA,EAAG,aAAA,EAAe,YAAA,CAAa,aAAA,EAAc;AAAA,MAC5E;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,EAAE,IAAA,EAAM,EAAA,EAAG,IAAK,OAAA,EAAS;AAClC,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,2BAAA,EAA8B,IAAI,CAAA,QAAA,EAAM,EAAE,CAAA,gBAAA,CAAkB,CAAA;AAAA,IAC5E;AAAA,EACF;AAGA,EAAA,GAAA,CAAI,UAAU,iCAAiC,CAAA;AAE/C,EAAA,MAAM,SAAA,GAAY,gBAAgB,QAAQ,CAAA;AAG1C,EAAA,YAAA,GAAe,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,EAAI,GAAA,KAAQ;AACxC,IAAA,MAAM,UAAU,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,EAAE,CAAA;AAC9C,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,EAAA;AAAA,MACZ,OAAO,GAAA,GAAM,CAAA;AAAA,MACb,UAAA,EAAY,OAAA,EAAS,aAAA,IAAiB,EAAC;AAAA,MACvC,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,UAAU,sDAAsD,CAAA;AAEpE,EAAA;AACE,IAAA,MAAM,KAAK,MAAM,+BAAA;AAAA,MACf,MAAA;AAAA,MACA,SAAS,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,MAAM,WAAA,EAAa,CAAA,CAAE,aAAa,QAAA,EAAU,CAAA,CAAE,UAAS,CAAE,CAAA;AAAA,MAClG,cAAc,MAAA,KAAW,UAAA,IAAc,MAAA,KAAW,YAAA,GAAe,WAAY,MAAA,IAAU,SAAA,CAAA;AAAA,MACvF;AAAA,KACF;AACA,IAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,IAAA,GAAO,CAAC,CAAA;AAC5F,IAAA,MAAM,OAAA,GAAU,WAAW,SAAA,KAAc,MAAA,KAAW,cAAc,MAAA,KAAW,YAAA,GAAe,QAAA,GAAY,MAAA,IAAU,SAAA,CAAW,CAAA;AAC7H,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,OAAA,CAAQ,MAAM,EAAA,CAAG,YAAA,CAAa,QAAQ,EAAE,CAAA,IAAK,QAAQ,GAAA,IAAO,EAAA;AAC5D,MAAA,OAAA,CAAQ,MAAM,EAAA,CAAG,YAAA,CAAa,QAAQ,EAAE,CAAA,IAAK,QAAQ,GAAA,IAAO,EAAA;AAC5D,MAAA,IAAI,EAAA,CAAG,YAAA,CAAa,OAAA,CAAQ,EAAE,CAAA,IAAK,EAAA,CAAG,YAAA,CAAa,OAAA,CAAQ,EAAE,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG;AACzE,QAAA,OAAA,CAAQ,GAAA,GAAM,EAAA,CAAG,YAAA,CAAa,OAAA,CAAQ,EAAE,CAAA;AAAA,MAC1C;AAIA,MAAA,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,eAAA,CAAgB,QAAQ,EAAE,CAAA;AACzD,MAAA,OAAA,CAAQ,WAAW,OAAA,CAAQ,GAAA,GAAM,QAAQ,OAAA,CAAQ,IAAK,IAAI,OAAA,CAAQ,QAAA;AAClE,MAAA,OAAA,CAAQ,QAAA,GAAW,OAAA,CAAQ,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAO,CAAA,EAAG,aAAA,CAAc,OAAA,CAAQ,GAAG,CAAC,CAAA,GAAI,OAAA,CAAQ,QAAA;AACjG,MAAA,OAAA,CAAQ,YAAY,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,GACrC,OAAA,CAAQ,IAAI,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,OAAA,CAAQ,SAAS,OAAA,CAAQ,IAAA,EAAO,IAAI,CAAC,CAAC,IAChE,OAAA,CAAQ,SAAA;AAAA,IACd;AACA,IAAA,GAAA,CAAI,UAAU,yBAAA,GAA4B,QAAA,CAAS,MAAA,GAAS,mBAAA,GACzD,GAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA,CAAE,SAAU,GAAA,GAAM,QAAA,CAAS,SAAS,SAAS,CAAA;AAAA,EAClF;AAGA,EAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AACpC,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,8CAAA,EAAiD,IAAA,CAAK,UAAU,CAAA,CAAE,CAAA;AAAA,IAClF;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,QAAA,EAAU,CAAA,UAAA,EAAa,QAAA,CAAS,MAAM,CAAA,WAAA,EAAc,WAAW,MAAM,CAAA,aAAA,EAAgB,YAAA,CAAa,MAAM,CAAA,oBAAA,CAAsB,CAAA;AAElI,EAAA,MAAM,QAAA,GAA2B;AAAA,IAC/B,cAAA,EAAgB,CAAA;AAAA,IAChB,IAAA,EAAM,iBAAA;AAAA,IACN,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,QAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA,EAAe;AAAA,GACjB;AAGA,EAAA,GAAA,CAAI,UAAU,kEAAkE,CAAA;AAChF,EAAA,MAAM,EAAE,aAAA,EAAe,MAAA,EAAO,GAAI,oBAAA,CAAqB,UAAU,cAAc,CAAA;AAC/E,EAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,QAAQ,CAAA;AAEhC,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,aAAA;AAAA,IAChB,QAAA;AAAA,IACA,kBAAA,EAAoB;AAAA,GACtB;AACF;;;ACtaA,0BAAA,EAAA;AAkBA,eAAsB,0BACpB,OAAA,EACkC;AAClC,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,iBAAiB,OAAA,CAAQ,cAAA;AAE7B,EAAA,IAAI,CAAC,cAAA,IAAkB,OAAA,CAAQ,YAAA,EAAc;AAC3C,IAAA,cAAA,GAAiB,aAAA,CAAc,QAAQ,YAAY,CAAA;AAAA,EACrD;AAEA,EAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,OAAA,IAAW,cAAA,EAAgB,QAAQ,KAAA,IAAS,kBAAA;AAC7E,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,MAAA,IAAU,cAAA,EAAgB,QAAQ,MAAA,IAAU,OAAA;AAC5E,EAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,SAAA,IAAa,cAAA,EAAgB,OAAA,CAAQ,SAAA;AACxE,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,WAAA,IAAe,cAAA,EAAgB,OAAA,CAAQ,WAAA;AAErE,EAAA,MAAM,MAAA,GAAS,MAAM,sBAAA,CAAuB;AAAA,IAC1C,GAAG,OAAA;AAAA,IACH,OAAA,EAAS,gBAAA;AAAA,IACT,MAAA,EAAQ,eAAA;AAAA,IACR,SAAA,EAAW,kBAAA;AAAA,IACX,WAAA,EAAa,aAAA;AAAA,IACb;AAAA,GACD,CAAA;AAED,EAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,QAAQ,CAAA;AAGhC,EAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,MAAA,CAAO,cAAA,EAAgB;AAAA,IAC/D;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,cAAA;AAAA,IACA,cAAA;AAAA,IACA,oBAAoB,MAAA,CAAO,kBAAA;AAAA,IAC3B;AAAA,GACF;AACF;;;ACjCA,eAAsB,oBACpB,OAAA,EACoC;AACpC,EAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAgB,SAAA,EAAW,YAAW,GAAI,OAAA;AAChE,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,EAAc,GAAA,KAAgB;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,GAAS,IAAA,GAAO,IAAA,GAAO,GAAG,CAAA;AACtC,IAAA,UAAA,GAAa,MAAM,GAAG,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,IAAY,EAAC;AAC3C,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,QAAA,IAAY,EAAC;AAE7C,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAClD,IAAA,QAAA,CAAS,KAAK,iCAAiC,CAAA;AAC/C,IAAA,OAAO;AAAA,MACL,WAAA,EAAa;AAAA,QACX,cAAA,EAAgB,CAAA;AAAA,QAChB,IAAA,EAAM,cAAA;AAAA,QACN,aAAA,EAAe,YAAA;AAAA,QACf,eAAA,EAAiB,cAAA;AAAA,QACjB,OAAO,EAAC;AAAA,QACR,QAAQ,EAAC;AAAA,QACT,WAAA,EAAa,EAAA;AAAA,QACb,qBAAA,EAAuB,CAAA;AAAA,QACvB,qBAAA,EAAuB,CAAA;AAAA,QACvB,uBAAA,EAAyB;AAAA,OAC3B;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,gBAAgB,SAAS,CAAA;AAExC,EAAA,MAAM,eAAe,QAAA,CAAS,GAAA;AAAA,IAAI,CAAA,CAAA,KAChC,IAAA,GAAO,CAAA,CAAE,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,KAAA,IAAS,CAAA,CAAE,WAAA,IAAe,EAAA,CAAA,GACxD,cAAA,GAAA,CAAkB,CAAA,CAAE,KAAA,IAAS,EAAC,EAAG,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,IAAY,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAAI;AAAA,GAC3F,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,MAAM,eAAe,QAAA,CAAS,GAAA;AAAA,IAAI,CAAA,CAAA,KAChC,OAAO,CAAA,CAAE,EAAA,GAAK,OAAO,CAAA,CAAE,IAAA,GAAO,UAAA,GAAA,CAAc,CAAA,CAAE,GAAA,IAAO,EAAA,EAAI,MAAM,CAAA,EAAG,GAAG,IACrE,mBAAA,GAAA,CAAuB,CAAA,CAAE,iBAAiB,EAAC,EAAG,IAAA,CAAK,IAAI,CAAA,GAAI;AAAA,GAC7D,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,MAAM,YAAA,GACJ,6pBAAA;AAaF,EAAA,MAAM,UAAA,GAAa,aAAA,GAAgB,YAAA,GAAe,iBAAA,GAAoB,YAAA,GAAe,gEAAA;AAGrF,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,MAAA,EAAQ,cAAc,UAAA,EAAY;AAAA,IACjE,WAAA,EAAa,GAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,QAAA,GAAY,MAAA,CAAO,KAAA,IAAS,EAAC;AAEnC,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAC,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAC,CAAA;AAClD,EAAA,MAAM,aAAmC,EAAC;AAE1C,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,UAAA,IAAc,EAAE,CAAA;AACxC,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,UAAA,IAAc,EAAE,CAAA;AACxC,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,MAAA,QAAA,CAAS,IAAA,CAAK,0CAA0C,GAAG,CAAA;AAC3D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,MAAA,QAAA,CAAS,IAAA,CAAK,0CAA0C,GAAG,CAAA;AAC3D,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY,GAAA;AAAA,MACZ,YAAA,EAAe,KAAK,YAAA,IAAwE,UAAA;AAAA,MAC5F,KAAA,EAAQ,KAAK,KAAA,IAAmC,KAAA;AAAA,MAChD,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,WAAA,IAAe,EAAE,CAAA;AAAA,MAC1C,wBAAA,EAA0B,MAAA,CAAO,IAAA,CAAK,wBAAwB,CAAA,IAAK,CAAA;AAAA,MACnE,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,GAAA,CAAI,QAAA,EAAU,YAAA,GAAe,UAAA,CAAW,MAAA,GAAS,wBAAwB,CAAA;AAEzE,EAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB;AAAA,IACnC,QAAA;AAAA,IAAU,QAAA;AAAA,IAAU,KAAA,EAAO,UAAA;AAAA,IAAY,MAAA;AAAA,IAAQ,GAAA;AAAA,IAAK;AAAA,GACrD,CAAA;AACD,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAoB;AAC/C,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,KAAA,MAAW,OAAO,EAAA,CAAG,WAAA,iBAA4B,GAAA,CAAI,GAAA,EAAK,GAAG,EAAE,CAAA;AAAA,EACjE;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,YAAY,IAAA,CAAK,QAAA,GAAW,eAAe,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA,IAAK,EAAA;AAEtF,EAAA,GAAA,CAAI,UAAU,uBAAuB,CAAA;AAErC,EAAA,MAAM,mBAAA,GAAsB,QAAA,CAAS,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM;AACtD,IAAA,MAAM,cAAA,GAAA,CAAkB,CAAA,CAAE,KAAA,IAAS,IAAI,MAAA,CAAO,CAAC,CAAA,EAAG,IAAA,KAAS,CAAA,IAAK,IAAA,CAAK,MAAA,EAAQ,iBAAA,IAAqB,KAAK,CAAC,CAAA;AACxG,IAAA,OAAO,GAAA,GAAM,cAAA;AAAA,EACf,GAAG,CAAC,CAAA;AAEJ,EAAA,MAAM,mBAAA,GAAsB,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,IAAO,CAAA,CAAE,iBAAA,IAAqB,EAAA,CAAA,EAAK,CAAC,CAAA;AAE5F,EAAA,MAAM,sBAAA,uBAA6B,GAAA,EAAoB;AACvD,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,MAAM,IAAA,GAAO,KAAK,wBAAA,IAA4B,CAAA;AAC9C,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA,IAAK,CAAA;AAChE,MAAA,sBAAA,CAAuB,IAAI,IAAA,CAAK,UAAA,EAAY,KAAK,GAAA,CAAI,QAAA,EAAU,IAAI,CAAC,CAAA;AAAA,IACtE;AAAA,EACF;AACA,EAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,IAAA,CAAK,sBAAA,CAAuB,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAEhG,EAAA,OAAO;AAAA,IACL,WAAA,EAAa;AAAA,MACX,cAAA,EAAgB,CAAA;AAAA,MAChB,IAAA,EAAM,cAAA;AAAA,MACN,aAAA,EAAe,YAAA;AAAA,MACf,eAAA,EAAiB,cAAA;AAAA,MACjB,KAAA,EAAO,UAAA;AAAA,MACP,MAAA;AAAA,MACA,WAAA,EAAa,kCAAkC,MAAA,CAAO,MAAA,GAAS,cAAc,QAAA,CAAS,MAAA,GAAS,aAAA,GAAgB,QAAA,CAAS,MAAA,GAAS,WAAA;AAAA,MACjI,qBAAA,EAAuB,mBAAA;AAAA,MACvB,qBAAA,EAAuB,mBAAA;AAAA,MACvB,yBAAyB,mBAAA,GAAsB;AAAA,KACjD;AAAA,IACA;AAAA,GACF;AACF;AAUA,SAAS,eACP,IAAA,EACA,QAAA,EACA,QAAA,EACA,KAAA,EACA,UACA,GAAA,EACkD;AAClD,EAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAC,CAAA;AACvD,EAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAC,CAAA;AACvD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAsB;AAC3C,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,CAAE,aAAA,IAAiB,EAAC,EAAG,OAAO,CAAA,CAAA,KAAK,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA;AAExG,EAAA,MAAM,SAA6B,EAAC;AACpC,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,EAAA,EAAI,GAAA,KAAQ;AACxB,IAAA,MAAM,KAAK,MAAA,CAAO,EAAA,CAAG,EAAA,IAAO,IAAA,IAAQ,MAAM,CAAA,CAAG,CAAA;AAC7C,IAAA,MAAM,QAAQ,GAAA,GAAM,CAAA;AACpB,IAAA,MAAM,IAAA,GAAO,OAAO,EAAA,CAAG,IAAA,IAAS,WAAW,KAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC9D,IAAA,MAAM,oBAAoB,MAAA,CAAO,EAAA,CAAG,kBAAA,IAAsB,EAAE,EAAE,IAAA,EAAK;AACnE,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,WAAW,CAAA,GAAI,EAAA,CAAG,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA,GAAI,EAAC;AACpF,IAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,EAAA,CAAG,UAAU,CAAA,GAAK,EAAA,CAAG,aAAgD,EAAC;AAEtG,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK,QAAA,GAAW,EAAA,GAAK,wFAAwF,CAAA;AAAA,IACtH;AAEA,IAAA,MAAM,qBAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,MAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,QAAA,MAAA,CAAO,IAAA,CAAK,QAAA,GAAW,EAAA,GAAK,oBAAA,GAAuB,GAAG,CAAA;AACtD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,QAAA,MAAA,CAAO,IAAA,CAAK,UAAA,GAAa,GAAA,GAAM,oBAAA,GAAuB,YAAA,CAAa,IAAI,GAAG,CAAA,GAAI,OAAA,GAAU,EAAA,GAAK,kDAAkD,CAAA;AAC/I,QAAA;AAAA,MACF;AACA,MAAA,YAAA,CAAa,GAAA,CAAI,KAAK,EAAE,CAAA;AACxB,MAAA,kBAAA,CAAmB,KAAK,GAAG,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,gBAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,EAAA,CAAG,UAAA,IAAc,EAAE,CAAA;AACtC,MAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,QAAA,MAAA,CAAO,IAAA,CAAK,QAAA,GAAW,EAAA,GAAK,+BAAA,GAAkC,GAAG,CAAA;AACjE,QAAA;AAAA,MACF;AACA,MAAA,MAAM,SAAS,MAAA,CAAO,EAAA,CAAG,UAAU,KAAK,CAAA,KAAM,aAAa,UAAA,GAAa,KAAA;AACxE,MAAA,IAAI,WAAW,UAAA,EAAY;AACzB,QAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACnC,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,MAAA,CAAO,IAAA,CAAK,QAAA,GAAW,EAAA,GAAK,6BAAA,GAAgC,MAAM,oEAAoE,CAAA;AACtI,UAAA;AAAA,QACF;AACA,QAAA,IAAI,SAAS,KAAA,EAAO;AAClB,UAAA,MAAA,CAAO,KAAK,QAAA,GAAW,EAAA,GAAK,6BAAA,GAAgC,GAAA,GAAM,oDAAoD,KAAK,CAAA;AAC3H,UAAA;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AACjC,QAAA,MAAA,CAAO,IAAA,CAAK,QAAA,GAAW,EAAA,GAAK,kCAAA,GAAqC,GAAA,GAAM,mCAAmC,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,GAAI,GAAG,CAAA;AACtI,QAAA;AAAA,MACF,CAAA,MAAO;AACL,QAAA,aAAA,CAAc,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,MAC9B;AACA,MAAA,KAAA,MAAW,OAAO,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,IAAK,EAAC,EAAG;AACzC,QAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,UAAA,MAAA,CAAO,KAAK,QAAA,GAAW,EAAA,GAAK,eAAe,GAAA,GAAM,sCAAA,GAAyC,MAAM,kDAAkD,CAAA;AAAA,QACpJ;AAAA,MACF;AACA,MAAA,aAAA,CAAc,IAAA,CAAK,EAAE,UAAA,EAAY,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,IAAA,IAAQ,EAAE,CAAA,EAAG,CAAA;AAAA,IAC7E;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,EAAA;AAAA,MAAI,KAAA;AAAA,MAAO,IAAA;AAAA,MACX,kBAAA,EAAoB,iBAAA;AAAA,MACpB,WAAA,EAAa,kBAAA;AAAA,MACb,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,GAAA,KAAO,CAAC,YAAA,CAAa,GAAA,CAAI,GAAG,CAAC,CAAA;AAC5E,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,MAAA,CAAO,IAAA,CAAK,sCAAA,GAAyC,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACzE;AACA,EAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAoB;AACnD,EAAA,MAAM,mBAAA,uBAA0B,GAAA,EAAoB;AACpD,EAAA,KAAA,MAAW,EAAA,IAAM,MAAA,EAAQ,KAAA,MAAW,GAAA,IAAO,EAAA,CAAG,aAAa,mBAAA,CAAoB,GAAA,CAAI,GAAA,EAAK,EAAA,CAAG,KAAK,CAAA;AAChG,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,EAAA,GAAK,mBAAA,CAAoB,GAAA,CAAI,CAAA,CAAE,UAAU,CAAA;AAC/C,IAAA,IAAI,OAAO,MAAA,EAAW;AACtB,IAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,GAAA,CAAI,CAAA,CAAE,UAAU,CAAA;AAC/C,IAAA,IAAI,GAAA,KAAQ,UAAa,EAAA,GAAK,GAAA,qBAAwB,GAAA,CAAI,CAAA,CAAE,YAAY,EAAE,CAAA;AAAA,EAC5E;AACA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,aAAa,CAAA,IAAK,kBAAA,EAAoB;AACrD,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACnC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,UAAA,GAAa,GAAA,GAAM,0BAAA,GAA6B,gBAAgB,oCAAoC,CAAA;AAAA,IAClH,CAAA,MAAA,IAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,MAAA,CAAO,KAAK,UAAA,GAAa,GAAA,GAAM,0BAA0B,KAAA,GAAQ,+BAAA,GAAkC,gBAAgB,2DAA2D,CAAA;AAAA,IAChL;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAC1B;AAEA,eAAe,gBAAgB,IAAA,EAAwD;AACrF,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAU,OAAO,MAAA,EAAQ,GAAA,EAAK,UAAS,GAAI,IAAA;AAE7D,EAAA,MAAM,cAAc,QAAA,CAAS,GAAA;AAAA,IAAI,CAAA,CAAA,KAC/B,IAAA,GAAO,CAAA,CAAE,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,KAAA,GAAA,CAAS,CAAA,CAAE,WAAA,IAAe,EAAA,EAAI,KAAA,CAAM,GAAG,GAAG;AAAA,GAC1E,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,MAAM,cAAc,QAAA,CAAS,GAAA;AAAA,IAAI,CAAA,CAAA,KAC/B,IAAA,GAAO,CAAA,CAAE,EAAA,GAAK,OAAO,CAAA,CAAE,IAAA,GAAO,mBAAA,IAAA,CAAwB,CAAA,CAAE,iBAAiB,EAAC,EAAG,IAAA,CAAK,IAAI,KAAK,MAAA,CAAA,GAAU;AAAA,GACvG,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,MAAM,WAAW,KAAA,CAAM,GAAA;AAAA,IAAI,CAAA,CAAA,KACzB,OAAO,CAAA,CAAE,UAAA,GAAa,SAAS,CAAA,CAAE,UAAA,GAAa,IAAA,GAAO,CAAA,CAAE,KAAA,GAAQ;AAAA,GACjE,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,QAAA;AAEhB,EAAA,MAAM,YAAA,GACJ,+5CAAA;AAqBF,EAAA,MAAM,iBAAiB,aAAA,GAAgB,WAAA,GAAc,iBAAA,GAAoB,WAAA,GACrE,iCAAiC,QAAA,GAAW,mLAAA;AAKhD,EAAA,MAAM,sBAAA,GAAyB,CAAA;AAC/B,EAAA,IAAI,cAAwB,EAAC;AAC7B,EAAA,IAAI,SAA6B,EAAC;AAClC,EAAA,IAAI,YAA4C,EAAC;AACjD,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,sBAAA,EAAwB,OAAA,EAAA,EAAW;AAClE,IAAA,MAAM,UAAA,GAAa,OAAA,KAAY,CAAA,GAC3B,cAAA,GACA,iBACE,yEAAA,GACA,WAAA,CAAY,GAAA,CAAI,CAAC,MAAM,IAAA,GAAO,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAC1C,2CAAA;AAEN,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,MAAA,EAAQ,cAAc,UAAA,EAAY;AAAA,MACjE,WAAA,EAAa,GAAA;AAAA,MACb,SAAA,EAAW;AAAA,KACZ,CAAA;AAED,IAAA,SAAA,GAAa,MAAA,CAAO,UAAU,EAAC;AAC/B,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,IAAI,YAAY,sBAAA,EAAwB;AACtC,QAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,MAChF;AACA,MAAA,WAAA,GAAc,CAAC,sBAAsB,CAAA;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,CAAC,EAAE,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,GAAI,cAAA,CAAe,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,KAAoB,CAAA;AACrG,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC9B,IAAA,IAAI,UAAU,sBAAA,EAAwB;AACpC,MAAA,GAAA,CAAI,QAAA,EAAU,0BAA0B,WAAA,CAAY,MAAA,GAAS,6BAA6B,OAAA,GAAU,CAAA,CAAA,GAAK,GAAA,GAAM,sBAAA,GAAyB,GAAG,CAAA;AAAA,IAC7I;AAAA,EACF;AACA,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,oEAAA,GAAuE,WAAA,CAAY,MAAA,GAAS,eAAA,GAC1F,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,GAAS,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAC5C;AAAA,KACJ;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAC9C,IAAA,QAAA,CAAS,IAAA,CAAK,qBAAA,GAAwB,QAAA,CAAS,MAAA,GAAS,yDAAyD,CAAA;AAAA,EACnH;AAEA,EAAA,GAAA,CAAI,QAAA,EAAU,qBAAqB,MAAA,CAAO,MAAA,GAAS,cAC/C,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,GAAK,GAAA,GAAM,EAAE,WAAA,CAAY,MAAA,GAAS,OAAO,CAAA,CAAE,UAAA,CAAW,SAAS,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AACrG,EAAA,OAAO,MAAA;AACT;;;ACrXA,0BAAA,EAAA;AAeA,eAAsB,uBACpB,OAAA,EAC+B;AAC/B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,OAAO,CAAA;AAChD,EAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,QAAQ,CAAA;AAEhC,EAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,MAAA,CAAO,WAAA,EAAa;AAAA,IAC5D;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,cAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACTA,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,EAC9B,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,MAAA;AAAA,EAC3E,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM;AAC5E,CAAC,CAAA;AAED,IAAM,mBAAA,uBAA0B,GAAA,CAAI;AAAA,EAClC,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,MAAA;AAAA;AAAA,EAC1C,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA;AAAA,EACzC,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,OAAA;AAAA;AAAA,EAClC,MAAA;AAAA,EAAQ,MAAA;AAAA;AAAA,EACR,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA;AAAA,EAChB,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ;AAAA;AAClB,CAAC,CAAA;AAKM,SAAS,gBAAgB,OAAA,EAA2D;AACzF,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,gBAAA,GAAmB,CAAA;AAGvB,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,SAAA,IAAa,GAAA;AACb,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,kBAAA,EAAqB,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,SAAA,IAAa,GAAA;AACb,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,kBAAA,EAAqB,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAAA,EACtD;AAGA,EAAA,IAAI,OAAA,CAAQ,YAAA,IAAgB,OAAA,CAAQ,YAAA,CAAa,SAAS,EAAA,EAAI;AAC5D,IAAA,aAAA,IAAiB,GAAA;AACjB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,uBAAA,EAA0B,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,EAC9E;AACA,EAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AACnD,IAAA,aAAA,IAAiB,GAAA;AACjB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,kBAAA,CAAoB,CAAA;AAAA,EAC9D;AAGA,EAAA,IAAI,OAAA,CAAQ,cAAA,IAAkB,OAAA,CAAQ,cAAA,CAAe,SAAS,CAAA,EAAG;AAC/D,IAAA,MAAM,SAAA,GAAY,QAAQ,cAAA,CAAe,MAAA,CAAO,SAAO,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAC,CAAA,CAAE,MAAA;AACjF,IAAA,MAAM,YAAA,GAAe,QAAQ,cAAA,CAAe,MAAA,CAAO,SAAO,mBAAA,CAAoB,GAAA,CAAI,GAAG,CAAC,CAAA,CAAE,MAAA;AAExF,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,UAAA,IAAc,GAAA;AACd,MAAA,QAAA,CAAS,KAAK,CAAA,EAAG,YAAY,CAAA,0BAAA,EAA6B,OAAA,CAAQ,eAAe,MAAA,CAAO,CAAA,GAAA,KAAO,mBAAA,CAAoB,GAAA,CAAI,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC3I;AACA,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,SAAA,KAAc,CAAA,EAAG;AACpC,MAAA,SAAA,IAAa,GAAA;AACb,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,2BAAA,CAA6B,CAAA;AAAA,IACzD;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,GAAA,EAAK;AAC3D,IAAA,gBAAA,IAAoB,GAAA;AACpB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,sBAAA,EAAyB,OAAA,CAAQ,WAAA,CAAY,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,EAC5E;AACA,EAAA,IAAI,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,IAAA,CAAK,SAAS,EAAA,EAAI;AAC5C,IAAA,gBAAA,IAAoB,GAAA;AACpB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,eAAA,EAAkB,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,EAC9D;AAGA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,EAAE,IAAA,EAAM,YAAA,EAA2B,KAAA,EAAO,SAAA,EAAU;AAAA,IACpD,EAAE,IAAA,EAAM,UAAA,EAAyB,KAAA,EAAO,aAAA,EAAc;AAAA,IACtD,EAAE,IAAA,EAAM,OAAA,EAAsB,KAAA,EAAO,UAAA,EAAW;AAAA,IAChD,EAAE,IAAA,EAAM,aAAA,EAA4B,KAAA,EAAO,gBAAA;AAAiB,GAC9D;AAEA,EAAA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,OAAO,CAAC,CAAA;AAGvB,EAAA,MAAM,cAAc,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,GAAG,CAAA;AACrD,EAAA,IAAI,WAAA,CAAY,UAAU,CAAA,EAAG;AAC3B,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,OAAA;AAAA,MACX,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,CAAC,GAAG,QAAA,EAAU,yBAAyB,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE;AAAA,KAC7F;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACtB,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,aAAA;AAAA,MACX,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,CAAC,GAAG,QAAA,EAAU,oDAA+C;AAAA,KACzE;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,WAAW,MAAA,CAAO,IAAA;AAAA,IAClB,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,OAAO,CAAG,CAAA;AAAA,IACtC;AAAA,GACF;AACF;;;ACjGA,IAAM,eAAA,GAAoD;AAAA,EACxD,QAAA,EAAU;AAAA,IACR,KAAA;AAAA,IAAO,KAAA;AAAA,IAAO,KAAA;AAAA,IAAO,UAAA;AAAA,IAAY,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,QAAA;AAAA,IACxD,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,KAAA;AAAA,IAAO,SAAA;AAAA,IAAW,MAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,MAAA;AAAA,IACtD,YAAA;AAAA,IAAc,YAAA;AAAA,IAAc,MAAA;AAAA,IAAQ,KAAA;AAAA,IAAO,KAAA;AAAA,IAAO,MAAA;AAAA,IAAQ,SAAA;AAAA,IAC1D,KAAA;AAAA,IAAO,QAAA;AAAA,IAAU,YAAA;AAAA,IAAc,OAAA;AAAA,IAAS,QAAA;AAAA,IACxC,SAAA;AAAA,IAAW,OAAA;AAAA,IAAS,SAAA;AAAA,IAAW,QAAA;AAAA,IAAU,SAAA;AAAA,IAAW,KAAA;AAAA,IACpD,QAAA;AAAA,IAAU,MAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,QAAA;AAAA,IAAU,OAAA;AAAA,IAAS;AAAA,GACjD;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,SAAA;AAAA,IAAW,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,MAAA;AAAA,IAChD,cAAA;AAAA,IAAgB,KAAA;AAAA,IAAO,UAAA;AAAA,IAAY,UAAA;AAAA,IAAY,iBAAA;AAAA,IAC/C,KAAA;AAAA,IAAO,OAAA;AAAA,IAAS,eAAA;AAAA,IAAiB,YAAA;AAAA,IAAc,WAAA;AAAA,IAC/C,KAAA;AAAA,IAAO,KAAA;AAAA,IAAO,KAAA;AAAA,IAAO,MAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,SAAA;AAAA,IACvC,YAAA;AAAA,IAAc,UAAA;AAAA,IAAY,WAAA;AAAA,IAAa,aAAA;AAAA,IACvC,KAAA;AAAA,IAAO,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,WAAA;AAAA,IAAa;AAAA,GAC7C;AAAA,EACA,WAAA,EAAa;AAAA,IACX,WAAA;AAAA,IAAa,UAAA;AAAA,IAAY,KAAA;AAAA,IAAO,YAAA;AAAA,IAAc,KAAA;AAAA,IAAO,KAAA;AAAA,IACrD,WAAA;AAAA,IAAa,SAAA;AAAA,IAAW,YAAA;AAAA,IAAc,SAAA;AAAA,IAAW,SAAA;AAAA,IACjD,OAAA;AAAA,IAAS,WAAA;AAAA,IAAa,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,QAAA;AAAA,IAAU,SAAA;AAAA,IACtD,UAAA;AAAA,IAAY,YAAA;AAAA,IAAc,QAAA;AAAA,IAAU,OAAA;AAAA,IAAS,MAAA;AAAA,IAC7C,QAAA;AAAA,IAAU,MAAA;AAAA,IAAQ,OAAA;AAAA,IAAS,SAAA;AAAA,IAAW;AAAA,GACxC;AAAA,EACA,IAAA,EAAM;AAAA;AAAA,IAEJ,kBAAA;AAAA,IAAY,uBAAA;AAAA,IAAU,mBAAA;AAAA,IAAa,kBAAA;AAAA,IAAY,kBAAA;AAAA,IAC/C,aAAA;AAAA,IAAY,8BAAA;AAAA,IAAc,2BAAA;AAAA,IAAgB,oCAAA;AAAA,IAC1C,kBAAA;AAAA,IAAU,kBAAA;AAAA,IAAU,iBAAA;AAAA,IAAW,sBAAA;AAAA,IAAS,QAAA;AAAA,IAAO,WAAA;AAAA,IAC/C,mBAAA;AAAA,IAAa,kBAAA;AAAA,IAAY,QAAA;AAAA,IAAU,0BAAA;AAAA,IAAa,kBAAA;AAAA;AAAA,IAEhD,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,cAAA;AAAA,IAAgB,WAAA;AAAA,IACnD,aAAA;AAAA,IAAe,YAAA;AAAA,IAAc,YAAA;AAAA,IAAc,UAAA;AAAA,IAAY,QAAA;AAAA,IACvD,QAAA;AAAA,IAAU,SAAA;AAAA,IAAW,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,WAAA;AAAA,IAAa,MAAA;AAAA;AAAA,IAEpD,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,oBAAA;AAAA,IAAO,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,oBAAA;AAAA,IAAO,QAAA;AAAA,IAAK,cAAA;AAAA;AAAA,IAE3C,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA;AAAA,IAE9B,iBAAA;AAAA,IAAa,YAAA;AAAA,IAAW,QAAA;AAAA,IAAU,kBAAA;AAAA,IAAiB;AAAA,GACrD;AAAA,EACA,OAAA,EAAS;AAAA;AAAA,IAEP,mBAAA;AAAA,IAAa,iBAAA;AAAA,IAAa,oBAAA;AAAA,IAAc,gBAAA;AAAA,IAAQ,UAAA;AAAA,IAChD,iBAAA;AAAA,IAAW,eAAA;AAAA,IAAY,gBAAA;AAAA,IAAU,qBAAA;AAAA,IACjC,oBAAA;AAAA,IAAY,mBAAA;AAAA,IAAa,iBAAA;AAAA,IACzB,2BAAA;AAAA,IAAc,mBAAA;AAAA,IAAW,0BAAA;AAAA,IAAa,gBAAA;AAAA,IACtC,yBAAA;AAAA,IAAc,cAAA;AAAA;AAAA,IAEd,SAAA;AAAA,IAAW,WAAA;AAAA,IAAa,SAAA;AAAA,IAAW,eAAA;AAAA,IACnC,MAAA;AAAA,IAAQ,MAAA;AAAA,IAAQ,WAAA;AAAA,IAAa,WAAA;AAAA,IAAa,UAAA;AAAA,IAAY,MAAA;AAAA;AAAA,IAEtD,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA;AAAA,IAElB,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA;AAAA,IAEZ,UAAA;AAAA,IAAY,QAAA;AAAA,IAAU;AAAA,GACxB;AAAA,EACA,QAAA,EAAU;AAAA;AAAA,IAER,gBAAA;AAAA,IAAa,sBAAA;AAAA,IAAc,kBAAA;AAAA,IAAY,mBAAA;AAAA,IACvC,eAAA;AAAA,IAAO,WAAA;AAAA,IAAQ,QAAA;AAAA,IAAO,MAAA;AAAA;AAAA,IAEtB,SAAA;AAAA,IAAW,YAAA;AAAA,IAAc,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,UAAA;AAAA,IAC/C,WAAA;AAAA,IAAa,eAAA;AAAA,IAAiB,OAAA;AAAA,IAAS,WAAA;AAAA,IAAa,UAAA;AAAA,IACpD,MAAA;AAAA,IAAQ,MAAA;AAAA,IAAQ,WAAA;AAAA,IAAa,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA;AAAA,IAE/C,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA;AAAA,IAExB,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA;AAAA,IAExB,SAAA;AAAA,IAAW,WAAA;AAAA,IAAa,aAAA;AAAA,IAAe,SAAA;AAAA,IAAW;AAAA,GACpD;AAAA,EACA,IAAA,EAAM;AAAA;AAAA,IAEJ,iBAAA;AAAA,IAAW,iBAAA;AAAA,IAAW,YAAA;AAAA,IAAW,aAAA;AAAA,IAAO,OAAA;AAAA,IAAS,QAAA;AAAA,IACjD,mBAAA;AAAA,IAAW,oBAAA;AAAA,IAAY,qBAAA;AAAA,IACvB,OAAA;AAAA,IAAS,QAAA;AAAA,IAAO,gBAAA;AAAA,IAAY,iBAAA;AAAA;AAAA,IAE5B,OAAA;AAAA,IAAS,KAAA;AAAA,IAAO,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,QAAA;AAAA,IAAU,aAAA;AAAA,IACjD,cAAA;AAAA,IAAgB,aAAA;AAAA,IAAe,YAAA;AAAA,IAAc,QAAA;AAAA,IAC7C,aAAA;AAAA,IAAe,cAAA;AAAA,IAAgB,OAAA;AAAA;AAAA,IAE/B,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA;AAAA,IAExB,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,0BAAA;AAAA;AAAA,IAExB,SAAA;AAAA,IAAW,KAAA;AAAA,IAAO,UAAA;AAAA,IAAY,QAAA;AAAA,IAAU;AAAA,GAC1C;AAAA,EACA,QAAA,EAAU;AAAA;AAAA,IAER,oBAAA;AAAA,IAAc,kBAAA;AAAA,IAAY,oCAAA;AAAA,IAAoB,mCAAA;AAAA,IAC9C,wBAAA;AAAA,IAAa,gCAAA;AAAA,IAAc,sBAAA;AAAA,IAC3B,UAAA;AAAA,IAAO,oBAAA;AAAA,IAAY,sBAAA;AAAA,IAAc,cAAA;AAAA,IACjC,iCAAA;AAAA,IAAsB,mBAAA;AAAA,IAAa,iBAAA;AAAA;AAAA,IAEnC,UAAA;AAAA,IAAY,QAAA;AAAA,IAAU,aAAA;AAAA,IAAe,eAAA;AAAA,IACrC,aAAA;AAAA,IAAe,cAAA;AAAA,IAAgB,YAAA;AAAA,IAAc,YAAA;AAAA,IAC7C,QAAA;AAAA,IAAU,YAAA;AAAA,IAAc,aAAA;AAAA,IAAe,YAAA;AAAA,IACvC,mBAAA;AAAA,IAAqB,UAAA;AAAA,IAAY,UAAA;AAAA;AAAA,IAEjC,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,oBAAA;AAAA,IAAO,0BAAA;AAAA;AAAA,IAEnB,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,oBAAA;AAAA,IAAO,gCAAA;AAAA;AAAA,IAEnB,WAAA;AAAA,IAAa,YAAA;AAAA,IAAW,iBAAA;AAAA,IAAgB;AAAA,GAC1C;AAAA,EACA,QAAA,EAAU;AAAA;AAAA,IAER,YAAA;AAAA,IAAc,iBAAA;AAAA,IAAa,iBAAA;AAAA,IAAW,WAAA;AAAA,IAAa,gBAAA;AAAA,IACnD,uBAAA;AAAA,IAAe,+BAAA;AAAA,IAAuB,WAAA;AAAA,IAAa,qBAAA;AAAA,IACnD,oBAAA;AAAA,IAAY,mBAAA;AAAA,IAAa,uBAAA;AAAA,IAAU,iBAAA;AAAA;AAAA,IAEnC,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,YAAA;AAAA,IAAc,YAAA;AAAA,IAAc,QAAA;AAAA,IACnD,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,QAAA;AAAA,IAAU,KAAA;AAAA,IAAO,OAAA;AAAA,IACvC,oBAAA;AAAA,IAAsB,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,QAAA;AAAA;AAAA,IAExC,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA;AAAA,IAExB,0BAAA;AAAA,IAAQ,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,cAAA;AAAA,IAAM,4CAAA;AAAA;AAAA,IAE1B,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,iBAAA;AAAA,IAAgB;AAAA,GACzC;AAAA,EACA,OAAO;AACT,CAAA;AAGA,IAAM,gBAAA,GAAmD;AAAA,EACvD,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,UAAA;AAAA,EAAY,MAAA,EAAQ,UAAA;AAAA,EAC3B,KAAA,EAAO,UAAA;AAAA,EAAY,MAAA,EAAQ,UAAA;AAAA,EAC3B,KAAA,EAAO,UAAA;AAAA,EACP,KAAA,EAAO,UAAA;AAAA,EAAY,MAAA,EAAQ,UAAA;AAAA,EAC3B,OAAA,EAAS,UAAA;AAAA,EAAY,KAAA,EAAO,UAAA;AAAA,EAC5B,KAAA,EAAO,UAAA;AAAA,EAAY,KAAA,EAAO,UAAA;AAAA,EAC1B,KAAA,EAAO,UAAA;AAAA,EAAY,MAAA,EAAQ,UAAA;AAAA,EAC3B,MAAA,EAAQ,UAAA;AAAA,EAAY,IAAA,EAAM,UAAA;AAAA;AAAA,EAE1B,MAAA,EAAQ,cAAA;AAAA;AAAA,EAER,MAAA,EAAQ,WAAA;AAAA,EAAa,MAAA,EAAQ,WAAA;AAAA,EAC7B,OAAA,EAAS,WAAA;AAAA,EAAa,MAAA,EAAQ,WAAA;AAAA,EAC9B,MAAA,EAAQ,WAAA;AAAA,EAAa,MAAA,EAAQ;AAC/B,CAAA;AAGA,IAAM,oBAAA,uBAA2B,GAAA,CAAI,CAAC,QAAQ,IAAA,EAAM,IAAA,EAAM,MAAM,CAAC,CAAA;AAGjE,IAAM,aAAA,GAA6D;AAAA,EACjE,EAAE,MAAM,IAAA,EAAM,QAAA,EAAU,CAAC,cAAA,EAAgB,UAAA,EAAY,UAAU,CAAA,EAAE;AAAA,EACjE,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,CAAC,qBAAqB,CAAA,EAAE;AAAA,EAChD,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,CAAC,kCAAkC,CAAA,EAAE;AAAA,EAC7D,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,CAAC,qBAAqB,CAAA,EAAE;AAAA,EAChD,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,CAAC,kDAAkD,CAAA;AAC7E,CAAA;AAEA,SAAS,uBAAuB,IAAA,EAAsB;AACpD,EAAA,KAAA,MAAW,EAAE,IAAA,EAAM,QAAA,EAAS,IAAK,aAAA,EAAe;AAC9C,IAAA,IAAI,QAAA,CAAS,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,IAAI,CAAC,GAAG,OAAO,IAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,aAAa,OAAA,EAAqD;AAChF,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,oBAA8B,EAAC;AACrC,EAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,EAAA,IAAI,SAAA;AAEJ,EAAA,MAAM,MAAA,GAAyC;AAAA,IAC7C,QAAA,EAAU,CAAA;AAAA,IAAG,YAAA,EAAc,CAAA;AAAA,IAAG,WAAA,EAAa,CAAA;AAAA,IAC3C,IAAA,EAAM,CAAA;AAAA,IAAG,OAAA,EAAS,CAAA;AAAA,IAAG,QAAA,EAAU,CAAA;AAAA,IAAG,IAAA,EAAM,CAAA;AAAA,IACxC,QAAA,EAAU,CAAA;AAAA,IAAG,QAAA,EAAU,CAAA;AAAA,IAAG,KAAA,EAAO;AAAA,GACnC;AAGA,EAAA,MAAM,kBAAA,GAAqB,CAAC,EAC1B,OAAA,CAAQ,WAAW,WAAA,EAAY,CAAE,KAAA,CAAM,sCAAsC,CAAA,IAC1E,OAAA,CAAQ,aAAa,WAAA,EAAY,CAAE,MAAM,oCAAoC,CAAA,IAC7E,QAAQ,IAAA,EAAM,WAAA,EAAY,CAAE,KAAA,CAAM,oCAAoC,CAAA,CAAA;AAG3E,EAAA,MAAM,kBAAA,GAAqB,CAAC,EAC1B,OAAA,CAAQ,WAAW,WAAA,EAAY,CAAE,KAAA,CAAM,2DAA2D,CAAA,IAC/F,OAAA,CAAQ,aAAa,WAAA,EAAY,CAAE,MAAM,qCAAqC,CAAA,IAC9E,QAAQ,IAAA,EAAM,WAAA,EAAY,CAAE,KAAA,CAAM,qCAAqC,CAAA,CAAA;AAG5E,EAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,IAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,cAAA,EAAgB;AACxC,MAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AAGjC,MAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,QAAA,MAAA,CAAO,YAAA,IAAgB,GAAA;AACvB,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,eAAA,EAAkB,GAAG,CAAA,6BAAA,CAA0B,CAAA;AAC7D,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACtC,QAAA,IAAI,kBAAA,IAAsB,CAAC,kBAAA,EAAoB;AAC7C,UAAA,MAAA,CAAO,YAAA,IAAgB,GAAA;AACvB,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,eAAA,EAAkB,GAAG,CAAA,uCAAA,CAAoC,CAAA;AAAA,QACzE,CAAA,MAAA,IAAW,kBAAA,IAAsB,CAAC,kBAAA,EAAoB;AACpD,UAAA,MAAA,CAAO,QAAA,IAAY,GAAA;AACnB,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,eAAA,EAAkB,GAAG,CAAA,mCAAA,CAAgC,CAAA;AAAA,QACrE,CAAA,MAAA,IAAW,sBAAsB,kBAAA,EAAoB;AAEnD,UAAA,MAAA,CAAO,QAAA,IAAY,IAAA;AACnB,UAAA,MAAA,CAAO,YAAA,IAAgB,IAAA;AACvB,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,eAAA,EAAkB,GAAG,CAAA,sDAAA,CAAmD,CAAA;AACtF,UAAA,SAAA,GAAY;AAAA,YACV,OAAA,EAAS,UAAA;AAAA,YACT,OAAA,EAAS,cAAA;AAAA,YACT,MAAA,EAAQ,CAAA,yEAAA;AAAA,WACV;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,MAAA,CAAO,QAAA,IAAY,GAAA;AACnB,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,eAAA,EAAkB,GAAG,CAAA,sCAAA,CAAmC,CAAA;AAAA,QACxE;AACA,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,MAAA,GAAS,iBAAiB,QAAQ,CAAA;AACxC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,MAAM,CAAA,IAAK,GAAA;AAClB,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,eAAA,EAAkB,GAAG,CAAA,QAAA,EAAM,MAAM,CAAA,CAAE,CAAA;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,QAAQ,WAAA,IAAe,EAAA;AAAA,IACvB,QAAQ,IAAA,IAAQ,EAAA;AAAA,IAChB,QAAQ,YAAA,IAAgB;AAAA,GAC1B,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,WAAA,EAAY;AAExB,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AAChE,IAAA,MAAM,GAAA,GAAM,MAAA;AACZ,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,IAAI,WAAA,CAAY,QAAA,CAAS,EAAA,CAAG,WAAA,EAAa,CAAA,EAAG;AAC1C,QAAA,MAAA,CAAO,GAAG,CAAA,IAAK,GAAA;AACf,QAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,CAAG,CAAC,CAAA,EAAG;AAC9C,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,SAAA,EAAY,EAAE,CAAA,SAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,GAAG,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA;AAChE,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,MAAA,IAAI,CAAC,OAAA,EAAS,SAAA,EAAW,OAAA,EAAS,KAAK,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AACrE,QAAA,MAAA,CAAO,QAAA,IAAY,GAAA;AACnB,QAAA,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAAA,MAC7B,WAAW,CAAC,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,QAAQ,MAAA,EAAQ,YAAA,EAAc,YAAY,CAAA,CAAE,KAAK,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AAC/G,QAAA,MAAA,CAAO,QAAA,IAAY,GAAA;AACnB,QAAA,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAAA,MAC7B,CAAA,MAAA,IAAW,CAAC,QAAA,EAAU,QAAA,EAAU,OAAO,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AACrE,QAAA,MAAA,CAAO,QAAA,IAAY,GAAA;AACnB,QAAA,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAAA,MAC7B,CAAA,MAAA,IAAW,CAAC,SAAA,EAAW,OAAA,EAAS,WAAW,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AACzE,QAAA,MAAA,CAAO,YAAA,IAAgB,GAAA;AACvB,QAAA,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAAA,MAC7B,CAAA,MAAA,IAAW,CAAC,WAAA,EAAa,WAAA,EAAa,SAAS,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AAC7E,QAAA,MAAA,CAAO,WAAW,CAAA,IAAK,GAAA;AACvB,QAAA,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAAA,MAC7B,CAAA,MAAA,IAAW,CAAC,KAAA,EAAO,GAAA,EAAK,KAAK,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,KAAA,KAAU,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AAE1E,QAAA,IAAI,kBAAA,EAAoB;AACtB,UAAA,MAAA,CAAO,YAAA,IAAgB,GAAA;AAAA,QACzB,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,QAAA,IAAY,GAAA;AAAA,QACrB;AACA,QAAA,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,MAAM,YAAA,GAAe,sBAAA,CAAuB,OAAA,CAAQ,YAAY,CAAA;AAChE,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,YAAA,CAAa,WAAA,EAAY;AAEvD,IAAA,IAAI,cAAc,QAAA,CAAS,kBAAU,CAAA,IAAK,aAAA,CAAc,SAAS,uBAAQ,CAAA,IAClE,aAAA,CAAc,QAAA,CAAS,UAAU,CAAA,IAAK,aAAA,CAAc,SAAS,SAAS,CAAA,IACtE,cAAc,QAAA,CAAS,cAAI,CAAA,IAAK,aAAA,CAAc,SAAS,cAAI,CAAA,IAC3D,cAAc,QAAA,CAAS,cAAI,KAAK,aAAA,CAAc,QAAA,CAAS,cAAI,CAAA,IAC3D,cAAc,QAAA,CAAS,iBAAW,KAAK,aAAA,CAAc,QAAA,CAAS,YAAS,CAAA,EAAG;AAC/E,MAAA,MAAA,CAAO,IAAA,IAAQ,GAAA;AACf,MAAA,eAAA,GAAkB,aAAA;AAAA,IACpB,CAAA,MAAA,IAAW,cAAc,QAAA,CAAS,gBAAQ,KAAK,aAAA,CAAc,QAAA,CAAS,QAAK,CAAA,IACpE,aAAA,CAAc,QAAA,CAAS,MAAM,CAAA,IAAK,aAAA,CAAc,SAAS,SAAS,CAAA,IAClE,cAAc,QAAA,CAAS,WAAW,CAAA,IAAK,aAAA,CAAc,QAAA,CAAS,SAAS,KACvE,aAAA,CAAc,QAAA,CAAS,cAAI,CAAA,IAAK,aAAA,CAAc,SAAS,cAAI,CAAA,IAC3D,aAAA,CAAc,QAAA,CAAS,cAAI,CAAA,IAAK,cAAc,QAAA,CAAS,cAAI,KAC3D,aAAA,CAAc,QAAA,CAAS,UAAU,CAAA,IAAK,aAAA,CAAc,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC7E,MAAA,MAAA,CAAO,OAAA,IAAW,GAAA;AAClB,MAAA,eAAA,GAAkB,iBAAA;AAAA,IACpB,CAAA,MAAA,IAAW,aAAA,CAAc,QAAA,CAAS,gBAAW,CAAA,IAAK,cAAc,QAAA,CAAS,SAAS,CAAA,IAC3E,aAAA,CAAc,QAAA,CAAS,SAAS,KAAK,aAAA,CAAc,QAAA,CAAS,cAAI,CAAA,IAChE,aAAA,CAAc,QAAA,CAAS,cAAI,CAAA,IAAK,aAAA,CAAc,QAAA,CAAS,SAAS,CAAA,EAAG;AACxE,MAAA,MAAA,CAAO,QAAA,IAAY,GAAA;AACnB,MAAA,eAAA,GAAkB,kBAAA;AAAA,IACpB;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,4BAAA,EAA+B,YAAY,CAAA,CAAE,CAAA;AAAA,EAC7D;AAGA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,KAAM,CAAA,KAAM,OAAO,CAAA;AACpE,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAClC,EAAA,MAAM,CAAC,MAAA,EAAQ,WAAW,CAAA,GAAI,QAAQ,CAAC,CAAA;AAEvC,EAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,OAAA;AAAA,MAChB,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,CAAC,GAAG,QAAA,EAAU,4BAA4B,CAAA;AAAA,MACpD,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,EAAA,IAAI,UAAW,WAAA,GAAc,MAAA,CAAO,CAAC,CAAA,GAAK,IAAA,IAAQ,cAAc,CAAA,EAAG;AACjE,IAAA,SAAA,GAAY;AAAA,MACV,OAAA,EAAS,MAAA;AAAA,MACT,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,MACjB,QAAQ,CAAA,mBAAA,EAAsB,MAAM,IAAI,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,KACtG;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA,KAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA;AAC5D,EAAA,MAAM,UAAA,GAAa,aAAa,CAAA,GAAI,IAAA,CAAK,IAAI,WAAA,GAAc,UAAA,GAAa,GAAA,EAAK,CAAG,CAAA,GAAI,GAAA;AAEpF,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,MAAA;AAAA,IAChB,UAAA;AAAA,IACA,QAAA,EAAU,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IAC9B,iBAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACvWA,IAAM,WAAA,GAAc;AAAA,EAClB,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,WAAA;AAAA,EAAa,WAAA;AAAA,EAAa,MAAA;AAAA,EACxD,kBAAA;AAAA,EAAY,UAAA;AAAA,EAAO,oBAAA;AAAA,EAAc,iBAAA;AAAA,EAAc,iBAAA;AAAA,EAC/C,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY,QAAA;AAAA,EAAU;AAC3C,CAAA;AAEA,IAAM,gBAAA,GAAmB;AAAA,EACvB,YAAA;AAAA,EAAc,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,YAAA;AAAA,EAAc,QAAA;AAAA,EAC9C,WAAA;AAAA,EAAQ,oBAAA;AAAA,EAAY,UAAA;AAAA,EAAO,eAAA;AAAA,EAAY,cAAA;AAAA,EACvC,oBAAA;AAAA,EAAY,iBAAA;AAAA,EAAa,qBAAA;AAAA,EAAY,YAAA;AAAA,EACrC,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY;AAChD,CAAA;AAEA,IAAM,kBAAoC,CAAC,MAAA,EAAQ,WAAW,UAAA,EAAY,MAAA,EAAQ,YAAY,UAAU,CAAA;AACxG,IAAM,eAAA,GAAoC,CAAC,UAAA,EAAY,cAAA,EAAgB,WAAW,CAAA;AAK3E,SAAS,mBAAmB,OAAA,EAAiE;AAClG,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,IAAA,GAAO,CAAC,OAAA,CAAQ,IAAA,IAAQ,EAAA,EAAI,OAAA,CAAQ,WAAA,IAAe,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,WAAA,EAAY;AAEnF,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,YAAA,GAAe,CAAA;AAGnB,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,YAAA,IAAgB,GAAA;AAChB,IAAA,QAAA,CAAS,KAAK,0CAAqC,CAAA;AAAA,EACrD;AACA,EAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,IAAA,YAAA,IAAgB,GAAA;AAChB,IAAA,QAAA,CAAS,KAAK,wCAAmC,CAAA;AAAA,EACnD;AAGA,EAAA,IAAI,eAAA,CAAgB,QAAA,CAAS,OAAA,CAAQ,cAAc,CAAA,EAAG;AACpD,IAAA,YAAA,IAAgB,GAAA;AAChB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,OAAA,EAAU,OAAA,CAAQ,cAAc,CAAA,2BAAA,CAAc,CAAA;AAAA,EAC9D;AACA,EAAA,IAAI,eAAA,CAAgB,QAAA,CAAS,OAAA,CAAQ,cAAc,CAAA,EAAG;AACpD,IAAA,YAAA,IAAgB,GAAA;AAChB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,OAAA,EAAU,OAAA,CAAQ,cAAc,CAAA,2BAAA,CAAc,CAAA;AAAA,EAC9D;AAGA,EAAA,MAAM,gBAAgB,WAAA,CAAY,IAAA,CAAK,OAAK,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAC5D,EAAA,MAAM,qBAAqB,gBAAA,CAAiB,IAAA,CAAK,OAAK,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAEtE,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,YAAA,IAAgB,GAAA;AAChB,IAAA,QAAA,CAAS,KAAK,0CAA0C,CAAA;AAAA,EAC1D;AACA,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,YAAA,IAAgB,GAAA;AAChB,IAAA,QAAA,CAAS,KAAK,+CAA+C,CAAA;AAAA,EAC/D;AAGA,EAAA,MAAM,QAAQ,YAAA,GAAe,YAAA;AAC7B,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,SAAA;AAAA,MACd,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,CAAC,GAAG,QAAA,EAAU,yCAAoC;AAAA,KAC9D;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,IAAgB,GAAA,IAAO,YAAA,IAAgB,GAAA,EAAK;AAC9C,IAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAA,CAAK,YAAA,GAAe,YAAA,IAAgB,GAAG,CAAG,CAAA;AAClE,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,QAAA;AAAA,MACd,UAAA,EAAY,UAAA;AAAA,MACZ,QAAA,EAAU,CAAC,GAAG,QAAA,EAAU,0BAA0B,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,UAAA,EAAa,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,cAAA,CAAW;AAAA,KAC1H;AAAA,EACF;AAEA,EAAA,IAAI,eAAe,YAAA,EAAc;AAC/B,IAAA,MAAMI,IAAAA,GAAM,KAAA,GAAQ,CAAA,GAAI,YAAA,GAAe,KAAA,GAAQ,GAAA;AAC/C,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,SAAA;AAAA,MACd,UAAA,EAAY,KAAK,GAAA,CAAI,IAAA,CAAK,IAAIA,IAAAA,EAAK,CAAC,CAAA,GAAI,GAAA,EAAK,CAAG,CAAA;AAAA,MAChD;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,CAAA,GAAI,YAAA,GAAe,KAAA,GAAQ,GAAA;AAC/C,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,SAAA;AAAA,IACd,UAAA,EAAY,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,GAAA,EAAK,CAAC,CAAA,GAAI,GAAA,EAAK,CAAG,CAAA;AAAA,IAChD;AAAA,GACF;AACF;;;ACpGO,SAAS,oBAAoB,OAAA,EAAoD;AACtF,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,YAAA,IAAgB,OAAA,CAAQ,gBAAgB,OAAA,IAAW,EAAA;AACrF,EAAA,MAAM,cAAc,eAAA,CAAgB;AAAA,IAClC,GAAG,OAAA;AAAA,IACH,YAAA,EAAc;AAAA,GACf,CAAA;AAED,EAAA,MAAM,eAAe,YAAA,CAAa;AAAA,IAChC,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,YAAA,EAAc,iBAAA;AAAA,IACd,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,SAAS,OAAA,CAAQ;AAAA,GAClB,CAAA;AAED,EAAA,MAAM,aAAa,kBAAA,CAAmB;AAAA,IACpC,WAAW,WAAA,CAAY,SAAA;AAAA,IACvB,gBAAgB,YAAA,CAAa,cAAA;AAAA,IAC7B,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,OAAA,EAAS,CAAC,EAAE,OAAA,CAAQ,WAAW,OAAA,CAAQ,OAAA,CAAA;AAAA,IACvC,WAAA,EAAa,CAAC,EAAE,iBAAA,IAAsB,OAAA,CAAQ,YAAY,OAAA,CAAQ,QAAA,CAAS,MAAA,GAAS,CAAA,IAAM,OAAA,CAAQ,cAAA;AAAA,GACnG,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,UAAA,CAAW,YAAY,CAAA;AAE5D,EAAA,OAAO;AAAA,IACL,WAAW,WAAA,CAAY,SAAA;AAAA,IACvB,cAAA,EAAiB,YAAA,CAAa,cAAA,KAAmB,OAAA,IAAW,OAAA,CAAQ,cAAA,EAAgB,OAAA,CAAQ,MAAA,GACvF,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,MAAA,GAChC,YAAA,CAAa,cAAA;AAAA,IACjB,cAAc,UAAA,CAAW,YAAA;AAAA,IACzB,SAAA;AAAA,IACA,UAAA,EAAY;AAAA,MACV,WAAW,WAAA,CAAY,UAAA;AAAA,MACvB,gBAAgB,YAAA,CAAa,UAAA;AAAA,MAC7B,cAAc,UAAA,CAAW;AAAA,KAC3B;AAAA,IACA,QAAA,EAAU,CAAC,GAAG,WAAA,CAAY,QAAA,EAAU,GAAG,YAAA,CAAa,QAAA,EAAU,GAAG,UAAA,CAAW,QAAQ,CAAA;AAAA,IACpF,mBAAmB,YAAA,CAAa,iBAAA;AAAA,IAChC,eAAA,EAAiB,OAAA,CAAQ,cAAA,EAAgB,OAAA,CAAQ,SAAS,YAAA,CAAa,eAAA;AAAA,IACvE,gBAAgB,YAAA,CAAa,cAAA;AAAA,IAC7B,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,IACtB,WAAA,EAAa,QAAQ,WAAA,IAAe,EAAA;AAAA,IACpC,OAAA,EAAS,QAAQ,OAAA,IAAW,EAAA;AAAA,IAC5B,OAAA,EAAS,QAAQ,OAAA,IAAW,EAAA;AAAA,IAC5B,YAAA,EAAc;AAAA,GAChB;AACF;AAEA,SAAS,mBAAmB,YAAA,EAAiC;AAC3D,EAAA,QAAQ,YAAA;AAAc,IACpB,KAAK,SAAA;AAAW,MAAA,OAAO,eAAA;AAAA,IACvB,KAAK,SAAA;AAAW,MAAA,OAAO,iBAAA;AAAA,IACvB,KAAK,QAAA;AAAU,MAAA,OAAO,cAAA;AAAA,IACtB;AAAS,MAAA,OAAO,eAAA;AAAA;AAEpB;;;ACrCA,eAAsB,kBACpB,OAAA,EAC+B;AAC/B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,EAAc,GAAA,KAAgB;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,IAAI,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACrC,IAAA,OAAA,CAAQ,UAAA,GAAa,MAAM,GAAG,CAAA;AAAA,EAChC,CAAA;AAGA,EAAA,GAAA,CAAI,WAAW,6BAA6B,CAAA;AAC5C,EAAA,MAAM,aAAA,GAAgB,oBAAoB,OAAO,CAAA;AAEjD,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,kBAAA,IAAsB,aAAA,CAAc,YAAA;AAClE,EAAA,GAAA,CAAI,WAAW,CAAA,uCAAA,EAA0C,aAAa,CAAA,aAAA,EAAgB,aAAA,CAAc,SAAS,CAAA,CAAA,CAAG,CAAA;AAGhH,EAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,IAAA,GAAA,CAAI,WAAW,wDAAwD,CAAA;AACvE,IAAA,MAAM,eAAA,GAAkB,MAAM,yBAAA,CAA0B;AAAA,MACtD,OAAA,EAAS,QAAQ,OAAA,IAAW,aAAA,CAAc,mBAAmB,OAAA,CAAQ,IAAA,IAAQ,QAAQ,WAAA,IAAe,iBAAA;AAAA,MACpG,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,MACxB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,QAAQ,aAAA,CAAc,cAAA;AAAA,MACtB,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,aAAA,CAAc,oBAAoB,CAAC,CAAA;AAAA,MACnE,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,MAC3B,eAAe,OAAA,CAAQ;AAAA,KACxB,CAAA;AACD,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,eAAA,CAAgB,QAAQ,CAAA;AAEzC,IAAA,OAAO;AAAA,MACL,aAAA;AAAA,MACA,SAAA,EAAW,iBAAA;AAAA,MACX,gBAAgB,eAAA,CAAgB,cAAA;AAAA,MAChC,eAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,kBAAkB,QAAA,EAAU;AAC9B,IAAA,GAAA,CAAI,WAAW,oCAAoC,CAAA;AACnD,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAMC,cAAAA,GAAgB,MAAM,uBAAA,CAAwB;AAAA,QAClD,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,IAAA,EAAM,QAAQ,IAAA,IAAQ,wBAAA;AAAA,QACtB,SAAA,EAAW,QAAQ,SAAA,IAAa,YAAA;AAAA,QAChC,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,YAAY,OAAA,CAAQ;AAAA,OACrB,CAAA;AAED,MAAA,MAAM,eAAA,GAAkB,MAAM,yBAAA,CAA0B;AAAA,QACtD,SAAS,OAAA,CAAQ,OAAA,IAAW,aAAA,CAAc,eAAA,IAAmB,QAAQ,IAAA,IAAQ,gBAAA;AAAA,QAC7E,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,QACxB,QAAQ,aAAA,CAAc,cAAA;AAAA,QACtB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,YAAY,OAAA,CAAQ;AAAA,OACrB,CAAA;AAED,MAAA,MAAM,YAAA,GAAe,MAAM,sBAAA,CAAuB;AAAA,QAChD,cAAcA,cAAAA,CAAc,YAAA;AAAA,QAC5B,gBAAgB,eAAA,CAAgB,cAAA;AAAA,QAChC,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,YAAY,OAAA,CAAQ;AAAA,OACrB,CAAA;AAED,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,YAAA,CAAa,QAAQ,CAAA;AACtC,MAAA,OAAO;AAAA,QACL,aAAA;AAAA,QACA,SAAA,EAAW,cAAA;AAAA,QACX,gBAAgB,YAAA,CAAa,cAAA;AAAA,QAC7B,aAAA,EAAAA,cAAAA;AAAA,QACA,eAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,KAAK,4HAAuH,CAAA;AACrI,MAAA,MAAM,eAAA,GAAkB,MAAM,yBAAA,CAA0B;AAAA,QACtD,SAAS,OAAA,CAAQ,OAAA,IAAW,aAAA,CAAc,eAAA,IAAmB,QAAQ,IAAA,IAAQ,gBAAA;AAAA,QAC7E,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,QACxB,QAAQ,aAAA,CAAc,cAAA;AAAA,QACtB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,YAAY,OAAA,CAAQ;AAAA,OACrB,CAAA;AACD,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,eAAA,CAAgB,QAAQ,CAAA;AAEzC,MAAA,OAAO;AAAA,QACL,aAAA;AAAA,QACA,SAAA,EAAW,iBAAA;AAAA,QACX,gBAAgB,eAAA,CAAgB,cAAA;AAAA,QAChC,eAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,GAAA,CAAI,WAAW,sDAAsD,CAAA;AACrE,EAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,IAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,EACjF;AAEA,EAAA,MAAM,aAAA,GAAgB,MAAM,uBAAA,CAAwB;AAAA,IAClD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,IAAA,EAAM,QAAQ,IAAA,IAAQ,wBAAA;AAAA,IACtB,WAAW,OAAA,CAAQ,SAAA,IAAa,aAAA,CAAc,iBAAA,GAAoB,CAAC,CAAA,IAAK,YAAA;AAAA,IACxE,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,YAAY,OAAA,CAAQ;AAAA,GACrB,CAAA;AAGD,EAAA,MAAM,EAAE,kBAAA,EAAAC,mBAAAA,EAAmB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,0BAAA,EAAA,EAAA,6BAAA,CAAA,CAAA;AACrC,EAAA,MAAM,cAAA,GAAiBA,mBAAAA,CAAmB,aAAA,CAAc,YAAA,EAAc;AAAA,IACpE;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA,SAAA,EAAW,eAAA;AAAA,IACX,cAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF","file":"index.cjs","sourcesContent":["import { z } from 'zod';\n\n/**\n * CurriculumFeed v2 — normalized, planner-ready projection of a domain graph.\n * Consumers: curriculum-kit Curriculum Planner (see docs/ideas/2026-08-30-curriculum-feed-v2-output.md).\n * Guarantees enforced here: cycle-free is the CALLER's verifier job; the feed\n * itself guarantees resolution (edges/keywords reference emitted nodes) and\n * non-emptiness.\n */\n\nexport const FeedKeywordsSchema = z.object({\n all: z.array(z.string()).default([]),\n new: z.array(z.string()).default([]),\n prerequisite: z.array(z.string()).default([]),\n});\n\nexport const FeedScaffoldCandidateSchema = z.object({\n item: z.string(),\n reason: z.string().default(''),\n minutes_saved: z.number().int().nonnegative().default(0),\n suggest: z.enum(['provide_full', 'provide_partial', 'provide_reference']).default('provide_full'),\n});\n\nexport const FeedNodeSchema = z.object({\n id: z.string().min(1),\n kind: z.enum(['skill', 'concept', 'product_step']),\n name: z.string().min(1),\n concept_codes: z.array(z.string()).default([]),\n keywords: FeedKeywordsSchema,\n estimated_minutes: z.number().int().nonnegative(),\n bloom_hint: z.enum(['Remember', 'Understand', 'Apply', 'Analyze', 'Evaluate', 'Create']).nullable().default(null),\n depth_hint: z.enum(['ulo', 'cio', 'sio']).nullable().default(null),\n completion_level: z.enum(['mvp', 'standard', 'stretch']).default('standard'),\n scaffolding: z.object({\n scaffold_candidates: z.array(FeedScaffoldCandidateSchema).default([]),\n core_value_minutes: z.number().int().nonnegative().default(0),\n }).default({ scaffold_candidates: [], core_value_minutes: 0 }),\n references: z.array(z.object({ file: z.string().min(1), evidence: z.string().default('') })).default([]),\n feature_id: z.string().nullable().default(null),\n concept_ref: z.string().nullable().default(null),\n // Progressive-completion bookkeeping (feed v2, additive):\n // phase_id = development phase that introduces/uses this node;\n // introduce_aspect = how the phase teaches a concept node (first intro vs advanced revisit).\n phase_id: z.string().default(''),\n introduce_aspect: z.enum(['new', 'advanced']).nullable().default(null),\n});\n\nexport const FeedEdgeSchema = z.object({\n from: z.string().min(1),\n to: z.string().min(1),\n kind: z.enum(['knowledge', 'task']),\n reason: z.string().default(''),\n});\n\nexport const FeedGroupingSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n node_ids: z.array(z.string()).min(1),\n rationale: z.string().default(''),\n});\n\nexport const FeedPhaseSchema = z.object({\n id: z.string().min(1),\n order: z.number().int().positive(),\n name: z.string().min(1),\n product_completion: z.string().min(1),\n node_ids: z.array(z.string()).min(1),\n});\nexport type FeedPhase = z.infer<typeof FeedPhaseSchema>;\n\nexport const CurriculumFeedSchema = z.object({\n schema_version: z.literal(2),\n source: z.object({\n graph_type: z.enum(['project_graph', 'knowledge_graph', 'hybrid_graph']),\n warnings: z.array(z.string()).default([]),\n hallucination_count: z.number().int().nonnegative().default(0),\n }),\n learning_nodes: z.array(FeedNodeSchema).min(1, 'curriculum feed must contain at least one learning node'),\n dependency_edges: z.array(FeedEdgeSchema).default([]),\n suggested_groupings: z.array(FeedGroupingSchema).default([]),\n // Progressive completion phases (cross-feature). When non-empty, these — not\n // suggested_groupings — define the teaching sequence and unit structure.\n phases: z.array(FeedPhaseSchema).default([]),\n});\n\nexport type CurriculumFeed = z.infer<typeof CurriculumFeedSchema>;\nexport type FeedNode = z.infer<typeof FeedNodeSchema>;\nexport type FeedEdge = z.infer<typeof FeedEdgeSchema>;\nexport type FeedGrouping = z.infer<typeof FeedGroupingSchema>;\n\n/** Strict pre-save resolution validation — fail-closed, no defaulted-empty graphs. */\nexport function validateCurriculumFeed(feed: unknown): CurriculumFeed {\n const parsed = CurriculumFeedSchema.parse(feed);\n const ids = new Set(parsed.learning_nodes.map((n) => n.id));\n if (ids.size !== parsed.learning_nodes.length) {\n throw new Error('curriculum feed contains duplicate node ids');\n }\n for (const e of parsed.dependency_edges) {\n if (!ids.has(e.from) || !ids.has(e.to)) {\n throw new Error('curriculum feed edge ' + e.from + ' -> ' + e.to + ' references unknown node');\n }\n if (e.from === e.to) throw new Error('curriculum feed self-loop edge on ' + e.from);\n }\n for (const g of parsed.suggested_groupings) {\n for (const id of g.node_ids) {\n if (!ids.has(id)) throw new Error('grouping ' + g.id + ' references unknown node ' + id);\n }\n }\n for (const ph of parsed.phases) {\n for (const id of ph.node_ids) {\n if (!ids.has(id)) throw new Error('phase ' + ph.id + ' references unknown node ' + id);\n }\n }\n const phaseIds = parsed.phases.map((p) => p.id);\n if (new Set(phaseIds).size !== phaseIds.length) throw new Error('curriculum feed contains duplicate phase ids');\n return parsed;\n}\n","import {\n validateCurriculumFeed, type CurriculumFeed, type FeedNode, type FeedEdge, type FeedGrouping,\n} from '../schemas/curriculumFeedSchema';\n\n/**\n * CurriculumFeed emitter - pure transformation from a VERIFIED domain graph\n * to the planner-ready feed. No LLM calls: hints derive from existing\n * annotations only. Validates its own output (fail-closed).\n *\n * Phase-driven emission (hybrid graphs with development phases): the teaching\n * sequence IS the phase sequence. Concepts are emitted at the phase that\n * introduces them (aspect new) or revisits them at higher depth (aspect\n * advanced) - never as a trailing knowledge appendix. Concept minutes stay\n * UNMERGED: no prerequisite-minute inflation (the planner schedules the\n * revisit, not the total).\n */\n\nexport interface EmitFeedOptions {\n hallucinationCount?: number;\n warnings?: string[];\n}\n\nconst BLOOM_RANK: Record<string, number> = { Remember: 0, Understand: 1, Apply: 2, Analyze: 3, Evaluate: 4, Create: 5 };\nconst pad2 = (n: number): string => String(n).padStart(2, '0');\n\ntype Rec = Record<string, unknown>;\nconst arr = (v: unknown): Rec[] => (Array.isArray(v) ? (v as Rec[]) : []);\nconst str = (v: unknown, d = ''): string => (typeof v === 'string' ? v : d);\nconst num = (v: unknown, d: number): number => (typeof v === 'number' && Number.isFinite(v) ? v : d);\nconst strs = (v: unknown): string[] => (Array.isArray(v) ? v.filter((x): x is string => typeof x === 'string') : []);\n\nfunction stepMinutes(step: Rec): number {\n const effort = (step.effort ?? {}) as Rec;\n return Math.max(0, Math.round(num(effort.estimated_minutes, num(step.estimated_minutes, 45))));\n}\n\nfunction newKeywordsInOrder(nodes: FeedNode[]): void {\n // First appearance in emission order becomes 'new'; everything seen before is 'prerequisite'.\n const seen = new Set<string>();\n for (const n of nodes) {\n const all = n.keywords.all;\n n.keywords.new = [];\n n.keywords.prerequisite = [];\n for (const k of all) {\n if (seen.has(k)) n.keywords.prerequisite.push(k);\n else n.keywords.new.push(k);\n seen.add(k);\n }\n }\n}\n\nfunction feedNodeFromStep(step: Rec, featureId: string): FeedNode {\n const id = str(step.id);\n return {\n id,\n kind: 'product_step',\n name: str(step.name, id),\n concept_codes: strs(step.concept_codes),\n keywords: { all: strs(step.keywords), new: [], prerequisite: [] },\n estimated_minutes: stepMinutes(step),\n bloom_hint: 'Apply',\n depth_hint: null,\n completion_level: 'standard',\n scaffolding: { scaffold_candidates: [], core_value_minutes: stepMinutes(step) },\n references: arr(step.files).map((f) => ({ file: str(f), evidence: 'step file' })).filter((f) => f.file),\n feature_id: featureId,\n concept_ref: null,\n phase_id: '',\n introduce_aspect: null,\n };\n}\n\nfunction deriveConceptDepthHint(concept: Rec): FeedNode['depth_hint'] {\n const explicit = str(concept.depth_hint);\n if (explicit === 'ulo' || explicit === 'cio' || explicit === 'sio') return explicit;\n\n const sio = arr(concept.sio);\n const prereqs = strs(concept.prerequisites);\n const pts = arr(concept.problem_types);\n const hasHighBloom = pts.some((p) => {\n const b = str(p.bloom_level);\n return b === 'Apply' || b === 'Analyze' || b === 'Evaluate' || b === 'Create';\n });\n\n if (sio.length >= 2 || hasHighBloom) return 'sio';\n if (str(concept.cio) || prereqs.length >= 1) return 'cio';\n return 'ulo';\n}\n\nfunction feedNodeFromConcept(concept: Rec): FeedNode {\n const id = str(concept.id);\n const pts = arr(concept.problem_types)\n .map((p) => str(p.bloom_level, 'Understand'))\n .filter((b) => b in BLOOM_RANK)\n .sort((a, b) => BLOOM_RANK[a] - BLOOM_RANK[b]);\n const topBloom = pts[pts.length - 1] ?? 'Understand';\n\n const rawRefs = arr(concept.references);\n const references = rawRefs.length > 0\n ? rawRefs.map((r) => ({ file: str(r.file, 'syllabus.md'), evidence: str(r.evidence, str(concept.name)) })).filter((r) => r.file)\n : [{ file: 'syllabus.md', evidence: str(concept.category ? `Topic under category ${str(concept.category)}` : str(concept.name), id) }];\n\n const problemScaffolds = arr(concept.problem_types).map((pt) => ({\n item: str(pt.name, 'Problem type'),\n reason: str(pt.description, 'Formative practice check'),\n minutes_saved: num(pt.estimated_minutes, 10),\n suggest: 'provide_partial' as const,\n }));\n\n return {\n id,\n kind: 'concept',\n name: str(concept.name, id),\n concept_codes: [str(concept.code) || id].filter(Boolean),\n keywords: { all: strs(concept.keywords), new: [], prerequisite: [] },\n estimated_minutes: Math.max(0, Math.round(num(concept.estimated_minutes, 15))),\n bloom_hint: topBloom as FeedNode['bloom_hint'],\n depth_hint: deriveConceptDepthHint(concept),\n completion_level: 'standard',\n scaffolding: {\n scaffold_candidates: problemScaffolds,\n core_value_minutes: Math.max(0, Math.round(num(concept.estimated_minutes, 15))),\n },\n references,\n feature_id: null,\n concept_ref: id,\n phase_id: '',\n introduce_aspect: null,\n };\n}\n\nfunction addFeatureGroup(\n f: Rec, fid: string, nodes: FeedNode[], edges: FeedEdge[], groupings: FeedGrouping[],\n): string[] {\n const steps = arr(f.steps);\n const stepIds: string[] = [];\n let prev = '';\n for (let i = 0; i < steps.length; i++) {\n const stepNode = feedNodeFromStep(steps[i], fid);\n if (!stepNode.id) continue;\n stepIds.push(stepNode.id);\n nodes.push(stepNode);\n if (prev) edges.push({ from: prev, to: stepNode.id, kind: 'task', reason: 'feature build order' });\n prev = stepNode.id;\n }\n for (const dep of strs(f.depends_on)) {\n const depFirst = nodes.find((n) => n.feature_id === dep);\n if (depFirst && stepIds[0]) edges.push({ from: depFirst.id, to: stepIds[0], kind: 'task', reason: 'feature depends_on ' + dep });\n }\n if (stepIds.length > 0) groupings.push({ id: 'G-' + fid, name: str(f.name, fid), node_ids: stepIds, rationale: str(f.description, '') });\n return stepIds;\n}\n\ninterface EmitPhaseCtx {\n id: string;\n order: number;\n name: string;\n productCompletion: string;\n conceptOrder: string[]; // concept node ids in teaching order (new first, then advanced)\n featureIds: string[];\n}\n\n/**\n * Phase-driven hybrid emission:\n * - emit concepts per phase (aspect new first, then advanced) BEFORE the\n * phase's features; knowledge edges concept -> first step of consumer\n * features carry the JIT relation\n * - feature order inside a phase follows the project graph order\n * - phases and their node_ids go into feed.phases (teaching sequence)\n * - concept minutes stay UNMERGED (no prereq-minute accumulation)\n */\nfunction emitFromHybrid(hybrid: Rec, opts: EmitFeedOptions): CurriculumFeed {\n const nodes: FeedNode[] = [];\n const edges: FeedEdge[] = [];\n const groupings: FeedGrouping[] = [];\n const pg = (hybrid.project_graph ?? {}) as Rec;\n const kg = (hybrid.knowledge_graph ?? {}) as Rec;\n const rawPhases = arr(hybrid.phases).filter((p) => str(p.id));\n\n const features = arr(pg.features);\n const conceptRecs = arr(kg.concepts);\n const conceptById = new Map(conceptRecs.map((c) => [str(c.id), c]));\n\n // --- no phases -> legacy path (concepts first, then features) -----------\n if (rawPhases.length === 0) {\n for (const c of conceptRecs) {\n const node = feedNodeFromConcept(c);\n nodes.push(node);\n for (const p of strs(c.prerequisites)) edges.push({ from: p, to: node.id, kind: 'knowledge', reason: 'concept prerequisite' });\n }\n features.forEach((f, fi) => addFeatureGroup(f, str(f.id, 'F' + pad2(fi + 1)), nodes, edges, groupings));\n linkHybridKnowledgeEdges(hybrid, nodes, edges, true);\n newKeywordsInOrder(nodes);\n return validateCurriculumFeed({\n schema_version: 2,\n source: { graph_type: 'hybrid_graph', warnings: opts.warnings ?? [], hallucination_count: opts.hallucinationCount ?? 0 },\n learning_nodes: nodes,\n dependency_edges: edges,\n suggested_groupings: groupings,\n phases: [],\n });\n }\n\n // --- phase-driven emission ----------------------------------------------\n const featureOrder = new Map<string, number>();\n features.forEach((f, fi) => featureOrder.set(str(f.id, 'F' + pad2(fi + 1)), fi));\n const stepIdsByFeature = new Map<string, string[]>();\n for (const f of features) {\n const fid = str(f.id);\n stepIdsByFeature.set(fid, arr(f.steps).map((s) => str(s.id)).filter(Boolean));\n }\n\n const emitCtx: EmitPhaseCtx[] = [];\n const emittedConcepts = new Set<string>();\n const linkList = arr(hybrid.links);\n\n for (const rp of rawPhases) {\n const pid = str(rp.id);\n const order = num(rp.order, emitCtx.length + 1);\n const conceptOrder: string[] = [];\n const intros = arr(rp.introduces);\n // new introductions first, then advanced revisits (teaching order)\n const news = intros.filter((i) => str(i.aspect, 'new') === 'new');\n const advanced = intros.filter((i) => str(i.aspect) === 'advanced');\n for (const intro of [...news, ...advanced]) {\n const cid = str(intro.concept_id);\n const c = conceptById.get(cid);\n if (!c) {\n throw new Error('Phase ' + pid + ' introduces unknown concept ' + cid + ' - fail-closed');\n }\n if (str(intro.aspect, 'new') === 'advanced' && !emittedConcepts.has(cid)) {\n throw new Error('Phase ' + pid + ' advanced-revisits concept ' + cid + ' that was never emitted - fail-closed');\n }\n if (!emittedConcepts.has(cid)) {\n const node = feedNodeFromConcept(c);\n node.phase_id = pid;\n node.introduce_aspect = 'new';\n nodes.push(node);\n for (const p of strs(c.prerequisites)) {\n if (!emittedConcepts.has(p)) {\n throw new Error('Concept ' + cid + ' (phase ' + pid + ') has prerequisite ' + p + ' that is not introduced in an earlier phase - fail-closed');\n }\n edges.push({ from: p, to: cid, kind: 'knowledge', reason: 'concept prerequisite' });\n }\n emittedConcepts.add(cid);\n conceptOrder.push(cid);\n } else {\n // advanced revisit: re-emit as a NEW node with a revisit id so the\n // planner can schedule the higher-depth pass without double-counting\n // the first introduction\n const revisitId = cid + '__ADV' + pad2(order);\n const node = feedNodeFromConcept(c);\n node.id = revisitId;\n node.name = str(c.name, cid) + ' (advanced)';\n node.phase_id = pid;\n node.introduce_aspect = 'advanced';\n node.estimated_minutes = Math.max(15, Math.round(node.estimated_minutes * 0.5));\n node.concept_codes = [str(c.code) || cid];\n edges.push({ from: cid, to: revisitId, kind: 'knowledge', reason: 'advanced revisit of ' + cid + ' at phase ' + pid });\n nodes.push(node);\n conceptOrder.push(revisitId);\n }\n }\n const featureIds = strs(rp.feature_ids)\n .filter((fid) => featureOrder.has(fid))\n .sort((a, b) => featureOrder.get(a)! - featureOrder.get(b)!);\n emitCtx.push({ id: pid, order, name: str(rp.name, pid), productCompletion: str(rp.product_completion), conceptOrder, featureIds });\n }\n\n // Fail-closed: every concept consumed by a link must be emitted somewhere\n for (const l of linkList) {\n const cid = str(l.concept_id);\n if (cid && conceptById.has(cid) && !emittedConcepts.has(cid)) {\n throw new Error('Concept ' + cid + ' is consumed by links but never introduced in any phase - fail-closed');\n }\n }\n // Fail-closed: every feature must sit in exactly one emitted phase\n const seenFeatures = new Set(emitCtx.flatMap((e) => e.featureIds));\n const missingFeatures = features.map((f) => str(f.id)).filter((fid) => fid && !seenFeatures.has(fid));\n if (missingFeatures.length > 0) {\n throw new Error('Features not covered by any phase: ' + missingFeatures.join(', ') + ' - fail-closed');\n }\n\n // Emit feature steps phase by phase (teaching sequence)\n const phaseNodeIds: string[][] = [];\n for (const ctx of emitCtx) {\n const ids: string[] = [...ctx.conceptOrder];\n for (const fid of ctx.featureIds) {\n const f = features.find((x) => str(x.id) === fid)!;\n const stepIds = addFeatureGroup(f, fid, nodes, edges, groupings);\n for (const sid of stepIds) {\n const node = nodes.find((n) => n.id === sid)!;\n node.phase_id = ctx.id;\n }\n ids.push(...stepIds);\n }\n phaseNodeIds.push(ids);\n }\n\n // Knowledge edges: concept -> first step of each consumer feature (JIT).\n // Deduped by (from,to): several links may target the same feature.\n const edgeSeen = new Set(edges.map((e) => e.from + '>' + e.to));\n const pushEdge = (from: string, to: string, reason: string) => {\n const key = from + '>' + to;\n if (edgeSeen.has(key)) return;\n edgeSeen.add(key);\n edges.push({ from, to, kind: 'knowledge', reason });\n };\n for (const l of linkList) {\n const cid = str(l.concept_id);\n const fid = str(l.feature_id);\n if (!conceptById.has(cid)) continue;\n const firstStep = (stepIdsByFeature.get(fid) || [])[0];\n if (!firstStep) continue;\n const depth = str(l.depth, 'cio');\n pushEdge(cid, firstStep, str(l.relationship, 'hybrid link') + ' [' + depth + ']');\n // Advanced revisits feed only features of the revisit's OWN phase: a PH2\n // revisit must never become a prerequisite of a PH1 feature (teaching\n // order is phase-ordered).\n for (const n of nodes) {\n if (n.kind === 'concept' && n.concept_ref === cid && n.introduce_aspect === 'advanced' && n.phase_id === str(l.phase_id)) {\n pushEdge(n.id, firstStep, 'advanced application [' + depth + ']');\n }\n }\n }\n\n newKeywordsInOrder(nodes);\n\n // Deterministic keyword-prerequisite materialization: when a node declares a\n // keyword as PREREQUISITE, some other node must INTRODUCE it (new) EARLIER in\n // feed order. Missing edge = planner can schedule the consumer first while the\n // audit flags ordering it cannot fix. Edge kind 'keyword' — the planner\n // honors it for topological order; 'mastered_before_course' entries are exempt\n // (entry-level keywords need no introducer).\n const feedOrder = new Map(nodes.map((n, i) => [n.id, i]));\n const introducer = new Map<string, string>();\n for (const n of nodes) for (const k of n.keywords?.new ?? []) {\n const key = k.toLowerCase();\n if (!introducer.has(key)) introducer.set(key, n.id);\n }\n for (const n of nodes) {\n for (const k of n.keywords?.prerequisite ?? []) {\n const src = introducer.get(k.toLowerCase());\n if (!src || src === n.id) continue;\n if (feedOrder.get(src)! < feedOrder.get(n.id)!) pushEdge(src, n.id, 'keyword prerequisite [' + k + ']');\n }\n }\n\n const phases = emitCtx.map((ctx, i) => ({\n id: ctx.id,\n order: ctx.order,\n name: ctx.name,\n product_completion: ctx.productCompletion || 'Phase ' + (i + 1) + ' deliverable',\n node_ids: phaseNodeIds[i],\n }));\n\n return validateCurriculumFeed({\n schema_version: 2,\n source: { graph_type: 'hybrid_graph', warnings: opts.warnings ?? [], hallucination_count: opts.hallucinationCount ?? 0 },\n learning_nodes: nodes,\n dependency_edges: edges,\n suggested_groupings: groupings,\n phases,\n });\n}\n\n/** Legacy helper: knowledge edges from hybrid links (used by the no-phase path). */\nfunction linkHybridKnowledgeEdges(hybrid: Rec, nodes: FeedNode[], edges: FeedEdge[], setStepHints: boolean): void {\n const conceptIds = new Set(nodes.filter((n) => n.kind === 'concept').map((n) => n.concept_ref || n.id));\n for (const l of arr(hybrid.links)) {\n const conceptId = str(l.concept_id);\n const featureId = str(l.feature_id);\n if (!conceptIds.has(conceptId)) continue;\n const depth = str(l.depth, 'cio');\n const firstStep = nodes.find((n) => n.feature_id === featureId);\n if (firstStep) {\n edges.push({ from: conceptId, to: firstStep.id, kind: 'knowledge', reason: str(l.relationship, 'hybrid link') + ' [' + depth + ']' });\n if (setStepHints && !firstStep.depth_hint) {\n firstStep.depth_hint = (['ulo', 'cio', 'sio'] as const).includes(depth as 'ulo') ? (depth as FeedNode['depth_hint']) : 'cio';\n }\n }\n }\n}\n\nfunction emitFromKnowledge(kg: Rec, opts: EmitFeedOptions): CurriculumFeed {\n const nodes: FeedNode[] = [];\n const edges: FeedEdge[] = [];\n const groupings: FeedGrouping[] = [];\n const conceptIds = new Set(arr(kg.concepts).map((c) => str(c.id)));\n for (const c of arr(kg.concepts)) {\n const node = feedNodeFromConcept(c);\n nodes.push(node);\n for (const p of strs(c.prerequisites)) {\n if (p !== node.id && conceptIds.has(p)) {\n edges.push({\n from: p,\n to: node.id,\n kind: 'knowledge',\n reason: `concept prerequisite: ${p} must be understood before ${node.id}`,\n });\n }\n }\n }\n\n // Sort nodes by learning_path order if present\n if (arr(kg.learning_path).length > 0) {\n const orderMap = new Map<string, number>();\n arr(kg.learning_path).forEach((s, idx) => {\n const cid = str(s.concept_id);\n if (cid) orderMap.set(cid, num(s.order, idx + 1));\n });\n nodes.sort((a, b) => (orderMap.get(a.id) ?? 999) - (orderMap.get(b.id) ?? 999));\n }\n\n let ci = 0;\n for (const cat of arr(kg.categories)) {\n ci += 1;\n const ids = strs(cat.concept_ids).filter((id) => nodes.some((n) => n.id === id));\n if (ids.length > 0) {\n groupings.push({\n id: str(cat.id, 'cat' + ci),\n name: str(cat.name, 'Category ' + ci),\n node_ids: ids,\n rationale: str(cat.description, ''),\n });\n }\n }\n newKeywordsInOrder(nodes);\n return validateCurriculumFeed({\n schema_version: 2,\n source: { graph_type: 'knowledge_graph', warnings: opts.warnings ?? [], hallucination_count: opts.hallucinationCount ?? 0 },\n learning_nodes: nodes,\n dependency_edges: edges,\n suggested_groupings: groupings,\n phases: [],\n });\n}\n\nfunction emitFromProject(pg: Rec, opts: EmitFeedOptions): CurriculumFeed {\n const nodes: FeedNode[] = [];\n const edges: FeedEdge[] = [];\n const groupings: FeedGrouping[] = [];\n arr(pg.features).forEach((f, fi) => addFeatureGroup(f, str(f.id, 'F' + pad2(fi + 1)), nodes, edges, groupings));\n if (nodes.length === 0 && arr(pg.features).length > 0) {\n const hasTasks = arr((pg.implementation ?? {}) as Rec).length > 0 || arr((pg.implementation as Rec | undefined)?.tasks).length > 0;\n throw new Error(\n 'Project graph has ' + arr(pg.features).length + ' features but NO features[].steps - the curriculum feed cannot emit planning nodes.' +\n (hasTasks\n ? ' This looks like a legacy knowledge-tree graph (implementation.tasks). Regenerate it with the domain-kit v3 pipeline (runProjectGraphPipeline / hybridGraphPipeline), then re-run.'\n : ' Every feature must carry at least one step with id/name/keywords/effort for curriculum planning.'),\n );\n }\n newKeywordsInOrder(nodes);\n return validateCurriculumFeed({\n schema_version: 2,\n source: { graph_type: 'project_graph', warnings: opts.warnings ?? [], hallucination_count: opts.hallucinationCount ?? 0 },\n learning_nodes: nodes,\n dependency_edges: edges,\n suggested_groupings: groupings,\n phases: [],\n });\n}\n\n/** Emit a CurriculumFeed from whichever graph shape is provided (already verified upstream). */\nexport function emitCurriculumFeed(\n graph: unknown,\n opts: EmitFeedOptions = {},\n): CurriculumFeed {\n const g = graph as Rec;\n if (arr(g.learning_nodes).length > 0) {\n return validateCurriculumFeed(g); // already a feed - pass-through validation\n }\n if (g.project_graph || g.knowledge_graph || arr(g.links).length > 0 || arr(g.phases).length > 0) {\n return emitFromHybrid(g, opts);\n }\n if (arr(g.concepts).length > 0 || str(g.type) === 'knowledge_graph') return emitFromKnowledge(g, opts);\n return emitFromProject(g, opts);\n}\n","/**\n * Swift AST-level parser — extracts imports, types, functions, property wrappers,\n * error handling patterns, and framework usage from Swift source files.\n *\n * Ported from knowledge-tree/extract_project_keywords.py parse_swift_file()\n */\n\nexport interface SwiftParseResult {\n imports: string[];\n types: Array<{\n kind: string;\n name: string;\n conforms_to: string[];\n file: string;\n }>;\n functions: Array<{\n name: string;\n params: string;\n returns: string;\n file: string;\n }>;\n property_wrappers: string[];\n error_handling: string[];\n frameworks_used: string[];\n}\n\nconst IMPORT_RE = /^import\\s+(\\w+)/gm;\nconst TYPE_RE = /\\b(class|struct|enum|protocol)\\s+(\\w+)(?:\\s*:\\s*([^{]+))?/g;\nconst FUNC_RE = /\\bfunc\\s+(\\w+)\\s*\\(([^)]*)\\)(?:\\s*->\\s*([^{]+))?/g;\nconst WRAPPER_RE = /@(State|Binding|ObservedObject|StateObject|Published|Environment|EnvironmentObject|AppStorage|SceneStorage|FocusState|Observable)\\b/g;\nconst FRAMEWORK_USAGE_RE = /\\b(URLSession|URLRequest|JSONSerialization|JSONDecoder|JSONEncoder|Task|DispatchQueue|Timer|NotificationCenter|UserDefaults|FileManager|Bundle)\\b/g;\n\nexport function parseSwiftFile(filepath: string, content: string): SwiftParseResult {\n const result: SwiftParseResult = {\n imports: [],\n types: [],\n functions: [],\n property_wrappers: [],\n error_handling: [],\n frameworks_used: [],\n };\n\n // Extract imports\n let match: RegExpExecArray | null;\n while ((match = IMPORT_RE.exec(content)) !== null) {\n result.imports.push(match[1]);\n }\n\n // Extract framework usage (types used in body, not declarations)\n const fwSeen = new Set<string>();\n while ((match = FRAMEWORK_USAGE_RE.exec(content)) !== null) {\n if (!fwSeen.has(match[1])) {\n fwSeen.add(match[1]);\n result.frameworks_used.push(match[1]);\n }\n }\n\n // Extract type declarations\n while ((match = TYPE_RE.exec(content)) !== null) {\n const conforms = (match[3] || '')\n .split(',')\n .map(p => p.trim())\n .filter(Boolean);\n result.types.push({\n kind: match[1],\n name: match[2],\n conforms_to: conforms,\n file: filepath,\n });\n }\n\n // Extract function signatures\n while ((match = FUNC_RE.exec(content)) !== null) {\n const name = match[1];\n if (name.startsWith('_')) continue;\n result.functions.push({\n name,\n params: (match[2] || '').trim(),\n returns: (match[3] || '').trim(),\n file: filepath,\n });\n }\n\n // Extract property wrappers\n const wrapperSet = new Set<string>();\n while ((match = WRAPPER_RE.exec(content)) !== null) {\n wrapperSet.add(match[1]);\n }\n result.property_wrappers = Array.from(wrapperSet);\n\n // Extract error handling patterns\n if (content.includes('do {') || content.includes('do{')) {\n result.error_handling.push('do-catch');\n }\n if (content.includes('throws')) {\n result.error_handling.push('throws');\n }\n if (content.includes('Result<')) {\n result.error_handling.push('Result type');\n }\n if (content.includes('try?')) {\n result.error_handling.push('try?');\n }\n if (content.includes('try!')) {\n result.error_handling.push('try!');\n }\n\n return result;\n}\n\nexport function mergeSwiftResults(results: SwiftParseResult[]): SwiftParseResult {\n const merged: SwiftParseResult = {\n imports: [],\n types: [],\n functions: [],\n property_wrappers: [],\n error_handling: [],\n frameworks_used: [],\n };\n\n const importCounts = new Map<string, number>();\n const wrapperCounts = new Map<string, number>();\n const errorCounts = new Map<string, number>();\n const frameworkSet = new Set<string>();\n\n for (const r of results) {\n for (const imp of r.imports) {\n importCounts.set(imp, (importCounts.get(imp) || 0) + 1);\n }\n merged.types.push(...r.types);\n merged.functions.push(...r.functions);\n for (const w of r.property_wrappers) {\n wrapperCounts.set(w, (wrapperCounts.get(w) || 0) + 1);\n }\n for (const e of r.error_handling) {\n errorCounts.set(e, (errorCounts.get(e) || 0) + 1);\n }\n for (const fw of r.frameworks_used) {\n frameworkSet.add(fw);\n }\n }\n\n // Sort imports by count descending, top 20\n merged.imports = Array.from(importCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 20)\n .map(([mod, count]) => mod);\n\n // Sort wrappers by count, top 10\n merged.property_wrappers = Array.from(wrapperCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([w]) => w);\n\n // Sort errors by count, top 10\n merged.error_handling = Array.from(errorCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([p]) => p);\n\n merged.frameworks_used = Array.from(frameworkSet).sort();\n\n // Limit types and functions\n merged.types = merged.types.slice(0, 100);\n merged.functions = merged.functions.slice(0, 100);\n\n return merged;\n}\n","/**\n * TypeScript/JavaScript AST-level parser — extracts imports, types, functions,\n * and error handling patterns.\n *\n * Ported from knowledge-tree/extract_project_keywords.py parse_ts_file()\n */\n\nexport interface TsParseResult {\n imports: string[];\n types: Array<{\n kind: string;\n name: string;\n file: string;\n }>;\n functions: Array<{\n name: string;\n params: string;\n file: string;\n }>;\n error_handling: string[];\n}\n\nconst IMPORT_RE = /import\\s+.*?from\\s+['\"]([^'\"]+)['\"]/g;\nconst TYPE_RE = /\\b(interface|type|class|enum)\\s+(\\w+)/g;\nconst FUNC_RE = /\\bfunction\\s+(\\w+)\\s*\\(([^)]*)\\)/g;\nconst ARROW_RE = /\\bconst\\s+(\\w+)\\s*=\\s*\\([^)]*\\)\\s*(?::\\s*\\w+)?\\s*=>/g;\n\nexport function parseTsFile(filepath: string, content: string): TsParseResult {\n const result: TsParseResult = {\n imports: [],\n types: [],\n functions: [],\n error_handling: [],\n };\n\n let match: RegExpExecArray | null;\n\n // Extract imports\n while ((match = IMPORT_RE.exec(content)) !== null) {\n result.imports.push(match[1]);\n }\n\n // Extract type/interface/class/enum declarations\n while ((match = TYPE_RE.exec(content)) !== null) {\n result.types.push({\n kind: match[1],\n name: match[2],\n file: filepath,\n });\n }\n\n // Extract function declarations\n while ((match = FUNC_RE.exec(content)) !== null) {\n result.functions.push({\n name: match[1],\n params: (match[2] || '').trim(),\n file: filepath,\n });\n }\n\n // Extract arrow functions\n while ((match = ARROW_RE.exec(content)) !== null) {\n result.functions.push({\n name: match[1],\n params: '',\n file: filepath,\n });\n }\n\n // Extract error handling patterns\n if (content.includes('try {') || content.includes('try{')) {\n result.error_handling.push('try-catch');\n }\n if (content.includes('Promise')) {\n result.error_handling.push('Promise');\n }\n if (content.includes('.catch(')) {\n result.error_handling.push('.catch()');\n }\n\n return result;\n}\n\nexport function mergeTsResults(results: TsParseResult[]): TsParseResult {\n const merged: TsParseResult = {\n imports: [],\n types: [],\n functions: [],\n error_handling: [],\n };\n\n const importCounts = new Map<string, number>();\n const errorCounts = new Map<string, number>();\n\n for (const r of results) {\n for (const imp of r.imports) {\n importCounts.set(imp, (importCounts.get(imp) || 0) + 1);\n }\n merged.types.push(...r.types);\n merged.functions.push(...r.functions);\n for (const e of r.error_handling) {\n errorCounts.set(e, (errorCounts.get(e) || 0) + 1);\n }\n }\n\n merged.imports = Array.from(importCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 20)\n .map(([mod]) => mod);\n\n merged.error_handling = Array.from(errorCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([p]) => p);\n\n merged.types = merged.types.slice(0, 100);\n merged.functions = merged.functions.slice(0, 100);\n\n return merged;\n}\n","/**\n * Python AST-level parser — extracts imports, classes, functions, docstrings,\n * and error handling patterns.\n *\n * Ported from knowledge-tree/extract_project_keywords.py parse_python_file()\n */\n\nexport interface PythonParseResult {\n imports: string[];\n types: Array<{\n kind: string;\n name: string;\n bases: string[];\n file: string;\n }>;\n functions: Array<{\n name: string;\n params: string;\n file: string;\n }>;\n docstrings: string[];\n error_handling: string[];\n}\n\nconst IMPORT_RE = /^(?:import|from)\\s+(\\w+)/gm;\nconst CLASS_RE = /\\bclass\\s+(\\w+)(?:\\s*\\(([^)]+)\\))?/g;\nconst FUNC_RE = /\\bdef\\s+(\\w+)\\s*\\(([^)]*)\\)/g;\nconst DOCSTRING_RE = /\"\"\"([^\"]{20,300})\"\"\"/g;\n\nexport function parsePythonFile(filepath: string, content: string): PythonParseResult {\n const result: PythonParseResult = {\n imports: [],\n types: [],\n functions: [],\n docstrings: [],\n error_handling: [],\n };\n\n let match: RegExpExecArray | null;\n\n // Extract imports\n while ((match = IMPORT_RE.exec(content)) !== null) {\n result.imports.push(match[1]);\n }\n\n // Extract docstrings (module, class, function level) — high-signal domain intent\n while ((match = DOCSTRING_RE.exec(content)) !== null) {\n const firstSentence = match[1].trim().split('\\n')[0].slice(0, 120);\n if (firstSentence.length > 15) {\n result.docstrings.push(firstSentence);\n }\n }\n\n // Extract class declarations\n while ((match = CLASS_RE.exec(content)) !== null) {\n const bases = (match[2] || '')\n .split(',')\n .map(b => b.trim())\n .filter(Boolean);\n result.types.push({\n kind: 'class',\n name: match[1],\n bases,\n file: filepath,\n });\n }\n\n // Extract function declarations\n while ((match = FUNC_RE.exec(content)) !== null) {\n const name = match[1];\n // Skip dunder methods (__init__, __str__)\n if (name.startsWith('__') && name.endsWith('__')) continue;\n result.functions.push({\n name,\n params: (match[2] || '').trim(),\n file: filepath,\n });\n }\n\n // Extract error handling patterns\n if (content.includes('try:')) {\n result.error_handling.push('try-except');\n }\n if (content.includes('raise')) {\n result.error_handling.push('raise');\n }\n\n return result;\n}\n\nexport function mergePythonResults(results: PythonParseResult[]): PythonParseResult {\n const merged: PythonParseResult = {\n imports: [],\n types: [],\n functions: [],\n docstrings: [],\n error_handling: [],\n };\n\n const importCounts = new Map<string, number>();\n const errorCounts = new Map<string, number>();\n\n for (const r of results) {\n for (const imp of r.imports) {\n importCounts.set(imp, (importCounts.get(imp) || 0) + 1);\n }\n merged.types.push(...r.types);\n merged.functions.push(...r.functions);\n merged.docstrings.push(...r.docstrings);\n for (const e of r.error_handling) {\n errorCounts.set(e, (errorCounts.get(e) || 0) + 1);\n }\n }\n\n merged.imports = Array.from(importCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 20)\n .map(([mod]) => mod);\n\n merged.error_handling = Array.from(errorCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([p]) => p);\n\n merged.types = merged.types.slice(0, 100);\n merged.functions = merged.functions.slice(0, 100);\n merged.docstrings = merged.docstrings.slice(0, 20);\n\n return merged;\n}\n","/**\n * C++/Arduino AST-level parser — extracts #include, types, functions,\n * and error handling patterns.\n *\n * Ported from knowledge-tree/extract_project_keywords.py parse_cpp_file()\n */\n\nexport interface CppParseResult {\n imports: string[];\n types: Array<{\n kind: string;\n name: string;\n file: string;\n }>;\n functions: Array<{\n name: string;\n file: string;\n }>;\n error_handling: string[];\n}\n\nconst INCLUDE_RE = /#include\\s*[<\"]([^>\"]+)[>\"]/g;\nconst TYPE_RE = /\\b(?:class|struct|enum)\\s+(\\w+)/g;\nconst FUNC_RE = /\\b(?:void|int|float|double|char|bool|String|uint8_t|uint16_t|uint32_t)\\s+(\\w+)\\s*\\(/g;\n\nexport function parseCppFile(filepath: string, content: string): CppParseResult {\n const result: CppParseResult = {\n imports: [],\n types: [],\n functions: [],\n error_handling: [],\n };\n\n let match: RegExpExecArray | null;\n\n // Extract #include\n while ((match = INCLUDE_RE.exec(content)) !== null) {\n result.imports.push(match[1]);\n }\n\n // Extract type declarations\n while ((match = TYPE_RE.exec(content)) !== null) {\n result.types.push({\n kind: 'cpp',\n name: match[1],\n file: filepath,\n });\n }\n\n // Extract function declarations\n while ((match = FUNC_RE.exec(content)) !== null) {\n result.functions.push({\n name: match[1],\n file: filepath,\n });\n }\n\n // Extract error handling patterns\n if (/\\btry\\b|\\bthrow\\b|\\bcatch\\b/.test(content)) {\n result.error_handling.push('try/throw/catch');\n }\n\n return result;\n}\n\nexport function mergeCppResults(results: CppParseResult[]): CppParseResult {\n const merged: CppParseResult = {\n imports: [],\n types: [],\n functions: [],\n error_handling: [],\n };\n\n const importCounts = new Map<string, number>();\n\n for (const r of results) {\n for (const imp of r.imports) {\n importCounts.set(imp, (importCounts.get(imp) || 0) + 1);\n }\n merged.types.push(...r.types);\n merged.functions.push(...r.functions);\n merged.error_handling.push(...r.error_handling);\n }\n\n merged.imports = Array.from(importCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 20)\n .map(([mod]) => mod);\n\n // Deduplicate error handling\n merged.error_handling = [...new Set(merged.error_handling)];\n\n return merged;\n}\n","/**\n * Keyword extraction logic — combines AST parser results into structured keywords\n * with source, weight, and context metadata.\n *\n * Ported from knowledge-tree/extract_project_keywords.py extract_keywords()\n */\n\nimport type { SwiftParseResult } from '../parsers/swift';\nimport type { TsParseResult } from '../parsers/typescript';\nimport type { PythonParseResult } from '../parsers/python';\nimport type { CppParseResult } from '../parsers/cpp';\n\nexport interface Keyword {\n keyword: string;\n source: string;\n platform: string;\n weight: number;\n context: string;\n}\n\nexport type SourceContext = SwiftParseResult | TsParseResult | PythonParseResult | CppParseResult;\n\nexport interface ExtractKeywordsOptions {\n /** Additional stdlib modules to skip (merged with defaults) */\n extraStdlibModules?: string[];\n /** Modules to un-skip even if in stdlib (e.g., 'math' for scientific projects) */\n unskipModules?: string[];\n}\n\n/**\n * Standard library modules that carry no domain signal — skip as keywords.\n */\nconst STDLIB_MODULES = new Set([\n // Python\n 'os', 'sys', 'typing', 'json', 're', 'math', 'random', 'time', 'datetime',\n 'pathlib', 'dataclasses', 'enum', 'collections', 'itertools', 'functools',\n 'logging', 'argparse', 'subprocess', 'threading', 'multiprocessing', 'asyncio',\n 'socket', 'http', 'urllib', 'ssl', 'hashlib', 'base64', 'csv', 'sqlite3',\n 'pickle', 'tempfile', 'shutil', 'glob', 'io', 'string', 'struct', 'uuid',\n 'abc', 'copy', 'decimal', 'fractions', 'statistics', 'queue', 'signal',\n 'traceback', 'warnings', 'weakref', 'contextlib', 'unittest', 'pytest',\n 'tkinter', 'tk', 'ttk', 'types', 'inspect', 'platform',\n // Common third-party generic plumbing\n 'requests', 'urllib3', 'pydantic', 'dotenv', 'yaml', 'tomllib',\n]);\n\n/**\n * Map file path → platform (multi-codebase project: Swift app vs ESP32 firmware).\n */\nfunction platformFromPath(filePath: string): string {\n if (!filePath) return 'app';\n const fp = filePath.toLowerCase();\n if (fp.endsWith('.ino') || fp.endsWith('.cpp') || fp.endsWith('.h') || fp.endsWith('.hpp') || fp.endsWith('.c')) {\n if (fp.endsWith('.ino')) return 'esp32';\n if (fp.includes('firmware') || fp.includes('esp')) return 'esp32';\n return 'app';\n }\n return 'app';\n}\n\n/**\n * Extract structured keywords from source context and basic analysis.\n *\n * Multi-target: each keyword is tagged with platform (app/esp32) from its source file,\n * so downstream SIO generation produces correct keywords for each codebase.\n */\nexport function extractKeywords(\n sourceContext: SourceContext,\n basicAnalysis?: { config_files?: string[] },\n repoDir?: string,\n options?: ExtractKeywordsOptions,\n): Keyword[] {\n const keywords: Keyword[] = [];\n\n // Build effective stdlib set with overrides\n const effectiveStdlib = new Set(STDLIB_MODULES);\n if (options?.extraStdlibModules) {\n for (const m of options.extraStdlibModules) effectiveStdlib.add(m.toLowerCase());\n }\n if (options?.unskipModules) {\n for (const m of options.unskipModules) effectiveStdlib.delete(m.toLowerCase());\n }\n\n // Source 1: Import statements → framework keywords\n if ('imports' in sourceContext) {\n for (const imp of sourceContext.imports) {\n let module: string;\n let count = 1;\n let platform = 'app';\n\n if (typeof imp === 'string') {\n module = imp;\n } else if (imp && typeof imp === 'object' && 'module' in imp) {\n const impObj = imp as { module: string; count?: number; file?: string };\n module = impObj.module;\n count = impObj.count || 1;\n platform = platformFromPath(impObj.file || '');\n } else {\n continue;\n }\n\n // Skip standard library / generic plumbing — no domain signal\n if (effectiveStdlib.has(module.toLowerCase())) continue;\n\n keywords.push({\n keyword: module,\n source: 'import',\n platform,\n weight: 1.0 + (count - 1) * 0.1,\n context: `Imported ${count} times`,\n });\n }\n }\n\n // Source 2: Type declarations → domain concepts\n if ('types' in sourceContext) {\n for (const typeDecl of sourceContext.types) {\n const name = typeDecl.name;\n const kind = typeDecl.kind;\n const platform = platformFromPath(typeDecl.file || '');\n\n // Skip generic/framework types\n if (['View', 'Model', 'ViewModel', 'Controller', 'Service', 'Manager'].includes(name)) continue;\n\n keywords.push({\n keyword: name,\n source: 'type_declaration',\n platform,\n weight: 1.5,\n context: `${kind} declaration`,\n });\n }\n }\n\n // Source 3: Function signatures → business logic\n if ('functions' in sourceContext) {\n for (const func of sourceContext.functions) {\n const name = func.name;\n const platform = platformFromPath(func.file || '');\n\n // Skip generic helpers\n if (['init', 'setup', 'configure', 'initialize'].includes(name)) continue;\n\n keywords.push({\n keyword: name,\n source: 'function_signature',\n platform,\n weight: 1.2,\n context: 'Function signature',\n });\n }\n }\n\n // Source 3.5: Docstrings → domain intent (high signal) — Python only\n if ('docstrings' in sourceContext && Array.isArray(sourceContext.docstrings)) {\n for (const doc of sourceContext.docstrings) {\n const firstSentence = doc.trim().split('\\n')[0].slice(0, 120);\n if (firstSentence.length > 15) {\n keywords.push({\n keyword: firstSentence,\n source: 'docstring',\n platform: 'app',\n weight: 1.8,\n context: 'Docstring (domain intent)',\n });\n }\n }\n }\n\n // Source 3.6: Framework usage → real practice keywords — Swift only\n if ('frameworks_used' in sourceContext && Array.isArray(sourceContext.frameworks_used)) {\n for (const fw of sourceContext.frameworks_used) {\n const fwName = typeof fw === 'string' ? fw : (fw as { framework?: string }).framework || '';\n if (fwName) {\n keywords.push({\n keyword: fwName,\n source: 'framework_usage',\n platform: 'app',\n weight: 1.4,\n context: 'Framework usage (real practice)',\n });\n }\n }\n }\n\n // Source 4: Property wrappers → state management patterns — Swift only\n if ('property_wrappers' in sourceContext && Array.isArray(sourceContext.property_wrappers)) {\n for (const wrapper of sourceContext.property_wrappers) {\n const wrapperName = typeof wrapper === 'string' ? wrapper : (wrapper as { wrapper?: string }).wrapper || '';\n if (wrapperName) {\n keywords.push({\n keyword: `@${wrapperName}`,\n source: 'property_wrapper',\n platform: 'app',\n weight: 2.0,\n context: 'Property wrapper',\n });\n }\n }\n }\n\n // Source 5: Error handling patterns → reliability concerns\n const errorPatterns = 'error_handling' in sourceContext\n ? sourceContext.error_handling\n : 'error_handling_patterns' in sourceContext\n ? (sourceContext as { error_handling_patterns?: Array<{ pattern: string; count?: number; file?: string }> }).error_handling_patterns || []\n : [];\n\n for (const error of errorPatterns) {\n let pattern: string;\n let platform = 'app';\n\n if (typeof error === 'string') {\n pattern = error;\n } else if (error && typeof error === 'object' && 'pattern' in error) {\n const errObj = error as { pattern: string; file?: string };\n pattern = errObj.pattern;\n platform = platformFromPath(errObj.file || '');\n } else {\n continue;\n }\n\n keywords.push({\n keyword: pattern,\n source: 'error_handling',\n platform,\n weight: 1.3,\n context: 'Error handling pattern',\n });\n }\n\n // Deduplicate by keyword (case-insensitive)\n const seen = new Set<string>();\n const uniqueKeywords: Keyword[] = [];\n for (const kw of keywords) {\n const key = kw.keyword.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n uniqueKeywords.push(kw);\n }\n }\n\n return uniqueKeywords;\n}\n","/**\n * LLM client wrapper — provides a unified interface for LLM calls\n * used by the graph generation pipeline.\n *\n * Supports OpenAI-compatible APIs via environment variables:\n * LLM_API_KEY, LLM_BASE_URL, LLM_MODEL (or LLM_TIER_FAST / LLM_TIER_STRONG)\n */\n\nexport interface LlmClientConfig {\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/** One callable provider endpoint in the fallback chain. */\nexport interface ProviderSpec {\n label: string;\n baseUrl: string;\n apiKey: string;\n model: string;\n}\n\nexport interface LlmClient {\n chat(messages: LlmChatMessage[], options?: { temperature?: number; maxTokens?: number }): Promise<LlmChatResult>;\n model: string;\n}\n\nexport interface LlmChatMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\nexport interface LlmChatResult {\n content: string;\n model: string;\n /** Provider label that ultimately served the request. */\n provider?: string;\n /** What happened per provider when fallback occurred (empty when first try succeeded). */\n attempts?: string[];\n /** 'stop' when complete; 'length' means the response was TRUNCATED by max_tokens. */\n finishReason?: string;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n finishReason?: string;\n};\n}\n\nexport class LlmClientError extends Error {\n constructor(\n message: string,\n public readonly status?: number,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = 'LlmClientError';\n }\n}\n\n/**\n * Create an LLM client from environment variables.\n */\n/**\n * Resolve the provider fallback chain from explicit config and environment.\n * Base order: explicit config > legacy LLM_API_KEY/OPENAI_API_KEY > NVIDIA NIM >\n * OpenRouter > DashScope/Alibaba MaaS. First entry is PRIMARY; the rest are\n * fallbacks tried in order.\n *\n * QUALITY-EVAL MODE: when OPENROUTER_MODEL is set (a paid preset), OpenRouter\n * is promoted to PRIMARY so generation quality is evaluated without free-tier\n * 429/403 noise. NVIDIA/dashscope then act only as safety-net fallbacks.\n */\nexport function resolveProviderChain(config?: LlmClientConfig): ProviderSpec[] {\n const chain: ProviderSpec[] = [];\n const push = (label: string, baseUrl: string, apiKey: string, model: string): void => {\n if (apiKey && baseUrl && model && !chain.some((c) => c.baseUrl === baseUrl && c.model === model)) {\n chain.push({ label, baseUrl, apiKey, model });\n }\n };\n // Explicit single-provider config keeps its historical meaning.\n if (config?.apiKey) {\n push('config', config.baseUrl || 'https://api.openai.com/v1', config.apiKey, config.model || 'gpt-4o-mini');\n }\n // Legacy generic env (knowledge-tree compatible: OPENAI_BASE_URL + LLM_MODEL).\n push('legacy', process.env.LLM_BASE_URL || process.env.OPENAI_BASE_URL || '', process.env.LLM_API_KEY || process.env.OPENAI_API_KEY || '', process.env.LLM_MODEL || process.env.LLM_TIER_FAST || '');\n // DashScope / Alibaba MaaS (OpenAI-compatible endpoints).\n push('dashscope', process.env.DASHSCOPE_BASE_URL || process.env.ALIBABA_BASE_URL || '', process.env.DASHSCOPE_API_KEY || process.env.ALIBABA_API_KEY || '', process.env.DASHSCOPE_MODEL || process.env.DEFAULT_AI_MODEL || '');\n // NVIDIA NIM — hosted provider for generation workloads.\n push('nvidia', 'https://integrate.api.nvidia.com/v1', process.env.NVIDIA_API_KEY || '', process.env.NVIDIA_MODEL || 'nvidia/nemotron-3-ultra-550b-a55b:free');\n // OpenRouter — paid preset primary when OPENROUTER_MODEL pins a model/preset.\n push('openrouter', 'https://openrouter.ai/api/v1', process.env.OPENROUTER_API_KEY || '', process.env.OPENROUTER_MODEL || 'nvidia/nemotron-3-ultra-550b-a55b:free');\n // QUALITY-EVAL MODE: paid OpenRouter preset goes FIRST (no 429 noise).\n if (process.env.OPENROUTER_MODEL) {\n const or = chain.find((c) => c.label === 'openrouter');\n if (or) {\n const rest = chain.filter((c) => c !== or);\n return [or, ...rest];\n }\n }\n return chain;\n}\n\n// Free-tier rate limits (NVIDIA NIM, OpenRouter) trip when a pipeline fires\n// many requests in a burst. Global pacing keeps us under the limit; a single\n// isolated call still goes through immediately.\nconst MIN_REQUEST_INTERVAL_MS = 2_500;\nlet lastRequestAt = 0;\n\nasync function pacedDelay(): Promise<void> {\n const wait = lastRequestAt + MIN_REQUEST_INTERVAL_MS - Date.now();\n if (wait > 0) await new Promise((resolve) => setTimeout(resolve, wait));\n lastRequestAt = Date.now();\n}\n\nexport function createLlmClient(config?: LlmClientConfig): LlmClient {\n const chain = resolveProviderChain(config);\n const primary = chain[0];\n if (!primary) {\n throw new LlmClientError(\n 'No LLM provider configured. Set NVIDIA_API_KEY (primary) and/or OPENROUTER_API_KEY (fallback), or pass llmConfig.',\n );\n }\n const apiKey = primary.apiKey;\n const baseUrl = primary.baseUrl;\n const model = primary.model;\n\n async function chat(\n messages: LlmChatMessage[],\n options?: { temperature?: number; maxTokens?: number },\n ): Promise<LlmChatResult> {\n const temperature = options?.temperature ?? config?.temperature ?? 0.1;\n const maxTokens = options?.maxTokens ?? config?.maxTokens ?? parseInt(process.env.LLM_MAX_TOKENS || '65536', 10);\n\n const attempts: string[] = [];\n let lastError: LlmClientError | null = null;\n const TRANSIENT = new Set([408, 429, 500, 502, 503, 504]);\n // Hard per-request cap so a hanging provider degrades to a transient error\n // and the chain falls through instead of blocking the pipeline forever.\n // Reasoning presets (e.g. deepseek-v4-flash) can legitimately think for\n // minutes on large structured outputs — 5 minutes default, env-overridable.\n const REQUEST_TIMEOUT_MS = Number(process.env.LLM_REQUEST_TIMEOUT_MS || 300_000);\n const MAX_CHAIN_ROUNDS = 3;\n for (let round = 1; round <= MAX_CHAIN_ROUNDS; round++) {\n if (round > 1) {\n // Whole chain failed transiently (rate limits / upstream 5xx) — back\n // off and rewalk the chain from the primary instead of dying.\n attempts.push('round ' + (round - 1) + ' failed — backing off 20s before rewalking the chain');\n await new Promise((resolve) => setTimeout(resolve, 20_000));\n }\n for (const provider of chain) {\n try {\n const headers = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${provider.apiKey}`,\n };\n const payload = {\n model: provider.model,\n messages,\n temperature,\n max_tokens: maxTokens,\n };\n await pacedDelay();\n const doFetch = (): Promise<Response> => fetch(`${provider.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${provider.apiKey}`,\n },\n body: JSON.stringify({\n model: provider.model,\n messages,\n temperature,\n max_tokens: maxTokens,\n }),\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n });\n // Transient network failures (DNS blip, TLS reset, \"fetch failed\") get\n // one same-provider retry before falling through the chain.\n let response: Response;\n try {\n response = await doFetch();\n } catch (netErr) {\n attempts.push(`${provider.label}: network error (${netErr instanceof Error ? netErr.message : String(netErr)}) — retrying once`);\n await new Promise((r) => setTimeout(r, 5_000));\n lastRequestAt = Date.now();\n response = await doFetch();\n }\n if (!response.ok) {\n const body = await response.text().catch(() => '');\n const err = new LlmClientError(\n `[${provider.label}] LLM API error: ${response.status} ${response.statusText} — ${body.slice(0, 200)}`,\n response.status,\n );\n if (response.status === 429) {\n // Rate-limited: honor Retry-After (bounded) and retry once on the\n // same provider before falling through to the next one.\n const retryAfterRaw = response.headers.get('retry-after');\n const retryAfterMs = Math.min(\n 60_000,\n Math.max(15_000, (Number.isFinite(Number(retryAfterRaw)) ? Number(retryAfterRaw) : 20) * 1_000),\n );\n attempts.push(`${provider.label}: 429 rate-limited — backing off ${Math.round(retryAfterMs / 1000)}s`);\n await new Promise((resolve) => setTimeout(resolve, retryAfterMs));\n lastRequestAt = Date.now();\n const retry = await fetch(`${provider.baseUrl}/chat/completions`, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n });\n if (!retry.ok) throw err;\n const retryData = await retry.json() as {\n choices?: Array<{ message?: { content?: string }; finish_reason?: string }>;\n model?: string;\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n const retryContent2 = retryData.choices?.[0]?.message?.content || '';\n if (!retryContent2.trim()) throw err;\n return {\n content: retryContent2,\n model: retryData.model || provider.model,\n provider: provider.label,\n attempts: attempts.slice(),\n usage: retryData.usage,\n finishReason: retryData.choices?.[0]?.finish_reason,\n };\n }\n if (TRANSIENT.has(response.status)) {\n await new Promise((r) => setTimeout(r, 3000));\n const retry = await fetch(`${provider.baseUrl}/chat/completions`, {\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${provider.apiKey}`,\n },\n body: JSON.stringify({\n model: provider.model,\n messages,\n temperature,\n max_tokens: maxTokens,\n }),\n });\n if (!retry.ok) throw err; // still transient-failing — fall through to next provider\n const retryData = await retry.json() as {\n choices?: Array<{ message?: { content?: string }; finish_reason?: string }>;\n model?: string;\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n const retryContent = retryData.choices?.[0]?.message?.content || '';\n return {\n content: retryContent,\n model: retryData.model || provider.model,\n provider: provider.label,\n attempts: attempts.slice(),\n usage: retryData.usage,\n finishReason: retryData.choices?.[0]?.finish_reason,\n };\n }\n throw err;\n }\n const data = await response.json() as {\n choices?: Array<{ message?: { content?: string }; finish_reason?: string }>;\n model?: string;\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n const wrappedError = (data as { error?: { message?: string; code?: number } }).error;\n if (wrappedError) {\n // OpenRouter proxies some upstream failures as HTTP 200 with an\n // {\"error\": {...}} body — treat as transient and fall through.\n throw new LlmClientError('[' + provider.label + '] upstream error ' + (wrappedError.code ?? '') + ': ' + (wrappedError.message ?? 'unknown'));\n }\n const content = data.choices?.[0]?.message?.content || '';\n if (!content.trim()) {\n // Empty completion (provider outage / content filter) is transient —\n // fall through to the next provider instead of returning unusable ''.\n throw new LlmClientError('[' + provider.label + '] empty completion returned');\n }\n return {\n content,\n model: data.model || provider.model,\n provider: provider.label,\n attempts: attempts.slice(),\n usage: data.usage,\n finishReason: data.choices?.[0]?.finish_reason,\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n attempts.push(`${provider.label}: ${msg}`);\n lastError = err instanceof LlmClientError ? err : new LlmClientError(`[${provider.label}] ${msg}`);\n // try next provider\n }\n }\n if (round < MAX_CHAIN_ROUNDS) continue; // rewalk the chain\n throw lastError ?? new LlmClientError('All LLM providers failed (empty chain).');\n }\n throw lastError ?? new LlmClientError('All LLM providers failed after ' + MAX_CHAIN_ROUNDS + ' rounds.');\n }\n\n return { chat, model };\n}\n\n/**\n * Parse JSON from LLM response, handling markdown code fences.\n */\nexport function parseJsonFromLlm(text: string): Record<string, unknown> {\n // Strip markdown code fences if present\n let cleaned = text.trim();\n if (cleaned.startsWith('```json')) {\n cleaned = cleaned.slice(7);\n } else if (cleaned.startsWith('```')) {\n cleaned = cleaned.slice(3);\n }\n if (cleaned.endsWith('```')) {\n cleaned = cleaned.slice(0, -3);\n }\n cleaned = cleaned.trim();\n\n try {\n return JSON.parse(cleaned) as Record<string, unknown>;\n } catch {\n // Try to find first complete JSON object using brace-depth tracking\n const start = cleaned.indexOf('{');\n if (start >= 0) {\n let depth = 0;\n let inString = false;\n let escape = false;\n for (let i = start; i < cleaned.length; i++) {\n const ch = cleaned[i];\n if (escape) { escape = false; continue; }\n if (ch === '\\\\') { escape = true; continue; }\n if (ch === '\"') { inString = !inString; continue; }\n if (inString) continue;\n if (ch === '{') depth++;\n if (ch === '}') {\n depth--;\n if (depth === 0) {\n try {\n return JSON.parse(cleaned.slice(start, i + 1)) as Record<string, unknown>;\n } catch {\n // keep looking\n }\n }\n }\n }\n }\n throw new LlmClientError(`Failed to parse JSON from LLM response: ${cleaned.slice(0, 200)}`);\n }\n}\n\n/**\n * Call LLM and parse JSON response.\n */\nexport async function llmChatJson(\n client: ReturnType<typeof createLlmClient>,\n systemPrompt: string,\n userPrompt: string,\n options?: { temperature?: number; maxTokens?: number },\n): Promise<Record<string, unknown>> {\n const result = await client.chat(\n [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ],\n options,\n );\n\n return parseJsonFromLlm(result.content);\n}\n","/**\n * STEP C0: Extract FOUNDATION & SETUP feature (F0) via LLM.\n *\n * Ported from knowledge-tree/llm_project_graph.py extract_scaffold_llm()\n * The F0 feature covers MUST-KNOW steps before the first feature:\n * tools, project creation, minimal programming knowledge, repo map, dev loop.\n */\n\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\nimport type { Feature } from '../schemas/projectGraphSchema';\n\nexport interface ExtractScaffoldOptions {\n goal: string;\n techStack: string;\n fileList: string[];\n llmConfig?: LlmClientConfig;\n}\n\n/**\n * Extract the FOUNDATION & SETUP feature (F0) via LLM.\n * Returns a Feature with steps covering tool setup, project creation,\n * minimal programming knowledge, repo map, and dev loop.\n */\nexport async function extractScaffold(options: ExtractScaffoldOptions): Promise<Feature | null> {\n const { goal, techStack, fileList, llmConfig } = options;\n const client = createLlmClient(llmConfig);\n const fileListStr = fileList.length > 0 ? fileList.join('\\n') : '(empty)';\n\n const systemPrompt = (\n 'You are a programming pedagogy expert. For ONE concrete project, extract the '\n + \"'FOUNDATION & SETUP' feature (id F0) — the COMPLETE set of 'MUST-KNOW' steps \"\n + 'the learner needs before studying the first feature. Break it into concrete ACTION '\n + 'steps (5-8 steps), each with completion_level=\\'base\\'. Include:\\n'\n + '1. Tools required for this tech stack (IDE, simulator/emulator, terminal, git, '\n + 'package manager) + basic operations (open project, build, run, debug, commit).\\n'\n + '2. Create the initial project: from a template OR clone/open the base-project (the provided repo).\\n'\n + '3. MINIMAL programming knowledge of the language (variables, types, functions, if/for, view declaration) '\n + '+ build one small demo (e.g. a single-screen Hello World app) BEFORE touching the real project.\\n'\n + '4. Repo map of the actual project: folder structure, entry point, how to build/run, main architecture '\n + '(MVVM/Flux...), important packages/modules.\\n'\n + '5. Development loop (build->run->see result->debug), how to read/fix basic compile errors, '\n + 'minimal git workflow (clone/branch/commit/push).\\n'\n + 'keywords[]: real tool/language terms (e.g. \\'Xcode\\', \\'Simulator\\', \\'Git\\', \\'Swift\\', '\n + '\\'@main\\', \\'MVVM\\'). files[]: leave [] or use real paths if the step touches specific files. '\n + 'description: ONE concise sentence, MAX 140 characters. '\n + 'intent: WHY this step matters. outcome: {user_visible: string, technical: string}. '\n + 'acceptance[]: 2 verifiable criteria. effort: {estimated_minutes: number, complexity: low|medium|high}. '\n + 'NEVER invent. ALL text must be in ENGLISH (technical terms stay as-is). '\n + 'Return JSON containing only feature F0.'\n );\n\n const userPrompt = (\n `App goal: ${goal}\\n`\n + `Tech stack: ${techStack}\\n\\n`\n + 'PROJECT FILE LIST (base-project):\\n'\n + `${fileListStr}\\n\\n`\n + 'Return JSON:\\n'\n + '{\\n'\n + ' \"feature\": {\\n'\n + ' \"id\": \"F0\",\\n'\n + ' \"name\": \"FOUNDATION & SETUP\",\\n'\n + ' \"description\": \"Get familiar with the tools, create/clone the project, learn minimal knowledge and the repo map\",\\n'\n + ' \"platform\": \"app\",\\n'\n + ' \"steps\": [\\n'\n + ' {\\n'\n + ' \"id\": \"F0-S1\",\\n'\n + ' \"sequence\": 1,\\n'\n + ' \"name\": \"Action step name\",\\n'\n + ' \"description\": \"Detailed description of the concrete actions\",\\n'\n + ' \"files\": [],\\n'\n + ' \"api_usage\": [],\\n'\n + ' \"keywords\": [\"Xcode\", \"Terminal\"],\\n'\n + ' \"completion_level\": \"base\",\\n'\n + ' \"intent\": \"Learn how to setup the IDE and run a minimal Swift app\",\\n'\n + ' \"outcome\": {\"user_visible\": \"App builds and runs\", \"technical\": \"Toolchain verified\"},\\n'\n + ' \"acceptance\": [\"Xcode builds without errors\", \"Simulator launches successfully\"],\\n'\n + ' \"effort\": {\"estimated_minutes\": 20, \"complexity\": \"low\"}\\n'\n + ' }\\n'\n + ' ]\\n'\n + ' }\\n'\n + '}\\n'\n );\n\n try {\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: parseInt(process.env.PG_C0_MAX_TOKENS || '16384', 10),\n });\n\n const feat = result.feature as Record<string, unknown> | undefined;\n if (!feat || !Array.isArray(feat.steps) || feat.steps.length === 0) {\n console.warn('[WARN] Scaffold LLM returned no steps — skipping F0');\n return null;\n }\n\n // Normalize step IDs and ensure required fields\n const steps = (feat.steps as Record<string, unknown>[]).map((s, i) => ({\n id: `F0-S${i + 1}`,\n sequence: i + 1,\n name: String(s.name || `Step ${i + 1}`),\n description: String(s.description || ''),\n files: Array.isArray(s.files) ? s.files : [],\n api_usage: Array.isArray(s.api_usage) ? s.api_usage : [],\n keywords: Array.isArray(s.keywords) ? s.keywords : [],\n completion_level: 'base' as const,\n platform: String(s.platform || 'app'),\n intent: String(s.intent || ''),\n outcome: s.outcome && typeof s.outcome === 'object' ? s.outcome as { user_visible?: string; technical?: string } : undefined,\n acceptance: Array.isArray(s.acceptance) ? s.acceptance : [],\n effort: s.effort && typeof s.effort === 'object' ? s.effort as { estimated_minutes?: number; complexity?: 'low' | 'medium' | 'high' } : undefined,\n requirement_ids: [] as string[],\n concept_codes: [] as string[],\n }));\n\n return {\n id: 'F0',\n name: String(feat.name || 'FOUNDATION & SETUP'),\n description: String(feat.description || ''),\n platform: String(feat.platform || 'app'),\n steps,\n } as Feature;\n } catch (err) {\n console.error(`[ERROR] extractScaffold failed: ${err}`);\n return null;\n }\n}\n","/**\n * STEP C1: Extract PROJECT OVERVIEW via LLM (features meta — NO steps).\n *\n * Ported from knowledge-tree/llm_project_graph.py extract_project_overview_llm()\n * Output: project, product, features[], user_journeys, architecture, decomposition.\n */\n\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\nimport type { Keyword } from '../extractors/keywordExtractor';\n\nexport interface ExtractOverviewOptions {\n goal: string;\n techStack: string;\n sdkApiIndex: { sdk_apis: Array<{ name: string; kind: string; used_in_demo: boolean }> };\n fileContentsMap: Map<string, string>;\n astKeywords?: Keyword[];\n llmConfig?: LlmClientConfig;\n}\n\nfunction buildSourceText(fileContentsMap: Map<string, string>): string {\n const blocks: string[] = [];\n for (const [relPath, content] of fileContentsMap) {\n blocks.push(`### FILE: ${relPath}\\n${content}`);\n }\n return blocks.join('\\n\\n');\n}\n\n/**\n * Extract project overview (features meta) via LLM.\n * Does NOT include steps — those are extracted per-feature in STEP C2.\n */\nexport async function extractProjectOverview(options: ExtractOverviewOptions): Promise<Record<string, unknown>> {\n const { goal, techStack, sdkApiIndex, fileContentsMap, astKeywords, llmConfig } = options;\n const client = createLlmClient(llmConfig);\n\n const usedSdkApis = sdkApiIndex.sdk_apis\n .filter(api => api.used_in_demo)\n .map(api => api.name)\n .slice(0, 2000);\n\n const allFilesStr = buildSourceText(fileContentsMap);\n\n // Build AST keywords anchor\n let keywordsAnchor = '';\n if (astKeywords && astKeywords.length > 0) {\n const kwItems = astKeywords.slice(0, 30).map(kw =>\n `- ${kw.keyword} (from ${kw.source})`,\n );\n if (kwItems.length > 0) {\n keywordsAnchor = (\n '\\nAST Domain Keywords & Patterns (from static analysis — use as context anchor):\\n'\n + kwItems.join('\\n')\n + '\\n'\n );\n }\n }\n\n const systemPrompt = (\n 'You are a software architect. The app the user will build IS EXACTLY the provided files '\n + '(not an SDK/lib). Analyze them and return a PROJECT OVERVIEW — meta only, '\n + 'DO NOT list steps (steps are handled in a later step). '\n + 'NEVER invent files/APIs. NEVER reference internal SDK/lib unless it appears in the given files.\\n'\n + 'END-USER VIEW (M1/Design Thinking): product.purpose must describe the USER PROBLEM '\n + '(what the user does with the app, which need it solves). NEVER describe repo/artifacts.\\n'\n + 'DEVELOPMENT STAGES: Include 4-6 development stages in product.development_stages. '\n + 'Each stage must have: stage (name), need (list of feature needs), learn (concepts learned), '\n + 'product_state (what works), temporary_approach, and validation.\\n'\n + 'MISSING GAPS: Identify 0-5 missing_gaps (features/functionality that should exist but don\\'t).\\n'\n + 'TECH DEBT: Identify 0-5 tech_debt issues (code quality problems).\\n'\n + 'ALL text must be in ENGLISH.'\n );\n\n const userPrompt = `App goal: ${goal}\nTech stack: ${techStack}\n${keywordsAnchor}\nFiltered SDK API list (used_in_demo):\n${JSON.stringify(usedSdkApis, null, 0)}\n\nSource code of the files:\n${allFilesStr}\n\nReturn JSON per the schema:\n{\n \"schema_version\": 2,\n \"project\": {\"name\": \"...\", \"project_type\": \"app\", \"platforms\": [\"ios\"]},\n \"product\": {\n \"purpose\": \"END-USER problem being solved\",\n \"problem_statement\": \"Core user problem\",\n \"primary_users\": [\"who the main users are\"],\n \"development_stages\": [\n {\n \"stage\": \"Stage 1: Foundation & Setup\",\n \"need\": [\"Core app shell\"],\n \"learn\": [\"App lifecycle, basic UI\"],\n \"product_state\": \"App launches with static mock data\",\n \"temporary_approach\": \"Hardcoded array\",\n \"validation\": \"Main screen loads\"\n }\n ],\n \"features\": [\n {\"id\": \"F1\", \"name\": \"Feature name\", \"description\": \"Feature description\", \"platform\": \"ios\"}\n ],\n \"user_journeys\": [{\"name\": \"...\", \"feature_ids\": [\"F1\"]}]\n },\n \"architecture\": {\"layers\": [], \"services\": [], \"state_management\": \"...\"},\n \"decomposition\": {\"milestones\": [{\"id\": \"M1\", \"phase\": \"MVP\", \"name\": \"...\", \"goal\": \"...\", \"feature_ids\": [\"F1\"]}]}\n}`;\n\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: parseInt(process.env.PG_C1_MAX_TOKENS || '32768', 10),\n });\n\n // Ensure development_stages exists\n const prod = result.product as Record<string, unknown> | undefined;\n if (prod && !Array.isArray(prod.development_stages)) {\n prod.development_stages = [];\n }\n\n return result;\n}\n","/**\n * STEP C2: Extract feature STEPS via LLM.\n *\n * Ported from knowledge-tree/llm_project_graph.py\n * - extract_feature_steps_llm() — single feature\n * - extract_feature_steps_batched() — batch of features\n */\n\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\nimport type { Feature, Step } from '../schemas/projectGraphSchema';\n\nexport interface ExtractStepsOptions {\n goal: string;\n techStack: string;\n sdkApiIndex: { sdk_apis: Array<{ name: string; kind: string; used_in_demo: boolean }> };\n fileContentsMap: Map<string, string>;\n feature: Feature;\n llmConfig?: LlmClientConfig;\n}\n\nfunction buildSourceText(fileContentsMap: Map<string, string>): string {\n const blocks: string[] = [];\n for (const [relPath, content] of fileContentsMap) {\n blocks.push(`### FILE: ${relPath}\\n${content}`);\n }\n return blocks.join('\\n\\n');\n}\n\n/**\n * Extract steps for a SINGLE feature via LLM.\n */\nexport async function extractFeatureSteps(options: ExtractStepsOptions): Promise<Step[]> {\n const { goal, techStack, sdkApiIndex, fileContentsMap, feature, llmConfig } = options;\n const client = createLlmClient(llmConfig);\n\n const usedSdkApis = sdkApiIndex.sdk_apis\n .filter(api => api.used_in_demo)\n .map(api => api.name)\n .slice(0, 2000);\n\n const allFilesStr = buildSourceText(fileContentsMap);\n const fid = feature.id || 'F_UNK';\n const fname = feature.name || fid;\n const fdesc = feature.description || '';\n\n const systemPrompt = (\n 'You are a software architect. Split ONE feature into ACTION steps '\n + '(implementation steps) the learner must code sequentially. Each step must carry '\n + 'files[] (CORRECT paths in the source), api_usage[] (only from the provided SDK API index), '\n + 'keywords[] (real terms/language features in the files), '\n + 'and completion_level ∈ {base, mvp, extend, polish}.\\n'\n + ' - base = foundation/setup\\n'\n + ' - mvp = make the app minimally WORKING for this feature\\n'\n + ' - extend = make it real/richer\\n'\n + ' - polish = robustness (error handling, tests, validation)\\n'\n + 'Include metadata: intent, outcome ({user_visible, technical}), '\n + 'acceptance[] (2 verifiable criteria), effort ({estimated_minutes, complexity}).\\n'\n + 'description: ONE concise sentence, MAX 140 characters. '\n + 'NEVER invent files/APIs. Return ONLY the steps array. '\n + 'ALL text must be in ENGLISH.'\n );\n\n const userPrompt = `App goal: ${goal}\nTech stack: ${techStack}\n\nFEATURE TO SPLIT: ${fid} — ${fname}\nFeature description: ${fdesc}\n\nSDK API list (used_in_demo):\n${JSON.stringify(usedSdkApis)}\n\nSource code:\n${allFilesStr}\n\nSplit this feature into 2-6 action steps. Return JSON:\n{\n \"steps\": [\n {\n \"id\": \"${fid}-S1\",\n \"sequence\": 1,\n \"name\": \"Action step name\",\n \"description\": \"One concise sentence (max 140 chars)\",\n \"files\": [\"path/to/file.swift\"],\n \"api_usage\": [\"ChatClient\"],\n \"keywords\": [\"@State\", \"NavigationStack\"],\n \"completion_level\": \"mvp\",\n \"intent\": \"Create reactive state container\",\n \"outcome\": {\"user_visible\": \"Chat view updates\", \"technical\": \"ChatViewModel conforms to ObservableObject\"},\n \"acceptance\": [\"ViewModel publishes messages\", \"UI re-renders on state mutation\"],\n \"effort\": {\"estimated_minutes\": 30, \"complexity\": \"medium\"}\n }\n ]\n}`;\n\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: parseInt(process.env.PG_C2_MAX_TOKENS || '32768', 10),\n });\n\n const rawSteps = (result.steps || []) as Record<string, unknown>[];\n // Clamp to 2-6 steps per prompt contract\n const clampedSteps = rawSteps.length > 6 ? rawSteps.slice(0, 6) : rawSteps.length < 2 && rawSteps.length > 0 ? rawSteps : rawSteps;\n if (rawSteps.length > 6) {\n console.warn(`[WARN] LLM returned ${rawSteps.length} steps for ${fid}, clamped to 6`);\n } else if (rawSteps.length === 0) {\n console.warn(`[WARN] LLM returned 0 steps for ${fid}`);\n }\n return clampedSteps.map((s, i) => ({\n id: `${fid}-S${i + 1}`,\n sequence: i + 1,\n name: String(s.name || `Step ${i + 1}`),\n description: String(s.description || ''),\n files: Array.isArray(s.files) ? s.files as string[] : [],\n api_usage: Array.isArray(s.api_usage) ? s.api_usage as string[] : [],\n keywords: Array.isArray(s.keywords) ? s.keywords as string[] : [],\n completion_level: (String(s.completion_level || 'mvp') as 'base' | 'mvp' | 'extend' | 'polish'),\n platform: String(s.platform || feature.platform || 'app'),\n intent: String(s.intent || ''),\n outcome: s.outcome as Step['outcome'],\n acceptance: Array.isArray(s.acceptance) ? s.acceptance as string[] : [],\n effort: s.effort as Step['effort'],\n requirement_ids: [],\n concept_codes: [],\n }));\n}\n\n/**\n * Extract steps for MULTIPLE features in a single LLM call.\n */\nexport async function extractFeatureStepsBatched(\n goal: string,\n techStack: string,\n sdkApiIndex: { sdk_apis: Array<{ name: string; kind: string; used_in_demo: boolean }> },\n fileContentsMap: Map<string, string>,\n featuresMeta: Feature[],\n llmConfig?: LlmClientConfig,\n): Promise<Map<string, Step[]>> {\n const client = createLlmClient(llmConfig);\n\n const usedSdkApis = sdkApiIndex.sdk_apis\n .filter(api => api.used_in_demo)\n .map(api => api.name)\n .slice(0, 2000);\n\n const sourceText = buildSourceText(fileContentsMap);\n\n const featuresListing = featuresMeta.map(f =>\n `- ${f.id || 'F?'}: ${f.name || ''} — ${f.description || ''}`,\n ).join('\\n');\n\n const systemPrompt = (\n 'You are a software architect. Split MULTIPLE features into ACTION steps. '\n + 'Each step must carry files[], api_usage[], keywords[], and '\n + 'completion_level ∈ {base, mvp, extend, polish}. '\n + 'Include metadata: intent, outcome ({user_visible, technical}), '\n + 'acceptance[] (2 verifiable criteria), effort ({estimated_minutes, complexity}). '\n + 'description: ONE concise sentence, MAX 140 characters. '\n + 'NEVER invent files/APIs. Return ONLY the JSON. '\n + 'ALL text must be in ENGLISH.'\n );\n\n const userPrompt = `App goal: ${goal}\nTech stack: ${techStack}\n\nSDK API list (used_in_demo):\n${JSON.stringify(usedSdkApis)}\n\nSource code:\n${sourceText}\n\nFEATURES to split into steps:\n${featuresListing}\n\nFor EACH feature above, produce 4-6 action steps. Each step must include:\nid, sequence, name, description, files, api_usage, keywords, completion_level, platform,\nintent, outcome ({user_visible, technical}), acceptance[] (2 criteria), effort ({estimated_minutes, complexity}).\n\nReturn JSON with a \"steps\" dict keyed by feature_id:\n{\n \"steps\": {\n \"<feature_id>\": [\n {\n \"id\": \"<feature_id>-S1\",\n \"sequence\": 1,\n \"name\": \"Step name\",\n \"description\": \"Concise sentence (max 140 chars)\",\n \"files\": [\"path/to/file\"],\n \"api_usage\": [\"APIName\"],\n \"keywords\": [\"keyword\"],\n \"completion_level\": \"mvp\",\n \"platform\": \"app\",\n \"intent\": \"Step intent\",\n \"outcome\": {\"user_visible\": \"User visible result\", \"technical\": \"Technical result\"},\n \"acceptance\": [\"Criterion 1\", \"Criterion 2\"],\n \"effort\": {\"estimated_minutes\": 30, \"complexity\": \"medium\"}\n }\n ]\n }\n}`;\n\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: parseInt(process.env.PG_C2_MAX_TOKENS || '32768', 10),\n });\n\n const stepsDict = result.steps as Record<string, Record<string, unknown>[]> | undefined;\n const output = new Map<string, Step[]>();\n\n if (stepsDict && typeof stepsDict === 'object') {\n for (const [fid, rawSteps] of Object.entries(stepsDict)) {\n if (!Array.isArray(rawSteps)) continue;\n const featMeta = featuresMeta.find(f => f.id === fid);\n const steps = rawSteps.map((s, i) => ({\n id: `${fid}-S${i + 1}`,\n sequence: i + 1,\n name: String(s.name || `Step ${i + 1}`),\n description: String(s.description || ''),\n files: Array.isArray(s.files) ? s.files as string[] : [],\n api_usage: Array.isArray(s.api_usage) ? s.api_usage as string[] : [],\n keywords: Array.isArray(s.keywords) ? s.keywords as string[] : [],\n completion_level: (String(s.completion_level || 'mvp') as 'base' | 'mvp' | 'extend' | 'polish'),\n platform: String(s.platform || featMeta?.platform || 'app'),\n intent: String(s.intent || ''),\n outcome: s.outcome as Step['outcome'],\n acceptance: Array.isArray(s.acceptance) ? s.acceptance as string[] : [],\n effort: s.effort as Step['effort'],\n requirement_ids: [],\n concept_codes: [],\n }));\n output.set(fid, steps);\n }\n }\n\n return output;\n}\n","/**\n * STEP D: Ground-truth verification of project graph against code and SDK API index.\n *\n * Ported from knowledge-tree/llm_project_graph.py verify_project_graph()\n * Removes invalid files, APIs, keywords and logs hallucinations.\n */\n\nimport type { ProjectGraph, Feature, Step } from '../schemas/projectGraphSchema';\n\nexport interface Hallucination {\n type: string;\n item: string;\n feature_id: string;\n step_id: string;\n reason: string;\n}\n\nexport interface VerifyOptions {\n repoDir: string;\n sdkApiIndex: { sdk_apis: Array<{ name: string; kind: string; used_in_demo: boolean }> };\n fileContentsMap: Map<string, string>;\n}\n\n/**\n * Verify project graph against actual code. Remove hallucinated files, APIs, keywords.\n * F0 (foundation) keywords are kept as-is since they are pedagogical terms.\n */\nexport function verifyProjectGraph(\n projectGraph: ProjectGraph,\n options: VerifyOptions,\n): { graph: ProjectGraph; hallucinations: Hallucination[] } {\n const { sdkApiIndex, fileContentsMap } = options;\n const sdkApiNames = new Set(sdkApiIndex.sdk_apis.map(api => api.name));\n const hallucinations: Hallucination[] = [];\n\n const features = projectGraph.features || [];\n\n for (const feature of features) {\n const fid = feature.id || 'F_UNK';\n const isFoundation = fid === 'F0';\n\n for (const step of feature.steps || []) {\n const sid = step.id || `${fid}-SUNK`;\n\n // Verify files[]\n const validFiles: string[] = [];\n for (const f of step.files || []) {\n if (fileContentsMap.has(f)) {\n validFiles.push(f);\n } else {\n hallucinations.push({\n type: 'file',\n item: f,\n feature_id: fid,\n step_id: sid,\n reason: `File '${f}' not found in repository`,\n });\n }\n }\n step.files = validFiles;\n\n // Verify api_usage[]\n const validApis: string[] = [];\n for (const api of step.api_usage || []) {\n if (sdkApiNames.size === 0 || sdkApiNames.has(api)) {\n validApis.push(api);\n } else {\n hallucinations.push({\n type: 'api',\n item: api,\n feature_id: fid,\n step_id: sid,\n reason: `API '${api}' not found in SDK API index`,\n });\n }\n }\n step.api_usage = validApis;\n\n // Verify keywords[] — skip for F0 (foundation keywords are pedagogical)\n if (isFoundation) continue;\n\n const validKws: string[] = [];\n for (const kw of step.keywords || []) {\n const kwLow = kw.toLowerCase();\n // Single-word keywords: use word boundary match to avoid\n // false positives (\"app\" should NOT match \"mapping\" or \"happen\")\n const isSingleWord = !kwLow.includes(' ');\n let found = false;\n // Check in step's files\n for (const f of validFiles) {\n const content = (fileContentsMap.get(f) || '').toLowerCase();\n if (isSingleWord) {\n found = new RegExp(`\\\\b${kwLow.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`).test(content);\n } else {\n found = content.includes(kwLow);\n }\n if (found) break;\n }\n // Check in any file\n if (!found) {\n for (const content of fileContentsMap.values()) {\n const lc = content.toLowerCase();\n if (isSingleWord) {\n found = new RegExp(`\\\\b${kwLow.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`).test(lc);\n } else {\n found = lc.includes(kwLow);\n }\n if (found) break;\n }\n }\n\n if (found) {\n validKws.push(kw);\n } else {\n hallucinations.push({\n type: 'keyword',\n item: kw,\n feature_id: fid,\n step_id: sid,\n reason: `Keyword '${kw}' not found in target files`,\n });\n }\n }\n step.keywords = validKws;\n }\n }\n\n return { graph: projectGraph, hallucinations };\n}\n","/**\n * STEP E: Escalate keywords/api_usage to neutral concepts + ULO/CIO/SIO depth + evidence files join.\n *\n * Ported from knowledge-tree/llm_project_graph.py escalate_and_map_concepts()\n * Maps concrete keywords to technology-neutral concept codes WITH depth levels.\n *\n * ULO/CIO/SIO model:\n * - ULO: WHAT + WHY — concept is introduced (what it is, why it exists)\n * - CIO: HOW — mechanism is explained (how it works)\n * - SIO: IMPLEMENTATION — concrete tech-specific usage (syntax, API)\n */\n\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\nimport type { ProjectGraph, Feature } from '../schemas/projectGraphSchema';\n\nexport interface ConceptMapping {\n concept_code: string;\n concept_name: string;\n keyword: string;\n depth: 'ulo' | 'cio' | 'sio';\n depth_rationale: string;\n evidence_files: string[];\n}\n\nexport interface EscalateOptions {\n projectGraph: ProjectGraph;\n fileContentsMap: Map<string, string>;\n availableConcepts?: string[];\n conceptMapOverride?: Record<string, { concept_code: string; concept_name: string; depth?: string }>;\n llmConfig?: LlmClientConfig;\n}\n\nfunction toUpperSnake(term: string): string {\n let s = term.replace(/^[^\\w]+/, '');\n s = s.replace(/([a-z0-9])([A-Z])/g, '$1_$2');\n s = s.replace(/[^\\w]+/g, '_');\n const res = s.toUpperCase().replace(/^_+|_+$/g, '');\n return res || 'CONCEPT';\n}\n\nfunction extractTermSnippets(term: string, fileContentsMap: Map<string, string>, maxSnippets = 1): string[] {\n const snippets: string[] = [];\n const termLow = term.toLowerCase();\n for (const [relPath, content] of fileContentsMap) {\n const lines = content.split('\\n');\n for (let idx = 0; idx < lines.length; idx++) {\n if (lines[idx].toLowerCase().includes(termLow)) {\n const start = Math.max(0, idx - 1);\n const end = Math.min(lines.length, idx + 2);\n let snippet = lines.slice(start, end).map(l => l.trim()).filter(Boolean).join(' ');\n if (snippet.length > 120) snippet = snippet.slice(0, 120) + '...';\n if (snippet) snippets.push(`[${relPath}]: ${snippet}`);\n if (snippets.length >= maxSnippets) break;\n }\n }\n if (snippets.length >= maxSnippets) break;\n }\n return snippets;\n}\n\n/**\n * Determine ULO/CIO/SIO depth based on keyword usage context.\n */\nfunction inferDepthFromContext(\n keyword: string,\n fileContentsMap: Map<string, string>,\n): { depth: 'ulo' | 'cio' | 'sio'; rationale: string } {\n const kw = keyword.toLowerCase();\n\n // SIO: specific implementation keywords (API names, decorators, syntax)\n const sioPatterns = [\n /^@/, // SwiftUI decorators: @State, @Binding\n /^import\\s/, // Import statements\n /\\(\\)$/, // Function calls\n /\\.prototype/, // Prototype methods\n /^new\\s/, // Constructor calls\n /^async\\s/, // Async keywords\n /^await\\s/,\n ];\n\n if (sioPatterns.some(p => p.test(keyword))) {\n return { depth: 'sio', rationale: `Keyword '${keyword}' is a specific API/syntax pattern` };\n }\n\n // CIO: mechanism-level keywords (patterns, protocols, design patterns)\n const cioPatterns = [\n /pattern/i, /protocol/i, /architecture/i, /lifecycle/i,\n /observer/i, /singleton/i, /factory/i, /delegate/i,\n /state\\s*management/i, /data\\s*flow/i, /binding/i,\n /mvvm/i, /mvc/i, /flux/i, /redux/i,\n /authentication/i, /authorization/i,\n /persistence/i, /caching/i, /serialization/i,\n ];\n\n if (cioPatterns.some(p => p.test(keyword))) {\n return { depth: 'cio', rationale: `Keyword '${keyword}' represents a mechanism/pattern` };\n }\n\n // ULO: general concept keywords (what/why level)\n const uloPatterns = [\n /design\\s*thinking/i, /user\\s*needs/i, /problem\\s*statement/i,\n /foundation/i, /setup/i, /overview/i, /introduction/i,\n /scaffold/i, /hello\\s*world/i, /getting\\s*started/i,\n ];\n\n if (uloPatterns.some(p => p.test(keyword))) {\n return { depth: 'ulo', rationale: `Keyword '${keyword}' is a foundational/introductory concept` };\n }\n\n // Default: check evidence in code — if it appears in import/declaration → SIO, in comment → ULO\n for (const content of fileContentsMap.values()) {\n const lines = content.split('\\n');\n for (const line of lines) {\n if (line.toLowerCase().includes(kw)) {\n if (/^(import|from|require|use |#include)/.test(line.trim())) {\n return { depth: 'sio', rationale: `Keyword '${keyword}' found in import statement` };\n }\n if (/^\\/\\/|^\\/\\*|^#|^-->/.test(line.trim())) {\n return { depth: 'ulo', rationale: `Keyword '${keyword}' found in comment/doc` };\n }\n // Found in code body → likely SIO\n return { depth: 'sio', rationale: `Keyword '${keyword}' used in implementation code` };\n }\n }\n }\n\n return { depth: 'sio', rationale: `Default: treating '${keyword}' as SIO (implementation-level)` };\n}\n\n/**\n * Escalate keywords/api_usage to neutral concepts with ULO/CIO/SIO depth and join evidence files.\n */\nexport async function escalateAndMapConcepts(\n options: EscalateOptions,\n): Promise<Map<string, ConceptMapping[]>> {\n const { projectGraph, fileContentsMap, availableConcepts, conceptMapOverride, llmConfig } = options;\n\n const features = projectGraph.features || [];\n\n // Collect all terms from all features\n const allTerms = new Set<string>();\n for (const feature of features) {\n for (const step of feature.steps || []) {\n for (const api of step.api_usage || []) allTerms.add(api);\n for (const kw of step.keywords || []) allTerms.add(kw);\n }\n }\n\n if (allTerms.size === 0) return new Map();\n\n const termList = Array.from(allTerms).sort();\n let llmResults: Record<string, { concept_code?: string; concept_name?: string; depth?: string }> = {};\n\n if (conceptMapOverride) {\n llmResults = conceptMapOverride;\n } else {\n try {\n const client = createLlmClient(llmConfig);\n const conceptBank = (availableConcepts || []).sort().join(', ') || '(empty)';\n\n const termEntries = termList.map(term => {\n const snippets = extractTermSnippets(term, fileContentsMap);\n return snippets.length > 0\n ? `- ${term} (Usage context: ${snippets[0]})`\n : `- ${term}`;\n });\n\n const systemPrompt = (\n 'You are a knowledge classification expert. For each concrete keyword/API, determine:\\n'\n + '1. The neutral concept it belongs to (UPPER_SNAKE_CASE)\\n'\n + '2. The depth level: ulo | cio | sio\\n\\n'\n + 'DEPTH DEFINITIONS:\\n'\n + '- ulo (WHAT + WHY): The keyword introduces a concept — \"what is it, why does it exist\"\\n'\n + ' Example: In a scaffold step, \"@State is SwiftUI\\'s way of managing local view state\"\\n'\n + '- cio (HOW): The keyword demonstrates a mechanism — \"how it works\"\\n'\n + ' Example: \"@State triggers view re-render when value changes — mechanism is value-type observation\"\\n'\n + '- sio (IMPLEMENTATION): The keyword is a concrete API/syntax used in code\\n'\n + ' Example: \"Using @State var isActive: Bool = false in ContentView\"\\n\\n'\n + 'RULES:\\n'\n + '1. PREFER an EXISTING concept from the CONCEPT_BANK below if the keyword is a manifestation of that concept.\\n'\n + '2. ONLY create a NEW concept (UPPER_SNAKE_CASE, NOT ending in _CONCEPT, NOT containing a specific technology name) when NO concept in the bank covers it.\\n'\n + `3. CONCEPT_BANK: ${conceptBank.slice(0, 12000)}\\n`\n + '4. Depth is per-keyword-in-context, NOT per-concept. The same concept can have ULO at one step and SIO at another.\\n'\n + 'Return JSON: {\"results\": {\"<keyword>\": {\"concept_code\": \"...\", \"concept_name\": \"...\", \"depth\": \"ulo|cio|sio\"}}}'\n );\n\n const userPrompt = (\n 'Classify the following keyword/API list into neutral concepts WITH depth levels.\\n'\n + 'Code usage context is provided to disambiguate depth:\\n'\n + termEntries.join('\\n')\n + '\\n\\nReturn JSON: {\"results\": {\"<keyword>\": {\"concept_code\": \"...\", \"concept_name\": \"...\", \"depth\": \"ulo|cio|sio\"}}}'\n );\n\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: 16384,\n });\n\n llmResults = (result.results || {}) as Record<string, { concept_code?: string; concept_name?: string; depth?: string }>;\n } catch (err) {\n console.warn(`[WARN] Concept escalation LLM failed (${err}), using fallback depth inference`);\n }\n }\n\n // Join results into feature_concepts\n const featureConcepts = new Map<string, ConceptMapping[]>();\n\n for (const feature of features) {\n const fid = feature.id || 'F_UNK';\n const featureFiles = new Set<string>();\n for (const step of feature.steps || []) {\n for (const f of step.files || []) featureFiles.add(f);\n }\n\n const fTerms = [\n ...(feature.api_usage || []),\n ...(feature.steps || []).flatMap(s => [...(s.api_usage || []), ...(s.keywords || [])]),\n ];\n\n const items: ConceptMapping[] = [];\n const seen = new Set<string>();\n\n for (const kw of fTerms) {\n const info = llmResults[kw] || {};\n const cCode = info.concept_code || toUpperSnake(kw);\n const cName = info.concept_name || kw;\n\n // Determine depth: LLM result > fallback inference\n let depth: 'ulo' | 'cio' | 'sio' = 'sio';\n let depthRationale = 'Default: SIO';\n\n if (info.depth && ['ulo', 'cio', 'sio'].includes(info.depth)) {\n depth = info.depth as 'ulo' | 'cio' | 'sio';\n depthRationale = `LLM classified as ${depth}`;\n } else {\n const inferred = inferDepthFromContext(kw, fileContentsMap);\n depth = inferred.depth;\n depthRationale = inferred.rationale;\n }\n\n // Allow multiple keywords per concept — don't dedup by concept_code\n const kwKey = `${cCode}::${kw}`;\n if (seen.has(kwKey)) continue;\n seen.add(kwKey);\n\n // Evidence: files that actually contain this term\n const evidenceFiles: string[] = [];\n for (const f of featureFiles) {\n const content = fileContentsMap.get(f) || '';\n if (content.toLowerCase().includes(kw.toLowerCase())) {\n evidenceFiles.push(f);\n }\n }\n\n items.push({\n concept_code: cCode,\n concept_name: cName,\n keyword: kw,\n depth,\n depth_rationale: depthRationale,\n evidence_files: evidenceFiles,\n });\n }\n\n featureConcepts.set(fid, items);\n }\n\n return featureConcepts;\n}\n","/**\n * Concept resolution — maps keywords to Master Tree concepts.\n *\n * Ported from knowledge-tree/resolve_concepts.py\n * Uses ULO/CIO/SIO-aware matching:\n * - SIO keywords → match against concept.keywords (tech-specific)\n * - CIO keywords → match against concept.description (mechanism)\n * - ULO keywords → match against concept.ulo (what/why, tech-independent)\n *\n * Fallback: keyword overlap matching when embeddings unavailable.\n *\n * NOTE: This module requires sentence-transformers Python package for embeddings.\n * In pure TypeScript mode, it falls back to keyword overlap matching.\n */\n\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\nimport type { Keyword } from '../extractors/keywordExtractor';\n\nexport interface ResolvedConcept {\n keyword: string;\n source: string;\n depth: 'ulo' | 'cio' | 'sio';\n concept_codes: string[];\n matches: ConceptMatch[];\n override?: boolean;\n rechecked?: boolean;\n}\n\nexport interface ConceptMatch {\n code: string;\n name: string;\n description: string;\n keywords: string;\n ulo?: string;\n cio?: string;\n score: number;\n matched_level: 'ulo' | 'cio' | 'sio';\n method: 'embedding' | 'keyword_overlap';\n}\n\nexport interface ProposedConcept {\n keyword: string;\n source: string;\n depth: 'ulo' | 'cio' | 'sio';\n reason: string;\n best_match?: ConceptMatch;\n}\n\nexport interface ResolveConceptsResult {\n resolved: ResolvedConcept[];\n proposed: ProposedConcept[];\n summary: {\n total_keywords: number;\n resolved_count: number;\n proposed_count: number;\n search_mode: string;\n };\n}\n\nexport interface ResolveConceptsOptions {\n keywords: Keyword[];\n goal: string;\n embeddings?: Record<string, { embedding?: number[]; name?: string; description?: string; keywords?: string; ulo?: string; cio?: string }>;\n /** Pre-computed depth from conceptEscalator — overrides inferDepthFromSource */\n depthOverrides?: Map<string, 'ulo' | 'cio' | 'sio'>;\n topK?: number;\n threshold?: number;\n llmConfig?: LlmClientConfig;\n}\n\n// Source-based thresholds\nconst SOURCE_THRESHOLDS: Record<string, number> = {\n docstring: 0.45,\n readme_description: 0.45,\n readme: 0.50,\n type_declaration: 0.55,\n function_signature: 0.55,\n import: 0.60,\n property_wrapper: 0.55,\n error_handling: 0.60,\n config: 0.60,\n framework_usage: 0.45,\n};\n\nconst DEFAULT_THRESHOLD = 0.55;\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n if (!a.length || !b.length || a.length !== b.length) return 0;\n let dot = 0, normA = 0, normB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n if (normA === 0 || normB === 0) return 0;\n return dot / (Math.sqrt(normA) * Math.sqrt(normB));\n}\n\n/**\n * ULO/CIO/SIO-aware keyword overlap scoring.\n * Matches against different concept fields based on depth level.\n */\nfunction uloCioAwareScore(\n query: string,\n depth: 'ulo' | 'cio' | 'sio',\n conceptData: { keywords?: string; description?: string; ulo?: string; cio?: string },\n): number {\n const queryTerms = new Set(query.toLowerCase().split(/\\s+/));\n\n // Choose which fields to match based on depth\n let targetText = '';\n if (depth === 'sio') {\n // SIO: match against keywords (tech-specific terms)\n targetText = conceptData.keywords || '';\n } else if (depth === 'cio') {\n // CIO: match against description + cio (mechanism)\n targetText = [conceptData.description || '', conceptData.cio || ''].join(' ');\n } else {\n // ULO: match against ulo + description (what/why, tech-independent)\n targetText = [conceptData.ulo || '', conceptData.description || ''].join(' ');\n }\n\n const targetTerms = new Set(targetText.toLowerCase().split(/\\s+/));\n if (!queryTerms.size || !targetTerms.size) return 0;\n\n let overlap = 0;\n for (const t of queryTerms) {\n if (targetTerms.has(t)) overlap++;\n }\n return Math.min(overlap / queryTerms.size, 1.0);\n}\n\n\nfunction inferFieldsFromGoal(goal: string): string[] {\n const goalLower = goal.toLowerCase();\n const fieldKeywords: Record<string, string[]> = {\n ASE: ['algorithm', 'software', 'programming', 'code', 'develop', 'build', 'app'],\n DAI: ['data', 'database', 'storage', 'query', 'sql', 'analytics'],\n CSN: ['network', 'protocol', 'server', 'client', 'api', 'http'],\n HCI: ['user', 'interface', 'ui', 'ux', 'interaction', 'design'],\n MOB: ['mobile', 'ios', 'android', 'swift', 'kotlin', 'flutter'],\n WEB: ['web', 'html', 'css', 'javascript', 'react', 'vue'],\n };\n\n const matched: string[] = [];\n for (const [code, keywords] of Object.entries(fieldKeywords)) {\n if (keywords.some(kw => goalLower.includes(kw))) matched.push(code);\n }\n return matched.length > 0 ? matched : ['ASE'];\n}\n\n/**\n * Infer depth from keyword source and context.\n */\nfunction inferDepthFromSource(source: string): 'ulo' | 'cio' | 'sio' {\n const uloSources = ['docstring', 'readme', 'readme_description', 'framework_usage'];\n const cioSources = ['type_declaration', 'function_signature', 'config'];\n\n if (uloSources.includes(source)) return 'ulo';\n if (cioSources.includes(source)) return 'cio';\n return 'sio';\n}\n\n/**\n * Resolve keywords to concepts using ULO/CIO/SIO-aware matching.\n */\nexport async function resolveConcepts(\n options: ResolveConceptsOptions,\n): Promise<ResolveConceptsResult> {\n const { keywords, goal, embeddings, depthOverrides, topK = 3, threshold = DEFAULT_THRESHOLD, llmConfig } = options;\n\n const relevantFields = inferFieldsFromGoal(goal);\n const resolved: ResolvedConcept[] = [];\n const proposed: ProposedConcept[] = [];\n const hasEmbeddings = Object.keys(embeddings || {}).length > 0 &&\n Object.values(embeddings || {}).some(d => d.embedding && d.embedding.length > 0);\n let search_mode = hasEmbeddings ? 'embedding' : 'keyword_overlap';\n\n const concepts = embeddings || {};\n\n for (const kwData of keywords) {\n const keyword = kwData.keyword;\n const source = kwData.source;\n // Use escalator's depth override if available, else infer from source\n const depth = depthOverrides?.get(keyword) || inferDepthFromSource(source);\n\n // Search concepts via ULO/CIO/SIO-aware matching\n const scored: ConceptMatch[] = [];\n for (const [code, data] of Object.entries(concepts)) {\n const conceptKeywords = data.keywords || '';\n const conceptDesc = data.description || '';\n const conceptUlo = (data as Record<string, unknown>).ulo as string | undefined;\n const conceptCio = (data as Record<string, unknown>).cio as string | undefined;\n\n // Primary: ULO/CIO-aware score based on depth level\n const awareScore = uloCioAwareScore(keyword, depth, {\n keywords: conceptKeywords,\n description: conceptDesc,\n ulo: conceptUlo,\n cio: conceptCio,\n });\n\n // Fallback: broad keyword overlap across all fields\n const queryTerms = new Set(keyword.toLowerCase().split(/\\s+/));\n const allTerms = new Set([\n ...conceptKeywords.toLowerCase().split(/\\s+/),\n ...conceptDesc.toLowerCase().split(/\\s+/),\n ...(conceptUlo || '').toLowerCase().split(/\\s+/),\n ...(conceptCio || '').toLowerCase().split(/\\s+/),\n ].filter(Boolean));\n let overlapCount = 0;\n for (const t of queryTerms) { if (allTerms.has(t)) overlapCount++; }\n const fallbackScore = queryTerms.size > 0 ? Math.min(overlapCount / queryTerms.size, 1.0) : 0;\n\n // Use the higher score, but track which method won\n const usedAware = awareScore >= fallbackScore;\n const finalScore = usedAware ? awareScore : fallbackScore;\n\n if (finalScore > 0) {\n scored.push({\n code,\n name: data.name || code,\n description: conceptDesc,\n keywords: conceptKeywords,\n ulo: conceptUlo,\n cio: conceptCio,\n score: finalScore,\n matched_level: usedAware ? depth : 'sio',\n method: hasEmbeddings && data.embedding && data.embedding.length > 0 ? 'embedding' : 'keyword_overlap',\n });\n }\n }\n\n scored.sort((a, b) => b.score - a.score);\n const topMatches = scored.slice(0, topK);\n\n if (topMatches.length === 0) {\n proposed.push({\n keyword,\n source,\n depth,\n reason: 'No matches in Master Tree',\n });\n continue;\n }\n\n const effThreshold = SOURCE_THRESHOLDS[source] || threshold;\n const topMatch = topMatches[0];\n\n if (topMatch.score >= effThreshold) {\n resolved.push({\n keyword,\n source,\n depth,\n concept_codes: topMatches.filter(m => m.score >= effThreshold).map(m => m.code),\n matches: topMatches,\n });\n } else {\n proposed.push({\n keyword,\n source,\n depth,\n best_match: topMatch,\n reason: `Low confidence (${topMatch.score.toFixed(2)} < ${effThreshold})`,\n });\n }\n }\n\n return {\n resolved,\n proposed,\n summary: {\n total_keywords: keywords.length,\n resolved_count: resolved.length,\n proposed_count: proposed.length,\n search_mode,\n },\n };\n}\n","/**\n * Roadmap assembly — assembles final roadmap with keyword tracking and time awareness.\n *\n * Ported from knowledge-tree/assemble_roadmap.py\n * Handles: topo sort, phases, keyword-per-milestone tracking.\n *\n * Improvements:\n * - Time budget per session/lesson\n * - Overhead factor (setup, transitions, review)\n * - Smart feature → milestone splitting (respect time constraints)\n * - Phase grouping based on concept progression\n */\n\nimport type { ProjectGraph, Feature, Step } from '../schemas/projectGraphSchema';\nimport type { ConceptMapping } from '../graph/conceptEscalator';\n\nexport interface AssembledMilestone {\n id: string;\n name: string;\n description: string;\n feature_id: string;\n feature_name: string;\n concept_code: string;\n depth: 'ulo' | 'cio' | 'sio';\n all_keywords: string[];\n new_keywords: string[];\n prerequisite_keywords: string[];\n steps: Step[];\n estimated_minutes: number;\n adjusted_minutes: number; // with overhead\n completion_level: string;\n}\n\nexport interface AssembledPhase {\n phase_id: number;\n phase_name: string;\n milestones: AssembledMilestone[];\n total_minutes: number;\n concept_progression: string; // e.g., \"ULO → CIO → SIO\"\n}\n\nexport interface AssembledRoadmap {\n project: ProjectGraph['project'];\n product: ProjectGraph['product'];\n phases: AssembledPhase[];\n feature_concepts: Map<string, ConceptMapping[]>;\n time_budget: {\n session_minutes: number;\n overhead_factor: number;\n total_estimated_minutes: number;\n total_adjusted_minutes: number;\n };\n}\n\nexport interface AssembleOptions {\n projectGraph: ProjectGraph;\n featureConcepts?: Map<string, ConceptMapping[]>;\n sessionMinutes?: number; // Target minutes per session/lesson (default: 90)\n overheadFactor?: number; // Overhead multiplier (default: 1.15 = 15% overhead)\n maxMilestoneMinutes?: number; // Max minutes before splitting a milestone (default: 120)\n}\n\n// ─── Overhead Calculation ────────────────────────────────────────────────────\n\n/**\n * Calculate overhead-adjusted minutes for a milestone.\n * Overhead includes: setup time, transitions, review, Q&A.\n */\nfunction calculateOverhead(\n rawMinutes: number,\n overheadFactor: number,\n): number {\n return Math.ceil(rawMinutes * overheadFactor);\n}\n\n// ─── Milestone Splitting ─────────────────────────────────────────────────────\n\n/**\n * Split a feature's steps into multiple milestones if they exceed maxMilestoneMinutes.\n * Splits at natural break points (between steps of different complexity).\n */\nfunction splitFeatureIntoMilestones(\n feature: Feature,\n featureConcepts: ConceptMapping[],\n maxMinutes: number,\n overheadFactor: number,\n): AssembledMilestone[] {\n const steps = feature.steps || [];\n if (steps.length === 0) return [];\n\n const featureId = feature.id || 'F_UNK';\n\n // Calculate raw minutes per step\n const stepMinutes = steps.map(s => s.effort?.estimated_minutes || 15);\n const totalRawMinutes = stepMinutes.reduce((a, b) => a + b, 0);\n\n // If within budget, return as single milestone\n if (calculateOverhead(totalRawMinutes, overheadFactor) <= maxMinutes) {\n return [buildMilestone(feature, featureConcepts, steps, stepMinutes, featureId, 1)];\n }\n\n // Split into multiple milestones\n const milestones: AssembledMilestone[] = [];\n let currentSteps: Step[] = [];\n let currentMinutes: number[] = [];\n let milestoneIndex = 1;\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n const mins = stepMinutes[i];\n\n // Check if adding this step would exceed budget\n const currentTotal = currentMinutes.reduce((a, b) => a + b, 0);\n if (calculateOverhead(currentTotal + mins, overheadFactor) > maxMinutes && currentSteps.length > 0) {\n // Split here\n milestones.push(buildMilestone(\n feature, featureConcepts, currentSteps, currentMinutes,\n featureId, milestoneIndex,\n ));\n milestoneIndex++;\n currentSteps = [];\n currentMinutes = [];\n }\n\n currentSteps.push(step);\n currentMinutes.push(mins);\n }\n\n // Don't forget the last group\n if (currentSteps.length > 0) {\n milestones.push(buildMilestone(\n feature, featureConcepts, currentSteps, currentMinutes,\n featureId, milestoneIndex,\n ));\n }\n\n return milestones;\n}\n\n/**\n * Build a single AssembledMilestone from steps.\n * Concept codes are mapped per-step, not per-feature.\n */\nfunction buildMilestone(\n feature: Feature,\n featureConcepts: ConceptMapping[],\n steps: Step[],\n stepMinutes: number[],\n featureId: string,\n milestoneIndex: number,\n): AssembledMilestone {\n const rawMinutes = stepMinutes.reduce((a, b) => a + b, 0);\n const levels = steps.map(s => s.completion_level || 'mvp');\n const completionLevel = levels.includes('extend') ? 'extend'\n : levels.includes('mvp') ? 'mvp'\n : 'base';\n\n // Collect concept codes PER STEP (not per feature)\n const milestoneConcepts = new Set<string>();\n const milestoneKeywords = new Set<string>();\n for (const step of steps) {\n // Use step-level concept_codes if propagated, else match by keyword\n const stepConceptCodes = step.concept_codes || [];\n for (const code of stepConceptCodes) {\n milestoneConcepts.add(code);\n }\n // Also match by keyword presence\n const stepKws = [...(step.keywords || []), ...(step.api_usage || [])];\n for (const cm of featureConcepts) {\n if (stepKws.includes(cm.keyword)) {\n milestoneConcepts.add(cm.concept_code);\n milestoneKeywords.add(cm.keyword);\n }\n }\n }\n\n // Determine dominant depth from step-level concept mappings\n const depthCounts = { ulo: 0, cio: 0, sio: 0 };\n for (const cm of featureConcepts) {\n if (milestoneKeywords.has(cm.keyword)) {\n depthCounts[cm.depth]++;\n }\n }\n const dominantDepth: 'ulo' | 'cio' | 'sio' =\n depthCounts.sio >= depthCounts.cio && depthCounts.sio >= depthCounts.ulo ? 'sio'\n : depthCounts.cio >= depthCounts.ulo ? 'cio'\n : 'ulo';\n\n return {\n id: milestoneIndex === 1 ? featureId : `${featureId}-M${milestoneIndex}`,\n name: milestoneIndex === 1 ? (feature.name || featureId) : `${feature.name || featureId} (Part ${milestoneIndex})`,\n description: feature.description || '',\n feature_id: featureId,\n feature_name: feature.name || '',\n concept_code: [...milestoneConcepts].join(', '),\n depth: dominantDepth,\n all_keywords: [],\n new_keywords: [],\n prerequisite_keywords: [],\n steps,\n estimated_minutes: rawMinutes,\n adjusted_minutes: rawMinutes, // placeholder — assembleRoadmap() applies actual overheadFactor\n completion_level: completionLevel,\n };\n}\n\n// ─── Keyword Tracking ────────────────────────────────────────────────────────\n\n/**\n * Build keyword map: concept_code → [keywords]\n */\nfunction buildKeywordMap(\n featureConcepts: Map<string, ConceptMapping[]>,\n): Map<string, string[]> {\n const map = new Map<string, string[]>();\n for (const mappings of featureConcepts.values()) {\n for (const m of mappings) {\n const existing = map.get(m.concept_code) || [];\n if (!existing.includes(m.keyword)) {\n existing.push(m.keyword);\n map.set(m.concept_code, existing);\n }\n }\n }\n return map;\n}\n\n/**\n * Attach keywords to milestones, computing new vs prerequisite.\n */\nfunction attachKeywordsToMilestones(\n milestones: AssembledMilestone[],\n keywordMap: Map<string, string[]>,\n): AssembledMilestone[] {\n const cumulativeKeywords = new Set<string>();\n\n for (const milestone of milestones) {\n // Aggregate keywords from concept codes\n const allKw = new Set<string>();\n const conceptCodes = milestone.concept_code.split(',').map((c: string) => c.trim()).filter(Boolean);\n for (const code of conceptCodes) {\n const kws = keywordMap.get(code) || [];\n for (const kw of kws) allKw.add(kw);\n }\n\n milestone.all_keywords = Array.from(allKw).sort();\n\n // Compute new vs prerequisite\n const newKw: string[] = [];\n const prereqKw: string[] = [];\n for (const kw of milestone.all_keywords) {\n if (cumulativeKeywords.has(kw)) {\n prereqKw.push(kw);\n } else {\n newKw.push(kw);\n cumulativeKeywords.add(kw);\n }\n }\n\n milestone.new_keywords = newKw;\n milestone.prerequisite_keywords = prereqKw;\n }\n\n return milestones;\n}\n\n// ─── Phase Grouping ──────────────────────────────────────────────────────────\n\n/**\n * Group milestones into phases based on time budget and concept progression.\n */\nfunction groupIntoPhases(\n milestones: AssembledMilestone[],\n sessionMinutes: number,\n): AssembledPhase[] {\n const phases: AssembledPhase[] = [];\n let currentMilestones: AssembledMilestone[] = [];\n let currentMinutes = 0;\n let phaseNum = 1;\n\n for (const milestone of milestones) {\n const milestoneMinutes = milestone.adjusted_minutes;\n\n // If adding this milestone would exceed session budget, start new phase\n if (currentMinutes + milestoneMinutes > sessionMinutes && currentMilestones.length > 0) {\n phases.push(buildPhase(currentMilestones, phaseNum));\n phaseNum++;\n currentMilestones = [];\n currentMinutes = 0;\n }\n\n currentMilestones.push(milestone);\n currentMinutes += milestoneMinutes;\n }\n\n // Don't forget the last phase\n if (currentMilestones.length > 0) {\n phases.push(buildPhase(currentMilestones, phaseNum));\n }\n\n return phases;\n}\n\nfunction buildPhase(milestones: AssembledMilestone[], phaseNum: number): AssembledPhase {\n const totalMinutes = milestones.reduce((sum, m) => sum + m.adjusted_minutes, 0);\n\n // Determine concept progression\n const depths = milestones.map(m => m.depth);\n const uniqueDepths = [...new Set(depths)];\n const progression = uniqueDepths.map(d => d.toUpperCase()).join(' → ');\n\n return {\n phase_id: phaseNum,\n phase_name: `Phase ${phaseNum}`,\n milestones,\n total_minutes: totalMinutes,\n concept_progression: progression,\n };\n}\n\n// ─── Main Assembly ───────────────────────────────────────────────────────────\n\n/**\n * Assemble project graph into a roadmap with phases and keyword tracking.\n */\nexport function assembleRoadmap(options: AssembleOptions): AssembledRoadmap {\n const {\n projectGraph,\n featureConcepts = new Map(),\n sessionMinutes = 90,\n overheadFactor = 1.15,\n maxMilestoneMinutes = 120,\n } = options;\n\n const features = projectGraph.features || [];\n const keywordMap = buildKeywordMap(featureConcepts);\n\n // Build milestones from features (with splitting)\n const allMilestones: AssembledMilestone[] = [];\n\n for (const feature of features) {\n const fid = feature.id || 'F_UNK';\n const fConcepts = featureConcepts.get(fid) || [];\n\n const milestones = splitFeatureIntoMilestones(\n feature,\n fConcepts,\n maxMilestoneMinutes,\n overheadFactor,\n );\n\n allMilestones.push(...milestones);\n }\n\n // Apply overhead factor\n for (const milestone of allMilestones) {\n milestone.adjusted_minutes = calculateOverhead(milestone.estimated_minutes, overheadFactor);\n }\n\n // Attach keywords (new vs prerequisite)\n attachKeywordsToMilestones(allMilestones, keywordMap);\n\n // Group into phases based on session time\n const phases = groupIntoPhases(allMilestones, sessionMinutes);\n\n // Calculate totals\n const totalEstimatedMinutes = allMilestones.reduce((sum, m) => sum + m.estimated_minutes, 0);\n const totalAdjustedMinutes = allMilestones.reduce((sum, m) => sum + m.adjusted_minutes, 0);\n\n return {\n project: projectGraph.project,\n product: projectGraph.product,\n phases,\n feature_concepts: featureConcepts,\n time_budget: {\n session_minutes: sessionMinutes,\n overhead_factor: overheadFactor,\n total_estimated_minutes: totalEstimatedMinutes,\n total_adjusted_minutes: totalAdjustedMinutes,\n },\n };\n}\n","/**\n * LLM-based File Selector — sends file tree to LLM, asks it to pick\n * which files are most relevant to the project goal.\n *\n * This mirrors knowledge-tree's approach:\n * 1. git_tracker generates project_structure.txt (file tree)\n * 2. Agent/LLM reads tree → selects important files\n * 3. Only selected files are read for analysis\n */\n\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\n\nexport interface FileSelectionResult {\n selected: string[];\n reasoning: string;\n}\n\n/**\n * Ask LLM to select which files from the file tree are relevant to the goal.\n * Input: file tree (names only, very small) + goal\n * Output: list of file paths to analyze\n */\nexport async function selectFilesWithLlm(\n filePaths: string[],\n goal: string,\n techStack: string,\n llmConfig?: LlmClientConfig,\n): Promise<FileSelectionResult> {\n // If very few files, no need to filter\n if (filePaths.length <= 15) {\n return { selected: filePaths, reasoning: 'Too few files to filter' };\n }\n\n const client = createLlmClient(llmConfig);\n\n // Build file tree for LLM (just names, grouped by directory)\n const treeLines = buildFileTree(filePaths);\n\n const systemPrompt = (\n 'You are a software architect analyzing a project repository.\\n'\n + 'Given a file tree and a project goal, select which files are MOST IMPORTANT '\n + 'to read for understanding the project architecture and implementation.\\n\\n'\n + 'RULES:\\n'\n + '1. Prioritize source code files (Swift, TS, Python, C++) over config/docs\\n'\n + '2. Include entry points (App.swift, main.py, index.ts)\\n'\n + '3. Include core domain files (models, services, views, controllers)\\n'\n + '4. EXCLUDE test files, mock files, generated files\\n'\n + '5. EXCLUDE config files (package.json, Podfile, etc.) unless they reveal architecture\\n'\n + '6. Include files that directly implement the features mentioned in the goal\\n'\n + '7. Return 20-40 files maximum (fewer is better if the project is small)\\n\\n'\n + 'Return JSON: {\"selected\": [\"path/to/file1\", \"path/to/file2\"], \"reasoning\": \"brief explanation\"}'\n );\n\n const userPrompt = (\n `Project goal: ${goal}\\n`\n + `Tech stack: ${techStack}\\n\\n`\n + `FILE TREE (${filePaths.length} files):\\n${treeLines}\\n\\n`\n + 'Select the most important files to analyze. Return JSON.'\n );\n\n try {\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: 4096,\n });\n\n const selected = Array.isArray(result.selected) ? result.selected as string[] : [];\n const reasoning = String(result.reasoning || '');\n\n // Validate: only keep files that exist in the original list\n const pathSet = new Set(filePaths);\n const validSelected = selected.filter(p => pathSet.has(p));\n\n if (validSelected.length === 0) {\n // LLM returned nothing valid — fallback to all files\n return { selected: filePaths, reasoning: 'LLM selection empty, using all files' };\n }\n\n return { selected: validSelected, reasoning };\n } catch (err) {\n console.warn(`[WARN] LLM file selection failed (${err}), using all files`);\n return { selected: filePaths, reasoning: `LLM failed: ${err}` };\n }\n}\n\n/**\n * Build a compact file tree string for LLM consumption.\n * Groups files by top-level directory, shows only filenames.\n */\nfunction buildFileTree(filePaths: string[]): string {\n const byDir = new Map<string, string[]>();\n\n for (const fp of filePaths) {\n const parts = fp.split('/');\n const dir = parts.length > 1 ? parts.slice(0, -1).join('/') : '(root)';\n const file = parts[parts.length - 1];\n if (!byDir.has(dir)) byDir.set(dir, []);\n byDir.get(dir)!.push(file);\n }\n\n const lines: string[] = [];\n for (const [dir, files] of byDir) {\n lines.push(`${dir}/`);\n for (const f of files.sort()) {\n lines.push(` ${f}`);\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * File I/O utilities for domain-kit pipeline.\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, statSync } from 'node:fs';\nimport { join, extname, relative, resolve } from 'node:path';\nimport { execSync } from 'node:child_process';\n\n/**\n * Read JSON file safely, returns null if not found or invalid.\n */\nexport function readJsonFile<T = unknown>(filePath: string): T | null {\n try {\n if (!existsSync(filePath)) return null;\n const content = readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Write JSON file, creating parent directories if needed.\n */\nexport function writeJsonFile(filePath: string, data: unknown): void {\n mkdirSync(join(filePath, '..'), { recursive: true });\n writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\n}\n\n/**\n * Read text file safely, returns null if not found.\n */\nexport function readTextFile(filePath: string): string | null {\n try {\n if (!existsSync(filePath)) return null;\n return readFileSync(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\n/**\n * Collect source files from a directory, filtering by allowed extensions.\n */\nexport function collectSourceFiles(\n dir: string,\n options?: {\n allowedExtensions?: string[];\n skipDirs?: string[];\n maxFiles?: number;\n },\n): string[] {\n const allowedExts = options?.allowedExtensions || ['.swift', '.ts', '.tsx', '.js', '.jsx', '.py', '.ino', '.cpp', '.c', '.h', '.hpp'];\n const maxFiles = options?.maxFiles || 70;\n\n // Try git ls-files first — respects .gitignore, handles submodules, symlinks\n const gitFiles = collectViaGit(dir, allowedExts, maxFiles);\n if (gitFiles.length > 0) return gitFiles;\n\n // Fallback: filesystem walk (non-git directories)\n return collectViaFilesystem(dir, allowedExts, maxFiles, options?.skipDirs);\n}\n\n/**\n * Collect source files using `git ls-files`.\n * Respects .gitignore, handles symlinks, much faster than walk.\n */\nfunction collectViaGit(dir: string, allowedExts: string[], maxFiles: number): string[] {\n try {\n const raw = execSync('git ls-files --cached --others --exclude-standard', {\n cwd: dir,\n encoding: 'utf-8',\n timeout: 5000,\n maxBuffer: 1024 * 1024,\n });\n const extSet = new Set(allowedExts.map(e => e.toLowerCase()));\n return raw\n .split('\\n')\n .filter(line => line.length > 0)\n .filter(line => extSet.has(extname(line).toLowerCase()))\n .slice(0, maxFiles)\n .map(rel => join(dir, rel));\n } catch {\n // Not a git repo or git not available — fall through to filesystem walk\n return [];\n }\n}\n\n/**\n * Collect source files using recursive directory walk (non-git fallback).\n */\nfunction collectViaFilesystem(\n dir: string,\n allowedExts: string[],\n maxFiles: number,\n skipDirs?: string[],\n): string[] {\n const skipSet = new Set(skipDirs || [\n 'node_modules', '.build', 'Pods', '.git', '.venv', 'venv',\n '__pycache__', 'build', 'dist', '.idea', '.vscode',\n 'test', 'tests', 'demo', 'sample', 'example', 'playground',\n ]);\n const extSet = new Set(allowedExts.map(e => e.toLowerCase()));\n const result: string[] = [];\n\n function walk(currentDir: string) {\n if (result.length >= maxFiles) return;\n let entries;\n try {\n entries = readdirSync(currentDir, { withFileTypes: true });\n } catch {\n return; // permission error\n }\n for (const entry of entries) {\n if (result.length >= maxFiles) return;\n const fullPath = join(currentDir, entry.name);\n if (entry.isDirectory()) {\n if (!skipSet.has(entry.name)) {\n walk(fullPath);\n }\n } else if (entry.isFile()) {\n const ext = extname(entry.name).toLowerCase();\n if (extSet.has(ext)) {\n result.push(fullPath);\n }\n }\n }\n }\n\n walk(dir);\n return result;\n}\n\n/**\n * Collect file contents map (relative path → content).\n */\nexport function collectFileContents(\n dir: string,\n options?: {\n allowedExtensions?: string[];\n skipDirs?: string[];\n maxFiles?: number;\n maxChars?: number;\n },\n): { paths: string[]; contents: Map<string, string> } {\n const maxChars = options?.maxChars || 500000;\n const files = collectSourceFiles(dir, options);\n const contents = new Map<string, string>();\n let totalChars = 0;\n\n for (const filePath of files) {\n const relPath = relative(dir, filePath);\n try {\n const content = readFileSync(filePath, 'utf-8');\n if (totalChars + content.length > maxChars) {\n const remaining = maxChars - totalChars;\n if (remaining > 100) {\n contents.set(relPath, content.slice(0, remaining));\n totalChars += remaining;\n }\n break;\n }\n contents.set(relPath, content);\n totalChars += content.length;\n } catch {\n // Skip unreadable files\n }\n }\n\n return { paths: files.map(f => relative(dir, f)), contents };\n}\n\n/**\n * Read contents of SPECIFIC files (by relative path) — no directory scan.\n * Used for 2-pass approach: scan tree first, then read only selected files.\n */\nexport function collectSpecificFileContents(\n dir: string,\n relativePaths: string[],\n maxChars: number = 500000,\n): Map<string, string> {\n const contents = new Map<string, string>();\n let totalChars = 0;\n\n for (const relPath of relativePaths) {\n const fullPath = join(dir, relPath);\n try {\n const content = readFileSync(fullPath, 'utf-8');\n if (totalChars + content.length > maxChars) {\n const remaining = maxChars - totalChars;\n if (remaining > 100) {\n contents.set(relPath, content.slice(0, remaining));\n totalChars += remaining;\n }\n break;\n }\n contents.set(relPath, content);\n totalChars += content.length;\n } catch {\n // Skip unreadable files\n }\n }\n\n return contents;\n}\n\n/**\n * Detect primary language from file extensions.\n */\nexport function detectPrimaryLanguage(filePaths: string[]): string {\n const counts = new Map<string, number>();\n for (const fp of filePaths) {\n const ext = extname(fp).toLowerCase();\n let lang = 'unknown';\n if (ext === '.swift') lang = 'Swift';\n else if (ext === '.ts' || ext === '.tsx') lang = 'TypeScript';\n else if (ext === '.js' || ext === '.jsx') lang = 'JavaScript';\n else if (ext === '.py') lang = 'Python';\n else if (ext === '.ino' || ext === '.cpp' || ext === '.c' || ext === '.h') lang = 'C++';\n else if (ext === '.kt' || ext === '.kts') lang = 'Kotlin';\n counts.set(lang, (counts.get(lang) || 0) + 1);\n }\n\n let maxCount = 0;\n let primary = 'unknown';\n for (const [lang, count] of counts) {\n if (count > maxCount) {\n maxCount = count;\n primary = lang;\n }\n }\n return primary;\n}\n\n/**\n * Read README.md and extract project description.\n */\nexport function readReadmeDescription(repoDir: string): string | null {\n const readmePath = join(repoDir, 'README.md');\n if (!existsSync(readmePath)) return null;\n try {\n const content = readFileSync(readmePath, 'utf-8');\n const lines = content.split('\\n').map(l => l.trim()).filter(Boolean);\n // Skip patterns: badges, images, table of contents, HTML tags\n const skipPatterns = [/^\\[!/, /^<img/, /^<a /, /^#+\\s+Table of/i, /^---$/];\n let foundTitle = false;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.startsWith('#') && !line.startsWith('##')) {\n foundTitle = true;\n continue;\n }\n if (!foundTitle) continue;\n // Skip empty lines, badges, images, TOC, horizontal rules\n if (skipPatterns.some(p => p.test(line))) continue;\n if (line.startsWith('#')) return null; // hit next heading — no description found\n if (line.startsWith('```')) return null; // code block\n if (line.startsWith('|')) return null; // table\n if (line.length > 15) return line;\n }\n return null;\n } catch {\n return null;\n }\n}\n","/**\n * Project Graph Pipeline — full orchestrator.\n *\n * Ported from knowledge-tree/generate_roadmap_v3.py PipelineOrchestrator\n * Coordinates: AST analysis → keyword extraction → LLM graph generation →\n * verification → concept escalation → concept resolution → assembly.\n */\n\nimport type { ProjectGraph, Feature } from '../schemas/projectGraphSchema';\nimport { parseSwiftFile, mergeSwiftResults, type SwiftParseResult } from '../parsers/swift';\nimport { parseTsFile, mergeTsResults, type TsParseResult } from '../parsers/typescript';\nimport { parsePythonFile, mergePythonResults, type PythonParseResult } from '../parsers/python';\nimport { parseCppFile, mergeCppResults, type CppParseResult } from '../parsers/cpp';\nimport { extractKeywords, type Keyword, type SourceContext } from '../extractors/keywordExtractor';\nimport { extractScaffold } from '../graph/scaffoldExtractor';\nimport { extractProjectOverview } from '../graph/overviewExtractor';\nimport { extractFeatureSteps, extractFeatureStepsBatched } from '../graph/stepExtractor';\nimport { verifyProjectGraph, type Hallucination } from '../graph/graphVerifier';\nimport { escalateAndMapConcepts, type ConceptMapping } from '../graph/conceptEscalator';\nimport { resolveConcepts, type ResolveConceptsResult } from '../concepts/conceptResolver';\nimport { assembleRoadmap, type AssembledRoadmap } from '../assembly/roadmapAssembler';\nimport { selectFilesWithLlm } from '../extractors/fileSelector';\nimport { collectSourceFiles, collectSpecificFileContents, detectPrimaryLanguage, readReadmeDescription } from '../utils/fileUtils';\nimport { relative } from 'node:path';\nimport { createLlmClient, type LlmClientConfig } from '../utils/llmClient';\n\nexport interface PipelineOptions {\n repoDir: string;\n goal: string;\n techStack: string;\n llmConfig?: LlmClientConfig;\n embeddings?: Record<string, { embedding?: number[]; name?: string; description?: string; keywords?: string }>;\n onProgress?: (step: string, message: string) => void;\n}\n\nexport interface PipelineResult {\n projectGraph: ProjectGraph;\n resolvedConcepts: ResolveConceptsResult;\n roadmap: AssembledRoadmap;\n hallucinations: Hallucination[];\n keywords: Keyword[];\n featureConcepts: Map<string, ConceptMapping[]>;\n}\n\n/**\n * Run the full project graph generation pipeline.\n */\nexport async function runProjectGraphPipeline(\n options: PipelineOptions,\n): Promise<PipelineResult> {\n const { repoDir, goal, techStack, llmConfig, embeddings, onProgress } = options;\n\n const log = (step: string, msg: string) => {\n console.log(`[${step}] ${msg}`);\n onProgress?.(step, msg);\n };\n\n // ─── STEP 1A: File Tree Scan (names only — no content reading) ─────────\n log('STEP_1', 'Scanning file tree (names only)...');\n\n const allFilePaths = collectSourceFiles(repoDir);\n const allRelPaths = allFilePaths.map(fp => relative(repoDir, fp));\n log('STEP_1', `Found ${allRelPaths.length} source files in repository`);\n\n // ─── STEP 1B: LLM File Selection (sends tiny file tree to LLM) ────────\n log('STEP_1', 'Asking LLM to select relevant files from file tree...');\n\n const { selected: selectedPaths, reasoning } = await selectFilesWithLlm(\n allRelPaths, goal, techStack, llmConfig,\n );\n log('STEP_1', `LLM selected ${selectedPaths.length}/${allRelPaths.length} files: ${reasoning.slice(0, 100)}`);\n\n // ─── STEP 1C: Read content only for LLM-selected files ─────────────────\n log('STEP_1', 'Reading content for selected files...');\n\n const fileContentsMap = collectSpecificFileContents(repoDir, selectedPaths);\n const filePaths = selectedPaths;\n const primaryLang = detectPrimaryLanguage(filePaths);\n log('STEP_1', `Primary language: ${primaryLang}, ${filePaths.length} files loaded (${fileContentsMap.size} with content)`);\n\n // Parse source files\n log('STEP_1', 'Parsing source files with AST-level analysis...');\n\n const allParseResults: SourceContext[] = [];\n for (const [relPath, content] of fileContentsMap) {\n const fullPath = relPath;\n if (fullPath.endsWith('.swift')) {\n allParseResults.push(parseSwiftFile(fullPath, content));\n } else if (fullPath.endsWith('.ts') || fullPath.endsWith('.tsx') || fullPath.endsWith('.js') || fullPath.endsWith('.jsx')) {\n allParseResults.push(parseTsFile(fullPath, content));\n } else if (fullPath.endsWith('.py')) {\n allParseResults.push(parsePythonFile(fullPath, content));\n } else if (fullPath.endsWith('.ino') || fullPath.endsWith('.cpp') || fullPath.endsWith('.c') || fullPath.endsWith('.h')) {\n allParseResults.push(parseCppFile(fullPath, content));\n }\n }\n\n // Merge parse results by language\n let mergedContext: SourceContext;\n if (primaryLang === 'Swift') {\n mergedContext = mergeSwiftResults(allParseResults.filter((r): r is SwiftParseResult => 'property_wrappers' in r));\n } else if (primaryLang === 'TypeScript' || primaryLang === 'JavaScript') {\n mergedContext = mergeTsResults(allParseResults.filter((r): r is TsParseResult => !('docstrings' in r) && !('property_wrappers' in r) && !('frameworks_used' in r)));\n } else if (primaryLang === 'Python') {\n mergedContext = mergePythonResults(allParseResults.filter((r): r is PythonParseResult => 'docstrings' in r));\n } else {\n mergedContext = mergeCppResults(allParseResults.filter((r): r is CppParseResult => 'error_handling' in r && !('docstrings' in r) && !('property_wrappers' in r)));\n }\n\n // ─── STEP 2: Keyword Extraction ──────────────────────────────────────────\n log('STEP_2', 'Extracting keywords from AST analysis...');\n\n const astKeywords = extractKeywords(mergedContext);\n log('STEP_2', `Extracted ${astKeywords.length} keywords`);\n\n // ─── STEP 3: Build SDK API Index (simplified — use AST keywords as proxy) ──\n log('STEP_3', 'Building SDK API index...');\n\n const sdkApiIndex = {\n sdk_apis: astKeywords.map(kw => ({\n name: kw.keyword,\n kind: kw.source,\n used_in_demo: true,\n })),\n };\n\n // ─── STEP 4: LLM Project Graph Generation ────────────────────────────────\n log('STEP_4', 'Generating project graph via LLM (C0: Scaffold, C1: Overview, C2: Steps)...');\n\n // C0: Scaffold (F0) — uses file list (names only, not content)\n log('STEP_4_C0', 'Extracting FOUNDATION & SETUP feature (F0)...');\n const scaffoldFeature = await extractScaffold({\n goal,\n techStack,\n fileList: filePaths,\n llmConfig,\n });\n\n // C1: Overview (features meta) — uses already-filtered fileContentsMap\n log('STEP_4_C1', 'Extracting project overview (features meta)...');\n const overview = await extractProjectOverview({\n goal,\n techStack,\n sdkApiIndex,\n fileContentsMap,\n astKeywords,\n llmConfig,\n });\n\n // Build PBL step (Design Thinking)\n const product = overview.product as Record<string, unknown> | undefined;\n const pblStep: Feature['steps'] extends (infer T)[] ? T : never = {\n id: 'F0-S1',\n sequence: 1,\n name: 'Frame the problem & understand user needs (Design Thinking)',\n description: 'BEFORE CODING — frame the problem and understand what the user needs',\n files: [],\n api_usage: [],\n keywords: ['Design Thinking', 'User Needs', 'Problem Statement', 'User Journey', 'PBL'],\n completion_level: 'base',\n platform: 'app',\n intent: 'Understand user needs and frame problem before writing code',\n outcome: { user_visible: 'Defined problem statement', technical: 'Problem frame context' },\n acceptance: ['Problem statement is clear', 'Primary users identified'],\n requirement_ids: [],\n concept_codes: [],\n effort: { estimated_minutes: 15, complexity: 'low' },\n };\n\n // Merge scaffold F0 with PBL step\n let featuresFull: Feature[] = [];\n if (scaffoldFeature) {\n const scaffoldSteps = [pblStep, ...(scaffoldFeature.steps || [])].map((s, i) => ({\n ...s,\n id: `F0-S${i + 1}`,\n sequence: i + 1,\n }));\n featuresFull.push({\n ...scaffoldFeature,\n id: 'F0',\n name: 'FOUNDATION & SETUP',\n steps: scaffoldSteps,\n });\n } else {\n featuresFull.push({\n id: 'F0',\n name: 'FOUNDATION & SETUP',\n description: 'Frame the problem, get familiar with the tools',\n steps: [pblStep],\n } as Feature);\n }\n\n // Add features from overview\n const overviewFeatures = (product?.features || []) as Feature[];\n featuresFull = [...featuresFull, ...overviewFeatures];\n\n // C2: Extract steps per feature\n log('STEP_4_C2', `Extracting steps for ${overviewFeatures.length} features...`);\n\n const nonF0Features = overviewFeatures.filter(f => f.id !== 'F0');\n if (nonF0Features.length > 0) {\n try {\n const batchedSteps = await extractFeatureStepsBatched(\n goal, techStack, sdkApiIndex, fileContentsMap, nonF0Features, llmConfig,\n );\n for (const feature of nonF0Features) {\n const steps = batchedSteps.get(feature.id || '');\n if (steps) feature.steps = steps;\n }\n } catch (err) {\n log('STEP_4_C2', `Batch extraction failed (${err}), falling back to per-feature...`);\n for (const feature of nonF0Features) {\n try {\n const steps = await extractFeatureSteps({\n goal, techStack, sdkApiIndex, fileContentsMap, feature, llmConfig,\n });\n feature.steps = steps;\n } catch (e) {\n log('STEP_4_C2', `Failed for ${feature.id}: ${e}`);\n }\n }\n }\n }\n\n // Build project graph\n const projectGraph: ProjectGraph = {\n schema_version: 3,\n project: {\n id: (overview.project as Record<string, unknown>)?.name?.toString().toLowerCase().replace(/\\s+/g, '-') || 'project',\n name: (overview.project as Record<string, unknown>)?.name?.toString() || 'Project',\n purpose: goal,\n version: '0.1.0',\n project_type: 'app',\n platform: ((overview.project as Record<string, unknown>)?.platforms as string[]) || ['ios'],\n tech_stack: techStack.split(',').reduce((acc, t) => {\n const key = t.trim().toLowerCase();\n if (key) acc[key] = [t.trim()];\n return acc;\n }, {} as Record<string, string[]>),\n architecture: (overview.architecture as Record<string, unknown>)?.layers as string[] || [],\n },\n product: {\n goals: (product?.goals as Array<{ id: string; description: string }>) || [],\n users: (product?.users as Array<{ id: string; goals: string[] }>) || [],\n journeys: (product?.user_journeys as Array<{ id: string; name: string; requirement_ids: string[]; steps: string[]; feature_ids: string[] }>) || [],\n requirements: [],\n development_stages: (product?.development_stages as Array<{ stage: string; product_state: string; need: string[]; learn: string[]; validation: string; cross_feature_value: string; temporary_approach: string }>) || [],\n purpose: String(product?.purpose || ''),\n problem_statement: String(product?.problem_statement || ''),\n primary_users: (product?.primary_users as string[]) || [],\n },\n features: featuresFull,\n capabilities: [],\n implementation: {\n tasks: [],\n },\n missing_gaps: [],\n tech_debt: [],\n };\n\n // ─── STEP 5: Verification ────────────────────────────────────────────────\n log('STEP_5', 'Verifying project graph against source code...');\n\n const { graph: verifiedGraph, hallucinations } = verifyProjectGraph(projectGraph, {\n repoDir,\n sdkApiIndex,\n fileContentsMap,\n });\n log('STEP_5', `Verification complete: ${hallucinations.length} hallucinations found`);\n\n // ─── STEP 6: Concept Escalation ──────────────────────────────────────────\n log('STEP_6', 'Escalating keywords to neutral concepts...');\n\n const featureConcepts = await escalateAndMapConcepts({\n projectGraph: verifiedGraph,\n fileContentsMap,\n llmConfig,\n });\n log('STEP_6', `Concept mapping complete: ${featureConcepts.size} features mapped`);\n\n // Propagate concept_codes back into verified graph steps\n for (const feature of verifiedGraph.features || []) {\n const fid = feature.id || '';\n const fConcepts = featureConcepts.get(fid) || [];\n for (const step of feature.steps || []) {\n const stepConcepts = fConcepts\n .filter(cm => {\n // Match concept to step: check if step contains the keyword\n const stepKws = [...(step.keywords || []), ...(step.api_usage || [])];\n return stepKws.some(k => k === cm.keyword);\n })\n .map(cm => cm.concept_code);\n // Merge with any existing concept_codes from LLM\n const existing = step.concept_codes || [];\n step.concept_codes = [...new Set([...existing, ...stepConcepts])];\n }\n }\n\n // ─── STEP 7: Concept Resolution ──────────────────────────────────────────\n log('STEP_7', 'Resolving keywords to Master Tree concepts...');\n\n // Collect LLM-generated keywords from verified graph (not just AST)\n const llmKeywords: Keyword[] = [];\n const seenKw = new Set<string>();\n for (const feature of verifiedGraph.features || []) {\n for (const step of feature.steps || []) {\n for (const kw of [...(step.keywords || []), ...(step.api_usage || [])]) {\n if (!seenKw.has(kw.toLowerCase())) {\n seenKw.add(kw.toLowerCase());\n llmKeywords.push({ keyword: kw, source: 'llm_step', platform: 'app', weight: 1.0, context: 'LLM-generated step keyword' });\n }\n }\n }\n }\n // Merge with AST keywords (AST takes precedence for source/weight)\n const astKwMap = new Map(astKeywords.map(k => [k.keyword.toLowerCase(), k]));\n const mergedKeywords: Keyword[] = [];\n const mergedSeen = new Set<string>();\n for (const kw of [...astKeywords, ...llmKeywords]) {\n const key = kw.keyword.toLowerCase();\n if (!mergedSeen.has(key)) {\n mergedSeen.add(key);\n mergedKeywords.push(astKwMap.get(key) || kw);\n }\n }\n\n // Build depth overrides from concept escalation\n const depthOverrides = new Map<string, 'ulo' | 'cio' | 'sio'>();\n for (const mappings of featureConcepts.values()) {\n for (const cm of mappings) {\n if (!depthOverrides.has(cm.keyword)) {\n depthOverrides.set(cm.keyword, cm.depth);\n }\n }\n }\n\n const resolvedConcepts = await resolveConcepts({\n keywords: mergedKeywords,\n goal,\n embeddings,\n depthOverrides,\n llmConfig,\n });\n log('STEP_7', `Resolved: ${resolvedConcepts.summary.resolved_count}, Proposed: ${resolvedConcepts.summary.proposed_count} (${resolvedConcepts.summary.search_mode})`);\n\n // ─── STEP 8: Assembly ────────────────────────────────────────────────────\n log('STEP_8', 'Assembling roadmap with keyword tracking...');\n\n const roadmap = assembleRoadmap({\n projectGraph: verifiedGraph,\n featureConcepts,\n sessionMinutes: 90,\n overheadFactor: 1.15,\n maxMilestoneMinutes: 120,\n });\n log('STEP_8', `Roadmap assembled: ${roadmap.phases.length} phases, ${roadmap.phases.reduce((s, p) => s + p.milestones.length, 0)} milestones`);\n\n return {\n projectGraph: verifiedGraph,\n resolvedConcepts,\n roadmap,\n hallucinations,\n keywords: astKeywords,\n featureConcepts,\n };\n}\n","/**\n * LO code + statement standard — calibrated against the production\n * learning_objectives table (6,693 live rows) and the knowledge-tree\n * Naming Conventions v2.2 (Appendix C of adaptive-learning-platform.md).\n *\n * Codes (deterministic, never LLM-generated):\n * concept CONCEPT_CODE UPPER_SNAKE_CASE, technology-neutral\n * ULO ULO-[CONCEPT]-NN one primary ULO per concept (NN = 01)\n * CIO CIO-[CONCEPT]-NN-[ACTION] parent = ULO, ACTION = SNAKE verb phrase\n * SIO SIO-[TECH]-[CONCEPT]-NN only tier carrying a tech tag (PY, SW, TS...)\n *\n * Statements: every LO description uses the normalized clause\n * \"The learner will be able to ...\" (production Supabase style).\n */\n\n// ─── Technology tag (SIO tier only) ─────────────────────────────────────────\n\nconst TECH_TAG_MAP: Record<string, string> = {\n python: \"PY\", swift: \"SW\", typescript: \"TS\", javascript: \"JV\", java: \"JAVA\",\n kotlin: \"KT\", go: \"GO\", rust: \"RUST\", csharp: \"CS\", cpp: \"CPP\", dart: \"DT\",\n php: \"PHP\", ruby: \"RB\", sql: \"SQL\", html: \"HTML\", css: \"CSS\",\n};\n\n/** Map a tech stack string to the production SIO tech tag (PY, SW, TS...). */\nexport function techTagFor(techStack: string): string {\n const primary = (techStack || \"\").trim().toLowerCase();\n for (const [key, tag] of Object.entries(TECH_TAG_MAP)) {\n if (primary.includes(key)) return tag;\n }\n const first = primary.split(/[\\s,+/]+/)[0] ?? \"\";\n if (!/^[a-z]/.test(first)) return \"GEN\";\n return first.length <= 4 ? first.toUpperCase() : first.slice(0, 3).toUpperCase();\n}\n\n// ─── Concept code (UPPER_SNAKE_CASE, neutral) ───────────────────────────────\n\nconst SMALL_WORDS = new Set([\"and\", \"or\", \"the\", \"of\", \"for\", \"in\", \"on\", \"a\", \"an\", \"vs\"]);\n\n/** Derive a neutral UPPER_SNAKE_CASE concept code from a human concept name. */\nexport function conceptCodeFromName(name: string): string {\n const words = name\n .replace(/[^A-Za-z0-9]+/g, \" \")\n .trim()\n .split(/\\s+/)\n .filter((w) => w.length > 0 && !SMALL_WORDS.has(w.toLowerCase()));\n const base = words.join(\"_\").toUpperCase().replace(/^_+|_+$/g, \"\").replace(/_{2,}/g, \"_\");\n const trimmed = (base || \"CONCEPT\").slice(0, 60).replace(/_+$/g, \"\");\n return trimmed;\n}\n\n/**\n * Assign unique concept codes to every concept (first occurrence keeps the\n * plain code, later collisions get a _2.._N suffix) — mirrors the DB where\n * concept_codes are unique neutral UPPER_SNAKE keys.\n */\nexport function assignConceptCodes(concepts: Array<{ id: string; name: string }>): Record<string, string> {\n const used = new Map<string, number>();\n const out: Record<string, string> = {};\n for (const c of concepts) {\n const base = conceptCodeFromName(c.name);\n const n = (used.get(base) ?? 0) + 1;\n used.set(base, n);\n out[c.id] = n === 1 ? base : base + \"_\" + n;\n }\n return out;\n}\n\n// ─── LO codes ───────────────────────────────────────────────────────────────\n\nconst pad2 = (n: number): string => String(n).padStart(2, \"0\");\n\nexport function uloCode(conceptCode: string, seq = 1): string {\n return \"ULO-\" + conceptCode + \"-\" + pad2(seq);\n}\n\nconst CIO_STOPWORDS = new Set([\n // clause boilerplate\n \"learner\", \"will\", \"be\", \"able\",\n // generic fillers\n \"a\", \"an\", \"the\", \"of\", \"to\", \"and\", \"or\", \"in\", \"on\", \"for\", \"by\", \"with\",\n \"is\", \"are\", \"that\", \"it\", \"its\", \"their\", \"when\", \"how\", \"as\", \"into\", \"from\",\n]);\n\n/** Extract a short SNAKE_CASE action phrase (2-4 content words) for a CIO code. */\nexport function cioActionSlug(cioText: string): string {\n const body = cioText.startsWith(LEARNER_CLAUSE) ? cioText.slice(LEARNER_CLAUSE.length) : cioText;\n const words = body.replace(/[^A-Za-z0-9]+/g, \" \").trim().split(/\\s+/)\n .map((w) => w.toLowerCase())\n .filter((w) => w.length > 2 && !CIO_STOPWORDS.has(w));\n const seen = new Set<string>();\n const picked: string[] = [];\n for (const w of words) {\n if (!seen.has(w)) { seen.add(w); picked.push(w); }\n if (picked.length === 3) break;\n }\n return (picked.length > 0 ? picked : [\"apply\"]).join(\"_\").toUpperCase();\n}\n\nexport function cioCode(conceptCode: string, uloSeq: number, actionSlug: string): string {\n return \"CIO-\" + conceptCode + \"-\" + pad2(uloSeq) + \"-\" + actionSlug;\n}\n\nexport function sioCode(techTag: string, conceptCode: string, seq: number): string {\n return \"SIO-\" + techTag + \"-\" + conceptCode + \"-\" + pad2(seq);\n}\n\n// ─── Standard statement clause ──────────────────────────────────────────────\n\nexport const LEARNER_CLAUSE = \"The learner will be able to \";\n\n/** Normalize any LO text into the production statement form with the standard clause. */\nexport function standardStatement(text: string): string {\n let body = (text || \"\").trim().replace(/^the learner (will be able to|can)\\s*/i, \"\").replace(/\\s+/g, \" \");\n if (body.length === 0) return \"\";\n // Lowercase a leading word unless it looks like an acronym/proper code (X.Y or ALLCAPS).\n const firstWord = body.split(\" \")[0] ?? \"\";\n const looksAcronym = /^[A-Z0-9_.`]+$/.test(firstWord) && firstWord.length > 1;\n if (!looksAcronym) body = body.charAt(0).toLowerCase() + body.slice(1);\n body = body.replace(/[.\\s]+$/, \"\");\n return LEARNER_CLAUSE + body + \".\";\n}\n\n// ─── Regex validators (calibrated to the live DB patterns) ─────────────────\n\nexport const CONCEPT_CODE_RE = /^[A-Z][A-Z0-9_]*$/;\nexport const ULO_CODE_RE = /^ULO-[A-Z][A-Z0-9_]*-\\d{2}$/;\nexport const CIO_CODE_RE = /^CIO-[A-Z][A-Z0-9_]*-\\d{2}-[A-Z][A-Z0-9_]*$/;\nexport const SIO_CODE_RE = /^SIO-[A-Z0-9]+-[A-Z][A-Z0-9_]*-\\d{2}$/;\n","/**\n * Syllabus Parser — parses structured Markdown, numbered text, or outlines\n * into a structured ParsedSyllabus object with traceable line references.\n */\n\nexport interface SyllabusTopic {\n id: string;\n title: string;\n unitId: string;\n unitTitle: string;\n description: string;\n learningObjectives: string[];\n keywords: string[];\n rawLineStart: number;\n rawLineEnd: number;\n}\n\nexport interface SyllabusUnit {\n id: string;\n title: string;\n order: number;\n topics: SyllabusTopic[];\n}\n\nexport interface ParsedSyllabus {\n subject: {\n title: string;\n domain?: string;\n gradeBand?: [number, number];\n description?: string;\n estimatedHours?: number;\n };\n units: SyllabusUnit[];\n allTopics: SyllabusTopic[];\n extractedKeywords: string[];\n rawText: string;\n}\n\nconst STOP_WORDS = new Set([\n 'and', 'the', 'for', 'with', 'from', 'that', 'this', 'into', 'when', 'while',\n 'using', 'their', 'your', 'each', 'how', 'why', 'what', 'between', 'through',\n 'about', 'trong', 'nhung', 'cac', 'cua', 'cho', 'voi', 'duoc', 'khong', 'theo',\n 'tren', 'duoi', 'va', 'hoac', 'thi', 'la', 'nhu',\n]);\n\n/**\n * Heuristically extracts meaningful terminology keywords from text tokens.\n */\nfunction extractTokens(text: string): string[] {\n const words = text\n .toLowerCase()\n .replace(/[^a-z0-9à-ỹ\\s-]/gi, ' ')\n .split(/\\s+/)\n .filter((w) => w.length >= 3 && !STOP_WORDS.has(w));\n return [...new Set(words)];\n}\n\n/**\n * Detect grade band from raw text patterns like \"Lớp 7 - Lớp 9\", \"Grade Band: 15-18\", \"12 - 15 tuổi\".\n */\nfunction extractGradeBand(text: string): [number, number] | undefined {\n const gbMatch = text.match(/(?:grade\\s*band|độ\\s*tuổi|lớp)\\s*[:=]?\\s*(?:lớp\\s*)?(\\d{1,2})\\s*(?:-|đến|to)\\s*(?:lớp\\s*)?(\\d{1,2})/i);\n if (gbMatch && gbMatch[1] && gbMatch[2]) {\n const min = parseInt(gbMatch[1], 10);\n const max = parseInt(gbMatch[2], 10);\n return [Math.min(min, max), Math.max(min, max)];\n }\n return undefined;\n}\n\n/**\n * Detect domain from text keywords.\n */\nfunction extractDomain(text: string): string | undefined {\n const lower = text.toLowerCase();\n if (lower.includes('computer science') || lower.includes('lập trình') || lower.includes('algorithm') || lower.includes('software')) return 'software';\n if (lower.includes('toán') || lower.includes('geometry') || lower.includes('algebra') || lower.includes('hình học') || lower.includes('mathematics')) return 'math';\n if (lower.includes('vật lý') || lower.includes('hóa học') || lower.includes('sinh học') || lower.includes('physics') || lower.includes('chemistry') || lower.includes('biology') || lower.includes('science')) return 'science';\n if (lower.includes('tiếng') || lower.includes('ngữ văn') || lower.includes('grammar') || lower.includes('language') || lower.includes('writing') || lower.includes('literature')) return 'language';\n return undefined;\n}\n\n/**\n * Main syllabus parser function.\n */\nexport function parseSyllabus(rawText: string): ParsedSyllabus {\n const lines = rawText.split(/\\r?\\n/);\n let subjectTitle = '';\n let subjectDesc = '';\n\n const units: SyllabusUnit[] = [];\n const allTopics: SyllabusTopic[] = [];\n const globalKeywordsSet = new Set<string>();\n\n let currentUnit: SyllabusUnit | null = null;\n let currentTopic: SyllabusTopic | null = null;\n let unitIndex = 0;\n let topicIndex = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!.trim();\n const lineNum = i + 1;\n if (!line) continue;\n\n // 1. Level 1 Heading: Subject Title\n if (line.startsWith('# ') && !subjectTitle) {\n subjectTitle = line.replace(/^#\\s+/, '').trim();\n continue;\n }\n\n // 2. Metadata lines at root\n if (!currentUnit) {\n if (line.toLowerCase().startsWith('môn học:') || line.toLowerCase().startsWith('subject:')) {\n const val = line.split(':')[1]?.trim() || '';\n if (val && !subjectTitle) subjectTitle = val;\n }\n if (line.toLowerCase().startsWith('mô tả:') || line.toLowerCase().startsWith('description:')) {\n subjectDesc = line.split(':')[1]?.trim() || '';\n }\n }\n\n // 3. Level 2 Heading: Unit / Chapter / Module\n const isUnitHeading = /^##\\s+(?:chương|module|unit|phần|chủ đề)\\s*(\\d+|[ivx]+)?[:.-]?\\s*(.*)/i.test(line)\n || /^##\\s+([^#].*)/.test(line);\n\n if (isUnitHeading) {\n if (currentTopic) {\n currentTopic.rawLineEnd = lineNum - 1;\n currentTopic = null;\n }\n unitIndex += 1;\n const titleMatch = line.replace(/^##\\s+/, '').trim();\n currentUnit = {\n id: `U${String(unitIndex).padStart(2, '0')}`,\n title: titleMatch,\n order: unitIndex,\n topics: [],\n };\n units.push(currentUnit);\n continue;\n }\n\n // 4. Topic heading inside Unit: \"- **Bài X: ...**\", \"### Topic ...\", \"1. Bài ...\", or \"- **...**\"\n const isTopicItem = /^(?:-\\s*\\*\\*(?:bài|topic|lesson|chủ đề)\\s*(\\d+(?:\\.\\d+)?|\\w+)?[:.-]?\\s*(.*?)\\*\\*)/i.exec(line)\n || /^###\\s+(?:bài|topic|lesson)?\\s*(\\d+(?:\\.\\d+)?|\\w+)?[:.-]?\\s*(.*)/i.exec(line)\n || /^-\\s+\\*\\*(.*?)\\*\\*/.exec(line)\n || /^(\\d+)\\.\\s+(?:(?:\\*\\*)?(?:bài|topic|lesson)?\\s*(\\d+(?:\\.\\d+)?|\\w+)?[:.-]?\\s*(.*?)(?:\\*\\*)?)$/i.exec(line);\n\n if (isTopicItem) {\n if (currentTopic) {\n currentTopic.rawLineEnd = lineNum - 1;\n }\n if (!currentUnit) {\n unitIndex += 1;\n currentUnit = {\n id: `U${String(unitIndex).padStart(2, '0')}`,\n title: subjectTitle || 'General',\n order: unitIndex,\n topics: [],\n };\n units.push(currentUnit);\n }\n topicIndex += 1;\n const rawName = (isTopicItem[3] || isTopicItem[2] || isTopicItem[1] || `Topic ${topicIndex}`).trim();\n currentTopic = {\n id: `T${String(topicIndex).padStart(2, '0')}`,\n title: rawName,\n unitId: currentUnit.id,\n unitTitle: currentUnit.title,\n description: '',\n learningObjectives: [],\n keywords: [],\n rawLineStart: lineNum,\n rawLineEnd: lineNum,\n };\n currentUnit.topics.push(currentTopic);\n allTopics.push(currentTopic);\n continue;\n }\n\n // 5. Content lines inside Topic\n if (currentTopic) {\n currentTopic.rawLineEnd = lineNum;\n const stripped = line.replace(/^[-*•\\s]+/, '').trim();\n\n // Objectives line\n if (stripped.toLowerCase().startsWith('mục tiêu:') || stripped.toLowerCase().startsWith('objectives:')) {\n const content = stripped.replace(/^(?:mục tiêu|objectives):\\s*/i, '').trim();\n if (content) currentTopic.learningObjectives.push(content);\n continue;\n }\n\n // Keywords line\n if (stripped.toLowerCase().startsWith('từ khóa:') || stripped.toLowerCase().startsWith('keywords:')) {\n const rawKw = stripped.replace(/^(?:từ khóa|keywords):\\s*/i, '').trim();\n const tokens = rawKw.split(/[,;]+/).map((k) => k.trim()).filter(Boolean);\n for (const tok of tokens) {\n currentTopic.keywords.push(tok);\n globalKeywordsSet.add(tok);\n }\n continue;\n }\n\n // General description line\n if (currentTopic.description) {\n currentTopic.description += ' ' + stripped;\n } else {\n currentTopic.description = stripped;\n }\n\n // Harvest tokens\n for (const tok of extractTokens(stripped)) {\n if (tok.length >= 4) globalKeywordsSet.add(tok);\n }\n }\n }\n\n // Close last topic if open\n if (currentTopic) {\n currentTopic.rawLineEnd = lines.length;\n }\n\n // Fallback subject title\n if (!subjectTitle && units.length > 0) {\n subjectTitle = units[0]?.title || 'Untitled Subject';\n }\n\n return {\n subject: {\n title: subjectTitle || 'Untitled Subject',\n domain: extractDomain(rawText),\n gradeBand: extractGradeBand(rawText),\n description: subjectDesc,\n },\n units,\n allTopics,\n extractedKeywords: [...globalKeywordsSet],\n rawText,\n };\n}\n","/**\n * Knowledge Graph Verifier — validates referential integrity, prerequisite DAG\n * acyclicity, and reverse syllabus coverage for concept-driven graphs.\n */\n\nimport type { KnowledgeGraph, Concept } from '../schemas/knowledgeGraphSchema';\nimport type { ParsedSyllabus } from '../parsers/syllabusParser';\n\nexport interface KnowledgeGraphVerificationReport {\n valid: boolean;\n cycles: string[][];\n removedEdges: Array<{ from: string; to: string }>;\n danglingPrerequisites: Array<{ conceptId: string; missingPrereqId: string }>;\n coverageRatio: number;\n totalSyllabusTopics: number;\n coveredSyllabusTopics: number;\n uncoveredTopics: string[];\n warnings: string[];\n}\n\n/**\n * Detect cycles in prerequisite graph using DFS.\n */\nexport function detectPrerequisiteCycles(concepts: Concept[]): string[][] {\n const cycles: string[][] = [];\n const visited = new Set<string>();\n const inStack = new Set<string>();\n const path: string[] = [];\n\n const prereqMap = new Map<string, string[]>();\n for (const c of concepts) {\n prereqMap.set(c.id, c.prerequisites || []);\n }\n\n function dfs(conceptId: string) {\n if (inStack.has(conceptId)) {\n const cycleStart = path.indexOf(conceptId);\n if (cycleStart >= 0) {\n cycles.push([...path.slice(cycleStart), conceptId]);\n }\n return;\n }\n if (visited.has(conceptId)) return;\n\n visited.add(conceptId);\n inStack.add(conceptId);\n path.push(conceptId);\n\n for (const prereq of prereqMap.get(conceptId) || []) {\n dfs(prereq);\n }\n\n path.pop();\n inStack.delete(conceptId);\n }\n\n for (const c of concepts) {\n if (!visited.has(c.id)) {\n dfs(c.id);\n }\n }\n\n return cycles;\n}\n\n/**\n * Break cycles by removing back-edges.\n */\nexport function breakPrerequisiteCycles(\n concepts: Concept[],\n cycles: string[][],\n): { fixed: Concept[]; removed: Array<{ from: string; to: string }> } {\n const removed: Array<{ from: string; to: string }> = [];\n const fixed = concepts.map((c) => ({ ...c, prerequisites: [...(c.prerequisites || [])] }));\n\n for (const cycle of cycles) {\n if (cycle.length >= 2) {\n const breaker = cycle[cycle.length - 2];\n const target = cycle[cycle.length - 1];\n\n for (const concept of fixed) {\n if (concept.id === breaker && target) {\n concept.prerequisites = concept.prerequisites.filter((p) => p !== target);\n removed.push({ from: breaker, to: target });\n }\n }\n }\n }\n\n return { fixed, removed };\n}\n\n/**\n * Audit reverse coverage: verify that every topic in ParsedSyllabus is mapped\n * to at least one concept in KnowledgeGraph.\n */\nexport function auditSyllabusCoverage(\n concepts: Concept[],\n syllabus?: ParsedSyllabus,\n): { coverageRatio: number; totalTopics: number; coveredTopics: number; uncovered: string[] } {\n if (!syllabus || syllabus.allTopics.length === 0) {\n return { coverageRatio: 1.0, totalTopics: 0, coveredTopics: 0, uncovered: [] };\n }\n\n const topics = syllabus.allTopics;\n const coveredSet = new Set<string>();\n\n for (const topic of topics) {\n const topicKeywords = new Set([\n ...topic.title.toLowerCase().split(/\\s+/),\n ...(topic.keywords || []).map((k) => k.toLowerCase()),\n ]);\n\n // Check if any concept references this topic title or shares keywords\n for (const concept of concepts) {\n const cName = concept.name.toLowerCase();\n const cDesc = (concept.description || '').toLowerCase();\n const cKeywords = (concept.keywords || []).map((k) => k.toLowerCase());\n\n // Direct ID match\n if (concept.id.toLowerCase() === topic.id.toLowerCase()) {\n coveredSet.add(topic.id);\n break;\n }\n\n const refs = (concept as any).references || [];\n const hasTopicRef = refs.some(\n (r: any) => r.id === topic.id || (r.title && r.title.toLowerCase() === topic.title.toLowerCase())\n );\n if (hasTopicRef) {\n coveredSet.add(topic.id);\n break;\n }\n\n const conceptKeywords = (concept.keywords || []).map((k) => k.toLowerCase());\n const hasOverlap = conceptKeywords.some((k) => topicKeywords.has(k)) ||\n concept.name.toLowerCase().includes(topic.title.toLowerCase()) ||\n topic.title.toLowerCase().includes(concept.name.toLowerCase());\n\n if (hasOverlap) {\n coveredSet.add(topic.id);\n break;\n }\n }\n }\n\n const totalTopics = topics.length;\n const coveredTopics = coveredSet.size;\n const coverageRatio = totalTopics > 0 ? coveredTopics / totalTopics : 1.0;\n const uncovered = topics.filter((t) => !coveredSet.has(t.id)).map((t) => `${t.id}: ${t.title}`);\n\n return { coverageRatio, totalTopics, coveredTopics, uncovered };\n}\n\n/**\n * Full knowledge graph verifier function.\n */\nexport function verifyKnowledgeGraph(\n kg: KnowledgeGraph,\n syllabusOrOptions?: ParsedSyllabus | { parsedSyllabus?: ParsedSyllabus },\n): { verifiedGraph: KnowledgeGraph; report: KnowledgeGraphVerificationReport } {\n const syllabus = syllabusOrOptions && 'parsedSyllabus' in syllabusOrOptions\n ? syllabusOrOptions.parsedSyllabus\n : (syllabusOrOptions as ParsedSyllabus | undefined);\n\n const warnings: string[] = [];\n let concepts = [...(kg.concepts || [])];\n const conceptIds = new Set(concepts.map((c) => c.id));\n\n // 1. Remove self-loops\n for (const c of concepts) {\n if ((c.prerequisites || []).includes(c.id)) {\n c.prerequisites = (c.prerequisites || []).filter((p) => p !== c.id);\n warnings.push(`Self-loop removed on concept ${c.id}`);\n }\n }\n\n // 2. Dangling prerequisite check\n const danglingPrerequisites: Array<{ conceptId: string; missingPrereqId: string }> = [];\n for (const c of concepts) {\n const validPrereqs: string[] = [];\n for (const p of c.prerequisites || []) {\n if (!conceptIds.has(p)) {\n danglingPrerequisites.push({ conceptId: c.id, missingPrereqId: p });\n warnings.push(`Dangling prerequisite removed: ${c.id} -> ${p}`);\n } else {\n validPrereqs.push(p);\n }\n }\n c.prerequisites = validPrereqs;\n }\n\n // 3. Cycle detection & breaking\n const initialCycles = detectPrerequisiteCycles(concepts);\n let removedEdges: Array<{ from: string; to: string }> = [];\n if (initialCycles.length > 0) {\n const broken = breakPrerequisiteCycles(concepts, initialCycles);\n concepts = broken.fixed;\n removedEdges = broken.removed;\n for (const r of removedEdges) {\n warnings.push(`Cycle broken: removed edge ${r.from} -> ${r.to}`);\n }\n }\n\n // 4. Reverse coverage audit against syllabus\n const coverage = auditSyllabusCoverage(concepts, syllabus);\n if (coverage.coverageRatio < 1.0) {\n warnings.push(`Syllabus coverage ${(coverage.coverageRatio * 100).toFixed(1)}% (${coverage.coveredTopics}/${coverage.totalTopics} topics). Uncovered: ${coverage.uncovered.join(', ')}`);\n }\n\n // 5. Concept layer checks\n for (const c of concepts) {\n if (!c.ulo) warnings.push(`Concept ${c.id} missing ULO (WHAT + WHY)`);\n if (!c.cio) warnings.push(`Concept ${c.id} missing CIO (HOW mechanism)`);\n if (!c.sio || c.sio.length === 0) warnings.push(`Concept ${c.id} missing SIO implementation items`);\n }\n\n const valid = initialCycles.length === 0 && danglingPrerequisites.length === 0 && coverage.coverageRatio >= 0.8;\n\n const verifiedGraph: KnowledgeGraph = {\n ...kg,\n concepts,\n };\n\n const report: KnowledgeGraphVerificationReport = {\n valid,\n cycles: initialCycles,\n removedEdges,\n danglingPrerequisites,\n coverageRatio: coverage.coverageRatio,\n totalSyllabusTopics: coverage.totalTopics,\n coveredSyllabusTopics: coverage.coveredTopics,\n uncoveredTopics: coverage.uncovered,\n warnings,\n };\n\n return { verifiedGraph, report };\n}\n","/**\n * Exemplar bank for hierarchical LO authoring.\n * ULO/CIO exemplars ported from knowledge-tree master_learning_objectives.tsv\n * (approved reference bank). SIO exemplars follow the same style as judged-PASS\n * items from real pipeline runs: keyword-bound, completable, context-specific.\n */\n\nexport const ULO_EXEMPLARS: string[] = [\n // Calibrated against production learning_objectives (UNIVERSAL rows, neutral)\n \"The learner will be able to recall the key concepts, terminology, and characteristics of layers of abstraction.\",\n \"The learner will be able to explain how layers of abstraction hide implementation details while exposing essential behavior.\",\n \"The learner will be able to explain how a program changes state through statements and control flow.\",\n \"The learner will be able to differentiate local from global scope and describe how return values affect data flow.\",\n \"The learner will be able to describe the mechanism of a loop, including its condition, step and stopping rule.\",\n \"The learner will be able to explain why a representation format must balance readability against processing efficiency.\",\n];\n\nexport const CIO_EXEMPLARS: string[] = [\n // Production CONCEPTUAL_IMPL rows: mechanism behind the clause, Marr 2-Language neutral\n \"The learner will be able to develop a conceptual model that explains the internal mechanism by which the representation produces its effect.\",\n \"The learner will be able to compare alternative approaches for the same operation and describe the trade-offs between them.\",\n \"The learner will be able to decompose the choice of representation into decisive criteria such as cost, fidelity and tolerance to change.\",\n \"The learner will be able to describe the sequence of steps by which a process transforms its input into its output, including the stopping condition.\",\n];\n\nexport const SIO_EXEMPLARS: string[] = [\n // Production SPECIFIC_IMPL style: keyword-bound completable tasks, tech-tagged tier\n \"The learner will be able to use argparse.ArgumentParser with add_subparsers to register add, done and list commands in a Python CLI.\",\n \"The learner will be able to define a @dataclass with type hints and a __post_init__ method that raises ValueError on invariant violation.\",\n \"The learner will be able to execute parameterized statements via sqlite3.Connection.execute inside a with conn: transaction to perform CRUD on a tasks table.\",\n \"The learner will be able to write a pytest test that runs the CLI entry point via subprocess.run and asserts the exit code and printed output.\",\n];\n","/**\n * Deterministic ULO/CIO/SIO Contract Audit.\n *\n * Code-level checks that do NOT trust the LLM: they measure whether generated\n * depth layers satisfy the structural part of the authoring contract.\n * Ported context: knowledge-tree lo_quality/proof_tiers philosophy — generate\n * and verify are separate concerns; verification must be deterministic-first.\n */\nimport { LEARNER_CLAUSE, CONCEPT_CODE_RE, ULO_CODE_RE, CIO_CODE_RE, SIO_CODE_RE } from \"./loCodeStandard.js\";\n\n// --- Deterministic ULO/CIO/SIO Contract Audit ---------------------------------\n// Code-level checks that do NOT trust the LLM: they measure whether generated\n// depth layers satisfy the structural part of the authoring contract. The LLM\n// judge (semantic quality) complements these; it never replaces them.\n\n/** Concrete-technology signals: snake/camel identifiers, file extensions, tech acronyms. */\nconst TECH_SIGNAL_RES: RegExp[] = [\n /`[^`]+`/,\n /\\b[a-zA-Z_][A-Za-z0-9_]*\\(\\)/,\n // call-with-arguments: Status(enum.Enum), field(default_factory=list)\n /\\b[A-Za-z_][A-Za-z0-9_]*\\([^)]+\\)/,\n // attribute access glued to a value: enum.Enum, os.path, tasks.json\n /[A-Za-z0-9_)\\]]\\.[A-Za-z_][A-Za-z0-9_]+/,\n /[a-z]+_[a-z]+/,\n /[a-z]+[A-Z][A-Za-z]*/,\n /\\.[a-z]{2,4}\\b/,\n /\\b(?:API|SDK|JSON|XML|YAML|HTTP|SQL|UUID|URL|DOM|CLI|TUI|CSV|UTF|CRUD|DSL)\\b/,\n // Exception/error class names: Exception, ValueError, CustomError\n /\\b[A-Z][a-zA-Z0-9_]*(?:Error|Exception|Warning|Fault)\\b/,\n // class declarations or references: class Status, static methods on types\n /\\bclass\\s+[A-Za-z_][A-Za-z0-9_]*/,\n // inheritance/derivation mentions: inheriting from Exception, subclass of Base\n /\\b(?:inherit(?:ing|s)?|subclass(?:ing)?|deriv(?:ing|ed|es)?)\\s+(?:from|of)\\s+[A-Z][A-Za-z0-9_]*/,\n];\n\n/** Single-letter matches to ignore. */\nconst GENERIC_STOP = new Set([\"e\", \"g\", \"i\"]);\n\nfunction techSignalHits(text: string): string[] {\n const hits: string[] = [];\n for (const re of TECH_SIGNAL_RES) {\n const found = text.match(new RegExp(re.source, \"g\")) ?? [];\n for (const m of found) if (!GENERIC_STOP.has(m.toLowerCase())) hits.push(m);\n }\n return hits;\n}\n\nexport interface DepthLayerAudit {\n conceptId: string;\n uloHasTechSignals: boolean;\n uloTechSignals: string[];\n uloHasImplementationVerbs: boolean;\n sioAllKeywordBound: boolean;\n sioUnboundItems: string[];\n sioConceptKeywordBound: boolean;\n sioOffConceptItems: string[];\n sioAllCompletable: boolean;\n sioNotCompletable: string[];\n concretenessIncreases: boolean;\n clauseOk: boolean;\n codesOk: boolean;\n codeIssues: string[];\n passed: boolean;\n}\n\nexport function auditDepthLayers(\n concepts: Array<{\n id: string; name?: string; ulo?: string; cio?: string; sio?: string[];\n code?: string; ulo_code?: string; cio_code?: string; sio_codes?: string[];\n keywords?: string[];\n }>,\n): DepthLayerAudit[] {\n return concepts.map((c) => {\n const ulo = (c.ulo ?? \"\").trim();\n const cio = (c.cio ?? \"\").trim();\n const sioItems = (c.sio ?? []).map((s) => (s ?? \"\").trim()).filter(Boolean);\n const uloTechSignals = techSignalHits(ulo);\n const uloHasTechSignals = uloTechSignals.length > 0;\n const IMPL_VERBS = /\\b(implement|refactor|debug|serialize)\\b/i;\n const uloHasImplementationVerbs = IMPL_VERBS.test(ulo);\n const registryKeywords = (c.keywords ?? []).map((k) => String(k).toLowerCase()).filter((k) => k.length >= 3);\n // Concept identity tokens fall back to the concept NAME when the registry is\n // narrow: an SIO that names the concept's own subject is on-concept.\n const nameTokens = String(c.name ?? \"\").toLowerCase().split(/[^a-z0-9]+/).filter((w) => w.length >= 4);\n const boundToConcept = (s: string): boolean => {\n const lower = s.toLowerCase();\n return registryKeywords.some((k) => lower.includes(k)) || nameTokens.some((w) => lower.includes(w));\n };\n const sioUnboundItems = sioItems.filter((s) => {\n if (techSignalHits(s).length > 0) return false;\n // Bare tool/technology names (pytest, capsys, python -m build) carry no\n // punctuation signal — the concept keyword registry is the binding source.\n return !boundToConcept(s);\n });\n // Concept-keyword binding: at least one SIO item must reference a keyword\n // FROM THIS CONCEPT's registry (not just any tech signal). Skipped when the\n // caller provides no keyword registry.\n const conceptKeywords = (c.keywords ?? []).map((k) => k.toLowerCase()).filter(Boolean);\n const sioOffConceptItems = conceptKeywords.length > 0\n ? sioItems.filter((s) => !boundToConcept(s))\n : [];\n const COMPLETABLE = /\\b(build|create|implement|write|configure|add|use|apply|display|store|load|save|handle|parse|validate|test|register|compute|generate|print|format|convert|extend|define|execute|run|read|fetch|wrap|log|call|raise|install|import|export|declare|embed|model|represent|override|customize|enforce|mock|assert|query|index|cache|stream|split|join|strip|encode|decode|traverse|measure|evaluate|benchmark|diagnose|demonstrate|verify|organize|structure|choose|select|compare|distinguish|attach|annotate|expose|accept|manage|group|sort|filter|map|reduce|catch|throw|migrate|inspect|trace|parameterize|construct|design|capture)\\b/i;\n const sioNotCompletable = sioItems.filter((s) => !COMPLETABLE.test(s) && !/`[^`]+`/.test(s));\n const density = (text: string): number => {\n if (!text) return 0;\n return (techSignalHits(text).length / Math.max(1, text.split(/\\s+/).length)) * 100;\n };\n const dUlo = density(ulo);\n const dCio = density(cio);\n const dSio = sioItems.length > 0 ? Math.max(...sioItems.map(density)) : 0;\n const concretenessIncreases = dSio > dUlo;\n // Naming Conventions v2.2 + production statement clause checks\n const clauseOk =\n ulo.startsWith(LEARNER_CLAUSE) &&\n cio.startsWith(LEARNER_CLAUSE) &&\n sioItems.every((t) => t.startsWith(LEARNER_CLAUSE));\n const codeIssues: string[] = [];\n const conceptCode = (c as { code?: string }).code;\n if (conceptCode !== undefined && !CONCEPT_CODE_RE.test(conceptCode)) codeIssues.push(\"concept code not UPPER_SNAKE: \" + conceptCode);\n const uloCodeVal = (c as { ulo_code?: string }).ulo_code;\n if (uloCodeVal !== undefined && uloCodeVal !== \"\" && !ULO_CODE_RE.test(uloCodeVal)) codeIssues.push(\"ULO code malformed: \" + uloCodeVal);\n const cioCodeVal = (c as { cio_code?: string }).cio_code;\n if (cioCodeVal !== undefined && cioCodeVal !== \"\" && !CIO_CODE_RE.test(cioCodeVal)) codeIssues.push(\"CIO code malformed: \" + cioCodeVal);\n const sioCodeVals = (c as { sio_codes?: string[] }).sio_codes;\n if (sioCodeVals !== undefined) {\n if (sioCodeVals.length !== sioItems.length) codeIssues.push(\"SIO codes count mismatch\");\n for (const sc of sioCodeVals) if (!SIO_CODE_RE.test(sc)) codeIssues.push(\"SIO code malformed: \" + sc);\n }\n const codesOk = codeIssues.length === 0;\n const passed =\n !uloHasTechSignals &&\n !uloHasImplementationVerbs &&\n sioUnboundItems.length === 0 &&\n sioOffConceptItems.length === 0 &&\n sioNotCompletable.length === 0 &&\n concretenessIncreases &&\n clauseOk &&\n codesOk;\n return {\n conceptId: c.id,\n uloHasTechSignals,\n uloTechSignals,\n uloHasImplementationVerbs,\n sioAllKeywordBound: sioUnboundItems.length === 0,\n sioUnboundItems,\n sioConceptKeywordBound: sioOffConceptItems.length === 0,\n sioOffConceptItems,\n sioAllCompletable: sioNotCompletable.length === 0,\n sioNotCompletable,\n concretenessIncreases,\n clauseOk,\n codesOk,\n codeIssues,\n passed,\n };\n });\n}","/**\n * Hierarchical LO authoring — ported from knowledge-tree\n * (.agents/skills/learning-objective-generator/llm_generate_hierarchical_lo.py).\n *\n * Original architecture (3 independent phases, each gated before the next):\n * Phase A: ULOs from concepts — core competency (WHAT + WHY), technology-\n * agnostic, Cognitive Ceiling + Pragmatic Verb Mapping.\n * Phase B: CIOs from approved ULOs — mechanism (HOW), Marr 2-Language Test.\n * Phase C: SIOs from approved CIOs — keyword-bound implementation tasks.\n *\n * Depth policy (user-approved contract, differs from original Bloom ceiling):\n * - ULO/CIO bind to the CONCEPT nature; ULO typically Remember/Understand.\n * - SIO binds to KEYWORDS; Apply/Analyze/Create are assessed INDIRECTLY\n * through completing SIO in concrete context (no fixed Bloom ceiling).\n *\n * Deterministic audit (depthAudit.ts) gates every phase; a failing phase\n * triggers one targeted repair round, then hard-fails (no silent fallback).\n */\nimport { LEARNER_CLAUSE, standardStatement } from \"./loCodeStandard.js\";\nimport { ULO_EXEMPLARS, CIO_EXEMPLARS, SIO_EXEMPLARS } from './loExemplars';\nimport { auditDepthLayers, type DepthLayerAudit } from './depthAudit';\nimport { parseJsonFromLlm, type LlmClient } from '../utils/llmClient';\n\nexport interface HierarchicalLoConceptInput {\n keywords?: string[];\n id: string;\n name: string;\n description?: string;\n}\n\nexport interface HierarchicalLoResult {\n uloByConcept: Record<string, string>;\n cioByConcept: Record<string, string>;\n sioByConcept: Record<string, string[]>;\n audits: DepthLayerAudit[];\n warnings: string[];\n}\n\nfunction excerpt(text: string | undefined, max: number): string {\n const t = (text || \"\").trim();\n return t.length > max ? t.slice(0, max) + \"...\" : t;\n}\n\nasync function chatJson(\n client: LlmClient,\n system: string,\n user: string,\n): Promise<Record<string, unknown>> {\n const r = await client.chat(\n [{ role: \"system\", content: system }, { role: \"user\", content: user }],\n { temperature: 0.1, maxTokens: parseInt(process.env.KG_MAX_TOKENS || \"65536\", 10) },\n );\n return parseJsonFromLlm(r.content) as Record<string, unknown>;\n}\n\n// Batch size for per-phase LLM calls: large single batches risk output truncation\n// (reasoning tokens count against max_tokens) — 6 concepts per call keeps each\n// response comfortably inside budget.\nconst LO_BATCH_SIZE = 6;\nfunction chunkConcepts<T>(items: T[], size: number): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < items.length; i += size) out.push(items.slice(i, i + size));\n return out;\n}\n\nconst JSON_ONLY = \"Return EXACTLY JSON. No markdown, no explanations.\";\n\nexport async function authorDepthLayersHierarchically(\n client: LlmClient,\n concepts: Array<HierarchicalLoConceptInput>,\n techStack: string,\n warnings: string[],\n): Promise<HierarchicalLoResult> {\n const uloByConcept: Record<string, string> = {};\n const cioByConcept: Record<string, string> = {};\n const sioByConcept: Record<string, string[]> = {};\n\n const conceptList = concepts\n .map((c) => \"- \" + c.id + \": \" + c.name + (c.description ? \" — \" + excerpt(c.description, 160) : \"\"))\n .join(\"\\n\");\n\n // ── Phase A: ULO (WHAT + WHY, concept-bound, technology-agnostic) ──\n const uloSystem = [\n \"You are a Curriculum Design Expert writing Universal Learning Objectives (ULO).\",\n \"\",\n \"ULO = Computational Tier: the CORE COMPETENCY — WHAT the concept is and WHY it exists —\",\n \"completely independent of any technology, language, framework, library, file format or tool.\",\n \"\",\n \"Rules:\",\n \"1. NEVER mention a concrete technology, API, library, file name or syntax in a ULO.\",\n \"2. Bind the ULO to the concept intrinsic nature: the problem it solves in principle.\",\n \"3. Typical assessment level: Remember or Understand. Use pragmatic, measurable verbs\",\n \" (Explain, Differentiate, Identify, Describe) instead of Know/Understand/Summarize.\",\n \"4. Cognitive Ceiling: do NOT force Analyze/Evaluate/Create ULOs — if the concept is\",\n \" foundational, its core competency is low-level. Higher levels are exercised later\",\n \" INDIRECTLY through implementation work, not in the ULO itself.\",\n \"5. One ULO per concept; 1-2 sentences covering WHAT + WHY.\",\n \"6. Statement form (mandatory): every ULO MUST read 'The learner will be able to ...' —\",\n \" a lowercase actionable verb follows the clause (explain ..., differentiate ...).\",\n \" Do not prefix any other phrasing.\",\n \"\",\n \"Approved style exemplars (production bank):\",\n ULO_EXEMPLARS.map((e) => \"- \" + e).join(\"\\n\"),\n \"\",\n JSON_ONLY,\n ].join(\"\\n\");\n const uloUser = [\n \"Concepts:\",\n conceptList,\n\n \"\",\n \"Return JSON:\",\n '{\"ulos\":[{\"concept_id\":\"C1\",\"ulo\":\"...\"}]}',\n ].join(\"\\n\");\n for (const batch of chunkConcepts(concepts, LO_BATCH_SIZE)) {\n const batchList = batch\n .map((c) => \"- \" + c.id + \" (\" + c.name + \")\" + (c.description ? \": \" + excerpt(c.description, 160) : \"\"))\n .join(\"\\n\");\n const batchUser = \"Concepts:\\n\" + batchList + \"\\n\\nReturn JSON:\\n\" + '{\"ulos\":[{\"concept_id\":\"C1\",\"ulo\":\"...\"}]}';\n const uloRes = await chatJson(client, uloSystem, batchUser);\n for (const u of (uloRes.ulos ?? []) as Array<{ concept_id?: string; ulo?: string }>) {\n if (u.concept_id && u.ulo) uloByConcept[u.concept_id] = standardStatement(u.ulo);\n }\n }\n for (const c of concepts) {\n if (!uloByConcept[c.id]) {\n warnings.push(\"Phase A: no ULO generated for \" + c.id + \" — kept empty (audit will fail)\");\n uloByConcept[c.id] = \"\";\n }\n }\n\n // ── Phase B: CIO (HOW mechanism, concept-bound, Marr 2-Language spirit) ──\n const uloContext = concepts\n .map((c) => \"- \" + c.id + \" (\" + c.name + \"): \" + uloByConcept[c.id])\n .join(\"\\n\");\n const cioSystem = [\n \"You are a Curriculum Design Expert writing Concept-level Instructional Objectives (CIO).\",\n \"\",\n \"CIO = Algorithmic Tier: the MECHANISM — HOW the concept works, step by step, at a\",\n \"procedural level. CIOs are derived from approved ULOs.\",\n \"\",\n \"Rules:\",\n \"1. Still technology-agnostic: describe the neutral pattern/approach WITHOUT concrete\",\n \" API names, libraries, file formats or syntax.\",\n \"2. Marr 2-Language Test: the CIO must read as true and implementable regardless of\",\n \" whether the learner uses Python, Swift, JavaScript or any other language. If it\",\n \" only makes sense in one language, rewrite it more neutrally.\",\n \"3. More concrete than the ULO: reference stages, conditions, ordering or trade-offs\",\n \" of the underlying process.\",\n \"4. One CIO per concept; 1-3 sentences describing the mechanism.\",\n \"5. Statement form (mandatory): every CIO MUST read 'The learner will be able to ...' —\",\n \" the mechanism is described after the clause.\",\n \"\",\n \"Approved style exemplars (production bank):\",\n CIO_EXEMPLARS.map((e) => \"- \" + e).join(\"\\n\"),\n \"\",\n JSON_ONLY,\n ].join(\"\\n\");\n const cioUser = [\n \"Approved ULOs:\",\n uloContext,\n \"\",\n \"Return JSON:\",\n '{\"cios\":[{\"concept_id\":\"C1\",\"cio\":\"...\"}]}',\n ].join(\"\\n\");\n for (const batch of chunkConcepts(concepts, LO_BATCH_SIZE)) {\n const batchIds = new Set(batch.map((c) => c.id));\n const batchUloContext = batch\n .map((c) => \"- \" + c.id + \" (\" + c.name + \"): \" + (uloByConcept[c.id] || \"(missing)\"))\n .join(\"\\n\");\n const batchCioUser = \"Approved ULOs:\\n\" + batchUloContext + \"\\n\\nReturn JSON:\\n\" + '{\"cios\":[{\"concept_id\":\"C1\",\"cio\":\"...\"}]}';\n const cioRes = await chatJson(client, cioSystem, batchCioUser);\n for (const x of (cioRes.cios ?? []) as Array<{ concept_id?: string; cio?: string }>) {\n if (x.concept_id && x.cio) cioByConcept[x.concept_id] = standardStatement(x.cio);\n }\n }\n for (const c of concepts) {\n if (!cioByConcept[c.id]) {\n warnings.push(\"Phase B: no CIO generated for \" + c.id + \" — kept empty (audit will fail)\");\n cioByConcept[c.id] = \"\";\n }\n }\n\n // ── Phase C: SIO (keyword-bound implementation tasks) ──\n const cioContext = concepts\n .map((c) => \"- \" + c.id + \" (\" + c.name + \"): CIO=\" + cioByConcept[c.id] + \" | ULO=\" + uloByConcept[c.id])\n .join(\"\\n\");\n const sioSystem = [\n \"You are a Curriculum Design Expert writing Specific Instructional Objectives (SIO).\",\n \"\",\n \"SIO = Implementation Tier: completable, context-specific implementation tasks derived\",\n \"from approved CIOs, bound to the TARGET technology of the course.\",\n \"\",\n \"Rules:\",\n \"1. EVERY SIO item MUST name concrete keywords/technologies: a real API, function,\",\n \" decorator, module, class, file or command of the target technology.\",\n \"2. Each item is a completable task: an actionable verb + the concrete construct + the\",\n \" context where it is used. Application/Analysis/Creation skills are assessed\",\n \" INDIRECTLY through completing these tasks — there is no fixed Bloom ceiling.\",\n \" MACHINE CHECK: every item MUST contain at least one ACTION VERB from this whitelist\",\n \" (build, create, implement, write, configure, add, use, apply, display, store, load,\",\n \" save, handle, parse, validate, test, register, compute, generate, print, format,\",\n \" convert, extend, define, execute, run, read, fetch, wrap, log, call, raise, install,\",\n \" import, export, declare, embed, model, represent, override, customize, enforce, mock,\",\n \" assert, query, index, cache, stream, split, join, strip, encode, decode, traverse,\",\n \" measure, evaluate, benchmark, diagnose, demonstrate, verify, organize, structure,\",\n \" choose, select, compare, distinguish, attach, annotate, expose, accept, manage, group,\",\n \" sort, filter, map, reduce, catch, throw, migrate, inspect, trace, parameterize,\",\n \" construct, design, capture) — OR wrap the concrete construct in backticks.\",\n \" Items with abstract verbs (understand, learn, know, grasp, appreciate, explore) and\",\n \" no backtick construct FAIL the audit. Prefer starting the task phrase with the verb.\",\n \"3. 2-3 items per concept, each referencing a DIFFERENT concrete construct.\",\n \"4. Statement form (mandatory): every SIO MUST read 'The learner will be able to ...' —\",\n \" the concrete task follows the clause.\",\n \"\",\n \"Approved style exemplars (production bank):\",\n SIO_EXEMPLARS.map((e) => \"- \" + e).join(\"\\n\"),\n \"\",\n JSON_ONLY,\n ].join(\"\\n\");\n const kwContext = concepts\n .map((c) => \"- \" + c.id + \" (\" + c.name + \"): \" + ((c.keywords ?? []).slice(0, 10).join(\", \") || \"(none listed — use concrete constructs of \" + techStack + \")\"))\n .join(\"\\n\");\n for (const batch of chunkConcepts(concepts, LO_BATCH_SIZE)) {\n const batchKw = batch\n .map((c) => \"- \" + c.id + \" (\" + c.name + \"): \" + ((c.keywords ?? []).slice(0, 10).join(\", \") || \"(none listed — use concrete constructs of \" + techStack + \")\"))\n .join(\"\\n\");\n const batchCioCtx = batch\n .map((c) => \"- \" + c.id + \" (\" + c.name + \"): CIO=\" + (cioByConcept[c.id] || \"(missing)\") + \" | ULO=\" + (uloByConcept[c.id] || \"(missing)\"))\n .join(\"\\n\");\n const batchSioUser = [\n \"Target technology: \" + techStack,\n \"\",\n \"Concept keywords (each SIO item MUST contain at least one of its concept's keywords):\",\n batchKw,\n \"\",\n \"Approved CIOs and ULOs:\",\n batchCioCtx,\n \"\",\n \"Return JSON:\",\n '{\"sios\":[{\"concept_id\":\"C1\",\"sio\":[\"...\",\"...\"]}]}',\n ].join(\"\\n\");\n const sioRes = await chatJson(client, sioSystem, batchSioUser);\n for (const x of (sioRes.sios ?? []) as Array<{ concept_id?: string; sio?: string[] }>) {\n if (x.concept_id && Array.isArray(x.sio)) sioByConcept[x.concept_id] = x.sio.map((item) => standardStatement(String(item)));\n }\n }\n for (const c of concepts) {\n if (!sioByConcept[c.id] || sioByConcept[c.id].length === 0) {\n warnings.push(\"Phase C: no SIO generated for \" + c.id + \" — kept empty (audit will fail)\");\n sioByConcept[c.id] = [];\n }\n }\n\n // ── Deterministic audit + one targeted repair round (fail-closed) ──\n const conceptIds = concepts.map((c) => c.id);\n const auditOnce = (): DepthLayerAudit[] =>\n auditDepthLayers(concepts.map((c) => ({\n id: c.id,\n name: c.name,\n keywords: c.keywords ?? [],\n ulo: uloByConcept[c.id],\n cio: cioByConcept[c.id],\n sio: sioByConcept[c.id],\n })));\n let audits = auditOnce();\n const repairRound = async (round: number): Promise<boolean> => {\n const failingNow = audits.filter((a) => !a.passed);\n if (failingNow.length === 0) return false;\n if (round > 1) warnings.push(\"Depth audit repair round \" + round + \": \" + failingNow.length + \" concept(s) still failing\");\n const failing = failingNow;\n {\n warnings.push(\"Depth audit: \" + failing.length + \"/\" + concepts.length + \" concepts failed first audit — targeted repair\");\n const repairTargets = failing.map((a) => {\n const c = concepts.find((x) => x.id === a.conceptId);\n const issues: string[] = [];\n if (a.uloHasTechSignals) issues.push(\"ULO names concrete technology (remove: \" + a.uloTechSignals.join(\", \") + \")\");\n if (a.uloHasImplementationVerbs) issues.push(\"ULO reads as an implementation task (rewrite as WHAT+WHY competency)\");\n for (const item of a.sioUnboundItems) issues.push(\"SIO not keyword-bound: \" + excerpt(item, 120));\n for (const item of a.sioOffConceptItems) issues.push(\"SIO does not reference any of this concept's keywords (\" + (c?.keywords ?? []).join(\", \") + \"): \" + excerpt(item, 120));\n for (const item of a.sioNotCompletable) issues.push(\"SIO not a completable task: \" + excerpt(item, 120));\n if (!a.concretenessIncreases) issues.push(\"SIO is not more concrete than the ULO — bind it to concrete constructs\");\n return {\n concept_id: a.conceptId,\n name: c?.name ?? a.conceptId,\n keywords: c?.keywords ?? [],\n current: { ulo: uloByConcept[a.conceptId], cio: cioByConcept[a.conceptId], sio: sioByConcept[a.conceptId] },\n issues,\n };\n });\n const repairSystem = [\n \"You repair depth-layer learning objectives that failed a deterministic contract audit.\",\n \"For each concept, rewrite ONLY the layers mentioned in issues, keeping the others as-is.\",\n \"Contract:\",\n \"- ULO: WHAT+WHY, concept-bound, technology-agnostic, Remember/Understand verbs.\",\n \"- CIO: HOW mechanism, technology-agnostic, more concrete than ULO, Marr 2-Language neutral.\",\n \"- SIO: keyword-bound completable implementation tasks naming real constructs of \" + techStack + \".\",\n \"- BINDING RULE: every SIO item must contain at least one of the concept's listed keywords VERBATIM (copy the exact keyword text into the sentence).\",\n \"- COMPLETABILITY RULE: every SIO item must contain an actionable verb (build, create, implement, write, configure, parse, validate, handle, store, load, run, read, fetch, display, generate, format, convert, test, debug, trace, measure, design, structure, select, filter, sort, map, reduce, catch, throw, migrate, deploy, query, index, cache, stream, inspect) or wrap a concrete construct in backticks — abstract verbs (understand, learn, know, grasp, explore, appreciate) always fail.\",\n \"\",\n JSON_ONLY,\n ].join(\"\\n\");\n const repairUser = [\n \"Failing concepts:\",\n JSON.stringify(repairTargets, null, 2),\n \"\",\n \"Return the FULL repaired set for these concepts in the same 3-layer JSON shape:\",\n '{\"repairs\":[{\"concept_id\":\"C1\",\"ulo\":\"...\",\"cio\":\"...\",\"sio\":[\"...\"]}]}',\n ].join(\"\\n\");\n try {\n const repairRes = await chatJson(client, repairSystem, repairUser);\n for (const r of (repairRes.repairs ?? []) as Array<{ concept_id?: string; ulo?: string; cio?: string; sio?: string[] }>) {\n if (!r.concept_id) continue;\n if (r.ulo) uloByConcept[r.concept_id] = standardStatement(r.ulo);\n if (r.cio) cioByConcept[r.concept_id] = standardStatement(r.cio);\n if (Array.isArray(r.sio) && r.sio.length > 0) sioByConcept[r.concept_id] = r.sio.map((t) => standardStatement(String(t)));\n }\n audits = auditOnce();\n } catch (err) {\n warnings.push(\"Depth repair round failed: \" + (err instanceof Error ? err.message : String(err)));\n }\n }\n return audits.every((a) => a.passed);\n };\n for (let round = 1; round <= 2; round++) {\n const allPass = await repairRound(round);\n if (allPass) break;\n }\n\n const stillFailing = audits.filter((a) => !a.passed);\n if (stillFailing.length > 0) {\n // Deterministic debug dump: inspect what the LLM actually wrote before failing.\n try {\n const { mkdirSync, writeFileSync } = await import(\"node:fs\");\n const dumpDir = (await import('node:os')).tmpdir() + '/domain-kit-debug/';\n mkdirSync(dumpDir, { recursive: true });\n writeFileSync(dumpDir + \"depth-audit-debug.json\", JSON.stringify(\n stillFailing.map((a) => ({ audit: a, ulo: uloByConcept[a.conceptId], cio: cioByConcept[a.conceptId], sio: sioByConcept[a.conceptId] })), null, 2));\n } catch { /* dump is best-effort */ }\n const detail = stillFailing.map((a) => a.conceptId + \"[\" + (a.uloHasTechSignals ? \"ulo-tech \" : \"\") + (a.uloHasImplementationVerbs ? \"ulo-impl \" : \"\") + (a.sioUnboundItems.length ? \"sio-unbound \" : \"\") + (a.sioNotCompletable.length ? \"sio-incomplete\" : \"\") + \"]\").join(\", \");\n throw new Error(\n \"Depth-layer contract audit failed after repair for: \" + detail +\n \" — regenerate or fix the prompt contract (fail-closed, no silent fallback)\"\n );\n }\n\n return { uloByConcept, cioByConcept, sioByConcept, audits, warnings };\n}\n","/**\n * knowledgeTreeCatalog.ts — loads the mlo-knowledge-tree TSV (CONCEPT/TOPIC/\n * CATEGORY/SUBJECT/FIELD rows) and exposes the deterministic half of concept\n * standardization:\n * - full CATEGORY / TOPIC listings for the LLM relevance pre-selection\n * - topic->category resolution (CONCEPT rows only carry topic codes)\n * - filtering tree concepts by selected categories/topics (+ a keyword\n * overlap safety net so strong individual matches are never filtered out)\n * - prerequisite codes per concept (prerequisite_concept_codes column)\n *\n * No LLM here: this module is pure data shaping.\n */\nimport { readFileSync } from 'node:fs';\n\nexport interface TreeConcept {\n code: string;\n name: string;\n description: string;\n keywords: string[];\n topicCodes: string[];\n categoryCodes: string[];\n prerequisiteCodes: string[];\n}\n\nexport interface TreeCatalog {\n path: string;\n concepts: TreeConcept[];\n /** category code -> name */\n categories: Map<string, string>;\n /** topic code -> { name, categoryCodes } */\n topics: Map<string, { name: string; categoryCodes: string[] }>;\n}\n\nfunction cell(v: string | undefined): string[] {\n return (v || '').split(',').map((s) => s.trim()).filter(Boolean);\n}\n\nexport function loadKnowledgeTreeCatalog(tsvPath: string): TreeCatalog {\n const text = readFileSync(tsvPath, 'utf8');\n const lines = text.split('\\n').filter((l) => l.trim().length > 0);\n if (lines.length === 0) throw new Error('Knowledge tree TSV is empty: ' + tsvPath);\n const header = lines[0].split('\\t').map((h) => h.trim());\n const col = (name: string): number => header.indexOf(name);\n const iT = col('item_type');\n const iC = col('code');\n const iN = col('name');\n const iD = col('description');\n const iCat = col('category_codes');\n const iTpc = col('topic_codes');\n const iPre = col('prerequisite_concept_codes');\n const iKw = col('keywords');\n for (const [name, idx] of [['item_type', iT], ['code', iC], ['name', iN]] as const) {\n if (idx < 0) throw new Error('Knowledge tree TSV missing column: ' + name);\n }\n const categories = new Map<string, string>();\n const topics = new Map<string, { name: string; categoryCodes: string[] }>();\n const concepts: TreeConcept[] = [];\n for (const line of lines.slice(1)) {\n const c = line.split('\\t');\n const type = (c[iT] || '').trim();\n const code = (c[iC] || '').trim();\n const name = (c[iN] || '').trim();\n if (!code || !name) continue;\n if (type === 'CATEGORY') categories.set(code, name);\n if (type === 'TOPIC') topics.set(code, { name, categoryCodes: cell(c[iCat]) });\n if (type !== 'CONCEPT') continue;\n const topicCodes = cell(c[iTpc]);\n // CONCEPT rows carry topic codes only — resolve categories via the topic map\n const categoryCodes = new Set<string>();\n for (const t of topicCodes) for (const cc of topics.get(t)?.categoryCodes || []) categoryCodes.add(cc);\n concepts.push({\n code,\n name,\n description: (c[iD] || '').trim(),\n keywords: cell(c[iKw]),\n topicCodes,\n categoryCodes: [...categoryCodes],\n prerequisiteCodes: cell(c[iPre]),\n });\n }\n if (concepts.length === 0) throw new Error('Knowledge tree TSV has no CONCEPT rows: ' + tsvPath);\n return { path: tsvPath, concepts, categories, topics };\n}\n\nfunction tokens(s: string): Set<string> {\n return new Set(\n s.toLowerCase().replace(/[^a-z0-9\\s-]/g, ' ').split(/\\s+/).filter((w) => w.length >= 4),\n );\n}\n\n/**\n * Deterministic filter AFTER the LLM picked relevant categories/topics:\n * keep concepts whose topic or category was selected. Concepts with a strong\n * individual keyword overlap are ALWAYS kept (safety net against a missed\n * category). Returns [] only when the selection is empty.\n */\nexport function filterBySelection(\n catalog: TreeCatalog,\n selectedCategories: string[],\n selectedTopics: string[],\n analysisConcepts: Array<{ name: string; keywords: string[] }>,\n maxConcepts = 120,\n): TreeConcept[] {\n const tps = new Set(selectedTopics.map((c) => c.trim().toUpperCase()).filter(Boolean));\n const cats = new Set(selectedCategories.map((c) => c.trim().toUpperCase()).filter(Boolean));\n const probe = analysisConcepts.map((c) => tokens(c.name + ' ' + c.keywords.join(' ')));\n const probeAll = new Set<string>();\n for (const p of probe) for (const w of p) probeAll.add(w);\n const inSelection = (tc: TreeConcept): boolean =>\n tc.topicCodes.some((t) => tps.has(t)) || tc.categoryCodes.some((c) => cats.has(c));\n const overlapScore = (tc: TreeConcept): number => {\n const tcTok = tokens(tc.name + ' ' + tc.description.slice(0, 300) + ' ' + tc.keywords.join(' '));\n let overlap = 0;\n for (const w of tcTok) if (probeAll.has(w)) overlap++;\n const kwDirect = tc.keywords.filter((k) => {\n const kl = k.toLowerCase();\n return [...probeAll].some((w) => w === kl || (w.length >= 5 && kl.includes(w)));\n }).length;\n return overlap * 2 + kwDirect * 3;\n };\n const kept = catalog.concepts.filter((tc) => inSelection(tc) || overlapScore(tc) >= 6);\n return kept\n .map((tc) => ({ tc, s: overlapScore(tc) }))\n .sort((a, b) => b.s - a.s)\n .slice(0, maxConcepts)\n .map((x) => x.tc);\n}\n\n/** Compact rendering for the standardization prompt. */\nexport function renderShortlist(shortlist: TreeConcept[]): string {\n return shortlist\n .map((tc) => '- ' + tc.code + ' | ' + tc.name + ' | kw: ' + tc.keywords.slice(0, 8).join(', ') +\n (tc.prerequisiteCodes.length ? ' | prereqs: ' + tc.prerequisiteCodes.join(',') : ''))\n .join('\\n');\n}\n\n/** Category + topic listing for the LLM relevance pre-selection prompt. */\nexport function renderCategoryTopicIndex(catalog: TreeCatalog): string {\n const topicToConcepts = new Map<string, number>();\n for (const tc of catalog.concepts) for (const t of tc.topicCodes) topicToConcepts.set(t, (topicToConcepts.get(t) || 0) + 1);\n const byCat = new Map<string, string[]>();\n for (const [code, info] of catalog.topics) {\n for (const cat of info.categoryCodes) {\n const arr = byCat.get(cat) || [];\n arr.push(code + ' ' + info.name + ' (' + (topicToConcepts.get(code) || 0) + ' concepts)');\n byCat.set(cat, arr);\n }\n }\n const out: string[] = [];\n for (const [code, name] of catalog.categories) {\n out.push('CATEGORY ' + code + ' — ' + name);\n for (const t of byCat.get(code) || []) out.push(' TOPIC: ' + t);\n }\n return out.join('\\n');\n}\n","/**\n * conceptStandardizer.ts — STEP 2.5 of the concept identification flow:\n *\n * 1. keywords -> escalate -> concepts (upstream STEP_6, unchanged)\n * 2. HERE: LLM-driven standardization against the knowledge-tree catalog\n * (category pre-filtered), producing:\n * - standardized concepts: adopt the tree code + tree keywords +\n * tree prerequisite codes (seed)\n * - proposed NEW concepts: kept OUT of the standard code namespace,\n * written to a separate proposals artifact for later merge\n * - ambiguous matches: treated as proposed_new with possible_tree_matches\n * 3. downstream steps use the standardized/proposed codes (fail-closed)\n *\n * The SEMANTIC decision is the LLM's. Code only validates the contract\n * (fail-closed) and writes artifacts.\n */\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport type { LlmClient } from '../utils/llmClient';\nimport {\n loadKnowledgeTreeCatalog,\n filterBySelection,\n renderShortlist,\n renderCategoryTopicIndex,\n type TreeCatalog,\n} from './knowledgeTreeCatalog';\n\nexport interface StandardizeInput {\n id: string;\n name: string;\n description: string;\n keywords: string[];\n}\n\nexport interface StandardizationDecision {\n id: string;\n decision: 'standardized' | 'proposed_new';\n tree_code?: string;\n note?: string;\n proposed_code?: string;\n proposed_definition?: string;\n possible_tree_matches?: string[];\n /** LLM-selected subset of the tree concept's keywords that fit the course tech stack. */\n adopted_keywords?: string[];\n}\n\nexport interface StandardizationResult {\n decisions: StandardizationDecision[];\n proposals: Array<Record<string, unknown>>;\n warnings: string[];\n shortlistSize: number;\n catalogSize: number;\n}\n\nconst JSON_ONLY =\n 'Return ONLY a JSON object, no markdown fences, no commentary.';\n\nfunction parseJsonBlock(text: string): unknown {\n const start = text.indexOf('{');\n const end = text.lastIndexOf('}');\n if (start < 0 || end <= start) throw new Error('LLM standardization response has no JSON object');\n return JSON.parse(text.slice(start, end + 1));\n}\n\n/**\n * Standardize analysis concepts against the tree.\n * Throws (fail-closed) when the LLM leaves a concept undecided or the tree\n * cannot be loaded.\n */\nexport async function standardizeConcepts(opts: {\n client: LlmClient;\n concepts: StandardizeInput[];\n catalog: TreeCatalog;\n techStack?: string;\n proposalsPath?: string;\n onProgress?: (step: string, message: string) => void;\n}): Promise<StandardizationResult> {\n const { client, catalog, techStack = 'python', proposalsPath } = opts;\n const log = opts.onProgress ?? (() => {});\n const warnings: string[] = [];\n\n // ── Stage A (LLM): which categories/topics could be relevant? ──\n const hasTopics = catalog.topics.size > 0;\n const selSystem = [\n 'You pre-select relevant areas of an institutional knowledge tree before a detailed concept alignment pass.',\n hasTopics\n ? 'Given the analysis concepts, pick the TOPICS that could contain matching concepts. Concepts are filed under topics, so topics are the filter dimension.'\n : 'Given the analysis concepts, pick the CATEGORIES that could contain matching concepts.',\n '- Be generous: missing a relevant topic corrupts the alignment; an extra topic only costs attention.',\n '- Only codes that appear in the index are valid.',\n JSON_ONLY,\n ].join('\\n');\n const selUser = [\n 'ANALYSIS CONCEPTS:',\n opts.concepts.map((c) => '- ' + c.name + ': ' + c.description.slice(0, 160)).join('\\n'),\n '',\n 'KNOWLEDGE TREE INDEX:',\n renderCategoryTopicIndex(catalog),\n '',\n hasTopics\n ? 'Return JSON: {\"relevant_topics\":[\"TOPIC_CODE\"]}'\n : 'Return JSON: {\"relevant_categories\":[\"CATEGORY_CODE\"]}',\n ].join('\\n');\n const selRes = await client.chat(\n [{ role: 'system', content: selSystem }, { role: 'user', content: selUser }],\n { temperature: 0, maxTokens: 4096 },\n );\n const sel = parseJsonBlock(selRes.content) as { relevant_categories?: string[]; relevant_topics?: string[] };\n // ONE filter dimension: topics when the tree files concepts under topics,\n // categories only as fallback. Never both mixed.\n const selTps = hasTopics ? (sel.relevant_topics || []).map(String).filter(Boolean) : [];\n const selCats = hasTopics ? [] : (sel.relevant_categories || []).map(String).filter(Boolean);\n log('STEP_2_5', 'LLM relevance pre-selection (' + (hasTopics ? 'topics' : 'categories') + '): ' + (hasTopics ? selTps.join(',') : selCats.join(',')));\n\n // ── Stage B (deterministic): filter tree concepts by that selection ──\n const shortlist = filterBySelection(catalog, selCats, selTps, opts.concepts);\n log('STEP_2_5', 'Filtered tree concepts: ' + shortlist.length + '/' + catalog.concepts.length + ' shortlisted for alignment');\n if (shortlist.length === 0) throw new Error('Topic/category pre-selection eliminated every tree concept — fail-closed');\n\n const system = [\n 'You align auto-derived learning concepts with an institutional knowledge tree.',\n 'For EACH input concept decide exactly one of:',\n ' 1. \"standardized\" - the concept teaches the SAME underlying knowledge as one tree concept. Applying a tree concept inside a specific product context (e.g. \"File-based persistence in a CLI app\") is STILL the tree concept if the core knowledge matches. Set tree_code to that concept\\'s code.',\n ' Adopt the tree\\'s terminology. Only propose new when the tree genuinely has NO concept teaching that knowledge (broader AND narrower both fail).',\n ' 2. \"proposed_new\" - no tree concept covers it at the same granularity. Propose an UPPER_SNAKE_CASE code (descriptive, stable, max 5 words) and a one-sentence definition.',\n ' If between 1 and 3 tree concepts are CLOSE but not exact, list their codes in possible_tree_matches for human review.',\n 'For a \"standardized\" decision ALSO return \"adopted_keywords\": the subset of that tree concept\\'s keywords (from the shortlist) that make sense for the course TECH STACK. Drop keywords that name tooling from other ecosystems (e.g. JS test runners for a Python course) — keep conceptual keywords even when spelled generically. Maximum 8, ordered most-relevant first.',\n 'Rules:',\n '- Judge by MEANING (definition + keywords), not by string similarity.',\n '- COVERAGE RULE: a \"standardized\" match must cover ALL primary dimensions of the input concept — every distinct aspect named in its title or description. A tree concept covering only ONE of several aspects (e.g. \"interpreting error messages\" for a concept about error handling AND user experience) is a PARTIAL match: decide \"proposed_new\" and list that tree code in possible_tree_matches.',\n '- Context-specific wording does NOT make a new concept: new concept = knowledge absent from the tree, not knowledge applied elsewhere.',\n '- Every input concept MUST receive exactly one decision. Never merge two input concepts into one tree code.',\n '- Prefer proposed_new over a wrong standardized match: a false match corrupts the curriculum.',\n JSON_ONLY,\n ].join('\\n');\n\n const user = [\n 'TECH STACK: ' + techStack,\n '',\n 'ANALYSIS CONCEPTS (to standardize):',\n JSON.stringify(opts.concepts.map((c) => ({ id: c.id, name: c.name, description: c.description.slice(0, 300), keywords: c.keywords.slice(0, 12) })), null, 1),\n '',\n 'KNOWLEDGE TREE SHORTLIST (pre-filtered, ' + shortlist.length + ' candidate concepts):',\n renderShortlist(shortlist),\n '',\n 'Return JSON: {\"decisions\":[{\"id\":\"<input id>\",\"decision\":\"standardized\",\"tree_code\":\"TREE_CODE\",\"adopted_keywords\":[\"kw1\",\"kw2\"],\"note\":\"one sentence\"},',\n ' {\"id\":\"<input id>\",\"decision\":\"proposed_new\",\"proposed_code\":\"PROPOSED_CODE\",\"proposed_definition\":\"...\",\"possible_tree_matches\":[\"CODE\"]}]}',\n ].join('\\n');\n\n const res = await client.chat(\n [{ role: 'system', content: system }, { role: 'user', content: user }],\n { temperature: 0, maxTokens: 8192 },\n );\n log('STEP_2_5', 'Standardization response received (provider ' + (res as unknown as { provider?: string }).provider + ')');\n\n const parsed = parseJsonBlock(res.content) as { decisions?: StandardizationDecision[] };\n const decisions = parsed.decisions ?? [];\n const byId = new Map(decisions.map((d) => [String(d.id), d]));\n\n const finalDecisions: StandardizationDecision[] = [];\n const proposals: Array<Record<string, unknown>> = [];\n for (const c of opts.concepts) {\n const d = byId.get(c.id);\n if (!d || (d.decision !== 'standardized' && d.decision !== 'proposed_new')) {\n // fail-closed: undecided concept cannot silently keep a nonstandard code\n throw new Error('Concept ' + c.id + ' (' + c.name + ') has no standardization decision — fail-closed');\n }\n if (d.decision === 'standardized') {\n const tc = catalog.concepts.find((x) => x.code === d.tree_code);\n if (!tc) throw new Error('Concept ' + c.id + ' standardized to unknown tree code ' + d.tree_code + ' — fail-closed');\n // adopted_keywords must come from the tree concept's own keywords — an\n // invented token would silently corrupt the registry (fail-closed).\n const treeKw = new Set(tc.keywords.map((k) => k.toLowerCase()));\n const adopted = (d.adopted_keywords || []).map((k) => String(k)).filter((k) => {\n if (treeKw.has(k.toLowerCase())) return true;\n throw new Error('Concept ' + c.id + ' adopted keyword \"' + k + '\" not in tree concept ' + tc.code + ' — fail-closed');\n });\n if (tc.keywords.length > 0 && adopted.length === 0) {\n throw new Error('Concept ' + c.id + ' standardized to ' + tc.code + ' without adopted_keywords — fail-closed');\n }\n finalDecisions.push({ ...d, id: c.id, tree_code: tc.code, adopted_keywords: adopted });\n warnings.push('Concept ' + c.id + ' standardized as ' + tc.code + ' (' + tc.name + '), adopted keywords: ' + adopted.join(', ') + (d.note ? ' — ' + d.note : ''));\n } else {\n const code = (d.proposed_code || '').toUpperCase().replace(/[^A-Z0-9_]/g, '_');\n if (!/^[A-Z][A-Z0-9_]*$/.test(code)) {\n throw new Error('Concept ' + c.id + ' proposed invalid code \"' + d.proposed_code + '\" — fail-closed');\n }\n finalDecisions.push({ ...d, id: c.id, proposed_code: code });\n proposals.push({\n code,\n name: c.name,\n description: d.proposed_definition || c.description.slice(0, 300),\n keywords: c.keywords,\n subject_codes: 'PY',\n category_codes: '',\n topic_codes: '',\n prerequisite_concept_codes: [],\n status: 'proposed',\n source_concept_id: c.id,\n possible_tree_matches: (d.possible_tree_matches || []).filter(Boolean),\n });\n warnings.push('Concept ' + c.id + ' proposed as NEW: ' + code + (d.possible_tree_matches?.length ? ' (near matches: ' + d.possible_tree_matches.join(', ') + ')' : ''));\n }\n }\n\n // Persist proposals separately for the later merge (never in the standard namespace)\n const outPath = proposalsPath || join(tmpdir(), 'domain-kit-debug', 'concept-proposals.json');\n try {\n mkdirSync(outPath.slice(0, outPath.lastIndexOf('/')), { recursive: true });\n writeFileSync(outPath, JSON.stringify({ generated_at: new Date().toISOString(), proposals }, null, 2));\n log('STEP_2_5', 'Proposals written: ' + proposals.length + ' -> ' + outPath);\n } catch (e) {\n warnings.push('Could not write proposals artifact: ' + (e instanceof Error ? e.message : String(e)));\n }\n\n return { decisions: finalDecisions, proposals, warnings, shortlistSize: shortlist.length, catalogSize: catalog.concepts.length };\n}\n","/**\n * Knowledge Graph Pipeline — generates knowledge_graph for concept-driven learning.\n *\n * Input: syllabus text, subject description, grade band\n * Output: KnowledgeGraph with concepts, problem_types, prerequisites, learning_path\n *\n * Includes:\n * - Cycle detection in prerequisite chains\n * - Topological sort for learning_path\n * - Multi-language syllabus support\n * - ULO/CIO/SIO depth control per concept\n */\n\nimport { assignConceptCodes, techTagFor, uloCode, cioCode, sioCode, cioActionSlug } from \"./loCodeStandard.js\";\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\nimport type { KnowledgeGraph, Concept, ConceptCategory, LearningPathStep } from '../schemas/knowledgeGraphSchema';\nimport { parseSyllabus, type ParsedSyllabus } from '../parsers/syllabusParser';\nimport {\n verifyKnowledgeGraph,\n detectPrerequisiteCycles,\n breakPrerequisiteCycles,\n type KnowledgeGraphVerificationReport,\n} from './knowledgeGraphVerifier';\n\nexport interface KnowledgeGraphPipelineOptions {\n subject: string;\n description?: string;\n syllabusText?: string;\n parsedSyllabus?: ParsedSyllabus;\n gradeBand?: [number, number];\n domain?: string;\n /** Target technology for SIO keyword binding (e.g. \"python\", \"swift\"); auto-detected fallback applies. */\n techStack?: string;\n llmConfig?: LlmClientConfig;\n onProgress?: (step: string, message: string) => void;\n /** Path to mlo-knowlege-tree.tsv. When provided, STEP_2_5 standardizes every concept against the tree (fail-closed). */\n knowledgeTreePath?: string;\n /** Where to persist proposed-new concepts for the later merge. Default: tmpdir/domain-kit-debug/concept-proposals.json */\n proposalsPath?: string;\n}\n\nexport interface KnowledgeGraphPipelineResult {\n knowledgeGraph: KnowledgeGraph;\n warnings: string[];\n verificationReport?: KnowledgeGraphVerificationReport;\n}\nimport { auditDepthLayers } from './depthAudit';\nimport { authorDepthLayersHierarchically } from './hierarchicalLoAuthoring';\nimport { loadKnowledgeTreeCatalog } from './knowledgeTreeCatalog';\nimport { standardizeConcepts } from './conceptStandardizer';\n\n\n// ─── Topological Sort ────────────────────────────────────────────────────────\n\n\n/**\n * Topological sort using Kahn's algorithm.\n * Returns sorted concept IDs, or throws if there's still a cycle.\n */\nfunction topologicalSort(concepts: Concept[]): string[] {\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n for (const concept of concepts) {\n inDegree.set(concept.id, 0);\n adjacency.set(concept.id, []);\n }\n\n for (const concept of concepts) {\n for (const prereq of concept.prerequisites || []) {\n // prereq → concept (prereq must come before concept)\n adjacency.get(prereq)?.push(concept.id);\n inDegree.set(concept.id, (inDegree.get(concept.id) || 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const [id, degree] of inDegree) {\n if (degree === 0) queue.push(id);\n }\n\n const sorted: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(current);\n\n for (const neighbor of adjacency.get(current) || []) {\n const newDegree = (inDegree.get(neighbor) || 1) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) queue.push(neighbor);\n }\n }\n\n if (sorted.length !== concepts.length) {\n // Still has cycle after breaking — shouldn't happen, but log warning\n console.warn(`[WARN] Topological sort incomplete: ${sorted.length}/${concepts.length} concepts sorted`);\n }\n\n return sorted;\n}\n\n// ─── ULO/CIO/SIO Depth Estimation ────────────────────────────────────────────\n\n/**\n * Estimate ULO/CIO/SIO depth level for a concept based on:\n * - Number of prerequisites (more prereqs = deeper concept)\n * - Bloom level of associated problem types\n * - Position in learning path (earlier = more foundational)\n */\nfunction estimateConceptDepth(\n concept: Concept,\n position: number,\n totalConcepts: number,\n): { suggestedDepth: 'ulo' | 'cio' | 'sio'; rationale: string } {\n const prereqCount = (concept.prerequisites || []).length;\n const problemTypes = concept.problem_types || [];\n const maxBloom = problemTypes.reduce((max, pt) => {\n const levels = ['Remember', 'Understand', 'Apply', 'Analyze', 'Evaluate', 'Create'];\n const idx = levels.indexOf(pt.bloom_level || 'Understand');\n return idx > max ? idx : max;\n }, 0);\n\n // Position ratio: 0 = first concept, 1 = last concept\n const positionRatio = totalConcepts > 1 ? position / (totalConcepts - 1) : 0;\n\n // Score: higher = deeper\n const depthScore = (prereqCount * 0.3) + (maxBloom * 0.15) + (positionRatio * 0.3);\n\n if (depthScore < 0.3) {\n return { suggestedDepth: 'ulo', rationale: `Low complexity (${prereqCount} prereqs, bloom=${maxBloom}, position=${(positionRatio * 100).toFixed(0)}%)` };\n } else if (depthScore < 0.6) {\n return { suggestedDepth: 'cio', rationale: `Medium complexity (${prereqCount} prereqs, bloom=${maxBloom}, position=${(positionRatio * 100).toFixed(0)}%)` };\n } else {\n return { suggestedDepth: 'sio', rationale: `High complexity (${prereqCount} prereqs, bloom=${maxBloom}, position=${(positionRatio * 100).toFixed(0)}%)` };\n }\n}\n\n// ─── Main Pipeline ───────────────────────────────────────────────────────────\n\n/**\n * Generate a KnowledgeGraph from syllabus/description via LLM.\n */\nexport async function generateKnowledgeGraph(\n options: KnowledgeGraphPipelineOptions,\n): Promise<KnowledgeGraphPipelineResult> {\n const { subject, description, syllabusText, gradeBand, domain, techStack, llmConfig, onProgress } = options;\n const warnings: string[] = [];\n\n const log = (step: string, msg: string) => {\n console.log(`[KG-${step}] ${msg}`);\n onProgress?.(step, msg);\n };\n\n // ─── Step 1: Decompose subject into concepts ─────────────────────────────\n log('STEP_1', 'Decomposing subject into concepts...');\n\n let parsedSyllabus = options.parsedSyllabus;\n if (!parsedSyllabus && syllabusText) {\n parsedSyllabus = parseSyllabus(syllabusText);\n log('STEP_1', `Parsed syllabus: ${parsedSyllabus.units.length} units, ${parsedSyllabus.allTopics.length} topics`);\n }\n\n const client = createLlmClient(llmConfig);\n\n // Truncate syllabus with warning\n const maxSyllabusChars = parseInt(process.env.KG_MAX_SYLLABUS_CHARS || '16000', 10);\n let truncatedSyllabus = '';\n if (syllabusText) {\n if (syllabusText.length > maxSyllabusChars) {\n truncatedSyllabus = syllabusText.slice(0, maxSyllabusChars);\n warnings.push(`Syllabus truncated from ${syllabusText.length} to ${maxSyllabusChars} chars — may miss some concepts`);\n } else {\n truncatedSyllabus = syllabusText;\n }\n }\n\n const structuredTopicsGuide = parsedSyllabus && parsedSyllabus.allTopics.length > 0\n ? `\\nSTRUCTURED SYLLABUS TOPICS (Every topic MUST map to at least one concept to ensure 100% syllabus coverage):\\n`\n + parsedSyllabus.allTopics.map((t) => `- [${t.unitTitle}] ${t.id}: ${t.title} (Keywords: ${t.keywords.join(', ')})`).join('\\n') + '\\n'\n : '';\n\n const systemPrompt = (\n 'You are an expert curriculum designer. Decompose the given subject into a structured '\n + 'knowledge graph with concepts, prerequisites, and problem types.\\n\\n'\n + 'CRITICAL RULES:\\n'\n + '1. Each concept MUST have the three depth layers, authored against this CONTRACT:\\n'\n + ' - ulo (WHAT + WHY): bound to the CONCEPT\\u0027s intrinsic NATURE. It explains what the\\n'\n + ' concept is and why it exists — the problem it solves in principle. It must be\\n'\n + ' TECHNOLOGY-AGNOSTIC: never name a concrete library, API, function, file format,\\n'\n + ' tool or language feature. Typical assessment level: Remember / Understand.\\n'\n + ' - cio (HOW): the MECHANISM — how the concept works and solves that problem, step\\n'\n + ' by step. Still bound to the concept\\u0027s nature: more concrete than the ULO, but\\n'\n + ' NOT tied to one specific technology (no concrete API names). CIO capability is\\n'\n + ' assessed INDIRECTLY, through completing contextual work, not in isolation.\\n'\n + ' - sio (IMPLEMENTATION): an array of 2-4 items. EVERY item MUST reference concrete\\n'\n + ' KEYWORDS/technologies (a real API, function, module, file, or named pattern) and\\n'\n + ' describe a completable, context-specific implementation task. Application,\\n'\n + ' Analysis and Creation skills are assessed INDIRECTLY through completing these\\n'\n + ' items. There is NO fixed Bloom ceiling for a layer — but concreteness MUST\\n'\n + ' strictly increase: SIO more technology-bound than CIO, CIO more concrete than ULO.\\n'\n + ' - prerequisites: concept IDs that must be learned first (MUST NOT create cycles)\\n'\n + ' - problem_types: 2-4 problem types with bloom_level and difficulty. Remember and\\n'\n + ' Understand problem types test the ULO/CIO directly; Apply-and-above types are\\n'\n + ' proxies for SIO completion in context.\\n'\n + ' - techniques: methods, formulas, tools\\n'\n + '2. Prerequisite chains MUST be acyclic (no concept can depend on itself or create a loop)\\n'\n + '3. Concepts should be ordered by prerequisite dependency (topological sort)\\n'\n + '4. Problem types should range from Remember to Apply (not all at same level)\\n'\n + '5. Group concepts into categories (chapters/sections)\\n'\n + '6. ALL text in ENGLISH (even if input is Vietnamese)\\n'\n + '7. NEVER invent concepts not present in the syllabus\\n'\n + '8. Return JSON matching the KnowledgeGraphSchema'\n );\n\n const userPrompt = `Subject: ${subject}\\n${description ? `Description: ${description}` : ''}\\n${structuredTopicsGuide}${truncatedSyllabus ? `Syllabus:\\n${truncatedSyllabus}` : ''}\\n${gradeBand ? `Grade band: ${gradeBand[0]}-${gradeBand[1]}` : ''}\\n${domain ? `Domain: ${domain}` : ''}\\n\\nReturn JSON:\\n{\\n \"subject\": {\\n \"id\": \"${subject.toLowerCase().replace(/\\s+/g, '-').slice(0, 30)}\",\\n \"name\": \"${subject}\",\\n \"description\": \"...\",\\n \"domain\": \"${domain || 'other'}\",\\n \"grade_band\": ${gradeBand ? `[${gradeBand[0]}, ${gradeBand[1]}]` : '[6, 12]'}\\n },\\n \"concepts\": [\\n {\\n \"id\": \"C1\",\\n \"name\": \"Concept name\",\\n \"description\": \"Brief description\",\\n \"category\": \"category_id\",\\n \"ulo\": \"WHAT + WHY in technology-agnostic language: what the concept is and the problem it exists to solve. No library/API/tool names.\",\\n \"cio\": \"HOW the mechanism works, still technology-agnostic but more concrete than the ULO.\",\\n \"sio\": [\"Concrete task naming a REAL API/function/module/file from the target technology, completable end to end\", \"Another technology-bound task using a different concrete keyword\"],\\n \"prerequisites\": [],\\n \"estimated_minutes\": 30,\\n \"problem_types\": [\\n {\\n \"id\": \"PT-C1-01\",\\n \"name\": \"Problem type name\",\\n \"description\": \"What this problem type tests\",\\n \"bloom_level\": \"Remember\",\\n \"difficulty\": \"easy\",\\n \"estimated_minutes\": 10\\n }\\n ],\\n \"techniques\": [\"technique 1\", \"technique 2\"],\\n \"common_mistakes\": [\"mistake 1\"]\\n }\\n ],\\n \"categories\": [\\n {\\n \"id\": \"cat1\",\\n \"name\": \"Category name\",\\n \"description\": \"Category description\",\\n \"concept_ids\": [\"C1\", \"C2\"],\\n \"order\": 1\\n }\\n ],\\n \"learning_path\": [\\n {\"concept_id\": \"C1\", \"order\": 1, \"depends_on\": []},\\n {\"concept_id\": \"C2\", \"order\": 2, \"depends_on\": [\"C1\"]}\\n ]\\n}`;\n\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: parseInt(process.env.KG_MAX_TOKENS || '65536', 10),\n });\n\n // ─── Step 2: Validate and clean ──────────────────────────────────────────\n log('STEP_2', 'Validating and cleaning knowledge graph...');\n\n const concepts = (result.concepts || []) as Concept[];\n const categories = (result.categories || []) as ConceptCategory[];\n // Keyword registry (fail-closed): every concept MUST carry a non-empty\n // keyword set — it drives the keyword-progression ledger and the SIO binding\n // audit downstream. LLM output is top-up (description tokens), never empty.\n {\n const STOP = new Set(['and', 'the', 'for', 'with', 'from', 'that', 'this', 'into', 'when', 'while', 'using', 'their', 'your', 'each', 'how', 'why', 'what', 'between', 'through', 'about']);\n const tokensFrom = (text: string): string[] => text\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, ' ')\n .split(/\\s+/)\n .filter(w => w.length >= 4 && !STOP.has(w));\n for (const c of concepts) {\n const existing = (c.keywords || []).map(k => String(k).trim()).filter(Boolean);\n if (existing.length === 0) {\n const derived = [...new Set([...tokensFrom(c.name), ...tokensFrom(c.description || '')])].slice(0, 5);\n if (derived.length === 0) {\n throw new Error('Concept ' + c.id + ' (' + c.name + ') has no keywords and none could be derived from name/description — fail-closed');\n }\n c.keywords = derived;\n warnings.push('Concept ' + c.id + ': empty keyword set - derived ' + derived.join(', ') + ' from name/description');\n } else {\n c.keywords = existing;\n }\n }\n }\n const rawPath = result.learning_path as Array<Record<string, unknown>> | undefined;\n let learningPath: LearningPathStep[] = (rawPath || []).map((s: Record<string, unknown>) => ({\n concept_id: String(s.concept_id || ''),\n order: Number(s.order || 0),\n depends_on: Array.isArray(s.depends_on) ? s.depends_on.map(String) : [],\n milestone_name: String(s.milestone_name || ''),\n }));\n\n // Validate prerequisites reference existing concepts\n const conceptIds = new Set(concepts.map(c => c.id));\n for (const concept of concepts) {\n for (const prereq of concept.prerequisites || []) {\n if (!conceptIds.has(prereq)) {\n warnings.push(`Concept ${concept.id} references non-existent prerequisite ${prereq} — removed`);\n concept.prerequisites = (concept.prerequisites || []).filter(p => p !== prereq);\n }\n }\n }\n\n // ─── Step 2.5: Standardize concepts against the knowledge tree ───────────\n // keyword -> escalate -> concept (upstream) -> HERE: LLM standardization vs\n // tree catalog (deterministic category pre-filter) -> downstream steps use\n // standardized / proposed codes. Fail-closed.\n if (options.knowledgeTreePath) {\n const catalog = loadKnowledgeTreeCatalog(options.knowledgeTreePath);\n log('STEP_2_5', 'Knowledge tree loaded: ' + catalog.concepts.length + ' concepts from ' + catalog.path.split('/').pop());\n const std = await standardizeConcepts({\n client,\n concepts: concepts.map((c) => ({\n id: c.id,\n name: c.name,\n description: c.description || '',\n keywords: c.keywords || [],\n })),\n catalog,\n techStack,\n proposalsPath: options.proposalsPath,\n onProgress: log,\n });\n warnings.push(...std.warnings);\n const codeByStd = new Map(std.decisions.map((d) => [d.id, d]));\n for (const c of concepts) {\n const d = codeByStd.get(c.id);\n if (!d) throw new Error('Concept ' + c.id + ' missing standardization decision — fail-closed');\n if (d.decision === 'standardized') {\n c.standardization = 'standardized';\n c.tree_code = d.tree_code;\n c.code = d.tree_code;\n const tc = catalog.concepts.find((x) => x.code === d.tree_code);\n if (tc) {\n // Keyword enrichment is LLM-driven: only the keywords the standardizer\n // ADOPTED for this tech stack join the registry (no code-side blacklist).\n for (const k of d.adopted_keywords || []) {\n if (!(c.keywords || []).some((x) => x.toLowerCase() === k.toLowerCase())) {\n c.keywords = [...(c.keywords || []), k];\n }\n }\n c.tree_prerequisites = tc.prerequisiteCodes;\n }\n } else {\n c.standardization = 'proposed_new';\n c.code = d.proposed_code;\n }\n }\n // Seed internal prerequisite edges from the tree's prerequisite codes:\n // only mapped when the referenced tree concept is part of THIS analysis.\n const idByTreeCode = new Map(concepts.filter((c) => c.tree_code).map((c) => [c.tree_code as string, c.id]));\n for (const c of concepts) {\n for (const tp of c.tree_prerequisites || []) {\n const target = idByTreeCode.get(tp);\n if (target && target !== c.id && !(c.prerequisites || []).includes(target)) {\n c.prerequisites = [...(c.prerequisites || []), target];\n warnings.push('Prereq seeded from tree: ' + c.id + ' <- ' + tp + ' (' + target + ')');\n }\n }\n }\n log('STEP_2_5', 'Standardized: ' + std.decisions.filter((d) => d.decision === 'standardized').length\n + ', proposed new: ' + std.decisions.filter((d) => d.decision === 'proposed_new').length);\n }\n\n // ─── Step 3: Cycle Detection ─────────────────────────────────────────────\n log('STEP_3', 'Checking for prerequisite cycles...');\n\n const cycles = detectPrerequisiteCycles(concepts);\n if (cycles.length > 0) {\n log('STEP_3', `Found ${cycles.length} cycle(s) in prerequisite chain — breaking cycles`);\n for (const cycle of cycles) {\n warnings.push(`Cycle detected: ${cycle.join(' → ')} — breaking at weakest edge`);\n }\n\n const { fixed, removed } = breakPrerequisiteCycles(concepts, cycles);\n // Replace concepts with cycle-free versions\n for (let i = 0; i < concepts.length; i++) {\n const fixedConcept = fixed.find(f => f.id === concepts[i].id);\n if (fixedConcept) {\n concepts[i] = { ...concepts[i], prerequisites: fixedConcept.prerequisites };\n }\n }\n\n for (const { from, to } of removed) {\n warnings.push(`Removed prerequisite edge: ${from} → ${to} (cycle breaker)`);\n }\n }\n\n // ─── Step 4: Topological Sort ────────────────────────────────────────────\n log('STEP_4', 'Topological sort of concepts...');\n\n const sortedIds = topologicalSort(concepts);\n\n // Rebuild learning_path from topological sort\n learningPath = sortedIds.map((id, idx) => {\n const concept = concepts.find(c => c.id === id);\n return {\n concept_id: id,\n order: idx + 1,\n depends_on: concept?.prerequisites || [],\n milestone_name: '',\n };\n });\n\n // ─── Step 5: Hierarchical ULO/CIO/SIO authoring (ported from knowledge-tree) ──\n log('STEP_5', 'Authoring ULO/CIO/SIO depth layers hierarchically...');\n\n {\n const lo = await authorDepthLayersHierarchically(\n client,\n concepts.map((c) => ({ id: c.id, name: c.name, description: c.description, keywords: c.keywords })),\n techStack || (domain === 'software' || domain === 'technology' ? 'python' : (domain || 'general')),\n warnings,\n );\n const codeByConceptId = assignConceptCodes(concepts.map((c) => ({ id: c.id, name: c.name })));\n const techTag = techTagFor(techStack || (domain === 'software' || domain === 'technology' ? 'python' : (domain || 'general')));\n for (const concept of concepts) {\n concept.ulo = lo.uloByConcept[concept.id] || concept.ulo || '';\n concept.cio = lo.cioByConcept[concept.id] || concept.cio || '';\n if (lo.sioByConcept[concept.id] && lo.sioByConcept[concept.id].length > 0) {\n concept.sio = lo.sioByConcept[concept.id];\n }\n // Production-standard codes + statement clause (deterministic post-pass).\n // A tree-standardized or proposed code from STEP_2_5 wins — the generated\n // code only fills concepts the standardizer never saw.\n concept.code = concept.code || codeByConceptId[concept.id];\n concept.ulo_code = concept.ulo ? uloCode(concept.code!) : concept.ulo_code;\n concept.cio_code = concept.cio ? cioCode(concept.code!, 1, cioActionSlug(concept.cio)) : concept.cio_code;\n concept.sio_codes = concept.sio.length > 0\n ? concept.sio.map((_, i) => sioCode(techTag, concept.code!, i + 1))\n : concept.sio_codes;\n }\n log('STEP_5', 'Depth layers authored: ' + concepts.length + ' concepts, audit ' +\n (lo.audits.filter((a) => a.passed).length) + '/' + concepts.length + ' passed');\n }\n\n // Validate learning_path references\n for (const step of learningPath) {\n if (!conceptIds.has(step.concept_id)) {\n warnings.push(`Learning path references non-existent concept ${step.concept_id}`);\n }\n }\n\n log('STEP_2', `Validated ${concepts.length} concepts, ${categories.length} categories, ${learningPath.length} learning path steps`);\n\n const rawGraph: KnowledgeGraph = {\n schema_version: 1,\n type: 'knowledge_graph',\n subject: result.subject as KnowledgeGraph['subject'],\n concepts,\n categories,\n learning_path: learningPath,\n };\n\n // ─── Step 6: Verify Knowledge Graph referential integrity and reverse coverage ──\n log('STEP_6', 'Running Knowledge Graph verification & reverse coverage audit...');\n const { verifiedGraph, report } = verifyKnowledgeGraph(rawGraph, parsedSyllabus);\n warnings.push(...report.warnings);\n\n return {\n knowledgeGraph: verifiedGraph,\n warnings,\n verificationReport: report,\n };\n}\n\n","/**\n * Knowledge Graph Pipeline Orchestrator.\n *\n * Runs: Syllabus Parsing -> Knowledge Graph Generation -> Verification -> CurriculumFeed v2 Emission.\n */\n\nimport { generateKnowledgeGraph, type KnowledgeGraphPipelineOptions } from '../graph/knowledgeGraphPipeline';\nimport { parseSyllabus, type ParsedSyllabus } from '../parsers/syllabusParser';\nimport { emitCurriculumFeed } from '../feed/curriculumFeedEmitter';\nimport type { KnowledgeGraph } from '../schemas/knowledgeGraphSchema';\nimport type { CurriculumFeed } from '../schemas/curriculumFeedSchema';\nimport type { KnowledgeGraphVerificationReport } from '../graph/knowledgeGraphVerifier';\n\nexport interface KnowledgePipelineOptions extends KnowledgeGraphPipelineOptions {}\n\nexport interface KnowledgePipelineResult {\n knowledgeGraph: KnowledgeGraph;\n parsedSyllabus?: ParsedSyllabus;\n curriculumFeed: CurriculumFeed;\n verificationReport?: KnowledgeGraphVerificationReport;\n warnings: string[];\n}\n\n/**\n * Run the full concept-driven knowledge graph pipeline.\n */\nexport async function runKnowledgeGraphPipeline(\n options: KnowledgePipelineOptions,\n): Promise<KnowledgePipelineResult> {\n const warnings: string[] = [];\n let parsedSyllabus = options.parsedSyllabus;\n\n if (!parsedSyllabus && options.syllabusText) {\n parsedSyllabus = parseSyllabus(options.syllabusText);\n }\n\n const effectiveSubject = options.subject || parsedSyllabus?.subject.title || 'Untitled Subject';\n const effectiveDomain = options.domain || parsedSyllabus?.subject.domain || 'other';\n const effectiveGradeBand = options.gradeBand || parsedSyllabus?.subject.gradeBand;\n const effectiveDesc = options.description || parsedSyllabus?.subject.description;\n\n const result = await generateKnowledgeGraph({\n ...options,\n subject: effectiveSubject,\n domain: effectiveDomain,\n gradeBand: effectiveGradeBand,\n description: effectiveDesc,\n parsedSyllabus,\n });\n\n warnings.push(...result.warnings);\n\n // Emit normalized CurriculumFeed v2\n const curriculumFeed = emitCurriculumFeed(result.knowledgeGraph, {\n warnings,\n });\n\n return {\n knowledgeGraph: result.knowledgeGraph,\n parsedSyllabus,\n curriculumFeed,\n verificationReport: result.verificationReport,\n warnings,\n };\n}\n","/**\n * Hybrid Graph Pipeline - generates hybrid_graph combining project + knowledge.\n *\n * STEP_1 generates feature-concept links. STEP_2 decomposes the build into\n * PROGRESSIVE COMPLETION PHASES (cross-feature): each phase describes what the\n * product can demonstrably do once complete, owns every feature built in it\n * (each feature in EXACTLY one phase), and declares which concepts are\n * introduced (new) or revisited at higher depth (advanced) at the phase start.\n * Later phases depend on earlier ones and may only raise the knowledge level -\n * verified against the concept prerequisite graph (fail-closed).\n */\n\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\nimport type { ProjectGraph } from '../schemas/projectGraphSchema';\nimport type { KnowledgeGraph } from '../schemas/knowledgeGraphSchema';\nimport type {\n HybridGraph, ProjectConceptLink, DevelopmentPhase, ConceptIntroduction,\n} from '../schemas/hybridGraphSchema';\n\nexport interface HybridGraphPipelineOptions {\n projectGraph: ProjectGraph;\n knowledgeGraph: KnowledgeGraph;\n llmConfig?: LlmClientConfig;\n onProgress?: (step: string, message: string) => void;\n}\n\nexport interface HybridGraphPipelineResult {\n hybridGraph: HybridGraph;\n warnings: string[];\n}\n\nexport async function generateHybridGraph(\n options: HybridGraphPipelineOptions,\n): Promise<HybridGraphPipelineResult> {\n const { projectGraph, knowledgeGraph, llmConfig, onProgress } = options;\n const warnings: string[] = [];\n\n const log = (step: string, msg: string) => {\n console.log('[HG-' + step + '] ' + msg);\n onProgress?.(step, msg);\n };\n\n const features = projectGraph.features || [];\n const concepts = knowledgeGraph.concepts || [];\n\n if (features.length === 0 || concepts.length === 0) {\n warnings.push('No features or concepts to link');\n return {\n hybridGraph: {\n schema_version: 1,\n type: 'hybrid_graph',\n project_graph: projectGraph,\n knowledge_graph: knowledgeGraph,\n links: [],\n phases: [],\n description: '',\n total_project_minutes: 0,\n total_concept_minutes: 0,\n estimated_total_minutes: 0,\n },\n warnings,\n };\n }\n\n const client = createLlmClient(llmConfig);\n\n const featuresList = features.map(f =>\n '- ' + f.id + ': ' + f.name + ' - ' + (f.description || '') +\n ' (keywords: ' + (f.steps || []).flatMap(s => s.keywords || []).slice(0, 5).join(', ') + ')',\n ).join('\\n');\n\n const conceptsList = concepts.map(c =>\n '- ' + c.id + ': ' + c.name + ' - ULO: ' + (c.ulo || '').slice(0, 100) +\n ' (prerequisites: ' + (c.prerequisites || []).join(', ') + ')',\n ).join('\\n');\n\n const systemPrompt = (\n 'You are a curriculum architect. Link project features to knowledge concepts.\\n'\n + 'For each feature, determine which concepts it requires or demonstrates.\\n\\n'\n + 'RULES:\\n'\n + '1. Each link must have a relationship type: requires | demonstrates | applies | extends\\n'\n + '2. depth indicates how deeply the feature needs the concept:\\n'\n + ' - ulo: feature only needs WHAT+WHY understanding\\n'\n + ' - cio: feature needs HOW understanding\\n'\n + ' - sio: feature needs specific implementation knowledge\\n'\n + '3. estimated_prereq_minutes: how many minutes of concept learning before this feature\\n'\n + '4. Not every feature needs every concept - only create meaningful links\\n'\n + '5. Return JSON object with a links array'\n );\n\n const userPrompt = 'FEATURES:\\n' + featuresList + '\\n\\nCONCEPTS:\\n' + conceptsList + '\\n\\n'\n + 'Create links between features and concepts. Return JSON.\\n';\n\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: 16384,\n });\n\n const rawLinks = (result.links || []) as Array<Record<string, unknown>>;\n\n const featureIds = new Set(features.map(f => f.id));\n const conceptIds = new Set(concepts.map(c => c.id));\n const validLinks: ProjectConceptLink[] = [];\n\n for (const link of rawLinks) {\n const fid = String(link.feature_id || '');\n const cid = String(link.concept_id || '');\n if (!featureIds.has(fid)) {\n warnings.push('Link references non-existent feature ' + fid);\n continue;\n }\n if (!conceptIds.has(cid)) {\n warnings.push('Link references non-existent concept ' + cid);\n continue;\n }\n validLinks.push({\n feature_id: fid,\n concept_id: cid,\n relationship: (link.relationship as 'requires' | 'demonstrates' | 'applies' | 'extends') || 'requires',\n depth: (link.depth as 'ulo' | 'cio' | 'sio') || 'cio',\n description: String(link.description || ''),\n estimated_prereq_minutes: Number(link.estimated_prereq_minutes) || 0,\n phase_id: '',\n });\n }\n\n log('STEP_1', 'Generated ' + validLinks.length + ' feature-concept links');\n\n const phases = await decomposePhases({\n features, concepts, links: validLinks, client, log, warnings,\n });\n const phaseByFeature = new Map<string, string>();\n for (const ph of phases) {\n for (const fid of ph.feature_ids) phaseByFeature.set(fid, ph.id);\n }\n for (const link of validLinks) link.phase_id = phaseByFeature.get(link.feature_id) || '';\n\n log('STEP_3', 'Calculating totals...');\n\n const totalProjectMinutes = features.reduce((sum, f) => {\n const featureMinutes = (f.steps || []).reduce((s, step) => s + (step.effort?.estimated_minutes || 15), 0);\n return sum + featureMinutes;\n }, 0);\n\n const totalConceptMinutes = concepts.reduce((sum, c) => sum + (c.estimated_minutes || 30), 0);\n\n const prereqMinutesByConcept = new Map<string, number>();\n for (const link of validLinks) {\n const mins = link.estimated_prereq_minutes || 0;\n if (mins > 0) {\n const existing = prereqMinutesByConcept.get(link.concept_id) || 0;\n prereqMinutesByConcept.set(link.concept_id, Math.max(existing, mins));\n }\n }\n const totalPrereqMinutes = Array.from(prereqMinutesByConcept.values()).reduce((a, b) => a + b, 0);\n\n return {\n hybridGraph: {\n schema_version: 1,\n type: 'hybrid_graph',\n project_graph: projectGraph,\n knowledge_graph: knowledgeGraph,\n links: validLinks,\n phases,\n description: 'Progressive completion path: ' + phases.length + ' phases, ' + features.length + ' features, ' + concepts.length + ' concepts',\n total_project_minutes: totalProjectMinutes,\n total_concept_minutes: totalConceptMinutes,\n estimated_total_minutes: totalProjectMinutes + totalPrereqMinutes,\n },\n warnings,\n };\n}\n\ninterface DecomposePhasesArgs {\n features: ProjectGraph['features'];\n concepts: KnowledgeGraph['concepts'];\n links: ProjectConceptLink[];\n client: ReturnType<typeof createLlmClient>;\n log: (step: string, msg: string) => void;\n warnings: string[];\n}\nfunction auditPhasePlan(\n plan: Array<Record<string, unknown>>,\n features: Array<{ id: string }>,\n concepts: Array<{ id: string; prerequisites?: string[] }>,\n links: Array<{ feature_id: string; concept_id: string }>,\n warnings: string[],\n log: (step: string, msg: string) => void,\n): { phases: DevelopmentPhase[]; errors: string[] } {\n const knownFeatureIds = new Set(features.map(f => f.id));\n const knownConceptIds = new Set(concepts.map(c => c.id));\n const prereqOf = new Map<string, string[]>();\n for (const c of concepts) prereqOf.set(c.id, (c.prerequisites || []).filter(p => knownConceptIds.has(p)));\n\n const phases: DevelopmentPhase[] = [];\n const featurePhase = new Map<string, string>();\n const newIntroPhase = new Map<string, number>();\n const errors: string[] = [];\n\n plan.forEach((rp, idx) => {\n const id = String(rp.id || ('PH' + (idx + 1)));\n const order = idx + 1;\n const name = String(rp.name || ('Phase ' + order)).slice(0, 80);\n const productCompletion = String(rp.product_completion || '').trim();\n const rawFeatureIds = Array.isArray(rp.feature_ids) ? rp.feature_ids.map(String) : [];\n const rawIntros = Array.isArray(rp.introduces) ? (rp.introduces as Array<Record<string, unknown>>) : [];\n\n if (!productCompletion) {\n errors.push('Phase ' + id + ': product_completion is empty - every phase must describe the product completion level');\n }\n\n const featureIdsForPhase: string[] = [];\n for (const fid of rawFeatureIds) {\n if (!knownFeatureIds.has(fid)) {\n errors.push('Phase ' + id + ': unknown feature ' + fid);\n continue;\n }\n if (featurePhase.has(fid)) {\n errors.push('Feature ' + fid + ' assigned to both ' + featurePhase.get(fid) + ' and ' + id + ' - each feature must belong to exactly one phase');\n continue;\n }\n featurePhase.set(fid, id);\n featureIdsForPhase.push(fid);\n }\n\n const introductions: ConceptIntroduction[] = [];\n for (const ri of rawIntros) {\n const cid = String(ri.concept_id || '');\n if (!knownConceptIds.has(cid)) {\n errors.push('Phase ' + id + ': introduces unknown concept ' + cid);\n continue;\n }\n const aspect = String(ri.aspect || 'new') === 'advanced' ? 'advanced' : 'new';\n if (aspect === 'advanced') {\n const first = newIntroPhase.get(cid);\n if (first === undefined) {\n errors.push('Phase ' + id + ': advanced introduction of ' + cid + ' before any new introduction - revisit requires prior introduction');\n continue;\n }\n if (first >= order) {\n errors.push('Phase ' + id + ': advanced introduction of ' + cid + ' must come after its new introduction in phase ' + first);\n continue;\n }\n } else if (newIntroPhase.has(cid)) {\n errors.push('Phase ' + id + ': duplicate new introduction of ' + cid + ' (already introduced in phase ' + newIntroPhase.get(cid) + ')');\n continue;\n } else {\n newIntroPhase.set(cid, order);\n }\n for (const pre of prereqOf.get(cid) || []) {\n if (!newIntroPhase.has(pre)) {\n errors.push('Phase ' + id + ': concept ' + cid + ' introduced before its prerequisite ' + pre + ' is introduced - violates the prerequisite chain');\n }\n }\n introductions.push({ concept_id: cid, aspect, note: String(ri.note || '') });\n }\n\n phases.push({\n id, order, name,\n product_completion: productCompletion,\n feature_ids: featureIdsForPhase,\n introduces: introductions,\n });\n });\n\n const missing = features.map(f => f.id).filter(fid => !featurePhase.has(fid));\n if (missing.length > 0) {\n errors.push('Features not assigned to any phase: ' + missing.join(', '));\n }\n const firstConsumerPhase = new Map<string, number>();\n const phaseOrderByFeature = new Map<string, number>();\n for (const ph of phases) for (const fid of ph.feature_ids) phaseOrderByFeature.set(fid, ph.order);\n for (const l of links) {\n const po = phaseOrderByFeature.get(l.feature_id);\n if (po === undefined) continue;\n const cur = firstConsumerPhase.get(l.concept_id);\n if (cur === undefined || po < cur) firstConsumerPhase.set(l.concept_id, po);\n }\n for (const [cid, consumerOrder] of firstConsumerPhase) {\n const intro = newIntroPhase.get(cid);\n if (intro === undefined) {\n errors.push('Concept ' + cid + ' is consumed from phase ' + consumerOrder + ' but never introduced in any phase');\n } else if (intro > consumerOrder) {\n errors.push('Concept ' + cid + ' introduced in phase ' + intro + ' but first consumed in phase ' + consumerOrder + ' - introduction must come no later than first consumption');\n }\n }\n\n return { phases, errors };\n}\n\nasync function decomposePhases(args: DecomposePhasesArgs): Promise<DevelopmentPhase[]> {\n const { features, concepts, links, client, log, warnings } = args;\n\n const featureList = features.map(f =>\n '- ' + f.id + ': ' + f.name + ' - ' + (f.description || '').slice(0, 120),\n ).join('\\n');\n\n const conceptList = concepts.map(c =>\n '- ' + c.id + ': ' + c.name + ' (prerequisites: ' + ((c.prerequisites || []).join(', ') || 'none') + ')',\n ).join('\\n');\n\n const linkList = links.map(l =>\n '- ' + l.feature_id + ' -> ' + l.concept_id + ' (' + l.depth + ')',\n ).join('\\n') || '(none)';\n\n const systemPrompt = (\n 'You decompose a software project build into PROGRESSIVE COMPLETION PHASES for learning purposes.\\n\\n'\n + 'A phase is NOT a feature and NOT a milestone list: it is a cross-feature slice of the\\n'\n + 'product whose completion yields a DEMONSTRABLY more complete product. Build up gradually:\\n'\n + 'the product grows feature by feature across phases, and each phase adds its features to\\n'\n + 'what previous phases already built.\\n\\n'\n + 'RULES:\\n'\n + '1. Every feature must be assigned to EXACTLY ONE phase (no feature reused, none skipped).\\n'\n + '2. Phases are ordered; later phases depend on earlier ones and yield a more complete product.\\n'\n + '3. product_completion describes concretely what the product can DO once the phase is done.\\n'\n + '4. introduces lists which concepts the phase must teach BEFORE its feature work starts:\\n'\n + ' - aspect new: first time the concept appears in the course\\n'\n + ' - aspect advanced: a concept introduced in an EARLIER phase, revisited here at a\\n'\n + ' higher depth (an advanced aspect of the same concept, e.g. validation rules on top\\n'\n + ' of basic data modeling). Use the note field to say which aspect.\\n'\n + '5. A concept MUST be introduced (new) no later than the first phase that consumes it.\\n'\n + '6. A concept must not be introduced before its own prerequisites are introduced.\\n'\n + '7. Typically 3-6 phases for a small project; keep phases balanced.\\n'\n + '8. Phase 1 usually covers project setup/foundation features plus the first minimal slice.\\n'\n + '9. Return JSON only.'\n );\n\n const baseUserPrompt = 'FEATURES:\\n' + featureList + '\\n\\nCONCEPTS:\\n' + conceptList\n + '\\n\\nFEATURE-CONCEPT LINKS:\\n' + linkList + '\\n\\n'\n + 'Return JSON with a phases array. Each phase: { id: PH1, name, product_completion, feature_ids: [F0, F1], introduces: [{ concept_id: C1, aspect: new or advanced, note }] }.\\n';\n\n // Repair loop (same fail-closed philosophy as STEP_5 depth authoring): the audit below is\n // deterministic, so violations are fed back verbatim and the model rewrites the plan.\n const MAX_DECOMPOSE_ATTEMPTS = 3;\n let auditErrors: string[] = [];\n let phases: DevelopmentPhase[] = [];\n let rawPhases: Array<Record<string, unknown>> = [];\n for (let attempt = 1; attempt <= MAX_DECOMPOSE_ATTEMPTS; attempt++) {\n const userPrompt = attempt === 1\n ? baseUserPrompt\n : baseUserPrompt\n + '\\nYOUR PREVIOUS PLAN VIOLATED THESE CONTRACT RULES (fix ALL of them):\\n'\n + auditErrors.map((e) => '- ' + e).join('\\n')\n + '\\nReturn a corrected full phases array.\\n';\n\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: 16384,\n });\n\n rawPhases = (result.phases || []) as Array<Record<string, unknown>>;\n if (rawPhases.length === 0) {\n if (attempt === MAX_DECOMPOSE_ATTEMPTS) {\n throw new Error('Phase decomposition returned zero phases - fail-closed abort');\n }\n auditErrors = ['Returned zero phases'];\n continue;\n }\n\n ({ phases, errors: auditErrors } = auditPhasePlan(rawPhases, features, concepts, links, warnings, log));\n if (auditErrors.length === 0) break;\n if (attempt < MAX_DECOMPOSE_ATTEMPTS) {\n log('STEP_2', 'Contract violations (' + auditErrors.length + ') - repairing (attempt ' + (attempt + 1) + '/' + MAX_DECOMPOSE_ATTEMPTS + ')');\n }\n }\n if (auditErrors.length > 0) {\n throw new Error(\n 'Phase decomposition violated the progressive-completion contract (' + auditErrors.length + ' issue(s)):\\n'\n + auditErrors.map((e) => ' - ' + e).join('\\n')\n + '\\nRe-run the pipeline - a phase model that cannot be trusted is worse than no output.',\n );\n }\n\n if (phases.length === 1 && features.length > 2) {\n warnings.push('Only one phase for ' + features.length + ' features - progressive decomposition likely too coarse');\n }\n\n log('STEP_2', 'Decomposed into ' + phases.length + ' phases: '\n + phases.map(p => p.id + '(' + p.feature_ids.length + 'F/' + p.introduces.length + 'K)').join(', '));\n return phases;\n}\n","/**\n * Hybrid Graph Pipeline Orchestrator.\n *\n * Runs: Hybrid Graph Generation -> CurriculumFeed v2 Emission.\n */\n\nimport { generateHybridGraph, type HybridGraphPipelineOptions } from '../graph/hybridGraphPipeline';\nimport { emitCurriculumFeed } from '../feed/curriculumFeedEmitter';\nimport type { HybridGraph } from '../schemas/hybridGraphSchema';\nimport type { CurriculumFeed } from '../schemas/curriculumFeedSchema';\n\nexport interface HybridPipelineOptions extends HybridGraphPipelineOptions {}\n\nexport interface HybridPipelineResult {\n hybridGraph: HybridGraph;\n curriculumFeed: CurriculumFeed;\n warnings: string[];\n}\n\n/**\n * Run the hybrid graph generation and feed emission pipeline.\n */\nexport async function runHybridGraphPipeline(\n options: HybridPipelineOptions,\n): Promise<HybridPipelineResult> {\n const warnings: string[] = [];\n const result = await generateHybridGraph(options);\n warnings.push(...result.warnings);\n\n const curriculumFeed = emitCurriculumFeed(result.hybridGraph, {\n warnings,\n });\n\n return {\n hybridGraph: result.hybridGraph,\n curriculumFeed,\n warnings,\n };\n}\n","/**\n * Input Type Detection — determines what kind of input the user provided.\n *\n * Signals:\n * repository: repoUrl, repoDir, or source code files present\n * syllabus: syllabusText, chapters[], or curriculum-like structure\n * files: non-code files (3D models, images, documents)\n * description: free-text description (>100 chars)\n * mixed: combination of the above\n */\n\nimport type { InputType } from '../schemas/domainProfileSchema';\n\nexport interface InputTypeDetectionResult {\n inputType: InputType;\n confidence: number;\n evidence: string[];\n}\n\nexport interface DetectInputTypeOptions {\n repoUrl?: string;\n repoDir?: string;\n description?: string;\n syllabusText?: string;\n chapters?: string[];\n fileExtensions?: string[];\n goal?: string;\n}\n\nconst CODE_EXTENSIONS = new Set([\n '.swift', '.ts', '.tsx', '.js', '.jsx', '.py', '.ino', '.cpp', '.c', '.h', '.hpp',\n '.kt', '.kts', '.java', '.cs', '.rb', '.go', '.rs', '.php', '.lua', '.r', '.m',\n]);\n\nconst NON_CODE_EXTENSIONS = new Set([\n '.stl', '.obj', '.step', '.stp', '.iges', '.igs', // 3D models\n '.png', '.jpg', '.jpeg', '.gif', '.svg', '.bmp', // Images\n '.pdf', '.doc', '.docx', '.pptx', '.xlsx', // Documents\n '.tc3', '.f3d', // CAD files\n '.mp3', '.wav', '.midi', // Audio\n '.mp4', '.avi', '.mov', // Video\n]);\n\n/**\n * Detect input type from user-provided options.\n */\nexport function detectInputType(options: DetectInputTypeOptions): InputTypeDetectionResult {\n const evidence: string[] = [];\n let repoScore = 0;\n let syllabusScore = 0;\n let filesScore = 0;\n let descriptionScore = 0;\n\n // Check for repository signals\n if (options.repoUrl) {\n repoScore += 0.5;\n evidence.push(`repoUrl provided: ${options.repoUrl}`);\n }\n if (options.repoDir) {\n repoScore += 0.5;\n evidence.push(`repoDir provided: ${options.repoDir}`);\n }\n\n // Check for syllabus signals\n if (options.syllabusText && options.syllabusText.length > 50) {\n syllabusScore += 0.6;\n evidence.push(`syllabusText provided (${options.syllabusText.length} chars)`);\n }\n if (options.chapters && options.chapters.length > 0) {\n syllabusScore += 0.4;\n evidence.push(`${options.chapters.length} chapters provided`);\n }\n\n // Check for file signals\n if (options.fileExtensions && options.fileExtensions.length > 0) {\n const codeCount = options.fileExtensions.filter(ext => CODE_EXTENSIONS.has(ext)).length;\n const nonCodeCount = options.fileExtensions.filter(ext => NON_CODE_EXTENSIONS.has(ext)).length;\n\n if (nonCodeCount > 0) {\n filesScore += 0.7;\n evidence.push(`${nonCodeCount} non-code files detected: ${options.fileExtensions.filter(ext => NON_CODE_EXTENSIONS.has(ext)).join(', ')}`);\n }\n if (codeCount > 0 && repoScore === 0) {\n repoScore += 0.3;\n evidence.push(`${codeCount} source code files detected`);\n }\n }\n\n // Check for description signals\n if (options.description && options.description.length > 100) {\n descriptionScore += 0.5;\n evidence.push(`description provided (${options.description.length} chars)`);\n }\n if (options.goal && options.goal.length > 20) {\n descriptionScore += 0.3;\n evidence.push(`goal provided (${options.goal.length} chars)`);\n }\n\n // Determine winner\n const scores = [\n { type: 'repository' as InputType, score: repoScore },\n { type: 'syllabus' as InputType, score: syllabusScore },\n { type: 'files' as InputType, score: filesScore },\n { type: 'description' as InputType, score: descriptionScore },\n ];\n\n scores.sort((a, b) => b.score - a.score);\n const winner = scores[0];\n\n // Check for mixed\n const activeTypes = scores.filter(s => s.score >= 0.3);\n if (activeTypes.length >= 2) {\n return {\n inputType: 'mixed',\n confidence: 0.7,\n evidence: [...evidence, `Mixed input detected: ${activeTypes.map(t => t.type).join(' + ')}`],\n };\n }\n\n if (winner.score === 0) {\n return {\n inputType: 'description',\n confidence: 0.3,\n evidence: [...evidence, 'No strong signals — defaulting to description'],\n };\n }\n\n return {\n inputType: winner.type,\n confidence: Math.min(winner.score, 1.0),\n evidence,\n };\n}\n","/**\n * Domain Category Detection — determines the subject domain from context.\n *\n * Uses multi-signal scoring:\n * - File extensions (code vs non-code, context-dependent)\n * - Keywords in description/goal (multi-language)\n * - Tech stack mentions\n * - Subject-specific vocabulary\n * - Disambiguation for overlapping domains (e.g., .cpp in software vs hardware)\n */\n\nimport type { DomainCategory } from '../schemas/domainProfileSchema';\n\nexport interface DomainDetectionResult {\n domainCategory: DomainCategory;\n confidence: number;\n evidence: string[];\n detectedTechStack: string[];\n detectedSubject: string;\n ambiguous?: { domain1: DomainCategory; domain2: DomainCategory; reason: string };\n}\n\nexport interface DetectDomainOptions {\n description?: string;\n goal?: string;\n syllabusText?: string;\n techStack?: string;\n fileExtensions?: string[];\n repoUrl?: string;\n}\n\n\n\n\n// ─── Keyword lists per domain (broad matching) ──────────────────────────────\nconst DOMAIN_KEYWORDS: Record<DomainCategory, string[]> = {\n software: [\n 'app', 'web', 'api', 'database', 'frontend', 'backend', 'mobile',\n 'swift', 'react', 'vue', 'angular', 'node', 'python', 'java',\n 'typescript', 'javascript', 'html', 'css', 'sql', 'rest', 'graphql',\n 'git', 'docker', 'kubernetes', 'ci/cd', 'deploy',\n 'swiftui', 'uikit', 'flutter', 'kotlin', 'android', 'ios',\n 'nextjs', 'nuxt', 'svelte', 'django', 'flask', 'express',\n ],\n hardware_iot: [\n 'arduino', 'robot', 'sensor', 'motor', 'esp32', 'gpio',\n 'raspberry pi', 'iot', 'firmware', 'embedded', 'microcontroller',\n 'led', 'servo', 'potentiometer', 'breadboard', 'soldering',\n 'i2c', 'spi', 'pwm', 'uart', 'analog', 'digital',\n 'ultrasonic', 'infrared', 'bluetooth', 'wifi module',\n 'pin', 'voltage', 'resistor', 'capacitor', 'circuit',\n ],\n '3d_design': [\n 'tinkercad', '3d model', 'cad', 'parametric', 'stl', 'obj',\n 'fusion360', 'blender', 'solidworks', 'autocad', 'freecad',\n 'shape', 'dimension', 'extrude', 'revolve', 'fillet', 'chamfer',\n 'assembly', 'constraint', 'sketch', 'plane', 'axis',\n 'render', 'mesh', 'nurbs', 'surface', 'volume',\n ],\n math: [\n // Vietnamese\n 'hình học', 'đại số', 'giải tích', 'xác suất', 'thống kê',\n 'tam giác', 'đường tròn', 'phương trình', 'bất phương trình',\n 'số học', 'tổ hợp', 'hoán vị', 'độ đo', 'góc', 'cạnh',\n 'diện tích', 'thể tích', 'chu vi', 'đường cao', 'trung tuyến',\n // English\n 'geometry', 'algebra', 'calculus', 'trigonometry', 'logarithm',\n 'probability', 'statistics', 'derivative', 'integral', 'matrix',\n 'vector', 'theorem', 'proof', 'angle', 'perimeter', 'area',\n // Chinese\n '几何', '代数', '微积分', '概率', '统计', '三角形', '圆', '方程',\n // Japanese\n '幾何', '代数', '微分', '積分', '確率', '統計',\n // French\n 'géométrie', 'algèbre', 'calcul', 'trigonométrie', 'probabilité',\n ],\n science: [\n // Vietnamese\n 'lý thuyết', 'nguyên lý', 'thí nghiệm', 'điện', 'lực',\n 'hóa học', 'sinh học', 'vật lý', 'địa lý',\n 'phản ứng', 'nguyên tố', 'phân tử',\n 'năng lượng', 'cảm ứng', 'từ trường', 'quang học',\n 'môi trường', 'sinh thái',\n // English\n 'physics', 'chemistry', 'biology', 'earth science',\n 'cell', 'gene', 'evolution', 'ecosystem', 'molecule', 'atom',\n // Chinese\n '物理', '化学', '生物', '地理',\n // Japanese\n '物理', '化学', '生物',\n // French\n 'physique', 'chimie', 'biologie',\n ],\n language: [\n // Vietnamese\n 'tiếng anh', 'tiếng việt', 'ngữ pháp', 'từ vựng',\n 'đọc', 'viết', 'nói', 'nghe',\n // English\n 'grammar', 'vocabulary', 'writing', 'reading', 'speaking',\n 'listening', 'pronunciation', 'essay', 'paragraph', 'sentence',\n 'verb', 'noun', 'adjective', 'ielts', 'toeic', 'toefl',\n // Chinese\n '英语', '语法', '词汇', '阅读', '写作',\n // Japanese\n '英語', '文法', '語彙', '読解', '作文',\n // French\n 'anglais', 'grammaire', 'vocabulaire', 'lecture', 'écriture',\n ],\n arts: [\n // Vietnamese\n 'âm nhạc', 'nhạc lý', 'solfège', 'đàn', 'piano', 'guitar',\n 'hội họa', 'thiết kế', 'nhiếp ảnh',\n 'tranh', 'màu', 'sáng tác', 'biên khúc',\n // English\n 'music', 'art', 'painting', 'drawing', 'sketch', 'photography',\n 'color theory', 'composition', 'typography', 'layout',\n 'digital art', 'illustration', 'figma',\n // Chinese\n '音乐', '美术', '绘画', '摄影', '设计',\n // Japanese\n '音楽', '美術', '絵画', '写真', 'デザイン',\n // French\n 'musique', 'art', 'peinture', 'dessin', 'photographie',\n ],\n research: [\n // Vietnamese\n 'nghiên cứu', 'thống kê', 'phương pháp luận', 'phân tích dữ liệu',\n 'định tính', 'định lượng', 'giả thuyết',\n 'mẫu', 'tổng thể', 'tương quan', 'hồi quy',\n 'tài liệu tham khảo', 'trích dẫn', 'tóm tắt',\n // English\n 'research', 'survey', 'methodology', 'data analysis',\n 'qualitative', 'quantitative', 'hypothesis', 'experiment',\n 'sample', 'population', 'correlation', 'regression',\n 'literature review', 'citation', 'abstract',\n // Chinese\n '研究', '调查', '方法论', '数据分析',\n // Japanese\n '研究', '調査', '方法論', 'データ分析',\n // French\n 'recherche', 'enquête', 'méthodologie', 'analyse de données',\n ],\n business: [\n // Vietnamese\n 'kinh doanh', 'tài chính', 'quản lý', 'marketing', 'bán hàng',\n 'khởi nghiệp', 'kế hoạch kinh doanh', 'doanh thu', 'lợi nhuận',\n 'quản trị', 'tài khoản', 'đầu tư', 'ngân sách',\n // English\n 'business', 'finance', 'accounting', 'investment', 'budget',\n 'startup', 'revenue', 'profit', 'roi', 'sales',\n 'product management', 'agile', 'scrum', 'kanban',\n // Chinese\n '商业', '金融', '会计', '投资', '营销',\n // Japanese\n 'ビジネス', '金融', '会計', '投資', 'マーケティング',\n // French\n 'affaires', 'finance', 'comptabilité', 'investissement',\n ],\n other: [],\n};\n\n// ─── Extension → Domain mapping (context-dependent for ambiguous extensions) ──\nconst EXTENSION_DOMAIN: Record<string, DomainCategory> = {\n '.swift': 'software',\n '.ts': 'software', '.tsx': 'software',\n '.js': 'software', '.jsx': 'software',\n '.py': 'software',\n '.kt': 'software', '.kts': 'software',\n '.java': 'software', '.cs': 'software',\n '.go': 'software', '.rs': 'software',\n '.rb': 'software', '.php': 'software',\n '.lua': 'software', '.r': 'software',\n // .ino is ALWAYS hardware\n '.ino': 'hardware_iot',\n // .cpp/.c/.h are CONTEXT-DEPENDENT → resolve in detection logic\n '.stl': '3d_design', '.obj': '3d_design',\n '.step': '3d_design', '.stp': '3d_design',\n '.tc3': '3d_design', '.f3d': '3d_design',\n};\n\n// Extensions that need context disambiguation\nconst AMBIGUOUS_EXTENSIONS = new Set(['.cpp', '.c', '.h', '.hpp']);\n\n// ─── Syllabus language detection ─────────────────────────────────────────────\nconst LANG_PATTERNS: Array<{ lang: string; patterns: RegExp[] }> = [\n { lang: 'vi', patterns: [/[ạảãàáạảãạ]/i, /\\bgiải\\b/, /\\btính\\b/] },\n { lang: 'zh', patterns: [/[\\u4e00-\\u9fff]{2,}/] },\n { lang: 'ja', patterns: [/[\\u3040-\\u309f\\u30a0-\\u30ff]{2,}/] },\n { lang: 'ko', patterns: [/[\\uac00-\\ud7af]{2,}/] },\n { lang: 'fr', patterns: [/\\b(la|le|les|des|une|est|sont|avec|pour|dans)\\b/i] },\n];\n\nfunction detectSyllabusLanguage(text: string): string {\n for (const { lang, patterns } of LANG_PATTERNS) {\n if (patterns.some(p => p.test(text))) return lang;\n }\n return 'en';\n}\n\n// ─── Main Detection Function ─────────────────────────────────────────────────\nexport function detectDomain(options: DetectDomainOptions): DomainDetectionResult {\n const evidence: string[] = [];\n const detectedTechStack: string[] = [];\n let detectedSubject = '';\n let ambiguous: DomainDetectionResult['ambiguous'];\n\n const scores: Record<DomainCategory, number> = {\n software: 0, hardware_iot: 0, '3d_design': 0,\n math: 0, science: 0, language: 0, arts: 0,\n research: 0, business: 0, other: 0,\n };\n\n // ─── 1. File Extension Signals ───────────────────────────────────────────\n const hasHardwareContext = !!(\n options.techStack?.toLowerCase().match(/arduino|esp32|raspberry|embedded|iot/)\n || options.description?.toLowerCase().match(/arduino|robot|sensor|motor|circuit/)\n || options.goal?.toLowerCase().match(/arduino|robot|sensor|motor|circuit/)\n );\n\n const hasSoftwareContext = !!(\n options.techStack?.toLowerCase().match(/swift|react|vue|angular|python|java|typescript|javascript/)\n || options.description?.toLowerCase().match(/app|web|api|frontend|backend|mobile/)\n || options.goal?.toLowerCase().match(/app|web|api|frontend|backend|mobile/)\n );\n\n if (options.fileExtensions) {\n for (const ext of options.fileExtensions) {\n const extLower = ext.toLowerCase();\n\n // Always-hardware extensions\n if (extLower === '.ino') {\n scores.hardware_iot += 0.5;\n evidence.push(`File extension ${ext} → hardware_iot (always)`);\n continue;\n }\n\n // Ambiguous extensions → context-dependent\n if (AMBIGUOUS_EXTENSIONS.has(extLower)) {\n if (hasHardwareContext && !hasSoftwareContext) {\n scores.hardware_iot += 0.3;\n evidence.push(`File extension ${ext} → hardware_iot (hardware context)`);\n } else if (hasSoftwareContext && !hasHardwareContext) {\n scores.software += 0.3;\n evidence.push(`File extension ${ext} → software (software context)`);\n } else if (hasHardwareContext && hasSoftwareContext) {\n // Both contexts → slight preference for software (more common for .cpp)\n scores.software += 0.15;\n scores.hardware_iot += 0.15;\n evidence.push(`File extension ${ext} → ambiguous (both software and hardware context)`);\n ambiguous = {\n domain1: 'software',\n domain2: 'hardware_iot',\n reason: `.cpp/.c/.h files present with both software and hardware context keywords`,\n };\n } else {\n // No context → default to software\n scores.software += 0.2;\n evidence.push(`File extension ${ext} → software (default, no context)`);\n }\n continue;\n }\n\n // Clear mapping extensions\n const domain = EXTENSION_DOMAIN[extLower];\n if (domain) {\n scores[domain] += 0.3;\n evidence.push(`File extension ${ext} → ${domain}`);\n }\n }\n }\n\n // ─── 2. Text Content Signals (multi-language) ─────────────────────────────\n const textContent = [\n options.description || '',\n options.goal || '',\n options.syllabusText || '',\n ].join(' ').toLowerCase();\n\n for (const [domain, keywords] of Object.entries(DOMAIN_KEYWORDS)) {\n const cat = domain as DomainCategory;\n for (const kw of keywords) {\n if (textContent.includes(kw.toLowerCase())) {\n scores[cat] += 0.1;\n if (!evidence.some(e => e.includes(`\"${kw}\"`))) {\n evidence.push(`Keyword \"${kw}\" → ${cat}`);\n }\n }\n }\n }\n\n // ─── 3. Tech Stack Signals ────────────────────────────────────────────────\n if (options.techStack) {\n const techItems = options.techStack.split(',').map(t => t.trim());\n for (const tech of techItems) {\n const techL = tech.toLowerCase();\n if (['swift', 'swiftui', 'uikit', 'ios'].some(k => techL.includes(k))) {\n scores.software += 0.4;\n detectedTechStack.push(tech);\n } else if (['react', 'vue', 'angular', 'next', 'nuxt', 'typescript', 'javascript'].some(k => techL.includes(k))) {\n scores.software += 0.4;\n detectedTechStack.push(tech);\n } else if (['python', 'django', 'flask'].some(k => techL.includes(k))) {\n scores.software += 0.3;\n detectedTechStack.push(tech);\n } else if (['arduino', 'esp32', 'raspberry'].some(k => techL.includes(k))) {\n scores.hardware_iot += 0.5;\n detectedTechStack.push(tech);\n } else if (['tinkercad', 'fusion360', 'blender'].some(k => techL.includes(k))) {\n scores['3d_design'] += 0.5;\n detectedTechStack.push(tech);\n } else if (['c++', 'c', 'cpp'].some(k => techL === k || techL.endsWith(k))) {\n // C++/C → context-dependent\n if (hasHardwareContext) {\n scores.hardware_iot += 0.3;\n } else {\n scores.software += 0.3;\n }\n detectedTechStack.push(tech);\n }\n }\n }\n\n // ─── 4. Syllabus Content Signals (with language detection) ────────────────\n if (options.syllabusText) {\n const syllabusLang = detectSyllabusLanguage(options.syllabusText);\n const syllabusLower = options.syllabusText.toLowerCase();\n\n if (syllabusLower.includes('hình học') || syllabusLower.includes('đại số')\n || syllabusLower.includes('geometry') || syllabusLower.includes('algebra')\n || syllabusLower.includes('几何') || syllabusLower.includes('代数')\n || syllabusLower.includes('幾何') || syllabusLower.includes('代数')\n || syllabusLower.includes('géométrie') || syllabusLower.includes('algèbre')) {\n scores.math += 0.5;\n detectedSubject = 'Mathematics';\n } else if (syllabusLower.includes('vật lý') || syllabusLower.includes('hóa')\n || syllabusLower.includes('sinh') || syllabusLower.includes('physics')\n || syllabusLower.includes('chemistry') || syllabusLower.includes('biology')\n || syllabusLower.includes('物理') || syllabusLower.includes('化学')\n || syllabusLower.includes('物理') || syllabusLower.includes('化学')\n || syllabusLower.includes('physique') || syllabusLower.includes('chimie')) {\n scores.science += 0.5;\n detectedSubject = 'Natural Science';\n } else if (syllabusLower.includes('tiếng anh') || syllabusLower.includes('english')\n || syllabusLower.includes('grammar') || syllabusLower.includes('英语')\n || syllabusLower.includes('英語') || syllabusLower.includes('anglais')) {\n scores.language += 0.5;\n detectedSubject = 'English Language';\n }\n\n evidence.push(`Syllabus language detected: ${syllabusLang}`);\n }\n\n // ─── 5. Scoring & Winner ─────────────────────────────────────────────────\n const entries = Object.entries(scores).filter(([k]) => k !== 'other') as [DomainCategory, number][];\n entries.sort((a, b) => b[1] - a[1]);\n const [winner, winnerScore] = entries[0];\n\n if (winnerScore === 0) {\n return {\n domainCategory: 'other',\n confidence: 0.2,\n evidence: [...evidence, 'No domain signals detected'],\n detectedTechStack,\n detectedSubject,\n };\n }\n\n // Check for near-tie (within 0.15) → ambiguous\n const second = entries[1];\n if (second && (winnerScore - second[1]) < 0.15 && winnerScore > 0) {\n ambiguous = {\n domain1: winner,\n domain2: second[0],\n reason: `Scores very close: ${winner}=${winnerScore.toFixed(2)}, ${second[0]}=${second[1].toFixed(2)}`,\n };\n }\n\n const totalScore = entries.reduce((sum, [, s]) => sum + s, 0);\n const confidence = totalScore > 0 ? Math.min(winnerScore / totalScore + 0.3, 1.0) : 0.3;\n\n return {\n domainCategory: winner,\n confidence,\n evidence: evidence.slice(0, 20),\n detectedTechStack,\n detectedSubject,\n ambiguous,\n };\n}\n","/**\n * Learning Mode Detection — determines product vs concept vs hybrid.\n *\n * Logic:\n * - Repository + build verbs → product\n * - Syllabus + no source code → concept\n * - Repository + understanding verbs → hybrid\n * - Domain category heuristic (math/science → concept, software/hardware → product)\n */\n\nimport type { LearningMode, DomainCategory, InputType } from '../schemas/domainProfileSchema';\n\nexport interface LearningModeDetectionResult {\n learningMode: LearningMode;\n confidence: number;\n evidence: string[];\n}\n\nexport interface DetectLearningModeOptions {\n inputType: InputType;\n domainCategory: DomainCategory;\n goal?: string;\n description?: string;\n hasRepo: boolean;\n hasSyllabus: boolean;\n}\n\n// ─── Verb patterns ───────────────────────────────────────────────────────────\n\nconst BUILD_VERBS = [\n 'build', 'create', 'develop', 'implement', 'construct', 'make',\n 'xây dựng', 'tạo', 'phát triển', 'triển khai', 'lắp ráp',\n 'code', 'program', 'design a', 'set up', 'deploy',\n];\n\nconst UNDERSTAND_VERBS = [\n 'understand', 'learn', 'grasp', 'comprehend', 'master',\n 'hiểu', 'nắm vững', 'học', 'tiếp thu', 'am hiểu',\n 'vận dụng', 'phân tích', 'đánh giá', 'so sánh',\n 'explain', 'describe', 'analyze', 'evaluate', 'compare',\n];\n\nconst CONCEPT_DOMAINS: DomainCategory[] = ['math', 'science', 'language', 'arts', 'research', 'business'];\nconst PRODUCT_DOMAINS: DomainCategory[] = ['software', 'hardware_iot', '3d_design'];\n\n/**\n * Detect learning mode from context.\n */\nexport function detectLearningMode(options: DetectLearningModeOptions): LearningModeDetectionResult {\n const evidence: string[] = [];\n const text = [options.goal || '', options.description || ''].join(' ').toLowerCase();\n\n let productScore = 0;\n let conceptScore = 0;\n\n // 1. Input type signals\n if (options.hasRepo) {\n productScore += 0.3;\n evidence.push('Repository present → product signal');\n }\n if (options.hasSyllabus) {\n conceptScore += 0.3;\n evidence.push('Syllabus present → concept signal');\n }\n\n // 2. Domain category heuristic\n if (PRODUCT_DOMAINS.includes(options.domainCategory)) {\n productScore += 0.2;\n evidence.push(`Domain ${options.domainCategory} → product倾向`);\n }\n if (CONCEPT_DOMAINS.includes(options.domainCategory)) {\n conceptScore += 0.2;\n evidence.push(`Domain ${options.domainCategory} → concept倾向`);\n }\n\n // 3. Verb pattern matching\n const hasBuildVerbs = BUILD_VERBS.some(v => text.includes(v));\n const hasUnderstandVerbs = UNDERSTAND_VERBS.some(v => text.includes(v));\n\n if (hasBuildVerbs) {\n productScore += 0.3;\n evidence.push('Build verbs detected in goal/description');\n }\n if (hasUnderstandVerbs) {\n conceptScore += 0.3;\n evidence.push('Understand verbs detected in goal/description');\n }\n\n // 4. Determine mode\n const total = productScore + conceptScore;\n if (total === 0) {\n return {\n learningMode: 'product',\n confidence: 0.3,\n evidence: [...evidence, 'No signals — defaulting to product'],\n };\n }\n\n // Check for hybrid\n if (productScore >= 0.3 && conceptScore >= 0.3) {\n const hybridConf = Math.min((productScore + conceptScore) / 2, 1.0);\n return {\n learningMode: 'hybrid',\n confidence: hybridConf,\n evidence: [...evidence, `Mixed signals: product=${productScore.toFixed(2)}, concept=${conceptScore.toFixed(2)} → hybrid`],\n };\n }\n\n if (productScore > conceptScore) {\n const raw = total > 0 ? productScore / total : 0.5;\n return {\n learningMode: 'product',\n confidence: Math.min(Math.max(raw, 0) + 0.2, 1.0),\n evidence,\n };\n }\n\n const raw = total > 0 ? conceptScore / total : 0.5;\n return {\n learningMode: 'concept',\n confidence: Math.min(Math.max(raw, 0) + 0.2, 1.0),\n evidence,\n };\n}\n","/**\n * Domain Profile Detection Orchestrator — combines all detection modules.\n */\n\nimport { detectInputType, type DetectInputTypeOptions } from './inputTypeDetector';\nimport { detectDomain, type DetectDomainOptions } from './domainDetector';\nimport { detectLearningMode } from './learningModeDetector';\nimport type { DomainProfile, GraphType } from '../schemas/domainProfileSchema';\nimport type { ParsedSyllabus } from '../parsers/syllabusParser';\n\nexport interface DetectDomainProfileOptions {\n repoUrl?: string;\n repoDir?: string;\n description?: string;\n goal?: string;\n syllabusText?: string;\n parsedSyllabus?: ParsedSyllabus;\n chapters?: string[];\n fileExtensions?: string[];\n techStack?: string;\n gradeBand?: [number, number];\n}\n\nexport function detectDomainProfile(options: DetectDomainProfileOptions): DomainProfile {\n const effectiveSyllabus = options.syllabusText || options.parsedSyllabus?.rawText || '';\n const inputResult = detectInputType({\n ...options,\n syllabusText: effectiveSyllabus,\n });\n\n const domainResult = detectDomain({\n description: options.description,\n goal: options.goal,\n syllabusText: effectiveSyllabus,\n techStack: options.techStack,\n fileExtensions: options.fileExtensions,\n repoUrl: options.repoUrl,\n });\n\n const modeResult = detectLearningMode({\n inputType: inputResult.inputType,\n domainCategory: domainResult.domainCategory,\n goal: options.goal,\n description: options.description,\n hasRepo: !!(options.repoUrl || options.repoDir),\n hasSyllabus: !!(effectiveSyllabus || (options.chapters && options.chapters.length > 0) || options.parsedSyllabus),\n });\n\n const graphType = determineGraphType(modeResult.learningMode);\n\n return {\n inputType: inputResult.inputType,\n domainCategory: (domainResult.domainCategory === 'other' && options.parsedSyllabus?.subject.domain)\n ? (options.parsedSyllabus.subject.domain as any)\n : domainResult.domainCategory,\n learningMode: modeResult.learningMode,\n graphType,\n confidence: {\n inputType: inputResult.confidence,\n domainCategory: domainResult.confidence,\n learningMode: modeResult.confidence,\n },\n evidence: [...inputResult.evidence, ...domainResult.evidence, ...modeResult.evidence],\n detectedTechStack: domainResult.detectedTechStack,\n detectedSubject: options.parsedSyllabus?.subject.title || domainResult.detectedSubject,\n detectedDomain: domainResult.domainCategory,\n goal: options.goal || '',\n description: options.description || '',\n repoUrl: options.repoUrl || '',\n repoDir: options.repoDir || '',\n syllabusText: effectiveSyllabus,\n };\n}\n\nfunction determineGraphType(learningMode: string): GraphType {\n switch (learningMode) {\n case 'product': return 'project_graph';\n case 'concept': return 'knowledge_graph';\n case 'hybrid': return 'hybrid_graph';\n default: return 'project_graph';\n }\n}\n","/**\n * Unified Domain Pipeline Router.\n *\n * Implements the 3-Layer Architecture from docs/ideas/2026-08-30-domain-detection-and-graph-types.md:\n * Layer 1: DOMAIN DETECTION (detectDomainProfile)\n * Layer 2: GRAPH ROUTER (routeDomain)\n * Layer 3: GRAPH GENERATION (runProjectGraphPipeline | runKnowledgeGraphPipeline | runHybridGraphPipeline)\n * Layer 4: NORMALIZED OUTPUT (CurriculumFeed v2)\n */\n\nimport { detectDomainProfile, type DetectDomainProfileOptions } from '../detector/domainProfileDetector';\nimport type { DomainProfile, GraphType } from '../schemas/domainProfileSchema';\nimport type { CurriculumFeed } from '../schemas/curriculumFeedSchema';\nimport { runProjectGraphPipeline, type PipelineOptions, type PipelineResult } from './projectGraphPipeline';\nimport { runKnowledgeGraphPipeline, type KnowledgePipelineOptions, type KnowledgePipelineResult } from './knowledgeGraphPipeline';\nimport { runHybridGraphPipeline, type HybridPipelineOptions, type HybridPipelineResult } from './hybridGraphPipeline';\nimport type { LlmClientConfig } from '../utils/llmClient';\nimport type { ParsedSyllabus } from '../parsers/syllabusParser';\n\nexport interface DomainPipelineOptions extends DetectDomainProfileOptions {\n subject?: string;\n llmConfig?: LlmClientConfig;\n onProgress?: (step: string, message: string) => void;\n parsedSyllabus?: ParsedSyllabus;\n knowledgeTreePath?: string;\n proposalsPath?: string;\n embeddings?: Record<string, { embedding?: number[]; name?: string; description?: string; keywords?: string }>;\n /** Override automatic learning mode detection */\n forcedLearningMode?: 'product' | 'concept' | 'hybrid';\n}\n\nexport interface DomainPipelineResult {\n domainProfile: DomainProfile;\n graphType: GraphType;\n curriculumFeed: CurriculumFeed;\n projectResult?: PipelineResult;\n knowledgeResult?: KnowledgePipelineResult;\n hybridResult?: HybridPipelineResult;\n warnings: string[];\n}\n\n/**\n * Route and execute the appropriate domain pipeline based on input context.\n */\nexport async function runDomainPipeline(\n options: DomainPipelineOptions,\n): Promise<DomainPipelineResult> {\n const warnings: string[] = [];\n const log = (step: string, msg: string) => {\n console.log(`[ROUTER-${step}] ${msg}`);\n options.onProgress?.(step, msg);\n };\n\n // ─── Layer 1: Domain Detection ───────────────────────────────────────────\n log('LAYER_1', 'Detecting domain profile...');\n const domainProfile = detectDomainProfile(options);\n\n const effectiveMode = options.forcedLearningMode || domainProfile.learningMode;\n log('LAYER_2', `Routing to pipeline for learning mode: ${effectiveMode} (graphType: ${domainProfile.graphType})`);\n\n // ─── Layer 3: Dispatch & Execute ─────────────────────────────────────────\n if (effectiveMode === 'concept') {\n log('LAYER_3', 'Executing Knowledge Graph Pipeline (Concept-driven)...');\n const knowledgeResult = await runKnowledgeGraphPipeline({\n subject: options.subject || domainProfile.detectedSubject || options.goal || options.description || 'General Subject',\n description: options.description,\n syllabusText: options.syllabusText,\n parsedSyllabus: options.parsedSyllabus,\n gradeBand: options.gradeBand,\n domain: domainProfile.domainCategory,\n techStack: options.techStack || domainProfile.detectedTechStack?.[0],\n llmConfig: options.llmConfig,\n onProgress: options.onProgress,\n knowledgeTreePath: options.knowledgeTreePath,\n proposalsPath: options.proposalsPath,\n });\n warnings.push(...knowledgeResult.warnings);\n\n return {\n domainProfile,\n graphType: 'knowledge_graph',\n curriculumFeed: knowledgeResult.curriculumFeed,\n knowledgeResult,\n warnings,\n };\n }\n\n if (effectiveMode === 'hybrid') {\n log('LAYER_3', 'Executing Hybrid Graph Pipeline...');\n if (options.repoDir) {\n const projectResult = await runProjectGraphPipeline({\n repoDir: options.repoDir,\n goal: options.goal || 'Build complete project',\n techStack: options.techStack || 'typescript',\n llmConfig: options.llmConfig,\n embeddings: options.embeddings,\n onProgress: options.onProgress,\n });\n\n const knowledgeResult = await runKnowledgeGraphPipeline({\n subject: options.subject || domainProfile.detectedSubject || options.goal || 'Subject Theory',\n description: options.description,\n syllabusText: options.syllabusText,\n parsedSyllabus: options.parsedSyllabus,\n domain: domainProfile.domainCategory,\n techStack: options.techStack,\n llmConfig: options.llmConfig,\n onProgress: options.onProgress,\n });\n\n const hybridResult = await runHybridGraphPipeline({\n projectGraph: projectResult.projectGraph,\n knowledgeGraph: knowledgeResult.knowledgeGraph,\n llmConfig: options.llmConfig,\n onProgress: options.onProgress,\n });\n\n warnings.push(...hybridResult.warnings);\n return {\n domainProfile,\n graphType: 'hybrid_graph',\n curriculumFeed: hybridResult.curriculumFeed,\n projectResult,\n knowledgeResult,\n hybridResult,\n warnings,\n };\n } else {\n warnings.push('Hybrid learning mode requested but repoDir was not provided — falling back to concept-driven knowledge graph pipeline');\n const knowledgeResult = await runKnowledgeGraphPipeline({\n subject: options.subject || domainProfile.detectedSubject || options.goal || 'Subject Theory',\n description: options.description,\n syllabusText: options.syllabusText,\n parsedSyllabus: options.parsedSyllabus,\n domain: domainProfile.domainCategory,\n techStack: options.techStack,\n llmConfig: options.llmConfig,\n onProgress: options.onProgress,\n });\n warnings.push(...knowledgeResult.warnings);\n\n return {\n domainProfile,\n graphType: 'knowledge_graph',\n curriculumFeed: knowledgeResult.curriculumFeed,\n knowledgeResult,\n warnings,\n };\n }\n }\n\n // Default: product-driven\n log('LAYER_3', 'Executing Project Graph Pipeline (Product-driven)...');\n if (!options.repoDir) {\n throw new Error('repoDir is required for product-driven project graph pipeline');\n }\n\n const projectResult = await runProjectGraphPipeline({\n repoDir: options.repoDir,\n goal: options.goal || 'Build complete project',\n techStack: options.techStack || domainProfile.detectedTechStack?.[0] || 'typescript',\n llmConfig: options.llmConfig,\n embeddings: options.embeddings,\n onProgress: options.onProgress,\n });\n\n // Emit curriculum feed from project graph\n const { emitCurriculumFeed } = await import('../feed/curriculumFeedEmitter');\n const curriculumFeed = emitCurriculumFeed(projectResult.projectGraph, {\n warnings,\n });\n\n return {\n domainProfile,\n graphType: 'project_graph',\n curriculumFeed,\n projectResult,\n warnings,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/schemas/curriculumFeedSchema.ts","../../src/feed/curriculumFeedEmitter.ts","../../src/parsers/swift.ts","../../src/parsers/typescript.ts","../../src/parsers/python.ts","../../src/parsers/cpp.ts","../../src/extractors/keywordExtractor.ts","../../src/utils/llmClient.ts","../../src/graph/scaffoldExtractor.ts","../../src/graph/overviewExtractor.ts","../../src/graph/stepExtractor.ts","../../src/graph/graphVerifier.ts","../../src/graph/conceptEscalator.ts","../../src/concepts/conceptResolver.ts","../../src/assembly/roadmapAssembler.ts","../../src/extractors/fileSelector.ts","../../src/utils/fileUtils.ts","../../src/pipeline/projectGraphPipeline.ts","../../src/graph/loCodeStandard.ts","../../src/parsers/syllabusParser.ts","../../src/graph/knowledgeGraphVerifier.ts","../../src/graph/loExemplars.ts","../../src/graph/depthAudit.ts","../../src/graph/hierarchicalLoAuthoring.ts","../../src/graph/knowledgeTreeCatalog.ts","../../src/graph/conceptStandardizer.ts","../../src/graph/knowledgeGraphPipeline.ts","../../src/pipeline/knowledgeGraphPipeline.ts","../../src/graph/hybridGraphPipeline.ts","../../src/pipeline/hybridGraphPipeline.ts","../../src/detector/inputTypeDetector.ts","../../src/detector/domainDetector.ts","../../src/detector/learningModeDetector.ts","../../src/detector/domainProfileDetector.ts","../../src/pipeline/domainRouter.ts"],"names":["z","pad2","IMPORT_RE","TYPE_RE","FUNC_RE","resolve","buildSourceText","stepMinutes","execSync","extname","join","readdirSync","readFileSync","relative","tokens","mkdirSync","writeFileSync","arr","JSON_ONLY","tmpdir","raw","projectResult","emitCurriculumFeed"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from 'zod';\n\n/**\n * CurriculumFeed v2 — normalized, planner-ready projection of a domain graph.\n * Consumers: curriculum-kit Curriculum Planner (see docs/ideas/2026-08-30-curriculum-feed-v2-output.md).\n * Guarantees enforced here: cycle-free is the CALLER's verifier job; the feed\n * itself guarantees resolution (edges/keywords reference emitted nodes) and\n * non-emptiness.\n */\n\nexport const FeedKeywordsSchema = z.object({\n all: z.array(z.string()).default([]),\n new: z.array(z.string()).default([]),\n prerequisite: z.array(z.string()).default([]),\n});\n\nexport const FeedScaffoldCandidateSchema = z.object({\n item: z.string(),\n reason: z.string().default(''),\n minutes_saved: z.number().int().nonnegative().default(0),\n suggest: z.enum(['provide_full', 'provide_partial', 'provide_reference']).default('provide_full'),\n});\n\nexport const FeedNodeSchema = z.object({\n id: z.string().min(1),\n kind: z.enum(['skill', 'concept', 'product_step']),\n name: z.string().min(1),\n concept_codes: z.array(z.string()).default([]),\n keywords: FeedKeywordsSchema,\n estimated_minutes: z.number().int().nonnegative(),\n bloom_hint: z.enum(['Remember', 'Understand', 'Apply', 'Analyze', 'Evaluate', 'Create']).nullable().default(null),\n depth_hint: z.enum(['ulo', 'cio', 'sio']).nullable().default(null),\n completion_level: z.enum(['mvp', 'standard', 'stretch']).default('standard'),\n scaffolding: z.object({\n scaffold_candidates: z.array(FeedScaffoldCandidateSchema).default([]),\n core_value_minutes: z.number().int().nonnegative().default(0),\n }).default({ scaffold_candidates: [], core_value_minutes: 0 }),\n references: z.array(z.object({ file: z.string().min(1), evidence: z.string().default('') })).default([]),\n feature_id: z.string().nullable().default(null),\n concept_ref: z.string().nullable().default(null),\n // P52/T2.1: outcome.user_visible projected from the ProjectGraph step — the\n // tangible checkpoint the session-cutting planner aims for (empty when the\n // step declares no user-visible result). Concepts carry '' by default.\n user_visible_deliverable: z.string().default(''),\n // P52/T3.1 — depth-reconcile inputs (optional/defaulted so old feeds\n // validate unchanged):\n // • depth_variants: minutes to teach this node at each depth level.\n // ULO (know-it-exists) ≤ CIO (mechanism) ≤ SIO (implementation). All 3\n // required so a downgrade never turns an anchor teach into a zero.\n // • depth_scaffold_candidates: parallel to scaffold_candidates but\n // acts on DEPTH (e.g. SIO→CIO) instead of lesson time.\n // • is_core: concept is a Master-Tree core concept — reconciler must\n // never downgrade it; escalate instead.\n depth_variants: z.object({ ulo: z.number().int().nonnegative(), cio: z.number().int().nonnegative(), sio: z.number().int().nonnegative() }).optional(),\n depth_scaffold_candidates: z.array(z.object({\n from_depth: z.enum(['ulo', 'cio', 'sio']),\n to_depth: z.enum(['ulo', 'cio', 'sio']),\n minutes_saved: z.number().int().nonnegative(),\n reason: z.string().default(''),\n })).optional(),\n is_core: z.boolean().default(false),\n // Progressive-completion bookkeeping (feed v2, additive):\n // phase_id = development phase that introduces/uses this node;\n // introduce_aspect = how the phase teaches a concept node (first intro, advanced\n // revisit, or preview — a light ULO awareness pass that is NOT the introduction).\n phase_id: z.string().default(''),\n introduce_aspect: z.enum(['new', 'advanced', 'preview']).nullable().default(null),\n});\n\nexport const FeedEdgeSchema = z.object({\n from: z.string().min(1),\n to: z.string().min(1),\n kind: z.enum(['knowledge', 'task']),\n reason: z.string().default(''),\n});\n\nexport const FeedGroupingSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n node_ids: z.array(z.string()).min(1),\n rationale: z.string().default(''),\n});\n\nexport const FeedPhaseSchema = z.object({\n id: z.string().min(1),\n order: z.number().int().positive(),\n name: z.string().min(1),\n product_completion: z.string().min(1),\n node_ids: z.array(z.string()).min(1),\n});\nexport type FeedPhase = z.infer<typeof FeedPhaseSchema>;\n\nexport const CurriculumFeedSchema = z.object({\n schema_version: z.literal(2),\n source: z.object({\n graph_type: z.enum(['project_graph', 'knowledge_graph', 'hybrid_graph']),\n warnings: z.array(z.string()).default([]),\n hallucination_count: z.number().int().nonnegative().default(0),\n }),\n learning_nodes: z.array(FeedNodeSchema).min(1, 'curriculum feed must contain at least one learning node'),\n dependency_edges: z.array(FeedEdgeSchema).default([]),\n suggested_groupings: z.array(FeedGroupingSchema).default([]),\n // Progressive completion phases (cross-feature). When non-empty, these — not\n // suggested_groupings — define the teaching sequence and unit structure.\n phases: z.array(FeedPhaseSchema).default([]),\n});\n\nexport type CurriculumFeed = z.infer<typeof CurriculumFeedSchema>;\nexport type FeedNode = z.infer<typeof FeedNodeSchema>;\nexport type FeedEdge = z.infer<typeof FeedEdgeSchema>;\nexport type FeedGrouping = z.infer<typeof FeedGroupingSchema>;\n\n/** Strict pre-save resolution validation — fail-closed, no defaulted-empty graphs. */\nexport function validateCurriculumFeed(feed: unknown): CurriculumFeed {\n const parsed = CurriculumFeedSchema.parse(feed);\n const ids = new Set(parsed.learning_nodes.map((n) => n.id));\n if (ids.size !== parsed.learning_nodes.length) {\n throw new Error('curriculum feed contains duplicate node ids');\n }\n for (const e of parsed.dependency_edges) {\n if (!ids.has(e.from) || !ids.has(e.to)) {\n throw new Error('curriculum feed edge ' + e.from + ' -> ' + e.to + ' references unknown node');\n }\n if (e.from === e.to) throw new Error('curriculum feed self-loop edge on ' + e.from);\n }\n for (const g of parsed.suggested_groupings) {\n for (const id of g.node_ids) {\n if (!ids.has(id)) throw new Error('grouping ' + g.id + ' references unknown node ' + id);\n }\n }\n for (const ph of parsed.phases) {\n for (const id of ph.node_ids) {\n if (!ids.has(id)) throw new Error('phase ' + ph.id + ' references unknown node ' + id);\n }\n }\n const phaseIds = parsed.phases.map((p) => p.id);\n if (new Set(phaseIds).size !== phaseIds.length) throw new Error('curriculum feed contains duplicate phase ids');\n // Teaching-order invariant (2026-09-17 incident): when phases define the\n // teaching sequence, a prerequisite must live in the same or an EARLIER\n // phase than its consumer. Without this check a self-contradictory feed\n // (backwards phase-crossing edge) sailed through emission and only exploded\n // much later inside the planner as \"Teaching-order violation in session ...\"\n // — far from the constructor that produced the contradiction.\n if (parsed.phases.length > 0) {\n const phaseIndexOf = new Map<string, number>();\n parsed.phases.forEach((p, i) => {\n for (const id of p.node_ids) phaseIndexOf.set(id, i);\n });\n for (const e of parsed.dependency_edges) {\n const fromIdx = phaseIndexOf.get(e.from);\n const toIdx = phaseIndexOf.get(e.to);\n if (fromIdx === undefined || toIdx === undefined) continue; // node outside the phase sequence\n if (fromIdx > toIdx) {\n throw new Error(\n 'curriculum feed teaching-order violation: prerequisite ' + e.from +\n ' (phase ' + (fromIdx + 1) + ') is scheduled AFTER its consumer ' + e.to +\n ' (phase ' + (toIdx + 1) + ')',\n );\n }\n }\n }\n return parsed;\n}\n","import {\n validateCurriculumFeed, type CurriculumFeed, type FeedNode, type FeedEdge, type FeedGrouping,\n} from '../schemas/curriculumFeedSchema';\n\n/**\n * CurriculumFeed emitter - pure transformation from a VERIFIED domain graph\n * to the planner-ready feed. No LLM calls: hints derive from existing\n * annotations only. Validates its own output (fail-closed).\n *\n * Phase-driven emission (hybrid graphs with development phases): the teaching\n * sequence IS the phase sequence. Concepts are emitted at the phase that\n * introduces them (aspect new) or revisits them at higher depth (aspect\n * advanced) - never as a trailing knowledge appendix. Concept minutes stay\n * UNMERGED: no prerequisite-minute inflation (the planner schedules the\n * revisit, not the total).\n */\n\nexport interface EmitFeedOptions {\n hallucinationCount?: number;\n warnings?: string[];\n}\n\nconst BLOOM_RANK: Record<string, number> = { Remember: 0, Understand: 1, Apply: 2, Analyze: 3, Evaluate: 4, Create: 5 };\nconst pad2 = (n: number): string => String(n).padStart(2, '0');\n\ntype Rec = Record<string, unknown>;\nconst arr = (v: unknown): Rec[] => (Array.isArray(v) ? (v as Rec[]) : []);\nconst str = (v: unknown, d = ''): string => (typeof v === 'string' ? v : d);\nconst num = (v: unknown, d: number): number => (typeof v === 'number' && Number.isFinite(v) ? v : d);\nconst strs = (v: unknown): string[] => (Array.isArray(v) ? v.filter((x): x is string => typeof x === 'string') : []);\n\nfunction stepMinutes(step: Rec): number {\n const effort = (step.effort ?? {}) as Rec;\n return Math.max(0, Math.round(num(effort.estimated_minutes, num(step.estimated_minutes, 45))));\n}\n\nfunction pushWarning(opts: EmitFeedOptions, message: string): void {\n (opts.warnings ?? (opts.warnings = [])).push(message);\n}\n\nfunction newKeywordsInOrder(nodes: FeedNode[]): void {\n // First appearance in emission order becomes 'new'; everything seen before is 'prerequisite'.\n const seen = new Set<string>();\n for (const n of nodes) {\n const all = n.keywords.all;\n n.keywords.new = [];\n n.keywords.prerequisite = [];\n for (const k of all) {\n if (seen.has(k)) n.keywords.prerequisite.push(k);\n else n.keywords.new.push(k);\n seen.add(k);\n }\n }\n}\n\nfunction feedNodeFromStep(step: Rec, featureId: string): FeedNode {\n const id = str(step.id);\n return {\n id,\n kind: 'product_step',\n name: str(step.name, id),\n concept_codes: strs(step.concept_codes),\n keywords: { all: strs(step.keywords), new: [], prerequisite: [] },\n estimated_minutes: stepMinutes(step),\n bloom_hint: 'Apply',\n depth_hint: null,\n completion_level: 'standard',\n scaffolding: { scaffold_candidates: [], core_value_minutes: stepMinutes(step) },\n references: arr(step.files).map((f) => ({ file: str(f), evidence: 'step file' })).filter((f) => f.file),\n feature_id: featureId,\n concept_ref: null,\n // P52/T2.1: carry the step's tangible outcome so the planner can cut\n // sessions at user-visible checkpoints instead of raw minute counts.\n user_visible_deliverable: str((step.outcome as Rec | undefined)?.user_visible),\n is_core: false,\n phase_id: '',\n introduce_aspect: null,\n };\n}\n\nfunction deriveConceptDepthHint(concept: Rec): FeedNode['depth_hint'] {\n const explicit = str(concept.depth_hint);\n if (explicit === 'ulo' || explicit === 'cio' || explicit === 'sio') return explicit;\n\n const sio = arr(concept.sio);\n const prereqs = strs(concept.prerequisites);\n const pts = arr(concept.problem_types);\n const hasHighBloom = pts.some((p) => {\n const b = str(p.bloom_level);\n return b === 'Apply' || b === 'Analyze' || b === 'Evaluate' || b === 'Create';\n });\n\n if (sio.length >= 2 || hasHighBloom) return 'sio';\n if (str(concept.cio) || prereqs.length >= 1) return 'cio';\n return 'ulo';\n}\n\n/**\n * P52/T3.1: minute estimates per depth level for one concept occurrence.\n * ULO (know-it-exists) is a fraction of the full teach; SIO (implementation)\n * equals the feed's estimated minutes. Only DOWNWARD candidates are offered\n * and the ULO floor is never crossed (planner filters is_core itself).\n */\nfunction deriveDepthInputs(minutes: number, depth: FeedNode['depth_hint']): Pick<FeedNode, 'depth_variants' | 'depth_scaffold_candidates'> {\n const ulo = Math.max(5, Math.round(minutes * 0.35));\n const cio = Math.max(ulo + 5, Math.round(minutes * 0.65));\n const sio = Math.max(cio + 5, minutes);\n const variants = { ulo, cio, sio };\n const candidates: NonNullable<FeedNode['depth_scaffold_candidates']> = [];\n if (depth === 'sio') {\n candidates.push({ from_depth: 'sio', to_depth: 'cio', minutes_saved: sio - cio, reason: 'SIO implementation practice deferred — CIO mechanism suffices for downstream consumers' });\n }\n if (depth === 'cio' || depth === 'sio') {\n candidates.push({ from_depth: depth, to_depth: 'ulo', minutes_saved: (depth === 'sio' ? sio : cio) - ulo, reason: 'Mechanism deferred — ULO awareness suffices (know-it-exists); never below the ULO floor' });\n }\n return { depth_variants: variants, depth_scaffold_candidates: candidates };\n}\n\nfunction feedNodeFromConcept(concept: Rec): FeedNode {\n const id = str(concept.id);\n const pts = arr(concept.problem_types)\n .map((p) => str(p.bloom_level, 'Understand'))\n .filter((b) => b in BLOOM_RANK)\n .sort((a, b) => BLOOM_RANK[a] - BLOOM_RANK[b]);\n const topBloom = pts[pts.length - 1] ?? 'Understand';\n\n const rawRefs = arr(concept.references);\n const references = rawRefs.length > 0\n ? rawRefs.map((r) => ({ file: str(r.file, 'syllabus.md'), evidence: str(r.evidence, str(concept.name)) })).filter((r) => r.file)\n : [{ file: 'syllabus.md', evidence: str(concept.category ? `Topic under category ${str(concept.category)}` : str(concept.name), id) }];\n\n const problemScaffolds = arr(concept.problem_types).map((pt) => ({\n item: str(pt.name, 'Problem type'),\n reason: str(pt.description, 'Formative practice check'),\n minutes_saved: num(pt.estimated_minutes, 10),\n suggest: 'provide_partial' as const,\n }));\n\n return {\n id,\n kind: 'concept',\n name: str(concept.name, id),\n concept_codes: [str(concept.code) || id].filter(Boolean),\n keywords: { all: strs(concept.keywords), new: [], prerequisite: [] },\n estimated_minutes: Math.max(0, Math.round(num(concept.estimated_minutes, 15))),\n bloom_hint: topBloom as FeedNode['bloom_hint'],\n depth_hint: deriveConceptDepthHint(concept),\n completion_level: 'standard',\n scaffolding: {\n scaffold_candidates: problemScaffolds,\n core_value_minutes: Math.max(0, Math.round(num(concept.estimated_minutes, 15))),\n },\n references,\n feature_id: null,\n concept_ref: id,\n user_visible_deliverable: '', // concepts are taught, not shipped — checkpoints live on product steps\n ...deriveDepthInputs(Math.max(0, Math.round(num(concept.estimated_minutes, 15))), deriveConceptDepthHint(concept)),\n is_core: false,\n phase_id: '',\n introduce_aspect: null,\n };\n}\n\nfunction addFeatureGroup(\n f: Rec, fid: string, nodes: FeedNode[], edges: FeedEdge[], groupings: FeedGrouping[],\n): string[] {\n const steps = arr(f.steps);\n const stepIds: string[] = [];\n let prev = '';\n for (let i = 0; i < steps.length; i++) {\n const stepNode = feedNodeFromStep(steps[i], fid);\n if (!stepNode.id) continue;\n stepIds.push(stepNode.id);\n nodes.push(stepNode);\n if (prev) edges.push({ from: prev, to: stepNode.id, kind: 'task', reason: 'feature build order' });\n prev = stepNode.id;\n }\n for (const dep of strs(f.depends_on)) {\n const depFirst = nodes.find((n) => n.feature_id === dep);\n if (depFirst && stepIds[0]) edges.push({ from: depFirst.id, to: stepIds[0], kind: 'task', reason: 'feature depends_on ' + dep });\n }\n if (stepIds.length > 0) groupings.push({ id: 'G-' + fid, name: str(f.name, fid), node_ids: stepIds, rationale: str(f.description, '') });\n return stepIds;\n}\n\ninterface EmitPhaseCtx {\n id: string;\n order: number;\n name: string;\n productCompletion: string;\n conceptOrder: string[]; // concept node ids in teaching order (new first, then advanced)\n featureIds: string[];\n}\n\n/**\n * Phase-driven hybrid emission:\n * - emit concepts per phase (aspect new first, then advanced) BEFORE the\n * phase's features; knowledge edges concept -> first step of consumer\n * features carry the JIT relation\n * - feature order inside a phase follows the project graph order\n * - phases and their node_ids go into feed.phases (teaching sequence)\n * - concept minutes stay UNMERGED (no prereq-minute accumulation)\n */\nfunction emitFromHybrid(hybrid: Rec, opts: EmitFeedOptions): CurriculumFeed {\n const nodes: FeedNode[] = [];\n const edges: FeedEdge[] = [];\n const groupings: FeedGrouping[] = [];\n const pg = (hybrid.project_graph ?? {}) as Rec;\n const kg = (hybrid.knowledge_graph ?? {}) as Rec;\n const rawPhases = arr(hybrid.phases).filter((p) => str(p.id));\n\n const features = arr(pg.features);\n const conceptRecs = arr(kg.concepts);\n const conceptById = new Map(conceptRecs.map((c) => [str(c.id), c]));\n\n // --- no phases -> legacy path (concepts first, then features) -----------\n if (rawPhases.length === 0) {\n for (const c of conceptRecs) {\n const node = feedNodeFromConcept(c);\n nodes.push(node);\n for (const p of strs(c.prerequisites)) edges.push({ from: p, to: node.id, kind: 'knowledge', reason: 'concept prerequisite' });\n }\n features.forEach((f, fi) => addFeatureGroup(f, str(f.id, 'F' + pad2(fi + 1)), nodes, edges, groupings));\n linkHybridKnowledgeEdges(hybrid, nodes, edges, true);\n newKeywordsInOrder(nodes);\n return validateCurriculumFeed({\n schema_version: 2,\n source: { graph_type: 'hybrid_graph', warnings: opts.warnings ?? [], hallucination_count: opts.hallucinationCount ?? 0 },\n learning_nodes: nodes,\n dependency_edges: edges,\n suggested_groupings: groupings,\n phases: [],\n });\n }\n\n // --- phase-driven emission ----------------------------------------------\n const featureOrder = new Map<string, number>();\n features.forEach((f, fi) => featureOrder.set(str(f.id, 'F' + pad2(fi + 1)), fi));\n const stepIdsByFeature = new Map<string, string[]>();\n for (const f of features) {\n const fid = str(f.id);\n stepIdsByFeature.set(fid, arr(f.steps).map((s) => str(s.id)).filter(Boolean));\n }\n\n const emitCtx: EmitPhaseCtx[] = [];\n const emittedConcepts = new Set<string>();\n const previewsEmitted = new Set<string>();\n const linkList = arr(hybrid.links);\n\n for (const rp of rawPhases) {\n const pid = str(rp.id);\n const order = num(rp.order, emitCtx.length + 1);\n const conceptOrder: string[] = [];\n const intros = arr(rp.introduces);\n // new introductions first, then advanced revisits, then previews\n // (awareness passes — never the introduction itself)\n const news = intros.filter((i) => str(i.aspect, 'new') === 'new');\n const advanced = intros.filter((i) => str(i.aspect) === 'advanced');\n const previews = intros.filter((i) => str(i.aspect) === 'preview');\n for (const intro of [...news, ...advanced, ...previews]) {\n const cid = str(intro.concept_id);\n const c = conceptById.get(cid);\n if (!c) {\n throw new Error('Phase ' + pid + ' introduces unknown concept ' + cid + ' - fail-closed');\n }\n if (str(intro.aspect, 'new') === 'advanced' && !emittedConcepts.has(cid)) {\n throw new Error('Phase ' + pid + ' advanced-revisits concept ' + cid + ' that was never emitted - fail-closed');\n }\n if (str(intro.aspect, 'new') === 'preview') {\n if (emittedConcepts.has(cid)) {\n throw new Error('Phase ' + pid + ' previews concept ' + cid + ' that was already introduced - preview must precede the anchor teach - fail-closed');\n }\n if (previewsEmitted.has(cid)) {\n throw new Error('Phase ' + pid + ' duplicate preview of concept ' + cid + ' - fail-closed');\n }\n const pidIdx = rawPhases.findIndex((rp2) => str(rp2.id) === pid);\n const anchorIdx = rawPhases.findIndex((rp2) => arr(rp2.introduces).some((i2) => str(i2.concept_id) === cid && str(i2.aspect, 'new') !== 'preview'));\n if (anchorIdx < 0) {\n throw new Error('Phase ' + pid + ' previews concept ' + cid + ' that is never fully introduced in any phase - fail-closed');\n }\n if (pidIdx >= anchorIdx) {\n throw new Error('Phase ' + pid + ' previews concept ' + cid + ' whose anchor introduction is not in a LATER phase - fail-closed');\n }\n previewsEmitted.add(cid);\n // ULO awareness node: \"know it exists\". Keeps the concept vocabulary\n // (keywords.all) so the emitter's in-order pass makes the PREVIEW the\n // legitimate introducer of those words — a product step must never be\n // the introducer (the overtake guard's whole point). Depth pinned to\n // ulo, bloom to Understand, ~25% minutes, no prerequisite edges, no\n // scaffolding (nothing to practice yet).\n const prevNode = feedNodeFromConcept(c);\n prevNode.id = cid + '__PREV' + pad2(order);\n prevNode.name = str(c.name, cid) + ' (preview)';\n prevNode.phase_id = pid;\n prevNode.introduce_aspect = 'preview';\n prevNode.estimated_minutes = Math.max(5, Math.round(prevNode.estimated_minutes * 0.25));\n prevNode.depth_hint = 'ulo';\n prevNode.bloom_hint = 'Understand';\n prevNode.concept_codes = [str(c.code) || cid];\n prevNode.keywords = { all: strs(c.keywords), new: [], prerequisite: [] };\n prevNode.scaffolding = { scaffold_candidates: [], core_value_minutes: 0 };\n prevNode.depth_variants = { ulo: prevNode.estimated_minutes, cio: prevNode.estimated_minutes, sio: prevNode.estimated_minutes };\n prevNode.depth_scaffold_candidates = []; // nothing to downgrade — it IS the floor\n nodes.push(prevNode);\n conceptOrder.push(prevNode.id);\n continue;\n }\n if (!emittedConcepts.has(cid)) {\n const node = feedNodeFromConcept(c);\n node.phase_id = pid;\n node.introduce_aspect = 'new';\n nodes.push(node);\n for (const p of strs(c.prerequisites)) {\n if (!emittedConcepts.has(p)) {\n throw new Error('Concept ' + cid + ' (phase ' + pid + ') has prerequisite ' + p + ' that is not introduced in an earlier phase - fail-closed');\n }\n edges.push({ from: p, to: cid, kind: 'knowledge', reason: 'concept prerequisite' });\n }\n emittedConcepts.add(cid);\n conceptOrder.push(cid);\n } else {\n // advanced revisit: re-emit as a NEW node with a revisit id so the\n // planner can schedule the higher-depth pass without double-counting\n // the first introduction\n const revisitId = cid + '__ADV' + pad2(order);\n const node = feedNodeFromConcept(c);\n node.id = revisitId;\n node.name = str(c.name, cid) + ' (advanced)';\n node.phase_id = pid;\n node.introduce_aspect = 'advanced';\n node.depth_scaffold_candidates = [{ from_depth: 'sio', to_depth: 'cio', minutes_saved: Math.round(node.estimated_minutes * 0.3), reason: 'advanced revisit may drop to CIO recap without breaking first-teach chain' }];\n node.estimated_minutes = Math.max(15, Math.round(node.estimated_minutes * 0.5));\n node.concept_codes = [str(c.code) || cid];\n edges.push({ from: cid, to: revisitId, kind: 'knowledge', reason: 'advanced revisit of ' + cid + ' at phase ' + pid });\n nodes.push(node);\n conceptOrder.push(revisitId);\n }\n }\n const featureIds = strs(rp.feature_ids)\n .filter((fid) => featureOrder.has(fid))\n .sort((a, b) => featureOrder.get(a)! - featureOrder.get(b)!);\n emitCtx.push({ id: pid, order, name: str(rp.name, pid), productCompletion: str(rp.product_completion), conceptOrder, featureIds });\n }\n\n // Fail-closed: every concept consumed by a link must be emitted somewhere\n for (const l of linkList) {\n const cid = str(l.concept_id);\n if (cid && conceptById.has(cid) && !emittedConcepts.has(cid)) {\n throw new Error('Concept ' + cid + ' is consumed by links but never introduced in any phase - fail-closed');\n }\n }\n // Fail-closed: every feature must sit in exactly one emitted phase\n const seenFeatures = new Set(emitCtx.flatMap((e) => e.featureIds));\n const missingFeatures = features.map((f) => str(f.id)).filter((fid) => fid && !seenFeatures.has(fid));\n if (missingFeatures.length > 0) {\n throw new Error('Features not covered by any phase: ' + missingFeatures.join(', ') + ' - fail-closed');\n }\n\n // Emit feature steps phase by phase (teaching sequence)\n const phaseNodeIds: string[][] = [];\n for (const ctx of emitCtx) {\n const ids: string[] = [...ctx.conceptOrder];\n for (const fid of ctx.featureIds) {\n const f = features.find((x) => str(x.id) === fid)!;\n const stepIds = addFeatureGroup(f, fid, nodes, edges, groupings);\n for (const sid of stepIds) {\n const node = nodes.find((n) => n.id === sid)!;\n node.phase_id = ctx.id;\n }\n ids.push(...stepIds);\n }\n phaseNodeIds.push(ids);\n }\n\n // Teaching-order emission (2026-09-17 incident): the nodes array MUST\n // follow the phase sequence. Downstream consumers (planner unit grouping,\n // keyword new/prerequisite labeling, keyword-edge materialization) treat\n // array order as teaching order; emitting \"all concepts first, steps\n // after\" diverged from the phase order and manufactured backwards\n // prerequisite edges across phases (e.g. C8 in PH3 labeled before a PH2\n // step that consumes its keyword) — a self-contradictory feed.\n const placed = new Set<string>(phaseNodeIds.flat());\n const orderedNodes: FeedNode[] = [];\n for (const ids of phaseNodeIds) {\n for (const id of ids) {\n const n = nodes.find((x) => x.id === id);\n if (n) orderedNodes.push(n);\n }\n }\n for (const n of nodes) if (!placed.has(n.id)) orderedNodes.push(n);\n nodes.length = 0;\n nodes.push(...orderedNodes);\n\n // Knowledge edges: concept -> first step of each consumer feature (JIT).\n // Deduped by (from,to): several links may target the same feature.\n const edgeSeen = new Set(edges.map((e) => e.from + '>' + e.to));\n const pushEdge = (from: string, to: string, reason: string) => {\n const key = from + '>' + to;\n if (edgeSeen.has(key)) return;\n edgeSeen.add(key);\n edges.push({ from, to, kind: 'knowledge', reason });\n };\n for (const l of linkList) {\n const cid = str(l.concept_id);\n const fid = str(l.feature_id);\n if (!conceptById.has(cid)) continue;\n const firstStep = (stepIdsByFeature.get(fid) || [])[0];\n if (!firstStep) continue;\n const depth = str(l.depth, 'cio');\n // Preview-aware guard: when the concept's anchor teach sits in a LATER\n // phase than the consumer step, the consumer is served by its __PREV\n // awareness node — the anchor edge would cross phases backwards. Never\n // manufacture it; record the drift instead.\n const anchorNode = nodes.find((n2) => n2.kind === 'concept' && n2.concept_ref === cid && n2.introduce_aspect === 'new');\n const stepNode = nodes.find((n2) => n2.id === firstStep);\n const anchorPhaseIdx = anchorNode ? emitCtx.findIndex((c2) => c2.id === anchorNode.phase_id) : -1;\n const stepPhaseIdx = stepNode ? emitCtx.findIndex((c2) => c2.id === stepNode.phase_id) : -1;\n if (emitCtx.length > 0 && anchorPhaseIdx > stepPhaseIdx) {\n pushWarning(opts, 'hybrid link drift: concept ' + cid + ' is fully taught in a later phase than consumer ' + firstStep + ' (a preview covers the dependency)');\n continue;\n }\n pushEdge(cid, firstStep, str(l.relationship, 'hybrid link') + ' [' + depth + ']');\n // Advanced revisits feed only features of the revisit's OWN phase: a PH2\n // revisit must never become a prerequisite of a PH1 feature (teaching\n // order is phase-ordered).\n for (const n of nodes) {\n if (n.kind === 'concept' && n.concept_ref === cid && n.introduce_aspect === 'advanced' && n.phase_id === str(l.phase_id)) {\n pushEdge(n.id, firstStep, 'advanced application [' + depth + ']');\n }\n }\n }\n\n newKeywordsInOrder(nodes);\n\n // Deterministic keyword-prerequisite materialization: when a node declares a\n // keyword as PREREQUISITE, some other node must INTRODUCE it (new) EARLIER in\n // feed order. Missing edge = planner can schedule the consumer first while the\n // audit flags ordering it cannot fix. Edge kind 'keyword' — the planner\n // honors it for topological order; 'mastered_before_course' entries are exempt\n // (entry-level keywords need no introducer).\n const feedOrder = new Map(nodes.map((n, i) => [n.id, i]));\n const introducer = new Map<string, string>();\n for (const n of nodes) for (const k of n.keywords?.new ?? []) {\n const key = k.toLowerCase();\n if (!introducer.has(key)) introducer.set(key, n.id);\n }\n for (const n of nodes) {\n for (const k of n.keywords?.prerequisite ?? []) {\n const src = introducer.get(k.toLowerCase());\n if (!src || src === n.id) continue;\n const srcNode = nodes.find((x) => x.id === src);\n // Phase-aware guard: when phases define teaching order, a keyword edge\n // must never cross phases backwards, and a CONCEPT must never be\n // \"introduced\" by a product STEP that happens to run earlier (the\n // graph anchored the concept downstream of its consumer — teaching\n // order would then declare the step as the origin of foundational\n // knowledge). Do NOT manufacture such edges: record the drift for the\n // host to repair (move the introducer earlier) and let\n // validateCurriculumFeed's teaching-order invariant be the hard gate.\n const phaseOf = (id: string): number => {\n const n2 = nodes.find((x) => x.id === id);\n return n2 ? emitCtx.findIndex((c) => c.id === n2.phase_id) : -1;\n };\n const conceptOvertaken = n.kind === 'concept' && srcNode?.kind === 'product_step';\n const fromPhase = phaseOf(src);\n const toPhase = phaseOf(n.id);\n if (conceptOvertaken || (emitCtx.length > 0 && fromPhase > toPhase)) {\n pushWarning(opts,\n 'keyword-order drift: introducer ' + src + ' sits in a later phase than consumer ' + n.id +\n ' (keyword \"' + k + '\") — host should move the introducer earlier',\n );\n continue;\n }\n if (feedOrder.get(src)! < feedOrder.get(n.id)!) pushEdge(src, n.id, 'keyword prerequisite [' + k + ']');\n }\n }\n\n const phases = emitCtx.map((ctx, i) => ({\n id: ctx.id,\n order: ctx.order,\n name: ctx.name,\n product_completion: ctx.productCompletion || 'Phase ' + (i + 1) + ' deliverable',\n node_ids: phaseNodeIds[i],\n }));\n\n return validateCurriculumFeed({\n schema_version: 2,\n source: { graph_type: 'hybrid_graph', warnings: opts.warnings ?? [], hallucination_count: opts.hallucinationCount ?? 0 },\n learning_nodes: nodes,\n dependency_edges: edges,\n suggested_groupings: groupings,\n phases,\n });\n}\n\n/** Legacy helper: knowledge edges from hybrid links (used by the no-phase path). */\nfunction linkHybridKnowledgeEdges(hybrid: Rec, nodes: FeedNode[], edges: FeedEdge[], setStepHints: boolean): void {\n const conceptIds = new Set(nodes.filter((n) => n.kind === 'concept').map((n) => n.concept_ref || n.id));\n for (const l of arr(hybrid.links)) {\n const conceptId = str(l.concept_id);\n const featureId = str(l.feature_id);\n if (!conceptIds.has(conceptId)) continue;\n const depth = str(l.depth, 'cio');\n const firstStep = nodes.find((n) => n.feature_id === featureId);\n if (firstStep) {\n edges.push({ from: conceptId, to: firstStep.id, kind: 'knowledge', reason: str(l.relationship, 'hybrid link') + ' [' + depth + ']' });\n if (setStepHints && !firstStep.depth_hint) {\n firstStep.depth_hint = (['ulo', 'cio', 'sio'] as const).includes(depth as 'ulo') ? (depth as FeedNode['depth_hint']) : 'cio';\n }\n }\n }\n}\n\nfunction emitFromKnowledge(kg: Rec, opts: EmitFeedOptions): CurriculumFeed {\n const nodes: FeedNode[] = [];\n const edges: FeedEdge[] = [];\n const groupings: FeedGrouping[] = [];\n const conceptIds = new Set(arr(kg.concepts).map((c) => str(c.id)));\n for (const c of arr(kg.concepts)) {\n const node = feedNodeFromConcept(c);\n nodes.push(node);\n for (const p of strs(c.prerequisites)) {\n if (p !== node.id && conceptIds.has(p)) {\n edges.push({\n from: p,\n to: node.id,\n kind: 'knowledge',\n reason: `concept prerequisite: ${p} must be understood before ${node.id}`,\n });\n }\n }\n }\n\n // Sort nodes by learning_path order if present\n if (arr(kg.learning_path).length > 0) {\n const orderMap = new Map<string, number>();\n arr(kg.learning_path).forEach((s, idx) => {\n const cid = str(s.concept_id);\n if (cid) orderMap.set(cid, num(s.order, idx + 1));\n });\n nodes.sort((a, b) => (orderMap.get(a.id) ?? 999) - (orderMap.get(b.id) ?? 999));\n }\n\n let ci = 0;\n for (const cat of arr(kg.categories)) {\n ci += 1;\n const ids = strs(cat.concept_ids).filter((id) => nodes.some((n) => n.id === id));\n if (ids.length > 0) {\n groupings.push({\n id: str(cat.id, 'cat' + ci),\n name: str(cat.name, 'Category ' + ci),\n node_ids: ids,\n rationale: str(cat.description, ''),\n });\n }\n }\n newKeywordsInOrder(nodes);\n return validateCurriculumFeed({\n schema_version: 2,\n source: { graph_type: 'knowledge_graph', warnings: opts.warnings ?? [], hallucination_count: opts.hallucinationCount ?? 0 },\n learning_nodes: nodes,\n dependency_edges: edges,\n suggested_groupings: groupings,\n phases: [],\n });\n}\n\nfunction emitFromProject(pg: Rec, opts: EmitFeedOptions): CurriculumFeed {\n const nodes: FeedNode[] = [];\n const edges: FeedEdge[] = [];\n const groupings: FeedGrouping[] = [];\n arr(pg.features).forEach((f, fi) => addFeatureGroup(f, str(f.id, 'F' + pad2(fi + 1)), nodes, edges, groupings));\n if (nodes.length === 0 && arr(pg.features).length > 0) {\n const hasTasks = arr((pg.implementation ?? {}) as Rec).length > 0 || arr((pg.implementation as Rec | undefined)?.tasks).length > 0;\n throw new Error(\n 'Project graph has ' + arr(pg.features).length + ' features but NO features[].steps - the curriculum feed cannot emit planning nodes.' +\n (hasTasks\n ? ' This looks like a legacy knowledge-tree graph (implementation.tasks). Regenerate it with the domain-kit v3 pipeline (runProjectGraphPipeline / hybridGraphPipeline), then re-run.'\n : ' Every feature must carry at least one step with id/name/keywords/effort for curriculum planning.'),\n );\n }\n newKeywordsInOrder(nodes);\n return validateCurriculumFeed({\n schema_version: 2,\n source: { graph_type: 'project_graph', warnings: opts.warnings ?? [], hallucination_count: opts.hallucinationCount ?? 0 },\n learning_nodes: nodes,\n dependency_edges: edges,\n suggested_groupings: groupings,\n phases: [],\n });\n}\n\n/** Emit a CurriculumFeed from whichever graph shape is provided (already verified upstream). */\nexport function emitCurriculumFeed(\n graph: unknown,\n opts: EmitFeedOptions = {},\n): CurriculumFeed {\n const g = graph as Rec;\n if (arr(g.learning_nodes).length > 0) {\n return validateCurriculumFeed(g); // already a feed - pass-through validation\n }\n if (g.project_graph || g.knowledge_graph || arr(g.links).length > 0 || arr(g.phases).length > 0) {\n return emitFromHybrid(g, opts);\n }\n if (arr(g.concepts).length > 0 || str(g.type) === 'knowledge_graph') return emitFromKnowledge(g, opts);\n return emitFromProject(g, opts);\n}\n","/**\n * Swift AST-level parser — extracts imports, types, functions, property wrappers,\n * error handling patterns, and framework usage from Swift source files.\n *\n * Ported from knowledge-tree/extract_project_keywords.py parse_swift_file()\n */\n\nexport interface SwiftParseResult {\n imports: string[];\n types: Array<{\n kind: string;\n name: string;\n conforms_to: string[];\n file: string;\n }>;\n functions: Array<{\n name: string;\n params: string;\n returns: string;\n file: string;\n }>;\n property_wrappers: string[];\n error_handling: string[];\n frameworks_used: string[];\n}\n\nconst IMPORT_RE = /^import\\s+(\\w+)/gm;\nconst TYPE_RE = /\\b(class|struct|enum|protocol)\\s+(\\w+)(?:\\s*:\\s*([^{]+))?/g;\nconst FUNC_RE = /\\bfunc\\s+(\\w+)\\s*\\(([^)]*)\\)(?:\\s*->\\s*([^{]+))?/g;\nconst WRAPPER_RE = /@(State|Binding|ObservedObject|StateObject|Published|Environment|EnvironmentObject|AppStorage|SceneStorage|FocusState|Observable)\\b/g;\nconst FRAMEWORK_USAGE_RE = /\\b(URLSession|URLRequest|JSONSerialization|JSONDecoder|JSONEncoder|Task|DispatchQueue|Timer|NotificationCenter|UserDefaults|FileManager|Bundle)\\b/g;\n\nexport function parseSwiftFile(filepath: string, content: string): SwiftParseResult {\n const result: SwiftParseResult = {\n imports: [],\n types: [],\n functions: [],\n property_wrappers: [],\n error_handling: [],\n frameworks_used: [],\n };\n\n // Extract imports\n let match: RegExpExecArray | null;\n while ((match = IMPORT_RE.exec(content)) !== null) {\n result.imports.push(match[1]);\n }\n\n // Extract framework usage (types used in body, not declarations)\n const fwSeen = new Set<string>();\n while ((match = FRAMEWORK_USAGE_RE.exec(content)) !== null) {\n if (!fwSeen.has(match[1])) {\n fwSeen.add(match[1]);\n result.frameworks_used.push(match[1]);\n }\n }\n\n // Extract type declarations\n while ((match = TYPE_RE.exec(content)) !== null) {\n const conforms = (match[3] || '')\n .split(',')\n .map(p => p.trim())\n .filter(Boolean);\n result.types.push({\n kind: match[1],\n name: match[2],\n conforms_to: conforms,\n file: filepath,\n });\n }\n\n // Extract function signatures\n while ((match = FUNC_RE.exec(content)) !== null) {\n const name = match[1];\n if (name.startsWith('_')) continue;\n result.functions.push({\n name,\n params: (match[2] || '').trim(),\n returns: (match[3] || '').trim(),\n file: filepath,\n });\n }\n\n // Extract property wrappers\n const wrapperSet = new Set<string>();\n while ((match = WRAPPER_RE.exec(content)) !== null) {\n wrapperSet.add(match[1]);\n }\n result.property_wrappers = Array.from(wrapperSet);\n\n // Extract error handling patterns\n if (content.includes('do {') || content.includes('do{')) {\n result.error_handling.push('do-catch');\n }\n if (content.includes('throws')) {\n result.error_handling.push('throws');\n }\n if (content.includes('Result<')) {\n result.error_handling.push('Result type');\n }\n if (content.includes('try?')) {\n result.error_handling.push('try?');\n }\n if (content.includes('try!')) {\n result.error_handling.push('try!');\n }\n\n return result;\n}\n\nexport function mergeSwiftResults(results: SwiftParseResult[]): SwiftParseResult {\n const merged: SwiftParseResult = {\n imports: [],\n types: [],\n functions: [],\n property_wrappers: [],\n error_handling: [],\n frameworks_used: [],\n };\n\n const importCounts = new Map<string, number>();\n const wrapperCounts = new Map<string, number>();\n const errorCounts = new Map<string, number>();\n const frameworkSet = new Set<string>();\n\n for (const r of results) {\n for (const imp of r.imports) {\n importCounts.set(imp, (importCounts.get(imp) || 0) + 1);\n }\n merged.types.push(...r.types);\n merged.functions.push(...r.functions);\n for (const w of r.property_wrappers) {\n wrapperCounts.set(w, (wrapperCounts.get(w) || 0) + 1);\n }\n for (const e of r.error_handling) {\n errorCounts.set(e, (errorCounts.get(e) || 0) + 1);\n }\n for (const fw of r.frameworks_used) {\n frameworkSet.add(fw);\n }\n }\n\n // Sort imports by count descending, top 20\n merged.imports = Array.from(importCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 20)\n .map(([mod, count]) => mod);\n\n // Sort wrappers by count, top 10\n merged.property_wrappers = Array.from(wrapperCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([w]) => w);\n\n // Sort errors by count, top 10\n merged.error_handling = Array.from(errorCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([p]) => p);\n\n merged.frameworks_used = Array.from(frameworkSet).sort();\n\n // Limit types and functions\n merged.types = merged.types.slice(0, 100);\n merged.functions = merged.functions.slice(0, 100);\n\n return merged;\n}\n","/**\n * TypeScript/JavaScript AST-level parser — extracts imports, types, functions,\n * and error handling patterns.\n *\n * Ported from knowledge-tree/extract_project_keywords.py parse_ts_file()\n */\n\nexport interface TsParseResult {\n imports: string[];\n types: Array<{\n kind: string;\n name: string;\n file: string;\n }>;\n functions: Array<{\n name: string;\n params: string;\n file: string;\n }>;\n error_handling: string[];\n}\n\nconst IMPORT_RE = /import\\s+.*?from\\s+['\"]([^'\"]+)['\"]/g;\nconst TYPE_RE = /\\b(interface|type|class|enum)\\s+(\\w+)/g;\nconst FUNC_RE = /\\bfunction\\s+(\\w+)\\s*\\(([^)]*)\\)/g;\nconst ARROW_RE = /\\bconst\\s+(\\w+)\\s*=\\s*\\([^)]*\\)\\s*(?::\\s*\\w+)?\\s*=>/g;\n\nexport function parseTsFile(filepath: string, content: string): TsParseResult {\n const result: TsParseResult = {\n imports: [],\n types: [],\n functions: [],\n error_handling: [],\n };\n\n let match: RegExpExecArray | null;\n\n // Extract imports\n while ((match = IMPORT_RE.exec(content)) !== null) {\n result.imports.push(match[1]);\n }\n\n // Extract type/interface/class/enum declarations\n while ((match = TYPE_RE.exec(content)) !== null) {\n result.types.push({\n kind: match[1],\n name: match[2],\n file: filepath,\n });\n }\n\n // Extract function declarations\n while ((match = FUNC_RE.exec(content)) !== null) {\n result.functions.push({\n name: match[1],\n params: (match[2] || '').trim(),\n file: filepath,\n });\n }\n\n // Extract arrow functions\n while ((match = ARROW_RE.exec(content)) !== null) {\n result.functions.push({\n name: match[1],\n params: '',\n file: filepath,\n });\n }\n\n // Extract error handling patterns\n if (content.includes('try {') || content.includes('try{')) {\n result.error_handling.push('try-catch');\n }\n if (content.includes('Promise')) {\n result.error_handling.push('Promise');\n }\n if (content.includes('.catch(')) {\n result.error_handling.push('.catch()');\n }\n\n return result;\n}\n\nexport function mergeTsResults(results: TsParseResult[]): TsParseResult {\n const merged: TsParseResult = {\n imports: [],\n types: [],\n functions: [],\n error_handling: [],\n };\n\n const importCounts = new Map<string, number>();\n const errorCounts = new Map<string, number>();\n\n for (const r of results) {\n for (const imp of r.imports) {\n importCounts.set(imp, (importCounts.get(imp) || 0) + 1);\n }\n merged.types.push(...r.types);\n merged.functions.push(...r.functions);\n for (const e of r.error_handling) {\n errorCounts.set(e, (errorCounts.get(e) || 0) + 1);\n }\n }\n\n merged.imports = Array.from(importCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 20)\n .map(([mod]) => mod);\n\n merged.error_handling = Array.from(errorCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([p]) => p);\n\n merged.types = merged.types.slice(0, 100);\n merged.functions = merged.functions.slice(0, 100);\n\n return merged;\n}\n","/**\n * Python AST-level parser — extracts imports, classes, functions, docstrings,\n * and error handling patterns.\n *\n * Ported from knowledge-tree/extract_project_keywords.py parse_python_file()\n */\n\nexport interface PythonParseResult {\n imports: string[];\n types: Array<{\n kind: string;\n name: string;\n bases: string[];\n file: string;\n }>;\n functions: Array<{\n name: string;\n params: string;\n file: string;\n }>;\n docstrings: string[];\n error_handling: string[];\n}\n\nconst IMPORT_RE = /^(?:import|from)\\s+(\\w+)/gm;\nconst CLASS_RE = /\\bclass\\s+(\\w+)(?:\\s*\\(([^)]+)\\))?/g;\nconst FUNC_RE = /\\bdef\\s+(\\w+)\\s*\\(([^)]*)\\)/g;\nconst DOCSTRING_RE = /\"\"\"([^\"]{20,300})\"\"\"/g;\n\nexport function parsePythonFile(filepath: string, content: string): PythonParseResult {\n const result: PythonParseResult = {\n imports: [],\n types: [],\n functions: [],\n docstrings: [],\n error_handling: [],\n };\n\n let match: RegExpExecArray | null;\n\n // Extract imports\n while ((match = IMPORT_RE.exec(content)) !== null) {\n result.imports.push(match[1]);\n }\n\n // Extract docstrings (module, class, function level) — high-signal domain intent\n while ((match = DOCSTRING_RE.exec(content)) !== null) {\n const firstSentence = match[1].trim().split('\\n')[0].slice(0, 120);\n if (firstSentence.length > 15) {\n result.docstrings.push(firstSentence);\n }\n }\n\n // Extract class declarations\n while ((match = CLASS_RE.exec(content)) !== null) {\n const bases = (match[2] || '')\n .split(',')\n .map(b => b.trim())\n .filter(Boolean);\n result.types.push({\n kind: 'class',\n name: match[1],\n bases,\n file: filepath,\n });\n }\n\n // Extract function declarations\n while ((match = FUNC_RE.exec(content)) !== null) {\n const name = match[1];\n // Skip dunder methods (__init__, __str__)\n if (name.startsWith('__') && name.endsWith('__')) continue;\n result.functions.push({\n name,\n params: (match[2] || '').trim(),\n file: filepath,\n });\n }\n\n // Extract error handling patterns\n if (content.includes('try:')) {\n result.error_handling.push('try-except');\n }\n if (content.includes('raise')) {\n result.error_handling.push('raise');\n }\n\n return result;\n}\n\nexport function mergePythonResults(results: PythonParseResult[]): PythonParseResult {\n const merged: PythonParseResult = {\n imports: [],\n types: [],\n functions: [],\n docstrings: [],\n error_handling: [],\n };\n\n const importCounts = new Map<string, number>();\n const errorCounts = new Map<string, number>();\n\n for (const r of results) {\n for (const imp of r.imports) {\n importCounts.set(imp, (importCounts.get(imp) || 0) + 1);\n }\n merged.types.push(...r.types);\n merged.functions.push(...r.functions);\n merged.docstrings.push(...r.docstrings);\n for (const e of r.error_handling) {\n errorCounts.set(e, (errorCounts.get(e) || 0) + 1);\n }\n }\n\n merged.imports = Array.from(importCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 20)\n .map(([mod]) => mod);\n\n merged.error_handling = Array.from(errorCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([p]) => p);\n\n merged.types = merged.types.slice(0, 100);\n merged.functions = merged.functions.slice(0, 100);\n merged.docstrings = merged.docstrings.slice(0, 20);\n\n return merged;\n}\n","/**\n * C++/Arduino AST-level parser — extracts #include, types, functions,\n * and error handling patterns.\n *\n * Ported from knowledge-tree/extract_project_keywords.py parse_cpp_file()\n */\n\nexport interface CppParseResult {\n imports: string[];\n types: Array<{\n kind: string;\n name: string;\n file: string;\n }>;\n functions: Array<{\n name: string;\n file: string;\n }>;\n error_handling: string[];\n}\n\nconst INCLUDE_RE = /#include\\s*[<\"]([^>\"]+)[>\"]/g;\nconst TYPE_RE = /\\b(?:class|struct|enum)\\s+(\\w+)/g;\nconst FUNC_RE = /\\b(?:void|int|float|double|char|bool|String|uint8_t|uint16_t|uint32_t)\\s+(\\w+)\\s*\\(/g;\n\nexport function parseCppFile(filepath: string, content: string): CppParseResult {\n const result: CppParseResult = {\n imports: [],\n types: [],\n functions: [],\n error_handling: [],\n };\n\n let match: RegExpExecArray | null;\n\n // Extract #include\n while ((match = INCLUDE_RE.exec(content)) !== null) {\n result.imports.push(match[1]);\n }\n\n // Extract type declarations\n while ((match = TYPE_RE.exec(content)) !== null) {\n result.types.push({\n kind: 'cpp',\n name: match[1],\n file: filepath,\n });\n }\n\n // Extract function declarations\n while ((match = FUNC_RE.exec(content)) !== null) {\n result.functions.push({\n name: match[1],\n file: filepath,\n });\n }\n\n // Extract error handling patterns\n if (/\\btry\\b|\\bthrow\\b|\\bcatch\\b/.test(content)) {\n result.error_handling.push('try/throw/catch');\n }\n\n return result;\n}\n\nexport function mergeCppResults(results: CppParseResult[]): CppParseResult {\n const merged: CppParseResult = {\n imports: [],\n types: [],\n functions: [],\n error_handling: [],\n };\n\n const importCounts = new Map<string, number>();\n\n for (const r of results) {\n for (const imp of r.imports) {\n importCounts.set(imp, (importCounts.get(imp) || 0) + 1);\n }\n merged.types.push(...r.types);\n merged.functions.push(...r.functions);\n merged.error_handling.push(...r.error_handling);\n }\n\n merged.imports = Array.from(importCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 20)\n .map(([mod]) => mod);\n\n // Deduplicate error handling\n merged.error_handling = [...new Set(merged.error_handling)];\n\n return merged;\n}\n","/**\n * Keyword extraction logic — combines AST parser results into structured keywords\n * with source, weight, and context metadata.\n *\n * Ported from knowledge-tree/extract_project_keywords.py extract_keywords()\n */\n\nimport type { SwiftParseResult } from '../parsers/swift';\nimport type { TsParseResult } from '../parsers/typescript';\nimport type { PythonParseResult } from '../parsers/python';\nimport type { CppParseResult } from '../parsers/cpp';\n\nexport interface Keyword {\n keyword: string;\n source: string;\n platform: string;\n weight: number;\n context: string;\n}\n\nexport type SourceContext = SwiftParseResult | TsParseResult | PythonParseResult | CppParseResult;\n\nexport interface ExtractKeywordsOptions {\n /** Additional stdlib modules to skip (merged with defaults) */\n extraStdlibModules?: string[];\n /** Modules to un-skip even if in stdlib (e.g., 'math' for scientific projects) */\n unskipModules?: string[];\n}\n\n/**\n * Standard library modules that carry no domain signal — skip as keywords.\n */\nconst STDLIB_MODULES = new Set([\n // Python\n 'os', 'sys', 'typing', 'json', 're', 'math', 'random', 'time', 'datetime',\n 'pathlib', 'dataclasses', 'enum', 'collections', 'itertools', 'functools',\n 'logging', 'argparse', 'subprocess', 'threading', 'multiprocessing', 'asyncio',\n 'socket', 'http', 'urllib', 'ssl', 'hashlib', 'base64', 'csv', 'sqlite3',\n 'pickle', 'tempfile', 'shutil', 'glob', 'io', 'string', 'struct', 'uuid',\n 'abc', 'copy', 'decimal', 'fractions', 'statistics', 'queue', 'signal',\n 'traceback', 'warnings', 'weakref', 'contextlib', 'unittest', 'pytest',\n 'tkinter', 'tk', 'ttk', 'types', 'inspect', 'platform',\n // Common third-party generic plumbing\n 'requests', 'urllib3', 'pydantic', 'dotenv', 'yaml', 'tomllib',\n]);\n\n/**\n * Map file path → platform (multi-codebase project: Swift app vs ESP32 firmware).\n */\nfunction platformFromPath(filePath: string): string {\n if (!filePath) return 'app';\n const fp = filePath.toLowerCase();\n if (fp.endsWith('.ino') || fp.endsWith('.cpp') || fp.endsWith('.h') || fp.endsWith('.hpp') || fp.endsWith('.c')) {\n if (fp.endsWith('.ino')) return 'esp32';\n if (fp.includes('firmware') || fp.includes('esp')) return 'esp32';\n return 'app';\n }\n return 'app';\n}\n\n/**\n * Extract structured keywords from source context and basic analysis.\n *\n * Multi-target: each keyword is tagged with platform (app/esp32) from its source file,\n * so downstream SIO generation produces correct keywords for each codebase.\n */\nexport function extractKeywords(\n sourceContext: SourceContext,\n basicAnalysis?: { config_files?: string[] },\n repoDir?: string,\n options?: ExtractKeywordsOptions,\n): Keyword[] {\n const keywords: Keyword[] = [];\n\n // Build effective stdlib set with overrides\n const effectiveStdlib = new Set(STDLIB_MODULES);\n if (options?.extraStdlibModules) {\n for (const m of options.extraStdlibModules) effectiveStdlib.add(m.toLowerCase());\n }\n if (options?.unskipModules) {\n for (const m of options.unskipModules) effectiveStdlib.delete(m.toLowerCase());\n }\n\n // Source 1: Import statements → framework keywords\n if ('imports' in sourceContext) {\n for (const imp of sourceContext.imports) {\n let module: string;\n let count = 1;\n let platform = 'app';\n\n if (typeof imp === 'string') {\n module = imp;\n } else if (imp && typeof imp === 'object' && 'module' in imp) {\n const impObj = imp as { module: string; count?: number; file?: string };\n module = impObj.module;\n count = impObj.count || 1;\n platform = platformFromPath(impObj.file || '');\n } else {\n continue;\n }\n\n // Skip standard library / generic plumbing — no domain signal\n if (effectiveStdlib.has(module.toLowerCase())) continue;\n\n keywords.push({\n keyword: module,\n source: 'import',\n platform,\n weight: 1.0 + (count - 1) * 0.1,\n context: `Imported ${count} times`,\n });\n }\n }\n\n // Source 2: Type declarations → domain concepts\n if ('types' in sourceContext) {\n for (const typeDecl of sourceContext.types) {\n const name = typeDecl.name;\n const kind = typeDecl.kind;\n const platform = platformFromPath(typeDecl.file || '');\n\n // Skip generic/framework types\n if (['View', 'Model', 'ViewModel', 'Controller', 'Service', 'Manager'].includes(name)) continue;\n\n keywords.push({\n keyword: name,\n source: 'type_declaration',\n platform,\n weight: 1.5,\n context: `${kind} declaration`,\n });\n }\n }\n\n // Source 3: Function signatures → business logic\n if ('functions' in sourceContext) {\n for (const func of sourceContext.functions) {\n const name = func.name;\n const platform = platformFromPath(func.file || '');\n\n // Skip generic helpers\n if (['init', 'setup', 'configure', 'initialize'].includes(name)) continue;\n\n keywords.push({\n keyword: name,\n source: 'function_signature',\n platform,\n weight: 1.2,\n context: 'Function signature',\n });\n }\n }\n\n // Source 3.5: Docstrings → domain intent (high signal) — Python only\n if ('docstrings' in sourceContext && Array.isArray(sourceContext.docstrings)) {\n for (const doc of sourceContext.docstrings) {\n const firstSentence = doc.trim().split('\\n')[0].slice(0, 120);\n if (firstSentence.length > 15) {\n keywords.push({\n keyword: firstSentence,\n source: 'docstring',\n platform: 'app',\n weight: 1.8,\n context: 'Docstring (domain intent)',\n });\n }\n }\n }\n\n // Source 3.6: Framework usage → real practice keywords — Swift only\n if ('frameworks_used' in sourceContext && Array.isArray(sourceContext.frameworks_used)) {\n for (const fw of sourceContext.frameworks_used) {\n const fwName = typeof fw === 'string' ? fw : (fw as { framework?: string }).framework || '';\n if (fwName) {\n keywords.push({\n keyword: fwName,\n source: 'framework_usage',\n platform: 'app',\n weight: 1.4,\n context: 'Framework usage (real practice)',\n });\n }\n }\n }\n\n // Source 4: Property wrappers → state management patterns — Swift only\n if ('property_wrappers' in sourceContext && Array.isArray(sourceContext.property_wrappers)) {\n for (const wrapper of sourceContext.property_wrappers) {\n const wrapperName = typeof wrapper === 'string' ? wrapper : (wrapper as { wrapper?: string }).wrapper || '';\n if (wrapperName) {\n keywords.push({\n keyword: `@${wrapperName}`,\n source: 'property_wrapper',\n platform: 'app',\n weight: 2.0,\n context: 'Property wrapper',\n });\n }\n }\n }\n\n // Source 5: Error handling patterns → reliability concerns\n const errorPatterns = 'error_handling' in sourceContext\n ? sourceContext.error_handling\n : 'error_handling_patterns' in sourceContext\n ? (sourceContext as { error_handling_patterns?: Array<{ pattern: string; count?: number; file?: string }> }).error_handling_patterns || []\n : [];\n\n for (const error of errorPatterns) {\n let pattern: string;\n let platform = 'app';\n\n if (typeof error === 'string') {\n pattern = error;\n } else if (error && typeof error === 'object' && 'pattern' in error) {\n const errObj = error as { pattern: string; file?: string };\n pattern = errObj.pattern;\n platform = platformFromPath(errObj.file || '');\n } else {\n continue;\n }\n\n keywords.push({\n keyword: pattern,\n source: 'error_handling',\n platform,\n weight: 1.3,\n context: 'Error handling pattern',\n });\n }\n\n // Deduplicate by keyword (case-insensitive)\n const seen = new Set<string>();\n const uniqueKeywords: Keyword[] = [];\n for (const kw of keywords) {\n const key = kw.keyword.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n uniqueKeywords.push(kw);\n }\n }\n\n return uniqueKeywords;\n}\n","/**\n * LLM client wrapper — provides a unified interface for LLM calls\n * used by the graph generation pipeline.\n *\n * Supports OpenAI-compatible APIs via environment variables:\n * LLM_API_KEY, LLM_BASE_URL, LLM_MODEL (or LLM_TIER_FAST / LLM_TIER_STRONG)\n */\n\nexport interface LlmClientConfig {\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/** One callable provider endpoint in the fallback chain. */\nexport interface ProviderSpec {\n label: string;\n baseUrl: string;\n apiKey: string;\n model: string;\n}\n\nexport interface LlmClient {\n chat(messages: LlmChatMessage[], options?: { temperature?: number; maxTokens?: number }): Promise<LlmChatResult>;\n model: string;\n}\n\nexport interface LlmChatMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\nexport interface LlmChatResult {\n content: string;\n model: string;\n /** Provider label that ultimately served the request. */\n provider?: string;\n /** What happened per provider when fallback occurred (empty when first try succeeded). */\n attempts?: string[];\n /** 'stop' when complete; 'length' means the response was TRUNCATED by max_tokens. */\n finishReason?: string;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n finishReason?: string;\n};\n}\n\nexport class LlmClientError extends Error {\n constructor(\n message: string,\n public readonly status?: number,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = 'LlmClientError';\n }\n}\n\n/**\n * Create an LLM client from environment variables.\n */\n/**\n * Resolve the provider fallback chain from explicit config and environment.\n * Base order: explicit config > legacy LLM_API_KEY/OPENAI_API_KEY > NVIDIA NIM >\n * OpenRouter > DashScope/Alibaba MaaS. First entry is PRIMARY; the rest are\n * fallbacks tried in order.\n *\n * QUALITY-EVAL MODE: when OPENROUTER_MODEL is set (a paid preset), OpenRouter\n * is promoted to PRIMARY so generation quality is evaluated without free-tier\n * 429/403 noise. NVIDIA/dashscope then act only as safety-net fallbacks.\n */\nexport function resolveProviderChain(config?: LlmClientConfig): ProviderSpec[] {\n const chain: ProviderSpec[] = [];\n const push = (label: string, baseUrl: string, apiKey: string, model: string): void => {\n if (apiKey && baseUrl && model && !chain.some((c) => c.baseUrl === baseUrl && c.model === model)) {\n chain.push({ label, baseUrl, apiKey, model });\n }\n };\n // Explicit single-provider config keeps its historical meaning.\n if (config?.apiKey) {\n push('config', config.baseUrl || 'https://api.openai.com/v1', config.apiKey, config.model || 'gpt-4o-mini');\n }\n // Legacy generic env (knowledge-tree compatible: OPENAI_BASE_URL + LLM_MODEL).\n push('legacy', process.env.LLM_BASE_URL || process.env.OPENAI_BASE_URL || '', process.env.LLM_API_KEY || process.env.OPENAI_API_KEY || '', process.env.LLM_MODEL || process.env.LLM_TIER_FAST || '');\n // DashScope / Alibaba MaaS (OpenAI-compatible endpoints).\n push('dashscope', process.env.DASHSCOPE_BASE_URL || process.env.ALIBABA_BASE_URL || '', process.env.DASHSCOPE_API_KEY || process.env.ALIBABA_API_KEY || '', process.env.DASHSCOPE_MODEL || process.env.DEFAULT_AI_MODEL || '');\n // NVIDIA NIM — hosted provider for generation workloads.\n push('nvidia', 'https://integrate.api.nvidia.com/v1', process.env.NVIDIA_API_KEY || '', process.env.NVIDIA_MODEL || 'nvidia/nemotron-3-ultra-550b-a55b:free');\n // OpenRouter — paid preset primary when OPENROUTER_MODEL pins a model/preset.\n push('openrouter', 'https://openrouter.ai/api/v1', process.env.OPENROUTER_API_KEY || '', process.env.OPENROUTER_MODEL || 'nvidia/nemotron-3-ultra-550b-a55b:free');\n // QUALITY-EVAL MODE: paid OpenRouter preset goes FIRST (no 429 noise).\n if (process.env.OPENROUTER_MODEL) {\n const or = chain.find((c) => c.label === 'openrouter');\n if (or) {\n const rest = chain.filter((c) => c !== or);\n return [or, ...rest];\n }\n }\n return chain;\n}\n\n// Free-tier rate limits (NVIDIA NIM, OpenRouter) trip when a pipeline fires\n// many requests in a burst. Global pacing keeps us under the limit; a single\n// isolated call still goes through immediately.\nconst MIN_REQUEST_INTERVAL_MS = 2_500;\nlet lastRequestAt = 0;\n\nasync function pacedDelay(): Promise<void> {\n const wait = lastRequestAt + MIN_REQUEST_INTERVAL_MS - Date.now();\n if (wait > 0) await new Promise((resolve) => setTimeout(resolve, wait));\n lastRequestAt = Date.now();\n}\n\nexport function createLlmClient(config?: LlmClientConfig): LlmClient {\n const chain = resolveProviderChain(config);\n const primary = chain[0];\n if (!primary) {\n throw new LlmClientError(\n 'No LLM provider configured. Set NVIDIA_API_KEY (primary) and/or OPENROUTER_API_KEY (fallback), or pass llmConfig.',\n );\n }\n const apiKey = primary.apiKey;\n const baseUrl = primary.baseUrl;\n const model = primary.model;\n\n async function chat(\n messages: LlmChatMessage[],\n options?: { temperature?: number; maxTokens?: number },\n ): Promise<LlmChatResult> {\n const temperature = options?.temperature ?? config?.temperature ?? 0.1;\n const maxTokens = options?.maxTokens ?? config?.maxTokens ?? parseInt(process.env.LLM_MAX_TOKENS || '65536', 10);\n\n const attempts: string[] = [];\n let lastError: LlmClientError | null = null;\n const TRANSIENT = new Set([408, 429, 500, 502, 503, 504]);\n // Hard per-request cap so a hanging provider degrades to a transient error\n // and the chain falls through instead of blocking the pipeline forever.\n // Reasoning presets (e.g. deepseek-v4-flash) can legitimately think for\n // minutes on large structured outputs — 5 minutes default, env-overridable.\n const REQUEST_TIMEOUT_MS = Number(process.env.LLM_REQUEST_TIMEOUT_MS || 300_000);\n const MAX_CHAIN_ROUNDS = 3;\n for (let round = 1; round <= MAX_CHAIN_ROUNDS; round++) {\n if (round > 1) {\n // Whole chain failed transiently (rate limits / upstream 5xx) — back\n // off and rewalk the chain from the primary instead of dying.\n attempts.push('round ' + (round - 1) + ' failed — backing off 20s before rewalking the chain');\n await new Promise((resolve) => setTimeout(resolve, 20_000));\n }\n for (const provider of chain) {\n try {\n const headers = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${provider.apiKey}`,\n };\n const payload = {\n model: provider.model,\n messages,\n temperature,\n max_tokens: maxTokens,\n };\n await pacedDelay();\n const doFetch = (): Promise<Response> => fetch(`${provider.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${provider.apiKey}`,\n },\n body: JSON.stringify({\n model: provider.model,\n messages,\n temperature,\n max_tokens: maxTokens,\n }),\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n });\n // Transient network failures (DNS blip, TLS reset, \"fetch failed\") get\n // one same-provider retry before falling through the chain.\n let response: Response;\n try {\n response = await doFetch();\n } catch (netErr) {\n attempts.push(`${provider.label}: network error (${netErr instanceof Error ? netErr.message : String(netErr)}) — retrying once`);\n await new Promise((r) => setTimeout(r, 5_000));\n lastRequestAt = Date.now();\n response = await doFetch();\n }\n if (!response.ok) {\n const body = await response.text().catch(() => '');\n const err = new LlmClientError(\n `[${provider.label}] LLM API error: ${response.status} ${response.statusText} — ${body.slice(0, 200)}`,\n response.status,\n );\n if (response.status === 429) {\n // Rate-limited: honor Retry-After (bounded) and retry once on the\n // same provider before falling through to the next one.\n const retryAfterRaw = response.headers.get('retry-after');\n const retryAfterMs = Math.min(\n 60_000,\n Math.max(15_000, (Number.isFinite(Number(retryAfterRaw)) ? Number(retryAfterRaw) : 20) * 1_000),\n );\n attempts.push(`${provider.label}: 429 rate-limited — backing off ${Math.round(retryAfterMs / 1000)}s`);\n await new Promise((resolve) => setTimeout(resolve, retryAfterMs));\n lastRequestAt = Date.now();\n const retry = await fetch(`${provider.baseUrl}/chat/completions`, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n });\n if (!retry.ok) throw err;\n const retryData = await retry.json() as {\n choices?: Array<{ message?: { content?: string }; finish_reason?: string }>;\n model?: string;\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n const retryContent2 = retryData.choices?.[0]?.message?.content || '';\n if (!retryContent2.trim()) throw err;\n return {\n content: retryContent2,\n model: retryData.model || provider.model,\n provider: provider.label,\n attempts: attempts.slice(),\n usage: retryData.usage,\n finishReason: retryData.choices?.[0]?.finish_reason,\n };\n }\n if (TRANSIENT.has(response.status)) {\n await new Promise((r) => setTimeout(r, 3000));\n const retry = await fetch(`${provider.baseUrl}/chat/completions`, {\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${provider.apiKey}`,\n },\n body: JSON.stringify({\n model: provider.model,\n messages,\n temperature,\n max_tokens: maxTokens,\n }),\n });\n if (!retry.ok) throw err; // still transient-failing — fall through to next provider\n const retryData = await retry.json() as {\n choices?: Array<{ message?: { content?: string }; finish_reason?: string }>;\n model?: string;\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n const retryContent = retryData.choices?.[0]?.message?.content || '';\n return {\n content: retryContent,\n model: retryData.model || provider.model,\n provider: provider.label,\n attempts: attempts.slice(),\n usage: retryData.usage,\n finishReason: retryData.choices?.[0]?.finish_reason,\n };\n }\n throw err;\n }\n const data = await response.json() as {\n choices?: Array<{ message?: { content?: string }; finish_reason?: string }>;\n model?: string;\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n const wrappedError = (data as { error?: { message?: string; code?: number } }).error;\n if (wrappedError) {\n // OpenRouter proxies some upstream failures as HTTP 200 with an\n // {\"error\": {...}} body — treat as transient and fall through.\n throw new LlmClientError('[' + provider.label + '] upstream error ' + (wrappedError.code ?? '') + ': ' + (wrappedError.message ?? 'unknown'));\n }\n const content = data.choices?.[0]?.message?.content || '';\n if (!content.trim()) {\n // Empty completion (provider outage / content filter) is transient —\n // fall through to the next provider instead of returning unusable ''.\n throw new LlmClientError('[' + provider.label + '] empty completion returned');\n }\n return {\n content,\n model: data.model || provider.model,\n provider: provider.label,\n attempts: attempts.slice(),\n usage: data.usage,\n finishReason: data.choices?.[0]?.finish_reason,\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n attempts.push(`${provider.label}: ${msg}`);\n lastError = err instanceof LlmClientError ? err : new LlmClientError(`[${provider.label}] ${msg}`);\n // try next provider\n }\n }\n if (round < MAX_CHAIN_ROUNDS) continue; // rewalk the chain\n throw lastError ?? new LlmClientError('All LLM providers failed (empty chain).');\n }\n throw lastError ?? new LlmClientError('All LLM providers failed after ' + MAX_CHAIN_ROUNDS + ' rounds.');\n }\n\n return { chat, model };\n}\n\n/**\n * Parse JSON from LLM response, handling markdown code fences.\n */\nexport function parseJsonFromLlm(text: string): Record<string, unknown> {\n // Strip markdown code fences if present\n let cleaned = text.trim();\n if (cleaned.startsWith('```json')) {\n cleaned = cleaned.slice(7);\n } else if (cleaned.startsWith('```')) {\n cleaned = cleaned.slice(3);\n }\n if (cleaned.endsWith('```')) {\n cleaned = cleaned.slice(0, -3);\n }\n cleaned = cleaned.trim();\n\n try {\n return JSON.parse(cleaned) as Record<string, unknown>;\n } catch {\n // Try to find first complete JSON object using brace-depth tracking\n const start = cleaned.indexOf('{');\n if (start >= 0) {\n let depth = 0;\n let inString = false;\n let escape = false;\n for (let i = start; i < cleaned.length; i++) {\n const ch = cleaned[i];\n if (escape) { escape = false; continue; }\n if (ch === '\\\\') { escape = true; continue; }\n if (ch === '\"') { inString = !inString; continue; }\n if (inString) continue;\n if (ch === '{') depth++;\n if (ch === '}') {\n depth--;\n if (depth === 0) {\n try {\n return JSON.parse(cleaned.slice(start, i + 1)) as Record<string, unknown>;\n } catch {\n // keep looking\n }\n }\n }\n }\n }\n throw new LlmClientError(`Failed to parse JSON from LLM response: ${cleaned.slice(0, 200)}`);\n }\n}\n\n/**\n * Call LLM and parse JSON response.\n */\nexport async function llmChatJson(\n client: ReturnType<typeof createLlmClient>,\n systemPrompt: string,\n userPrompt: string,\n options?: { temperature?: number; maxTokens?: number },\n): Promise<Record<string, unknown>> {\n const result = await client.chat(\n [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ],\n options,\n );\n\n return parseJsonFromLlm(result.content);\n}\n","/**\n * STEP C0: Extract FOUNDATION & SETUP feature (F0) via LLM.\n *\n * Ported from knowledge-tree/llm_project_graph.py extract_scaffold_llm()\n * The F0 feature covers MUST-KNOW steps before the first feature:\n * tools, project creation, minimal programming knowledge, repo map, dev loop.\n */\n\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\nimport type { Feature } from '../schemas/projectGraphSchema';\n\nexport interface ExtractScaffoldOptions {\n goal: string;\n techStack: string;\n fileList: string[];\n llmConfig?: LlmClientConfig;\n}\n\n/**\n * Extract the FOUNDATION & SETUP feature (F0) via LLM.\n * Returns a Feature with steps covering tool setup, project creation,\n * minimal programming knowledge, repo map, and dev loop.\n */\nexport async function extractScaffold(options: ExtractScaffoldOptions): Promise<Feature | null> {\n const { goal, techStack, fileList, llmConfig } = options;\n const client = createLlmClient(llmConfig);\n const fileListStr = fileList.length > 0 ? fileList.join('\\n') : '(empty)';\n\n const systemPrompt = (\n 'You are a programming pedagogy expert. For ONE concrete project, extract the '\n + \"'FOUNDATION & SETUP' feature (id F0) — the COMPLETE set of 'MUST-KNOW' steps \"\n + 'the learner needs before studying the first feature. Break it into concrete ACTION '\n + 'steps (5-8 steps), each with completion_level=\\'base\\'. Include:\\n'\n + '1. Tools required for this tech stack (IDE, simulator/emulator, terminal, git, '\n + 'package manager) + basic operations (open project, build, run, debug, commit).\\n'\n + '2. Create the initial project: from a template OR clone/open the base-project (the provided repo).\\n'\n + '3. MINIMAL programming knowledge of the language (variables, types, functions, if/for, view declaration) '\n + '+ build one small demo (e.g. a single-screen Hello World app) BEFORE touching the real project.\\n'\n + '4. Repo map of the actual project: folder structure, entry point, how to build/run, main architecture '\n + '(MVVM/Flux...), important packages/modules.\\n'\n + '5. Development loop (build->run->see result->debug), how to read/fix basic compile errors, '\n + 'minimal git workflow (clone/branch/commit/push).\\n'\n + 'keywords[]: real tool/language terms (e.g. \\'Xcode\\', \\'Simulator\\', \\'Git\\', \\'Swift\\', '\n + '\\'@main\\', \\'MVVM\\'). files[]: leave [] or use real paths if the step touches specific files. '\n + 'description: ONE concise sentence, MAX 140 characters. '\n + 'intent: WHY this step matters. outcome: {user_visible: string, technical: string}. '\n + 'acceptance[]: 2 verifiable criteria. effort: {estimated_minutes: number, complexity: low|medium|high}. '\n + 'NEVER invent. ALL text must be in ENGLISH (technical terms stay as-is). '\n + 'Return JSON containing only feature F0.'\n );\n\n const userPrompt = (\n `App goal: ${goal}\\n`\n + `Tech stack: ${techStack}\\n\\n`\n + 'PROJECT FILE LIST (base-project):\\n'\n + `${fileListStr}\\n\\n`\n + 'Return JSON:\\n'\n + '{\\n'\n + ' \"feature\": {\\n'\n + ' \"id\": \"F0\",\\n'\n + ' \"name\": \"FOUNDATION & SETUP\",\\n'\n + ' \"description\": \"Get familiar with the tools, create/clone the project, learn minimal knowledge and the repo map\",\\n'\n + ' \"platform\": \"app\",\\n'\n + ' \"steps\": [\\n'\n + ' {\\n'\n + ' \"id\": \"F0-S1\",\\n'\n + ' \"sequence\": 1,\\n'\n + ' \"name\": \"Action step name\",\\n'\n + ' \"description\": \"Detailed description of the concrete actions\",\\n'\n + ' \"files\": [],\\n'\n + ' \"api_usage\": [],\\n'\n + ' \"keywords\": [\"Xcode\", \"Terminal\"],\\n'\n + ' \"completion_level\": \"base\",\\n'\n + ' \"intent\": \"Learn how to setup the IDE and run a minimal Swift app\",\\n'\n + ' \"outcome\": {\"user_visible\": \"App builds and runs\", \"technical\": \"Toolchain verified\"},\\n'\n + ' \"acceptance\": [\"Xcode builds without errors\", \"Simulator launches successfully\"],\\n'\n + ' \"effort\": {\"estimated_minutes\": 20, \"complexity\": \"low\"}\\n'\n + ' }\\n'\n + ' ]\\n'\n + ' }\\n'\n + '}\\n'\n );\n\n try {\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: parseInt(process.env.PG_C0_MAX_TOKENS || '16384', 10),\n });\n\n const feat = result.feature as Record<string, unknown> | undefined;\n if (!feat || !Array.isArray(feat.steps) || feat.steps.length === 0) {\n console.warn('[WARN] Scaffold LLM returned no steps — skipping F0');\n return null;\n }\n\n // Normalize step IDs and ensure required fields\n const steps = (feat.steps as Record<string, unknown>[]).map((s, i) => ({\n id: `F0-S${i + 1}`,\n sequence: i + 1,\n name: String(s.name || `Step ${i + 1}`),\n description: String(s.description || ''),\n files: Array.isArray(s.files) ? s.files : [],\n api_usage: Array.isArray(s.api_usage) ? s.api_usage : [],\n keywords: Array.isArray(s.keywords) ? s.keywords : [],\n completion_level: 'base' as const,\n platform: String(s.platform || 'app'),\n intent: String(s.intent || ''),\n outcome: s.outcome && typeof s.outcome === 'object' ? s.outcome as { user_visible?: string; technical?: string } : undefined,\n acceptance: Array.isArray(s.acceptance) ? s.acceptance : [],\n effort: s.effort && typeof s.effort === 'object' ? s.effort as { estimated_minutes?: number; complexity?: 'low' | 'medium' | 'high' } : undefined,\n requirement_ids: [] as string[],\n concept_codes: [] as string[],\n }));\n\n return {\n id: 'F0',\n name: String(feat.name || 'FOUNDATION & SETUP'),\n description: String(feat.description || ''),\n platform: String(feat.platform || 'app'),\n steps,\n } as Feature;\n } catch (err) {\n console.error(`[ERROR] extractScaffold failed: ${err}`);\n return null;\n }\n}\n","/**\n * STEP C1: Extract PROJECT OVERVIEW via LLM (features meta — NO steps).\n *\n * Ported from knowledge-tree/llm_project_graph.py extract_project_overview_llm()\n * Output: project, product, features[], user_journeys, architecture, decomposition.\n */\n\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\nimport type { Keyword } from '../extractors/keywordExtractor';\n\nexport interface ExtractOverviewOptions {\n goal: string;\n techStack: string;\n sdkApiIndex: { sdk_apis: Array<{ name: string; kind: string; used_in_demo: boolean }> };\n fileContentsMap: Map<string, string>;\n astKeywords?: Keyword[];\n llmConfig?: LlmClientConfig;\n}\n\nfunction buildSourceText(fileContentsMap: Map<string, string>): string {\n const blocks: string[] = [];\n for (const [relPath, content] of fileContentsMap) {\n blocks.push(`### FILE: ${relPath}\\n${content}`);\n }\n return blocks.join('\\n\\n');\n}\n\n/**\n * Extract project overview (features meta) via LLM.\n * Does NOT include steps — those are extracted per-feature in STEP C2.\n */\nexport async function extractProjectOverview(options: ExtractOverviewOptions): Promise<Record<string, unknown>> {\n const { goal, techStack, sdkApiIndex, fileContentsMap, astKeywords, llmConfig } = options;\n const client = createLlmClient(llmConfig);\n\n const usedSdkApis = sdkApiIndex.sdk_apis\n .filter(api => api.used_in_demo)\n .map(api => api.name)\n .slice(0, 2000);\n\n const allFilesStr = buildSourceText(fileContentsMap);\n\n // Build AST keywords anchor\n let keywordsAnchor = '';\n if (astKeywords && astKeywords.length > 0) {\n const kwItems = astKeywords.slice(0, 30).map(kw =>\n `- ${kw.keyword} (from ${kw.source})`,\n );\n if (kwItems.length > 0) {\n keywordsAnchor = (\n '\\nAST Domain Keywords & Patterns (from static analysis — use as context anchor):\\n'\n + kwItems.join('\\n')\n + '\\n'\n );\n }\n }\n\n const systemPrompt = (\n 'You are a software architect. The app the user will build IS EXACTLY the provided files '\n + '(not an SDK/lib). Analyze them and return a PROJECT OVERVIEW — meta only, '\n + 'DO NOT list steps (steps are handled in a later step). '\n + 'NEVER invent files/APIs. NEVER reference internal SDK/lib unless it appears in the given files.\\n'\n + 'END-USER VIEW (M1/Design Thinking): product.purpose must describe the USER PROBLEM '\n + '(what the user does with the app, which need it solves). NEVER describe repo/artifacts.\\n'\n + 'DEVELOPMENT STAGES: Include 4-6 development stages in product.development_stages. '\n + 'Each stage must have: stage (name), need (list of feature needs), learn (concepts learned), '\n + 'product_state (what works), temporary_approach, and validation.\\n'\n + 'MISSING GAPS: Identify 0-5 missing_gaps (features/functionality that should exist but don\\'t).\\n'\n + 'TECH DEBT: Identify 0-5 tech_debt issues (code quality problems).\\n'\n + 'ALL text must be in ENGLISH.'\n );\n\n const userPrompt = `App goal: ${goal}\nTech stack: ${techStack}\n${keywordsAnchor}\nFiltered SDK API list (used_in_demo):\n${JSON.stringify(usedSdkApis, null, 0)}\n\nSource code of the files:\n${allFilesStr}\n\nReturn JSON per the schema:\n{\n \"schema_version\": 2,\n \"project\": {\"name\": \"...\", \"project_type\": \"app\", \"platforms\": [\"ios\"]},\n \"product\": {\n \"purpose\": \"END-USER problem being solved\",\n \"problem_statement\": \"Core user problem\",\n \"primary_users\": [\"who the main users are\"],\n \"development_stages\": [\n {\n \"stage\": \"Stage 1: Foundation & Setup\",\n \"need\": [\"Core app shell\"],\n \"learn\": [\"App lifecycle, basic UI\"],\n \"product_state\": \"App launches with static mock data\",\n \"temporary_approach\": \"Hardcoded array\",\n \"validation\": \"Main screen loads\"\n }\n ],\n \"features\": [\n {\"id\": \"F1\", \"name\": \"Feature name\", \"description\": \"Feature description\", \"platform\": \"ios\"}\n ],\n \"user_journeys\": [{\"name\": \"...\", \"feature_ids\": [\"F1\"]}]\n },\n \"architecture\": {\"layers\": [], \"services\": [], \"state_management\": \"...\"},\n \"decomposition\": {\"milestones\": [{\"id\": \"M1\", \"phase\": \"MVP\", \"name\": \"...\", \"goal\": \"...\", \"feature_ids\": [\"F1\"]}]}\n}`;\n\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: parseInt(process.env.PG_C1_MAX_TOKENS || '32768', 10),\n });\n\n // Ensure development_stages exists\n const prod = result.product as Record<string, unknown> | undefined;\n if (prod && !Array.isArray(prod.development_stages)) {\n prod.development_stages = [];\n }\n\n return result;\n}\n","/**\n * STEP C2: Extract feature STEPS via LLM.\n *\n * Ported from knowledge-tree/llm_project_graph.py\n * - extract_feature_steps_llm() — single feature\n * - extract_feature_steps_batched() — batch of features\n */\n\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\nimport type { Feature, Step } from '../schemas/projectGraphSchema';\n\nexport interface ExtractStepsOptions {\n goal: string;\n techStack: string;\n sdkApiIndex: { sdk_apis: Array<{ name: string; kind: string; used_in_demo: boolean }> };\n fileContentsMap: Map<string, string>;\n feature: Feature;\n llmConfig?: LlmClientConfig;\n}\n\nfunction buildSourceText(fileContentsMap: Map<string, string>): string {\n const blocks: string[] = [];\n for (const [relPath, content] of fileContentsMap) {\n blocks.push(`### FILE: ${relPath}\\n${content}`);\n }\n return blocks.join('\\n\\n');\n}\n\n/**\n * Extract steps for a SINGLE feature via LLM.\n */\nexport async function extractFeatureSteps(options: ExtractStepsOptions): Promise<Step[]> {\n const { goal, techStack, sdkApiIndex, fileContentsMap, feature, llmConfig } = options;\n const client = createLlmClient(llmConfig);\n\n const usedSdkApis = sdkApiIndex.sdk_apis\n .filter(api => api.used_in_demo)\n .map(api => api.name)\n .slice(0, 2000);\n\n const allFilesStr = buildSourceText(fileContentsMap);\n const fid = feature.id || 'F_UNK';\n const fname = feature.name || fid;\n const fdesc = feature.description || '';\n\n const systemPrompt = (\n 'You are a software architect. Split ONE feature into ACTION steps '\n + '(implementation steps) the learner must code sequentially. Each step must carry '\n + 'files[] (CORRECT paths in the source), api_usage[] (only from the provided SDK API index), '\n + 'keywords[] (real terms/language features in the files), '\n + 'and completion_level ∈ {base, mvp, extend, polish}.\\n'\n + ' - base = foundation/setup\\n'\n + ' - mvp = make the app minimally WORKING for this feature\\n'\n + ' - extend = make it real/richer\\n'\n + ' - polish = robustness (error handling, tests, validation)\\n'\n + 'Include metadata: intent, outcome ({user_visible, technical}), '\n + 'acceptance[] (2 verifiable criteria), effort ({estimated_minutes, complexity}).\\n'\n + 'description: ONE concise sentence, MAX 140 characters. '\n + 'NEVER invent files/APIs. Return ONLY the steps array. '\n + 'ALL text must be in ENGLISH.'\n );\n\n const userPrompt = `App goal: ${goal}\nTech stack: ${techStack}\n\nFEATURE TO SPLIT: ${fid} — ${fname}\nFeature description: ${fdesc}\n\nSDK API list (used_in_demo):\n${JSON.stringify(usedSdkApis)}\n\nSource code:\n${allFilesStr}\n\nSplit this feature into 2-6 action steps. Return JSON:\n{\n \"steps\": [\n {\n \"id\": \"${fid}-S1\",\n \"sequence\": 1,\n \"name\": \"Action step name\",\n \"description\": \"One concise sentence (max 140 chars)\",\n \"files\": [\"path/to/file.swift\"],\n \"api_usage\": [\"ChatClient\"],\n \"keywords\": [\"@State\", \"NavigationStack\"],\n \"completion_level\": \"mvp\",\n \"intent\": \"Create reactive state container\",\n \"outcome\": {\"user_visible\": \"Chat view updates\", \"technical\": \"ChatViewModel conforms to ObservableObject\"},\n \"acceptance\": [\"ViewModel publishes messages\", \"UI re-renders on state mutation\"],\n \"effort\": {\"estimated_minutes\": 30, \"complexity\": \"medium\"}\n }\n ]\n}`;\n\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: parseInt(process.env.PG_C2_MAX_TOKENS || '32768', 10),\n });\n\n const rawSteps = (result.steps || []) as Record<string, unknown>[];\n // Clamp to 2-6 steps per prompt contract\n const clampedSteps = rawSteps.length > 6 ? rawSteps.slice(0, 6) : rawSteps.length < 2 && rawSteps.length > 0 ? rawSteps : rawSteps;\n if (rawSteps.length > 6) {\n console.warn(`[WARN] LLM returned ${rawSteps.length} steps for ${fid}, clamped to 6`);\n } else if (rawSteps.length === 0) {\n console.warn(`[WARN] LLM returned 0 steps for ${fid}`);\n }\n return clampedSteps.map((s, i) => ({\n id: `${fid}-S${i + 1}`,\n sequence: i + 1,\n name: String(s.name || `Step ${i + 1}`),\n description: String(s.description || ''),\n files: Array.isArray(s.files) ? s.files as string[] : [],\n api_usage: Array.isArray(s.api_usage) ? s.api_usage as string[] : [],\n keywords: Array.isArray(s.keywords) ? s.keywords as string[] : [],\n completion_level: (String(s.completion_level || 'mvp') as 'base' | 'mvp' | 'extend' | 'polish'),\n platform: String(s.platform || feature.platform || 'app'),\n intent: String(s.intent || ''),\n outcome: s.outcome as Step['outcome'],\n acceptance: Array.isArray(s.acceptance) ? s.acceptance as string[] : [],\n effort: s.effort as Step['effort'],\n requirement_ids: [],\n concept_codes: [],\n }));\n}\n\n/**\n * Extract steps for MULTIPLE features in a single LLM call.\n */\nexport async function extractFeatureStepsBatched(\n goal: string,\n techStack: string,\n sdkApiIndex: { sdk_apis: Array<{ name: string; kind: string; used_in_demo: boolean }> },\n fileContentsMap: Map<string, string>,\n featuresMeta: Feature[],\n llmConfig?: LlmClientConfig,\n): Promise<Map<string, Step[]>> {\n const client = createLlmClient(llmConfig);\n\n const usedSdkApis = sdkApiIndex.sdk_apis\n .filter(api => api.used_in_demo)\n .map(api => api.name)\n .slice(0, 2000);\n\n const sourceText = buildSourceText(fileContentsMap);\n\n const featuresListing = featuresMeta.map(f =>\n `- ${f.id || 'F?'}: ${f.name || ''} — ${f.description || ''}`,\n ).join('\\n');\n\n const systemPrompt = (\n 'You are a software architect. Split MULTIPLE features into ACTION steps. '\n + 'Each step must carry files[], api_usage[], keywords[], and '\n + 'completion_level ∈ {base, mvp, extend, polish}. '\n + 'Include metadata: intent, outcome ({user_visible, technical}), '\n + 'acceptance[] (2 verifiable criteria), effort ({estimated_minutes, complexity}). '\n + 'description: ONE concise sentence, MAX 140 characters. '\n + 'NEVER invent files/APIs. Return ONLY the JSON. '\n + 'ALL text must be in ENGLISH.'\n );\n\n const userPrompt = `App goal: ${goal}\nTech stack: ${techStack}\n\nSDK API list (used_in_demo):\n${JSON.stringify(usedSdkApis)}\n\nSource code:\n${sourceText}\n\nFEATURES to split into steps:\n${featuresListing}\n\nFor EACH feature above, produce 4-6 action steps. Each step must include:\nid, sequence, name, description, files, api_usage, keywords, completion_level, platform,\nintent, outcome ({user_visible, technical}), acceptance[] (2 criteria), effort ({estimated_minutes, complexity}).\n\nReturn JSON with a \"steps\" dict keyed by feature_id:\n{\n \"steps\": {\n \"<feature_id>\": [\n {\n \"id\": \"<feature_id>-S1\",\n \"sequence\": 1,\n \"name\": \"Step name\",\n \"description\": \"Concise sentence (max 140 chars)\",\n \"files\": [\"path/to/file\"],\n \"api_usage\": [\"APIName\"],\n \"keywords\": [\"keyword\"],\n \"completion_level\": \"mvp\",\n \"platform\": \"app\",\n \"intent\": \"Step intent\",\n \"outcome\": {\"user_visible\": \"User visible result\", \"technical\": \"Technical result\"},\n \"acceptance\": [\"Criterion 1\", \"Criterion 2\"],\n \"effort\": {\"estimated_minutes\": 30, \"complexity\": \"medium\"}\n }\n ]\n }\n}`;\n\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: parseInt(process.env.PG_C2_MAX_TOKENS || '32768', 10),\n });\n\n const stepsDict = result.steps as Record<string, Record<string, unknown>[]> | undefined;\n const output = new Map<string, Step[]>();\n\n if (stepsDict && typeof stepsDict === 'object') {\n for (const [fid, rawSteps] of Object.entries(stepsDict)) {\n if (!Array.isArray(rawSteps)) continue;\n const featMeta = featuresMeta.find(f => f.id === fid);\n const steps = rawSteps.map((s, i) => ({\n id: `${fid}-S${i + 1}`,\n sequence: i + 1,\n name: String(s.name || `Step ${i + 1}`),\n description: String(s.description || ''),\n files: Array.isArray(s.files) ? s.files as string[] : [],\n api_usage: Array.isArray(s.api_usage) ? s.api_usage as string[] : [],\n keywords: Array.isArray(s.keywords) ? s.keywords as string[] : [],\n completion_level: (String(s.completion_level || 'mvp') as 'base' | 'mvp' | 'extend' | 'polish'),\n platform: String(s.platform || featMeta?.platform || 'app'),\n intent: String(s.intent || ''),\n outcome: s.outcome as Step['outcome'],\n acceptance: Array.isArray(s.acceptance) ? s.acceptance as string[] : [],\n effort: s.effort as Step['effort'],\n requirement_ids: [],\n concept_codes: [],\n }));\n output.set(fid, steps);\n }\n }\n\n return output;\n}\n","/**\n * STEP D: Ground-truth verification of project graph against code and SDK API index.\n *\n * Ported from knowledge-tree/llm_project_graph.py verify_project_graph()\n * Removes invalid files, APIs, keywords and logs hallucinations.\n */\n\nimport type { ProjectGraph, Feature, Step } from '../schemas/projectGraphSchema';\n\nexport interface Hallucination {\n type: string;\n item: string;\n feature_id: string;\n step_id: string;\n reason: string;\n}\n\nexport interface VerifyOptions {\n repoDir: string;\n sdkApiIndex: { sdk_apis: Array<{ name: string; kind: string; used_in_demo: boolean }> };\n fileContentsMap: Map<string, string>;\n}\n\n/**\n * Verify project graph against actual code. Remove hallucinated files, APIs, keywords.\n * F0 (foundation) keywords are kept as-is since they are pedagogical terms.\n */\nexport function verifyProjectGraph(\n projectGraph: ProjectGraph,\n options: VerifyOptions,\n): { graph: ProjectGraph; hallucinations: Hallucination[] } {\n const { sdkApiIndex, fileContentsMap } = options;\n const sdkApiNames = new Set(sdkApiIndex.sdk_apis.map(api => api.name));\n const hallucinations: Hallucination[] = [];\n\n const features = projectGraph.features || [];\n\n for (const feature of features) {\n const fid = feature.id || 'F_UNK';\n const isFoundation = fid === 'F0';\n\n for (const step of feature.steps || []) {\n const sid = step.id || `${fid}-SUNK`;\n\n // Verify files[]\n const validFiles: string[] = [];\n for (const f of step.files || []) {\n if (fileContentsMap.has(f)) {\n validFiles.push(f);\n } else {\n hallucinations.push({\n type: 'file',\n item: f,\n feature_id: fid,\n step_id: sid,\n reason: `File '${f}' not found in repository`,\n });\n }\n }\n step.files = validFiles;\n\n // Verify api_usage[]\n const validApis: string[] = [];\n for (const api of step.api_usage || []) {\n if (sdkApiNames.size === 0 || sdkApiNames.has(api)) {\n validApis.push(api);\n } else {\n hallucinations.push({\n type: 'api',\n item: api,\n feature_id: fid,\n step_id: sid,\n reason: `API '${api}' not found in SDK API index`,\n });\n }\n }\n step.api_usage = validApis;\n\n // Verify keywords[] — skip for F0 (foundation keywords are pedagogical)\n if (isFoundation) continue;\n\n const validKws: string[] = [];\n for (const kw of step.keywords || []) {\n const kwLow = kw.toLowerCase();\n // Single-word keywords: use word boundary match to avoid\n // false positives (\"app\" should NOT match \"mapping\" or \"happen\")\n const isSingleWord = !kwLow.includes(' ');\n let found = false;\n // Check in step's files\n for (const f of validFiles) {\n const content = (fileContentsMap.get(f) || '').toLowerCase();\n if (isSingleWord) {\n found = new RegExp(`\\\\b${kwLow.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`).test(content);\n } else {\n found = content.includes(kwLow);\n }\n if (found) break;\n }\n // Check in any file\n if (!found) {\n for (const content of fileContentsMap.values()) {\n const lc = content.toLowerCase();\n if (isSingleWord) {\n found = new RegExp(`\\\\b${kwLow.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`).test(lc);\n } else {\n found = lc.includes(kwLow);\n }\n if (found) break;\n }\n }\n\n if (found) {\n validKws.push(kw);\n } else {\n hallucinations.push({\n type: 'keyword',\n item: kw,\n feature_id: fid,\n step_id: sid,\n reason: `Keyword '${kw}' not found in target files`,\n });\n }\n }\n step.keywords = validKws;\n }\n }\n\n return { graph: projectGraph, hallucinations };\n}\n","/**\n * STEP E: Escalate keywords/api_usage to neutral concepts + ULO/CIO/SIO depth + evidence files join.\n *\n * Ported from knowledge-tree/llm_project_graph.py escalate_and_map_concepts()\n * Maps concrete keywords to technology-neutral concept codes WITH depth levels.\n *\n * ULO/CIO/SIO model:\n * - ULO: WHAT + WHY — concept is introduced (what it is, why it exists)\n * - CIO: HOW — mechanism is explained (how it works)\n * - SIO: IMPLEMENTATION — concrete tech-specific usage (syntax, API)\n */\n\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\nimport type { ProjectGraph, Feature } from '../schemas/projectGraphSchema';\n\nexport interface ConceptMapping {\n concept_code: string;\n concept_name: string;\n keyword: string;\n depth: 'ulo' | 'cio' | 'sio';\n depth_rationale: string;\n evidence_files: string[];\n}\n\nexport interface EscalateOptions {\n projectGraph: ProjectGraph;\n fileContentsMap: Map<string, string>;\n availableConcepts?: string[];\n conceptMapOverride?: Record<string, { concept_code: string; concept_name: string; depth?: string }>;\n llmConfig?: LlmClientConfig;\n}\n\nfunction toUpperSnake(term: string): string {\n let s = term.replace(/^[^\\w]+/, '');\n s = s.replace(/([a-z0-9])([A-Z])/g, '$1_$2');\n s = s.replace(/[^\\w]+/g, '_');\n const res = s.toUpperCase().replace(/^_+|_+$/g, '');\n return res || 'CONCEPT';\n}\n\nfunction extractTermSnippets(term: string, fileContentsMap: Map<string, string>, maxSnippets = 1): string[] {\n const snippets: string[] = [];\n const termLow = term.toLowerCase();\n for (const [relPath, content] of fileContentsMap) {\n const lines = content.split('\\n');\n for (let idx = 0; idx < lines.length; idx++) {\n if (lines[idx].toLowerCase().includes(termLow)) {\n const start = Math.max(0, idx - 1);\n const end = Math.min(lines.length, idx + 2);\n let snippet = lines.slice(start, end).map(l => l.trim()).filter(Boolean).join(' ');\n if (snippet.length > 120) snippet = snippet.slice(0, 120) + '...';\n if (snippet) snippets.push(`[${relPath}]: ${snippet}`);\n if (snippets.length >= maxSnippets) break;\n }\n }\n if (snippets.length >= maxSnippets) break;\n }\n return snippets;\n}\n\n/**\n * Determine ULO/CIO/SIO depth based on keyword usage context.\n */\nfunction inferDepthFromContext(\n keyword: string,\n fileContentsMap: Map<string, string>,\n): { depth: 'ulo' | 'cio' | 'sio'; rationale: string } {\n const kw = keyword.toLowerCase();\n\n // SIO: specific implementation keywords (API names, decorators, syntax)\n const sioPatterns = [\n /^@/, // SwiftUI decorators: @State, @Binding\n /^import\\s/, // Import statements\n /\\(\\)$/, // Function calls\n /\\.prototype/, // Prototype methods\n /^new\\s/, // Constructor calls\n /^async\\s/, // Async keywords\n /^await\\s/,\n ];\n\n if (sioPatterns.some(p => p.test(keyword))) {\n return { depth: 'sio', rationale: `Keyword '${keyword}' is a specific API/syntax pattern` };\n }\n\n // CIO: mechanism-level keywords (patterns, protocols, design patterns)\n const cioPatterns = [\n /pattern/i, /protocol/i, /architecture/i, /lifecycle/i,\n /observer/i, /singleton/i, /factory/i, /delegate/i,\n /state\\s*management/i, /data\\s*flow/i, /binding/i,\n /mvvm/i, /mvc/i, /flux/i, /redux/i,\n /authentication/i, /authorization/i,\n /persistence/i, /caching/i, /serialization/i,\n ];\n\n if (cioPatterns.some(p => p.test(keyword))) {\n return { depth: 'cio', rationale: `Keyword '${keyword}' represents a mechanism/pattern` };\n }\n\n // ULO: general concept keywords (what/why level)\n const uloPatterns = [\n /design\\s*thinking/i, /user\\s*needs/i, /problem\\s*statement/i,\n /foundation/i, /setup/i, /overview/i, /introduction/i,\n /scaffold/i, /hello\\s*world/i, /getting\\s*started/i,\n ];\n\n if (uloPatterns.some(p => p.test(keyword))) {\n return { depth: 'ulo', rationale: `Keyword '${keyword}' is a foundational/introductory concept` };\n }\n\n // Default: check evidence in code — if it appears in import/declaration → SIO, in comment → ULO\n for (const content of fileContentsMap.values()) {\n const lines = content.split('\\n');\n for (const line of lines) {\n if (line.toLowerCase().includes(kw)) {\n if (/^(import|from|require|use |#include)/.test(line.trim())) {\n return { depth: 'sio', rationale: `Keyword '${keyword}' found in import statement` };\n }\n if (/^\\/\\/|^\\/\\*|^#|^-->/.test(line.trim())) {\n return { depth: 'ulo', rationale: `Keyword '${keyword}' found in comment/doc` };\n }\n // Found in code body → likely SIO\n return { depth: 'sio', rationale: `Keyword '${keyword}' used in implementation code` };\n }\n }\n }\n\n return { depth: 'sio', rationale: `Default: treating '${keyword}' as SIO (implementation-level)` };\n}\n\n/**\n * Escalate keywords/api_usage to neutral concepts with ULO/CIO/SIO depth and join evidence files.\n */\nexport async function escalateAndMapConcepts(\n options: EscalateOptions,\n): Promise<Map<string, ConceptMapping[]>> {\n const { projectGraph, fileContentsMap, availableConcepts, conceptMapOverride, llmConfig } = options;\n\n const features = projectGraph.features || [];\n\n // Collect all terms from all features\n const allTerms = new Set<string>();\n for (const feature of features) {\n for (const step of feature.steps || []) {\n for (const api of step.api_usage || []) allTerms.add(api);\n for (const kw of step.keywords || []) allTerms.add(kw);\n }\n }\n\n if (allTerms.size === 0) return new Map();\n\n const termList = Array.from(allTerms).sort();\n let llmResults: Record<string, { concept_code?: string; concept_name?: string; depth?: string }> = {};\n\n if (conceptMapOverride) {\n llmResults = conceptMapOverride;\n } else {\n try {\n const client = createLlmClient(llmConfig);\n const conceptBank = (availableConcepts || []).sort().join(', ') || '(empty)';\n\n const termEntries = termList.map(term => {\n const snippets = extractTermSnippets(term, fileContentsMap);\n return snippets.length > 0\n ? `- ${term} (Usage context: ${snippets[0]})`\n : `- ${term}`;\n });\n\n const systemPrompt = (\n 'You are a knowledge classification expert. For each concrete keyword/API, determine:\\n'\n + '1. The neutral concept it belongs to (UPPER_SNAKE_CASE)\\n'\n + '2. The depth level: ulo | cio | sio\\n\\n'\n + 'DEPTH DEFINITIONS:\\n'\n + '- ulo (WHAT + WHY): The keyword introduces a concept — \"what is it, why does it exist\"\\n'\n + ' Example: In a scaffold step, \"@State is SwiftUI\\'s way of managing local view state\"\\n'\n + '- cio (HOW): The keyword demonstrates a mechanism — \"how it works\"\\n'\n + ' Example: \"@State triggers view re-render when value changes — mechanism is value-type observation\"\\n'\n + '- sio (IMPLEMENTATION): The keyword is a concrete API/syntax used in code\\n'\n + ' Example: \"Using @State var isActive: Bool = false in ContentView\"\\n\\n'\n + 'RULES:\\n'\n + '1. PREFER an EXISTING concept from the CONCEPT_BANK below if the keyword is a manifestation of that concept.\\n'\n + '2. ONLY create a NEW concept (UPPER_SNAKE_CASE, NOT ending in _CONCEPT, NOT containing a specific technology name) when NO concept in the bank covers it.\\n'\n + `3. CONCEPT_BANK: ${conceptBank.slice(0, 12000)}\\n`\n + '4. Depth is per-keyword-in-context, NOT per-concept. The same concept can have ULO at one step and SIO at another.\\n'\n + 'Return JSON: {\"results\": {\"<keyword>\": {\"concept_code\": \"...\", \"concept_name\": \"...\", \"depth\": \"ulo|cio|sio\"}}}'\n );\n\n const userPrompt = (\n 'Classify the following keyword/API list into neutral concepts WITH depth levels.\\n'\n + 'Code usage context is provided to disambiguate depth:\\n'\n + termEntries.join('\\n')\n + '\\n\\nReturn JSON: {\"results\": {\"<keyword>\": {\"concept_code\": \"...\", \"concept_name\": \"...\", \"depth\": \"ulo|cio|sio\"}}}'\n );\n\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: 16384,\n });\n\n llmResults = (result.results || {}) as Record<string, { concept_code?: string; concept_name?: string; depth?: string }>;\n } catch (err) {\n console.warn(`[WARN] Concept escalation LLM failed (${err}), using fallback depth inference`);\n }\n }\n\n // Join results into feature_concepts\n const featureConcepts = new Map<string, ConceptMapping[]>();\n\n for (const feature of features) {\n const fid = feature.id || 'F_UNK';\n const featureFiles = new Set<string>();\n for (const step of feature.steps || []) {\n for (const f of step.files || []) featureFiles.add(f);\n }\n\n const fTerms = [\n ...(feature.api_usage || []),\n ...(feature.steps || []).flatMap(s => [...(s.api_usage || []), ...(s.keywords || [])]),\n ];\n\n const items: ConceptMapping[] = [];\n const seen = new Set<string>();\n\n for (const kw of fTerms) {\n const info = llmResults[kw] || {};\n const cCode = info.concept_code || toUpperSnake(kw);\n const cName = info.concept_name || kw;\n\n // Determine depth: LLM result > fallback inference\n let depth: 'ulo' | 'cio' | 'sio' = 'sio';\n let depthRationale = 'Default: SIO';\n\n if (info.depth && ['ulo', 'cio', 'sio'].includes(info.depth)) {\n depth = info.depth as 'ulo' | 'cio' | 'sio';\n depthRationale = `LLM classified as ${depth}`;\n } else {\n const inferred = inferDepthFromContext(kw, fileContentsMap);\n depth = inferred.depth;\n depthRationale = inferred.rationale;\n }\n\n // Allow multiple keywords per concept — don't dedup by concept_code\n const kwKey = `${cCode}::${kw}`;\n if (seen.has(kwKey)) continue;\n seen.add(kwKey);\n\n // Evidence: files that actually contain this term\n const evidenceFiles: string[] = [];\n for (const f of featureFiles) {\n const content = fileContentsMap.get(f) || '';\n if (content.toLowerCase().includes(kw.toLowerCase())) {\n evidenceFiles.push(f);\n }\n }\n\n items.push({\n concept_code: cCode,\n concept_name: cName,\n keyword: kw,\n depth,\n depth_rationale: depthRationale,\n evidence_files: evidenceFiles,\n });\n }\n\n featureConcepts.set(fid, items);\n }\n\n return featureConcepts;\n}\n","/**\n * Concept resolution — maps keywords to Master Tree concepts.\n *\n * Ported from knowledge-tree/resolve_concepts.py\n * Uses ULO/CIO/SIO-aware matching:\n * - SIO keywords → match against concept.keywords (tech-specific)\n * - CIO keywords → match against concept.description (mechanism)\n * - ULO keywords → match against concept.ulo (what/why, tech-independent)\n *\n * Fallback: keyword overlap matching when embeddings unavailable.\n *\n * NOTE: This module requires sentence-transformers Python package for embeddings.\n * In pure TypeScript mode, it falls back to keyword overlap matching.\n */\n\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\nimport type { Keyword } from '../extractors/keywordExtractor';\n\nexport interface ResolvedConcept {\n keyword: string;\n source: string;\n depth: 'ulo' | 'cio' | 'sio';\n concept_codes: string[];\n matches: ConceptMatch[];\n override?: boolean;\n rechecked?: boolean;\n}\n\nexport interface ConceptMatch {\n code: string;\n name: string;\n description: string;\n keywords: string;\n ulo?: string;\n cio?: string;\n score: number;\n matched_level: 'ulo' | 'cio' | 'sio';\n method: 'embedding' | 'keyword_overlap';\n}\n\nexport interface ProposedConcept {\n keyword: string;\n source: string;\n depth: 'ulo' | 'cio' | 'sio';\n reason: string;\n best_match?: ConceptMatch;\n}\n\nexport interface ResolveConceptsResult {\n resolved: ResolvedConcept[];\n proposed: ProposedConcept[];\n summary: {\n total_keywords: number;\n resolved_count: number;\n proposed_count: number;\n search_mode: string;\n };\n}\n\nexport interface ResolveConceptsOptions {\n keywords: Keyword[];\n goal: string;\n embeddings?: Record<string, { embedding?: number[]; name?: string; description?: string; keywords?: string; ulo?: string; cio?: string }>;\n /** Pre-computed depth from conceptEscalator — overrides inferDepthFromSource */\n depthOverrides?: Map<string, 'ulo' | 'cio' | 'sio'>;\n topK?: number;\n threshold?: number;\n llmConfig?: LlmClientConfig;\n}\n\n// Source-based thresholds\nconst SOURCE_THRESHOLDS: Record<string, number> = {\n docstring: 0.45,\n readme_description: 0.45,\n readme: 0.50,\n type_declaration: 0.55,\n function_signature: 0.55,\n import: 0.60,\n property_wrapper: 0.55,\n error_handling: 0.60,\n config: 0.60,\n framework_usage: 0.45,\n};\n\nconst DEFAULT_THRESHOLD = 0.55;\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n if (!a.length || !b.length || a.length !== b.length) return 0;\n let dot = 0, normA = 0, normB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n if (normA === 0 || normB === 0) return 0;\n return dot / (Math.sqrt(normA) * Math.sqrt(normB));\n}\n\n/**\n * ULO/CIO/SIO-aware keyword overlap scoring.\n * Matches against different concept fields based on depth level.\n */\nfunction uloCioAwareScore(\n query: string,\n depth: 'ulo' | 'cio' | 'sio',\n conceptData: { keywords?: string; description?: string; ulo?: string; cio?: string },\n): number {\n const queryTerms = new Set(query.toLowerCase().split(/\\s+/));\n\n // Choose which fields to match based on depth\n let targetText = '';\n if (depth === 'sio') {\n // SIO: match against keywords (tech-specific terms)\n targetText = conceptData.keywords || '';\n } else if (depth === 'cio') {\n // CIO: match against description + cio (mechanism)\n targetText = [conceptData.description || '', conceptData.cio || ''].join(' ');\n } else {\n // ULO: match against ulo + description (what/why, tech-independent)\n targetText = [conceptData.ulo || '', conceptData.description || ''].join(' ');\n }\n\n const targetTerms = new Set(targetText.toLowerCase().split(/\\s+/));\n if (!queryTerms.size || !targetTerms.size) return 0;\n\n let overlap = 0;\n for (const t of queryTerms) {\n if (targetTerms.has(t)) overlap++;\n }\n return Math.min(overlap / queryTerms.size, 1.0);\n}\n\n\nfunction inferFieldsFromGoal(goal: string): string[] {\n const goalLower = goal.toLowerCase();\n const fieldKeywords: Record<string, string[]> = {\n ASE: ['algorithm', 'software', 'programming', 'code', 'develop', 'build', 'app'],\n DAI: ['data', 'database', 'storage', 'query', 'sql', 'analytics'],\n CSN: ['network', 'protocol', 'server', 'client', 'api', 'http'],\n HCI: ['user', 'interface', 'ui', 'ux', 'interaction', 'design'],\n MOB: ['mobile', 'ios', 'android', 'swift', 'kotlin', 'flutter'],\n WEB: ['web', 'html', 'css', 'javascript', 'react', 'vue'],\n };\n\n const matched: string[] = [];\n for (const [code, keywords] of Object.entries(fieldKeywords)) {\n if (keywords.some(kw => goalLower.includes(kw))) matched.push(code);\n }\n return matched.length > 0 ? matched : ['ASE'];\n}\n\n/**\n * Infer depth from keyword source and context.\n */\nfunction inferDepthFromSource(source: string): 'ulo' | 'cio' | 'sio' {\n const uloSources = ['docstring', 'readme', 'readme_description', 'framework_usage'];\n const cioSources = ['type_declaration', 'function_signature', 'config'];\n\n if (uloSources.includes(source)) return 'ulo';\n if (cioSources.includes(source)) return 'cio';\n return 'sio';\n}\n\n/**\n * Resolve keywords to concepts using ULO/CIO/SIO-aware matching.\n */\nexport async function resolveConcepts(\n options: ResolveConceptsOptions,\n): Promise<ResolveConceptsResult> {\n const { keywords, goal, embeddings, depthOverrides, topK = 3, threshold = DEFAULT_THRESHOLD, llmConfig } = options;\n\n const relevantFields = inferFieldsFromGoal(goal);\n const resolved: ResolvedConcept[] = [];\n const proposed: ProposedConcept[] = [];\n const hasEmbeddings = Object.keys(embeddings || {}).length > 0 &&\n Object.values(embeddings || {}).some(d => d.embedding && d.embedding.length > 0);\n let search_mode = hasEmbeddings ? 'embedding' : 'keyword_overlap';\n\n const concepts = embeddings || {};\n\n for (const kwData of keywords) {\n const keyword = kwData.keyword;\n const source = kwData.source;\n // Use escalator's depth override if available, else infer from source\n const depth = depthOverrides?.get(keyword) || inferDepthFromSource(source);\n\n // Search concepts via ULO/CIO/SIO-aware matching\n const scored: ConceptMatch[] = [];\n for (const [code, data] of Object.entries(concepts)) {\n const conceptKeywords = data.keywords || '';\n const conceptDesc = data.description || '';\n const conceptUlo = (data as Record<string, unknown>).ulo as string | undefined;\n const conceptCio = (data as Record<string, unknown>).cio as string | undefined;\n\n // Primary: ULO/CIO-aware score based on depth level\n const awareScore = uloCioAwareScore(keyword, depth, {\n keywords: conceptKeywords,\n description: conceptDesc,\n ulo: conceptUlo,\n cio: conceptCio,\n });\n\n // Fallback: broad keyword overlap across all fields\n const queryTerms = new Set(keyword.toLowerCase().split(/\\s+/));\n const allTerms = new Set([\n ...conceptKeywords.toLowerCase().split(/\\s+/),\n ...conceptDesc.toLowerCase().split(/\\s+/),\n ...(conceptUlo || '').toLowerCase().split(/\\s+/),\n ...(conceptCio || '').toLowerCase().split(/\\s+/),\n ].filter(Boolean));\n let overlapCount = 0;\n for (const t of queryTerms) { if (allTerms.has(t)) overlapCount++; }\n const fallbackScore = queryTerms.size > 0 ? Math.min(overlapCount / queryTerms.size, 1.0) : 0;\n\n // Use the higher score, but track which method won\n const usedAware = awareScore >= fallbackScore;\n const finalScore = usedAware ? awareScore : fallbackScore;\n\n if (finalScore > 0) {\n scored.push({\n code,\n name: data.name || code,\n description: conceptDesc,\n keywords: conceptKeywords,\n ulo: conceptUlo,\n cio: conceptCio,\n score: finalScore,\n matched_level: usedAware ? depth : 'sio',\n method: hasEmbeddings && data.embedding && data.embedding.length > 0 ? 'embedding' : 'keyword_overlap',\n });\n }\n }\n\n scored.sort((a, b) => b.score - a.score);\n const topMatches = scored.slice(0, topK);\n\n if (topMatches.length === 0) {\n proposed.push({\n keyword,\n source,\n depth,\n reason: 'No matches in Master Tree',\n });\n continue;\n }\n\n const effThreshold = SOURCE_THRESHOLDS[source] || threshold;\n const topMatch = topMatches[0];\n\n if (topMatch.score >= effThreshold) {\n resolved.push({\n keyword,\n source,\n depth,\n concept_codes: topMatches.filter(m => m.score >= effThreshold).map(m => m.code),\n matches: topMatches,\n });\n } else {\n proposed.push({\n keyword,\n source,\n depth,\n best_match: topMatch,\n reason: `Low confidence (${topMatch.score.toFixed(2)} < ${effThreshold})`,\n });\n }\n }\n\n return {\n resolved,\n proposed,\n summary: {\n total_keywords: keywords.length,\n resolved_count: resolved.length,\n proposed_count: proposed.length,\n search_mode,\n },\n };\n}\n","/**\n * Roadmap assembly — assembles final roadmap with keyword tracking and time awareness.\n *\n * Ported from knowledge-tree/assemble_roadmap.py\n * Handles: topo sort, phases, keyword-per-milestone tracking.\n *\n * Improvements:\n * - Time budget per session/lesson\n * - Overhead factor (setup, transitions, review)\n * - Smart feature → milestone splitting (respect time constraints)\n * - Phase grouping based on concept progression\n */\n\nimport type { ProjectGraph, Feature, Step } from '../schemas/projectGraphSchema';\nimport type { ConceptMapping } from '../graph/conceptEscalator';\n\nexport interface AssembledMilestone {\n id: string;\n name: string;\n description: string;\n feature_id: string;\n feature_name: string;\n concept_code: string;\n depth: 'ulo' | 'cio' | 'sio';\n all_keywords: string[];\n new_keywords: string[];\n prerequisite_keywords: string[];\n steps: Step[];\n estimated_minutes: number;\n adjusted_minutes: number; // with overhead\n completion_level: string;\n}\n\nexport interface AssembledPhase {\n phase_id: number;\n phase_name: string;\n milestones: AssembledMilestone[];\n total_minutes: number;\n concept_progression: string; // e.g., \"ULO → CIO → SIO\"\n}\n\nexport interface AssembledRoadmap {\n project: ProjectGraph['project'];\n product: ProjectGraph['product'];\n phases: AssembledPhase[];\n feature_concepts: Map<string, ConceptMapping[]>;\n time_budget: {\n session_minutes: number;\n overhead_factor: number;\n total_estimated_minutes: number;\n total_adjusted_minutes: number;\n };\n}\n\nexport interface AssembleOptions {\n projectGraph: ProjectGraph;\n featureConcepts?: Map<string, ConceptMapping[]>;\n sessionMinutes?: number; // Target minutes per session/lesson (default: 90)\n overheadFactor?: number; // Overhead multiplier (default: 1.15 = 15% overhead)\n maxMilestoneMinutes?: number; // Max minutes before splitting a milestone (default: 120)\n}\n\n// ─── Overhead Calculation ────────────────────────────────────────────────────\n\n/**\n * Calculate overhead-adjusted minutes for a milestone.\n * Overhead includes: setup time, transitions, review, Q&A.\n */\nfunction calculateOverhead(\n rawMinutes: number,\n overheadFactor: number,\n): number {\n return Math.ceil(rawMinutes * overheadFactor);\n}\n\n// ─── Milestone Splitting ─────────────────────────────────────────────────────\n\n/**\n * Split a feature's steps into multiple milestones if they exceed maxMilestoneMinutes.\n * Splits at natural break points (between steps of different complexity).\n */\nfunction splitFeatureIntoMilestones(\n feature: Feature,\n featureConcepts: ConceptMapping[],\n maxMinutes: number,\n overheadFactor: number,\n): AssembledMilestone[] {\n const steps = feature.steps || [];\n if (steps.length === 0) return [];\n\n const featureId = feature.id || 'F_UNK';\n\n // Calculate raw minutes per step\n const stepMinutes = steps.map(s => s.effort?.estimated_minutes || 15);\n const totalRawMinutes = stepMinutes.reduce((a, b) => a + b, 0);\n\n // If within budget, return as single milestone\n if (calculateOverhead(totalRawMinutes, overheadFactor) <= maxMinutes) {\n return [buildMilestone(feature, featureConcepts, steps, stepMinutes, featureId, 1)];\n }\n\n // Split into multiple milestones\n const milestones: AssembledMilestone[] = [];\n let currentSteps: Step[] = [];\n let currentMinutes: number[] = [];\n let milestoneIndex = 1;\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n const mins = stepMinutes[i];\n\n // Check if adding this step would exceed budget\n const currentTotal = currentMinutes.reduce((a, b) => a + b, 0);\n if (calculateOverhead(currentTotal + mins, overheadFactor) > maxMinutes && currentSteps.length > 0) {\n // Split here\n milestones.push(buildMilestone(\n feature, featureConcepts, currentSteps, currentMinutes,\n featureId, milestoneIndex,\n ));\n milestoneIndex++;\n currentSteps = [];\n currentMinutes = [];\n }\n\n currentSteps.push(step);\n currentMinutes.push(mins);\n }\n\n // Don't forget the last group\n if (currentSteps.length > 0) {\n milestones.push(buildMilestone(\n feature, featureConcepts, currentSteps, currentMinutes,\n featureId, milestoneIndex,\n ));\n }\n\n return milestones;\n}\n\n/**\n * Build a single AssembledMilestone from steps.\n * Concept codes are mapped per-step, not per-feature.\n */\nfunction buildMilestone(\n feature: Feature,\n featureConcepts: ConceptMapping[],\n steps: Step[],\n stepMinutes: number[],\n featureId: string,\n milestoneIndex: number,\n): AssembledMilestone {\n const rawMinutes = stepMinutes.reduce((a, b) => a + b, 0);\n const levels = steps.map(s => s.completion_level || 'mvp');\n const completionLevel = levels.includes('extend') ? 'extend'\n : levels.includes('mvp') ? 'mvp'\n : 'base';\n\n // Collect concept codes PER STEP (not per feature)\n const milestoneConcepts = new Set<string>();\n const milestoneKeywords = new Set<string>();\n for (const step of steps) {\n // Use step-level concept_codes if propagated, else match by keyword\n const stepConceptCodes = step.concept_codes || [];\n for (const code of stepConceptCodes) {\n milestoneConcepts.add(code);\n }\n // Also match by keyword presence\n const stepKws = [...(step.keywords || []), ...(step.api_usage || [])];\n for (const cm of featureConcepts) {\n if (stepKws.includes(cm.keyword)) {\n milestoneConcepts.add(cm.concept_code);\n milestoneKeywords.add(cm.keyword);\n }\n }\n }\n\n // Determine dominant depth from step-level concept mappings\n const depthCounts = { ulo: 0, cio: 0, sio: 0 };\n for (const cm of featureConcepts) {\n if (milestoneKeywords.has(cm.keyword)) {\n depthCounts[cm.depth]++;\n }\n }\n const dominantDepth: 'ulo' | 'cio' | 'sio' =\n depthCounts.sio >= depthCounts.cio && depthCounts.sio >= depthCounts.ulo ? 'sio'\n : depthCounts.cio >= depthCounts.ulo ? 'cio'\n : 'ulo';\n\n return {\n id: milestoneIndex === 1 ? featureId : `${featureId}-M${milestoneIndex}`,\n name: milestoneIndex === 1 ? (feature.name || featureId) : `${feature.name || featureId} (Part ${milestoneIndex})`,\n description: feature.description || '',\n feature_id: featureId,\n feature_name: feature.name || '',\n concept_code: [...milestoneConcepts].join(', '),\n depth: dominantDepth,\n all_keywords: [],\n new_keywords: [],\n prerequisite_keywords: [],\n steps,\n estimated_minutes: rawMinutes,\n adjusted_minutes: rawMinutes, // placeholder — assembleRoadmap() applies actual overheadFactor\n completion_level: completionLevel,\n };\n}\n\n// ─── Keyword Tracking ────────────────────────────────────────────────────────\n\n/**\n * Build keyword map: concept_code → [keywords]\n */\nfunction buildKeywordMap(\n featureConcepts: Map<string, ConceptMapping[]>,\n): Map<string, string[]> {\n const map = new Map<string, string[]>();\n for (const mappings of featureConcepts.values()) {\n for (const m of mappings) {\n const existing = map.get(m.concept_code) || [];\n if (!existing.includes(m.keyword)) {\n existing.push(m.keyword);\n map.set(m.concept_code, existing);\n }\n }\n }\n return map;\n}\n\n/**\n * Attach keywords to milestones, computing new vs prerequisite.\n */\nfunction attachKeywordsToMilestones(\n milestones: AssembledMilestone[],\n keywordMap: Map<string, string[]>,\n): AssembledMilestone[] {\n const cumulativeKeywords = new Set<string>();\n\n for (const milestone of milestones) {\n // Aggregate keywords from concept codes\n const allKw = new Set<string>();\n const conceptCodes = milestone.concept_code.split(',').map((c: string) => c.trim()).filter(Boolean);\n for (const code of conceptCodes) {\n const kws = keywordMap.get(code) || [];\n for (const kw of kws) allKw.add(kw);\n }\n\n milestone.all_keywords = Array.from(allKw).sort();\n\n // Compute new vs prerequisite\n const newKw: string[] = [];\n const prereqKw: string[] = [];\n for (const kw of milestone.all_keywords) {\n if (cumulativeKeywords.has(kw)) {\n prereqKw.push(kw);\n } else {\n newKw.push(kw);\n cumulativeKeywords.add(kw);\n }\n }\n\n milestone.new_keywords = newKw;\n milestone.prerequisite_keywords = prereqKw;\n }\n\n return milestones;\n}\n\n// ─── Phase Grouping ──────────────────────────────────────────────────────────\n\n/**\n * Group milestones into phases based on time budget and concept progression.\n */\nfunction groupIntoPhases(\n milestones: AssembledMilestone[],\n sessionMinutes: number,\n): AssembledPhase[] {\n const phases: AssembledPhase[] = [];\n let currentMilestones: AssembledMilestone[] = [];\n let currentMinutes = 0;\n let phaseNum = 1;\n\n for (const milestone of milestones) {\n const milestoneMinutes = milestone.adjusted_minutes;\n\n // If adding this milestone would exceed session budget, start new phase\n if (currentMinutes + milestoneMinutes > sessionMinutes && currentMilestones.length > 0) {\n phases.push(buildPhase(currentMilestones, phaseNum));\n phaseNum++;\n currentMilestones = [];\n currentMinutes = 0;\n }\n\n currentMilestones.push(milestone);\n currentMinutes += milestoneMinutes;\n }\n\n // Don't forget the last phase\n if (currentMilestones.length > 0) {\n phases.push(buildPhase(currentMilestones, phaseNum));\n }\n\n return phases;\n}\n\nfunction buildPhase(milestones: AssembledMilestone[], phaseNum: number): AssembledPhase {\n const totalMinutes = milestones.reduce((sum, m) => sum + m.adjusted_minutes, 0);\n\n // Determine concept progression\n const depths = milestones.map(m => m.depth);\n const uniqueDepths = [...new Set(depths)];\n const progression = uniqueDepths.map(d => d.toUpperCase()).join(' → ');\n\n return {\n phase_id: phaseNum,\n phase_name: `Phase ${phaseNum}`,\n milestones,\n total_minutes: totalMinutes,\n concept_progression: progression,\n };\n}\n\n// ─── Main Assembly ───────────────────────────────────────────────────────────\n\n/**\n * Assemble project graph into a roadmap with phases and keyword tracking.\n */\nexport function assembleRoadmap(options: AssembleOptions): AssembledRoadmap {\n const {\n projectGraph,\n featureConcepts = new Map(),\n sessionMinutes = 90,\n overheadFactor = 1.15,\n maxMilestoneMinutes = 120,\n } = options;\n\n const features = projectGraph.features || [];\n const keywordMap = buildKeywordMap(featureConcepts);\n\n // Build milestones from features (with splitting)\n const allMilestones: AssembledMilestone[] = [];\n\n for (const feature of features) {\n const fid = feature.id || 'F_UNK';\n const fConcepts = featureConcepts.get(fid) || [];\n\n const milestones = splitFeatureIntoMilestones(\n feature,\n fConcepts,\n maxMilestoneMinutes,\n overheadFactor,\n );\n\n allMilestones.push(...milestones);\n }\n\n // Apply overhead factor\n for (const milestone of allMilestones) {\n milestone.adjusted_minutes = calculateOverhead(milestone.estimated_minutes, overheadFactor);\n }\n\n // Attach keywords (new vs prerequisite)\n attachKeywordsToMilestones(allMilestones, keywordMap);\n\n // Group into phases based on session time\n const phases = groupIntoPhases(allMilestones, sessionMinutes);\n\n // Calculate totals\n const totalEstimatedMinutes = allMilestones.reduce((sum, m) => sum + m.estimated_minutes, 0);\n const totalAdjustedMinutes = allMilestones.reduce((sum, m) => sum + m.adjusted_minutes, 0);\n\n return {\n project: projectGraph.project,\n product: projectGraph.product,\n phases,\n feature_concepts: featureConcepts,\n time_budget: {\n session_minutes: sessionMinutes,\n overhead_factor: overheadFactor,\n total_estimated_minutes: totalEstimatedMinutes,\n total_adjusted_minutes: totalAdjustedMinutes,\n },\n };\n}\n","/**\n * LLM-based File Selector — sends file tree to LLM, asks it to pick\n * which files are most relevant to the project goal.\n *\n * This mirrors knowledge-tree's approach:\n * 1. git_tracker generates project_structure.txt (file tree)\n * 2. Agent/LLM reads tree → selects important files\n * 3. Only selected files are read for analysis\n */\n\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\n\nexport interface FileSelectionResult {\n selected: string[];\n reasoning: string;\n}\n\n/**\n * Ask LLM to select which files from the file tree are relevant to the goal.\n * Input: file tree (names only, very small) + goal\n * Output: list of file paths to analyze\n */\nexport async function selectFilesWithLlm(\n filePaths: string[],\n goal: string,\n techStack: string,\n llmConfig?: LlmClientConfig,\n): Promise<FileSelectionResult> {\n // If very few files, no need to filter\n if (filePaths.length <= 15) {\n return { selected: filePaths, reasoning: 'Too few files to filter' };\n }\n\n const client = createLlmClient(llmConfig);\n\n // Build file tree for LLM (just names, grouped by directory)\n const treeLines = buildFileTree(filePaths);\n\n const systemPrompt = (\n 'You are a software architect analyzing a project repository.\\n'\n + 'Given a file tree and a project goal, select which files are MOST IMPORTANT '\n + 'to read for understanding the project architecture and implementation.\\n\\n'\n + 'RULES:\\n'\n + '1. Prioritize source code files (Swift, TS, Python, C++) over config/docs\\n'\n + '2. Include entry points (App.swift, main.py, index.ts)\\n'\n + '3. Include core domain files (models, services, views, controllers)\\n'\n + '4. EXCLUDE test files, mock files, generated files\\n'\n + '5. EXCLUDE config files (package.json, Podfile, etc.) unless they reveal architecture\\n'\n + '6. Include files that directly implement the features mentioned in the goal\\n'\n + '7. Return 20-40 files maximum (fewer is better if the project is small)\\n\\n'\n + 'Return JSON: {\"selected\": [\"path/to/file1\", \"path/to/file2\"], \"reasoning\": \"brief explanation\"}'\n );\n\n const userPrompt = (\n `Project goal: ${goal}\\n`\n + `Tech stack: ${techStack}\\n\\n`\n + `FILE TREE (${filePaths.length} files):\\n${treeLines}\\n\\n`\n + 'Select the most important files to analyze. Return JSON.'\n );\n\n try {\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: 4096,\n });\n\n const selected = Array.isArray(result.selected) ? result.selected as string[] : [];\n const reasoning = String(result.reasoning || '');\n\n // Validate: only keep files that exist in the original list\n const pathSet = new Set(filePaths);\n const validSelected = selected.filter(p => pathSet.has(p));\n\n if (validSelected.length === 0) {\n // LLM returned nothing valid — fallback to all files\n return { selected: filePaths, reasoning: 'LLM selection empty, using all files' };\n }\n\n return { selected: validSelected, reasoning };\n } catch (err) {\n console.warn(`[WARN] LLM file selection failed (${err}), using all files`);\n return { selected: filePaths, reasoning: `LLM failed: ${err}` };\n }\n}\n\n/**\n * Build a compact file tree string for LLM consumption.\n * Groups files by top-level directory, shows only filenames.\n */\nfunction buildFileTree(filePaths: string[]): string {\n const byDir = new Map<string, string[]>();\n\n for (const fp of filePaths) {\n const parts = fp.split('/');\n const dir = parts.length > 1 ? parts.slice(0, -1).join('/') : '(root)';\n const file = parts[parts.length - 1];\n if (!byDir.has(dir)) byDir.set(dir, []);\n byDir.get(dir)!.push(file);\n }\n\n const lines: string[] = [];\n for (const [dir, files] of byDir) {\n lines.push(`${dir}/`);\n for (const f of files.sort()) {\n lines.push(` ${f}`);\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * File I/O utilities for domain-kit pipeline.\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, statSync } from 'node:fs';\nimport { join, extname, relative, resolve } from 'node:path';\nimport { execSync } from 'node:child_process';\n\n/**\n * Read JSON file safely, returns null if not found or invalid.\n */\nexport function readJsonFile<T = unknown>(filePath: string): T | null {\n try {\n if (!existsSync(filePath)) return null;\n const content = readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Write JSON file, creating parent directories if needed.\n */\nexport function writeJsonFile(filePath: string, data: unknown): void {\n mkdirSync(join(filePath, '..'), { recursive: true });\n writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\n}\n\n/**\n * Read text file safely, returns null if not found.\n */\nexport function readTextFile(filePath: string): string | null {\n try {\n if (!existsSync(filePath)) return null;\n return readFileSync(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\n/**\n * Collect source files from a directory, filtering by allowed extensions.\n */\nexport function collectSourceFiles(\n dir: string,\n options?: {\n allowedExtensions?: string[];\n skipDirs?: string[];\n maxFiles?: number;\n },\n): string[] {\n const allowedExts = options?.allowedExtensions || ['.swift', '.ts', '.tsx', '.js', '.jsx', '.py', '.ino', '.cpp', '.c', '.h', '.hpp'];\n const maxFiles = options?.maxFiles || 70;\n\n // Try git ls-files first — respects .gitignore, handles submodules, symlinks\n const gitFiles = collectViaGit(dir, allowedExts, maxFiles);\n if (gitFiles.length > 0) return gitFiles;\n\n // Fallback: filesystem walk (non-git directories)\n return collectViaFilesystem(dir, allowedExts, maxFiles, options?.skipDirs);\n}\n\n/**\n * Collect source files using `git ls-files`.\n * Respects .gitignore, handles symlinks, much faster than walk.\n */\nfunction collectViaGit(dir: string, allowedExts: string[], maxFiles: number): string[] {\n try {\n const raw = execSync('git ls-files --cached --others --exclude-standard', {\n cwd: dir,\n encoding: 'utf-8',\n timeout: 5000,\n maxBuffer: 1024 * 1024,\n });\n const extSet = new Set(allowedExts.map(e => e.toLowerCase()));\n return raw\n .split('\\n')\n .filter(line => line.length > 0)\n .filter(line => extSet.has(extname(line).toLowerCase()))\n .slice(0, maxFiles)\n .map(rel => join(dir, rel));\n } catch {\n // Not a git repo or git not available — fall through to filesystem walk\n return [];\n }\n}\n\n/**\n * Collect source files using recursive directory walk (non-git fallback).\n */\nfunction collectViaFilesystem(\n dir: string,\n allowedExts: string[],\n maxFiles: number,\n skipDirs?: string[],\n): string[] {\n const skipSet = new Set(skipDirs || [\n 'node_modules', '.build', 'Pods', '.git', '.venv', 'venv',\n '__pycache__', 'build', 'dist', '.idea', '.vscode',\n 'test', 'tests', 'demo', 'sample', 'example', 'playground',\n ]);\n const extSet = new Set(allowedExts.map(e => e.toLowerCase()));\n const result: string[] = [];\n\n function walk(currentDir: string) {\n if (result.length >= maxFiles) return;\n let entries;\n try {\n entries = readdirSync(currentDir, { withFileTypes: true });\n } catch {\n return; // permission error\n }\n for (const entry of entries) {\n if (result.length >= maxFiles) return;\n const fullPath = join(currentDir, entry.name);\n if (entry.isDirectory()) {\n if (!skipSet.has(entry.name)) {\n walk(fullPath);\n }\n } else if (entry.isFile()) {\n const ext = extname(entry.name).toLowerCase();\n if (extSet.has(ext)) {\n result.push(fullPath);\n }\n }\n }\n }\n\n walk(dir);\n return result;\n}\n\n/**\n * Collect file contents map (relative path → content).\n */\nexport function collectFileContents(\n dir: string,\n options?: {\n allowedExtensions?: string[];\n skipDirs?: string[];\n maxFiles?: number;\n maxChars?: number;\n },\n): { paths: string[]; contents: Map<string, string> } {\n const maxChars = options?.maxChars || 500000;\n const files = collectSourceFiles(dir, options);\n const contents = new Map<string, string>();\n let totalChars = 0;\n\n for (const filePath of files) {\n const relPath = relative(dir, filePath);\n try {\n const content = readFileSync(filePath, 'utf-8');\n if (totalChars + content.length > maxChars) {\n const remaining = maxChars - totalChars;\n if (remaining > 100) {\n contents.set(relPath, content.slice(0, remaining));\n totalChars += remaining;\n }\n break;\n }\n contents.set(relPath, content);\n totalChars += content.length;\n } catch {\n // Skip unreadable files\n }\n }\n\n return { paths: files.map(f => relative(dir, f)), contents };\n}\n\n/**\n * Read contents of SPECIFIC files (by relative path) — no directory scan.\n * Used for 2-pass approach: scan tree first, then read only selected files.\n */\nexport function collectSpecificFileContents(\n dir: string,\n relativePaths: string[],\n maxChars: number = 500000,\n): Map<string, string> {\n const contents = new Map<string, string>();\n let totalChars = 0;\n\n for (const relPath of relativePaths) {\n const fullPath = join(dir, relPath);\n try {\n const content = readFileSync(fullPath, 'utf-8');\n if (totalChars + content.length > maxChars) {\n const remaining = maxChars - totalChars;\n if (remaining > 100) {\n contents.set(relPath, content.slice(0, remaining));\n totalChars += remaining;\n }\n break;\n }\n contents.set(relPath, content);\n totalChars += content.length;\n } catch {\n // Skip unreadable files\n }\n }\n\n return contents;\n}\n\n/**\n * Detect primary language from file extensions.\n */\nexport function detectPrimaryLanguage(filePaths: string[]): string {\n const counts = new Map<string, number>();\n for (const fp of filePaths) {\n const ext = extname(fp).toLowerCase();\n let lang = 'unknown';\n if (ext === '.swift') lang = 'Swift';\n else if (ext === '.ts' || ext === '.tsx') lang = 'TypeScript';\n else if (ext === '.js' || ext === '.jsx') lang = 'JavaScript';\n else if (ext === '.py') lang = 'Python';\n else if (ext === '.ino' || ext === '.cpp' || ext === '.c' || ext === '.h') lang = 'C++';\n else if (ext === '.kt' || ext === '.kts') lang = 'Kotlin';\n counts.set(lang, (counts.get(lang) || 0) + 1);\n }\n\n let maxCount = 0;\n let primary = 'unknown';\n for (const [lang, count] of counts) {\n if (count > maxCount) {\n maxCount = count;\n primary = lang;\n }\n }\n return primary;\n}\n\n/**\n * Read README.md and extract project description.\n */\nexport function readReadmeDescription(repoDir: string): string | null {\n const readmePath = join(repoDir, 'README.md');\n if (!existsSync(readmePath)) return null;\n try {\n const content = readFileSync(readmePath, 'utf-8');\n const lines = content.split('\\n').map(l => l.trim()).filter(Boolean);\n // Skip patterns: badges, images, table of contents, HTML tags\n const skipPatterns = [/^\\[!/, /^<img/, /^<a /, /^#+\\s+Table of/i, /^---$/];\n let foundTitle = false;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.startsWith('#') && !line.startsWith('##')) {\n foundTitle = true;\n continue;\n }\n if (!foundTitle) continue;\n // Skip empty lines, badges, images, TOC, horizontal rules\n if (skipPatterns.some(p => p.test(line))) continue;\n if (line.startsWith('#')) return null; // hit next heading — no description found\n if (line.startsWith('```')) return null; // code block\n if (line.startsWith('|')) return null; // table\n if (line.length > 15) return line;\n }\n return null;\n } catch {\n return null;\n }\n}\n","/**\n * Project Graph Pipeline — full orchestrator.\n *\n * Ported from knowledge-tree/generate_roadmap_v3.py PipelineOrchestrator\n * Coordinates: AST analysis → keyword extraction → LLM graph generation →\n * verification → concept escalation → concept resolution → assembly.\n */\n\nimport type { ProjectGraph, Feature } from '../schemas/projectGraphSchema';\nimport { parseSwiftFile, mergeSwiftResults, type SwiftParseResult } from '../parsers/swift';\nimport { parseTsFile, mergeTsResults, type TsParseResult } from '../parsers/typescript';\nimport { parsePythonFile, mergePythonResults, type PythonParseResult } from '../parsers/python';\nimport { parseCppFile, mergeCppResults, type CppParseResult } from '../parsers/cpp';\nimport { extractKeywords, type Keyword, type SourceContext } from '../extractors/keywordExtractor';\nimport { extractScaffold } from '../graph/scaffoldExtractor';\nimport { extractProjectOverview } from '../graph/overviewExtractor';\nimport { extractFeatureSteps, extractFeatureStepsBatched } from '../graph/stepExtractor';\nimport { verifyProjectGraph, type Hallucination } from '../graph/graphVerifier';\nimport { escalateAndMapConcepts, type ConceptMapping } from '../graph/conceptEscalator';\nimport { resolveConcepts, type ResolveConceptsResult } from '../concepts/conceptResolver';\nimport { assembleRoadmap, type AssembledRoadmap } from '../assembly/roadmapAssembler';\nimport { selectFilesWithLlm } from '../extractors/fileSelector';\nimport { collectSourceFiles, collectSpecificFileContents, detectPrimaryLanguage, readReadmeDescription } from '../utils/fileUtils';\nimport { relative } from 'node:path';\nimport { createLlmClient, type LlmClientConfig } from '../utils/llmClient';\n\nexport interface PipelineOptions {\n repoDir: string;\n goal: string;\n techStack: string;\n llmConfig?: LlmClientConfig;\n embeddings?: Record<string, { embedding?: number[]; name?: string; description?: string; keywords?: string }>;\n onProgress?: (step: string, message: string) => void;\n}\n\nexport interface PipelineResult {\n projectGraph: ProjectGraph;\n resolvedConcepts: ResolveConceptsResult;\n roadmap: AssembledRoadmap;\n hallucinations: Hallucination[];\n keywords: Keyword[];\n featureConcepts: Map<string, ConceptMapping[]>;\n}\n\n/**\n * Run the full project graph generation pipeline.\n */\nexport async function runProjectGraphPipeline(\n options: PipelineOptions,\n): Promise<PipelineResult> {\n const { repoDir, goal, techStack, llmConfig, embeddings, onProgress } = options;\n\n const log = (step: string, msg: string) => {\n console.log(`[${step}] ${msg}`);\n onProgress?.(step, msg);\n };\n\n // ─── STEP 1A: File Tree Scan (names only — no content reading) ─────────\n log('STEP_1', 'Scanning file tree (names only)...');\n\n const allFilePaths = collectSourceFiles(repoDir);\n const allRelPaths = allFilePaths.map(fp => relative(repoDir, fp));\n log('STEP_1', `Found ${allRelPaths.length} source files in repository`);\n\n // ─── STEP 1B: LLM File Selection (sends tiny file tree to LLM) ────────\n log('STEP_1', 'Asking LLM to select relevant files from file tree...');\n\n const { selected: selectedPaths, reasoning } = await selectFilesWithLlm(\n allRelPaths, goal, techStack, llmConfig,\n );\n log('STEP_1', `LLM selected ${selectedPaths.length}/${allRelPaths.length} files: ${reasoning.slice(0, 100)}`);\n\n // ─── STEP 1C: Read content only for LLM-selected files ─────────────────\n log('STEP_1', 'Reading content for selected files...');\n\n const fileContentsMap = collectSpecificFileContents(repoDir, selectedPaths);\n const filePaths = selectedPaths;\n const primaryLang = detectPrimaryLanguage(filePaths);\n log('STEP_1', `Primary language: ${primaryLang}, ${filePaths.length} files loaded (${fileContentsMap.size} with content)`);\n\n // Parse source files\n log('STEP_1', 'Parsing source files with AST-level analysis...');\n\n const allParseResults: SourceContext[] = [];\n for (const [relPath, content] of fileContentsMap) {\n const fullPath = relPath;\n if (fullPath.endsWith('.swift')) {\n allParseResults.push(parseSwiftFile(fullPath, content));\n } else if (fullPath.endsWith('.ts') || fullPath.endsWith('.tsx') || fullPath.endsWith('.js') || fullPath.endsWith('.jsx')) {\n allParseResults.push(parseTsFile(fullPath, content));\n } else if (fullPath.endsWith('.py')) {\n allParseResults.push(parsePythonFile(fullPath, content));\n } else if (fullPath.endsWith('.ino') || fullPath.endsWith('.cpp') || fullPath.endsWith('.c') || fullPath.endsWith('.h')) {\n allParseResults.push(parseCppFile(fullPath, content));\n }\n }\n\n // Merge parse results by language\n let mergedContext: SourceContext;\n if (primaryLang === 'Swift') {\n mergedContext = mergeSwiftResults(allParseResults.filter((r): r is SwiftParseResult => 'property_wrappers' in r));\n } else if (primaryLang === 'TypeScript' || primaryLang === 'JavaScript') {\n mergedContext = mergeTsResults(allParseResults.filter((r): r is TsParseResult => !('docstrings' in r) && !('property_wrappers' in r) && !('frameworks_used' in r)));\n } else if (primaryLang === 'Python') {\n mergedContext = mergePythonResults(allParseResults.filter((r): r is PythonParseResult => 'docstrings' in r));\n } else {\n mergedContext = mergeCppResults(allParseResults.filter((r): r is CppParseResult => 'error_handling' in r && !('docstrings' in r) && !('property_wrappers' in r)));\n }\n\n // ─── STEP 2: Keyword Extraction ──────────────────────────────────────────\n log('STEP_2', 'Extracting keywords from AST analysis...');\n\n const astKeywords = extractKeywords(mergedContext);\n log('STEP_2', `Extracted ${astKeywords.length} keywords`);\n\n // ─── STEP 3: Build SDK API Index (simplified — use AST keywords as proxy) ──\n log('STEP_3', 'Building SDK API index...');\n\n const sdkApiIndex = {\n sdk_apis: astKeywords.map(kw => ({\n name: kw.keyword,\n kind: kw.source,\n used_in_demo: true,\n })),\n };\n\n // ─── STEP 4: LLM Project Graph Generation ────────────────────────────────\n log('STEP_4', 'Generating project graph via LLM (C0: Scaffold, C1: Overview, C2: Steps)...');\n\n // C0: Scaffold (F0) — uses file list (names only, not content)\n log('STEP_4_C0', 'Extracting FOUNDATION & SETUP feature (F0)...');\n const scaffoldFeature = await extractScaffold({\n goal,\n techStack,\n fileList: filePaths,\n llmConfig,\n });\n\n // C1: Overview (features meta) — uses already-filtered fileContentsMap\n log('STEP_4_C1', 'Extracting project overview (features meta)...');\n const overview = await extractProjectOverview({\n goal,\n techStack,\n sdkApiIndex,\n fileContentsMap,\n astKeywords,\n llmConfig,\n });\n\n // Build PBL step (Design Thinking)\n const product = overview.product as Record<string, unknown> | undefined;\n const pblStep: Feature['steps'] extends (infer T)[] ? T : never = {\n id: 'F0-S1',\n sequence: 1,\n name: 'Frame the problem & understand user needs (Design Thinking)',\n description: 'BEFORE CODING — frame the problem and understand what the user needs',\n files: [],\n api_usage: [],\n keywords: ['Design Thinking', 'User Needs', 'Problem Statement', 'User Journey', 'PBL'],\n completion_level: 'base',\n platform: 'app',\n intent: 'Understand user needs and frame problem before writing code',\n outcome: { user_visible: 'Defined problem statement', technical: 'Problem frame context' },\n acceptance: ['Problem statement is clear', 'Primary users identified'],\n requirement_ids: [],\n concept_codes: [],\n effort: { estimated_minutes: 15, complexity: 'low' },\n };\n\n // Merge scaffold F0 with PBL step\n let featuresFull: Feature[] = [];\n if (scaffoldFeature) {\n const scaffoldSteps = [pblStep, ...(scaffoldFeature.steps || [])].map((s, i) => ({\n ...s,\n id: `F0-S${i + 1}`,\n sequence: i + 1,\n }));\n featuresFull.push({\n ...scaffoldFeature,\n id: 'F0',\n name: 'FOUNDATION & SETUP',\n steps: scaffoldSteps,\n });\n } else {\n featuresFull.push({\n id: 'F0',\n name: 'FOUNDATION & SETUP',\n description: 'Frame the problem, get familiar with the tools',\n steps: [pblStep],\n } as Feature);\n }\n\n // Add features from overview\n const overviewFeatures = (product?.features || []) as Feature[];\n featuresFull = [...featuresFull, ...overviewFeatures];\n\n // C2: Extract steps per feature\n log('STEP_4_C2', `Extracting steps for ${overviewFeatures.length} features...`);\n\n const nonF0Features = overviewFeatures.filter(f => f.id !== 'F0');\n if (nonF0Features.length > 0) {\n try {\n const batchedSteps = await extractFeatureStepsBatched(\n goal, techStack, sdkApiIndex, fileContentsMap, nonF0Features, llmConfig,\n );\n for (const feature of nonF0Features) {\n const steps = batchedSteps.get(feature.id || '');\n if (steps) feature.steps = steps;\n }\n } catch (err) {\n log('STEP_4_C2', `Batch extraction failed (${err}), falling back to per-feature...`);\n for (const feature of nonF0Features) {\n try {\n const steps = await extractFeatureSteps({\n goal, techStack, sdkApiIndex, fileContentsMap, feature, llmConfig,\n });\n feature.steps = steps;\n } catch (e) {\n log('STEP_4_C2', `Failed for ${feature.id}: ${e}`);\n }\n }\n }\n }\n\n // Build project graph\n const projectGraph: ProjectGraph = {\n schema_version: 3,\n project: {\n id: (overview.project as Record<string, unknown>)?.name?.toString().toLowerCase().replace(/\\s+/g, '-') || 'project',\n name: (overview.project as Record<string, unknown>)?.name?.toString() || 'Project',\n purpose: goal,\n version: '0.1.0',\n project_type: 'app',\n platform: ((overview.project as Record<string, unknown>)?.platforms as string[]) || ['ios'],\n tech_stack: techStack.split(',').reduce((acc, t) => {\n const key = t.trim().toLowerCase();\n if (key) acc[key] = [t.trim()];\n return acc;\n }, {} as Record<string, string[]>),\n architecture: (overview.architecture as Record<string, unknown>)?.layers as string[] || [],\n },\n product: {\n goals: (product?.goals as Array<{ id: string; description: string }>) || [],\n users: (product?.users as Array<{ id: string; goals: string[] }>) || [],\n journeys: (product?.user_journeys as Array<{ id: string; name: string; requirement_ids: string[]; steps: string[]; feature_ids: string[] }>) || [],\n requirements: [],\n development_stages: (product?.development_stages as Array<{ stage: string; product_state: string; need: string[]; learn: string[]; validation: string; cross_feature_value: string; temporary_approach: string }>) || [],\n purpose: String(product?.purpose || ''),\n problem_statement: String(product?.problem_statement || ''),\n primary_users: (product?.primary_users as string[]) || [],\n },\n features: featuresFull,\n capabilities: [],\n implementation: {\n tasks: [],\n },\n missing_gaps: [],\n tech_debt: [],\n };\n\n // ─── STEP 5: Verification ────────────────────────────────────────────────\n log('STEP_5', 'Verifying project graph against source code...');\n\n const { graph: verifiedGraph, hallucinations } = verifyProjectGraph(projectGraph, {\n repoDir,\n sdkApiIndex,\n fileContentsMap,\n });\n log('STEP_5', `Verification complete: ${hallucinations.length} hallucinations found`);\n\n // ─── STEP 6: Concept Escalation ──────────────────────────────────────────\n log('STEP_6', 'Escalating keywords to neutral concepts...');\n\n const featureConcepts = await escalateAndMapConcepts({\n projectGraph: verifiedGraph,\n fileContentsMap,\n llmConfig,\n });\n log('STEP_6', `Concept mapping complete: ${featureConcepts.size} features mapped`);\n\n // Propagate concept_codes back into verified graph steps\n for (const feature of verifiedGraph.features || []) {\n const fid = feature.id || '';\n const fConcepts = featureConcepts.get(fid) || [];\n for (const step of feature.steps || []) {\n const stepConcepts = fConcepts\n .filter(cm => {\n // Match concept to step: check if step contains the keyword\n const stepKws = [...(step.keywords || []), ...(step.api_usage || [])];\n return stepKws.some(k => k === cm.keyword);\n })\n .map(cm => cm.concept_code);\n // Merge with any existing concept_codes from LLM\n const existing = step.concept_codes || [];\n step.concept_codes = [...new Set([...existing, ...stepConcepts])];\n }\n }\n\n // ─── STEP 7: Concept Resolution ──────────────────────────────────────────\n log('STEP_7', 'Resolving keywords to Master Tree concepts...');\n\n // Collect LLM-generated keywords from verified graph (not just AST)\n const llmKeywords: Keyword[] = [];\n const seenKw = new Set<string>();\n for (const feature of verifiedGraph.features || []) {\n for (const step of feature.steps || []) {\n for (const kw of [...(step.keywords || []), ...(step.api_usage || [])]) {\n if (!seenKw.has(kw.toLowerCase())) {\n seenKw.add(kw.toLowerCase());\n llmKeywords.push({ keyword: kw, source: 'llm_step', platform: 'app', weight: 1.0, context: 'LLM-generated step keyword' });\n }\n }\n }\n }\n // Merge with AST keywords (AST takes precedence for source/weight)\n const astKwMap = new Map(astKeywords.map(k => [k.keyword.toLowerCase(), k]));\n const mergedKeywords: Keyword[] = [];\n const mergedSeen = new Set<string>();\n for (const kw of [...astKeywords, ...llmKeywords]) {\n const key = kw.keyword.toLowerCase();\n if (!mergedSeen.has(key)) {\n mergedSeen.add(key);\n mergedKeywords.push(astKwMap.get(key) || kw);\n }\n }\n\n // Build depth overrides from concept escalation\n const depthOverrides = new Map<string, 'ulo' | 'cio' | 'sio'>();\n for (const mappings of featureConcepts.values()) {\n for (const cm of mappings) {\n if (!depthOverrides.has(cm.keyword)) {\n depthOverrides.set(cm.keyword, cm.depth);\n }\n }\n }\n\n const resolvedConcepts = await resolveConcepts({\n keywords: mergedKeywords,\n goal,\n embeddings,\n depthOverrides,\n llmConfig,\n });\n log('STEP_7', `Resolved: ${resolvedConcepts.summary.resolved_count}, Proposed: ${resolvedConcepts.summary.proposed_count} (${resolvedConcepts.summary.search_mode})`);\n\n // ─── STEP 8: Assembly ────────────────────────────────────────────────────\n log('STEP_8', 'Assembling roadmap with keyword tracking...');\n\n const roadmap = assembleRoadmap({\n projectGraph: verifiedGraph,\n featureConcepts,\n sessionMinutes: 90,\n overheadFactor: 1.15,\n maxMilestoneMinutes: 120,\n });\n log('STEP_8', `Roadmap assembled: ${roadmap.phases.length} phases, ${roadmap.phases.reduce((s, p) => s + p.milestones.length, 0)} milestones`);\n\n return {\n projectGraph: verifiedGraph,\n resolvedConcepts,\n roadmap,\n hallucinations,\n keywords: astKeywords,\n featureConcepts,\n };\n}\n","/**\n * LO code + statement standard — calibrated against the production\n * learning_objectives table (6,693 live rows) and the knowledge-tree\n * Naming Conventions v2.2 (Appendix C of adaptive-learning-platform.md).\n *\n * Codes (deterministic, never LLM-generated):\n * concept CONCEPT_CODE UPPER_SNAKE_CASE, technology-neutral\n * ULO ULO-[CONCEPT]-NN one primary ULO per concept (NN = 01)\n * CIO CIO-[CONCEPT]-NN-[ACTION] parent = ULO, ACTION = SNAKE verb phrase\n * SIO SIO-[TECH]-[CONCEPT]-NN only tier carrying a tech tag (PY, SW, TS...)\n *\n * Statements: every LO description uses the normalized clause\n * \"The learner will be able to ...\" (production Supabase style).\n */\n\n// ─── Technology tag (SIO tier only) ─────────────────────────────────────────\n\nconst TECH_TAG_MAP: Record<string, string> = {\n python: \"PY\", swift: \"SW\", typescript: \"TS\", javascript: \"JV\", java: \"JAVA\",\n kotlin: \"KT\", go: \"GO\", rust: \"RUST\", csharp: \"CS\", cpp: \"CPP\", dart: \"DT\",\n php: \"PHP\", ruby: \"RB\", sql: \"SQL\", html: \"HTML\", css: \"CSS\",\n};\n\n/** Map a tech stack string to the production SIO tech tag (PY, SW, TS...). */\nexport function techTagFor(techStack: string): string {\n const primary = (techStack || \"\").trim().toLowerCase();\n for (const [key, tag] of Object.entries(TECH_TAG_MAP)) {\n if (primary.includes(key)) return tag;\n }\n const first = primary.split(/[\\s,+/]+/)[0] ?? \"\";\n if (!/^[a-z]/.test(first)) return \"GEN\";\n return first.length <= 4 ? first.toUpperCase() : first.slice(0, 3).toUpperCase();\n}\n\n// ─── Concept code (UPPER_SNAKE_CASE, neutral) ───────────────────────────────\n\nconst SMALL_WORDS = new Set([\"and\", \"or\", \"the\", \"of\", \"for\", \"in\", \"on\", \"a\", \"an\", \"vs\"]);\n\n/** Derive a neutral UPPER_SNAKE_CASE concept code from a human concept name. */\nexport function conceptCodeFromName(name: string): string {\n const words = name\n .replace(/[^A-Za-z0-9]+/g, \" \")\n .trim()\n .split(/\\s+/)\n .filter((w) => w.length > 0 && !SMALL_WORDS.has(w.toLowerCase()));\n const base = words.join(\"_\").toUpperCase().replace(/^_+|_+$/g, \"\").replace(/_{2,}/g, \"_\");\n const trimmed = (base || \"CONCEPT\").slice(0, 60).replace(/_+$/g, \"\");\n return trimmed;\n}\n\n/**\n * Assign unique concept codes to every concept (first occurrence keeps the\n * plain code, later collisions get a _2.._N suffix) — mirrors the DB where\n * concept_codes are unique neutral UPPER_SNAKE keys.\n */\nexport function assignConceptCodes(concepts: Array<{ id: string; name: string }>): Record<string, string> {\n const used = new Map<string, number>();\n const out: Record<string, string> = {};\n for (const c of concepts) {\n const base = conceptCodeFromName(c.name);\n const n = (used.get(base) ?? 0) + 1;\n used.set(base, n);\n out[c.id] = n === 1 ? base : base + \"_\" + n;\n }\n return out;\n}\n\n// ─── LO codes ───────────────────────────────────────────────────────────────\n\nconst pad2 = (n: number): string => String(n).padStart(2, \"0\");\n\nexport function uloCode(conceptCode: string, seq = 1): string {\n return \"ULO-\" + conceptCode + \"-\" + pad2(seq);\n}\n\nconst CIO_STOPWORDS = new Set([\n // clause boilerplate\n \"learner\", \"will\", \"be\", \"able\",\n // generic fillers\n \"a\", \"an\", \"the\", \"of\", \"to\", \"and\", \"or\", \"in\", \"on\", \"for\", \"by\", \"with\",\n \"is\", \"are\", \"that\", \"it\", \"its\", \"their\", \"when\", \"how\", \"as\", \"into\", \"from\",\n]);\n\n/** Extract a short SNAKE_CASE action phrase (2-4 content words) for a CIO code. */\nexport function cioActionSlug(cioText: string): string {\n const body = cioText.startsWith(LEARNER_CLAUSE) ? cioText.slice(LEARNER_CLAUSE.length) : cioText;\n const words = body.replace(/[^A-Za-z0-9]+/g, \" \").trim().split(/\\s+/)\n .map((w) => w.toLowerCase())\n .filter((w) => w.length > 2 && !CIO_STOPWORDS.has(w));\n const seen = new Set<string>();\n const picked: string[] = [];\n for (const w of words) {\n if (!seen.has(w)) { seen.add(w); picked.push(w); }\n if (picked.length === 3) break;\n }\n return (picked.length > 0 ? picked : [\"apply\"]).join(\"_\").toUpperCase();\n}\n\nexport function cioCode(conceptCode: string, uloSeq: number, actionSlug: string): string {\n return \"CIO-\" + conceptCode + \"-\" + pad2(uloSeq) + \"-\" + actionSlug;\n}\n\nexport function sioCode(techTag: string, conceptCode: string, seq: number): string {\n return \"SIO-\" + techTag + \"-\" + conceptCode + \"-\" + pad2(seq);\n}\n\n// ─── Standard statement clause ──────────────────────────────────────────────\n\nexport const LEARNER_CLAUSE = \"The learner will be able to \";\n\n/** Normalize any LO text into the production statement form with the standard clause. */\nexport function standardStatement(text: string): string {\n let body = (text || \"\").trim().replace(/^the learner (will be able to|can)\\s*/i, \"\").replace(/\\s+/g, \" \");\n if (body.length === 0) return \"\";\n // Lowercase a leading word unless it looks like an acronym/proper code (X.Y or ALLCAPS).\n const firstWord = body.split(\" \")[0] ?? \"\";\n const looksAcronym = /^[A-Z0-9_.`]+$/.test(firstWord) && firstWord.length > 1;\n if (!looksAcronym) body = body.charAt(0).toLowerCase() + body.slice(1);\n body = body.replace(/[.\\s]+$/, \"\");\n return LEARNER_CLAUSE + body + \".\";\n}\n\n// ─── Regex validators (calibrated to the live DB patterns) ─────────────────\n\nexport const CONCEPT_CODE_RE = /^[A-Z][A-Z0-9_]*$/;\nexport const ULO_CODE_RE = /^ULO-[A-Z][A-Z0-9_]*-\\d{2}$/;\nexport const CIO_CODE_RE = /^CIO-[A-Z][A-Z0-9_]*-\\d{2}-[A-Z][A-Z0-9_]*$/;\nexport const SIO_CODE_RE = /^SIO-[A-Z0-9]+-[A-Z][A-Z0-9_]*-\\d{2}$/;\n","/**\n * Syllabus Parser — parses structured Markdown, numbered text, or outlines\n * into a structured ParsedSyllabus object with traceable line references.\n */\n\nexport interface SyllabusTopic {\n id: string;\n title: string;\n unitId: string;\n unitTitle: string;\n description: string;\n learningObjectives: string[];\n keywords: string[];\n rawLineStart: number;\n rawLineEnd: number;\n}\n\nexport interface SyllabusUnit {\n id: string;\n title: string;\n order: number;\n topics: SyllabusTopic[];\n}\n\nexport interface ParsedSyllabus {\n subject: {\n title: string;\n domain?: string;\n gradeBand?: [number, number];\n description?: string;\n estimatedHours?: number;\n };\n units: SyllabusUnit[];\n allTopics: SyllabusTopic[];\n extractedKeywords: string[];\n rawText: string;\n}\n\nconst STOP_WORDS = new Set([\n 'and', 'the', 'for', 'with', 'from', 'that', 'this', 'into', 'when', 'while',\n 'using', 'their', 'your', 'each', 'how', 'why', 'what', 'between', 'through',\n 'about', 'trong', 'nhung', 'cac', 'cua', 'cho', 'voi', 'duoc', 'khong', 'theo',\n 'tren', 'duoi', 'va', 'hoac', 'thi', 'la', 'nhu',\n]);\n\n/**\n * Heuristically extracts meaningful terminology keywords from text tokens.\n */\nfunction extractTokens(text: string): string[] {\n const words = text\n .toLowerCase()\n .replace(/[^a-z0-9à-ỹ\\s-]/gi, ' ')\n .split(/\\s+/)\n .filter((w) => w.length >= 3 && !STOP_WORDS.has(w));\n return [...new Set(words)];\n}\n\n/**\n * Detect grade band from raw text patterns like \"Lớp 7 - Lớp 9\", \"Grade Band: 15-18\", \"12 - 15 tuổi\".\n */\nfunction extractGradeBand(text: string): [number, number] | undefined {\n const gbMatch = text.match(/(?:grade\\s*band|độ\\s*tuổi|lớp)\\s*[:=]?\\s*(?:lớp\\s*)?(\\d{1,2})\\s*(?:-|đến|to)\\s*(?:lớp\\s*)?(\\d{1,2})/i);\n if (gbMatch && gbMatch[1] && gbMatch[2]) {\n const min = parseInt(gbMatch[1], 10);\n const max = parseInt(gbMatch[2], 10);\n return [Math.min(min, max), Math.max(min, max)];\n }\n return undefined;\n}\n\n/**\n * Detect domain from text keywords.\n */\nfunction extractDomain(text: string): string | undefined {\n const lower = text.toLowerCase();\n if (lower.includes('computer science') || lower.includes('lập trình') || lower.includes('algorithm') || lower.includes('software')) return 'software';\n if (lower.includes('toán') || lower.includes('geometry') || lower.includes('algebra') || lower.includes('hình học') || lower.includes('mathematics')) return 'math';\n if (lower.includes('vật lý') || lower.includes('hóa học') || lower.includes('sinh học') || lower.includes('physics') || lower.includes('chemistry') || lower.includes('biology') || lower.includes('science')) return 'science';\n if (lower.includes('tiếng') || lower.includes('ngữ văn') || lower.includes('grammar') || lower.includes('language') || lower.includes('writing') || lower.includes('literature')) return 'language';\n return undefined;\n}\n\n/**\n * Main syllabus parser function.\n */\nexport function parseSyllabus(rawText: string): ParsedSyllabus {\n const lines = rawText.split(/\\r?\\n/);\n let subjectTitle = '';\n let subjectDesc = '';\n\n const units: SyllabusUnit[] = [];\n const allTopics: SyllabusTopic[] = [];\n const globalKeywordsSet = new Set<string>();\n\n let currentUnit: SyllabusUnit | null = null;\n let currentTopic: SyllabusTopic | null = null;\n let unitIndex = 0;\n let topicIndex = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!.trim();\n const lineNum = i + 1;\n if (!line) continue;\n\n // 1. Level 1 Heading: Subject Title\n if (line.startsWith('# ') && !subjectTitle) {\n subjectTitle = line.replace(/^#\\s+/, '').trim();\n continue;\n }\n\n // 2. Metadata lines at root\n if (!currentUnit) {\n if (line.toLowerCase().startsWith('môn học:') || line.toLowerCase().startsWith('subject:')) {\n const val = line.split(':')[1]?.trim() || '';\n if (val && !subjectTitle) subjectTitle = val;\n }\n if (line.toLowerCase().startsWith('mô tả:') || line.toLowerCase().startsWith('description:')) {\n subjectDesc = line.split(':')[1]?.trim() || '';\n }\n }\n\n // 3. Level 2 Heading: Unit / Chapter / Module\n const isUnitHeading = /^##\\s+(?:chương|module|unit|phần|chủ đề)\\s*(\\d+|[ivx]+)?[:.-]?\\s*(.*)/i.test(line)\n || /^##\\s+([^#].*)/.test(line);\n\n if (isUnitHeading) {\n if (currentTopic) {\n currentTopic.rawLineEnd = lineNum - 1;\n currentTopic = null;\n }\n unitIndex += 1;\n const titleMatch = line.replace(/^##\\s+/, '').trim();\n currentUnit = {\n id: `U${String(unitIndex).padStart(2, '0')}`,\n title: titleMatch,\n order: unitIndex,\n topics: [],\n };\n units.push(currentUnit);\n continue;\n }\n\n // 4. Topic heading inside Unit: \"- **Bài X: ...**\", \"### Topic ...\", \"1. Bài ...\", or \"- **...**\"\n const isTopicItem = /^(?:-\\s*\\*\\*(?:bài|topic|lesson|chủ đề)\\s*(\\d+(?:\\.\\d+)?|\\w+)?[:.-]?\\s*(.*?)\\*\\*)/i.exec(line)\n || /^###\\s+(?:bài|topic|lesson)?\\s*(\\d+(?:\\.\\d+)?|\\w+)?[:.-]?\\s*(.*)/i.exec(line)\n || /^-\\s+\\*\\*(.*?)\\*\\*/.exec(line)\n || /^(\\d+)\\.\\s+(?:(?:\\*\\*)?(?:bài|topic|lesson)?\\s*(\\d+(?:\\.\\d+)?|\\w+)?[:.-]?\\s*(.*?)(?:\\*\\*)?)$/i.exec(line);\n\n if (isTopicItem) {\n if (currentTopic) {\n currentTopic.rawLineEnd = lineNum - 1;\n }\n if (!currentUnit) {\n unitIndex += 1;\n currentUnit = {\n id: `U${String(unitIndex).padStart(2, '0')}`,\n title: subjectTitle || 'General',\n order: unitIndex,\n topics: [],\n };\n units.push(currentUnit);\n }\n topicIndex += 1;\n const rawName = (isTopicItem[3] || isTopicItem[2] || isTopicItem[1] || `Topic ${topicIndex}`).trim();\n currentTopic = {\n id: `T${String(topicIndex).padStart(2, '0')}`,\n title: rawName,\n unitId: currentUnit.id,\n unitTitle: currentUnit.title,\n description: '',\n learningObjectives: [],\n keywords: [],\n rawLineStart: lineNum,\n rawLineEnd: lineNum,\n };\n currentUnit.topics.push(currentTopic);\n allTopics.push(currentTopic);\n continue;\n }\n\n // 5. Content lines inside Topic\n if (currentTopic) {\n currentTopic.rawLineEnd = lineNum;\n const stripped = line.replace(/^[-*•\\s]+/, '').trim();\n\n // Objectives line\n if (stripped.toLowerCase().startsWith('mục tiêu:') || stripped.toLowerCase().startsWith('objectives:')) {\n const content = stripped.replace(/^(?:mục tiêu|objectives):\\s*/i, '').trim();\n if (content) currentTopic.learningObjectives.push(content);\n continue;\n }\n\n // Keywords line\n if (stripped.toLowerCase().startsWith('từ khóa:') || stripped.toLowerCase().startsWith('keywords:')) {\n const rawKw = stripped.replace(/^(?:từ khóa|keywords):\\s*/i, '').trim();\n const tokens = rawKw.split(/[,;]+/).map((k) => k.trim()).filter(Boolean);\n for (const tok of tokens) {\n currentTopic.keywords.push(tok);\n globalKeywordsSet.add(tok);\n }\n continue;\n }\n\n // General description line\n if (currentTopic.description) {\n currentTopic.description += ' ' + stripped;\n } else {\n currentTopic.description = stripped;\n }\n\n // Harvest tokens\n for (const tok of extractTokens(stripped)) {\n if (tok.length >= 4) globalKeywordsSet.add(tok);\n }\n }\n }\n\n // Close last topic if open\n if (currentTopic) {\n currentTopic.rawLineEnd = lines.length;\n }\n\n // Fallback subject title\n if (!subjectTitle && units.length > 0) {\n subjectTitle = units[0]?.title || 'Untitled Subject';\n }\n\n return {\n subject: {\n title: subjectTitle || 'Untitled Subject',\n domain: extractDomain(rawText),\n gradeBand: extractGradeBand(rawText),\n description: subjectDesc,\n },\n units,\n allTopics,\n extractedKeywords: [...globalKeywordsSet],\n rawText,\n };\n}\n","/**\n * Knowledge Graph Verifier — validates referential integrity, prerequisite DAG\n * acyclicity, and reverse syllabus coverage for concept-driven graphs.\n */\n\nimport type { KnowledgeGraph, Concept } from '../schemas/knowledgeGraphSchema';\nimport type { ParsedSyllabus } from '../parsers/syllabusParser';\n\nexport interface KnowledgeGraphVerificationReport {\n valid: boolean;\n cycles: string[][];\n removedEdges: Array<{ from: string; to: string }>;\n danglingPrerequisites: Array<{ conceptId: string; missingPrereqId: string }>;\n coverageRatio: number;\n totalSyllabusTopics: number;\n coveredSyllabusTopics: number;\n uncoveredTopics: string[];\n warnings: string[];\n}\n\n/**\n * Detect cycles in prerequisite graph using DFS.\n */\nexport function detectPrerequisiteCycles(concepts: Concept[]): string[][] {\n const cycles: string[][] = [];\n const visited = new Set<string>();\n const inStack = new Set<string>();\n const path: string[] = [];\n\n const prereqMap = new Map<string, string[]>();\n for (const c of concepts) {\n prereqMap.set(c.id, c.prerequisites || []);\n }\n\n function dfs(conceptId: string) {\n if (inStack.has(conceptId)) {\n const cycleStart = path.indexOf(conceptId);\n if (cycleStart >= 0) {\n cycles.push([...path.slice(cycleStart), conceptId]);\n }\n return;\n }\n if (visited.has(conceptId)) return;\n\n visited.add(conceptId);\n inStack.add(conceptId);\n path.push(conceptId);\n\n for (const prereq of prereqMap.get(conceptId) || []) {\n dfs(prereq);\n }\n\n path.pop();\n inStack.delete(conceptId);\n }\n\n for (const c of concepts) {\n if (!visited.has(c.id)) {\n dfs(c.id);\n }\n }\n\n return cycles;\n}\n\n/**\n * Break cycles by removing back-edges.\n */\nexport function breakPrerequisiteCycles(\n concepts: Concept[],\n cycles: string[][],\n): { fixed: Concept[]; removed: Array<{ from: string; to: string }> } {\n const removed: Array<{ from: string; to: string }> = [];\n const fixed = concepts.map((c) => ({ ...c, prerequisites: [...(c.prerequisites || [])] }));\n\n for (const cycle of cycles) {\n if (cycle.length >= 2) {\n const breaker = cycle[cycle.length - 2];\n const target = cycle[cycle.length - 1];\n\n for (const concept of fixed) {\n if (concept.id === breaker && target) {\n concept.prerequisites = concept.prerequisites.filter((p) => p !== target);\n removed.push({ from: breaker, to: target });\n }\n }\n }\n }\n\n return { fixed, removed };\n}\n\n/**\n * Audit reverse coverage: verify that every topic in ParsedSyllabus is mapped\n * to at least one concept in KnowledgeGraph.\n */\nexport function auditSyllabusCoverage(\n concepts: Concept[],\n syllabus?: ParsedSyllabus,\n): { coverageRatio: number; totalTopics: number; coveredTopics: number; uncovered: string[] } {\n if (!syllabus || syllabus.allTopics.length === 0) {\n return { coverageRatio: 1.0, totalTopics: 0, coveredTopics: 0, uncovered: [] };\n }\n\n const topics = syllabus.allTopics;\n const coveredSet = new Set<string>();\n\n for (const topic of topics) {\n const topicKeywords = new Set([\n ...topic.title.toLowerCase().split(/\\s+/),\n ...(topic.keywords || []).map((k) => k.toLowerCase()),\n ]);\n\n // Check if any concept references this topic title or shares keywords\n for (const concept of concepts) {\n const cName = concept.name.toLowerCase();\n const cDesc = (concept.description || '').toLowerCase();\n const cKeywords = (concept.keywords || []).map((k) => k.toLowerCase());\n\n // Direct ID match\n if (concept.id.toLowerCase() === topic.id.toLowerCase()) {\n coveredSet.add(topic.id);\n break;\n }\n\n const refs = (concept as any).references || [];\n const hasTopicRef = refs.some(\n (r: any) => r.id === topic.id || (r.title && r.title.toLowerCase() === topic.title.toLowerCase())\n );\n if (hasTopicRef) {\n coveredSet.add(topic.id);\n break;\n }\n\n const conceptKeywords = (concept.keywords || []).map((k) => k.toLowerCase());\n const hasOverlap = conceptKeywords.some((k) => topicKeywords.has(k)) ||\n concept.name.toLowerCase().includes(topic.title.toLowerCase()) ||\n topic.title.toLowerCase().includes(concept.name.toLowerCase());\n\n if (hasOverlap) {\n coveredSet.add(topic.id);\n break;\n }\n }\n }\n\n const totalTopics = topics.length;\n const coveredTopics = coveredSet.size;\n const coverageRatio = totalTopics > 0 ? coveredTopics / totalTopics : 1.0;\n const uncovered = topics.filter((t) => !coveredSet.has(t.id)).map((t) => `${t.id}: ${t.title}`);\n\n return { coverageRatio, totalTopics, coveredTopics, uncovered };\n}\n\n/**\n * Full knowledge graph verifier function.\n */\nexport function verifyKnowledgeGraph(\n kg: KnowledgeGraph,\n syllabusOrOptions?: ParsedSyllabus | { parsedSyllabus?: ParsedSyllabus },\n): { verifiedGraph: KnowledgeGraph; report: KnowledgeGraphVerificationReport } {\n const syllabus = syllabusOrOptions && 'parsedSyllabus' in syllabusOrOptions\n ? syllabusOrOptions.parsedSyllabus\n : (syllabusOrOptions as ParsedSyllabus | undefined);\n\n const warnings: string[] = [];\n let concepts = [...(kg.concepts || [])];\n const conceptIds = new Set(concepts.map((c) => c.id));\n\n // 1. Remove self-loops\n for (const c of concepts) {\n if ((c.prerequisites || []).includes(c.id)) {\n c.prerequisites = (c.prerequisites || []).filter((p) => p !== c.id);\n warnings.push(`Self-loop removed on concept ${c.id}`);\n }\n }\n\n // 2. Dangling prerequisite check\n const danglingPrerequisites: Array<{ conceptId: string; missingPrereqId: string }> = [];\n for (const c of concepts) {\n const validPrereqs: string[] = [];\n for (const p of c.prerequisites || []) {\n if (!conceptIds.has(p)) {\n danglingPrerequisites.push({ conceptId: c.id, missingPrereqId: p });\n warnings.push(`Dangling prerequisite removed: ${c.id} -> ${p}`);\n } else {\n validPrereqs.push(p);\n }\n }\n c.prerequisites = validPrereqs;\n }\n\n // 3. Cycle detection & breaking\n const initialCycles = detectPrerequisiteCycles(concepts);\n let removedEdges: Array<{ from: string; to: string }> = [];\n if (initialCycles.length > 0) {\n const broken = breakPrerequisiteCycles(concepts, initialCycles);\n concepts = broken.fixed;\n removedEdges = broken.removed;\n for (const r of removedEdges) {\n warnings.push(`Cycle broken: removed edge ${r.from} -> ${r.to}`);\n }\n }\n\n // 4. Reverse coverage audit against syllabus\n const coverage = auditSyllabusCoverage(concepts, syllabus);\n if (coverage.coverageRatio < 1.0) {\n warnings.push(`Syllabus coverage ${(coverage.coverageRatio * 100).toFixed(1)}% (${coverage.coveredTopics}/${coverage.totalTopics} topics). Uncovered: ${coverage.uncovered.join(', ')}`);\n }\n\n // 5. Concept layer checks\n for (const c of concepts) {\n if (!c.ulo) warnings.push(`Concept ${c.id} missing ULO (WHAT + WHY)`);\n if (!c.cio) warnings.push(`Concept ${c.id} missing CIO (HOW mechanism)`);\n if (!c.sio || c.sio.length === 0) warnings.push(`Concept ${c.id} missing SIO implementation items`);\n }\n\n const valid = initialCycles.length === 0 && danglingPrerequisites.length === 0 && coverage.coverageRatio >= 0.8;\n\n const verifiedGraph: KnowledgeGraph = {\n ...kg,\n concepts,\n };\n\n const report: KnowledgeGraphVerificationReport = {\n valid,\n cycles: initialCycles,\n removedEdges,\n danglingPrerequisites,\n coverageRatio: coverage.coverageRatio,\n totalSyllabusTopics: coverage.totalTopics,\n coveredSyllabusTopics: coverage.coveredTopics,\n uncoveredTopics: coverage.uncovered,\n warnings,\n };\n\n return { verifiedGraph, report };\n}\n","/**\n * Exemplar bank for hierarchical LO authoring.\n * ULO/CIO exemplars ported from knowledge-tree master_learning_objectives.tsv\n * (approved reference bank). SIO exemplars follow the same style as judged-PASS\n * items from real pipeline runs: keyword-bound, completable, context-specific.\n */\n\nexport const ULO_EXEMPLARS: string[] = [\n // Calibrated against production learning_objectives (UNIVERSAL rows, neutral)\n \"The learner will be able to recall the key concepts, terminology, and characteristics of layers of abstraction.\",\n \"The learner will be able to explain how layers of abstraction hide implementation details while exposing essential behavior.\",\n \"The learner will be able to explain how a program changes state through statements and control flow.\",\n \"The learner will be able to differentiate local from global scope and describe how return values affect data flow.\",\n \"The learner will be able to describe the mechanism of a loop, including its condition, step and stopping rule.\",\n \"The learner will be able to explain why a representation format must balance readability against processing efficiency.\",\n];\n\nexport const CIO_EXEMPLARS: string[] = [\n // Production CONCEPTUAL_IMPL rows: mechanism behind the clause, Marr 2-Language neutral\n \"The learner will be able to develop a conceptual model that explains the internal mechanism by which the representation produces its effect.\",\n \"The learner will be able to compare alternative approaches for the same operation and describe the trade-offs between them.\",\n \"The learner will be able to decompose the choice of representation into decisive criteria such as cost, fidelity and tolerance to change.\",\n \"The learner will be able to describe the sequence of steps by which a process transforms its input into its output, including the stopping condition.\",\n];\n\nexport const SIO_EXEMPLARS: string[] = [\n // Production SPECIFIC_IMPL style: keyword-bound completable tasks, tech-tagged tier\n \"The learner will be able to use argparse.ArgumentParser with add_subparsers to register add, done and list commands in a Python CLI.\",\n \"The learner will be able to define a @dataclass with type hints and a __post_init__ method that raises ValueError on invariant violation.\",\n \"The learner will be able to execute parameterized statements via sqlite3.Connection.execute inside a with conn: transaction to perform CRUD on a tasks table.\",\n \"The learner will be able to write a pytest test that runs the CLI entry point via subprocess.run and asserts the exit code and printed output.\",\n];\n","/**\n * Deterministic ULO/CIO/SIO Contract Audit.\n *\n * Code-level checks that do NOT trust the LLM: they measure whether generated\n * depth layers satisfy the structural part of the authoring contract.\n * Ported context: knowledge-tree lo_quality/proof_tiers philosophy — generate\n * and verify are separate concerns; verification must be deterministic-first.\n */\nimport { LEARNER_CLAUSE, CONCEPT_CODE_RE, ULO_CODE_RE, CIO_CODE_RE, SIO_CODE_RE } from \"./loCodeStandard.js\";\n\n// --- Deterministic ULO/CIO/SIO Contract Audit ---------------------------------\n// Code-level checks that do NOT trust the LLM: they measure whether generated\n// depth layers satisfy the structural part of the authoring contract. The LLM\n// judge (semantic quality) complements these; it never replaces them.\n\n/** Concrete-technology signals: snake/camel identifiers, file extensions, tech acronyms. */\nconst TECH_SIGNAL_RES: RegExp[] = [\n /`[^`]+`/,\n /\\b[a-zA-Z_][A-Za-z0-9_]*\\(\\)/,\n // call-with-arguments: Status(enum.Enum), field(default_factory=list)\n /\\b[A-Za-z_][A-Za-z0-9_]*\\([^)]+\\)/,\n // attribute access glued to a value: enum.Enum, os.path, tasks.json\n /[A-Za-z0-9_)\\]]\\.[A-Za-z_][A-Za-z0-9_]+/,\n /[a-z]+_[a-z]+/,\n /[a-z]+[A-Z][A-Za-z]*/,\n /\\.[a-z]{2,4}\\b/,\n /\\b(?:API|SDK|JSON|XML|YAML|HTTP|SQL|UUID|URL|DOM|CLI|TUI|CSV|UTF|CRUD|DSL)\\b/,\n // Exception/error class names: Exception, ValueError, CustomError\n /\\b[A-Z][a-zA-Z0-9_]*(?:Error|Exception|Warning|Fault)\\b/,\n // class declarations or references: class Status, static methods on types\n /\\bclass\\s+[A-Za-z_][A-Za-z0-9_]*/,\n // inheritance/derivation mentions: inheriting from Exception, subclass of Base\n /\\b(?:inherit(?:ing|s)?|subclass(?:ing)?|deriv(?:ing|ed|es)?)\\s+(?:from|of)\\s+[A-Z][A-Za-z0-9_]*/,\n];\n\n/** Single-letter matches to ignore. */\nconst GENERIC_STOP = new Set([\"e\", \"g\", \"i\"]);\n\nfunction techSignalHits(text: string): string[] {\n const hits: string[] = [];\n for (const re of TECH_SIGNAL_RES) {\n const found = text.match(new RegExp(re.source, \"g\")) ?? [];\n for (const m of found) if (!GENERIC_STOP.has(m.toLowerCase())) hits.push(m);\n }\n return hits;\n}\n\nexport interface DepthLayerAudit {\n conceptId: string;\n uloHasTechSignals: boolean;\n uloTechSignals: string[];\n uloHasImplementationVerbs: boolean;\n sioAllKeywordBound: boolean;\n sioUnboundItems: string[];\n sioConceptKeywordBound: boolean;\n sioOffConceptItems: string[];\n sioAllCompletable: boolean;\n sioNotCompletable: string[];\n concretenessIncreases: boolean;\n clauseOk: boolean;\n codesOk: boolean;\n codeIssues: string[];\n passed: boolean;\n}\n\nexport function auditDepthLayers(\n concepts: Array<{\n id: string; name?: string; ulo?: string; cio?: string; sio?: string[];\n code?: string; ulo_code?: string; cio_code?: string; sio_codes?: string[];\n keywords?: string[];\n }>,\n): DepthLayerAudit[] {\n return concepts.map((c) => {\n const ulo = (c.ulo ?? \"\").trim();\n const cio = (c.cio ?? \"\").trim();\n const sioItems = (c.sio ?? []).map((s) => (s ?? \"\").trim()).filter(Boolean);\n const uloTechSignals = techSignalHits(ulo);\n const uloHasTechSignals = uloTechSignals.length > 0;\n const IMPL_VERBS = /\\b(implement|refactor|debug|serialize)\\b/i;\n const uloHasImplementationVerbs = IMPL_VERBS.test(ulo);\n const registryKeywords = (c.keywords ?? []).map((k) => String(k).toLowerCase()).filter((k) => k.length >= 3);\n // Concept identity tokens fall back to the concept NAME when the registry is\n // narrow: an SIO that names the concept's own subject is on-concept.\n const nameTokens = String(c.name ?? \"\").toLowerCase().split(/[^a-z0-9]+/).filter((w) => w.length >= 4);\n const boundToConcept = (s: string): boolean => {\n const lower = s.toLowerCase();\n return registryKeywords.some((k) => lower.includes(k)) || nameTokens.some((w) => lower.includes(w));\n };\n const sioUnboundItems = sioItems.filter((s) => {\n if (techSignalHits(s).length > 0) return false;\n // Bare tool/technology names (pytest, capsys, python -m build) carry no\n // punctuation signal — the concept keyword registry is the binding source.\n return !boundToConcept(s);\n });\n // Concept-keyword binding: at least one SIO item must reference a keyword\n // FROM THIS CONCEPT's registry (not just any tech signal). Skipped when the\n // caller provides no keyword registry.\n const conceptKeywords = (c.keywords ?? []).map((k) => k.toLowerCase()).filter(Boolean);\n const sioOffConceptItems = conceptKeywords.length > 0\n ? sioItems.filter((s) => !boundToConcept(s))\n : [];\n const COMPLETABLE = /\\b(build|create|implement|write|configure|add|use|apply|display|store|load|save|handle|parse|validate|test|register|compute|generate|print|format|convert|extend|define|execute|run|read|fetch|wrap|log|call|raise|install|import|export|declare|embed|model|represent|override|customize|enforce|mock|assert|query|index|cache|stream|split|join|strip|encode|decode|traverse|measure|evaluate|benchmark|diagnose|demonstrate|verify|organize|structure|choose|select|compare|distinguish|attach|annotate|expose|accept|manage|group|sort|filter|map|reduce|catch|throw|migrate|inspect|trace|parameterize|construct|design|capture)\\b/i;\n const sioNotCompletable = sioItems.filter((s) => !COMPLETABLE.test(s) && !/`[^`]+`/.test(s));\n const density = (text: string): number => {\n if (!text) return 0;\n return (techSignalHits(text).length / Math.max(1, text.split(/\\s+/).length)) * 100;\n };\n const dUlo = density(ulo);\n const dCio = density(cio);\n const dSio = sioItems.length > 0 ? Math.max(...sioItems.map(density)) : 0;\n const concretenessIncreases = dSio > dUlo;\n // Naming Conventions v2.2 + production statement clause checks\n const clauseOk =\n ulo.startsWith(LEARNER_CLAUSE) &&\n cio.startsWith(LEARNER_CLAUSE) &&\n sioItems.every((t) => t.startsWith(LEARNER_CLAUSE));\n const codeIssues: string[] = [];\n const conceptCode = (c as { code?: string }).code;\n if (conceptCode !== undefined && !CONCEPT_CODE_RE.test(conceptCode)) codeIssues.push(\"concept code not UPPER_SNAKE: \" + conceptCode);\n const uloCodeVal = (c as { ulo_code?: string }).ulo_code;\n if (uloCodeVal !== undefined && uloCodeVal !== \"\" && !ULO_CODE_RE.test(uloCodeVal)) codeIssues.push(\"ULO code malformed: \" + uloCodeVal);\n const cioCodeVal = (c as { cio_code?: string }).cio_code;\n if (cioCodeVal !== undefined && cioCodeVal !== \"\" && !CIO_CODE_RE.test(cioCodeVal)) codeIssues.push(\"CIO code malformed: \" + cioCodeVal);\n const sioCodeVals = (c as { sio_codes?: string[] }).sio_codes;\n if (sioCodeVals !== undefined) {\n if (sioCodeVals.length !== sioItems.length) codeIssues.push(\"SIO codes count mismatch\");\n for (const sc of sioCodeVals) if (!SIO_CODE_RE.test(sc)) codeIssues.push(\"SIO code malformed: \" + sc);\n }\n const codesOk = codeIssues.length === 0;\n const passed =\n !uloHasTechSignals &&\n !uloHasImplementationVerbs &&\n sioUnboundItems.length === 0 &&\n sioOffConceptItems.length === 0 &&\n sioNotCompletable.length === 0 &&\n concretenessIncreases &&\n clauseOk &&\n codesOk;\n return {\n conceptId: c.id,\n uloHasTechSignals,\n uloTechSignals,\n uloHasImplementationVerbs,\n sioAllKeywordBound: sioUnboundItems.length === 0,\n sioUnboundItems,\n sioConceptKeywordBound: sioOffConceptItems.length === 0,\n sioOffConceptItems,\n sioAllCompletable: sioNotCompletable.length === 0,\n sioNotCompletable,\n concretenessIncreases,\n clauseOk,\n codesOk,\n codeIssues,\n passed,\n };\n });\n}","/**\n * Hierarchical LO authoring — ported from knowledge-tree\n * (.agents/skills/learning-objective-generator/llm_generate_hierarchical_lo.py).\n *\n * Original architecture (3 independent phases, each gated before the next):\n * Phase A: ULOs from concepts — core competency (WHAT + WHY), technology-\n * agnostic, Cognitive Ceiling + Pragmatic Verb Mapping.\n * Phase B: CIOs from approved ULOs — mechanism (HOW), Marr 2-Language Test.\n * Phase C: SIOs from approved CIOs — keyword-bound implementation tasks.\n *\n * Depth policy (user-approved contract, differs from original Bloom ceiling):\n * - ULO/CIO bind to the CONCEPT nature; ULO typically Remember/Understand.\n * - SIO binds to KEYWORDS; Apply/Analyze/Create are assessed INDIRECTLY\n * through completing SIO in concrete context (no fixed Bloom ceiling).\n *\n * Deterministic audit (depthAudit.ts) gates every phase; a failing phase\n * triggers one targeted repair round, then hard-fails (no silent fallback).\n */\nimport { LEARNER_CLAUSE, standardStatement } from \"./loCodeStandard.js\";\nimport { ULO_EXEMPLARS, CIO_EXEMPLARS, SIO_EXEMPLARS } from './loExemplars';\nimport { auditDepthLayers, type DepthLayerAudit } from './depthAudit';\nimport { parseJsonFromLlm, type LlmClient } from '../utils/llmClient';\n\nexport interface HierarchicalLoConceptInput {\n keywords?: string[];\n id: string;\n name: string;\n description?: string;\n}\n\nexport interface HierarchicalLoResult {\n uloByConcept: Record<string, string>;\n cioByConcept: Record<string, string>;\n sioByConcept: Record<string, string[]>;\n audits: DepthLayerAudit[];\n warnings: string[];\n}\n\nfunction excerpt(text: string | undefined, max: number): string {\n const t = (text || \"\").trim();\n return t.length > max ? t.slice(0, max) + \"...\" : t;\n}\n\nasync function chatJson(\n client: LlmClient,\n system: string,\n user: string,\n): Promise<Record<string, unknown>> {\n const r = await client.chat(\n [{ role: \"system\", content: system }, { role: \"user\", content: user }],\n { temperature: 0.1, maxTokens: parseInt(process.env.KG_MAX_TOKENS || \"65536\", 10) },\n );\n return parseJsonFromLlm(r.content) as Record<string, unknown>;\n}\n\n// Batch size for per-phase LLM calls: large single batches risk output truncation\n// (reasoning tokens count against max_tokens) — 6 concepts per call keeps each\n// response comfortably inside budget.\nconst LO_BATCH_SIZE = 6;\nfunction chunkConcepts<T>(items: T[], size: number): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < items.length; i += size) out.push(items.slice(i, i + size));\n return out;\n}\n\nconst JSON_ONLY = \"Return EXACTLY JSON. No markdown, no explanations.\";\n\nexport async function authorDepthLayersHierarchically(\n client: LlmClient,\n concepts: Array<HierarchicalLoConceptInput>,\n techStack: string,\n warnings: string[],\n): Promise<HierarchicalLoResult> {\n const uloByConcept: Record<string, string> = {};\n const cioByConcept: Record<string, string> = {};\n const sioByConcept: Record<string, string[]> = {};\n\n const conceptList = concepts\n .map((c) => \"- \" + c.id + \": \" + c.name + (c.description ? \" — \" + excerpt(c.description, 160) : \"\"))\n .join(\"\\n\");\n\n // ── Phase A: ULO (WHAT + WHY, concept-bound, technology-agnostic) ──\n const uloSystem = [\n \"You are a Curriculum Design Expert writing Universal Learning Objectives (ULO).\",\n \"\",\n \"ULO = Computational Tier: the CORE COMPETENCY — WHAT the concept is and WHY it exists —\",\n \"completely independent of any technology, language, framework, library, file format or tool.\",\n \"\",\n \"Rules:\",\n \"1. NEVER mention a concrete technology, API, library, file name or syntax in a ULO.\",\n \"2. Bind the ULO to the concept intrinsic nature: the problem it solves in principle.\",\n \"3. Typical assessment level: Remember or Understand. Use pragmatic, measurable verbs\",\n \" (Explain, Differentiate, Identify, Describe) instead of Know/Understand/Summarize.\",\n \"4. Cognitive Ceiling: do NOT force Analyze/Evaluate/Create ULOs — if the concept is\",\n \" foundational, its core competency is low-level. Higher levels are exercised later\",\n \" INDIRECTLY through implementation work, not in the ULO itself.\",\n \"5. One ULO per concept; 1-2 sentences covering WHAT + WHY.\",\n \"6. Statement form (mandatory): every ULO MUST read 'The learner will be able to ...' —\",\n \" a lowercase actionable verb follows the clause (explain ..., differentiate ...).\",\n \" Do not prefix any other phrasing.\",\n \"\",\n \"Approved style exemplars (production bank):\",\n ULO_EXEMPLARS.map((e) => \"- \" + e).join(\"\\n\"),\n \"\",\n JSON_ONLY,\n ].join(\"\\n\");\n const uloUser = [\n \"Concepts:\",\n conceptList,\n\n \"\",\n \"Return JSON:\",\n '{\"ulos\":[{\"concept_id\":\"C1\",\"ulo\":\"...\"}]}',\n ].join(\"\\n\");\n for (const batch of chunkConcepts(concepts, LO_BATCH_SIZE)) {\n const batchList = batch\n .map((c) => \"- \" + c.id + \" (\" + c.name + \")\" + (c.description ? \": \" + excerpt(c.description, 160) : \"\"))\n .join(\"\\n\");\n const batchUser = \"Concepts:\\n\" + batchList + \"\\n\\nReturn JSON:\\n\" + '{\"ulos\":[{\"concept_id\":\"C1\",\"ulo\":\"...\"}]}';\n const uloRes = await chatJson(client, uloSystem, batchUser);\n for (const u of (uloRes.ulos ?? []) as Array<{ concept_id?: string; ulo?: string }>) {\n if (u.concept_id && u.ulo) uloByConcept[u.concept_id] = standardStatement(u.ulo);\n }\n }\n for (const c of concepts) {\n if (!uloByConcept[c.id]) {\n warnings.push(\"Phase A: no ULO generated for \" + c.id + \" — kept empty (audit will fail)\");\n uloByConcept[c.id] = \"\";\n }\n }\n\n // ── Phase B: CIO (HOW mechanism, concept-bound, Marr 2-Language spirit) ──\n const uloContext = concepts\n .map((c) => \"- \" + c.id + \" (\" + c.name + \"): \" + uloByConcept[c.id])\n .join(\"\\n\");\n const cioSystem = [\n \"You are a Curriculum Design Expert writing Concept-level Instructional Objectives (CIO).\",\n \"\",\n \"CIO = Algorithmic Tier: the MECHANISM — HOW the concept works, step by step, at a\",\n \"procedural level. CIOs are derived from approved ULOs.\",\n \"\",\n \"Rules:\",\n \"1. Still technology-agnostic: describe the neutral pattern/approach WITHOUT concrete\",\n \" API names, libraries, file formats or syntax.\",\n \"2. Marr 2-Language Test: the CIO must read as true and implementable regardless of\",\n \" whether the learner uses Python, Swift, JavaScript or any other language. If it\",\n \" only makes sense in one language, rewrite it more neutrally.\",\n \"3. More concrete than the ULO: reference stages, conditions, ordering or trade-offs\",\n \" of the underlying process.\",\n \"4. One CIO per concept; 1-3 sentences describing the mechanism.\",\n \"5. Statement form (mandatory): every CIO MUST read 'The learner will be able to ...' —\",\n \" the mechanism is described after the clause.\",\n \"\",\n \"Approved style exemplars (production bank):\",\n CIO_EXEMPLARS.map((e) => \"- \" + e).join(\"\\n\"),\n \"\",\n JSON_ONLY,\n ].join(\"\\n\");\n const cioUser = [\n \"Approved ULOs:\",\n uloContext,\n \"\",\n \"Return JSON:\",\n '{\"cios\":[{\"concept_id\":\"C1\",\"cio\":\"...\"}]}',\n ].join(\"\\n\");\n for (const batch of chunkConcepts(concepts, LO_BATCH_SIZE)) {\n const batchIds = new Set(batch.map((c) => c.id));\n const batchUloContext = batch\n .map((c) => \"- \" + c.id + \" (\" + c.name + \"): \" + (uloByConcept[c.id] || \"(missing)\"))\n .join(\"\\n\");\n const batchCioUser = \"Approved ULOs:\\n\" + batchUloContext + \"\\n\\nReturn JSON:\\n\" + '{\"cios\":[{\"concept_id\":\"C1\",\"cio\":\"...\"}]}';\n const cioRes = await chatJson(client, cioSystem, batchCioUser);\n for (const x of (cioRes.cios ?? []) as Array<{ concept_id?: string; cio?: string }>) {\n if (x.concept_id && x.cio) cioByConcept[x.concept_id] = standardStatement(x.cio);\n }\n }\n for (const c of concepts) {\n if (!cioByConcept[c.id]) {\n warnings.push(\"Phase B: no CIO generated for \" + c.id + \" — kept empty (audit will fail)\");\n cioByConcept[c.id] = \"\";\n }\n }\n\n // ── Phase C: SIO (keyword-bound implementation tasks) ──\n const cioContext = concepts\n .map((c) => \"- \" + c.id + \" (\" + c.name + \"): CIO=\" + cioByConcept[c.id] + \" | ULO=\" + uloByConcept[c.id])\n .join(\"\\n\");\n const sioSystem = [\n \"You are a Curriculum Design Expert writing Specific Instructional Objectives (SIO).\",\n \"\",\n \"SIO = Implementation Tier: completable, context-specific implementation tasks derived\",\n \"from approved CIOs, bound to the TARGET technology of the course.\",\n \"\",\n \"Rules:\",\n \"1. EVERY SIO item MUST name concrete keywords/technologies: a real API, function,\",\n \" decorator, module, class, file or command of the target technology.\",\n \"2. Each item is a completable task: an actionable verb + the concrete construct + the\",\n \" context where it is used. Application/Analysis/Creation skills are assessed\",\n \" INDIRECTLY through completing these tasks — there is no fixed Bloom ceiling.\",\n \" MACHINE CHECK: every item MUST contain at least one ACTION VERB from this whitelist\",\n \" (build, create, implement, write, configure, add, use, apply, display, store, load,\",\n \" save, handle, parse, validate, test, register, compute, generate, print, format,\",\n \" convert, extend, define, execute, run, read, fetch, wrap, log, call, raise, install,\",\n \" import, export, declare, embed, model, represent, override, customize, enforce, mock,\",\n \" assert, query, index, cache, stream, split, join, strip, encode, decode, traverse,\",\n \" measure, evaluate, benchmark, diagnose, demonstrate, verify, organize, structure,\",\n \" choose, select, compare, distinguish, attach, annotate, expose, accept, manage, group,\",\n \" sort, filter, map, reduce, catch, throw, migrate, inspect, trace, parameterize,\",\n \" construct, design, capture) — OR wrap the concrete construct in backticks.\",\n \" Items with abstract verbs (understand, learn, know, grasp, appreciate, explore) and\",\n \" no backtick construct FAIL the audit. Prefer starting the task phrase with the verb.\",\n \"3. 2-3 items per concept, each referencing a DIFFERENT concrete construct.\",\n \"4. Statement form (mandatory): every SIO MUST read 'The learner will be able to ...' —\",\n \" the concrete task follows the clause.\",\n \"\",\n \"Approved style exemplars (production bank):\",\n SIO_EXEMPLARS.map((e) => \"- \" + e).join(\"\\n\"),\n \"\",\n JSON_ONLY,\n ].join(\"\\n\");\n const kwContext = concepts\n .map((c) => \"- \" + c.id + \" (\" + c.name + \"): \" + ((c.keywords ?? []).slice(0, 10).join(\", \") || \"(none listed — use concrete constructs of \" + techStack + \")\"))\n .join(\"\\n\");\n for (const batch of chunkConcepts(concepts, LO_BATCH_SIZE)) {\n const batchKw = batch\n .map((c) => \"- \" + c.id + \" (\" + c.name + \"): \" + ((c.keywords ?? []).slice(0, 10).join(\", \") || \"(none listed — use concrete constructs of \" + techStack + \")\"))\n .join(\"\\n\");\n const batchCioCtx = batch\n .map((c) => \"- \" + c.id + \" (\" + c.name + \"): CIO=\" + (cioByConcept[c.id] || \"(missing)\") + \" | ULO=\" + (uloByConcept[c.id] || \"(missing)\"))\n .join(\"\\n\");\n const batchSioUser = [\n \"Target technology: \" + techStack,\n \"\",\n \"Concept keywords (each SIO item MUST contain at least one of its concept's keywords):\",\n batchKw,\n \"\",\n \"Approved CIOs and ULOs:\",\n batchCioCtx,\n \"\",\n \"Return JSON:\",\n '{\"sios\":[{\"concept_id\":\"C1\",\"sio\":[\"...\",\"...\"]}]}',\n ].join(\"\\n\");\n const sioRes = await chatJson(client, sioSystem, batchSioUser);\n for (const x of (sioRes.sios ?? []) as Array<{ concept_id?: string; sio?: string[] }>) {\n if (x.concept_id && Array.isArray(x.sio)) sioByConcept[x.concept_id] = x.sio.map((item) => standardStatement(String(item)));\n }\n }\n for (const c of concepts) {\n if (!sioByConcept[c.id] || sioByConcept[c.id].length === 0) {\n warnings.push(\"Phase C: no SIO generated for \" + c.id + \" — kept empty (audit will fail)\");\n sioByConcept[c.id] = [];\n }\n }\n\n // ── Deterministic audit + one targeted repair round (fail-closed) ──\n const conceptIds = concepts.map((c) => c.id);\n const auditOnce = (): DepthLayerAudit[] =>\n auditDepthLayers(concepts.map((c) => ({\n id: c.id,\n name: c.name,\n keywords: c.keywords ?? [],\n ulo: uloByConcept[c.id],\n cio: cioByConcept[c.id],\n sio: sioByConcept[c.id],\n })));\n let audits = auditOnce();\n const repairRound = async (round: number): Promise<boolean> => {\n const failingNow = audits.filter((a) => !a.passed);\n if (failingNow.length === 0) return false;\n if (round > 1) warnings.push(\"Depth audit repair round \" + round + \": \" + failingNow.length + \" concept(s) still failing\");\n const failing = failingNow;\n {\n warnings.push(\"Depth audit: \" + failing.length + \"/\" + concepts.length + \" concepts failed first audit — targeted repair\");\n const repairTargets = failing.map((a) => {\n const c = concepts.find((x) => x.id === a.conceptId);\n const issues: string[] = [];\n if (a.uloHasTechSignals) issues.push(\"ULO names concrete technology (remove: \" + a.uloTechSignals.join(\", \") + \")\");\n if (a.uloHasImplementationVerbs) issues.push(\"ULO reads as an implementation task (rewrite as WHAT+WHY competency)\");\n for (const item of a.sioUnboundItems) issues.push(\"SIO not keyword-bound: \" + excerpt(item, 120));\n for (const item of a.sioOffConceptItems) issues.push(\"SIO does not reference any of this concept's keywords (\" + (c?.keywords ?? []).join(\", \") + \"): \" + excerpt(item, 120));\n for (const item of a.sioNotCompletable) issues.push(\"SIO not a completable task: \" + excerpt(item, 120));\n if (!a.concretenessIncreases) issues.push(\"SIO is not more concrete than the ULO — bind it to concrete constructs\");\n return {\n concept_id: a.conceptId,\n name: c?.name ?? a.conceptId,\n keywords: c?.keywords ?? [],\n current: { ulo: uloByConcept[a.conceptId], cio: cioByConcept[a.conceptId], sio: sioByConcept[a.conceptId] },\n issues,\n };\n });\n const repairSystem = [\n \"You repair depth-layer learning objectives that failed a deterministic contract audit.\",\n \"For each concept, rewrite ONLY the layers mentioned in issues, keeping the others as-is.\",\n \"Contract:\",\n \"- ULO: WHAT+WHY, concept-bound, technology-agnostic, Remember/Understand verbs.\",\n \"- CIO: HOW mechanism, technology-agnostic, more concrete than ULO, Marr 2-Language neutral.\",\n \"- SIO: keyword-bound completable implementation tasks naming real constructs of \" + techStack + \".\",\n \"- BINDING RULE: every SIO item must contain at least one of the concept's listed keywords VERBATIM (copy the exact keyword text into the sentence).\",\n \"- COMPLETABILITY RULE: every SIO item must contain an actionable verb (build, create, implement, write, configure, parse, validate, handle, store, load, run, read, fetch, display, generate, format, convert, test, debug, trace, measure, design, structure, select, filter, sort, map, reduce, catch, throw, migrate, deploy, query, index, cache, stream, inspect) or wrap a concrete construct in backticks — abstract verbs (understand, learn, know, grasp, explore, appreciate) always fail.\",\n \"\",\n JSON_ONLY,\n ].join(\"\\n\");\n const repairUser = [\n \"Failing concepts:\",\n JSON.stringify(repairTargets, null, 2),\n \"\",\n \"Return the FULL repaired set for these concepts in the same 3-layer JSON shape:\",\n '{\"repairs\":[{\"concept_id\":\"C1\",\"ulo\":\"...\",\"cio\":\"...\",\"sio\":[\"...\"]}]}',\n ].join(\"\\n\");\n try {\n const repairRes = await chatJson(client, repairSystem, repairUser);\n for (const r of (repairRes.repairs ?? []) as Array<{ concept_id?: string; ulo?: string; cio?: string; sio?: string[] }>) {\n if (!r.concept_id) continue;\n if (r.ulo) uloByConcept[r.concept_id] = standardStatement(r.ulo);\n if (r.cio) cioByConcept[r.concept_id] = standardStatement(r.cio);\n if (Array.isArray(r.sio) && r.sio.length > 0) sioByConcept[r.concept_id] = r.sio.map((t) => standardStatement(String(t)));\n }\n audits = auditOnce();\n } catch (err) {\n warnings.push(\"Depth repair round failed: \" + (err instanceof Error ? err.message : String(err)));\n }\n }\n return audits.every((a) => a.passed);\n };\n for (let round = 1; round <= 2; round++) {\n const allPass = await repairRound(round);\n if (allPass) break;\n }\n\n const stillFailing = audits.filter((a) => !a.passed);\n if (stillFailing.length > 0) {\n // Deterministic debug dump: inspect what the LLM actually wrote before failing.\n try {\n const { mkdirSync, writeFileSync } = await import(\"node:fs\");\n const dumpDir = (await import('node:os')).tmpdir() + '/domain-kit-debug/';\n mkdirSync(dumpDir, { recursive: true });\n writeFileSync(dumpDir + \"depth-audit-debug.json\", JSON.stringify(\n stillFailing.map((a) => ({ audit: a, ulo: uloByConcept[a.conceptId], cio: cioByConcept[a.conceptId], sio: sioByConcept[a.conceptId] })), null, 2));\n } catch { /* dump is best-effort */ }\n const detail = stillFailing.map((a) => a.conceptId + \"[\" + (a.uloHasTechSignals ? \"ulo-tech \" : \"\") + (a.uloHasImplementationVerbs ? \"ulo-impl \" : \"\") + (a.sioUnboundItems.length ? \"sio-unbound \" : \"\") + (a.sioNotCompletable.length ? \"sio-incomplete\" : \"\") + \"]\").join(\", \");\n throw new Error(\n \"Depth-layer contract audit failed after repair for: \" + detail +\n \" — regenerate or fix the prompt contract (fail-closed, no silent fallback)\"\n );\n }\n\n return { uloByConcept, cioByConcept, sioByConcept, audits, warnings };\n}\n","/**\n * knowledgeTreeCatalog.ts — loads the mlo-knowledge-tree TSV (CONCEPT/TOPIC/\n * CATEGORY/SUBJECT/FIELD rows) and exposes the deterministic half of concept\n * standardization:\n * - full CATEGORY / TOPIC listings for the LLM relevance pre-selection\n * - topic->category resolution (CONCEPT rows only carry topic codes)\n * - filtering tree concepts by selected categories/topics (+ a keyword\n * overlap safety net so strong individual matches are never filtered out)\n * - prerequisite codes per concept (prerequisite_concept_codes column)\n *\n * No LLM here: this module is pure data shaping.\n */\nimport { readFileSync } from 'node:fs';\n\nexport interface TreeConcept {\n code: string;\n name: string;\n description: string;\n keywords: string[];\n topicCodes: string[];\n categoryCodes: string[];\n prerequisiteCodes: string[];\n}\n\nexport interface TreeCatalog {\n path: string;\n concepts: TreeConcept[];\n /** category code -> name */\n categories: Map<string, string>;\n /** topic code -> { name, categoryCodes } */\n topics: Map<string, { name: string; categoryCodes: string[] }>;\n}\n\nfunction cell(v: string | undefined): string[] {\n return (v || '').split(',').map((s) => s.trim()).filter(Boolean);\n}\n\nexport function loadKnowledgeTreeCatalog(tsvPath: string): TreeCatalog {\n const text = readFileSync(tsvPath, 'utf8');\n const lines = text.split('\\n').filter((l) => l.trim().length > 0);\n if (lines.length === 0) throw new Error('Knowledge tree TSV is empty: ' + tsvPath);\n const header = lines[0].split('\\t').map((h) => h.trim());\n const col = (name: string): number => header.indexOf(name);\n const iT = col('item_type');\n const iC = col('code');\n const iN = col('name');\n const iD = col('description');\n const iCat = col('category_codes');\n const iTpc = col('topic_codes');\n const iPre = col('prerequisite_concept_codes');\n const iKw = col('keywords');\n for (const [name, idx] of [['item_type', iT], ['code', iC], ['name', iN]] as const) {\n if (idx < 0) throw new Error('Knowledge tree TSV missing column: ' + name);\n }\n const categories = new Map<string, string>();\n const topics = new Map<string, { name: string; categoryCodes: string[] }>();\n const concepts: TreeConcept[] = [];\n for (const line of lines.slice(1)) {\n const c = line.split('\\t');\n const type = (c[iT] || '').trim();\n const code = (c[iC] || '').trim();\n const name = (c[iN] || '').trim();\n if (!code || !name) continue;\n if (type === 'CATEGORY') categories.set(code, name);\n if (type === 'TOPIC') topics.set(code, { name, categoryCodes: cell(c[iCat]) });\n if (type !== 'CONCEPT') continue;\n const topicCodes = cell(c[iTpc]);\n // CONCEPT rows carry topic codes only — resolve categories via the topic map\n const categoryCodes = new Set<string>();\n for (const t of topicCodes) for (const cc of topics.get(t)?.categoryCodes || []) categoryCodes.add(cc);\n concepts.push({\n code,\n name,\n description: (c[iD] || '').trim(),\n keywords: cell(c[iKw]),\n topicCodes,\n categoryCodes: [...categoryCodes],\n prerequisiteCodes: cell(c[iPre]),\n });\n }\n if (concepts.length === 0) throw new Error('Knowledge tree TSV has no CONCEPT rows: ' + tsvPath);\n return { path: tsvPath, concepts, categories, topics };\n}\n\nfunction tokens(s: string): Set<string> {\n return new Set(\n s.toLowerCase().replace(/[^a-z0-9\\s-]/g, ' ').split(/\\s+/).filter((w) => w.length >= 4),\n );\n}\n\n/**\n * Deterministic filter AFTER the LLM picked relevant categories/topics:\n * keep concepts whose topic or category was selected. Concepts with a strong\n * individual keyword overlap are ALWAYS kept (safety net against a missed\n * category). Returns [] only when the selection is empty.\n */\nexport function filterBySelection(\n catalog: TreeCatalog,\n selectedCategories: string[],\n selectedTopics: string[],\n analysisConcepts: Array<{ name: string; keywords: string[] }>,\n maxConcepts = 120,\n): TreeConcept[] {\n const tps = new Set(selectedTopics.map((c) => c.trim().toUpperCase()).filter(Boolean));\n const cats = new Set(selectedCategories.map((c) => c.trim().toUpperCase()).filter(Boolean));\n const probe = analysisConcepts.map((c) => tokens(c.name + ' ' + c.keywords.join(' ')));\n const probeAll = new Set<string>();\n for (const p of probe) for (const w of p) probeAll.add(w);\n const inSelection = (tc: TreeConcept): boolean =>\n tc.topicCodes.some((t) => tps.has(t)) || tc.categoryCodes.some((c) => cats.has(c));\n const overlapScore = (tc: TreeConcept): number => {\n const tcTok = tokens(tc.name + ' ' + tc.description.slice(0, 300) + ' ' + tc.keywords.join(' '));\n let overlap = 0;\n for (const w of tcTok) if (probeAll.has(w)) overlap++;\n const kwDirect = tc.keywords.filter((k) => {\n const kl = k.toLowerCase();\n return [...probeAll].some((w) => w === kl || (w.length >= 5 && kl.includes(w)));\n }).length;\n return overlap * 2 + kwDirect * 3;\n };\n const kept = catalog.concepts.filter((tc) => inSelection(tc) || overlapScore(tc) >= 6);\n return kept\n .map((tc) => ({ tc, s: overlapScore(tc) }))\n .sort((a, b) => b.s - a.s)\n .slice(0, maxConcepts)\n .map((x) => x.tc);\n}\n\n/** Compact rendering for the standardization prompt. */\nexport function renderShortlist(shortlist: TreeConcept[]): string {\n return shortlist\n .map((tc) => '- ' + tc.code + ' | ' + tc.name + ' | kw: ' + tc.keywords.slice(0, 8).join(', ') +\n (tc.prerequisiteCodes.length ? ' | prereqs: ' + tc.prerequisiteCodes.join(',') : ''))\n .join('\\n');\n}\n\n/** Category + topic listing for the LLM relevance pre-selection prompt. */\nexport function renderCategoryTopicIndex(catalog: TreeCatalog): string {\n const topicToConcepts = new Map<string, number>();\n for (const tc of catalog.concepts) for (const t of tc.topicCodes) topicToConcepts.set(t, (topicToConcepts.get(t) || 0) + 1);\n const byCat = new Map<string, string[]>();\n for (const [code, info] of catalog.topics) {\n for (const cat of info.categoryCodes) {\n const arr = byCat.get(cat) || [];\n arr.push(code + ' ' + info.name + ' (' + (topicToConcepts.get(code) || 0) + ' concepts)');\n byCat.set(cat, arr);\n }\n }\n const out: string[] = [];\n for (const [code, name] of catalog.categories) {\n out.push('CATEGORY ' + code + ' — ' + name);\n for (const t of byCat.get(code) || []) out.push(' TOPIC: ' + t);\n }\n return out.join('\\n');\n}\n","/**\n * conceptStandardizer.ts — STEP 2.5 of the concept identification flow:\n *\n * 1. keywords -> escalate -> concepts (upstream STEP_6, unchanged)\n * 2. HERE: LLM-driven standardization against the knowledge-tree catalog\n * (category pre-filtered), producing:\n * - standardized concepts: adopt the tree code + tree keywords +\n * tree prerequisite codes (seed)\n * - proposed NEW concepts: kept OUT of the standard code namespace,\n * written to a separate proposals artifact for later merge\n * - ambiguous matches: treated as proposed_new with possible_tree_matches\n * 3. downstream steps use the standardized/proposed codes (fail-closed)\n *\n * The SEMANTIC decision is the LLM's. Code only validates the contract\n * (fail-closed) and writes artifacts.\n */\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport type { LlmClient } from '../utils/llmClient';\nimport {\n loadKnowledgeTreeCatalog,\n filterBySelection,\n renderShortlist,\n renderCategoryTopicIndex,\n type TreeCatalog,\n} from './knowledgeTreeCatalog';\n\nexport interface StandardizeInput {\n id: string;\n name: string;\n description: string;\n keywords: string[];\n}\n\nexport interface StandardizationDecision {\n id: string;\n decision: 'standardized' | 'proposed_new';\n tree_code?: string;\n note?: string;\n proposed_code?: string;\n proposed_definition?: string;\n possible_tree_matches?: string[];\n /** LLM-selected subset of the tree concept's keywords that fit the course tech stack. */\n adopted_keywords?: string[];\n}\n\nexport interface StandardizationResult {\n decisions: StandardizationDecision[];\n proposals: Array<Record<string, unknown>>;\n warnings: string[];\n shortlistSize: number;\n catalogSize: number;\n}\n\nconst JSON_ONLY =\n 'Return ONLY a JSON object, no markdown fences, no commentary.';\n\nfunction parseJsonBlock(text: string): unknown {\n const start = text.indexOf('{');\n const end = text.lastIndexOf('}');\n if (start < 0 || end <= start) throw new Error('LLM standardization response has no JSON object');\n return JSON.parse(text.slice(start, end + 1));\n}\n\n/**\n * Standardize analysis concepts against the tree.\n * Throws (fail-closed) when the LLM leaves a concept undecided or the tree\n * cannot be loaded.\n */\nexport async function standardizeConcepts(opts: {\n client: LlmClient;\n concepts: StandardizeInput[];\n catalog: TreeCatalog;\n techStack?: string;\n proposalsPath?: string;\n onProgress?: (step: string, message: string) => void;\n}): Promise<StandardizationResult> {\n const { client, catalog, techStack = 'python', proposalsPath } = opts;\n const log = opts.onProgress ?? (() => {});\n const warnings: string[] = [];\n\n // ── Stage A (LLM): which categories/topics could be relevant? ──\n const hasTopics = catalog.topics.size > 0;\n const selSystem = [\n 'You pre-select relevant areas of an institutional knowledge tree before a detailed concept alignment pass.',\n hasTopics\n ? 'Given the analysis concepts, pick the TOPICS that could contain matching concepts. Concepts are filed under topics, so topics are the filter dimension.'\n : 'Given the analysis concepts, pick the CATEGORIES that could contain matching concepts.',\n '- Be generous: missing a relevant topic corrupts the alignment; an extra topic only costs attention.',\n '- Only codes that appear in the index are valid.',\n JSON_ONLY,\n ].join('\\n');\n const selUser = [\n 'ANALYSIS CONCEPTS:',\n opts.concepts.map((c) => '- ' + c.name + ': ' + c.description.slice(0, 160)).join('\\n'),\n '',\n 'KNOWLEDGE TREE INDEX:',\n renderCategoryTopicIndex(catalog),\n '',\n hasTopics\n ? 'Return JSON: {\"relevant_topics\":[\"TOPIC_CODE\"]}'\n : 'Return JSON: {\"relevant_categories\":[\"CATEGORY_CODE\"]}',\n ].join('\\n');\n const selRes = await client.chat(\n [{ role: 'system', content: selSystem }, { role: 'user', content: selUser }],\n { temperature: 0, maxTokens: 4096 },\n );\n const sel = parseJsonBlock(selRes.content) as { relevant_categories?: string[]; relevant_topics?: string[] };\n // ONE filter dimension: topics when the tree files concepts under topics,\n // categories only as fallback. Never both mixed.\n const selTps = hasTopics ? (sel.relevant_topics || []).map(String).filter(Boolean) : [];\n const selCats = hasTopics ? [] : (sel.relevant_categories || []).map(String).filter(Boolean);\n log('STEP_2_5', 'LLM relevance pre-selection (' + (hasTopics ? 'topics' : 'categories') + '): ' + (hasTopics ? selTps.join(',') : selCats.join(',')));\n\n // ── Stage B (deterministic): filter tree concepts by that selection ──\n const shortlist = filterBySelection(catalog, selCats, selTps, opts.concepts);\n log('STEP_2_5', 'Filtered tree concepts: ' + shortlist.length + '/' + catalog.concepts.length + ' shortlisted for alignment');\n if (shortlist.length === 0) throw new Error('Topic/category pre-selection eliminated every tree concept — fail-closed');\n\n const system = [\n 'You align auto-derived learning concepts with an institutional knowledge tree.',\n 'For EACH input concept decide exactly one of:',\n ' 1. \"standardized\" - the concept teaches the SAME underlying knowledge as one tree concept. Applying a tree concept inside a specific product context (e.g. \"File-based persistence in a CLI app\") is STILL the tree concept if the core knowledge matches. Set tree_code to that concept\\'s code.',\n ' Adopt the tree\\'s terminology. Only propose new when the tree genuinely has NO concept teaching that knowledge (broader AND narrower both fail).',\n ' 2. \"proposed_new\" - no tree concept covers it at the same granularity. Propose an UPPER_SNAKE_CASE code (descriptive, stable, max 5 words) and a one-sentence definition.',\n ' If between 1 and 3 tree concepts are CLOSE but not exact, list their codes in possible_tree_matches for human review.',\n 'For a \"standardized\" decision ALSO return \"adopted_keywords\": the subset of that tree concept\\'s keywords (from the shortlist) that make sense for the course TECH STACK. Drop keywords that name tooling from other ecosystems (e.g. JS test runners for a Python course) — keep conceptual keywords even when spelled generically. Maximum 8, ordered most-relevant first.',\n 'Rules:',\n '- Judge by MEANING (definition + keywords), not by string similarity.',\n '- COVERAGE RULE: a \"standardized\" match must cover ALL primary dimensions of the input concept — every distinct aspect named in its title or description. A tree concept covering only ONE of several aspects (e.g. \"interpreting error messages\" for a concept about error handling AND user experience) is a PARTIAL match: decide \"proposed_new\" and list that tree code in possible_tree_matches.',\n '- Context-specific wording does NOT make a new concept: new concept = knowledge absent from the tree, not knowledge applied elsewhere.',\n '- Every input concept MUST receive exactly one decision. Never merge two input concepts into one tree code.',\n '- Prefer proposed_new over a wrong standardized match: a false match corrupts the curriculum.',\n JSON_ONLY,\n ].join('\\n');\n\n const user = [\n 'TECH STACK: ' + techStack,\n '',\n 'ANALYSIS CONCEPTS (to standardize):',\n JSON.stringify(opts.concepts.map((c) => ({ id: c.id, name: c.name, description: c.description.slice(0, 300), keywords: c.keywords.slice(0, 12) })), null, 1),\n '',\n 'KNOWLEDGE TREE SHORTLIST (pre-filtered, ' + shortlist.length + ' candidate concepts):',\n renderShortlist(shortlist),\n '',\n 'Return JSON: {\"decisions\":[{\"id\":\"<input id>\",\"decision\":\"standardized\",\"tree_code\":\"TREE_CODE\",\"adopted_keywords\":[\"kw1\",\"kw2\"],\"note\":\"one sentence\"},',\n ' {\"id\":\"<input id>\",\"decision\":\"proposed_new\",\"proposed_code\":\"PROPOSED_CODE\",\"proposed_definition\":\"...\",\"possible_tree_matches\":[\"CODE\"]}]}',\n ].join('\\n');\n\n const res = await client.chat(\n [{ role: 'system', content: system }, { role: 'user', content: user }],\n { temperature: 0, maxTokens: 8192 },\n );\n log('STEP_2_5', 'Standardization response received (provider ' + (res as unknown as { provider?: string }).provider + ')');\n\n const parsed = parseJsonBlock(res.content) as { decisions?: StandardizationDecision[] };\n const decisions = parsed.decisions ?? [];\n const byId = new Map(decisions.map((d) => [String(d.id), d]));\n\n const finalDecisions: StandardizationDecision[] = [];\n const proposals: Array<Record<string, unknown>> = [];\n for (const c of opts.concepts) {\n const d = byId.get(c.id);\n if (!d || (d.decision !== 'standardized' && d.decision !== 'proposed_new')) {\n // fail-closed: undecided concept cannot silently keep a nonstandard code\n throw new Error('Concept ' + c.id + ' (' + c.name + ') has no standardization decision — fail-closed');\n }\n if (d.decision === 'standardized') {\n const tc = catalog.concepts.find((x) => x.code === d.tree_code);\n if (!tc) throw new Error('Concept ' + c.id + ' standardized to unknown tree code ' + d.tree_code + ' — fail-closed');\n // adopted_keywords must come from the tree concept's own keywords — an\n // invented token would silently corrupt the registry (fail-closed).\n const treeKw = new Set(tc.keywords.map((k) => k.toLowerCase()));\n const adopted = (d.adopted_keywords || []).map((k) => String(k)).filter((k) => {\n if (treeKw.has(k.toLowerCase())) return true;\n throw new Error('Concept ' + c.id + ' adopted keyword \"' + k + '\" not in tree concept ' + tc.code + ' — fail-closed');\n });\n if (tc.keywords.length > 0 && adopted.length === 0) {\n throw new Error('Concept ' + c.id + ' standardized to ' + tc.code + ' without adopted_keywords — fail-closed');\n }\n finalDecisions.push({ ...d, id: c.id, tree_code: tc.code, adopted_keywords: adopted });\n warnings.push('Concept ' + c.id + ' standardized as ' + tc.code + ' (' + tc.name + '), adopted keywords: ' + adopted.join(', ') + (d.note ? ' — ' + d.note : ''));\n } else {\n const code = (d.proposed_code || '').toUpperCase().replace(/[^A-Z0-9_]/g, '_');\n if (!/^[A-Z][A-Z0-9_]*$/.test(code)) {\n throw new Error('Concept ' + c.id + ' proposed invalid code \"' + d.proposed_code + '\" — fail-closed');\n }\n finalDecisions.push({ ...d, id: c.id, proposed_code: code });\n proposals.push({\n code,\n name: c.name,\n description: d.proposed_definition || c.description.slice(0, 300),\n keywords: c.keywords,\n subject_codes: 'PY',\n category_codes: '',\n topic_codes: '',\n prerequisite_concept_codes: [],\n status: 'proposed',\n source_concept_id: c.id,\n possible_tree_matches: (d.possible_tree_matches || []).filter(Boolean),\n });\n warnings.push('Concept ' + c.id + ' proposed as NEW: ' + code + (d.possible_tree_matches?.length ? ' (near matches: ' + d.possible_tree_matches.join(', ') + ')' : ''));\n }\n }\n\n // Persist proposals separately for the later merge (never in the standard namespace)\n const outPath = proposalsPath || join(tmpdir(), 'domain-kit-debug', 'concept-proposals.json');\n try {\n mkdirSync(outPath.slice(0, outPath.lastIndexOf('/')), { recursive: true });\n writeFileSync(outPath, JSON.stringify({ generated_at: new Date().toISOString(), proposals }, null, 2));\n log('STEP_2_5', 'Proposals written: ' + proposals.length + ' -> ' + outPath);\n } catch (e) {\n warnings.push('Could not write proposals artifact: ' + (e instanceof Error ? e.message : String(e)));\n }\n\n return { decisions: finalDecisions, proposals, warnings, shortlistSize: shortlist.length, catalogSize: catalog.concepts.length };\n}\n","/**\n * Knowledge Graph Pipeline — generates knowledge_graph for concept-driven learning.\n *\n * Input: syllabus text, subject description, grade band\n * Output: KnowledgeGraph with concepts, problem_types, prerequisites, learning_path\n *\n * Includes:\n * - Cycle detection in prerequisite chains\n * - Topological sort for learning_path\n * - Multi-language syllabus support\n * - ULO/CIO/SIO depth control per concept\n */\n\nimport { assignConceptCodes, techTagFor, uloCode, cioCode, sioCode, cioActionSlug } from \"./loCodeStandard.js\";\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\nimport type { KnowledgeGraph, Concept, ConceptCategory, LearningPathStep } from '../schemas/knowledgeGraphSchema';\nimport { parseSyllabus, type ParsedSyllabus } from '../parsers/syllabusParser';\nimport {\n verifyKnowledgeGraph,\n detectPrerequisiteCycles,\n breakPrerequisiteCycles,\n type KnowledgeGraphVerificationReport,\n} from './knowledgeGraphVerifier';\n\nexport interface KnowledgeGraphPipelineOptions {\n subject: string;\n description?: string;\n syllabusText?: string;\n parsedSyllabus?: ParsedSyllabus;\n gradeBand?: [number, number];\n domain?: string;\n /** Target technology for SIO keyword binding (e.g. \"python\", \"swift\"); auto-detected fallback applies. */\n techStack?: string;\n llmConfig?: LlmClientConfig;\n onProgress?: (step: string, message: string) => void;\n /** Path to mlo-knowlege-tree.tsv. When provided, STEP_2_5 standardizes every concept against the tree (fail-closed). */\n knowledgeTreePath?: string;\n /** Where to persist proposed-new concepts for the later merge. Default: tmpdir/domain-kit-debug/concept-proposals.json */\n proposalsPath?: string;\n}\n\nexport interface KnowledgeGraphPipelineResult {\n knowledgeGraph: KnowledgeGraph;\n warnings: string[];\n verificationReport?: KnowledgeGraphVerificationReport;\n}\nimport { auditDepthLayers } from './depthAudit';\nimport { authorDepthLayersHierarchically } from './hierarchicalLoAuthoring';\nimport { loadKnowledgeTreeCatalog } from './knowledgeTreeCatalog';\nimport { standardizeConcepts } from './conceptStandardizer';\n\n\n// ─── Topological Sort ────────────────────────────────────────────────────────\n\n\n/**\n * Topological sort using Kahn's algorithm.\n * Returns sorted concept IDs, or throws if there's still a cycle.\n */\nfunction topologicalSort(concepts: Concept[]): string[] {\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n for (const concept of concepts) {\n inDegree.set(concept.id, 0);\n adjacency.set(concept.id, []);\n }\n\n for (const concept of concepts) {\n for (const prereq of concept.prerequisites || []) {\n // prereq → concept (prereq must come before concept)\n adjacency.get(prereq)?.push(concept.id);\n inDegree.set(concept.id, (inDegree.get(concept.id) || 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const [id, degree] of inDegree) {\n if (degree === 0) queue.push(id);\n }\n\n const sorted: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(current);\n\n for (const neighbor of adjacency.get(current) || []) {\n const newDegree = (inDegree.get(neighbor) || 1) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) queue.push(neighbor);\n }\n }\n\n if (sorted.length !== concepts.length) {\n // Still has cycle after breaking — shouldn't happen, but log warning\n console.warn(`[WARN] Topological sort incomplete: ${sorted.length}/${concepts.length} concepts sorted`);\n }\n\n return sorted;\n}\n\n// ─── ULO/CIO/SIO Depth Estimation ────────────────────────────────────────────\n\n/**\n * Estimate ULO/CIO/SIO depth level for a concept based on:\n * - Number of prerequisites (more prereqs = deeper concept)\n * - Bloom level of associated problem types\n * - Position in learning path (earlier = more foundational)\n */\nfunction estimateConceptDepth(\n concept: Concept,\n position: number,\n totalConcepts: number,\n): { suggestedDepth: 'ulo' | 'cio' | 'sio'; rationale: string } {\n const prereqCount = (concept.prerequisites || []).length;\n const problemTypes = concept.problem_types || [];\n const maxBloom = problemTypes.reduce((max, pt) => {\n const levels = ['Remember', 'Understand', 'Apply', 'Analyze', 'Evaluate', 'Create'];\n const idx = levels.indexOf(pt.bloom_level || 'Understand');\n return idx > max ? idx : max;\n }, 0);\n\n // Position ratio: 0 = first concept, 1 = last concept\n const positionRatio = totalConcepts > 1 ? position / (totalConcepts - 1) : 0;\n\n // Score: higher = deeper\n const depthScore = (prereqCount * 0.3) + (maxBloom * 0.15) + (positionRatio * 0.3);\n\n if (depthScore < 0.3) {\n return { suggestedDepth: 'ulo', rationale: `Low complexity (${prereqCount} prereqs, bloom=${maxBloom}, position=${(positionRatio * 100).toFixed(0)}%)` };\n } else if (depthScore < 0.6) {\n return { suggestedDepth: 'cio', rationale: `Medium complexity (${prereqCount} prereqs, bloom=${maxBloom}, position=${(positionRatio * 100).toFixed(0)}%)` };\n } else {\n return { suggestedDepth: 'sio', rationale: `High complexity (${prereqCount} prereqs, bloom=${maxBloom}, position=${(positionRatio * 100).toFixed(0)}%)` };\n }\n}\n\n// ─── Main Pipeline ───────────────────────────────────────────────────────────\n\n/**\n * Generate a KnowledgeGraph from syllabus/description via LLM.\n */\nexport async function generateKnowledgeGraph(\n options: KnowledgeGraphPipelineOptions,\n): Promise<KnowledgeGraphPipelineResult> {\n const { subject, description, syllabusText, gradeBand, domain, techStack, llmConfig, onProgress } = options;\n const warnings: string[] = [];\n\n const log = (step: string, msg: string) => {\n console.log(`[KG-${step}] ${msg}`);\n onProgress?.(step, msg);\n };\n\n // ─── Step 1: Decompose subject into concepts ─────────────────────────────\n log('STEP_1', 'Decomposing subject into concepts...');\n\n let parsedSyllabus = options.parsedSyllabus;\n if (!parsedSyllabus && syllabusText) {\n parsedSyllabus = parseSyllabus(syllabusText);\n log('STEP_1', `Parsed syllabus: ${parsedSyllabus.units.length} units, ${parsedSyllabus.allTopics.length} topics`);\n }\n\n const client = createLlmClient(llmConfig);\n\n // Truncate syllabus with warning\n const maxSyllabusChars = parseInt(process.env.KG_MAX_SYLLABUS_CHARS || '16000', 10);\n let truncatedSyllabus = '';\n if (syllabusText) {\n if (syllabusText.length > maxSyllabusChars) {\n truncatedSyllabus = syllabusText.slice(0, maxSyllabusChars);\n warnings.push(`Syllabus truncated from ${syllabusText.length} to ${maxSyllabusChars} chars — may miss some concepts`);\n } else {\n truncatedSyllabus = syllabusText;\n }\n }\n\n const structuredTopicsGuide = parsedSyllabus && parsedSyllabus.allTopics.length > 0\n ? `\\nSTRUCTURED SYLLABUS TOPICS (Every topic MUST map to at least one concept to ensure 100% syllabus coverage):\\n`\n + parsedSyllabus.allTopics.map((t) => `- [${t.unitTitle}] ${t.id}: ${t.title} (Keywords: ${t.keywords.join(', ')})`).join('\\n') + '\\n'\n : '';\n\n const systemPrompt = (\n 'You are an expert curriculum designer. Decompose the given subject into a structured '\n + 'knowledge graph with concepts, prerequisites, and problem types.\\n\\n'\n + 'CRITICAL RULES:\\n'\n + '1. Each concept MUST have the three depth layers, authored against this CONTRACT:\\n'\n + ' - ulo (WHAT + WHY): bound to the CONCEPT\\u0027s intrinsic NATURE. It explains what the\\n'\n + ' concept is and why it exists — the problem it solves in principle. It must be\\n'\n + ' TECHNOLOGY-AGNOSTIC: never name a concrete library, API, function, file format,\\n'\n + ' tool or language feature. Typical assessment level: Remember / Understand.\\n'\n + ' - cio (HOW): the MECHANISM — how the concept works and solves that problem, step\\n'\n + ' by step. Still bound to the concept\\u0027s nature: more concrete than the ULO, but\\n'\n + ' NOT tied to one specific technology (no concrete API names). CIO capability is\\n'\n + ' assessed INDIRECTLY, through completing contextual work, not in isolation.\\n'\n + ' - sio (IMPLEMENTATION): an array of 2-4 items. EVERY item MUST reference concrete\\n'\n + ' KEYWORDS/technologies (a real API, function, module, file, or named pattern) and\\n'\n + ' describe a completable, context-specific implementation task. Application,\\n'\n + ' Analysis and Creation skills are assessed INDIRECTLY through completing these\\n'\n + ' items. There is NO fixed Bloom ceiling for a layer — but concreteness MUST\\n'\n + ' strictly increase: SIO more technology-bound than CIO, CIO more concrete than ULO.\\n'\n + ' - prerequisites: concept IDs that must be learned first (MUST NOT create cycles)\\n'\n + ' - problem_types: 2-4 problem types with bloom_level and difficulty. Remember and\\n'\n + ' Understand problem types test the ULO/CIO directly; Apply-and-above types are\\n'\n + ' proxies for SIO completion in context.\\n'\n + ' - techniques: methods, formulas, tools\\n'\n + '2. Prerequisite chains MUST be acyclic (no concept can depend on itself or create a loop)\\n'\n + '3. Concepts should be ordered by prerequisite dependency (topological sort)\\n'\n + '4. Problem types should range from Remember to Apply (not all at same level)\\n'\n + '5. Group concepts into categories (chapters/sections)\\n'\n + '6. ALL text in ENGLISH (even if input is Vietnamese)\\n'\n + '7. NEVER invent concepts not present in the syllabus\\n'\n + '8. Return JSON matching the KnowledgeGraphSchema'\n );\n\n const userPrompt = `Subject: ${subject}\\n${description ? `Description: ${description}` : ''}\\n${structuredTopicsGuide}${truncatedSyllabus ? `Syllabus:\\n${truncatedSyllabus}` : ''}\\n${gradeBand ? `Grade band: ${gradeBand[0]}-${gradeBand[1]}` : ''}\\n${domain ? `Domain: ${domain}` : ''}\\n\\nReturn JSON:\\n{\\n \"subject\": {\\n \"id\": \"${subject.toLowerCase().replace(/\\s+/g, '-').slice(0, 30)}\",\\n \"name\": \"${subject}\",\\n \"description\": \"...\",\\n \"domain\": \"${domain || 'other'}\",\\n \"grade_band\": ${gradeBand ? `[${gradeBand[0]}, ${gradeBand[1]}]` : '[6, 12]'}\\n },\\n \"concepts\": [\\n {\\n \"id\": \"C1\",\\n \"name\": \"Concept name\",\\n \"description\": \"Brief description\",\\n \"category\": \"category_id\",\\n \"ulo\": \"WHAT + WHY in technology-agnostic language: what the concept is and the problem it exists to solve. No library/API/tool names.\",\\n \"cio\": \"HOW the mechanism works, still technology-agnostic but more concrete than the ULO.\",\\n \"sio\": [\"Concrete task naming a REAL API/function/module/file from the target technology, completable end to end\", \"Another technology-bound task using a different concrete keyword\"],\\n \"prerequisites\": [],\\n \"estimated_minutes\": 30,\\n \"problem_types\": [\\n {\\n \"id\": \"PT-C1-01\",\\n \"name\": \"Problem type name\",\\n \"description\": \"What this problem type tests\",\\n \"bloom_level\": \"Remember\",\\n \"difficulty\": \"easy\",\\n \"estimated_minutes\": 10\\n }\\n ],\\n \"techniques\": [\"technique 1\", \"technique 2\"],\\n \"common_mistakes\": [\"mistake 1\"]\\n }\\n ],\\n \"categories\": [\\n {\\n \"id\": \"cat1\",\\n \"name\": \"Category name\",\\n \"description\": \"Category description\",\\n \"concept_ids\": [\"C1\", \"C2\"],\\n \"order\": 1\\n }\\n ],\\n \"learning_path\": [\\n {\"concept_id\": \"C1\", \"order\": 1, \"depends_on\": []},\\n {\"concept_id\": \"C2\", \"order\": 2, \"depends_on\": [\"C1\"]}\\n ]\\n}`;\n\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: parseInt(process.env.KG_MAX_TOKENS || '65536', 10),\n });\n\n // ─── Step 2: Validate and clean ──────────────────────────────────────────\n log('STEP_2', 'Validating and cleaning knowledge graph...');\n\n const concepts = (result.concepts || []) as Concept[];\n const categories = (result.categories || []) as ConceptCategory[];\n // Keyword registry (fail-closed): every concept MUST carry a non-empty\n // keyword set — it drives the keyword-progression ledger and the SIO binding\n // audit downstream. LLM output is top-up (description tokens), never empty.\n {\n const STOP = new Set(['and', 'the', 'for', 'with', 'from', 'that', 'this', 'into', 'when', 'while', 'using', 'their', 'your', 'each', 'how', 'why', 'what', 'between', 'through', 'about']);\n const tokensFrom = (text: string): string[] => text\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, ' ')\n .split(/\\s+/)\n .filter(w => w.length >= 4 && !STOP.has(w));\n for (const c of concepts) {\n const existing = (c.keywords || []).map(k => String(k).trim()).filter(Boolean);\n if (existing.length === 0) {\n const derived = [...new Set([...tokensFrom(c.name), ...tokensFrom(c.description || '')])].slice(0, 5);\n if (derived.length === 0) {\n throw new Error('Concept ' + c.id + ' (' + c.name + ') has no keywords and none could be derived from name/description — fail-closed');\n }\n c.keywords = derived;\n warnings.push('Concept ' + c.id + ': empty keyword set - derived ' + derived.join(', ') + ' from name/description');\n } else {\n c.keywords = existing;\n }\n }\n }\n const rawPath = result.learning_path as Array<Record<string, unknown>> | undefined;\n let learningPath: LearningPathStep[] = (rawPath || []).map((s: Record<string, unknown>) => ({\n concept_id: String(s.concept_id || ''),\n order: Number(s.order || 0),\n depends_on: Array.isArray(s.depends_on) ? s.depends_on.map(String) : [],\n milestone_name: String(s.milestone_name || ''),\n }));\n\n // Validate prerequisites reference existing concepts\n const conceptIds = new Set(concepts.map(c => c.id));\n for (const concept of concepts) {\n for (const prereq of concept.prerequisites || []) {\n if (!conceptIds.has(prereq)) {\n warnings.push(`Concept ${concept.id} references non-existent prerequisite ${prereq} — removed`);\n concept.prerequisites = (concept.prerequisites || []).filter(p => p !== prereq);\n }\n }\n }\n\n // ─── Step 2.5: Standardize concepts against the knowledge tree ───────────\n // keyword -> escalate -> concept (upstream) -> HERE: LLM standardization vs\n // tree catalog (deterministic category pre-filter) -> downstream steps use\n // standardized / proposed codes. Fail-closed.\n if (options.knowledgeTreePath) {\n const catalog = loadKnowledgeTreeCatalog(options.knowledgeTreePath);\n log('STEP_2_5', 'Knowledge tree loaded: ' + catalog.concepts.length + ' concepts from ' + catalog.path.split('/').pop());\n const std = await standardizeConcepts({\n client,\n concepts: concepts.map((c) => ({\n id: c.id,\n name: c.name,\n description: c.description || '',\n keywords: c.keywords || [],\n })),\n catalog,\n techStack,\n proposalsPath: options.proposalsPath,\n onProgress: log,\n });\n warnings.push(...std.warnings);\n const codeByStd = new Map(std.decisions.map((d) => [d.id, d]));\n for (const c of concepts) {\n const d = codeByStd.get(c.id);\n if (!d) throw new Error('Concept ' + c.id + ' missing standardization decision — fail-closed');\n if (d.decision === 'standardized') {\n c.standardization = 'standardized';\n c.tree_code = d.tree_code;\n c.code = d.tree_code;\n const tc = catalog.concepts.find((x) => x.code === d.tree_code);\n if (tc) {\n // Keyword enrichment is LLM-driven: only the keywords the standardizer\n // ADOPTED for this tech stack join the registry (no code-side blacklist).\n for (const k of d.adopted_keywords || []) {\n if (!(c.keywords || []).some((x) => x.toLowerCase() === k.toLowerCase())) {\n c.keywords = [...(c.keywords || []), k];\n }\n }\n c.tree_prerequisites = tc.prerequisiteCodes;\n }\n } else {\n c.standardization = 'proposed_new';\n c.code = d.proposed_code;\n }\n }\n // Seed internal prerequisite edges from the tree's prerequisite codes:\n // only mapped when the referenced tree concept is part of THIS analysis.\n const idByTreeCode = new Map(concepts.filter((c) => c.tree_code).map((c) => [c.tree_code as string, c.id]));\n for (const c of concepts) {\n for (const tp of c.tree_prerequisites || []) {\n const target = idByTreeCode.get(tp);\n if (target && target !== c.id && !(c.prerequisites || []).includes(target)) {\n c.prerequisites = [...(c.prerequisites || []), target];\n warnings.push('Prereq seeded from tree: ' + c.id + ' <- ' + tp + ' (' + target + ')');\n }\n }\n }\n log('STEP_2_5', 'Standardized: ' + std.decisions.filter((d) => d.decision === 'standardized').length\n + ', proposed new: ' + std.decisions.filter((d) => d.decision === 'proposed_new').length);\n }\n\n // ─── Step 3: Cycle Detection ─────────────────────────────────────────────\n log('STEP_3', 'Checking for prerequisite cycles...');\n\n const cycles = detectPrerequisiteCycles(concepts);\n if (cycles.length > 0) {\n log('STEP_3', `Found ${cycles.length} cycle(s) in prerequisite chain — breaking cycles`);\n for (const cycle of cycles) {\n warnings.push(`Cycle detected: ${cycle.join(' → ')} — breaking at weakest edge`);\n }\n\n const { fixed, removed } = breakPrerequisiteCycles(concepts, cycles);\n // Replace concepts with cycle-free versions\n for (let i = 0; i < concepts.length; i++) {\n const fixedConcept = fixed.find(f => f.id === concepts[i].id);\n if (fixedConcept) {\n concepts[i] = { ...concepts[i], prerequisites: fixedConcept.prerequisites };\n }\n }\n\n for (const { from, to } of removed) {\n warnings.push(`Removed prerequisite edge: ${from} → ${to} (cycle breaker)`);\n }\n }\n\n // ─── Step 4: Topological Sort ────────────────────────────────────────────\n log('STEP_4', 'Topological sort of concepts...');\n\n const sortedIds = topologicalSort(concepts);\n\n // Rebuild learning_path from topological sort\n learningPath = sortedIds.map((id, idx) => {\n const concept = concepts.find(c => c.id === id);\n return {\n concept_id: id,\n order: idx + 1,\n depends_on: concept?.prerequisites || [],\n milestone_name: '',\n };\n });\n\n // ─── Step 5: Hierarchical ULO/CIO/SIO authoring (ported from knowledge-tree) ──\n log('STEP_5', 'Authoring ULO/CIO/SIO depth layers hierarchically...');\n\n {\n const lo = await authorDepthLayersHierarchically(\n client,\n concepts.map((c) => ({ id: c.id, name: c.name, description: c.description, keywords: c.keywords })),\n techStack || (domain === 'software' || domain === 'technology' ? 'python' : (domain || 'general')),\n warnings,\n );\n const codeByConceptId = assignConceptCodes(concepts.map((c) => ({ id: c.id, name: c.name })));\n const techTag = techTagFor(techStack || (domain === 'software' || domain === 'technology' ? 'python' : (domain || 'general')));\n for (const concept of concepts) {\n concept.ulo = lo.uloByConcept[concept.id] || concept.ulo || '';\n concept.cio = lo.cioByConcept[concept.id] || concept.cio || '';\n if (lo.sioByConcept[concept.id] && lo.sioByConcept[concept.id].length > 0) {\n concept.sio = lo.sioByConcept[concept.id];\n }\n // Production-standard codes + statement clause (deterministic post-pass).\n // A tree-standardized or proposed code from STEP_2_5 wins — the generated\n // code only fills concepts the standardizer never saw.\n concept.code = concept.code || codeByConceptId[concept.id];\n concept.ulo_code = concept.ulo ? uloCode(concept.code!) : concept.ulo_code;\n concept.cio_code = concept.cio ? cioCode(concept.code!, 1, cioActionSlug(concept.cio)) : concept.cio_code;\n concept.sio_codes = concept.sio.length > 0\n ? concept.sio.map((_, i) => sioCode(techTag, concept.code!, i + 1))\n : concept.sio_codes;\n }\n log('STEP_5', 'Depth layers authored: ' + concepts.length + ' concepts, audit ' +\n (lo.audits.filter((a) => a.passed).length) + '/' + concepts.length + ' passed');\n }\n\n // Validate learning_path references\n for (const step of learningPath) {\n if (!conceptIds.has(step.concept_id)) {\n warnings.push(`Learning path references non-existent concept ${step.concept_id}`);\n }\n }\n\n log('STEP_2', `Validated ${concepts.length} concepts, ${categories.length} categories, ${learningPath.length} learning path steps`);\n\n const rawGraph: KnowledgeGraph = {\n schema_version: 1,\n type: 'knowledge_graph',\n subject: result.subject as KnowledgeGraph['subject'],\n concepts,\n categories,\n learning_path: learningPath,\n };\n\n // ─── Step 6: Verify Knowledge Graph referential integrity and reverse coverage ──\n log('STEP_6', 'Running Knowledge Graph verification & reverse coverage audit...');\n const { verifiedGraph, report } = verifyKnowledgeGraph(rawGraph, parsedSyllabus);\n warnings.push(...report.warnings);\n\n return {\n knowledgeGraph: verifiedGraph,\n warnings,\n verificationReport: report,\n };\n}\n\n","/**\n * Knowledge Graph Pipeline Orchestrator.\n *\n * Runs: Syllabus Parsing -> Knowledge Graph Generation -> Verification -> CurriculumFeed v2 Emission.\n */\n\nimport { generateKnowledgeGraph, type KnowledgeGraphPipelineOptions } from '../graph/knowledgeGraphPipeline';\nimport { parseSyllabus, type ParsedSyllabus } from '../parsers/syllabusParser';\nimport { emitCurriculumFeed } from '../feed/curriculumFeedEmitter';\nimport type { KnowledgeGraph } from '../schemas/knowledgeGraphSchema';\nimport type { CurriculumFeed } from '../schemas/curriculumFeedSchema';\nimport type { KnowledgeGraphVerificationReport } from '../graph/knowledgeGraphVerifier';\n\nexport interface KnowledgePipelineOptions extends KnowledgeGraphPipelineOptions {}\n\nexport interface KnowledgePipelineResult {\n knowledgeGraph: KnowledgeGraph;\n parsedSyllabus?: ParsedSyllabus;\n curriculumFeed: CurriculumFeed;\n verificationReport?: KnowledgeGraphVerificationReport;\n warnings: string[];\n}\n\n/**\n * Run the full concept-driven knowledge graph pipeline.\n */\nexport async function runKnowledgeGraphPipeline(\n options: KnowledgePipelineOptions,\n): Promise<KnowledgePipelineResult> {\n const warnings: string[] = [];\n let parsedSyllabus = options.parsedSyllabus;\n\n if (!parsedSyllabus && options.syllabusText) {\n parsedSyllabus = parseSyllabus(options.syllabusText);\n }\n\n const effectiveSubject = options.subject || parsedSyllabus?.subject.title || 'Untitled Subject';\n const effectiveDomain = options.domain || parsedSyllabus?.subject.domain || 'other';\n const effectiveGradeBand = options.gradeBand || parsedSyllabus?.subject.gradeBand;\n const effectiveDesc = options.description || parsedSyllabus?.subject.description;\n\n const result = await generateKnowledgeGraph({\n ...options,\n subject: effectiveSubject,\n domain: effectiveDomain,\n gradeBand: effectiveGradeBand,\n description: effectiveDesc,\n parsedSyllabus,\n });\n\n warnings.push(...result.warnings);\n\n // Emit normalized CurriculumFeed v2\n const curriculumFeed = emitCurriculumFeed(result.knowledgeGraph, {\n warnings,\n });\n\n return {\n knowledgeGraph: result.knowledgeGraph,\n parsedSyllabus,\n curriculumFeed,\n verificationReport: result.verificationReport,\n warnings,\n };\n}\n","/**\n * Hybrid Graph Pipeline - generates hybrid_graph combining project + knowledge.\n *\n * STEP_1 generates feature-concept links. STEP_2 decomposes the build into\n * PROGRESSIVE COMPLETION PHASES (cross-feature): each phase describes what the\n * product can demonstrably do once complete, owns every feature built in it\n * (each feature in EXACTLY one phase), and declares which concepts are\n * introduced (new) or revisited at higher depth (advanced) at the phase start.\n * Later phases depend on earlier ones and may only raise the knowledge level -\n * verified against the concept prerequisite graph (fail-closed).\n */\n\nimport { createLlmClient, llmChatJson, type LlmClientConfig } from '../utils/llmClient';\nimport type { ProjectGraph } from '../schemas/projectGraphSchema';\nimport type { KnowledgeGraph } from '../schemas/knowledgeGraphSchema';\nimport type {\n HybridGraph, ProjectConceptLink, DevelopmentPhase, ConceptIntroduction,\n} from '../schemas/hybridGraphSchema';\n\nexport interface HybridGraphPipelineOptions {\n projectGraph: ProjectGraph;\n knowledgeGraph: KnowledgeGraph;\n llmConfig?: LlmClientConfig;\n onProgress?: (step: string, message: string) => void;\n}\n\nexport interface HybridGraphPipelineResult {\n hybridGraph: HybridGraph;\n warnings: string[];\n}\n\nexport async function generateHybridGraph(\n options: HybridGraphPipelineOptions,\n): Promise<HybridGraphPipelineResult> {\n const { projectGraph, knowledgeGraph, llmConfig, onProgress } = options;\n const warnings: string[] = [];\n\n const log = (step: string, msg: string) => {\n console.log('[HG-' + step + '] ' + msg);\n onProgress?.(step, msg);\n };\n\n const features = projectGraph.features || [];\n const concepts = knowledgeGraph.concepts || [];\n\n if (features.length === 0 || concepts.length === 0) {\n warnings.push('No features or concepts to link');\n return {\n hybridGraph: {\n schema_version: 1,\n type: 'hybrid_graph',\n project_graph: projectGraph,\n knowledge_graph: knowledgeGraph,\n links: [],\n phases: [],\n description: '',\n total_project_minutes: 0,\n total_concept_minutes: 0,\n estimated_total_minutes: 0,\n },\n warnings,\n };\n }\n\n const client = createLlmClient(llmConfig);\n\n const featuresList = features.map(f =>\n '- ' + f.id + ': ' + f.name + ' - ' + (f.description || '') +\n ' (keywords: ' + (f.steps || []).flatMap(s => s.keywords || []).slice(0, 5).join(', ') + ')',\n ).join('\\n');\n\n const conceptsList = concepts.map(c =>\n '- ' + c.id + ': ' + c.name + ' - ULO: ' + (c.ulo || '').slice(0, 100) +\n ' (prerequisites: ' + (c.prerequisites || []).join(', ') + ')',\n ).join('\\n');\n\n const systemPrompt = (\n 'You are a curriculum architect. Link project features to knowledge concepts.\\n'\n + 'For each feature, determine which concepts it requires or demonstrates.\\n\\n'\n + 'RULES:\\n'\n + '1. Each link must have a relationship type: requires | demonstrates | applies | extends\\n'\n + '2. depth indicates how deeply the feature needs the concept:\\n'\n + ' - ulo: feature only needs WHAT+WHY understanding\\n'\n + ' - cio: feature needs HOW understanding\\n'\n + ' - sio: feature needs specific implementation knowledge\\n'\n + '3. estimated_prereq_minutes: how many minutes of concept learning before this feature\\n'\n + '4. Not every feature needs every concept - only create meaningful links\\n'\n + '5. Return JSON object with a links array'\n );\n\n const userPrompt = 'FEATURES:\\n' + featuresList + '\\n\\nCONCEPTS:\\n' + conceptsList + '\\n\\n'\n + 'Create links between features and concepts. Return JSON.\\n';\n\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: 16384,\n });\n\n const rawLinks = (result.links || []) as Array<Record<string, unknown>>;\n\n const featureIds = new Set(features.map(f => f.id));\n const conceptIds = new Set(concepts.map(c => c.id));\n const validLinks: ProjectConceptLink[] = [];\n\n for (const link of rawLinks) {\n const fid = String(link.feature_id || '');\n const cid = String(link.concept_id || '');\n if (!featureIds.has(fid)) {\n warnings.push('Link references non-existent feature ' + fid);\n continue;\n }\n if (!conceptIds.has(cid)) {\n warnings.push('Link references non-existent concept ' + cid);\n continue;\n }\n validLinks.push({\n feature_id: fid,\n concept_id: cid,\n relationship: (link.relationship as 'requires' | 'demonstrates' | 'applies' | 'extends') || 'requires',\n depth: (link.depth as 'ulo' | 'cio' | 'sio') || 'cio',\n description: String(link.description || ''),\n estimated_prereq_minutes: Number(link.estimated_prereq_minutes) || 0,\n phase_id: '',\n });\n }\n\n log('STEP_1', 'Generated ' + validLinks.length + ' feature-concept links');\n\n const phases = await decomposePhases({\n features, concepts, links: validLinks, client, log, warnings,\n });\n const phaseByFeature = new Map<string, string>();\n for (const ph of phases) {\n for (const fid of ph.feature_ids) phaseByFeature.set(fid, ph.id);\n }\n for (const link of validLinks) link.phase_id = phaseByFeature.get(link.feature_id) || '';\n\n log('STEP_3', 'Calculating totals...');\n\n const totalProjectMinutes = features.reduce((sum, f) => {\n const featureMinutes = (f.steps || []).reduce((s, step) => s + (step.effort?.estimated_minutes || 15), 0);\n return sum + featureMinutes;\n }, 0);\n\n const totalConceptMinutes = concepts.reduce((sum, c) => sum + (c.estimated_minutes || 30), 0);\n\n const prereqMinutesByConcept = new Map<string, number>();\n for (const link of validLinks) {\n const mins = link.estimated_prereq_minutes || 0;\n if (mins > 0) {\n const existing = prereqMinutesByConcept.get(link.concept_id) || 0;\n prereqMinutesByConcept.set(link.concept_id, Math.max(existing, mins));\n }\n }\n const totalPrereqMinutes = Array.from(prereqMinutesByConcept.values()).reduce((a, b) => a + b, 0);\n\n return {\n hybridGraph: {\n schema_version: 1,\n type: 'hybrid_graph',\n project_graph: projectGraph,\n knowledge_graph: knowledgeGraph,\n links: validLinks,\n phases,\n description: 'Progressive completion path: ' + phases.length + ' phases, ' + features.length + ' features, ' + concepts.length + ' concepts',\n total_project_minutes: totalProjectMinutes,\n total_concept_minutes: totalConceptMinutes,\n estimated_total_minutes: totalProjectMinutes + totalPrereqMinutes,\n },\n warnings,\n };\n}\n\ninterface DecomposePhasesArgs {\n features: ProjectGraph['features'];\n concepts: KnowledgeGraph['concepts'];\n links: ProjectConceptLink[];\n client: ReturnType<typeof createLlmClient>;\n log: (step: string, msg: string) => void;\n warnings: string[];\n}\nexport function auditPhasePlan(\n plan: Array<Record<string, unknown>>,\n features: Array<{ id: string }>,\n concepts: Array<{ id: string; prerequisites?: string[] }>,\n links: Array<{ feature_id: string; concept_id: string }>,\n warnings: string[],\n log: (step: string, msg: string) => void,\n): { phases: DevelopmentPhase[]; errors: string[] } {\n const knownFeatureIds = new Set(features.map(f => f.id));\n const knownConceptIds = new Set(concepts.map(c => c.id));\n const prereqOf = new Map<string, string[]>();\n for (const c of concepts) prereqOf.set(c.id, (c.prerequisites || []).filter(p => knownConceptIds.has(p)));\n\n const phases: DevelopmentPhase[] = [];\n const featurePhase = new Map<string, string>();\n const newIntroPhase = new Map<string, number>();\n const previewsSeen = new Set<string>();\n const previewPhase = new Map<string, number>();\n const errors: string[] = [];\n\n plan.forEach((rp, idx) => {\n const id = String(rp.id || ('PH' + (idx + 1)));\n const order = idx + 1;\n const name = String(rp.name || ('Phase ' + order)).slice(0, 80);\n const productCompletion = String(rp.product_completion || '').trim();\n const rawFeatureIds = Array.isArray(rp.feature_ids) ? rp.feature_ids.map(String) : [];\n const rawIntros = Array.isArray(rp.introduces) ? (rp.introduces as Array<Record<string, unknown>>) : [];\n\n if (!productCompletion) {\n errors.push('Phase ' + id + ': product_completion is empty - every phase must describe the product completion level');\n }\n\n const featureIdsForPhase: string[] = [];\n for (const fid of rawFeatureIds) {\n if (!knownFeatureIds.has(fid)) {\n errors.push('Phase ' + id + ': unknown feature ' + fid);\n continue;\n }\n if (featurePhase.has(fid)) {\n errors.push('Feature ' + fid + ' assigned to both ' + featurePhase.get(fid) + ' and ' + id + ' - each feature must belong to exactly one phase');\n continue;\n }\n featurePhase.set(fid, id);\n featureIdsForPhase.push(fid);\n }\n\n const introductions: ConceptIntroduction[] = [];\n for (const ri of rawIntros) {\n const cid = String(ri.concept_id || '');\n if (!knownConceptIds.has(cid)) {\n errors.push('Phase ' + id + ': introduces unknown concept ' + cid);\n continue;\n }\n const rawAspect = String(ri.aspect || 'new');\n const aspect: ConceptIntroduction['aspect'] = rawAspect === 'advanced' || rawAspect === 'preview' ? rawAspect : 'new';\n if (aspect === 'preview') {\n // Preview = light ULO awareness pass BEFORE the anchor teach. The\n // anchor 'new' still owns the full introduction (priming, 2026-09-17).\n if (newIntroPhase.has(cid)) {\n errors.push('Phase ' + id + ': preview of ' + cid + ' after its new introduction in phase ' + newIntroPhase.get(cid) + ' - preview must precede the anchor teach');\n continue;\n }\n if (previewsSeen.has(cid)) {\n errors.push('Phase ' + id + ': duplicate preview of ' + cid);\n continue;\n }\n previewsSeen.add(cid);\n previewPhase.set(cid, order);\n introductions.push({ concept_id: cid, aspect, note: String(ri.note || '') });\n continue;\n }\n if (aspect === 'advanced') {\n const first = newIntroPhase.get(cid);\n if (first === undefined) {\n errors.push('Phase ' + id + ': advanced introduction of ' + cid + ' before any new introduction - revisit requires prior introduction');\n continue;\n }\n if (first >= order) {\n errors.push('Phase ' + id + ': advanced introduction of ' + cid + ' must come after its new introduction in phase ' + first);\n continue;\n }\n } else if (newIntroPhase.has(cid)) {\n errors.push('Phase ' + id + ': duplicate new introduction of ' + cid + ' (already introduced in phase ' + newIntroPhase.get(cid) + ')');\n continue;\n } else {\n newIntroPhase.set(cid, order);\n }\n for (const pre of prereqOf.get(cid) || []) {\n if (!newIntroPhase.has(pre)) {\n errors.push('Phase ' + id + ': concept ' + cid + ' introduced before its prerequisite ' + pre + ' is introduced - violates the prerequisite chain');\n }\n }\n introductions.push({ concept_id: cid, aspect, note: String(ri.note || '') });\n }\n\n phases.push({\n id, order, name,\n product_completion: productCompletion,\n feature_ids: featureIdsForPhase,\n introduces: introductions,\n });\n });\n\n const missing = features.map(f => f.id).filter(fid => !featurePhase.has(fid));\n if (missing.length > 0) {\n errors.push('Features not assigned to any phase: ' + missing.join(', '));\n }\n const firstConsumerPhase = new Map<string, number>();\n const phaseOrderByFeature = new Map<string, number>();\n for (const ph of phases) for (const fid of ph.feature_ids) phaseOrderByFeature.set(fid, ph.order);\n for (const l of links) {\n const po = phaseOrderByFeature.get(l.feature_id);\n if (po === undefined) continue;\n const cur = firstConsumerPhase.get(l.concept_id);\n if (cur === undefined || po < cur) firstConsumerPhase.set(l.concept_id, po);\n }\n for (const [cid, consumerOrder] of firstConsumerPhase) {\n const intro = newIntroPhase.get(cid);\n const prev = previewPhase.get(cid);\n if (intro === undefined && prev === undefined) {\n errors.push('Concept ' + cid + ' is consumed from phase ' + consumerOrder + ' but never introduced in any phase');\n } else if (intro !== undefined && intro > consumerOrder && (prev === undefined || prev > consumerOrder)) {\n errors.push('Concept ' + cid + ' introduced in phase ' + intro + ' but first consumed in phase ' + consumerOrder + ' - introduction must come no later than first consumption (or a preview must cover the dependency)');\n }\n }\n for (const [cid, pOrder] of previewPhase) {\n const anchor = newIntroPhase.get(cid);\n if (anchor !== undefined && anchor <= pOrder) {\n errors.push('Concept ' + cid + ' previewed in phase ' + pOrder + ' but fully introduced in phase ' + anchor + ' - preview must precede the anchor introduction');\n }\n }\n\n return { phases, errors };\n}\n\nasync function decomposePhases(args: DecomposePhasesArgs): Promise<DevelopmentPhase[]> {\n const { features, concepts, links, client, log, warnings } = args;\n\n const featureList = features.map(f =>\n '- ' + f.id + ': ' + f.name + ' - ' + (f.description || '').slice(0, 120),\n ).join('\\n');\n\n const conceptList = concepts.map(c =>\n '- ' + c.id + ': ' + c.name + ' (prerequisites: ' + ((c.prerequisites || []).join(', ') || 'none') + ')',\n ).join('\\n');\n\n const linkList = links.map(l =>\n '- ' + l.feature_id + ' -> ' + l.concept_id + ' (' + l.depth + ')',\n ).join('\\n') || '(none)';\n\n const systemPrompt = (\n 'You decompose a software project build into PROGRESSIVE COMPLETION PHASES for learning purposes.\\n\\n'\n + 'A phase is NOT a feature and NOT a milestone list: it is a cross-feature slice of the\\n'\n + 'product whose completion yields a DEMONSTRABLY more complete product. Build up gradually:\\n'\n + 'the product grows feature by feature across phases, and each phase adds its features to\\n'\n + 'what previous phases already built.\\n\\n'\n + 'RULES:\\n'\n + '1. Every feature must be assigned to EXACTLY ONE phase (no feature reused, none skipped).\\n'\n + '2. Phases are ordered; later phases depend on earlier ones and yield a more complete product.\\n'\n + '3. product_completion describes concretely what the product can DO once the phase is done.\\n'\n + '4. introduces lists which concepts the phase must teach BEFORE its feature work starts:\\n'\n + ' - aspect new: first time the concept appears in the course\\n'\n + ' - aspect advanced: a concept introduced in an EARLIER phase, revisited here at a\\n'\n + ' higher depth (an advanced aspect of the same concept, e.g. validation rules on top\\n'\n + ' of basic data modeling). Use the note field to say which aspect.\\n'\n + ' - aspect preview: a light awareness pass (\\\"know it exists\\\", ULO depth only, ~5 min)\\n'\n + ' placed in an EARLIER phase when its feature work needs the vocabulary before the\\n'\n + ' full teach. The anchor phase still owns the full new introduction.\\n'\n + '5. A concept MUST be introduced (new) no later than the first phase that consumes it.\\n'\n + '6. A concept must not be introduced before its own prerequisites are introduced.\\n'\n + '7. Typically 3-6 phases for a small project; keep phases balanced.\\n'\n + '8. Phase 1 usually covers project setup/foundation features plus the first minimal slice.\\n'\n + '9. Return JSON only.'\n );\n\n const baseUserPrompt = 'FEATURES:\\n' + featureList + '\\n\\nCONCEPTS:\\n' + conceptList\n + '\\n\\nFEATURE-CONCEPT LINKS:\\n' + linkList + '\\n\\n'\n + 'Return JSON with a phases array. Each phase: { id: PH1, name, product_completion, feature_ids: [F0, F1], introduces: [{ concept_id: C1, aspect: new or advanced, note }] }.\\n';\n\n // Repair loop (same fail-closed philosophy as STEP_5 depth authoring): the audit below is\n // deterministic, so violations are fed back verbatim and the model rewrites the plan.\n const MAX_DECOMPOSE_ATTEMPTS = 3;\n let auditErrors: string[] = [];\n let phases: DevelopmentPhase[] = [];\n let rawPhases: Array<Record<string, unknown>> = [];\n for (let attempt = 1; attempt <= MAX_DECOMPOSE_ATTEMPTS; attempt++) {\n const userPrompt = attempt === 1\n ? baseUserPrompt\n : baseUserPrompt\n + '\\nYOUR PREVIOUS PLAN VIOLATED THESE CONTRACT RULES (fix ALL of them):\\n'\n + auditErrors.map((e) => '- ' + e).join('\\n')\n + '\\nReturn a corrected full phases array.\\n';\n\n const result = await llmChatJson(client, systemPrompt, userPrompt, {\n temperature: 0.1,\n maxTokens: 16384,\n });\n\n rawPhases = (result.phases || []) as Array<Record<string, unknown>>;\n if (rawPhases.length === 0) {\n if (attempt === MAX_DECOMPOSE_ATTEMPTS) {\n throw new Error('Phase decomposition returned zero phases - fail-closed abort');\n }\n auditErrors = ['Returned zero phases'];\n continue;\n }\n\n ({ phases, errors: auditErrors } = auditPhasePlan(rawPhases, features, concepts, links, warnings, log));\n if (auditErrors.length === 0) break;\n if (attempt < MAX_DECOMPOSE_ATTEMPTS) {\n log('STEP_2', 'Contract violations (' + auditErrors.length + ') - repairing (attempt ' + (attempt + 1) + '/' + MAX_DECOMPOSE_ATTEMPTS + ')');\n }\n }\n if (auditErrors.length > 0) {\n throw new Error(\n 'Phase decomposition violated the progressive-completion contract (' + auditErrors.length + ' issue(s)):\\n'\n + auditErrors.map((e) => ' - ' + e).join('\\n')\n + '\\nRe-run the pipeline - a phase model that cannot be trusted is worse than no output.',\n );\n }\n\n if (phases.length === 1 && features.length > 2) {\n warnings.push('Only one phase for ' + features.length + ' features - progressive decomposition likely too coarse');\n }\n\n log('STEP_2', 'Decomposed into ' + phases.length + ' phases: '\n + phases.map(p => p.id + '(' + p.feature_ids.length + 'F/' + p.introduces.length + 'K)').join(', '));\n return phases;\n}\n","/**\n * Hybrid Graph Pipeline Orchestrator.\n *\n * Runs: Hybrid Graph Generation -> CurriculumFeed v2 Emission.\n */\n\nimport { generateHybridGraph, type HybridGraphPipelineOptions } from '../graph/hybridGraphPipeline';\nimport { emitCurriculumFeed } from '../feed/curriculumFeedEmitter';\nimport type { HybridGraph } from '../schemas/hybridGraphSchema';\nimport type { CurriculumFeed } from '../schemas/curriculumFeedSchema';\n\nexport interface HybridPipelineOptions extends HybridGraphPipelineOptions {}\n\nexport interface HybridPipelineResult {\n hybridGraph: HybridGraph;\n curriculumFeed: CurriculumFeed;\n warnings: string[];\n}\n\n/**\n * Run the hybrid graph generation and feed emission pipeline.\n */\nexport async function runHybridGraphPipeline(\n options: HybridPipelineOptions,\n): Promise<HybridPipelineResult> {\n const warnings: string[] = [];\n const result = await generateHybridGraph(options);\n warnings.push(...result.warnings);\n\n const curriculumFeed = emitCurriculumFeed(result.hybridGraph, {\n warnings,\n });\n\n return {\n hybridGraph: result.hybridGraph,\n curriculumFeed,\n warnings,\n };\n}\n","/**\n * Input Type Detection — determines what kind of input the user provided.\n *\n * Signals:\n * repository: repoUrl, repoDir, or source code files present\n * syllabus: syllabusText, chapters[], or curriculum-like structure\n * files: non-code files (3D models, images, documents)\n * description: free-text description (>100 chars)\n * mixed: combination of the above\n */\n\nimport type { InputType } from '../schemas/domainProfileSchema';\n\nexport interface InputTypeDetectionResult {\n inputType: InputType;\n confidence: number;\n evidence: string[];\n}\n\nexport interface DetectInputTypeOptions {\n repoUrl?: string;\n repoDir?: string;\n description?: string;\n syllabusText?: string;\n chapters?: string[];\n fileExtensions?: string[];\n goal?: string;\n}\n\nconst CODE_EXTENSIONS = new Set([\n '.swift', '.ts', '.tsx', '.js', '.jsx', '.py', '.ino', '.cpp', '.c', '.h', '.hpp',\n '.kt', '.kts', '.java', '.cs', '.rb', '.go', '.rs', '.php', '.lua', '.r', '.m',\n]);\n\nconst NON_CODE_EXTENSIONS = new Set([\n '.stl', '.obj', '.step', '.stp', '.iges', '.igs', // 3D models\n '.png', '.jpg', '.jpeg', '.gif', '.svg', '.bmp', // Images\n '.pdf', '.doc', '.docx', '.pptx', '.xlsx', // Documents\n '.tc3', '.f3d', // CAD files\n '.mp3', '.wav', '.midi', // Audio\n '.mp4', '.avi', '.mov', // Video\n]);\n\n/**\n * Detect input type from user-provided options.\n */\nexport function detectInputType(options: DetectInputTypeOptions): InputTypeDetectionResult {\n const evidence: string[] = [];\n let repoScore = 0;\n let syllabusScore = 0;\n let filesScore = 0;\n let descriptionScore = 0;\n\n // Check for repository signals\n if (options.repoUrl) {\n repoScore += 0.5;\n evidence.push(`repoUrl provided: ${options.repoUrl}`);\n }\n if (options.repoDir) {\n repoScore += 0.5;\n evidence.push(`repoDir provided: ${options.repoDir}`);\n }\n\n // Check for syllabus signals\n if (options.syllabusText && options.syllabusText.length > 50) {\n syllabusScore += 0.6;\n evidence.push(`syllabusText provided (${options.syllabusText.length} chars)`);\n }\n if (options.chapters && options.chapters.length > 0) {\n syllabusScore += 0.4;\n evidence.push(`${options.chapters.length} chapters provided`);\n }\n\n // Check for file signals\n if (options.fileExtensions && options.fileExtensions.length > 0) {\n const codeCount = options.fileExtensions.filter(ext => CODE_EXTENSIONS.has(ext)).length;\n const nonCodeCount = options.fileExtensions.filter(ext => NON_CODE_EXTENSIONS.has(ext)).length;\n\n if (nonCodeCount > 0) {\n filesScore += 0.7;\n evidence.push(`${nonCodeCount} non-code files detected: ${options.fileExtensions.filter(ext => NON_CODE_EXTENSIONS.has(ext)).join(', ')}`);\n }\n if (codeCount > 0 && repoScore === 0) {\n repoScore += 0.3;\n evidence.push(`${codeCount} source code files detected`);\n }\n }\n\n // Check for description signals\n if (options.description && options.description.length > 100) {\n descriptionScore += 0.5;\n evidence.push(`description provided (${options.description.length} chars)`);\n }\n if (options.goal && options.goal.length > 20) {\n descriptionScore += 0.3;\n evidence.push(`goal provided (${options.goal.length} chars)`);\n }\n\n // Determine winner\n const scores = [\n { type: 'repository' as InputType, score: repoScore },\n { type: 'syllabus' as InputType, score: syllabusScore },\n { type: 'files' as InputType, score: filesScore },\n { type: 'description' as InputType, score: descriptionScore },\n ];\n\n scores.sort((a, b) => b.score - a.score);\n const winner = scores[0];\n\n // Check for mixed\n const activeTypes = scores.filter(s => s.score >= 0.3);\n if (activeTypes.length >= 2) {\n return {\n inputType: 'mixed',\n confidence: 0.7,\n evidence: [...evidence, `Mixed input detected: ${activeTypes.map(t => t.type).join(' + ')}`],\n };\n }\n\n if (winner.score === 0) {\n return {\n inputType: 'description',\n confidence: 0.3,\n evidence: [...evidence, 'No strong signals — defaulting to description'],\n };\n }\n\n return {\n inputType: winner.type,\n confidence: Math.min(winner.score, 1.0),\n evidence,\n };\n}\n","/**\n * Domain Category Detection — determines the subject domain from context.\n *\n * Uses multi-signal scoring:\n * - File extensions (code vs non-code, context-dependent)\n * - Keywords in description/goal (multi-language)\n * - Tech stack mentions\n * - Subject-specific vocabulary\n * - Disambiguation for overlapping domains (e.g., .cpp in software vs hardware)\n */\n\nimport type { DomainCategory } from '../schemas/domainProfileSchema';\n\nexport interface DomainDetectionResult {\n domainCategory: DomainCategory;\n confidence: number;\n evidence: string[];\n detectedTechStack: string[];\n detectedSubject: string;\n ambiguous?: { domain1: DomainCategory; domain2: DomainCategory; reason: string };\n}\n\nexport interface DetectDomainOptions {\n description?: string;\n goal?: string;\n syllabusText?: string;\n techStack?: string;\n fileExtensions?: string[];\n repoUrl?: string;\n}\n\n\n\n\n// ─── Keyword lists per domain (broad matching) ──────────────────────────────\nconst DOMAIN_KEYWORDS: Record<DomainCategory, string[]> = {\n software: [\n 'app', 'web', 'api', 'database', 'frontend', 'backend', 'mobile',\n 'swift', 'react', 'vue', 'angular', 'node', 'python', 'java',\n 'typescript', 'javascript', 'html', 'css', 'sql', 'rest', 'graphql',\n 'git', 'docker', 'kubernetes', 'ci/cd', 'deploy',\n 'swiftui', 'uikit', 'flutter', 'kotlin', 'android', 'ios',\n 'nextjs', 'nuxt', 'svelte', 'django', 'flask', 'express',\n ],\n hardware_iot: [\n 'arduino', 'robot', 'sensor', 'motor', 'esp32', 'gpio',\n 'raspberry pi', 'iot', 'firmware', 'embedded', 'microcontroller',\n 'led', 'servo', 'potentiometer', 'breadboard', 'soldering',\n 'i2c', 'spi', 'pwm', 'uart', 'analog', 'digital',\n 'ultrasonic', 'infrared', 'bluetooth', 'wifi module',\n 'pin', 'voltage', 'resistor', 'capacitor', 'circuit',\n ],\n '3d_design': [\n 'tinkercad', '3d model', 'cad', 'parametric', 'stl', 'obj',\n 'fusion360', 'blender', 'solidworks', 'autocad', 'freecad',\n 'shape', 'dimension', 'extrude', 'revolve', 'fillet', 'chamfer',\n 'assembly', 'constraint', 'sketch', 'plane', 'axis',\n 'render', 'mesh', 'nurbs', 'surface', 'volume',\n ],\n math: [\n // Vietnamese\n 'hình học', 'đại số', 'giải tích', 'xác suất', 'thống kê',\n 'tam giác', 'đường tròn', 'phương trình', 'bất phương trình',\n 'số học', 'tổ hợp', 'hoán vị', 'độ đo', 'góc', 'cạnh',\n 'diện tích', 'thể tích', 'chu vi', 'đường cao', 'trung tuyến',\n // English\n 'geometry', 'algebra', 'calculus', 'trigonometry', 'logarithm',\n 'probability', 'statistics', 'derivative', 'integral', 'matrix',\n 'vector', 'theorem', 'proof', 'angle', 'perimeter', 'area',\n // Chinese\n '几何', '代数', '微积分', '概率', '统计', '三角形', '圆', '方程',\n // Japanese\n '幾何', '代数', '微分', '積分', '確率', '統計',\n // French\n 'géométrie', 'algèbre', 'calcul', 'trigonométrie', 'probabilité',\n ],\n science: [\n // Vietnamese\n 'lý thuyết', 'nguyên lý', 'thí nghiệm', 'điện', 'lực',\n 'hóa học', 'sinh học', 'vật lý', 'địa lý',\n 'phản ứng', 'nguyên tố', 'phân tử',\n 'năng lượng', 'cảm ứng', 'từ trường', 'quang học',\n 'môi trường', 'sinh thái',\n // English\n 'physics', 'chemistry', 'biology', 'earth science',\n 'cell', 'gene', 'evolution', 'ecosystem', 'molecule', 'atom',\n // Chinese\n '物理', '化学', '生物', '地理',\n // Japanese\n '物理', '化学', '生物',\n // French\n 'physique', 'chimie', 'biologie',\n ],\n language: [\n // Vietnamese\n 'tiếng anh', 'tiếng việt', 'ngữ pháp', 'từ vựng',\n 'đọc', 'viết', 'nói', 'nghe',\n // English\n 'grammar', 'vocabulary', 'writing', 'reading', 'speaking',\n 'listening', 'pronunciation', 'essay', 'paragraph', 'sentence',\n 'verb', 'noun', 'adjective', 'ielts', 'toeic', 'toefl',\n // Chinese\n '英语', '语法', '词汇', '阅读', '写作',\n // Japanese\n '英語', '文法', '語彙', '読解', '作文',\n // French\n 'anglais', 'grammaire', 'vocabulaire', 'lecture', 'écriture',\n ],\n arts: [\n // Vietnamese\n 'âm nhạc', 'nhạc lý', 'solfège', 'đàn', 'piano', 'guitar',\n 'hội họa', 'thiết kế', 'nhiếp ảnh',\n 'tranh', 'màu', 'sáng tác', 'biên khúc',\n // English\n 'music', 'art', 'painting', 'drawing', 'sketch', 'photography',\n 'color theory', 'composition', 'typography', 'layout',\n 'digital art', 'illustration', 'figma',\n // Chinese\n '音乐', '美术', '绘画', '摄影', '设计',\n // Japanese\n '音楽', '美術', '絵画', '写真', 'デザイン',\n // French\n 'musique', 'art', 'peinture', 'dessin', 'photographie',\n ],\n research: [\n // Vietnamese\n 'nghiên cứu', 'thống kê', 'phương pháp luận', 'phân tích dữ liệu',\n 'định tính', 'định lượng', 'giả thuyết',\n 'mẫu', 'tổng thể', 'tương quan', 'hồi quy',\n 'tài liệu tham khảo', 'trích dẫn', 'tóm tắt',\n // English\n 'research', 'survey', 'methodology', 'data analysis',\n 'qualitative', 'quantitative', 'hypothesis', 'experiment',\n 'sample', 'population', 'correlation', 'regression',\n 'literature review', 'citation', 'abstract',\n // Chinese\n '研究', '调查', '方法论', '数据分析',\n // Japanese\n '研究', '調査', '方法論', 'データ分析',\n // French\n 'recherche', 'enquête', 'méthodologie', 'analyse de données',\n ],\n business: [\n // Vietnamese\n 'kinh doanh', 'tài chính', 'quản lý', 'marketing', 'bán hàng',\n 'khởi nghiệp', 'kế hoạch kinh doanh', 'doanh thu', 'lợi nhuận',\n 'quản trị', 'tài khoản', 'đầu tư', 'ngân sách',\n // English\n 'business', 'finance', 'accounting', 'investment', 'budget',\n 'startup', 'revenue', 'profit', 'roi', 'sales',\n 'product management', 'agile', 'scrum', 'kanban',\n // Chinese\n '商业', '金融', '会计', '投资', '营销',\n // Japanese\n 'ビジネス', '金融', '会計', '投資', 'マーケティング',\n // French\n 'affaires', 'finance', 'comptabilité', 'investissement',\n ],\n other: [],\n};\n\n// ─── Extension → Domain mapping (context-dependent for ambiguous extensions) ──\nconst EXTENSION_DOMAIN: Record<string, DomainCategory> = {\n '.swift': 'software',\n '.ts': 'software', '.tsx': 'software',\n '.js': 'software', '.jsx': 'software',\n '.py': 'software',\n '.kt': 'software', '.kts': 'software',\n '.java': 'software', '.cs': 'software',\n '.go': 'software', '.rs': 'software',\n '.rb': 'software', '.php': 'software',\n '.lua': 'software', '.r': 'software',\n // .ino is ALWAYS hardware\n '.ino': 'hardware_iot',\n // .cpp/.c/.h are CONTEXT-DEPENDENT → resolve in detection logic\n '.stl': '3d_design', '.obj': '3d_design',\n '.step': '3d_design', '.stp': '3d_design',\n '.tc3': '3d_design', '.f3d': '3d_design',\n};\n\n// Extensions that need context disambiguation\nconst AMBIGUOUS_EXTENSIONS = new Set(['.cpp', '.c', '.h', '.hpp']);\n\n// ─── Syllabus language detection ─────────────────────────────────────────────\nconst LANG_PATTERNS: Array<{ lang: string; patterns: RegExp[] }> = [\n { lang: 'vi', patterns: [/[ạảãàáạảãạ]/i, /\\bgiải\\b/, /\\btính\\b/] },\n { lang: 'zh', patterns: [/[\\u4e00-\\u9fff]{2,}/] },\n { lang: 'ja', patterns: [/[\\u3040-\\u309f\\u30a0-\\u30ff]{2,}/] },\n { lang: 'ko', patterns: [/[\\uac00-\\ud7af]{2,}/] },\n { lang: 'fr', patterns: [/\\b(la|le|les|des|une|est|sont|avec|pour|dans)\\b/i] },\n];\n\nfunction detectSyllabusLanguage(text: string): string {\n for (const { lang, patterns } of LANG_PATTERNS) {\n if (patterns.some(p => p.test(text))) return lang;\n }\n return 'en';\n}\n\n// ─── Main Detection Function ─────────────────────────────────────────────────\nexport function detectDomain(options: DetectDomainOptions): DomainDetectionResult {\n const evidence: string[] = [];\n const detectedTechStack: string[] = [];\n let detectedSubject = '';\n let ambiguous: DomainDetectionResult['ambiguous'];\n\n const scores: Record<DomainCategory, number> = {\n software: 0, hardware_iot: 0, '3d_design': 0,\n math: 0, science: 0, language: 0, arts: 0,\n research: 0, business: 0, other: 0,\n };\n\n // ─── 1. File Extension Signals ───────────────────────────────────────────\n const hasHardwareContext = !!(\n options.techStack?.toLowerCase().match(/arduino|esp32|raspberry|embedded|iot/)\n || options.description?.toLowerCase().match(/arduino|robot|sensor|motor|circuit/)\n || options.goal?.toLowerCase().match(/arduino|robot|sensor|motor|circuit/)\n );\n\n const hasSoftwareContext = !!(\n options.techStack?.toLowerCase().match(/swift|react|vue|angular|python|java|typescript|javascript/)\n || options.description?.toLowerCase().match(/app|web|api|frontend|backend|mobile/)\n || options.goal?.toLowerCase().match(/app|web|api|frontend|backend|mobile/)\n );\n\n if (options.fileExtensions) {\n for (const ext of options.fileExtensions) {\n const extLower = ext.toLowerCase();\n\n // Always-hardware extensions\n if (extLower === '.ino') {\n scores.hardware_iot += 0.5;\n evidence.push(`File extension ${ext} → hardware_iot (always)`);\n continue;\n }\n\n // Ambiguous extensions → context-dependent\n if (AMBIGUOUS_EXTENSIONS.has(extLower)) {\n if (hasHardwareContext && !hasSoftwareContext) {\n scores.hardware_iot += 0.3;\n evidence.push(`File extension ${ext} → hardware_iot (hardware context)`);\n } else if (hasSoftwareContext && !hasHardwareContext) {\n scores.software += 0.3;\n evidence.push(`File extension ${ext} → software (software context)`);\n } else if (hasHardwareContext && hasSoftwareContext) {\n // Both contexts → slight preference for software (more common for .cpp)\n scores.software += 0.15;\n scores.hardware_iot += 0.15;\n evidence.push(`File extension ${ext} → ambiguous (both software and hardware context)`);\n ambiguous = {\n domain1: 'software',\n domain2: 'hardware_iot',\n reason: `.cpp/.c/.h files present with both software and hardware context keywords`,\n };\n } else {\n // No context → default to software\n scores.software += 0.2;\n evidence.push(`File extension ${ext} → software (default, no context)`);\n }\n continue;\n }\n\n // Clear mapping extensions\n const domain = EXTENSION_DOMAIN[extLower];\n if (domain) {\n scores[domain] += 0.3;\n evidence.push(`File extension ${ext} → ${domain}`);\n }\n }\n }\n\n // ─── 2. Text Content Signals (multi-language) ─────────────────────────────\n const textContent = [\n options.description || '',\n options.goal || '',\n options.syllabusText || '',\n ].join(' ').toLowerCase();\n\n for (const [domain, keywords] of Object.entries(DOMAIN_KEYWORDS)) {\n const cat = domain as DomainCategory;\n for (const kw of keywords) {\n if (textContent.includes(kw.toLowerCase())) {\n scores[cat] += 0.1;\n if (!evidence.some(e => e.includes(`\"${kw}\"`))) {\n evidence.push(`Keyword \"${kw}\" → ${cat}`);\n }\n }\n }\n }\n\n // ─── 3. Tech Stack Signals ────────────────────────────────────────────────\n if (options.techStack) {\n const techItems = options.techStack.split(',').map(t => t.trim());\n for (const tech of techItems) {\n const techL = tech.toLowerCase();\n if (['swift', 'swiftui', 'uikit', 'ios'].some(k => techL.includes(k))) {\n scores.software += 0.4;\n detectedTechStack.push(tech);\n } else if (['react', 'vue', 'angular', 'next', 'nuxt', 'typescript', 'javascript'].some(k => techL.includes(k))) {\n scores.software += 0.4;\n detectedTechStack.push(tech);\n } else if (['python', 'django', 'flask'].some(k => techL.includes(k))) {\n scores.software += 0.3;\n detectedTechStack.push(tech);\n } else if (['arduino', 'esp32', 'raspberry'].some(k => techL.includes(k))) {\n scores.hardware_iot += 0.5;\n detectedTechStack.push(tech);\n } else if (['tinkercad', 'fusion360', 'blender'].some(k => techL.includes(k))) {\n scores['3d_design'] += 0.5;\n detectedTechStack.push(tech);\n } else if (['c++', 'c', 'cpp'].some(k => techL === k || techL.endsWith(k))) {\n // C++/C → context-dependent\n if (hasHardwareContext) {\n scores.hardware_iot += 0.3;\n } else {\n scores.software += 0.3;\n }\n detectedTechStack.push(tech);\n }\n }\n }\n\n // ─── 4. Syllabus Content Signals (with language detection) ────────────────\n if (options.syllabusText) {\n const syllabusLang = detectSyllabusLanguage(options.syllabusText);\n const syllabusLower = options.syllabusText.toLowerCase();\n\n if (syllabusLower.includes('hình học') || syllabusLower.includes('đại số')\n || syllabusLower.includes('geometry') || syllabusLower.includes('algebra')\n || syllabusLower.includes('几何') || syllabusLower.includes('代数')\n || syllabusLower.includes('幾何') || syllabusLower.includes('代数')\n || syllabusLower.includes('géométrie') || syllabusLower.includes('algèbre')) {\n scores.math += 0.5;\n detectedSubject = 'Mathematics';\n } else if (syllabusLower.includes('vật lý') || syllabusLower.includes('hóa')\n || syllabusLower.includes('sinh') || syllabusLower.includes('physics')\n || syllabusLower.includes('chemistry') || syllabusLower.includes('biology')\n || syllabusLower.includes('物理') || syllabusLower.includes('化学')\n || syllabusLower.includes('物理') || syllabusLower.includes('化学')\n || syllabusLower.includes('physique') || syllabusLower.includes('chimie')) {\n scores.science += 0.5;\n detectedSubject = 'Natural Science';\n } else if (syllabusLower.includes('tiếng anh') || syllabusLower.includes('english')\n || syllabusLower.includes('grammar') || syllabusLower.includes('英语')\n || syllabusLower.includes('英語') || syllabusLower.includes('anglais')) {\n scores.language += 0.5;\n detectedSubject = 'English Language';\n }\n\n evidence.push(`Syllabus language detected: ${syllabusLang}`);\n }\n\n // ─── 5. Scoring & Winner ─────────────────────────────────────────────────\n const entries = Object.entries(scores).filter(([k]) => k !== 'other') as [DomainCategory, number][];\n entries.sort((a, b) => b[1] - a[1]);\n const [winner, winnerScore] = entries[0];\n\n if (winnerScore === 0) {\n return {\n domainCategory: 'other',\n confidence: 0.2,\n evidence: [...evidence, 'No domain signals detected'],\n detectedTechStack,\n detectedSubject,\n };\n }\n\n // Check for near-tie (within 0.15) → ambiguous\n const second = entries[1];\n if (second && (winnerScore - second[1]) < 0.15 && winnerScore > 0) {\n ambiguous = {\n domain1: winner,\n domain2: second[0],\n reason: `Scores very close: ${winner}=${winnerScore.toFixed(2)}, ${second[0]}=${second[1].toFixed(2)}`,\n };\n }\n\n const totalScore = entries.reduce((sum, [, s]) => sum + s, 0);\n const confidence = totalScore > 0 ? Math.min(winnerScore / totalScore + 0.3, 1.0) : 0.3;\n\n return {\n domainCategory: winner,\n confidence,\n evidence: evidence.slice(0, 20),\n detectedTechStack,\n detectedSubject,\n ambiguous,\n };\n}\n","/**\n * Learning Mode Detection — determines product vs concept vs hybrid.\n *\n * Logic:\n * - Repository + build verbs → product\n * - Syllabus + no source code → concept\n * - Repository + understanding verbs → hybrid\n * - Domain category heuristic (math/science → concept, software/hardware → product)\n */\n\nimport type { LearningMode, DomainCategory, InputType } from '../schemas/domainProfileSchema';\n\nexport interface LearningModeDetectionResult {\n learningMode: LearningMode;\n confidence: number;\n evidence: string[];\n}\n\nexport interface DetectLearningModeOptions {\n inputType: InputType;\n domainCategory: DomainCategory;\n goal?: string;\n description?: string;\n hasRepo: boolean;\n hasSyllabus: boolean;\n}\n\n// ─── Verb patterns ───────────────────────────────────────────────────────────\n\nconst BUILD_VERBS = [\n 'build', 'create', 'develop', 'implement', 'construct', 'make',\n 'xây dựng', 'tạo', 'phát triển', 'triển khai', 'lắp ráp',\n 'code', 'program', 'design a', 'set up', 'deploy',\n];\n\nconst UNDERSTAND_VERBS = [\n 'understand', 'learn', 'grasp', 'comprehend', 'master',\n 'hiểu', 'nắm vững', 'học', 'tiếp thu', 'am hiểu',\n 'vận dụng', 'phân tích', 'đánh giá', 'so sánh',\n 'explain', 'describe', 'analyze', 'evaluate', 'compare',\n];\n\nconst CONCEPT_DOMAINS: DomainCategory[] = ['math', 'science', 'language', 'arts', 'research', 'business'];\nconst PRODUCT_DOMAINS: DomainCategory[] = ['software', 'hardware_iot', '3d_design'];\n\n/**\n * Detect learning mode from context.\n */\nexport function detectLearningMode(options: DetectLearningModeOptions): LearningModeDetectionResult {\n const evidence: string[] = [];\n const text = [options.goal || '', options.description || ''].join(' ').toLowerCase();\n\n let productScore = 0;\n let conceptScore = 0;\n\n // 1. Input type signals\n if (options.hasRepo) {\n productScore += 0.3;\n evidence.push('Repository present → product signal');\n }\n if (options.hasSyllabus) {\n conceptScore += 0.3;\n evidence.push('Syllabus present → concept signal');\n }\n\n // 2. Domain category heuristic\n if (PRODUCT_DOMAINS.includes(options.domainCategory)) {\n productScore += 0.2;\n evidence.push(`Domain ${options.domainCategory} → product倾向`);\n }\n if (CONCEPT_DOMAINS.includes(options.domainCategory)) {\n conceptScore += 0.2;\n evidence.push(`Domain ${options.domainCategory} → concept倾向`);\n }\n\n // 3. Verb pattern matching\n const hasBuildVerbs = BUILD_VERBS.some(v => text.includes(v));\n const hasUnderstandVerbs = UNDERSTAND_VERBS.some(v => text.includes(v));\n\n if (hasBuildVerbs) {\n productScore += 0.3;\n evidence.push('Build verbs detected in goal/description');\n }\n if (hasUnderstandVerbs) {\n conceptScore += 0.3;\n evidence.push('Understand verbs detected in goal/description');\n }\n\n // 4. Determine mode\n const total = productScore + conceptScore;\n if (total === 0) {\n return {\n learningMode: 'product',\n confidence: 0.3,\n evidence: [...evidence, 'No signals — defaulting to product'],\n };\n }\n\n // Check for hybrid\n if (productScore >= 0.3 && conceptScore >= 0.3) {\n const hybridConf = Math.min((productScore + conceptScore) / 2, 1.0);\n return {\n learningMode: 'hybrid',\n confidence: hybridConf,\n evidence: [...evidence, `Mixed signals: product=${productScore.toFixed(2)}, concept=${conceptScore.toFixed(2)} → hybrid`],\n };\n }\n\n if (productScore > conceptScore) {\n const raw = total > 0 ? productScore / total : 0.5;\n return {\n learningMode: 'product',\n confidence: Math.min(Math.max(raw, 0) + 0.2, 1.0),\n evidence,\n };\n }\n\n const raw = total > 0 ? conceptScore / total : 0.5;\n return {\n learningMode: 'concept',\n confidence: Math.min(Math.max(raw, 0) + 0.2, 1.0),\n evidence,\n };\n}\n","/**\n * Domain Profile Detection Orchestrator — combines all detection modules.\n */\n\nimport { detectInputType, type DetectInputTypeOptions } from './inputTypeDetector';\nimport { detectDomain, type DetectDomainOptions } from './domainDetector';\nimport { detectLearningMode } from './learningModeDetector';\nimport type { DomainProfile, GraphType } from '../schemas/domainProfileSchema';\nimport type { ParsedSyllabus } from '../parsers/syllabusParser';\n\nexport interface DetectDomainProfileOptions {\n repoUrl?: string;\n repoDir?: string;\n description?: string;\n goal?: string;\n syllabusText?: string;\n parsedSyllabus?: ParsedSyllabus;\n chapters?: string[];\n fileExtensions?: string[];\n techStack?: string;\n gradeBand?: [number, number];\n}\n\nexport function detectDomainProfile(options: DetectDomainProfileOptions): DomainProfile {\n const effectiveSyllabus = options.syllabusText || options.parsedSyllabus?.rawText || '';\n const inputResult = detectInputType({\n ...options,\n syllabusText: effectiveSyllabus,\n });\n\n const domainResult = detectDomain({\n description: options.description,\n goal: options.goal,\n syllabusText: effectiveSyllabus,\n techStack: options.techStack,\n fileExtensions: options.fileExtensions,\n repoUrl: options.repoUrl,\n });\n\n const modeResult = detectLearningMode({\n inputType: inputResult.inputType,\n domainCategory: domainResult.domainCategory,\n goal: options.goal,\n description: options.description,\n hasRepo: !!(options.repoUrl || options.repoDir),\n hasSyllabus: !!(effectiveSyllabus || (options.chapters && options.chapters.length > 0) || options.parsedSyllabus),\n });\n\n const graphType = determineGraphType(modeResult.learningMode);\n\n return {\n inputType: inputResult.inputType,\n domainCategory: (domainResult.domainCategory === 'other' && options.parsedSyllabus?.subject.domain)\n ? (options.parsedSyllabus.subject.domain as any)\n : domainResult.domainCategory,\n learningMode: modeResult.learningMode,\n graphType,\n confidence: {\n inputType: inputResult.confidence,\n domainCategory: domainResult.confidence,\n learningMode: modeResult.confidence,\n },\n evidence: [...inputResult.evidence, ...domainResult.evidence, ...modeResult.evidence],\n detectedTechStack: domainResult.detectedTechStack,\n detectedSubject: options.parsedSyllabus?.subject.title || domainResult.detectedSubject,\n detectedDomain: domainResult.domainCategory,\n goal: options.goal || '',\n description: options.description || '',\n repoUrl: options.repoUrl || '',\n repoDir: options.repoDir || '',\n syllabusText: effectiveSyllabus,\n };\n}\n\nfunction determineGraphType(learningMode: string): GraphType {\n switch (learningMode) {\n case 'product': return 'project_graph';\n case 'concept': return 'knowledge_graph';\n case 'hybrid': return 'hybrid_graph';\n default: return 'project_graph';\n }\n}\n","/**\n * Unified Domain Pipeline Router.\n *\n * Implements the 3-Layer Architecture from docs/ideas/2026-08-30-domain-detection-and-graph-types.md:\n * Layer 1: DOMAIN DETECTION (detectDomainProfile)\n * Layer 2: GRAPH ROUTER (routeDomain)\n * Layer 3: GRAPH GENERATION (runProjectGraphPipeline | runKnowledgeGraphPipeline | runHybridGraphPipeline)\n * Layer 4: NORMALIZED OUTPUT (CurriculumFeed v2)\n */\n\nimport { detectDomainProfile, type DetectDomainProfileOptions } from '../detector/domainProfileDetector';\nimport type { DomainProfile, GraphType } from '../schemas/domainProfileSchema';\nimport type { CurriculumFeed } from '../schemas/curriculumFeedSchema';\nimport { runProjectGraphPipeline, type PipelineOptions, type PipelineResult } from './projectGraphPipeline';\nimport { runKnowledgeGraphPipeline, type KnowledgePipelineOptions, type KnowledgePipelineResult } from './knowledgeGraphPipeline';\nimport { runHybridGraphPipeline, type HybridPipelineOptions, type HybridPipelineResult } from './hybridGraphPipeline';\nimport type { LlmClientConfig } from '../utils/llmClient';\nimport type { ParsedSyllabus } from '../parsers/syllabusParser';\n\nexport interface DomainPipelineOptions extends DetectDomainProfileOptions {\n subject?: string;\n llmConfig?: LlmClientConfig;\n onProgress?: (step: string, message: string) => void;\n parsedSyllabus?: ParsedSyllabus;\n knowledgeTreePath?: string;\n proposalsPath?: string;\n embeddings?: Record<string, { embedding?: number[]; name?: string; description?: string; keywords?: string }>;\n /** Override automatic learning mode detection */\n forcedLearningMode?: 'product' | 'concept' | 'hybrid';\n}\n\nexport interface DomainPipelineResult {\n domainProfile: DomainProfile;\n graphType: GraphType;\n curriculumFeed: CurriculumFeed;\n projectResult?: PipelineResult;\n knowledgeResult?: KnowledgePipelineResult;\n hybridResult?: HybridPipelineResult;\n warnings: string[];\n}\n\n/**\n * Route and execute the appropriate domain pipeline based on input context.\n */\nexport async function runDomainPipeline(\n options: DomainPipelineOptions,\n): Promise<DomainPipelineResult> {\n const warnings: string[] = [];\n const log = (step: string, msg: string) => {\n console.log(`[ROUTER-${step}] ${msg}`);\n options.onProgress?.(step, msg);\n };\n\n // ─── Layer 1: Domain Detection ───────────────────────────────────────────\n log('LAYER_1', 'Detecting domain profile...');\n const domainProfile = detectDomainProfile(options);\n\n const effectiveMode = options.forcedLearningMode || domainProfile.learningMode;\n log('LAYER_2', `Routing to pipeline for learning mode: ${effectiveMode} (graphType: ${domainProfile.graphType})`);\n\n // ─── Layer 3: Dispatch & Execute ─────────────────────────────────────────\n if (effectiveMode === 'concept') {\n log('LAYER_3', 'Executing Knowledge Graph Pipeline (Concept-driven)...');\n const knowledgeResult = await runKnowledgeGraphPipeline({\n subject: options.subject || domainProfile.detectedSubject || options.goal || options.description || 'General Subject',\n description: options.description,\n syllabusText: options.syllabusText,\n parsedSyllabus: options.parsedSyllabus,\n gradeBand: options.gradeBand,\n domain: domainProfile.domainCategory,\n techStack: options.techStack || domainProfile.detectedTechStack?.[0],\n llmConfig: options.llmConfig,\n onProgress: options.onProgress,\n knowledgeTreePath: options.knowledgeTreePath,\n proposalsPath: options.proposalsPath,\n });\n warnings.push(...knowledgeResult.warnings);\n\n return {\n domainProfile,\n graphType: 'knowledge_graph',\n curriculumFeed: knowledgeResult.curriculumFeed,\n knowledgeResult,\n warnings,\n };\n }\n\n if (effectiveMode === 'hybrid') {\n log('LAYER_3', 'Executing Hybrid Graph Pipeline...');\n if (options.repoDir) {\n const projectResult = await runProjectGraphPipeline({\n repoDir: options.repoDir,\n goal: options.goal || 'Build complete project',\n techStack: options.techStack || 'typescript',\n llmConfig: options.llmConfig,\n embeddings: options.embeddings,\n onProgress: options.onProgress,\n });\n\n const knowledgeResult = await runKnowledgeGraphPipeline({\n subject: options.subject || domainProfile.detectedSubject || options.goal || 'Subject Theory',\n description: options.description,\n syllabusText: options.syllabusText,\n parsedSyllabus: options.parsedSyllabus,\n domain: domainProfile.domainCategory,\n techStack: options.techStack,\n llmConfig: options.llmConfig,\n onProgress: options.onProgress,\n });\n\n const hybridResult = await runHybridGraphPipeline({\n projectGraph: projectResult.projectGraph,\n knowledgeGraph: knowledgeResult.knowledgeGraph,\n llmConfig: options.llmConfig,\n onProgress: options.onProgress,\n });\n\n warnings.push(...hybridResult.warnings);\n return {\n domainProfile,\n graphType: 'hybrid_graph',\n curriculumFeed: hybridResult.curriculumFeed,\n projectResult,\n knowledgeResult,\n hybridResult,\n warnings,\n };\n } else {\n warnings.push('Hybrid learning mode requested but repoDir was not provided — falling back to concept-driven knowledge graph pipeline');\n const knowledgeResult = await runKnowledgeGraphPipeline({\n subject: options.subject || domainProfile.detectedSubject || options.goal || 'Subject Theory',\n description: options.description,\n syllabusText: options.syllabusText,\n parsedSyllabus: options.parsedSyllabus,\n domain: domainProfile.domainCategory,\n techStack: options.techStack,\n llmConfig: options.llmConfig,\n onProgress: options.onProgress,\n });\n warnings.push(...knowledgeResult.warnings);\n\n return {\n domainProfile,\n graphType: 'knowledge_graph',\n curriculumFeed: knowledgeResult.curriculumFeed,\n knowledgeResult,\n warnings,\n };\n }\n }\n\n // Default: product-driven\n log('LAYER_3', 'Executing Project Graph Pipeline (Product-driven)...');\n if (!options.repoDir) {\n throw new Error('repoDir is required for product-driven project graph pipeline');\n }\n\n const projectResult = await runProjectGraphPipeline({\n repoDir: options.repoDir,\n goal: options.goal || 'Build complete project',\n techStack: options.techStack || domainProfile.detectedTechStack?.[0] || 'typescript',\n llmConfig: options.llmConfig,\n embeddings: options.embeddings,\n onProgress: options.onProgress,\n });\n\n // Emit curriculum feed from project graph\n const { emitCurriculumFeed } = await import('../feed/curriculumFeedEmitter');\n const curriculumFeed = emitCurriculumFeed(projectResult.projectGraph, {\n warnings,\n });\n\n return {\n domainProfile,\n graphType: 'project_graph',\n curriculumFeed,\n projectResult,\n warnings,\n };\n}\n"]}
|