{"version":3,"file":"proangular-ngx-gist.mjs","sources":["../../../src/app/public/ngx-gist.utilities.ts","../../../src/app/public/ngx-gist-file-filter.pipe.ts","../../../src/app/public/ngx-gist-line-numbers.service.ts","../../../src/app/public/ngx-gist-theme.service.ts","../../../src/app/public/ngx-gist.model.ts","../../../src/app/public/ngx-gist.service.ts","../../../src/app/public/ngx-gist.component.ts","../../../src/app/public/ngx-gist.component.html","../../../src/app/public/proangular-ngx-gist.ts"],"sourcesContent":["import { getOrElse } from 'fp-ts/es6/Either';\nimport { pipe } from 'fp-ts/es6/function';\nimport * as io from 'io-ts';\n\n/**\n * Validate that the value is a string.\n */\nfunction isString(value: unknown): value is string {\n  return typeof value === 'string' || value instanceof String;\n}\n\n/**\n * Validate that the value is a string that is non-empty.\n */\nexport function isNonEmptyString(value: unknown): value is string {\n  return isString(value) && value.length > 0 && value.trim().length > 0;\n}\n\nexport function isStringArray(value: unknown): value is string[] {\n  return Array.isArray(value) && value.every((v) => typeof v === 'string');\n}\n\nexport function isNonEmptyValue<T>(value: T): value is NonNullable<T> {\n  return value !== null && value !== undefined;\n}\n\n/**\n * Decode by parsing json object of string value.\n */\nexport const parsedJsonFromStringCodec = new io.Type<unknown, string, string>(\n  'ParsedJSONFromString',\n  (potentiallyUnknownValue): potentiallyUnknownValue is unknown => true,\n  (stringValue, context) => {\n    try {\n      return io.success(JSON.parse(stringValue));\n    } catch {\n      return io.failure(stringValue, context);\n    }\n  },\n  (unknownValue) => JSON.stringify(unknownValue),\n);\n\n/**\n * Decode value using a passed codec and its' decoder.\n *\n * @param codec Codec used to decode value.\n *\n * @typeParam A - Static type (expected)\n * @typeParam O - Encode outputs of type\n * @typeParam I - Decode input of type\n *\n * @returns The decoeded value or null if an error occurs.\n */\nexport function decodeValueElseNull<A, I, O = unknown>(\n  codec: io.Type<A, O, I>,\n): (value: I) => A | null {\n  return (value) =>\n    pipe(\n      codec.decode(value),\n      getOrElse(() => null as A | null),\n    );\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { NgxGist } from './ngx-gist.model';\nimport { isNonEmptyString, isStringArray } from './ngx-gist.utilities';\n\n@Pipe({ name: 'gistFileFilter' })\nexport class GistFileFilterPipe implements PipeTransform {\n  public transform(\n    files: NgxGist['highlightedFiles'] | null,\n    displayOnlyFileNames?: string | readonly string[] | null,\n  ): NgxGist['highlightedFiles'] {\n    if (!files) {\n      return [];\n    }\n\n    if (!displayOnlyFileNames || displayOnlyFileNames === '') {\n      return files;\n    }\n\n    if (isNonEmptyString(displayOnlyFileNames)) {\n      return (\n        files.filter(({ filename }) => displayOnlyFileNames === filename) ?? []\n      );\n    }\n\n    if (isStringArray(displayOnlyFileNames)) {\n      return files.filter(({ filename }) =>\n        displayOnlyFileNames.includes(filename),\n      );\n    }\n\n    return files;\n  }\n}\n","import hljs, { HLJSApi } from 'highlight.js';\nimport {\n  Observable,\n  defaultIfEmpty,\n  filter,\n  firstValueFrom,\n  from,\n  map,\n} from 'rxjs';\n\nimport { DOCUMENT } from '@angular/common';\nimport { Injectable, inject } from '@angular/core';\n\n@Injectable({ providedIn: 'root' }) // Must be a singleton\nexport class NgxGistLineNumbersService {\n  private readonly document: Document = inject(DOCUMENT);\n\n  private isLoaded = false;\n\n  public async load(): Promise<void> {\n    if (\n      this.isLoaded ||\n      typeof this.document.defaultView?.hljs?.initLineNumbersOnLoad ===\n        'function'\n    ) {\n      return;\n    }\n\n    try {\n      if (this.document.defaultView) {\n        // Ensure hljs is available before we load the dependent library\n        this.document.defaultView.hljs = hljs;\n      } else {\n        throw new Error(\n          `Unable to access default view to apply \"highlight.js\" package.`,\n        );\n      }\n\n      const result = await firstValueFrom(this.loadHljsLineNumbersLibrary());\n      if (result) {\n        this.document.defaultView?.hljs?.initLineNumbersOnLoad?.();\n      }\n    } catch (e) {\n      console.error(e);\n    } finally {\n      this.isLoaded = true;\n    }\n  }\n\n  private loadHljsLineNumbersLibrary(): Observable<unknown> {\n    return from(import('highlightjs-line-numbers.js' as const)).pipe(\n      map((module) => module?.default), // Optional chaining makes it cleaner\n      filter(Boolean), // `Boolean` acts as a filter to remove falsy values\n      defaultIfEmpty(null),\n    );\n  }\n}\n\ninterface HljsLineNumbersOptions {\n  singleLine?: boolean;\n  startFrom?: number;\n}\n\ndeclare global {\n  interface Window {\n    hljs?: HLJSApi & {\n      initLineNumbersOnLoad?: (options?: HljsLineNumbersOptions) => void;\n      lineNumbersBlock?: (\n        value: Element,\n        options?: HljsLineNumbersOptions,\n      ) => void;\n      lineNumbersValue?: (\n        value: string,\n        options?: HljsLineNumbersOptions,\n      ) => string;\n    };\n  }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, inject } from '@angular/core';\n\n@Injectable({ providedIn: 'root' }) // Must be a singleton\nexport class NgxGistThemeService {\n  private readonly document: Document = inject(DOCUMENT);\n\n  private importElHljsTheme: HTMLLinkElement | null = null;\n\n  public setTheme(hilightJsTheme: HighlightJsTheme): void {\n    const hljsThemeId = 'hljs-theme-import';\n    const hljsThemeLinkEl = this.document.getElementById(hljsThemeId);\n\n    if (hljsThemeLinkEl && hilightJsTheme === 'default') {\n      // Default theme already in use, return.\n      return;\n    } else if (hljsThemeLinkEl && hilightJsTheme !== 'default') {\n      // Override previously used theme, but remove it first.\n      this.document.head.removeChild(hljsThemeLinkEl);\n    }\n\n    const version = '11.11.1'; // Update with version!\n    const url = `highlight.js@${version}/styles/${hilightJsTheme}.css`;\n    this.importElHljsTheme = this.document.createElement('link');\n    this.importElHljsTheme.href = `https://unpkg.com/${url}`;\n    this.importElHljsTheme.rel = 'stylesheet';\n    this.importElHljsTheme.id = hljsThemeId;\n    this.document.head.appendChild(this.importElHljsTheme);\n  }\n}\n\nexport type HighlightJsTheme =\n  | 'a11y-dark'\n  | 'a11y-light'\n  | 'agate'\n  | 'androidstudio'\n  | 'an-old-hope'\n  | 'arduino-light'\n  | 'arta'\n  | 'ascetic'\n  | 'atom-one-dark'\n  | 'atom-one-dark-reasonable'\n  | 'atom-one-light'\n  | 'brown-paper'\n  | 'codepen-embed'\n  | 'color-brewer'\n  | 'dark'\n  | 'default'\n  | 'devibeans'\n  | 'docco'\n  | 'far'\n  | 'felipec'\n  | 'foundation'\n  | 'github'\n  | 'github-dark'\n  | 'github-dark-dimmed'\n  | 'gml'\n  | 'googlecode'\n  | 'gradient-dark'\n  | 'gradient-light'\n  | 'grayscale'\n  | 'hybrid'\n  | 'idea'\n  | 'intellij-light'\n  | 'ir-black'\n  | 'isbl-editor-dark'\n  | 'isbl-editor-light'\n  | 'kimbie-dark'\n  | 'kimbie-light'\n  | 'lightfair'\n  | 'lioshi'\n  | 'magula'\n  | 'mono-blue'\n  | 'monokai'\n  | 'monokai-sublime'\n  | 'night-owl'\n  | 'nnfx-dark'\n  | 'nnfx-light'\n  | 'nord'\n  | 'obsidian'\n  | 'panda-syntax-dark'\n  | 'panda-syntax-light'\n  | 'paraiso-dark'\n  | 'paraiso-light'\n  | 'pojoaque'\n  | 'purebasic'\n  | 'qtcreator-dark'\n  | 'qtcreator-light'\n  | 'rainbow'\n  | 'routeros'\n  | 'school-book'\n  | 'shades-of-purple'\n  | 'srcery'\n  | 'stackoverflow-dark'\n  | 'stackoverflow-light'\n  | 'sunburst'\n  | 'tokyo-night-dark'\n  | 'tokyo-night-light'\n  | 'tomorrow-night-blue'\n  | 'tomorrow-night-bright'\n  | 'vs'\n  | 'vs2015'\n  | 'xcode'\n  | 'xt256';\n","import hljs from 'highlight.js';\nimport * as io from 'io-ts';\nimport * as iot from 'io-ts-types';\n\nimport {\n  decodeValueElseNull,\n  isNonEmptyString,\n  parsedJsonFromStringCodec,\n} from './ngx-gist.utilities';\n\nexport class NgxGist implements Gist {\n  public constructor(args: Gist & Pick<NgxGist, 'languageOverride'>) {\n    this.comments = args.comments;\n    this.comments_url = args.comments_url;\n    this.commits_url = args.commits_url;\n    this.created_at = new Date(args.created_at);\n    this.description = args.description;\n    this.files = args.files;\n    this.forks = args.forks;\n    this.forks_url = args.forks_url;\n    this.git_pull_url = args.git_pull_url;\n    this.git_push_url = args.git_push_url;\n    this.history = args.history;\n    this.html_url = args.html_url;\n    this.id = args.id;\n    this.node_id = args.node_id;\n    this.owner = args.owner;\n    this.public = args.public;\n    this.truncated = args.truncated;\n    this.updated_at = new Date(args.updated_at);\n    this.url = args.url;\n    this.user = args.user;\n\n    // Additional properties\n    this.languageOverride = args.languageOverride;\n    const highlightedFiles: NgxGist['highlightedFiles'] = [];\n    for (const key in this.files) {\n      if (this.files[key]) {\n        const file = this.files[key];\n        highlightedFiles.push({\n          ...file,\n          highlightedContent: getHighlightedContent(file.content),\n        });\n      }\n    }\n    this.highlightedFiles = highlightedFiles;\n  }\n\n  /** Core gist properties */\n  /* eslint-disable @typescript-eslint/naming-convention */\n  public readonly comments: number;\n  public readonly comments_url: string;\n  public readonly commits_url: string;\n  public readonly created_at: Date;\n  public readonly description: string;\n  public readonly files: io.TypeOf<typeof gistFilesCodec>;\n  public readonly forks: unknown[];\n  public readonly forks_url: string;\n  public readonly git_pull_url: string;\n  public readonly git_push_url: string;\n  public readonly history: Array<io.TypeOf<typeof gistHistoryCodec>>;\n  public readonly html_url: string;\n  public readonly id: string;\n  public readonly node_id: string;\n  public readonly owner?: io.TypeOf<typeof gitHubUserCodec>;\n  public readonly public: boolean;\n  public readonly truncated: boolean;\n  public readonly updated_at: Date;\n  public readonly url: string;\n  public readonly user?: unknown;\n  /* eslint-enable @typescript-eslint/naming-convention */\n\n  /** Additional properties */\n  public readonly highlightedFiles: HighlightedFiles;\n  public readonly languageOverride?: string;\n\n  /**\n   * Create a local, static gist object. Do not use this for fetched data.\n   * Used for creating and displaying local code samples.\n   *\n   * Use `deserialize` sibling function for remote \"unknown\" responses.\n   *\n   * @param args Minimally necessary paramaters for displaying local code.\n   * @returns A 'partial' model in which unnecessary fields are dummny data.\n   */\n  public static create(\n    args: { files: Files } & Partial<Pick<Gist, 'created_at' | 'description'>> & // Required // Optional\n      Pick<NgxGist, 'languageOverride'>, // Optional\n  ): NgxGist {\n    const files: NgxGist['files'] = args.files.reduce((prev, curr) => {\n      const file: GistFilesContent = {\n        // Passed in values, use these.\n        content: curr.content,\n        filename: curr.filename,\n        // Leave these empty, not needed for a local, static model.\n        language: '',\n        raw_url: '',\n        size: 0,\n        truncated: false,\n        type: '',\n      };\n      return {\n        ...prev,\n        [curr.filename]: file,\n      };\n    }, {});\n    return new NgxGist({\n      // Properties with settable values. These are the mimimum values needed\n      // for displaying non \"remote\".\n      created_at: args.created_at ? new Date(args.created_at) : new Date(),\n      description: args.description ?? '',\n      files,\n      languageOverride: args.languageOverride,\n      // Empty properties that aren't needed for displaying non \"remote\" gists\n      comments: 0,\n      comments_url: '',\n      commits_url: '',\n      forks: [],\n      forks_url: '',\n      git_pull_url: '',\n      git_push_url: '',\n      history: [],\n      html_url: '',\n      id: '',\n      node_id: '',\n      owner: undefined,\n      public: true,\n      truncated: false,\n      updated_at: new Date(),\n      url: '',\n      user: undefined,\n    });\n  }\n\n  /**\n   * Deserialize and decode fetched/unknown data into the full model.\n   *\n   * @param value Unknown value, but expects a full model either by object or JSON string.\n   * @returns Either the full model or null if deserialization fails.\n   */\n  public static deserialize(value: unknown): NgxGist | null {\n    const decoded =\n      // Decode as object or continue\n      decodeValueElseNull(gistCodec)(value) ||\n      // Decode as string or return null\n      (isNonEmptyString(value)\n        ? decodeValueElseNull(gistFromJsonStringCodec)(value)\n        : null);\n    return decoded\n      ? new NgxGist({\n          ...decoded,\n          created_at: new Date(decoded.created_at),\n          updated_at: new Date(decoded.updated_at),\n        })\n      : null;\n  }\n}\n\ntype Files = Array<Pick<GistFilesContent, 'content' | 'filename'>>;\n\ntype HighlightedFiles = Array<GistFilesContent & HighlightedContent>;\n\ninterface HighlightedContent {\n  highlightedContent: string;\n}\n\nfunction getHighlightedContent(\n  baseContent: string,\n  languageOverride?: string,\n): string {\n  let highlighted = baseContent;\n\n  if (languageOverride) {\n    highlighted = hljs.highlight(baseContent, {\n      language: languageOverride,\n    }).value;\n  } else {\n    highlighted = hljs.highlightAuto(baseContent).value;\n  }\n\n  return highlighted;\n}\n\nconst gitHubUserCodec = io.readonly(\n  io.type({\n    avatar_url: io.string,\n    events_url: io.string,\n    followers_url: io.string,\n    following_url: io.string,\n    gists_url: io.string,\n    gravatar_id: io.string,\n    html_url: io.string,\n    id: io.number,\n    login: io.string,\n    node_id: io.string,\n    organizations_url: io.string,\n    received_events_url: io.string,\n    repos_url: io.string,\n    site_admin: io.boolean,\n    starred_url: io.string,\n    subscriptions_url: io.string,\n    type: io.string,\n    url: io.string,\n  }),\n  'GitHubUser',\n);\n\nconst gistHistoryChangeStatusCodec = io.readonly(\n  io.type({\n    additions: io.number,\n    deletions: io.number,\n    total: io.number,\n  }),\n  'GistChangeStatus',\n);\n\nconst gistHistoryCodec = io.readonly(\n  io.type({\n    change_status: gistHistoryChangeStatusCodec,\n    committed_at: io.union([iot.date, io.string]),\n    url: io.string,\n    user: gitHubUserCodec,\n    version: io.string,\n  }),\n  'GistHistory',\n);\n\nconst gistFilesContent = io.type({\n  content: io.string,\n  filename: io.string,\n  language: io.string,\n  raw_url: io.string,\n  size: io.number,\n  truncated: io.boolean,\n  type: io.string,\n});\ntype GistFilesContent = io.TypeOf<typeof gistFilesContent>;\n\nconst gistFilesCodec = io.record(io.string, gistFilesContent);\n\nexport const gistCodec = io.readonly(\n  io.intersection([\n    io.type({\n      comments: io.number,\n      comments_url: io.string,\n      commits_url: io.string,\n      created_at: io.union([iot.date, io.string]),\n      description: io.string,\n      files: gistFilesCodec,\n      forks: io.UnknownArray,\n      forks_url: io.string,\n      git_pull_url: io.string,\n      git_push_url: io.string,\n      history: io.array(gistHistoryCodec),\n      html_url: io.string,\n      id: io.string,\n      node_id: io.string,\n      public: io.boolean,\n      truncated: io.boolean,\n      updated_at: io.union([iot.date, io.string]),\n      url: io.string,\n    }),\n    io.partial({\n      owner: io.union([gitHubUserCodec, io.undefined]),\n      user: io.union([io.unknown, io.null, io.undefined]),\n    }),\n  ]),\n  'Gist',\n);\n\nconst gistFromJsonStringCodec = parsedJsonFromStringCodec.pipe(\n  gistCodec,\n  'GistFromJsonString',\n);\n\n/**\n * Official Gist object\n * https://docs.github.com/en/rest/gists\n */\ntype Gist = io.TypeOf<typeof gistCodec>;\n","import * as io from 'io-ts';\nimport { Observable, catchError, map, of } from 'rxjs';\n\nimport { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\n\nimport { NgxGist, gistCodec } from './ngx-gist.model';\nimport {\n  decodeValueElseNull,\n  isNonEmptyString,\n  parsedJsonFromStringCodec,\n} from './ngx-gist.utilities';\n\n@Injectable()\nexport class NgxGistService {\n  private readonly httpClient = inject(HttpClient);\n\n  private readonly delimiter = '||';\n\n  /**\n   * Fetch gist data from GitHub.\n   *\n   * @param gistId GitHub gist id\n   * @returns Full gist model on success, undefined on error, null on deserialize failure.\n   */\n  public get(gistId: string): Observable<NgxGist | null | undefined> {\n    return this.httpClient\n      .get<\n        NgxGist | string | null | undefined\n      >(`https://api.github.com/gists/${gistId}`)\n      .pipe(\n        catchError((error: unknown) => {\n          console.error(error);\n          return of(undefined);\n        }),\n        map((response) => NgxGist.deserialize(response) ?? null),\n      );\n  }\n\n  public getFromCache(gistId: string): NgxGist | null {\n    const key = `gist${this.delimiter + gistId}`;\n    const value = localStorage.getItem(key);\n    if (value === null || !isNonEmptyString(value)) {\n      // Doesn't exist in memory\n      return null;\n    }\n\n    const storedGist = decodeValueElseNull(storedGistFromJsonStringCodec)(\n      value,\n    );\n    if (!storedGist) {\n      // Failed to deserialize stored data (corruption?). Remote it and return.\n      localStorage.removeItem(key);\n      return null;\n    }\n\n    const now = new Date();\n    if (now.getTime() > storedGist.expiration) {\n      // Stored value has since expired, remove it and return.\n      localStorage.removeItem(key);\n      return null;\n    }\n\n    const gist = storedGist.value;\n    // All is good, return unexpired gist\n    return new NgxGist({\n      ...gist,\n      created_at: new Date(gist.created_at),\n      updated_at: new Date(gist.updated_at),\n    });\n  }\n\n  public setToCache(gist: NgxGist, expiresInMin?: number): void {\n    const key = `gist${this.delimiter + gist.id}`;\n    const now = new Date();\n    const expiresInMs = expiresInMin ? expiresInMin * 60000 : 0;\n    const value: StoredGist = {\n      expiration: now.getTime() + expiresInMs,\n      value: gist,\n    };\n    const stringValue = JSON.stringify(value);\n    localStorage.setItem(key, stringValue);\n  }\n}\n\nconst storedGistCodec = io.readonly(\n  io.type({\n    expiration: io.number,\n    value: gistCodec,\n  }),\n  'StoredGist',\n);\n\nconst storedGistFromJsonStringCodec = parsedJsonFromStringCodec.pipe(\n  storedGistCodec,\n  'StoredGistFromJsonString',\n);\n\ntype StoredGist = io.TypeOf<typeof storedGistCodec>;\n","import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { BehaviorSubject, ReplaySubject, filter, firstValueFrom } from 'rxjs';\n\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  Input,\n  OnInit,\n  inject,\n} from '@angular/core';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\nimport { GistFileFilterPipe } from './ngx-gist-file-filter.pipe';\nimport { NgxGistLineNumbersService } from './ngx-gist-line-numbers.service';\nimport {\n  HighlightJsTheme,\n  NgxGistThemeService,\n} from './ngx-gist-theme.service';\nimport { NgxGist } from './ngx-gist.model';\nimport { NgxGistService } from './ngx-gist.service';\nimport { isNonEmptyValue } from './ngx-gist.utilities';\n\n@UntilDestroy()\n@Component({\n  selector: 'ngx-gist',\n  templateUrl: './ngx-gist.component.html',\n  styleUrl: './ngx-gist.component.scss',\n  standalone: true,\n  imports: [CommonModule, GistFileFilterPipe, MatCardModule, MatTabsModule],\n  providers: [NgxGistLineNumbersService, NgxGistService, NgxGistThemeService],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxGistComponent implements OnInit {\n  private readonly document: Document = inject(DOCUMENT);\n  private readonly domSanitizer = inject(DomSanitizer);\n  private readonly ngxGistLineNumbersService = inject(\n    NgxGistLineNumbersService,\n  );\n  private readonly ngxGistService = inject(NgxGistService);\n  private readonly ngxGistThemeService = inject(NgxGistThemeService);\n\n  /**\n   * Display in the DOM only the selected filename(s) from the gists files array.\n   *\n   * Default: `undefined`\n   *\n   * Example: `'my-styles.scss'` or `'super-feature.ts'`\n   *\n   * Tip: Can be either a string or string array. File names much match exactly,\n   * be sure to remove any leading or trailing whitespace in the provided strings.\n   */\n  @Input() public displayOnlyFileNames?: string | readonly string[];\n  /**\n   * Optionally hide the gist link which opens the gist on GitHub. The gist links\n   * automatically dispaly for remote gists, but can be hidden with this feature.\n   *\n   * Default: `false`\n   */\n  @Input() public hideGistLink = false;\n  /**\n   * Provide a static gist model here directly which will be displayed if\n   * no `gistId` is provided for remote fetching. Also this model will be\n   * displayed should a fetch fail when retrieving `gistId`, or overwritten\n   * once the pertaining `gistId` data is fetched.\n   *\n   * Default: `undefined`\n   */\n  @Input() public set gist(value: NgxGist | undefined) {\n    this.gistSubject.next(value);\n  }\n  private readonly gistSubject = new BehaviorSubject<NgxGistComponent['gist']>(\n    undefined,\n  );\n  public readonly gistChanges = this.gistSubject.asObservable();\n  /**\n   * Provide the GitHub gist id to be fetched and loaded. This can be found in\n   * URL of the gists you create. For example the id `TH1515th31DT0C0PY` in:\n   * https://gist.github.com/FakeUserName/TH1515th31DT0C0PY\n   *\n   * Default: `undefined`\n   *\n   * Tip: Alternatively, provide a value directly in the sibling input `gist`.\n   */\n  @Input() public set gistId(value: string) {\n    this.gistIdSubject.next(value);\n  }\n  private readonly gistIdSubject = new ReplaySubject<\n    NgxGistComponent['gistId']\n  >(1);\n  public readonly gistIdChanges = this.gistIdSubject.asObservable();\n  /**\n   * The `highlight.js` code theme to use and display.\n   *\n   * Default: `undefined`\n   *\n   * Note: Only _one_ theme can be loaded on a single page at a time! The first\n   * theme to load will apply to all gists on the page.\n   */\n  @Input() public codeTheme?: HighlightJsTheme;\n  /**\n   * Display or hide the line numbers in your gist code snippets.\n   *\n   * Default: `true`\n   */\n  @Input() public showLineNumbers = true;\n  /**\n   * Cache the GitHub gist request in local memory for 24 hours. GitHub has a\n   * request limit, so this helps in reducing bandwidth. Loads previously\n   * fetched gist content from the users machine on refresh and page re-visits.\n   *\n   * Default: `true`\n   */\n  @Input() public useCache = true;\n\n  public async ngOnInit(): Promise<void> {\n    // Load theme\n    this.setHljsTheme();\n\n    // Load line numbers\n    if (this.showLineNumbers) {\n      await this.ngxGistLineNumbersService.load();\n    }\n\n    // Load gist(s) async\n    this.gistIdChanges\n      .pipe(filter(isNonEmptyValue), untilDestroyed(this))\n      .subscribe(async (gistId) => {\n        if (this.useCache) {\n          const cachedValue = this.ngxGistService.getFromCache(gistId);\n          if (cachedValue) {\n            // Value is cached and not previously expired, use it.\n            this.gist = cachedValue;\n            return;\n          }\n        }\n\n        await this.fetchAndSetGist(gistId);\n      });\n  }\n\n  private async fetchAndSetGist(gistId: string): Promise<void> {\n    // Fetch and hydrate model or fallback to initial gist.\n    const fetcheGist =\n      (await firstValueFrom(this.ngxGistService.get(gistId))) ?? undefined;\n    this.gist = fetcheGist;\n\n    if (this.useCache && fetcheGist) {\n      // Set value in cache for reuse saving on the amount of HTTP requests.\n      // Set refresh time to be a hard coded 24 hours. This was once configurable\n      // but I decided against it for simplicities sake on ease of use.\n      this.ngxGistService.setToCache(fetcheGist, 1440);\n    }\n  }\n\n  private setHljsTheme(): void {\n    if (!this.codeTheme) {\n      return;\n    }\n    this.ngxGistThemeService.setTheme(this.codeTheme);\n  }\n\n  public applyLineNumbers(highlightedConent: string): SafeHtml | null {\n    if (\n      this.showLineNumbers &&\n      this.document.defaultView?.hljs &&\n      typeof this.document.defaultView.hljs.lineNumbersValue === 'function'\n    ) {\n      return this.domSanitizer.bypassSecurityTrustHtml(\n        this.document.defaultView.hljs.lineNumbersValue(highlightedConent),\n      );\n    }\n    return highlightedConent;\n  }\n}\n","<mat-card class=\"code-container\">\n  @if (gistChanges | async; as gist) {\n    <mat-tab-group>\n      @for (\n        file of gist.highlightedFiles | gistFileFilter: displayOnlyFileNames;\n        track file\n      ) {\n        <mat-tab [label]=\"file.filename\">\n          <pre>\n            @if (applyLineNumbers(file.highlightedContent); as content) {\n              <code\n                [innerHTML]=\"content\"\n              ></code>\n            }\n            <ng-template #error>\n              <code>Error loading code...</code>\n            </ng-template>\n          </pre>\n        </mat-tab>\n      }\n    </mat-tab-group>\n  } @else {\n    Loading Code Snippet...\n  }\n  @if (gistIdChanges | async; as gid) {\n    <mat-card-footer>\n      @if (!hideGistLink) {\n        <a target=\"_blank\" [href]=\"'https://gist.github.com/' + gid\">\n          🔗 Open Gist on GitHub\n        </a>\n      }\n    </mat-card-footer>\n  }\n</mat-card>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAIA;;AAEG;AACH,SAAS,QAAQ,CAAC,KAAc,EAAA;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,YAAY,MAAM;AAC7D;AAEA;;AAEG;AACG,SAAU,gBAAgB,CAAC,KAAc,EAAA;AAC7C,IAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;AACvE;AAEM,SAAU,aAAa,CAAC,KAAc,EAAA;IAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ,CAAC;AAC1E;AAEM,SAAU,eAAe,CAAI,KAAQ,EAAA;AACzC,IAAA,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;AAC9C;AAEA;;AAEG;AACI,MAAM,yBAAyB,GAAG,IAAI,EAAE,CAAC,IAAI,CAClD,sBAAsB,EACtB,CAAC,uBAAuB,KAAyC,IAAI,EACrE,CAAC,WAAW,EAAE,OAAO,KAAI;AACvB,IAAA,IAAI;QACF,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5C;AAAE,IAAA,MAAM;QACN,OAAO,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC;IACzC;AACF,CAAC,EACD,CAAC,YAAY,KAAK,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAC/C;AAED;;;;;;;;;;AAUG;AACG,SAAU,mBAAmB,CACjC,KAAuB,EAAA;IAEvB,OAAO,CAAC,KAAK,KACX,IAAI,CACF,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACnB,SAAS,CAAC,MAAM,IAAgB,CAAC,CAClC;AACL;;MCvDa,kBAAkB,CAAA;IACtB,SAAS,CACd,KAAyC,EACzC,oBAAwD,EAAA;QAExD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI,CAAC,oBAAoB,IAAI,oBAAoB,KAAK,EAAE,EAAE;AACxD,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,gBAAgB,CAAC,oBAAoB,CAAC,EAAE;AAC1C,YAAA,QACE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,oBAAoB,KAAK,QAAQ,CAAC,IAAI,EAAE;QAE3E;AAEA,QAAA,IAAI,aAAa,CAAC,oBAAoB,CAAC,EAAE;AACvC,YAAA,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAC/B,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACxC;QACH;AAEA,QAAA,OAAO,KAAK;IACd;uGA1BW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;qGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,gBAAA,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,IAAI;mBAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE;;;MCSnB,yBAAyB,CAAA;AACnB,IAAA,QAAQ,GAAa,MAAM,CAAC,QAAQ,CAAC;IAE9C,QAAQ,GAAG,KAAK;AAEjB,IAAA,MAAM,IAAI,GAAA;QACf,IACE,IAAI,CAAC,QAAQ;YACb,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,qBAAqB;AAC3D,gBAAA,UAAU,EACZ;YACA;QACF;AAEA,QAAA,IAAI;AACF,YAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;;gBAE7B,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI;YACvC;iBAAO;AACL,gBAAA,MAAM,IAAI,KAAK,CACb,CAAA,8DAAA,CAAgE,CACjE;YACH;YAEA,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC;YACtE,IAAI,MAAM,EAAE;gBACV,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,qBAAqB,IAAI;YAC5D;QACF;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAClB;gBAAU;AACR,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACtB;IACF;IAEQ,0BAA0B,GAAA;QAChC,OAAO,IAAI,CAAC,OAAO,6BAAsC,CAAC,CAAC,CAAC,IAAI,CAC9D,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,OAAO,CAAC;AAChC,QAAA,MAAM,CAAC,OAAO,CAAC;AACf,QAAA,cAAc,CAAC,IAAI,CAAC,CACrB;IACH;uGAzCW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,cADZ,MAAM,EAAA,CAAA;;2FACnB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCTrB,mBAAmB,CAAA;AACb,IAAA,QAAQ,GAAa,MAAM,CAAC,QAAQ,CAAC;IAE9C,iBAAiB,GAA2B,IAAI;AAEjD,IAAA,QAAQ,CAAC,cAAgC,EAAA;QAC9C,MAAM,WAAW,GAAG,mBAAmB;QACvC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC;AAEjE,QAAA,IAAI,eAAe,IAAI,cAAc,KAAK,SAAS,EAAE;;YAEnD;QACF;AAAO,aAAA,IAAI,eAAe,IAAI,cAAc,KAAK,SAAS,EAAE;;YAE1D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC;QACjD;AAEA,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC;AAC1B,QAAA,MAAM,GAAG,GAAG,CAAA,aAAA,EAAgB,OAAO,CAAA,QAAA,EAAW,cAAc,MAAM;QAClE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;QAC5D,IAAI,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAA,kBAAA,EAAqB,GAAG,EAAE;AACxD,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,GAAG,YAAY;AACzC,QAAA,IAAI,CAAC,iBAAiB,CAAC,EAAE,GAAG,WAAW;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACxD;uGAxBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA;;2FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCOrB,OAAO,CAAA;AAClB,IAAA,WAAA,CAAmB,IAA8C,EAAA;AAC/D,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ;AAC7B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;AACrC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;QACnC,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AAC3C,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;AACnC,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;AACvB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAC/B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;AACrC,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;AACrC,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;AAC3B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ;AAC7B,QAAA,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE;AACjB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;AAC3B,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;AACvB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;QAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AAC3C,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG;AACnB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;;AAGrB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB;QAC7C,MAAM,gBAAgB,GAAgC,EAAE;AACxD,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE;AAC5B,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;gBAC5B,gBAAgB,CAAC,IAAI,CAAC;AACpB,oBAAA,GAAG,IAAI;AACP,oBAAA,kBAAkB,EAAE,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;AACxD,iBAAA,CAAC;YACJ;QACF;AACA,QAAA,IAAI,CAAC,gBAAgB,GAAG,gBAAgB;IAC1C;;;AAIgB,IAAA,QAAQ;AACR,IAAA,YAAY;AACZ,IAAA,WAAW;AACX,IAAA,UAAU;AACV,IAAA,WAAW;AACX,IAAA,KAAK;AACL,IAAA,KAAK;AACL,IAAA,SAAS;AACT,IAAA,YAAY;AACZ,IAAA,YAAY;AACZ,IAAA,OAAO;AACP,IAAA,QAAQ;AACR,IAAA,EAAE;AACF,IAAA,OAAO;AACP,IAAA,KAAK;AACL,IAAA,MAAM;AACN,IAAA,SAAS;AACT,IAAA,UAAU;AACV,IAAA,GAAG;AACH,IAAA,IAAI;;;AAIJ,IAAA,gBAAgB;AAChB,IAAA,gBAAgB;AAEhC;;;;;;;;AAQG;IACI,OAAO,MAAM,CAClB,IACmC,EAAA;AAEnC,QAAA,MAAM,KAAK,GAAqB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,KAAI;AAC/D,YAAA,MAAM,IAAI,GAAqB;;gBAE7B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;;AAEvB,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,IAAI,EAAE,CAAC;AACP,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,IAAI,EAAE,EAAE;aACT;YACD,OAAO;AACL,gBAAA,GAAG,IAAI;AACP,gBAAA,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI;aACtB;QACH,CAAC,EAAE,EAAE,CAAC;QACN,OAAO,IAAI,OAAO,CAAC;;;AAGjB,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,EAAE;AACpE,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,KAAK;YACL,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;;AAEvC,YAAA,QAAQ,EAAE,CAAC;AACX,YAAA,YAAY,EAAE,EAAE;AAChB,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,SAAS,EAAE,EAAE;AACb,YAAA,YAAY,EAAE,EAAE;AAChB,YAAA,YAAY,EAAE,EAAE;AAChB,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,IAAI,IAAI,EAAE;AACtB,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,IAAI,EAAE,SAAS;AAChB,SAAA,CAAC;IACJ;AAEA;;;;;AAKG;IACI,OAAO,WAAW,CAAC,KAAc,EAAA;AACtC,QAAA,MAAM,OAAO;;AAEX,QAAA,mBAAmB,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC;;aAEpC,gBAAgB,CAAC,KAAK;AACrB,kBAAE,mBAAmB,CAAC,uBAAuB,CAAC,CAAC,KAAK;kBAClD,IAAI,CAAC;AACX,QAAA,OAAO;cACH,IAAI,OAAO,CAAC;AACV,gBAAA,GAAG,OAAO;AACV,gBAAA,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;AACxC,gBAAA,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;aACzC;cACD,IAAI;IACV;AACD;AAUD,SAAS,qBAAqB,CAC5B,WAAmB,EACnB,gBAAyB,EAAA;IAEzB,IAAI,WAAW,GAAG,WAAW;IAE7B,IAAI,gBAAgB,EAAE;AACpB,QAAA,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AACxC,YAAA,QAAQ,EAAE,gBAAgB;SAC3B,CAAC,CAAC,KAAK;IACV;SAAO;QACL,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,KAAK;IACrD;AAEA,IAAA,OAAO,WAAW;AACpB;AAEA,MAAM,eAAe,GAAG,EAAE,CAAC,QAAQ,CACjC,EAAE,CAAC,IAAI,CAAC;IACN,UAAU,EAAE,EAAE,CAAC,MAAM;IACrB,UAAU,EAAE,EAAE,CAAC,MAAM;IACrB,aAAa,EAAE,EAAE,CAAC,MAAM;IACxB,aAAa,EAAE,EAAE,CAAC,MAAM;IACxB,SAAS,EAAE,EAAE,CAAC,MAAM;IACpB,WAAW,EAAE,EAAE,CAAC,MAAM;IACtB,QAAQ,EAAE,EAAE,CAAC,MAAM;IACnB,EAAE,EAAE,EAAE,CAAC,MAAM;IACb,KAAK,EAAE,EAAE,CAAC,MAAM;IAChB,OAAO,EAAE,EAAE,CAAC,MAAM;IAClB,iBAAiB,EAAE,EAAE,CAAC,MAAM;IAC5B,mBAAmB,EAAE,EAAE,CAAC,MAAM;IAC9B,SAAS,EAAE,EAAE,CAAC,MAAM;IACpB,UAAU,EAAE,EAAE,CAAC,OAAO;IACtB,WAAW,EAAE,EAAE,CAAC,MAAM;IACtB,iBAAiB,EAAE,EAAE,CAAC,MAAM;IAC5B,IAAI,EAAE,EAAE,CAAC,MAAM;IACf,GAAG,EAAE,EAAE,CAAC,MAAM;CACf,CAAC,EACF,YAAY,CACb;AAED,MAAM,4BAA4B,GAAG,EAAE,CAAC,QAAQ,CAC9C,EAAE,CAAC,IAAI,CAAC;IACN,SAAS,EAAE,EAAE,CAAC,MAAM;IACpB,SAAS,EAAE,EAAE,CAAC,MAAM;IACpB,KAAK,EAAE,EAAE,CAAC,MAAM;CACjB,CAAC,EACF,kBAAkB,CACnB;AAED,MAAM,gBAAgB,GAAG,EAAE,CAAC,QAAQ,CAClC,EAAE,CAAC,IAAI,CAAC;AACN,IAAA,aAAa,EAAE,4BAA4B;AAC3C,IAAA,YAAY,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAC7C,GAAG,EAAE,EAAE,CAAC,MAAM;AACd,IAAA,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,EAAE,CAAC,MAAM;CACnB,CAAC,EACF,aAAa,CACd;AAED,MAAM,gBAAgB,GAAG,EAAE,CAAC,IAAI,CAAC;IAC/B,OAAO,EAAE,EAAE,CAAC,MAAM;IAClB,QAAQ,EAAE,EAAE,CAAC,MAAM;IACnB,QAAQ,EAAE,EAAE,CAAC,MAAM;IACnB,OAAO,EAAE,EAAE,CAAC,MAAM;IAClB,IAAI,EAAE,EAAE,CAAC,MAAM;IACf,SAAS,EAAE,EAAE,CAAC,OAAO;IACrB,IAAI,EAAE,EAAE,CAAC,MAAM;AAChB,CAAA,CAAC;AAGF,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC;AAEtD,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAClC,EAAE,CAAC,YAAY,CAAC;IACd,EAAE,CAAC,IAAI,CAAC;QACN,QAAQ,EAAE,EAAE,CAAC,MAAM;QACnB,YAAY,EAAE,EAAE,CAAC,MAAM;QACvB,WAAW,EAAE,EAAE,CAAC,MAAM;AACtB,QAAA,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QAC3C,WAAW,EAAE,EAAE,CAAC,MAAM;AACtB,QAAA,KAAK,EAAE,cAAc;QACrB,KAAK,EAAE,EAAE,CAAC,YAAY;QACtB,SAAS,EAAE,EAAE,CAAC,MAAM;QACpB,YAAY,EAAE,EAAE,CAAC,MAAM;QACvB,YAAY,EAAE,EAAE,CAAC,MAAM;AACvB,QAAA,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACnC,QAAQ,EAAE,EAAE,CAAC,MAAM;QACnB,EAAE,EAAE,EAAE,CAAC,MAAM;QACb,OAAO,EAAE,EAAE,CAAC,MAAM;QAClB,MAAM,EAAE,EAAE,CAAC,OAAO;QAClB,SAAS,EAAE,EAAE,CAAC,OAAO;AACrB,QAAA,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QAC3C,GAAG,EAAE,EAAE,CAAC,MAAM;KACf,CAAC;IACF,EAAE,CAAC,OAAO,CAAC;AACT,QAAA,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;AAChD,QAAA,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;KACpD,CAAC;CACH,CAAC,EACF,MAAM;AAGR,MAAM,uBAAuB,GAAG,yBAAyB,CAAC,IAAI,CAC5D,SAAS,EACT,oBAAoB,CACrB;;MCnQY,cAAc,CAAA;AACR,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAE/B,SAAS,GAAG,IAAI;AAEjC;;;;;AAKG;AACI,IAAA,GAAG,CAAC,MAAc,EAAA;QACvB,OAAO,IAAI,CAAC;AACT,aAAA,GAAG,CAEF,CAAA,6BAAA,EAAgC,MAAM,CAAA,CAAE;AACzC,aAAA,IAAI,CACH,UAAU,CAAC,CAAC,KAAc,KAAI;AAC5B,YAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AACpB,YAAA,OAAO,EAAE,CAAC,SAAS,CAAC;AACtB,QAAA,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CACzD;IACL;AAEO,IAAA,YAAY,CAAC,MAAc,EAAA;QAChC,MAAM,GAAG,GAAG,CAAA,IAAA,EAAO,IAAI,CAAC,SAAS,GAAG,MAAM,CAAA,CAAE;QAC5C,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;QACvC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE;;AAE9C,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,UAAU,GAAG,mBAAmB,CAAC,6BAA6B,CAAC,CACnE,KAAK,CACN;QACD,IAAI,CAAC,UAAU,EAAE;;AAEf,YAAA,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;AAC5B,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;QACtB,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,UAAU,EAAE;;AAEzC,YAAA,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;AAC5B,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK;;QAE7B,OAAO,IAAI,OAAO,CAAC;AACjB,YAAA,GAAG,IAAI;AACP,YAAA,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AACrC,YAAA,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AACtC,SAAA,CAAC;IACJ;IAEO,UAAU,CAAC,IAAa,EAAE,YAAqB,EAAA;QACpD,MAAM,GAAG,GAAG,CAAA,IAAA,EAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAA,CAAE;AAC7C,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;AACtB,QAAA,MAAM,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,KAAK,GAAG,CAAC;AAC3D,QAAA,MAAM,KAAK,GAAe;AACxB,YAAA,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,WAAW;AACvC,YAAA,KAAK,EAAE,IAAI;SACZ;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACzC,QAAA,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC;IACxC;uGApEW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAd,cAAc,EAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B;;AAwED,MAAM,eAAe,GAAG,EAAE,CAAC,QAAQ,CACjC,EAAE,CAAC,IAAI,CAAC;IACN,UAAU,EAAE,EAAE,CAAC,MAAM;AACrB,IAAA,KAAK,EAAE,SAAS;CACjB,CAAC,EACF,YAAY,CACb;AAED,MAAM,6BAA6B,GAAG,yBAAyB,CAAC,IAAI,CAClE,eAAe,EACf,0BAA0B,CAC3B;;AC7DM,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB,CAAA;AACV,IAAA,QAAQ,GAAa,MAAM,CAAC,QAAQ,CAAC;AACrC,IAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,IAAA,yBAAyB,GAAG,MAAM,CACjD,yBAAyB,CAC1B;AACgB,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAElE;;;;;;;;;AASG;AACa,IAAA,oBAAoB;AACpC;;;;;AAKG;IACa,YAAY,GAAG,KAAK;AACpC;;;;;;;AAOG;IACH,IAAoB,IAAI,CAAC,KAA0B,EAAA;AACjD,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9B;AACiB,IAAA,WAAW,GAAG,IAAI,eAAe,CAChD,SAAS,CACV;AACe,IAAA,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;AAC7D;;;;;;;;AAQG;IACH,IAAoB,MAAM,CAAC,KAAa,EAAA;AACtC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;IAChC;AACiB,IAAA,aAAa,GAAG,IAAI,aAAa,CAEhD,CAAC,CAAC;AACY,IAAA,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;AACjE;;;;;;;AAOG;AACa,IAAA,SAAS;AACzB;;;;AAIG;IACa,eAAe,GAAG,IAAI;AACtC;;;;;;AAMG;IACa,QAAQ,GAAG,IAAI;AAExB,IAAA,MAAM,QAAQ,GAAA;;QAEnB,IAAI,CAAC,YAAY,EAAE;;AAGnB,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,MAAM,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE;QAC7C;;AAGA,QAAA,IAAI,CAAC;aACF,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC;AAClD,aAAA,SAAS,CAAC,OAAO,MAAM,KAAI;AAC1B,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC;gBAC5D,IAAI,WAAW,EAAE;;AAEf,oBAAA,IAAI,CAAC,IAAI,GAAG,WAAW;oBACvB;gBACF;YACF;AAEA,YAAA,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;AACpC,QAAA,CAAC,CAAC;IACN;IAEQ,MAAM,eAAe,CAAC,MAAc,EAAA;;AAE1C,QAAA,MAAM,UAAU,GACd,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,SAAS;AACtE,QAAA,IAAI,CAAC,IAAI,GAAG,UAAU;AAEtB,QAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,UAAU,EAAE;;;;YAI/B,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC;QAClD;IACF;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;QACA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;IACnD;AAEO,IAAA,gBAAgB,CAAC,iBAAyB,EAAA;QAC/C,IACE,IAAI,CAAC,eAAe;AACpB,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI;AAC/B,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,KAAK,UAAU,EACrE;AACA,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAC9C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CACnE;QACH;AACA,QAAA,OAAO,iBAAiB;IAC1B;uGA5IW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,iQAHhB,CAAC,yBAAyB,EAAE,cAAc,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChC7E,u8BAkCA,wvCDHY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAsB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,qtBAAhD,kBAAkB,EAAA,IAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;AAI/B,gBAAgB,GAAA,UAAA,CAAA;AAV5B,IAAA,YAAY;AAUA,CAAA,EAAA,gBAAgB,CA6I5B;2FA7IY,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAT5B,SAAS;+BACE,UAAU,EAAA,UAAA,EAGR,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,CAAC,EAAA,SAAA,EAC9D,CAAC,yBAAyB,EAAE,cAAc,EAAE,mBAAmB,CAAC,EAAA,eAAA,EAC1D,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,u8BAAA,EAAA,MAAA,EAAA,CAAA,isCAAA,CAAA,EAAA;;sBAqB9C;;sBAOA;;sBASA;;sBAgBA;;sBAeA;;sBAMA;;sBAQA;;;AEnHH;;AAEG;;;;"}