@framers/agentos-ext-github 0.1.4 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +87 -1
  2. package/dist/GitHubRepoIndexer.d.ts +20 -8
  3. package/dist/GitHubRepoIndexer.d.ts.map +1 -1
  4. package/dist/GitHubRepoIndexer.js +11 -6
  5. package/dist/GitHubRepoIndexer.js.map +1 -1
  6. package/dist/__tests__/app.test.d.ts +7 -0
  7. package/dist/__tests__/app.test.d.ts.map +1 -0
  8. package/dist/__tests__/app.test.js +248 -0
  9. package/dist/__tests__/app.test.js.map +1 -0
  10. package/dist/__tests__/documents.test.d.ts +7 -0
  11. package/dist/__tests__/documents.test.d.ts.map +1 -0
  12. package/dist/__tests__/documents.test.js +235 -0
  13. package/dist/__tests__/documents.test.js.map +1 -0
  14. package/dist/__tests__/indexer.test.js +14 -0
  15. package/dist/__tests__/indexer.test.js.map +1 -1
  16. package/dist/app/credential.d.ts +43 -0
  17. package/dist/app/credential.d.ts.map +1 -0
  18. package/dist/app/credential.js +74 -0
  19. package/dist/app/credential.js.map +1 -0
  20. package/dist/app/http.d.ts +61 -0
  21. package/dist/app/http.d.ts.map +1 -0
  22. package/dist/app/http.js +128 -0
  23. package/dist/app/http.js.map +1 -0
  24. package/dist/app/installations.d.ts +48 -0
  25. package/dist/app/installations.d.ts.map +1 -0
  26. package/dist/app/installations.js +61 -0
  27. package/dist/app/installations.js.map +1 -0
  28. package/dist/app/reconcile.d.ts +61 -0
  29. package/dist/app/reconcile.d.ts.map +1 -0
  30. package/dist/app/reconcile.js +89 -0
  31. package/dist/app/reconcile.js.map +1 -0
  32. package/dist/app/userFlow.d.ts +43 -0
  33. package/dist/app/userFlow.d.ts.map +1 -0
  34. package/dist/app/userFlow.js +54 -0
  35. package/dist/app/userFlow.js.map +1 -0
  36. package/dist/app/webhook.d.ts +15 -0
  37. package/dist/app/webhook.d.ts.map +1 -0
  38. package/dist/app/webhook.js +23 -0
  39. package/dist/app/webhook.js.map +1 -0
  40. package/dist/documents/GitHubDocumentsConnector.d.ts +80 -0
  41. package/dist/documents/GitHubDocumentsConnector.d.ts.map +1 -0
  42. package/dist/documents/GitHubDocumentsConnector.js +158 -0
  43. package/dist/documents/GitHubDocumentsConnector.js.map +1 -0
  44. package/dist/documents/index.d.ts +24 -0
  45. package/dist/documents/index.d.ts.map +1 -0
  46. package/dist/documents/index.js +24 -0
  47. package/dist/documents/index.js.map +1 -0
  48. package/dist/documents/tree.d.ts +71 -0
  49. package/dist/documents/tree.d.ts.map +1 -0
  50. package/dist/documents/tree.js +115 -0
  51. package/dist/documents/tree.js.map +1 -0
  52. package/manifest.json +5 -3
  53. package/package.json +17 -4
package/README.md CHANGED
@@ -2,13 +2,15 @@
2
2
 
3
3
  This pack gives an agent tools for repository search, issues, pull requests, files, branches, commits, releases, workflow dispatch, gists, and repository indexing. It uses the GitHub API through `@octokit/rest`.
4
4
 
