@nonameolsson/nightjar 0.0.0-stage → 0.2.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/LICENSE +21 -0
- package/README.md +405 -2
- package/dist/account.d.ts +12 -0
- package/dist/account.js +57 -0
- package/dist/account.js.map +1 -0
- package/dist/adapter-module.d.ts +18 -0
- package/dist/adapter-module.js +83 -0
- package/dist/adapter-module.js.map +1 -0
- package/dist/adapters.d.ts +15 -0
- package/dist/adapters.js +160 -0
- package/dist/adapters.js.map +1 -0
- package/dist/args.d.ts +13 -0
- package/dist/args.js +84 -0
- package/dist/args.js.map +1 -0
- package/dist/ask.d.ts +6 -0
- package/dist/ask.js +27 -0
- package/dist/ask.js.map +1 -0
- package/dist/azure-devops/api.d.ts +34 -0
- package/dist/azure-devops/api.js +98 -0
- package/dist/azure-devops/api.js.map +1 -0
- package/dist/azure-devops/code-host.d.ts +36 -0
- package/dist/azure-devops/code-host.js +185 -0
- package/dist/azure-devops/code-host.js.map +1 -0
- package/dist/azure-devops/fake-azure-devops.d.ts +90 -0
- package/dist/azure-devops/fake-azure-devops.js +728 -0
- package/dist/azure-devops/fake-azure-devops.js.map +1 -0
- package/dist/azure-devops/index.d.ts +8 -0
- package/dist/azure-devops/index.js +11 -0
- package/dist/azure-devops/index.js.map +1 -0
- package/dist/azure-devops/sign-in.d.ts +11 -0
- package/dist/azure-devops/sign-in.js +68 -0
- package/dist/azure-devops/sign-in.js.map +1 -0
- package/dist/azure-devops/text.d.ts +1 -0
- package/dist/azure-devops/text.js +41 -0
- package/dist/azure-devops/text.js.map +1 -0
- package/dist/azure-devops/tracker.d.ts +44 -0
- package/dist/azure-devops/tracker.js +333 -0
- package/dist/azure-devops/tracker.js.map +1 -0
- package/dist/build.d.ts +75 -0
- package/dist/build.js +698 -0
- package/dist/build.js.map +1 -0
- package/dist/check.d.ts +8 -0
- package/dist/check.js +25 -0
- package/dist/check.js.map +1 -0
- package/dist/checks.d.ts +45 -0
- package/dist/checks.js +243 -0
- package/dist/checks.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +11 -0
- package/dist/cli.js.map +1 -0
- package/dist/code-host.d.ts +19 -0
- package/dist/code-host.js +2 -0
- package/dist/code-host.js.map +1 -0
- package/dist/config.d.ts +86 -0
- package/dist/config.js +294 -0
- package/dist/config.js.map +1 -0
- package/dist/contract/case.d.ts +4 -0
- package/dist/contract/case.js +2 -0
- package/dist/contract/case.js.map +1 -0
- package/dist/contract/code-host.d.ts +24 -0
- package/dist/contract/code-host.js +108 -0
- package/dist/contract/code-host.js.map +1 -0
- package/dist/contract/command.d.ts +2 -0
- package/dist/contract/command.js +36 -0
- package/dist/contract/command.js.map +1 -0
- package/dist/contract/feature-writer.d.ts +3 -0
- package/dist/contract/feature-writer.js +101 -0
- package/dist/contract/feature-writer.js.map +1 -0
- package/dist/contract/run.d.ts +18 -0
- package/dist/contract/run.js +89 -0
- package/dist/contract/run.js.map +1 -0
- package/dist/contract/tracker.d.ts +30 -0
- package/dist/contract/tracker.js +250 -0
- package/dist/contract/tracker.js.map +1 -0
- package/dist/create.d.ts +9 -0
- package/dist/create.js +112 -0
- package/dist/create.js.map +1 -0
- package/dist/doctor.d.ts +4 -0
- package/dist/doctor.js +42 -0
- package/dist/doctor.js.map +1 -0
- package/dist/fakes/code-host.d.ts +21 -0
- package/dist/fakes/code-host.js +42 -0
- package/dist/fakes/code-host.js.map +1 -0
- package/dist/fakes/harness.d.ts +7 -0
- package/dist/fakes/harness.js +68 -0
- package/dist/fakes/harness.js.map +1 -0
- package/dist/fakes/machine.d.ts +11 -0
- package/dist/fakes/machine.js +101 -0
- package/dist/fakes/machine.js.map +1 -0
- package/dist/fakes/tracker.d.ts +40 -0
- package/dist/fakes/tracker.js +116 -0
- package/dist/fakes/tracker.js.map +1 -0
- package/dist/feature-file.d.ts +12 -0
- package/dist/feature-file.js +84 -0
- package/dist/feature-file.js.map +1 -0
- package/dist/git.d.ts +9 -0
- package/dist/git.js +12 -0
- package/dist/git.js.map +1 -0
- package/dist/github/api.d.ts +37 -0
- package/dist/github/api.js +66 -0
- package/dist/github/api.js.map +1 -0
- package/dist/github/code-host.d.ts +19 -0
- package/dist/github/code-host.js +105 -0
- package/dist/github/code-host.js.map +1 -0
- package/dist/github/fake-gh.d.ts +17 -0
- package/dist/github/fake-gh.js +51 -0
- package/dist/github/fake-gh.js.map +1 -0
- package/dist/github/fake-github.d.ts +58 -0
- package/dist/github/fake-github.js +285 -0
- package/dist/github/fake-github.js.map +1 -0
- package/dist/github/labels.d.ts +3 -0
- package/dist/github/labels.js +44 -0
- package/dist/github/labels.js.map +1 -0
- package/dist/github/tracker.d.ts +28 -0
- package/dist/github/tracker.js +208 -0
- package/dist/github/tracker.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +19 -0
- package/dist/init.js +225 -0
- package/dist/init.js.map +1 -0
- package/dist/ledger.d.ts +13 -0
- package/dist/ledger.js +49 -0
- package/dist/ledger.js.map +1 -0
- package/dist/main.d.ts +11 -0
- package/dist/main.js +215 -0
- package/dist/main.js.map +1 -0
- package/dist/person-config.d.ts +9 -0
- package/dist/person-config.js +46 -0
- package/dist/person-config.js.map +1 -0
- package/dist/plan.d.ts +9 -0
- package/dist/plan.js +27 -0
- package/dist/plan.js.map +1 -0
- package/dist/ports.d.ts +16 -0
- package/dist/ports.js +104 -0
- package/dist/ports.js.map +1 -0
- package/dist/prompt.d.ts +166 -0
- package/dist/prompt.js +217 -0
- package/dist/prompt.js.map +1 -0
- package/dist/queue.d.ts +20 -0
- package/dist/queue.js +94 -0
- package/dist/queue.js.map +1 -0
- package/dist/say.d.ts +2 -0
- package/dist/say.js +4 -0
- package/dist/say.js.map +1 -0
- package/dist/serve.d.ts +10 -0
- package/dist/serve.js +85 -0
- package/dist/serve.js.map +1 -0
- package/dist/session.d.ts +39 -0
- package/dist/session.js +144 -0
- package/dist/session.js.map +1 -0
- package/dist/settings.d.ts +10 -0
- package/dist/settings.js +92 -0
- package/dist/settings.js.map +1 -0
- package/dist/signals.d.ts +5 -0
- package/dist/signals.js +13 -0
- package/dist/signals.js.map +1 -0
- package/dist/skills.d.ts +4 -0
- package/dist/skills.js +51 -0
- package/dist/skills.js.map +1 -0
- package/dist/status-shape.d.ts +53 -0
- package/dist/status-shape.js +3 -0
- package/dist/status-shape.js.map +1 -0
- package/dist/status.d.ts +23 -0
- package/dist/status.js +56 -0
- package/dist/status.js.map +1 -0
- package/dist/tracker.d.ts +56 -0
- package/dist/tracker.js +12 -0
- package/dist/tracker.js.map +1 -0
- package/dist/workflow.d.ts +33 -0
- package/dist/workflow.js +53 -0
- package/dist/workflow.js.map +1 -0
- package/dist/worktree.d.ts +44 -0
- package/dist/worktree.js +193 -0
- package/dist/worktree.js.map +1 -0
- package/docs/ticket-contract.md +95 -0
- package/package.json +74 -5
- package/plugin/nightjar-status/.claude-plugin/plugin.json +5 -0
- package/plugin/nightjar-status/hooks/format.ts +48 -0
- package/plugin/nightjar-status/hooks/hooks.json +1 -0
- package/plugin/nightjar-status/hooks/register.ts +51 -0
- package/schema/factory.schema.json +437 -0
- package/skills/nightjar-feature/SKILL.md +73 -0
- package/src/status-shape.ts +44 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-azure-devops.js","sourceRoot":"","sources":["../../src/azure-devops/fake-azure-devops.ts"],"names":[],"mappings":"AAwEA,MAAM,KAAK,GAAG,0BAA0B,CAAC;AACzC,MAAM,GAAG,GAAG,KAAK,CAAC;AAClB,MAAM,YAAY,GAAG,eAAe,CAAC;AAErC,MAAM,KAAK,GAAG,gBAAgB,CAAC;AAC/B,MAAM,KAAK,GAAG,oCAAoC,CAAC;AACnD,MAAM,MAAM,GAAG,oCAAoC,CAAC;AACpD,MAAM,SAAS,GAAG,qCAAqC,CAAC;AACxD,MAAM,WAAW,GAAG,qCAAqC,CAAC;AAE1D,MAAM,IAAI,GAAG,CAAC,MAAc,EAAE,IAAc,EAAoB,EAAE,CAAC,CAAC;IACnE,MAAM;IACN,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;CACpD,CAAC,CAAC;AAEH,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AAEjG,yEAAyE;AACzE,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAE1F,MAAM,KAAK,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;AAElF,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,2BAA2B,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;AAErF,MAAM,OAAO,eAAe;IAcjB;IACA;IAEA;IAhBO,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IACpC,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACnC,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;IACzD,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,mCAAmC;IAC1B,KAAK,GAAY,EAAE,CAAC;IACZ,MAAM,GAAwC,EAAE,CAAC;IACjD,YAAY,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,KAAK,GAAsB,EAAE,CAAC;IAC/C,sEAAsE;IACrD,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEzD,YACU,YAAoB,EACpB,OAAe;IACxB,oCAAoC;IAC3B,MAAc;QAHd,iBAAY,GAAZ,YAAY,CAAQ;QACpB,YAAO,GAAP,OAAO,CAAQ;QAEf,WAAM,GAAN,MAAM,CAAQ;QAEvB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,8GAA8G;IAC9G,IAAI,CAAC,UAAkB,EAAE,EAAE,WAAW,EAA4B;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;QACxD,MAAM,EAAE,GAAG,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,2CAA2C;IAC3C,QAAQ,CAAC,IAAiB;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QAC/B,MAAM,MAAM,GAA4B;YACvC,WAAW,EAAE,EAAE;YACf,oBAAoB,EAAE,IAAI,CAAC,OAAO;YAClC,qBAAqB,EAAE,IAAI,CAAC,IAAI;YAChC,cAAc,EAAE,IAAI,CAAC,KAAK;YAC1B,cAAc,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK;YACnC,oBAAoB,EAAE,IAAI,CAAC,IAAI,EAAE;SACjC,CAAC;QACF,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,IAAI;gBACvC,CAAC,CAAC,IAAI,CAAC,WAAW;gBAClB,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,MAAM,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChG,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YAClD,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,MAAM,CAAC,kCAAkC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACnF,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QACvE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACpF,OAAO,EAAE,CAAC;IACX,CAAC;IAED,yDAAyD;IACzD,QAAQ,CAAC,MAAc,EAAE,KAAa;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,oEAAoE;IACpE,OAAO,CAAC,WAAmB,EAAE,SAAiB;QAC7C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;IAED,GAAG,CAAC,EAAU,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE,IAAI,GAAG,KAAK,EAAE,GAAG,EAAE;QAClE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC;YACnB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC;YACxC,QAAQ,EAAE,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YACxB,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,uDAAuD;IACvD,MAAM,CAAC,EAAU;QAChB,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,mDAAmD;IACnD,UAAU,CAAC,IAAY;QACtB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,uCAAuC;IACvC,aAAa,CAAC,EAAU;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC;QAC7D,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,KAAK,CAAC,mBAAmB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,KAAK,CAAC;IACd,CAAC;IAED,kDAAkD;IAClD,eAAe,CAAC,MAAc;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;aAClC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;aAChF,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;aACjB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,kFAAkF;IAClF,QAAQ,CAAC,KAAa,EAAE,MAAc;QACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,yCAAyC;IACzC,MAAM;QACL,OAAO;YACN,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;YAC3C,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;YAC9C,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;SAChC,CAAC;IACH,CAAC;IAEQ,OAAO,GAAuB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAa,CAAC;QACtF,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;YACpD,MAAM,KAAK,CAAC,qEAAqE,GAAG,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,KAAK;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,yCAAyC,CAAC,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC;IAEM,MAAM,CAAC,GAAQ,EAAE,IAAqB,EAAE,IAAa;QAC5D,MAAM,GAAG,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACxD,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC1B,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,KAAK,KAAK,yBAAyB,IAAI,IAAI,KAAK,GAAG,GAAG,mBAAmB,EAAE,CAAC;YAC/E,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe;YAAE,MAAM,KAAK,CAAC,WAAW,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,GAAG,uBAAuB,EAAE,CAAC;YACrE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC,GAAG,EAAE;gBAChB,iBAAiB,EAAE;oBAClB,EAAE,EAAE,EAAE,CAAC,EAAE;oBACT,mBAAmB,EAAE,EAAE,CAAC,UAAU;oBAClC,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE;iBAC1E;aACD,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,GAAG,OAAO,iBAAiB,EAAE,CAAC;YACpE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,GAAG,sBAAsB,EAAE,CAAC;YACpE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,OAAO,uCAAuC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvF,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;YACxC,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,6BAA6B,EAAE,CAAC;gBACpE,MAAM,KAAK,CAAC,sDAAsD,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,OAAO,8BAA8B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7E,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,GAAG,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;YACxC,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,6BAA6B,EAAE,CAAC;gBACpE,MAAM,KAAK,CAAC,yDAAyD,CAAC,CAAC;YACxE,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,OAAO,uCAAuC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzF,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,OAAO,CAAC,GAAG,EAAE,uBAAuB,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;YAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;YACtE,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACzD,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,8BAA8B,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;YACxC,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,6BAA6B,EAAE,CAAC;gBACpE,MAAM,KAAK,CAAC,yDAAyD,CAAC,CAAC;YACxE,CAAC;YACD,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,KAAK,CAAC,oBAAoB,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,uGAAuG;IAC/F,WAAW,CAClB,GAAQ,EACR,IAAqB,EACrB,IAAa,EACb,OAAe;QAEf,MAAM,KAAK,GAAG,IAAI,MAAM,CACvB,IAAI,OAAO,2FAA2F,EACtG,GAAG,CACH,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE;YACvC,8BAA8B;YAC9B,uBAAuB;SACvB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACrF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,OAAO,CACb,GAAG,EACH,wDAAwD,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,kBAAkB,CACxF,CAAC;QACH,CAAC;QACD,MAAM,CAAC,EAAE,AAAD,EAAG,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;gBAAE,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,YAAY,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;YACzE,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/D,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,uBAAuB,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,EAAE,CACrE,CAAC;QACF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,OAAO,CAAC,GAAG,EAAE,qDAAqD,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YACnE,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjE,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACxE,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACnE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;gBACd,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;aACrB,CAAC,CAAC,CAAC;YACJ,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACvE,MAAM,OAAO,GAAI,IAAsD,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;gBACrF,EAAE,OAAO,CAAC;YACX,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC7F,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,KAAK,CAAC,oBAAoB,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAEO,SAAS,CAAC,IAAgB,EAAE,MAAuB;QAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,QAAQ,CAAC;QAC/D,IAAI,MAAM,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;aACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC;aAC1F,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;IAEO,UAAU,CAAC,IAAgB,EAAE,IAAa;QACjD,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;QACpD,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;QAC1E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,CAAC,eAAe,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACxF,MAAM,KAAK,CAAC,iDAAiD,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,OAAO,aAAa,KAAK,QAAQ;YACzE,MAAM,KAAK,CAAC,0DAA0D,CAAC,CAAC;QACzE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,WAAW,KAAK,QAAQ;YAC/D,MAAM,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACjE,IAAI,WAAW,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;YAC5C,OAAO,OAAO,CACb,GAAG,EACH,+EAA+E,CAC/E,CAAC;QACH,CAAC;QACD,IACC,IAAI,CAAC,KAAK,CAAC,IAAI,CACd,CAAC,CAAC,EAAE,EAAE,CACL,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,EAAE;YACxB,CAAC,CAAC,aAAa,KAAK,aAAa;YACjC,CAAC,CAAC,aAAa,KAAK,aAAa,CAClC,EACA,CAAC;YACF,OAAO,OAAO,CACb,GAAG,EACH,mFAAmF,CACnF,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAoB;YAC7B,aAAa,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAC1C,UAAU,EAAE,IAAI,CAAC,EAAE;YACnB,aAAa;YACb,aAAa;YACb,KAAK;YACL,WAAW;YACX,OAAO,EAAE,OAAO,KAAK,IAAI;YACzB,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,EAAE;SACZ,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,sHAAsH;IAC9G,UAAU,CAAC,IAAqB,EAAE,IAAa;QACtD,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;QACpD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC3C,MAAM,KAAK,CAAC,gDAAgD,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;QACnC,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;YAC/E,OAAO,OAAO,CACb,GAAG,EACH,+EAA+E,CAC/E,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG;YACf,GAAG,IAAI;YACP,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/C,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,2FAA2F;IACnF,YAAY,CAAC,EAAU,EAAE,IAAa;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,IAAI,KAAK,SAAS;YACrB,OAAO,OAAO,CAAC,GAAG,EAAE,uBAAuB,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;QAC1E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClD,KAAK,MAAM,EAAE,IAAI,IAA2D,EAAE,CAAC;YAC9E,MAAM,KAAK,GAAG,EAAE,CAAC,KAAqD,CAAC;YACvE,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAC;YACvB,IACC,EAAE,CAAC,EAAE,KAAK,KAAK;gBACf,EAAE,CAAC,IAAI,KAAK,cAAc;gBAC1B,KAAK,EAAE,GAAG,KAAK,cAAc;gBAC7B,OAAO,GAAG,KAAK,QAAQ;gBACvB,CAAC,GAAG,CAAC,UAAU,CAAC,6BAA6B,CAAC,EAC7C,CAAC;gBACF,MAAM,KAAK,CAAC,kCAAkC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACrE,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC9D,OAAO,OAAO,CACb,GAAG,EACH,wEAAwE,CACxE,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEO,WAAW,CAAC,IAAqB;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/E,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACvB,CAAC;IAEO,UAAU,CAAC,IAAqB;QACvC,OAAO,8BAA8B,UAAU,MAAM,IAAI,CAAC,UAAU,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;IACxG,CAAC;IAEO,gBAAgB,CAAC,IAAgB;QACxC,MAAM,GAAG,GAAG,yBAAyB,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvJ,OAAO;YACN,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;YAC/C,SAAS,EAAE,GAAG;YACd,MAAM,EAAE,GAAG;SACX,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,IAAqB;QACvC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;QACnF,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACvE,OAAO;YACN,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACvC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACjC,GAAG,EAAE,yBAAyB,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,2BAA2B,IAAI,CAAC,EAAE,iBAAiB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;SAClJ,CAAC;IACH,CAAC;IAED,mFAAmF;IAC3E,KAAK,CAAC,GAAQ,EAAE,MAA8B,EAAE,WAA8B,EAAE;QACvF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpD,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK;gBAAE,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,UAAU,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAChD,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,aAAa,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;IACF,CAAC;IAED,8FAA8F;IACtF,IAAI,CAAC,IAAa;QACzB,MAAM,KAAK,GAAI,IAAmC,EAAE,KAAK,CAAC;QAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,4EAA4E,CAAC,IAAI,CAC9F,KAAK,CAAC,IAAI,EAAE,CACZ,CAAC;QACF,IAAI,CAAC,KAAK;YAAE,MAAM,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,+EAA+E,CAAC;QAC/F,MAAM,KAAK,GAAoC,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;YAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK;gBAAE,MAAM,KAAK,CAAC,6BAA6B,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YACzE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9F,OAAO,IAAI,CAAC,GAAG,EAAE;YAChB,SAAS,EAAE,MAAM;YACjB,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACjF,CAAC,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,KAAa,EAAE,EAAU,EAAE,GAAW;QACpD,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACxB,IAAI,KAAK,KAAK,oBAAoB,IAAI,EAAE,KAAK,GAAG;gBAAE,MAAM,KAAK,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;YACxF,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC;QACnB,CAAC;QACD,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YACnB,IAAI,KAAK,KAAK,mBAAmB,IAAI,EAAE,KAAK,GAAG;gBAAE,MAAM,KAAK,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;YAClF,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACjE,MAAM,IAAI,GAAG,CAAC,IAAc,EAAE,EAAE;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAE,GAAc,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC;YACzF,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,CAAC,CAAC;QACF,IAAI,EAAE,KAAK,UAAU,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;YAClD,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAChF,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;QACvC,CAAC;QACD,MAAM,KAAK,CAAC,2BAA2B,KAAK,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,2GAA2G;IACnG,KAAK,CAAC,MAAuB;QACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,0BAA0B,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7C,OAAO,OAAO,CACb,GAAG,EACH,2EAA2E,CAC3E,CAAC;QACH,CAAC;QACD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,WAAW;YAAE,MAAM,KAAK,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;QAChF,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACvC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM;YAAE,MAAM,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;QACzE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;aACnC,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;aACvB,GAAG,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG;YACvC,MAAM,KAAK,CAAC,+BAA+B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACzC,OAAO,OAAO,CACb,GAAG,EACH,uBAAuB,MAAM,CAAC,EAAE,CAAC,6DAA6D,CAC9F,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,qEAAqE;IAC7D,KAAK,CAAC,EAAU,EAAE,IAAa;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,IAAI,KAAK,SAAS;YACrB,OAAO,OAAO,CAAC,GAAG,EAAE,uBAAuB,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;QAC1E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,MAAM,EAAE,IAAI,IAA2D,EAAE,CAAC;YAC9E,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7F,IAAI,UAAU,EAAE,GAAG,KAAK,WAAW,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBAC9C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC3B,OAAO,OAAO,CAAC,GAAG,EAAE,uBAAuB,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;gBACrF,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC7B,SAAS;YACV,CAAC;YACD,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;gBACnF,MAAM,IAAI,GAAa,EAAE,CAAC;gBAC1B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;wBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC9E,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC;;oBAC/C,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACP,MAAM,KAAK,CAAC,kCAAkC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACrE,CAAC;QACF,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QAC/D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,qHAAqH;IAC7G,MAAM,CAAC,IAAY,EAAE,IAAa;QACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,MAAM,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACvF,IAAI,KAAyB,CAAC;QAC9B,IAAI,WAA+B,CAAC;QACpC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,MAA0B,CAAC;QAC/B,KAAK,MAAM,EAAE,IAAI,IAA2D,EAAE,CAAC;YAC9E,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK;gBAAE,MAAM,KAAK,CAAC,qCAAqC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5F,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;YACvB,IAAI,EAAE,CAAC,IAAI,KAAK,sBAAsB,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,KAAK,GAAG,KAAK,CAAC;iBAC9E,IAAI,EAAE,CAAC,IAAI,KAAK,4BAA4B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAChF,WAAW,GAAG,KAAK,CAAC;YACrB,CAAC;iBAAM,IAAI,EAAE,CAAC,IAAI,KAAK,2CAA2C,EAAE,CAAC;gBACpE,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC;YAC5E,CAAC;iBAAM,IAAI,EAAE,CAAC,IAAI,KAAK,cAAc,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,MAAM,EAAE,CAAC;gBAC1E,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBAC7B,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBACrD,OAAO,OAAO,CAAC,GAAG,EAAE,uBAAuB,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;gBAC9E,CAAC;YACF,CAAC;;gBAAM,MAAM,KAAK,CAAC,kCAAkC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAChD,OAAO,OAAO,CAAC,GAAG,EAAE,6DAA6D,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;YACxB,IAAI;YACJ,KAAK;YACL,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;SACtE,CAAC,CAAC;QACH,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,8EAA8E;IACtE,QAAQ,CAAC,EAAU,EAAE,MAAuB;QACnD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,0BAA0B,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACzF,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK;YAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QACjD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,GAAG,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,GAAG,EAAE;YAChB,UAAU,EAAE,GAAG,CAAC,MAAM;YACtB,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACpD,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E,CAAC,CAAC;IACJ,CAAC;IAEO,UAAU,CAAC,EAAU,EAAE,MAAuB,EAAE,IAAa;QACpE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,0BAA0B,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAI,IAAkC,EAAE,IAAI,CAAC;QACvD,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACxE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,UAAU,CAAC;QACjD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,4HAA4H;IACpH,UAAU,CAAC,MAAuB;QACzC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,gCAAgC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzE,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,OAAO,iBAAiB,CAAC;QACvD,IAAI,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;gBACf,aAAa,EAAE,GAAG;gBAClB,YAAY,EAAE,SAAS;gBACvB,WAAW,EAAE,YAAY;gBACzB,eAAe,EAAE,MAAM;aACvB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,GAAG,EAAE;gBAChB,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE;oBACN;wBACC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC;wBACd,UAAU,EAAE,YAAY;wBACxB,mBAAmB,EAAE,YAAY;wBACjC,WAAW,EAAE,IAAI;qBACjB;iBACD;aACD,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE;YACrF,iBAAiB;SACjB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,YAAY,CAAC;QAChE,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;YAC5B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAClE,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;YACtC,8FAA8F;YAC9F,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC5F,OAAO;gBACN,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,UAAU,EAAE,0DAA0D,MAAM,CAAC,UAAU,EAAE;gBACzF,mBAAmB,EAAE,MAAM,CAAC,UAAU;gBACtC,WAAW,EAAE,KAAK;gBAClB,QAAQ,EAAE,MAAM;aAChB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;IAEO,MAAM,CAAC,IAAc,EAAE,MAAqC,EAAE,SAAkB;QACvF,MAAM,KAAK,GAAG,MAAM;YACnB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3F,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACf,OAAO;YACN,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,KAAK;YACb,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,oBAAoB,IAAI,KAAK;gBACjD,CAAC,CAAC,EAAE,qBAAqB,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,EAAE;gBACjE,CAAC,CAAC,EAAE,CAAC;YACN,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBACrC,CAAC,CAAC;oBACA,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACjC,GAAG,EAAE,CAAC,CAAC,GAAG;wBACV,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;wBACvB,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE;qBAC1E,CAAC,CAAC;iBACH;gBACF,CAAC,CAAC,EAAE,CAAC;YACN,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;SAC1B,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,UAAkB,EAAE,CAAgB;QACzD,MAAM,EAAE,GAAG;YACV,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE;YACf,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU;YAChC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU;SAC/B,CAAC;QACF,OAAO;YACN,UAAU;YACV,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;YACxC,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,EAAE;YACd,YAAY,EAAE,CAAC,CAAC,WAAW;YAC3B,SAAS,EAAE,KAAK;SAChB,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,UAAkB;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/B,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IAC1E,CAAC;IAED,sFAAsF;IAC9E,GAAG,CAAC,UAAkB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;QACxD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IAEO,IAAI,CAAC,IAAY,EAAE,GAAW,EAAE,EAAU;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IAEO,OAAO,CAAC,EAAU;QACzB,OAAO,yBAAyB,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,wBAAwB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IAC3G,CAAC;IAEO,GAAG,CAAC,EAAU;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,KAAK,CAAC,gBAAgB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IACb,CAAC;IAEO,IAAI;QACX,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;QACrB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;CACD;AAED,MAAM,YAAY,GAAG,mEAAmE,CAAC;AACzF,MAAM,IAAI,GAAG,2DAA2D,CAAC;AACzE,MAAM,OAAO,GAAG,8DAA8D,CAAC;AAC/E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9B,wEAAwE;AACxE,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,SAAS,OAAO,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzC,OAAO,KAAK;SACV,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,gEAAgE;AAChE,SAAS,QAAQ,CAAC,KAAc;IAC/B,MAAM,IAAI,GAAG,KAAgD,CAAC;IAC9D,IAAI,OAAO,IAAI,EAAE,GAAG,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC/E,MAAM,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtD,OAAO,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Env } from '../git.js';
|
|
2
|
+
import { AzureDevOpsApi, type AzureDevOpsRequest } from './api.js';
|
|
3
|
+
import { type AzureDevOpsSignIn } from './sign-in.js';
|
|
4
|
+
export { AzureDevOpsApi, AzureDevOpsFailure, fetchRequest, type AzureDevOpsCall, type AzureDevOpsReply, type AzureDevOpsRequest, type Sending } from './api.js';
|
|
5
|
+
export { AZURE_DEVOPS_RESOURCE, PAT_VARIABLE, azRunner, azureDevOpsSignIn, type AzRunner, type AzureDevOpsSignIn } from './sign-in.js';
|
|
6
|
+
export { AzureBoardsTracker, type AzureBoardsSettings } from './tracker.js';
|
|
7
|
+
export { AzureReposCodeHost, DESCRIPTION_LIMIT, type AzureGitRunner, type AzureReposSettings, type ReferencesAs } from './code-host.js';
|
|
8
|
+
export declare function openAzureDevOps(organization: string, root: string, env: Env, signIn?: AzureDevOpsSignIn, request?: AzureDevOpsRequest): AzureDevOpsApi;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AzureDevOpsApi, fetchRequest } from './api.js';
|
|
2
|
+
import { azRunner, azureDevOpsSignIn } from './sign-in.js';
|
|
3
|
+
export { AzureDevOpsApi, AzureDevOpsFailure, fetchRequest } from './api.js';
|
|
4
|
+
export { AZURE_DEVOPS_RESOURCE, PAT_VARIABLE, azRunner, azureDevOpsSignIn } from './sign-in.js';
|
|
5
|
+
export { AzureBoardsTracker } from './tracker.js';
|
|
6
|
+
export { AzureReposCodeHost, DESCRIPTION_LIMIT } from './code-host.js';
|
|
7
|
+
// A second organization's API passes the first one's `signIn`, so a person still signs in once.
|
|
8
|
+
export function openAzureDevOps(organization, root, env, signIn = azureDevOpsSignIn(azRunner(root, env), env), request = fetchRequest) {
|
|
9
|
+
return new AzureDevOpsApi(organization, signIn, request);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/azure-devops/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,YAAY,EAA2B,MAAM,UAAU,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAA0B,MAAM,cAAc,CAAC;AAEnF,OAAO,EACN,cAAc,EACd,kBAAkB,EAClB,YAAY,EAKZ,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,qBAAqB,EACrB,YAAY,EACZ,QAAQ,EACR,iBAAiB,EAGjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAA4B,MAAM,cAAc,CAAC;AAE5E,OAAO,EACN,kBAAkB,EAClB,iBAAiB,EAIjB,MAAM,gBAAgB,CAAC;AAExB,gGAAgG;AAChG,MAAM,UAAU,eAAe,CAC9B,YAAoB,EACpB,IAAY,EACZ,GAAQ,EACR,SAA4B,iBAAiB,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EACvE,UAA8B,YAAY;IAE1C,OAAO,IAAI,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Env, type Run } from '../git.js';
|
|
2
|
+
export declare const AZURE_DEVOPS_RESOURCE = "499b84ac-1321-427f-aa17-267ca6975798";
|
|
3
|
+
export declare const PAT_VARIABLE = "AZURE_DEVOPS_EXT_PAT";
|
|
4
|
+
export type AzRunner = (args: readonly string[]) => Promise<Run>;
|
|
5
|
+
export declare const azRunner: (cwd: string, env: Env) => AzRunner;
|
|
6
|
+
export interface AzureDevOpsSignIn {
|
|
7
|
+
authorization(): Promise<string>;
|
|
8
|
+
via(): Promise<string>;
|
|
9
|
+
refresh(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare function azureDevOpsSignIn(az: AzRunner, env: Env): AzureDevOpsSignIn;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Azure DevOps sign-in: the Azure CLI's token first, else a personal access token from the environment.
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { firstLine, run } from '../git.js';
|
|
4
|
+
import { AzureDevOpsFailure } from './api.js';
|
|
5
|
+
// The resource id Azure DevOps tokens are issued for, the same in every tenant.
|
|
6
|
+
export const AZURE_DEVOPS_RESOURCE = '499b84ac-1321-427f-aa17-267ca6975798';
|
|
7
|
+
// The variable the Azure CLI's own devops extension reads, so one token serves both.
|
|
8
|
+
export const PAT_VARIABLE = 'AZURE_DEVOPS_EXT_PAT';
|
|
9
|
+
export const azRunner = (cwd, env) => (args) => run('az', args, cwd, env);
|
|
10
|
+
const TokenSchema = z.looseObject({ accessToken: z.string().min(1) });
|
|
11
|
+
export function azureDevOpsSignIn(az, env) {
|
|
12
|
+
let held = null;
|
|
13
|
+
// The Azure CLI's token, or why there is none.
|
|
14
|
+
async function fromAz() {
|
|
15
|
+
const got = await az([
|
|
16
|
+
'account',
|
|
17
|
+
'get-access-token',
|
|
18
|
+
'--resource',
|
|
19
|
+
AZURE_DEVOPS_RESOURCE,
|
|
20
|
+
'--output',
|
|
21
|
+
'json'
|
|
22
|
+
]);
|
|
23
|
+
if (got.missing)
|
|
24
|
+
return { why: 'az is not on the PATH' };
|
|
25
|
+
if (!got.ok)
|
|
26
|
+
return { why: `az: ${firstLine(got.err) || firstLine(got.out)}` };
|
|
27
|
+
let value = null;
|
|
28
|
+
try {
|
|
29
|
+
value = JSON.parse(got.out);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// no JSON reads as no token
|
|
33
|
+
}
|
|
34
|
+
const parsed = TokenSchema.safeParse(value);
|
|
35
|
+
return parsed.success ? parsed.data.accessToken : { why: 'az printed no token' };
|
|
36
|
+
}
|
|
37
|
+
async function signIn() {
|
|
38
|
+
const token = await fromAz();
|
|
39
|
+
if (typeof token === 'string') {
|
|
40
|
+
return { authorization: `Bearer ${token}`, via: 'the Azure CLI', fromAz: true };
|
|
41
|
+
}
|
|
42
|
+
const pat = env[PAT_VARIABLE]?.trim() ?? '';
|
|
43
|
+
if (pat !== '') {
|
|
44
|
+
return {
|
|
45
|
+
authorization: `Basic ${Buffer.from(`:${pat}`).toString('base64')}`,
|
|
46
|
+
via: `the personal access token in ${PAT_VARIABLE}`,
|
|
47
|
+
fromAz: false
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
throw new AzureDevOpsFailure(`Nightjar cannot sign in to Azure DevOps: run \`az login\`, or set ${PAT_VARIABLE} to a personal access token (${token.why}).`);
|
|
51
|
+
}
|
|
52
|
+
const current = () => {
|
|
53
|
+
held ??= signIn().catch((fault) => {
|
|
54
|
+
held = null;
|
|
55
|
+
throw fault;
|
|
56
|
+
});
|
|
57
|
+
return held;
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
authorization: async () => (await current()).authorization,
|
|
61
|
+
via: async () => (await current()).via,
|
|
62
|
+
async refresh() {
|
|
63
|
+
if (held !== null && (await held).fromAz)
|
|
64
|
+
held = null;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=sign-in.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-in.js","sourceRoot":"","sources":["../../src/azure-devops/sign-in.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function plainText(value: string, format: string | null | undefined): string;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// A description or comment as Azure DevOps stores it, Markdown or HTML, made the plain text the agent and Ticket lines read.
|
|
2
|
+
const ENTITIES = {
|
|
3
|
+
nbsp: ' ',
|
|
4
|
+
lt: '<',
|
|
5
|
+
gt: '>',
|
|
6
|
+
quot: '"',
|
|
7
|
+
apos: "'",
|
|
8
|
+
amp: '&'
|
|
9
|
+
};
|
|
10
|
+
const decode = (text) => text.replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);/gi, (whole, name) => {
|
|
11
|
+
if (name.startsWith('#x') || name.startsWith('#X')) {
|
|
12
|
+
return String.fromCodePoint(parseInt(name.slice(2), 16));
|
|
13
|
+
}
|
|
14
|
+
if (name.startsWith('#'))
|
|
15
|
+
return String.fromCodePoint(Number(name.slice(1)));
|
|
16
|
+
return ENTITIES[name.toLowerCase()] ?? whole;
|
|
17
|
+
});
|
|
18
|
+
// HTML as the web editor writes it: blocks and breaks become lines, list items dashes, a link [text](address); other tags go.
|
|
19
|
+
function fromHtml(html) {
|
|
20
|
+
const text = html
|
|
21
|
+
.replace(/<br\s*\/?>/gi, '\n')
|
|
22
|
+
.replace(/<li\b[^>]*>/gi, '- ')
|
|
23
|
+
.replace(/<\/(?:div|p|li|h[1-6]|tr|blockquote|pre|ul|ol)>/gi, '\n')
|
|
24
|
+
.replace(/<a\b[^>]*\bhref="([^"]*)"[^>]*>(.*?)<\/a>/gis, '[$2]($1)')
|
|
25
|
+
.replace(/<[^>]*>/g, '');
|
|
26
|
+
return decode(text)
|
|
27
|
+
.split('\n')
|
|
28
|
+
.map((line) => line.trimEnd())
|
|
29
|
+
.join('\n')
|
|
30
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
31
|
+
.trim();
|
|
32
|
+
}
|
|
33
|
+
// `format` is what Azure DevOps names it, "markdown" in any case; anything else is HTML.
|
|
34
|
+
export function plainText(value, format) {
|
|
35
|
+
// Azure DevOps keeps a bare < or > of Markdown as its entity
|
|
36
|
+
if (format?.toLowerCase() === 'markdown') {
|
|
37
|
+
return value.replace(/</g, '<').replace(/>/g, '>');
|
|
38
|
+
}
|
|
39
|
+
return fromHtml(value);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/azure-devops/text.ts"],"names":[],"mappings":"AAAA,6HAA6H;AAE7H,MAAM,QAAQ,GAAqC;IAClD,IAAI,EAAE,GAAG;IACT,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,GAAG,EAAE,GAAG;CACR,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAC/B,IAAI,CAAC,OAAO,CAAC,+BAA+B,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IACrE,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,OAAO,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEJ,8HAA8H;AAC9H,SAAS,QAAQ,CAAC,IAAY;IAC7B,MAAM,IAAI,GAAG,IAAI;SACf,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;SAC7B,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC;SAC9B,OAAO,CAAC,mDAAmD,EAAE,IAAI,CAAC;SAClE,OAAO,CAAC,8CAA8C,EAAE,UAAU,CAAC;SACnE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC,IAAI,CAAC;SACjB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;SAC7B,IAAI,CAAC,IAAI,CAAC;SACV,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CAAC;AACV,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,MAAiC;IACzE,6DAA6D;IAC7D,IAAI,MAAM,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type Signal, type SignalNames } from '../signals.js';
|
|
2
|
+
import type { Comment, Feature, FeatureWriter, ItemId, ItemText, Standing, Ticket, TicketReference, Tracker } from '../tracker.js';
|
|
3
|
+
import { type AzureDevOpsApi } from './api.js';
|
|
4
|
+
export interface AzureBoardsSettings {
|
|
5
|
+
readonly project: string;
|
|
6
|
+
readonly featureType: string;
|
|
7
|
+
readonly ticketType?: string | undefined;
|
|
8
|
+
}
|
|
9
|
+
export declare function workItem(id: ItemId): number;
|
|
10
|
+
export declare class AzureBoardsTracker implements Tracker, FeatureWriter {
|
|
11
|
+
private readonly api;
|
|
12
|
+
private readonly settings;
|
|
13
|
+
private readonly names;
|
|
14
|
+
private readonly trusted?;
|
|
15
|
+
private readonly project;
|
|
16
|
+
private readonly signedIn;
|
|
17
|
+
private readonly contributors;
|
|
18
|
+
private readonly members;
|
|
19
|
+
constructor(api: AzureDevOpsApi, settings: AzureBoardsSettings, names: SignalNames, trusted?: readonly string[] | undefined);
|
|
20
|
+
private signalsOf;
|
|
21
|
+
private body;
|
|
22
|
+
private toFeature;
|
|
23
|
+
me(): Promise<string>;
|
|
24
|
+
private items;
|
|
25
|
+
private item;
|
|
26
|
+
assignedFeatures(person: string): Promise<Feature[]>;
|
|
27
|
+
feature(id: ItemId): Promise<Feature>;
|
|
28
|
+
standing(id: ItemId): Promise<Standing>;
|
|
29
|
+
tickets(featureId: ItemId): Promise<Ticket[]>;
|
|
30
|
+
comments(id: ItemId): Promise<Comment[]>;
|
|
31
|
+
private isTrusted;
|
|
32
|
+
private isContributor;
|
|
33
|
+
private contributorsGroup;
|
|
34
|
+
private setTags;
|
|
35
|
+
addSignal(id: ItemId, signal: Signal): Promise<void>;
|
|
36
|
+
removeSignal(id: ItemId, signal: Signal): Promise<void>;
|
|
37
|
+
comment(id: ItemId, body: string): Promise<void>;
|
|
38
|
+
reference(id: ItemId): TicketReference;
|
|
39
|
+
private create;
|
|
40
|
+
private link;
|
|
41
|
+
createFeature(feature: ItemText): Promise<ItemId>;
|
|
42
|
+
createTicket(featureId: ItemId, ticket: ItemText): Promise<ItemId>;
|
|
43
|
+
block(id: ItemId, blocker: ItemId): Promise<void>;
|
|
44
|
+
}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
// Azure DevOps Boards as a Tracker: a work item's state is never read or set (docs/adr/0002).
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { SIGNALS } from '../signals.js';
|
|
4
|
+
import { AzureDevOpsFailure } from './api.js';
|
|
5
|
+
import { plainText } from './text.js';
|
|
6
|
+
const API = 'api-version=7.1';
|
|
7
|
+
// the Comments endpoint is preview-only
|
|
8
|
+
const COMMENTS_API = 'api-version=7.1-preview.4';
|
|
9
|
+
// the most ids one read of work items takes
|
|
10
|
+
const BATCH = 200;
|
|
11
|
+
// One page of 200 is all Nightjar reads: a Feature with more comments is no Feature for one run.
|
|
12
|
+
const COMMENTS_PAGE = 200;
|
|
13
|
+
const CHILD = 'System.LinkTypes.Hierarchy-Forward';
|
|
14
|
+
const PARENT = 'System.LinkTypes.Hierarchy-Reverse';
|
|
15
|
+
const PREDECESSOR = 'System.LinkTypes.Dependency-Reverse';
|
|
16
|
+
// Set when an item reaches a closed state of the team's process: whether it is closed, without reading the state.
|
|
17
|
+
const CLOSED_DATE = 'Microsoft.VSTS.Common.ClosedDate';
|
|
18
|
+
const ItemSchema = z.looseObject({
|
|
19
|
+
id: z.int(),
|
|
20
|
+
fields: z.record(z.string(), z.unknown()),
|
|
21
|
+
relations: z.array(z.looseObject({ rel: z.string(), url: z.string() })).nullish(),
|
|
22
|
+
multilineFieldsFormat: z.record(z.string(), z.string()).nullish()
|
|
23
|
+
});
|
|
24
|
+
const ItemsSchema = z.looseObject({ value: z.array(ItemSchema.nullable()) });
|
|
25
|
+
const WiqlSchema = z.looseObject({ workItems: z.array(z.looseObject({ id: z.int() })) });
|
|
26
|
+
const ConnectionSchema = z.looseObject({
|
|
27
|
+
authenticatedUser: z.looseObject({
|
|
28
|
+
id: z.string(),
|
|
29
|
+
properties: z.looseObject({ Account: z.looseObject({ $value: z.string().min(1) }) })
|
|
30
|
+
})
|
|
31
|
+
});
|
|
32
|
+
const IdentityRefSchema = z.looseObject({
|
|
33
|
+
id: z.string().nullish(),
|
|
34
|
+
uniqueName: z.string().nullish(),
|
|
35
|
+
displayName: z.string().nullish()
|
|
36
|
+
});
|
|
37
|
+
const CommentsSchema = z.looseObject({
|
|
38
|
+
comments: z.array(z.looseObject({
|
|
39
|
+
text: z.string().nullish(),
|
|
40
|
+
format: z.string().nullish(),
|
|
41
|
+
createdBy: IdentityRefSchema.nullish(),
|
|
42
|
+
createdDate: z.string()
|
|
43
|
+
}))
|
|
44
|
+
});
|
|
45
|
+
const IdentitiesSchema = z.looseObject({
|
|
46
|
+
value: z.array(z
|
|
47
|
+
.looseObject({
|
|
48
|
+
descriptor: z.string().nullish(),
|
|
49
|
+
memberOf: z.array(z.string()).nullish()
|
|
50
|
+
})
|
|
51
|
+
.nullable())
|
|
52
|
+
});
|
|
53
|
+
// The work item number an id names; Azure DevOps has no other kind of id.
|
|
54
|
+
export function workItem(id) {
|
|
55
|
+
if (!/^\d+$/.test(id))
|
|
56
|
+
throw new AzureDevOpsFailure(`${id} is no Azure DevOps work item number.`);
|
|
57
|
+
return Number(id);
|
|
58
|
+
}
|
|
59
|
+
const text = (value) => (typeof value === 'string' ? value : '');
|
|
60
|
+
// The tags of a work item, as `System.Tags` holds them: "a; b".
|
|
61
|
+
const tagsOf = (item) => text(item.fields['System.Tags'])
|
|
62
|
+
.split(';')
|
|
63
|
+
.map((t) => t.trim())
|
|
64
|
+
.filter((t) => t !== '');
|
|
65
|
+
// Azure DevOps keeps tags without regard to case.
|
|
66
|
+
const same = (a, b) => a.toLowerCase() === b.toLowerCase();
|
|
67
|
+
// The id a link names, from its address .../_apis/wit/workItems/<id>.
|
|
68
|
+
const linked = (item, rel) => (item.relations ?? []).flatMap((r) => {
|
|
69
|
+
const id = r.rel === rel ? /\/workItems\/(\d+)$/i.exec(r.url)?.[1] : undefined;
|
|
70
|
+
return id === undefined ? [] : [Number(id)];
|
|
71
|
+
});
|
|
72
|
+
// A team's process ranks its backlog by one of these; an item no one has ordered has neither.
|
|
73
|
+
const RANKS = ['Microsoft.VSTS.Common.StackRank', 'Microsoft.VSTS.Common.BacklogPriority'];
|
|
74
|
+
const rankOf = (item) => {
|
|
75
|
+
for (const field of RANKS) {
|
|
76
|
+
const value = item.fields[field];
|
|
77
|
+
if (typeof value === 'number')
|
|
78
|
+
return value;
|
|
79
|
+
}
|
|
80
|
+
return Infinity;
|
|
81
|
+
};
|
|
82
|
+
const quoted = (value) => `'${value.replace(/'/g, "''")}'`;
|
|
83
|
+
// One answer per key, read once and kept; a read that failed is forgotten, so the next asks again.
|
|
84
|
+
function kept(read) {
|
|
85
|
+
const known = new Map();
|
|
86
|
+
return (key) => {
|
|
87
|
+
let got = known.get(key);
|
|
88
|
+
if (got === undefined) {
|
|
89
|
+
got = read(key);
|
|
90
|
+
known.set(key, got);
|
|
91
|
+
got.catch(() => known.delete(key));
|
|
92
|
+
}
|
|
93
|
+
return got;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export class AzureBoardsTracker {
|
|
97
|
+
api;
|
|
98
|
+
settings;
|
|
99
|
+
names;
|
|
100
|
+
trusted;
|
|
101
|
+
project;
|
|
102
|
+
signedIn = kept(() => this.api
|
|
103
|
+
.parse('read the signed-in person', { method: 'GET', url: this.api.at(`_apis/connectionData?${API}-preview`) }, ConnectionSchema)
|
|
104
|
+
.then((c) => ({
|
|
105
|
+
name: c.authenticatedUser.properties.Account.$value,
|
|
106
|
+
id: c.authenticatedUser.id
|
|
107
|
+
})));
|
|
108
|
+
contributors = kept(() => this.contributorsGroup());
|
|
109
|
+
members = kept((id) => this.isContributor(id));
|
|
110
|
+
constructor(api, settings, names,
|
|
111
|
+
// factory.json's trusted list; when set it replaces the Contributors default
|
|
112
|
+
trusted) {
|
|
113
|
+
this.api = api;
|
|
114
|
+
this.settings = settings;
|
|
115
|
+
this.names = names;
|
|
116
|
+
this.trusted = trusted;
|
|
117
|
+
this.project = encodeURIComponent(settings.project);
|
|
118
|
+
}
|
|
119
|
+
signalsOf(item) {
|
|
120
|
+
const tags = tagsOf(item);
|
|
121
|
+
return SIGNALS.filter((s) => tags.some((t) => same(t, this.names[s])));
|
|
122
|
+
}
|
|
123
|
+
body(item) {
|
|
124
|
+
const format = item.multilineFieldsFormat?.['System.Description'];
|
|
125
|
+
return plainText(text(item.fields['System.Description']), format);
|
|
126
|
+
}
|
|
127
|
+
toFeature(item) {
|
|
128
|
+
return { id: String(item.id), title: text(item.fields['System.Title']), body: this.body(item) };
|
|
129
|
+
}
|
|
130
|
+
async me() {
|
|
131
|
+
return (await this.signedIn('')).name;
|
|
132
|
+
}
|
|
133
|
+
// The work items with these ids, each with its fields and links; `omit` leaves out one that cannot be read.
|
|
134
|
+
async items(ids, omit) {
|
|
135
|
+
const out = [];
|
|
136
|
+
for (let at = 0; at < ids.length; at += BATCH) {
|
|
137
|
+
const batch = ids.slice(at, at + BATCH);
|
|
138
|
+
const policy = omit ? '&errorPolicy=omit' : '';
|
|
139
|
+
const got = await this.api.parse(`read work items ${batch.join(', ')}`, {
|
|
140
|
+
method: 'GET',
|
|
141
|
+
url: this.api.at(`_apis/wit/workitems?ids=${batch.join(',')}&$expand=relations${policy}&${API}`)
|
|
142
|
+
}, ItemsSchema);
|
|
143
|
+
out.push(...got.value.filter((i) => i !== null));
|
|
144
|
+
}
|
|
145
|
+
return out;
|
|
146
|
+
}
|
|
147
|
+
async item(id) {
|
|
148
|
+
const [found] = await this.items([id], false);
|
|
149
|
+
if (found === undefined) {
|
|
150
|
+
throw new AzureDevOpsFailure(`Azure DevOps answered no work item ${String(id)}.`);
|
|
151
|
+
}
|
|
152
|
+
return found;
|
|
153
|
+
}
|
|
154
|
+
async assignedFeatures(person) {
|
|
155
|
+
// @Me matches the signed-in person however the directory spells their name
|
|
156
|
+
const assignee = same(person, await this.me()) ? '@Me' : quoted(person);
|
|
157
|
+
const query = 'SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = @project' +
|
|
158
|
+
` AND [System.WorkItemType] = ${quoted(this.settings.featureType)}` +
|
|
159
|
+
` AND [System.AssignedTo] = ${assignee}` +
|
|
160
|
+
` AND [System.Tags] CONTAINS ${quoted(this.names.go)}` +
|
|
161
|
+
' ORDER BY [System.Id]';
|
|
162
|
+
const found = await this.api.parse('find the Features assigned with the Go', {
|
|
163
|
+
method: 'POST',
|
|
164
|
+
url: this.api.at(`${this.project}/_apis/wit/wiql?${API}`),
|
|
165
|
+
body: { query }
|
|
166
|
+
}, WiqlSchema);
|
|
167
|
+
const items = await this.items(found.workItems.map((w) => w.id), true);
|
|
168
|
+
return items
|
|
169
|
+
.filter((i) => i.fields[CLOSED_DATE] === undefined &&
|
|
170
|
+
linked(i, CHILD).length > 0 &&
|
|
171
|
+
this.signalsOf(i).includes('go'))
|
|
172
|
+
.sort((a, b) => a.id - b.id)
|
|
173
|
+
.map((i) => this.toFeature(i));
|
|
174
|
+
}
|
|
175
|
+
async feature(id) {
|
|
176
|
+
return this.toFeature(await this.item(workItem(id)));
|
|
177
|
+
}
|
|
178
|
+
async standing(id) {
|
|
179
|
+
const item = await this.item(workItem(id));
|
|
180
|
+
const assigned = IdentityRefSchema.safeParse(item.fields['System.AssignedTo']);
|
|
181
|
+
const me = await this.signedIn('');
|
|
182
|
+
const name = !assigned.success
|
|
183
|
+
? null
|
|
184
|
+
: assigned.data.id === me.id
|
|
185
|
+
? me.name
|
|
186
|
+
: (assigned.data.uniqueName ?? assigned.data.displayName ?? null);
|
|
187
|
+
return { assignees: name === null ? [] : [name], signals: this.signalsOf(item) };
|
|
188
|
+
}
|
|
189
|
+
async tickets(featureId) {
|
|
190
|
+
const order = linked(await this.item(workItem(featureId)), CHILD);
|
|
191
|
+
const children = await this.items(order, true);
|
|
192
|
+
const byId = new Map(children.map((c) => [c.id, c]));
|
|
193
|
+
const outside = [
|
|
194
|
+
...new Set(children.flatMap((c) => linked(c, PREDECESSOR)).filter((id) => !byId.has(id)))
|
|
195
|
+
];
|
|
196
|
+
const others = new Map((await this.items(outside, true)).map((i) => [i.id, i]));
|
|
197
|
+
const blockers = (child) => linked(child, PREDECESSOR).flatMap((id) => {
|
|
198
|
+
const found = byId.get(id) ?? others.get(id);
|
|
199
|
+
return found ? [{ id: String(id), open: found.fields[CLOSED_DATE] === undefined }] : [];
|
|
200
|
+
});
|
|
201
|
+
// the backlog's order, and the order of the links where the backlog has none
|
|
202
|
+
const ranked = children
|
|
203
|
+
.map((child) => ({ child, rank: rankOf(child), at: order.indexOf(child.id) }))
|
|
204
|
+
.sort((a, b) => a.rank - b.rank || a.at - b.at)
|
|
205
|
+
.map((r) => r.child);
|
|
206
|
+
return ranked.map((child) => ({
|
|
207
|
+
id: String(child.id),
|
|
208
|
+
title: text(child.fields['System.Title']),
|
|
209
|
+
body: this.body(child),
|
|
210
|
+
open: child.fields[CLOSED_DATE] === undefined,
|
|
211
|
+
signals: this.signalsOf(child),
|
|
212
|
+
blockedBy: blockers(child)
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
async comments(id) {
|
|
216
|
+
const n = String(workItem(id));
|
|
217
|
+
const got = await this.api.parse(`read the comments on work item ${n}`, {
|
|
218
|
+
method: 'GET',
|
|
219
|
+
url: this.api.at(`${this.project}/_apis/wit/workItems/${n}/comments?$top=${String(COMMENTS_PAGE)}&order=asc&${COMMENTS_API}`)
|
|
220
|
+
}, CommentsSchema);
|
|
221
|
+
const me = await this.signedIn('');
|
|
222
|
+
const comments = [];
|
|
223
|
+
const oldestFirst = [...got.comments].sort((a, b) => a.createdDate < b.createdDate ? -1 : a.createdDate > b.createdDate ? 1 : 0);
|
|
224
|
+
for (const c of oldestFirst) {
|
|
225
|
+
const by = c.createdBy;
|
|
226
|
+
// the signed-in person goes by the name me() gives, however the comment spells it
|
|
227
|
+
const author = by?.id === me.id ? me.name : (by?.uniqueName ?? by?.displayName ?? '');
|
|
228
|
+
comments.push({
|
|
229
|
+
author,
|
|
230
|
+
body: plainText(c.text ?? '', c.format),
|
|
231
|
+
at: c.createdDate,
|
|
232
|
+
trusted: await this.isTrusted(author, by?.id ?? null)
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
return comments;
|
|
236
|
+
}
|
|
237
|
+
// Whether a comment's author is trusted: on the configured list, else in the project's Contributors group.
|
|
238
|
+
async isTrusted(author, id) {
|
|
239
|
+
if (this.trusted !== undefined)
|
|
240
|
+
return this.trusted.some((t) => same(t, author));
|
|
241
|
+
return id === null ? false : this.members(id);
|
|
242
|
+
}
|
|
243
|
+
async isContributor(id) {
|
|
244
|
+
const group = await this.contributors('');
|
|
245
|
+
const got = await this.api.parse(`read the groups of ${id}`, {
|
|
246
|
+
method: 'GET',
|
|
247
|
+
url: this.api.identities(`_apis/identities?identityIds=${encodeURIComponent(id)}&queryMembership=ExpandedUp&${API}`)
|
|
248
|
+
}, IdentitiesSchema);
|
|
249
|
+
return (got.value[0]?.memberOf ?? []).some((d) => same(d, group));
|
|
250
|
+
}
|
|
251
|
+
// The descriptor of the project's Contributors group, which every member of the project's teams is in.
|
|
252
|
+
async contributorsGroup() {
|
|
253
|
+
const name = `[${this.settings.project}]\\Contributors`;
|
|
254
|
+
const got = await this.api.parse(`find the group ${name}`, {
|
|
255
|
+
method: 'GET',
|
|
256
|
+
url: this.api.identities(`_apis/identities?searchFilter=General&filterValue=${encodeURIComponent(name)}&queryMembership=None&${API}`)
|
|
257
|
+
}, IdentitiesSchema);
|
|
258
|
+
const descriptor = got.value[0]?.descriptor;
|
|
259
|
+
if (!descriptor)
|
|
260
|
+
throw new AzureDevOpsFailure(`Azure DevOps has no group ${name}.`);
|
|
261
|
+
return descriptor;
|
|
262
|
+
}
|
|
263
|
+
// Tags are one field, so a change writes the whole list back.
|
|
264
|
+
async setTags(id, change) {
|
|
265
|
+
const n = String(workItem(id));
|
|
266
|
+
const tags = change(tagsOf(await this.item(workItem(id))));
|
|
267
|
+
if (tags === null)
|
|
268
|
+
return;
|
|
269
|
+
await this.api.call(`tag work item ${n}`, {
|
|
270
|
+
method: 'PATCH',
|
|
271
|
+
url: this.api.at(`${this.project}/_apis/wit/workitems/${n}?${API}`),
|
|
272
|
+
body: [{ op: 'add', path: '/fields/System.Tags', value: tags.join('; ') }],
|
|
273
|
+
contentType: 'application/json-patch+json'
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
addSignal(id, signal) {
|
|
277
|
+
const tag = this.names[signal];
|
|
278
|
+
return this.setTags(id, (tags) => (tags.some((t) => same(t, tag)) ? null : [...tags, tag]));
|
|
279
|
+
}
|
|
280
|
+
removeSignal(id, signal) {
|
|
281
|
+
const tag = this.names[signal];
|
|
282
|
+
return this.setTags(id, (tags) => tags.some((t) => same(t, tag)) ? tags.filter((t) => !same(t, tag)) : null);
|
|
283
|
+
}
|
|
284
|
+
async comment(id, body) {
|
|
285
|
+
const n = String(workItem(id));
|
|
286
|
+
await this.api.call(`comment on work item ${n}`, {
|
|
287
|
+
method: 'POST',
|
|
288
|
+
url: this.api.at(`${this.project}/_apis/wit/workItems/${n}/comments?format=markdown&${COMMENTS_API}`),
|
|
289
|
+
body: { text: body }
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
reference(id) {
|
|
293
|
+
return { id, text: `AB#${String(workItem(id))}` };
|
|
294
|
+
}
|
|
295
|
+
// A work item of `type` whose Description is Markdown, so a Ticket's lines read back as written.
|
|
296
|
+
async create(type, item, links) {
|
|
297
|
+
const made = await this.api.parse(`make the ${type} ${item.title}`, {
|
|
298
|
+
method: 'POST',
|
|
299
|
+
url: this.api.at(`${this.project}/_apis/wit/workitems/$${encodeURIComponent(type)}?${API}`),
|
|
300
|
+
body: [
|
|
301
|
+
{ op: 'add', path: '/fields/System.Title', value: item.title },
|
|
302
|
+
{ op: 'add', path: '/fields/System.Description', value: item.body },
|
|
303
|
+
{ op: 'add', path: '/multilineFieldsFormat/System.Description', value: 'Markdown' },
|
|
304
|
+
...links.map((value) => ({ op: 'add', path: '/relations/-', value }))
|
|
305
|
+
],
|
|
306
|
+
contentType: 'application/json-patch+json'
|
|
307
|
+
}, ItemSchema);
|
|
308
|
+
return String(made.id);
|
|
309
|
+
}
|
|
310
|
+
link(rel, id) {
|
|
311
|
+
return { rel, url: this.api.at(`_apis/wit/workItems/${String(workItem(id))}`) };
|
|
312
|
+
}
|
|
313
|
+
createFeature(feature) {
|
|
314
|
+
return this.create(this.settings.featureType, feature, []);
|
|
315
|
+
}
|
|
316
|
+
createTicket(featureId, ticket) {
|
|
317
|
+
const type = this.settings.ticketType;
|
|
318
|
+
if (type === undefined) {
|
|
319
|
+
return Promise.reject(new AzureDevOpsFailure('Name the work item type of a Ticket as tracker.ticketType.'));
|
|
320
|
+
}
|
|
321
|
+
return this.create(type, ticket, [this.link(PARENT, featureId)]);
|
|
322
|
+
}
|
|
323
|
+
async block(id, blocker) {
|
|
324
|
+
const n = String(workItem(id));
|
|
325
|
+
await this.api.call(`link work item ${n} after ${blocker}`, {
|
|
326
|
+
method: 'PATCH',
|
|
327
|
+
url: this.api.at(`${this.project}/_apis/wit/workitems/${n}?${API}`),
|
|
328
|
+
body: [{ op: 'add', path: '/relations/-', value: this.link(PREDECESSOR, blocker) }],
|
|
329
|
+
contentType: 'application/json-patch+json'
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=tracker.js.map
|