5
+ Its second entry, `@framers/agentos-ext-github/documents`, is for a server that reads people's repositories through a GitHub App: the app's JWT and installation tokens, the user's web flow, the installations and repositories a person can reach, webhook signatures, a daily reconcile, and `GitHubDocumentsConnector`, which reads a repository's documentation as account sources. See [GitHub App installation mode](#github-app-installation-mode).
6
+
5
7
  ## Installation
6
8
 
7
9
  ```bash
8
10
  npm install @framers/agentos-ext-github
9
11
  ```
10
12
 
11
- Peer dependency: `@framers/agentos` with range `>=0.10.40`.
13
+ Peer dependency: `@framers/agentos` with range `>=0.13.40`, the first release whose auth module has `RedirectOAuthFlow`.
12
14
 
13
15
  ## Usage
14
16
 
@@ -341,6 +343,90 @@ List and search tools fetch a page of results and cap `per_page` as described in
341
343
 
342
344
  Top-level pull request comments use the issues API. `github_pr_comment_list` returns inline review comments; `github_comment_list` returns top-level comments.
343
345
 
346
+ `GitHubRepoIndexer` indexes the repositories its constructor is given, `new GitHubRepoIndexer(service, { repositories: [{ owner, repo }] })`, and the six repositories of `ECOSYSTEM_REPOS` when it is given none.
347
+
348
+ ## GitHub App installation mode
349
+
350
+ The `./documents` entry reads repositories through a GitHub App instead of one personal token. Every call goes to GitHub's REST API over the `fetch` you pass (the global `fetch` by default) with `X-GitHub-Api-Version: 2026-03-10`, so tests point it at a stand-in with `{ fetchImpl, apiBase }`.
351
+
352
+ ```ts
353
+ import { readFileSync } from 'node:fs';
354
+ import {
355
+ GitHubAppCredential,
356
+ GitHubAppUserFlow,
357
+ GitHubDocumentsConnector,
358
+ installationsOfUser,
359
+ repositoriesOfUser,
360
+ userOfToken,
361
+ } from '@framers/agentos-ext-github/documents';
362
+
363
+ const credential = new GitHubAppCredential({
364
+ clientId: process.env.GITHUB_APP_CLIENT_ID!,
365
+ privateKey: readFileSync('/run/secrets/github_app_key', 'utf8'),
366
+ });
367
+ const flow = new GitHubAppUserFlow({
368
+ clientId: process.env.GITHUB_APP_CLIENT_ID!,
369
+ clientSecret: readFileSync('/run/secrets/github_app_client_secret', 'utf8').trim(),
370
+ });
371
+ const redirectUri = 'https://example.com/github/callback';
372
+
373
+ // Where GitHub sends the installer: keep `state` and `codeVerifier` (in a row keyed by a cookie), then redirect.
374
+ const { url, state, codeVerifier } = flow.begin({ redirectUri });
375
+
376
+ // The callback: check the state, exchange the code, and link only what this person's token reaches.
377
+ const { accessToken } = await flow.complete({ code, state: returnedState, expectedState: state, codeVerifier, redirectUri });
378
+ const person = await userOfToken(accessToken);
379
+ const reachable = (await installationsOfUser(accessToken)).some((installation) => installation.id === installationId);
380
+ const repositories = reachable ? await repositoriesOfUser(accessToken, installationId) : [];
381
+
382
+ // Read the documentation at the default branch's head.
383
+ const connector = new GitHubDocumentsConnector(credential, installationId, repositories);
384
+ for (const repository of repositories) {
385
+ const commit = await connector.head(repository.id);
386
+ for (const blob of await connector.listing(repository.id, commit)) {
387
+ const read = await connector.read({ id: `${repository.id}:${blob.path}`, title: blob.path, size: blob.size, version: `${blob.sha}@${commit}` });
388
+ if ('reason' in read) continue;
389
+ // read.content is { text } or { bytes, mediaType }; read.ref links the file at the commit.
390
+ }
391
+ }
392
+ ```
393
+
394
+ A push arrives at the app's webhook. Check its signature on the raw body before parsing it, then compare the tree at the push's `after` commit with the blobs read before:
395
+
396
+ ```ts
397
+ import { verifyWebhookSignature } from '@framers/agentos-ext-github/documents';
398
+
399
+ if (!verifyWebhookSignature(rawBody, request.headers.get('x-hub-signature-256'), webhookSecret)) return new Response(null, { status: 401 });
400
+ const push = JSON.parse(new TextDecoder().decode(rawBody));
401
+ const changes = await connector.changesSince(cursor, { ids: [String(push.repository.id)], after: push.after, ref: push.ref });
402
+ // Read changes.changed again, delete changes.gone, keep changes.cursor for the next push.
403
+ ```
404
+
405
+ | Export | What it does |
406
+ | --- | --- |
407
+ | `appJwt(identity, nowSeconds?)` | The app's JWT: RS256, `iat` 60 seconds back, `exp` nine minutes ahead, `iss` the client id |
408
+ | `GitHubAppCredential` | Mints installation tokens narrowed to the repositories asked for (`repository_ids`) and holds each until five minutes before its hour ends |
409
+ | `GitHubAppUserFlow` | The user's web flow on the auth module's `RedirectOAuthFlow`: GitHub's authorize address with `state` and PKCE and no `scope`, and the code exchange; it has no store, so the user token is used once |
410
+ | `userOfToken`, `installationsOfUser`, `repositoriesOfUser` | The person a user token belongs to, the app's installations they can access, and the repositories of an installation they can read, across every page |
411
+ | `listInstallations`, `uninstallInstallation` | The app's installations, and its uninstall, which takes 202 (GitHub removes it in the background), 204 and 404 as done |
412
+ | `verifyWebhookSignature(body, header, secret)` | Checks `X-Hub-Signature-256` against the HMAC SHA-256 of the raw body in constant time |
413
+ | `reconcileInstallations(credential, links, { since })` | Answers the linked installations GitHub no longer lists, the repositories whose default branch moved past the head last read, the repositories it could not read, and asks again for each event since `since` that no delivery attempt delivered |
414
+ | `GitHubDocumentsConnector` | An `AccountSourceConnector` of `@framers/agentos-ext-account-sources` over one installation's linked repositories |
415
+ | `readTree`, `pathFilter`, `TreeTooLarge` | A tree at a commit within a request budget, and the filter that keeps documentation |
416
+ | `GitHubApiError` | An answer outside 2xx; carries the status and nothing of the body |
417
+
418
+ The connector's filter, `new GitHubDocumentsConnector(credential, installationId, repositories, filter)`:
419
+
420
+ | Field | Default |
421
+ | --- | --- |
422
+ | `extensions` | `.md`, `.markdown`, `.txt`, `.rst`, `.html`, `.htm`, `.pdf`, `.docx` |
423
+ | `skipFolders` | `node_modules`, `vendor`, `dist`, `build`, `.git`, `third_party`, at any depth |
424
+ | `maxFiles` | `2000`, in path order |
425
+ | `maxFileBytes` | `10485760` (10 MiB): larger files are left out of a listing, and a read past it is answered gone |
426
+ | `maxTreeRequests` | `50` tree requests to list one commit |
427
+
428
+ An item's id is `<repositoryId>:<path>` and its version `<blob>@<commit>`. A tree is asked for recursively; when GitHub answers it truncated (past 100,000 entries or 7 MB), its top level is read and each subtree is asked for the same way, never walking a skipped folder, and `TreeTooLarge` is thrown rather than pass `maxTreeRequests`. Files are read through the contents endpoint's raw media type as a stream cut at `maxFileBytes`: PDF, Word and HTML as bytes with their media type, the rest as UTF-8 text, each with a `github` source reference whose `url` is the file at the commit. `changesSince` takes the cursor it answered last (each documentation path's blob), never reads a push's commit list, so a force push is read like any other, and answers a push to another branch than the default with no change. `listing(repositoryId, commit)` lets a caller keep a commit's listing and pass it to `changesSince` as `listing`, which then reads no tree.
429
+
344
430
  ## License
345
431
 
346
432
  Apache-2.0
@@ -27,14 +27,21 @@ export interface IndexResult {
27
27
  /** Wall-clock duration of the indexing run in milliseconds. */
28
28
  durationMs: number;
29
29
  }
30
- /**
31
- * Default ecosystem repos to index when `indexEcosystem()` is called
32
- * without arguments.
33
- */
34
- export declare const ECOSYSTEM_REPOS: readonly {
30
+ /** One repository to index, by its owner and name. */
31
+ export interface IndexedRepository {
35
32
  owner: string;
36
33
  repo: string;
37
- }[];
34
+ }
35
+ /** What a {@link GitHubRepoIndexer} indexes. */
36
+ export interface GitHubRepoIndexerOptions {
37
+ /** The repositories `indexEcosystem()` indexes, in order; {@link ECOSYSTEM_REPOS} when absent. */
38
+ repositories?: readonly IndexedRepository[];
39
+ }
40
+ /**
41
+ * Default ecosystem repos that `indexEcosystem()` indexes when the indexer is
42
+ * constructed without its own list of repositories.
43
+ */
44
+ export declare const ECOSYSTEM_REPOS: readonly IndexedRepository[];
38
45
  /**
39
46
  * Directories to skip when walking the repo tree.
40
47
  * These are typically build artifacts, caches, or vendored dependencies.
@@ -58,9 +65,14 @@ export declare const DOC_PATTERN: RegExp;
58
65
  */
59
66
  export declare class GitHubRepoIndexer {
60
67
  private readonly service;
61
- constructor(service: GitHubService);
68
+ private readonly repositories;
69
+ /**
70
+ * @param service The GitHub service whose client reads the repositories.
71
+ * @param options The repositories to index; the six {@link ECOSYSTEM_REPOS} when absent.
72
+ */
73
+ constructor(service: GitHubService, options?: GitHubRepoIndexerOptions);
62
74
  /**
63
- * Index all six default ecosystem repos.
75
+ * Index the configured repositories in order (the six ecosystem repos by default).
64
76
  * Errors on individual repos are caught so one failure doesn't abort the batch.
65
77
  *
66
78
  * @returns An IndexResult for every repo (failed repos have zero chunks).
@@ -1 +1 @@
1
- {"version":3,"file":"GitHubRepoIndexer.d.ts","sourceRoot":"","sources":["../src/GitHubRepoIndexer.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMxD,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,kEAAkE;AAClE,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAO5D,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,WAAW,CAAC,MAAM,CASxC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,MACuF,CAAC;AAmBlH;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAE5B,OAAO,EAAE,aAAa;IAQlC;;;;;OAKG;IACG,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAmB9C;;;;;;;OAOG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAwInF;;;;;;;OAOG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;CAoB3C"}
1
+ {"version":3,"file":"GitHubRepoIndexer.d.ts","sourceRoot":"","sources":["../src/GitHubRepoIndexer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMxD,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,kEAAkE;AAClE,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,sDAAsD;AACtD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,gDAAgD;AAChD,MAAM,WAAW,wBAAwB;IACvC,kGAAkG;IAClG,YAAY,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC7C;AAMD;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,iBAAiB,EAO9C,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,WAAW,CAAC,MAAM,CASxC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,MACuF,CAAC;AAmBlH;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+B;IAE5D;;;OAGG;gBACS,OAAO,EAAE,aAAa,EAAE,OAAO,GAAE,wBAA6B;IAS1E;;;;;OAKG;IACG,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAmB9C;;;;;;;OAOG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAwInF;;;;;;;OAOG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;CAoB3C"}
@@ -1,4 +1,3 @@
1
- // @ts-nocheck
2
1
  /**
3
2
  * @fileoverview Background codebase indexer that produces chunks from GitHub repos
4
3
  * for RAG embedding. Walks repo trees, extracts documentation files, splits them
@@ -9,8 +8,8 @@
9
8
  /* Constants */
10
9
  /* ------------------------------------------------------------------ */
11
10
  /**
12
- * Default ecosystem repos to index when `indexEcosystem()` is called
13
- * without arguments.
11
+ * Default ecosystem repos that `indexEcosystem()` indexes when the indexer is
12
+ * constructed without its own list of repositories.
14
13
  */
15
14
  export const ECOSYSTEM_REPOS = [
16
15
  { owner: 'framerslab', repo: 'agentos' },
@@ -64,21 +63,27 @@ const MAX_CHUNK_CHARS = 6_000;
64
63
  */
65
64
  export class GitHubRepoIndexer {
66
65
  service;
67
- constructor(service) {
66
+ repositories;
67
+ /**
68
+ * @param service The GitHub service whose client reads the repositories.
69
+ * @param options The repositories to index; the six {@link ECOSYSTEM_REPOS} when absent.
70
+ */
71
+ constructor(service, options = {}) {
68
72
  this.service = service;
73
+ this.repositories = options.repositories ?? ECOSYSTEM_REPOS;
69
74
  }
70
75
  /* ---------------------------------------------------------------- */
71
76
  /* Public API */
72
77
  /* ---------------------------------------------------------------- */
73
78
  /**
74
- * Index all six default ecosystem repos.
79
+ * Index the configured repositories in order (the six ecosystem repos by default).
75
80
  * Errors on individual repos are caught so one failure doesn't abort the batch.
76
81
  *
77
82
  * @returns An IndexResult for every repo (failed repos have zero chunks).
78
83
  */
79
84
  async indexEcosystem() {
80
85
  const results = [];
81
- for (const { owner, repo } of ECOSYSTEM_REPOS) {
86
+ for (const { owner, repo } of this.repositories) {
82
87
  try {
83
88
  const result = await this.indexRepo(owner, repo);
84
89
  results.push(result);
@@ -1 +1 @@
1
- {"version":3,"file":"GitHubRepoIndexer.js","sourceRoot":"","sources":["../src/GitHubRepoIndexer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GitHubRepoIndexer.js","sourceRoot":"","sources":["../src/GitHubRepoIndexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @fileoverview The GitHub App half of the `./documents` entry, driven over a fetch stand-in that records each
3
+ * request: the app's JWT, installation tokens, the user's web flow, a user's installations and repositories, the
4
+ * webhook signature, the daily reconcile and the uninstall.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=app.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/app.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,248 @@
1
+ /**
2
+ * @fileoverview The GitHub App half of the `./documents` entry, driven over a fetch stand-in that records each
3
+ * request: the app's JWT, installation tokens, the user's web flow, a user's installations and repositories, the
4
+ * webhook signature, the daily reconcile and the uninstall.
5
+ */
6
+ import { createHash, createHmac, createVerify, generateKeyPairSync } from 'node:crypto';
7
+ import { afterEach, describe, expect, it, vi } from 'vitest';
8
+ import { appJwt, GitHubApiError, GitHubAppCredential, GitHubAppUserFlow, installationsOfUser, reconcileInstallations, repositoriesOfUser, uninstallInstallation, userOfToken, verifyWebhookSignature, } from '../documents/index.js';
9
+ /** A fetch that answers from `route` and records every request. */
10
+ function standIn(route) {
11
+ const seen = [];
12
+ const fetchImpl = async (input, init) => {
13
+ const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
14
+ const request = {
15
+ method: init?.method ?? 'GET',
16
+ url,
17
+ headers: new Headers(init?.headers),
18
+ body: typeof init?.body === 'string' ? init.body : null,
19
+ };
20
+ seen.push(request);
21
+ return route(request);
22
+ };
23
+ return { fetchImpl, seen };
24
+ }
25
+ /** A JSON answer. */
26
+ function json(body, status = 200, headers = {}) {
27
+ return new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json', ...headers } });
28
+ }
29
+ const BASE = 'https://stand-in.test';
30
+ const CLIENT_ID = 'Iv23liTESTCLIENT';
31
+ const keys = generateKeyPairSync('rsa', {
32
+ modulusLength: 2048,
33
+ publicKeyEncoding: { type: 'spki', format: 'pem' },
34
+ privateKeyEncoding: { type: 'pkcs1', format: 'pem' },
35
+ });
36
+ /** The claims of a bearer that verifies as the app's JWT under the test key pair, or null. */
37
+ function appClaims(authorization) {
38
+ const match = /^Bearer ([\w-]+)\.([\w-]+)\.([\w-]+)$/.exec(authorization ?? '');
39
+ if (match === null)
40
+ return null;
41
+ const [, head, body, signature] = match;
42
+ const verified = createVerify('RSA-SHA256').update(`${head}.${body}`).verify(keys.publicKey, Buffer.from(signature, 'base64url'));
43
+ return verified ? JSON.parse(Buffer.from(body, 'base64url').toString('utf8')) : null;
44
+ }
45
+ afterEach(() => {
46
+ vi.useRealTimers();
47
+ });
48
+ describe('the GitHub App', () => {
49
+ it('signs its JWT with RS256, issued 60 seconds back, valid nine minutes, the client id as issuer', () => {
50
+ const now = 1_760_000_000;
51
+ const token = appJwt({ clientId: CLIENT_ID, privateKey: keys.privateKey }, now);
52
+ const [head, body, signature] = token.split('.');
53
+ expect(JSON.parse(Buffer.from(head, 'base64url').toString('utf8'))).toEqual({ alg: 'RS256', typ: 'JWT' });
54
+ expect(JSON.parse(Buffer.from(body, 'base64url').toString('utf8'))).toEqual({ iat: now - 60, exp: now + 540, iss: CLIENT_ID });
55
+ expect(createVerify('RSA-SHA256').update(`${head}.${body}`).verify(keys.publicKey, Buffer.from(signature, 'base64url'))).toBe(true);
56
+ });
57
+ it('mints an installation token narrowed to the repositories asked for and holds it until five minutes before it ends', async () => {
58
+ vi.useFakeTimers({ toFake: ['Date'] });
59
+ vi.setSystemTime(new Date('2026-10-14T12:00:00Z'));
60
+ let minted = 0;
61
+ const { fetchImpl, seen } = standIn(() => {
62
+ minted += 1;
63
+ return json({ token: `ghs_test${minted}`, expires_at: new Date(Date.now() + 3_600_000).toISOString() }, 201);
64
+ });
65
+ const credential = new GitHubAppCredential({ clientId: CLIENT_ID, privateKey: keys.privateKey }, fetchImpl, BASE);
66
+ expect(await credential.installationToken(42, [7, 3])).toBe('ghs_test1');
67
+ expect(seen).toHaveLength(1);
68
+ expect(seen[0].method).toBe('POST');
69
+ expect(seen[0].url).toBe(`${BASE}/app/installations/42/access_tokens`);
70
+ expect(appClaims(seen[0].headers.get('authorization'))).toMatchObject({ iss: CLIENT_ID });
71
+ expect(seen[0].headers.get('x-github-api-version')).toBe('2026-03-10');
72
+ expect(seen[0].headers.get('accept')).toBe('application/vnd.github+json');
73
+ expect(JSON.parse(seen[0].body ?? '')).toEqual({ repository_ids: [7, 3] });
74
+ vi.setSystemTime(new Date('2026-10-14T12:54:00Z'));
75
+ expect(await credential.installationToken(42, [3, 7])).toBe('ghs_test1');
76
+ expect(seen).toHaveLength(1);
77
+ vi.setSystemTime(new Date('2026-10-14T12:56:00Z'));
78
+ expect(await credential.installationToken(42, [3, 7])).toBe('ghs_test2');
79
+ expect(seen).toHaveLength(2);
80
+ });
81
+ it("begins the user's web flow with state and PKCE and no scope, and completes it into a token it never stores", async () => {
82
+ const { fetchImpl, seen } = standIn(() => json({ access_token: 'ghu_testuser', expires_in: 28_800, refresh_token: 'ghr_testuser', refresh_token_expires_in: 15_897_600, scope: '', token_type: 'bearer' }));
83
+ const flow = new GitHubAppUserFlow({ clientId: CLIENT_ID, clientSecret: 'test-client-secret' }, fetchImpl);
84
+ const redirectUri = 'https://app.example/sources/github/callback';
85
+ const begun = flow.begin({ redirectUri });
86
+ const address = new URL(begun.url);
87
+ expect(`${address.origin}${address.pathname}`).toBe('https://github.com/login/oauth/authorize');
88
+ expect(address.searchParams.get('client_id')).toBe(CLIENT_ID);
89
+ expect(address.searchParams.get('redirect_uri')).toBe(redirectUri);
90
+ expect(address.searchParams.get('state')).toBe(begun.state);
91
+ expect(address.searchParams.get('code_challenge')).toBe(createHash('sha256').update(begun.codeVerifier).digest('base64url'));
92
+ expect(address.searchParams.get('code_challenge_method')).toBe('S256');
93
+ expect(address.searchParams.has('scope')).toBe(false);
94
+ const tokens = await flow.complete({ code: 'test-code', state: begun.state, expectedState: begun.state, codeVerifier: begun.codeVerifier, redirectUri });
95
+ expect(tokens.accessToken).toBe('ghu_testuser');
96
+ expect(seen).toHaveLength(1);
97
+ expect(seen[0].method).toBe('POST');
98
+ expect(seen[0].url).toBe('https://github.com/login/oauth/access_token');
99
+ expect(seen[0].headers.get('accept')).toBe('application/json');
100
+ const form = new URLSearchParams(seen[0].body ?? '');
101
+ expect(form.get('code')).toBe('test-code');
102
+ expect(form.get('code_verifier')).toBe(begun.codeVerifier);
103
+ expect(form.get('client_id')).toBe(CLIENT_ID);
104
+ expect(form.get('client_secret')).toBe('test-client-secret');
105
+ expect(form.get('redirect_uri')).toBe(redirectUri);
106
+ await expect(flow.keep('person', tokens)).rejects.toThrow('this flow has no store');
107
+ });
108
+ it("reads a user token's person, its installations across pages and an installation's repositories at the API base given", async () => {
109
+ const { fetchImpl, seen } = standIn((request) => {
110
+ const url = new URL(request.url);
111
+ if (url.pathname === '/user')
112
+ return json({ login: 'test-person', id: 501, type: 'User' });
113
+ if (url.pathname === '/user/installations' && url.searchParams.get('page') === '2') {
114
+ return json({ total_count: 2, installations: [{ id: 12, account: { login: 'second-team', id: 902 } }] });
115
+ }
116
+ if (url.pathname === '/user/installations') {
117
+ const next = `${BASE}/user/installations?per_page=100&page=2`;
118
+ return json({ total_count: 2, installations: [{ id: 11, account: { login: 'first-team', id: 901 } }] }, 200, {
119
+ link: `<${next}>; rel="next", <${next}>; rel="last"`,
120
+ });
121
+ }
122
+ if (url.pathname === '/user/installations/11/repositories') {
123
+ return json({
124
+ total_count: 1,
125
+ repository_selection: 'selected',
126
+ repositories: [{ id: 7, full_name: 'first-team/handbook', default_branch: 'main', private: true }],
127
+ });
128
+ }
129
+ return json({ message: 'Not Found' }, 404);
130
+ });
131
+ const at = { fetchImpl, apiBase: BASE };
132
+ expect(await userOfToken('ghu_testuser', at)).toEqual({ id: 501, login: 'test-person' });
133
+ expect(await installationsOfUser('ghu_testuser', at)).toEqual([
134
+ { id: 11, account: { login: 'first-team', id: 901 } },
135
+ { id: 12, account: { login: 'second-team', id: 902 } },
136
+ ]);
137
+ expect(await repositoriesOfUser('ghu_testuser', 11, at)).toEqual([{ id: 7, fullName: 'first-team/handbook', defaultBranch: 'main' }]);
138
+ expect(seen.map((request) => new URL(request.url).pathname)).toEqual(['/user', '/user/installations', '/user/installations', '/user/installations/11/repositories']);
139
+ expect(seen.every((request) => request.url.startsWith(`${BASE}/`))).toBe(true);
140
+ expect(seen.every((request) => request.headers.get('authorization') === 'Bearer ghu_testuser')).toBe(true);
141
+ expect(seen.every((request) => request.headers.get('x-github-api-version') === '2026-03-10')).toBe(true);
142
+ });
143
+ it("checks a delivery's X-Hub-Signature-256 against the raw body", () => {
144
+ // The test vector of https://docs.github.com/en/webhooks/using-webhooks/validating-webhook-deliveries
145
+ const secret = "It's a Secret to Everybody";
146
+ const body = new TextEncoder().encode('Hello, World!');
147
+ const right = 'sha256=757107ea0eb2509fc211221cce984b8a37570b6d7586c22c46f4379c8b043e17';
148
+ expect(verifyWebhookSignature(body, right, secret)).toBe(true);
149
+ expect(verifyWebhookSignature(body, `${right.slice(0, -1)}8`, secret)).toBe(false);
150
+ expect(verifyWebhookSignature(new TextEncoder().encode('Hello, World?'), right, secret)).toBe(false);
151
+ expect(verifyWebhookSignature(body, null, secret)).toBe(false);
152
+ expect(verifyWebhookSignature(body, right.slice(0, -2), secret)).toBe(false);
153
+ expect(verifyWebhookSignature(body, `${right}00`, secret)).toBe(false);
154
+ expect(verifyWebhookSignature(body, `sha1=${createHmac('sha1', secret).update(body).digest('hex')}`, secret)).toBe(false);
155
+ });
156
+ it("reconciles links: an installation gone, a repository's head moved, a day's failed deliveries asked for again", async () => {
157
+ const now = Date.now();
158
+ const hours = (count) => new Date(now - count * 3_600_000).toISOString();
159
+ const headBefore = 'a'.repeat(40);
160
+ const headNow = 'b'.repeat(40);
161
+ const headSame = 'c'.repeat(40);
162
+ const { fetchImpl, seen } = standIn((request) => {
163
+ const url = new URL(request.url);
164
+ if (url.pathname === '/app/installations')
165
+ return json([{ id: 21, account: { login: 'first-team', id: 901 } }, { id: 23, account: null }]);
166
+ const tokenFor = /^\/app\/installations\/(\d+)\/access_tokens$/.exec(url.pathname);
167
+ if (tokenFor !== null) {
168
+ const ids = JSON.parse(request.body ?? '{}').repository_ids;
169
+ if (ids.includes(9))
170
+ return json({ message: 'There is at least one repository that does not exist' }, 422);
171
+ return json({ token: `ghs_repo${ids.join('_')}`, expires_at: new Date(now + 3_600_000).toISOString() }, 201);
172
+ }
173
+ if (url.pathname === '/repos/first-team/handbook/branches/main')
174
+ return json({ name: 'main', commit: { sha: headNow } });
175
+ if (url.pathname === '/repos/first-team/notes/branches/trunk')
176
+ return json({ name: 'trunk', commit: { sha: headSame } });
177
+ if (url.pathname === '/app/hook/deliveries') {
178
+ const cursor = url.searchParams.get('cursor');
179
+ if (cursor === null) {
180
+ return json([
181
+ { id: 9003, guid: 'guid-2', delivered_at: hours(1), redelivery: true, status: 'OK', status_code: 200 },
182
+ { id: 9001, guid: 'guid-1', delivered_at: hours(2), redelivery: false, status: 'Internal Server Error', status_code: 500 },
183
+ { id: 9002, guid: 'guid-2', delivered_at: hours(3), redelivery: false, status: 'Bad Gateway', status_code: 502 },
184
+ ], 200, { link: `<${BASE}/app/hook/deliveries?per_page=100&cursor=page2>; rel="next"` });
185
+ }
186
+ if (cursor === 'page2') {
187
+ return json([
188
+ { id: 9004, guid: 'guid-3', delivered_at: hours(5), redelivery: false, status: 'OK', status_code: 200 },
189
+ { id: 9005, guid: 'guid-4', delivered_at: hours(30), redelivery: false, status: 'Internal Server Error', status_code: 500 },
190
+ ], 200, { link: `<${BASE}/app/hook/deliveries?per_page=100&cursor=page3>; rel="next"` });
191
+ }
192
+ return json([{ id: 9006, guid: 'guid-5', delivered_at: hours(40), redelivery: false, status: 'Internal Server Error', status_code: 500 }]);
193
+ }
194
+ if (url.pathname === '/app/hook/deliveries/9001/attempts' && request.method === 'POST')
195
+ return new Response(null, { status: 202 });
196
+ return json({ message: 'Not Found' }, 404);
197
+ });
198
+ const credential = new GitHubAppCredential({ clientId: CLIENT_ID, privateKey: keys.privateKey }, fetchImpl, BASE);
199
+ const outcome = await reconcileInstallations(credential, [
200
+ {
201
+ installationId: 21,
202
+ repositories: [
203
+ { id: 7, fullName: 'first-team/handbook', defaultBranch: 'main', headCommit: headBefore },
204
+ { id: 8, fullName: 'first-team/notes', defaultBranch: 'trunk', headCommit: headSame },
205
+ { id: 9, fullName: 'first-team/removed', defaultBranch: 'main', headCommit: headBefore },
206
+ ],
207
+ },
208
+ { installationId: 22, repositories: [{ id: 30, fullName: 'gone-team/docs', defaultBranch: 'main', headCommit: headBefore }] },
209
+ ], { since: new Date(now - 86_400_000), fetchImpl, apiBase: BASE });
210
+ expect(outcome).toEqual({
211
+ gone: [22],
212
+ moved: [{ installationId: 21, repositoryId: 7, head: headNow }],
213
+ redelivered: [9001],
214
+ unreadable: [{ installationId: 21, repositoryId: 9, status: 422 }],
215
+ });
216
+ const branchRead = seen.find((request) => request.url === `${BASE}/repos/first-team/handbook/branches/main`);
217
+ expect(branchRead?.headers.get('authorization')).toBe('Bearer ghs_repo7');
218
+ expect(seen.some((request) => request.url.includes('/app/installations/22/'))).toBe(false);
219
+ expect(seen.some((request) => request.url.includes('cursor=page3'))).toBe(false);
220
+ const appCalls = seen.filter((request) => request.url.includes('/app/installations?') || request.url.includes('/app/hook/'));
221
+ expect(appCalls.length).toBeGreaterThan(0);
222
+ expect(appCalls.every((request) => appClaims(request.headers.get('authorization')) !== null)).toBe(true);
223
+ });
224
+ it('uninstalls with the JWT, taking 202, 204 and 404 as done and throwing other answers without their body', async () => {
225
+ const { fetchImpl, seen } = standIn((request) => {
226
+ const id = new URL(request.url).pathname.split('/').pop();
227
+ if (id === '31')
228
+ return new Response(null, { status: 202 });
229
+ if (id === '32')
230
+ return new Response(null, { status: 204 });
231
+ if (id === '33')
232
+ return json({ message: 'Not Found' }, 404);
233
+ return json({ message: 'internal detail of the failure' }, 500);
234
+ });
235
+ const credential = new GitHubAppCredential({ clientId: CLIENT_ID, privateKey: keys.privateKey }, fetchImpl, BASE);
236
+ const at = { fetchImpl, apiBase: BASE };
237
+ await expect(uninstallInstallation(credential, 31, at)).resolves.toBeUndefined();
238
+ await expect(uninstallInstallation(credential, 32, at)).resolves.toBeUndefined();
239
+ await expect(uninstallInstallation(credential, 33, at)).resolves.toBeUndefined();
240
+ const failure = await uninstallInstallation(credential, 34, at).catch((error) => error);
241
+ expect(failure).toBeInstanceOf(GitHubApiError);
242
+ expect(failure.status).toBe(500);
243
+ expect(failure.message).not.toContain('internal detail');
244
+ expect(seen.map((request) => `${request.method} ${request.url}`)).toEqual([31, 32, 33, 34].map((id) => `DELETE ${BASE}/app/installations/${id}`));
245
+ expect(seen.every((request) => appClaims(request.headers.get('authorization')) !== null)).toBe(true);
246
+ });
247
+ });
248
+ //# sourceMappingURL=app.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.test.js","sourceRoot":"","sources":["../../src/__tests__/app.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EACL,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAU/B,mEAAmE;AACnE,SAAS,OAAO,CAAC,KAAkC;IACjD,MAAM,IAAI,GAAW,EAAE,CAAC;IACxB,MAAM,SAAS,GAAiB,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACpD,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;QAC9F,MAAM,OAAO,GAAS;YACpB,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK;YAC7B,GAAG;YACH,OAAO,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;YACnC,IAAI,EAAE,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;SACxD,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC,CAAC;IACF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,qBAAqB;AACrB,SAAS,IAAI,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG,EAAE,UAAkC,EAAE;IAC7E,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC;AACrH,CAAC;AAED,MAAM,IAAI,GAAG,uBAAuB,CAAC;AACrC,MAAM,SAAS,GAAG,kBAAkB,CAAC;AACrC,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE;IACtC,aAAa,EAAE,IAAI;IACnB,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;IAClD,kBAAkB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;CACrD,CAAC,CAAC;AAEH,8FAA8F;AAC9F,SAAS,SAAS,CAAC,aAA4B;IAC7C,MAAM,KAAK,GAAG,uCAAuC,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAChF,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;IACxC,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IAClI,OAAO,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA6B,CAAC,CAAC,CAAC,IAAI,CAAC;AACpH,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,aAAa,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,+FAA+F,EAAE,GAAG,EAAE;QACvG,MAAM,GAAG,GAAG,aAAa,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC;QAChF,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1G,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/H,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtI,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mHAAmH,EAAE,KAAK,IAAI,EAAE;QACjI,EAAE,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvC,EAAE,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACnD,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;YACvC,MAAM,IAAI,CAAC,CAAC;YACZ,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/G,CAAC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,mBAAmB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAElH,MAAM,CAAC,MAAM,UAAU,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,qCAAqC,CAAC,CAAC;QACvE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1F,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAE3E,EAAE,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,UAAU,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAE7B,EAAE,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,UAAU,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4GAA4G,EAAE,KAAK,IAAI,EAAE;QAC1H,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CACvC,IAAI,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,wBAAwB,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CACjK,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,iBAAiB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,oBAAoB,EAAE,EAAE,SAAS,CAAC,CAAC;QAC3G,MAAM,WAAW,GAAG,6CAA6C,CAAC;QAElE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QAChG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7H,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;QACzJ,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QACxE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEnD,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sHAAsH,EAAE,KAAK,IAAI,EAAE;QACpI,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3F,IAAI,GAAG,CAAC,QAAQ,KAAK,qBAAqB,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;gBACnF,OAAO,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3G,CAAC;YACD,IAAI,GAAG,CAAC,QAAQ,KAAK,qBAAqB,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,GAAG,IAAI,yCAAyC,CAAC;gBAC9D,OAAO,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE;oBAC3G,IAAI,EAAE,IAAI,IAAI,mBAAmB,IAAI,eAAe;iBACrD,CAAC,CAAC;YACL,CAAC;YACD,IAAI,GAAG,CAAC,QAAQ,KAAK,qCAAqC,EAAE,CAAC;gBAC3D,OAAO,IAAI,CAAC;oBACV,WAAW,EAAE,CAAC;oBACd,oBAAoB,EAAE,UAAU;oBAChC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;iBACnG,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAExC,MAAM,CAAC,MAAM,WAAW,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,MAAM,mBAAmB,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5D,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE;YACrD,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE;SACvD,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,kBAAkB,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAEtI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,qCAAqC,CAAC,CAAC,CAAC;QACrK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3G,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,sGAAsG;QACtG,MAAM,MAAM,GAAG,4BAA4B,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,yEAAyE,CAAC;QAExF,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnF,MAAM,CAAC,sBAAsB,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrG,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7E,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,QAAQ,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5H,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8GAA8G,EAAE,KAAK,IAAI,EAAE;QAC5H,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QACzF,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB;gBAAE,OAAO,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3I,MAAM,QAAQ,GAAG,8CAA8C,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnF,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAkC,CAAC,cAAc,CAAC;gBAC9F,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,sDAAsD,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC3G,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YAC/G,CAAC;YACD,IAAI,GAAG,CAAC,QAAQ,KAAK,0CAA0C;gBAAE,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YACzH,IAAI,GAAG,CAAC,QAAQ,KAAK,wCAAwC;gBAAE,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YACzH,IAAI,GAAG,CAAC,QAAQ,KAAK,sBAAsB,EAAE,CAAC;gBAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC9C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,OAAO,IAAI,CACT;wBACE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;wBACtG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,WAAW,EAAE,GAAG,EAAE;wBAC1H,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,EAAE;qBACjH,EACD,GAAG,EACH,EAAE,IAAI,EAAE,IAAI,IAAI,6DAA6D,EAAE,CAChF,CAAC;gBACJ,CAAC;gBACD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;oBACvB,OAAO,IAAI,CACT;wBACE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;wBACvG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,WAAW,EAAE,GAAG,EAAE;qBAC5H,EACD,GAAG,EACH,EAAE,IAAI,EAAE,IAAI,IAAI,6DAA6D,EAAE,CAChF,CAAC;gBACJ,CAAC;gBACD,OAAO,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YAC7I,CAAC;YACD,IAAI,GAAG,CAAC,QAAQ,KAAK,oCAAoC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACnI,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,mBAAmB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAElH,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAC1C,UAAU,EACV;YACE;gBACE,cAAc,EAAE,EAAE;gBAClB,YAAY,EAAE;oBACZ,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE;oBACzF,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE;oBACrF,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE;iBACzF;aACF;YACD,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE;SAC9H,EACD,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAChE,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACtB,IAAI,EAAE,CAAC,EAAE,CAAC;YACV,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YAC/D,WAAW,EAAE,CAAC,IAAI,CAAC;YACnB,UAAU,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;SACnE,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,KAAK,GAAG,IAAI,0CAA0C,CAAC,CAAC;QAC7G,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1E,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3F,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7H,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wGAAwG,EAAE,KAAK,IAAI,EAAE;QACtH,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9C,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC1D,IAAI,EAAE,KAAK,IAAI;gBAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC5D,IAAI,EAAE,KAAK,IAAI;gBAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC5D,IAAI,EAAE,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,gCAAgC,EAAE,EAAE,GAAG,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,mBAAmB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAClH,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAExC,MAAM,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QACjF,MAAM,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QACjF,MAAM,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QACjF,MAAM,OAAO,GAAY,MAAM,qBAAqB,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAC1G,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,CAAE,OAA0B,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,CAAE,OAA0B,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAE7E,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,IAAI,sBAAsB,EAAE,EAAE,CAAC,CAAC,CAAC;QAClJ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @fileoverview `GitHubDocumentsConnector` over a fetch stand-in that answers a repository's branch, trees and raw
3
+ * files and records each request: the documentation filter, a truncated tree read by subtree within its request
4
+ * budget, a listing kept for a commit, raw reads with their attribution and their cap, and a push compared by its tree.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=documents.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/documents.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}