stagebook 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-I2WMGA4Q.cjs.map +1 -1
- package/dist/components/index.cjs +118 -4
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.d.cts +2 -2
- package/dist/components/index.d.ts +2 -2
- package/dist/components/index.js +118 -4
- package/dist/components/index.js.map +1 -1
- package/dist/{evaluateConditions-DzlC6fez.d.cts → evaluateConditions-fqWC3Vz2.d.cts} +2 -1
- package/dist/{evaluateConditions-DzlC6fez.d.ts → evaluateConditions-fqWC3Vz2.d.ts} +2 -1
- package/dist/index.cjs +16 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/jamesphoughton/github/stagebook/packages/stagebook/dist/chunk-I2WMGA4Q.cjs","../src/schemas/promptFile.ts","../src/utils/compare.ts","../src/utils/watchedRanges.ts","../src/utils/evaluateConditions.ts"],"names":[],"mappings":"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","file":"/Users/jamesphoughton/github/stagebook/packages/stagebook/dist/chunk-I2WMGA4Q.cjs","sourcesContent":[null,"import { z, ZodIssue } from \"zod\";\nimport { load as loadYaml } from \"js-yaml\";\n\n// This schema is used to ensure that the metadata conforms to the expected structure and types.\n// Cannot be combined with the refine schema, if conditions within z.object fail, superRefine conditions will not be checked.\n// We want all of the condtions to be checked simultaneously, so we use a separate refine schema.\nexport const metadataTypeSchema = z.object({\n name: z.string().optional(),\n type: z.enum([\n \"openResponse\",\n \"multipleChoice\",\n \"noResponse\",\n \"listSorter\",\n \"slider\",\n ]),\n notes: z.string().optional(),\n rows: z.number().int().min(1).optional(),\n shuffleOptions: z.boolean().optional(),\n select: z.enum([\"single\", \"multiple\", \"undefined\"]).optional(),\n layout: z.enum([\"vertical\", \"horizontal\"]).optional(),\n minLength: z.number().int().min(0).optional(),\n maxLength: z.number().int().min(1).optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n interval: z.number().optional(),\n labelPts: z.array(z.number()).optional(),\n});\n\n// Refined schema that adds additional validation rules based on the type of prompt\n// This schema checks that certain fields are only present for specific types of prompts.\n// Conditions in z.object will always pass as long as the extension detects the file,\n// so we are guarenteed to always check against superRefine conditions.\nexport const metadataRefineSchema = z\n .object({\n name: z.any(),\n type: z.any(),\n notes: z.any().optional(),\n rows: z.any().optional(),\n shuffleOptions: z.any().optional(),\n select: z.any().optional(),\n layout: z.any().optional(),\n minLength: z.any().optional(),\n maxLength: z.any().optional(),\n min: z.any().optional(),\n max: z.any().optional(),\n interval: z.any().optional(),\n labelPts: z.any().optional(),\n })\n .superRefine((data, ctx) => {\n if (data.type !== \"openResponse\" && data.rows !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `rows can only be specified for openResponse type`,\n path: [\"rows\"],\n });\n }\n if (data.type !== \"multipleChoice\" && data.select !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `select can only be specified for multipleChoice type`,\n path: [\"select\"],\n });\n }\n if (data.type !== \"multipleChoice\" && data.layout !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `layout can only be specified for multipleChoice type`,\n path: [\"layout\"],\n });\n }\n if (data.type === \"noResponse\" && data.shuffleOptions !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `shuffleOptions cannot be specified for noResponse type`,\n path: [\"shuffleOptions\"],\n });\n }\n if (data.type !== \"openResponse\" && data.minLength !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `minLength can only be specified for openResponse type`,\n path: [\"minLength\"],\n });\n }\n if (data.type !== \"openResponse\" && data.maxLength !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `maxLength can only be specified for openResponse type`,\n path: [\"maxLength\"],\n });\n }\n if (\n data.minLength !== undefined &&\n data.maxLength !== undefined &&\n data.minLength > data.maxLength\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `minLength cannot be greater than maxLength`,\n path: [\"minLength\"],\n });\n }\n // Slider-specific validation\n if (data.type === \"slider\") {\n if (data.min === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min is required for slider type`,\n path: [\"min\"],\n });\n }\n if (data.max === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `max is required for slider type`,\n path: [\"max\"],\n });\n }\n if (data.interval === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `interval is required for slider type`,\n path: [\"interval\"],\n });\n }\n if (\n data.min !== undefined &&\n data.max !== undefined &&\n data.min >= data.max\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min must be less than max`,\n path: [\"min\"],\n });\n }\n if (\n data.min !== undefined &&\n data.max !== undefined &&\n data.interval !== undefined &&\n data.min + data.interval > data.max\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min + interval must be less than or equal to max`,\n path: [\"interval\"],\n });\n }\n }\n if (data.type !== \"slider\" && data.min !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min can only be specified for slider type`,\n path: [\"min\"],\n });\n }\n if (data.type !== \"slider\" && data.max !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `max can only be specified for slider type`,\n path: [\"max\"],\n });\n }\n if (data.type !== \"slider\" && data.interval !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `interval can only be specified for slider type`,\n path: [\"interval\"],\n });\n }\n if (data.type !== \"slider\" && data.labelPts !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `labelPts can only be specified for slider type`,\n path: [\"labelPts\"],\n });\n }\n });\n\nexport const metadataLogicalSchema = metadataRefineSchema;\n\nexport type MetadataType = z.infer<typeof metadataTypeSchema>;\nexport type MetadataRefineType = z.infer<typeof metadataRefineSchema>;\n\n// Function to validate that labelPts length matches the number of response items for slider type\nexport const validateSliderLabels = (\n metadata: MetadataType,\n responseItems: string[],\n): ZodIssue[] => {\n const issues: ZodIssue[] = [];\n\n if (metadata.type === \"slider\" && metadata.labelPts !== undefined) {\n if (metadata.labelPts.length !== responseItems.length) {\n issues.push({\n code: z.ZodIssueCode.custom,\n message: `labelPts length (${metadata.labelPts.length}) must match the number of labels (${responseItems.length})`,\n path: [\"labelPts\"],\n });\n }\n }\n\n return issues;\n};\n\n// Unified schema that validates and parses a complete prompt markdown file.\n// Input: raw markdown string with three sections delimited by ---\n// Output: { metadata, body, responseItems }\nexport const promptFileSchema = z\n .string()\n .min(1, \"Prompt file string is empty\")\n .transform((str, ctx) => {\n const trimmed = str.trim();\n if (trimmed.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Prompt file string is empty\",\n });\n return z.NEVER;\n }\n\n const sections = trimmed.split(/^-{3,}$/gm);\n\n // Expect: [\"\", metadataYaml, body, responseString]\n // The first element is empty because the file starts with ---\n if (sections.length < 4) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Prompt file must have three sections separated by --- delimiters: metadata, body, and responses\",\n });\n return z.NEVER;\n }\n\n const metadataYaml = sections[1];\n const body = sections[2];\n const responseString = sections[3];\n\n // Parse YAML metadata\n let metadata: unknown;\n try {\n metadata = loadYaml(metadataYaml);\n } catch {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Failed to parse metadata YAML\",\n path: [\"metadata\"],\n });\n return z.NEVER;\n }\n\n // Validate metadata against type schema\n const typeResult = metadataTypeSchema.safeParse(metadata);\n if (!typeResult.success) {\n typeResult.error.issues.forEach((issue) =>\n ctx.addIssue({\n ...issue,\n path: [\"metadata\", ...issue.path],\n }),\n );\n return z.NEVER;\n }\n\n // Validate metadata against refine schema (cross-field rules)\n const refineResult = metadataRefineSchema.safeParse(metadata);\n if (!refineResult.success) {\n refineResult.error.issues.forEach((issue) =>\n ctx.addIssue({\n ...issue,\n path: [\"metadata\", ...issue.path],\n }),\n );\n }\n\n // Validate body exists\n if (!body || body.trim().length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Prompt body section is empty\",\n path: [\"body\"],\n });\n }\n\n // Parse and validate response items\n const parsedMetadata = typeResult.data;\n let responseItems: string[] = [];\n\n if (parsedMetadata.type !== \"noResponse\" && responseString) {\n const responseLines = responseString\n .split(/\\r?\\n|\\r|\\n/g)\n .filter((line) => line.trim().length > 0);\n\n for (const line of responseLines) {\n if (!(line.startsWith(\"- \") || line.startsWith(\">\"))) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Response line must start with \"- \" (for multiple choice) or \"> \" (for open response). Got: \"${line}\"`,\n path: [\"responses\"],\n });\n }\n }\n\n responseItems = responseLines\n .filter((line) => line.startsWith(\"- \") || line.startsWith(\">\"))\n .map((line) => line.substring(2).trim());\n }\n\n // Validate slider labelPts against response items\n const sliderIssues = validateSliderLabels(parsedMetadata, responseItems);\n sliderIssues.forEach((issue) =>\n ctx.addIssue({\n ...issue,\n path: [\"metadata\", ...issue.path],\n }),\n );\n\n return {\n metadata: parsedMetadata,\n body: body?.trim() ?? \"\",\n responseItems,\n };\n });\n\nexport type PromptFileType = z.infer<typeof promptFileSchema>;\n","export type Comparator =\n | \"exists\"\n | \"doesNotExist\"\n | \"equals\"\n | \"doesNotEqual\"\n | \"isAbove\"\n | \"isBelow\"\n | \"isAtLeast\"\n | \"isAtMost\"\n | \"hasLengthAtLeast\"\n | \"hasLengthAtMost\"\n | \"includes\"\n | \"doesNotInclude\"\n | \"matches\"\n | \"doesNotMatch\"\n | \"isOneOf\"\n | \"isNotOneOf\";\n\nfunction trimSlashes(str: string): string {\n return str\n .split(\"/\")\n .filter((v) => v !== \"\")\n .join(\"/\");\n}\n\nfunction isNumberOrParsableNumber(value: unknown): boolean {\n return (\n typeof value === \"number\" ||\n (typeof value === \"string\" &&\n value.trim() !== \"\" &&\n !Number.isNaN(Number(value)))\n );\n}\n\nexport function compare(\n lhs: unknown,\n comparator: Comparator,\n rhs?: unknown,\n): boolean | undefined {\n switch (comparator) {\n case \"exists\":\n return lhs !== undefined;\n case \"doesNotExist\":\n return lhs === undefined;\n }\n\n if (lhs === undefined) {\n // When lhs is undefined (e.g. player hasn't typed anything yet),\n // return undefined to signal the comparison can't be made yet.\n // Exception: doesNotEqual returns true because undefined is not equal to anything.\n if (comparator === \"doesNotEqual\") return true;\n return undefined;\n }\n\n if (isNumberOrParsableNumber(lhs) && isNumberOrParsableNumber(rhs)) {\n const numLhs = parseFloat(lhs as string);\n const numRhs = parseFloat(rhs as string);\n switch (comparator) {\n case \"equals\":\n return numLhs === numRhs;\n case \"doesNotEqual\":\n return numLhs !== numRhs;\n case \"isAbove\":\n return numLhs > numRhs;\n case \"isBelow\":\n return numLhs < numRhs;\n case \"isAtLeast\":\n return numLhs >= numRhs;\n case \"isAtMost\":\n return numLhs <= numRhs;\n }\n }\n\n if (typeof lhs === \"string\" && !Number.isNaN(rhs)) {\n switch (comparator) {\n case \"hasLengthAtLeast\":\n return lhs.length >= parseFloat(rhs as string);\n case \"hasLengthAtMost\":\n return lhs.length <= parseFloat(rhs as string);\n }\n }\n\n if (typeof lhs === \"string\" && typeof rhs === \"string\") {\n switch (comparator) {\n case \"equals\":\n return lhs === rhs;\n case \"doesNotEqual\":\n return lhs !== rhs;\n case \"includes\":\n return lhs.includes(rhs);\n case \"doesNotInclude\":\n return !lhs.includes(rhs);\n case \"matches\":\n return !!lhs.match(new RegExp(trimSlashes(rhs)));\n case \"doesNotMatch\":\n return !lhs.match(new RegExp(trimSlashes(rhs)));\n }\n }\n\n if (typeof lhs === \"boolean\" && typeof rhs === \"boolean\") {\n switch (comparator) {\n case \"equals\":\n return lhs === rhs;\n case \"doesNotEqual\":\n return lhs !== rhs;\n }\n }\n\n if (Array.isArray(rhs)) {\n switch (comparator) {\n case \"isOneOf\":\n return rhs.includes(lhs);\n case \"isNotOneOf\":\n return !rhs.includes(lhs);\n }\n }\n\n return undefined;\n}\n","import type { VideoEvent } from \"../components/elements/MediaPlayer.js\";\n\n/**\n * Derives watched time ranges from a VideoEvent log.\n *\n * Pairs each \"play\" event with the next \"pause\" or \"ended\" event to form\n * closed intervals, then merges any that overlap or touch. Open intervals\n * (a \"play\" with no closing event — e.g. mid-playback disconnect) are\n * excluded, as we can't confirm how far the participant actually got.\n *\n * Returns intervals sorted by start time in the form [startSeconds, endSeconds].\n */\nexport function computeWatchedRanges(events: VideoEvent[]): [number, number][] {\n // 1. Build closed intervals from play → pause/ended pairs\n const intervals: [number, number][] = [];\n let openStart: number | null = null;\n\n for (const event of events) {\n if (event.type === \"play\") {\n // Only set start if no interval is already open — prevents duplicate\n // play events (e.g. YouTube PLAYING→BUFFERING→PLAYING) from losing\n // the original start time.\n if (openStart === null) {\n openStart = event.videoTime;\n }\n } else if (\n (event.type === \"pause\" ||\n event.type === \"ended\" ||\n event.type === \"stopAt\") &&\n openStart !== null\n ) {\n intervals.push([openStart, event.videoTime]);\n openStart = null;\n }\n // seek, speed, and unmatched pause/ended are ignored for range tracking\n }\n // open play at end is intentionally excluded\n\n if (intervals.length === 0) return [];\n\n // 2. Sort by start time\n intervals.sort((a, b) => a[0] - b[0]);\n\n // 3. Merge overlapping / adjacent intervals\n const merged: [number, number][] = [intervals[0]];\n for (let i = 1; i < intervals.length; i++) {\n const last = merged[merged.length - 1];\n const [start, end] = intervals[i];\n if (start <= last[1]) {\n // overlapping or touching — extend the end\n last[1] = Math.max(last[1], end);\n } else {\n merged.push([start, end]);\n }\n }\n\n return merged;\n}\n","import { compare, type Comparator } from \"./compare.js\";\n\nexport interface Condition {\n reference: string;\n position?: string;\n comparator: string;\n value?: unknown;\n}\n\n/**\n * Evaluate a single condition against resolved reference values.\n * Returns true if the condition is met, false otherwise.\n */\nexport function evaluateCondition(\n condition: Condition,\n referenceValues: unknown[],\n): boolean {\n const { position, comparator, value } = condition;\n\n if (position === \"percentAgreement\") {\n const counts: Record<string, number> = {};\n const definedValues = referenceValues.filter((val) => val !== undefined);\n\n if (definedValues.length === 0) return false;\n\n definedValues.forEach((val) => {\n const cleanValue =\n typeof val === \"string\"\n ? val.toLowerCase().trim()\n : `${val as string | number | boolean}`;\n counts[cleanValue] = (counts[cleanValue] || 0) + 1;\n });\n const maxCount = Math.max(...Object.values(counts));\n return (\n compare(\n (maxCount / referenceValues.length) * 100,\n comparator as Comparator,\n value,\n ) === true\n );\n }\n\n if (position === \"any\") {\n return referenceValues.some(\n (val) => compare(val, comparator as Comparator, value) === true,\n );\n }\n\n // Default: \"all\" — every value must satisfy\n return referenceValues.every(\n (val) => compare(val, comparator as Comparator, value) === true,\n );\n}\n\n/**\n * Evaluate an array of conditions (AND logic).\n * All conditions must be met for the result to be true.\n */\nexport function evaluateConditions(\n conditions: Condition[],\n resolve: (reference: string, position?: string) => unknown[],\n): boolean {\n if (!conditions || conditions.length === 0) return true;\n\n return conditions.every((condition) => {\n const values = resolve(condition.reference, condition.position);\n return evaluateCondition(condition, values);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/stagebook/stagebook/packages/stagebook/dist/chunk-I2WMGA4Q.cjs","../src/schemas/promptFile.ts","../src/utils/compare.ts","../src/utils/watchedRanges.ts","../src/utils/evaluateConditions.ts"],"names":[],"mappings":"AAAA;ACAA,0BAA4B;AAC5B,iCAAiC;AAK1B,IAAM,mBAAA,EAAqB,MAAA,CAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC1B,IAAA,EAAM,MAAA,CAAE,IAAA,CAAK;AAAA,IACX,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,EACF,CAAC,CAAA;AAAA,EACD,KAAA,EAAO,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC3B,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACvC,cAAA,EAAgB,MAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACrC,MAAA,EAAQ,MAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,UAAA,EAAY,WAAW,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC7D,MAAA,EAAQ,MAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,YAAY,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACpD,SAAA,EAAW,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC5C,SAAA,EAAW,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC5C,GAAA,EAAK,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACzB,GAAA,EAAK,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACzB,QAAA,EAAU,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC9B,QAAA,EAAU,MAAA,CAAE,KAAA,CAAM,MAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS;AACzC,CAAC,CAAA;AAMM,IAAM,qBAAA,EAAuB,MAAA,CACjC,MAAA,CAAO;AAAA,EACN,IAAA,EAAM,MAAA,CAAE,GAAA,CAAI,CAAA;AAAA,EACZ,IAAA,EAAM,MAAA,CAAE,GAAA,CAAI,CAAA;AAAA,EACZ,KAAA,EAAO,MAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACxB,IAAA,EAAM,MAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACvB,cAAA,EAAgB,MAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACjC,MAAA,EAAQ,MAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACzB,MAAA,EAAQ,MAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACzB,SAAA,EAAW,MAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC5B,SAAA,EAAW,MAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC5B,GAAA,EAAK,MAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACtB,GAAA,EAAK,MAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACtB,QAAA,EAAU,MAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC3B,QAAA,EAAU,MAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS;AAC7B,CAAC,CAAA,CACA,WAAA,CAAY,CAAC,IAAA,EAAM,GAAA,EAAA,GAAQ;AAC1B,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,eAAA,GAAkB,IAAA,CAAK,KAAA,IAAS,KAAA,CAAA,EAAW;AAC3D,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS,CAAA,gDAAA,CAAA;AAAA,MACT,IAAA,EAAM,CAAC,MAAM;AAAA,IACf,CAAC,CAAA;AAAA,EACH;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,iBAAA,GAAoB,IAAA,CAAK,OAAA,IAAW,KAAA,CAAA,EAAW;AAC/D,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS,CAAA,oDAAA,CAAA;AAAA,MACT,IAAA,EAAM,CAAC,QAAQ;AAAA,IACjB,CAAC,CAAA;AAAA,EACH;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,iBAAA,GAAoB,IAAA,CAAK,OAAA,IAAW,KAAA,CAAA,EAAW;AAC/D,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS,CAAA,oDAAA,CAAA;AAAA,MACT,IAAA,EAAM,CAAC,QAAQ;AAAA,IACjB,CAAC,CAAA;AAAA,EACH;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,aAAA,GAAgB,IAAA,CAAK,eAAA,IAAmB,KAAA,CAAA,EAAW;AACnE,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS,CAAA,sDAAA,CAAA;AAAA,MACT,IAAA,EAAM,CAAC,gBAAgB;AAAA,IACzB,CAAC,CAAA;AAAA,EACH;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,eAAA,GAAkB,IAAA,CAAK,UAAA,IAAc,KAAA,CAAA,EAAW;AAChE,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS,CAAA,qDAAA,CAAA;AAAA,MACT,IAAA,EAAM,CAAC,WAAW;AAAA,IACpB,CAAC,CAAA;AAAA,EACH;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,eAAA,GAAkB,IAAA,CAAK,UAAA,IAAc,KAAA,CAAA,EAAW;AAChE,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS,CAAA,qDAAA,CAAA;AAAA,MACT,IAAA,EAAM,CAAC,WAAW;AAAA,IACpB,CAAC,CAAA;AAAA,EACH;AACA,EAAA,GAAA,CACE,IAAA,CAAK,UAAA,IAAc,KAAA,EAAA,GACnB,IAAA,CAAK,UAAA,IAAc,KAAA,EAAA,GACnB,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,SAAA,EACtB;AACA,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS,CAAA,0CAAA,CAAA;AAAA,MACT,IAAA,EAAM,CAAC,WAAW;AAAA,IACpB,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,QAAA,EAAU;AAC1B,IAAA,GAAA,CAAI,IAAA,CAAK,IAAA,IAAQ,KAAA,CAAA,EAAW;AAC1B,MAAA,GAAA,CAAI,QAAA,CAAS;AAAA,QACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,QACrB,OAAA,EAAS,CAAA,+BAAA,CAAA;AAAA,QACT,IAAA,EAAM,CAAC,KAAK;AAAA,MACd,CAAC,CAAA;AAAA,IACH;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,IAAA,IAAQ,KAAA,CAAA,EAAW;AAC1B,MAAA,GAAA,CAAI,QAAA,CAAS;AAAA,QACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,QACrB,OAAA,EAAS,CAAA,+BAAA,CAAA;AAAA,QACT,IAAA,EAAM,CAAC,KAAK;AAAA,MACd,CAAC,CAAA;AAAA,IACH;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,SAAA,IAAa,KAAA,CAAA,EAAW;AAC/B,MAAA,GAAA,CAAI,QAAA,CAAS;AAAA,QACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,QACrB,OAAA,EAAS,CAAA,oCAAA,CAAA;AAAA,QACT,IAAA,EAAM,CAAC,UAAU;AAAA,MACnB,CAAC,CAAA;AAAA,IACH;AACA,IAAA,GAAA,CACE,IAAA,CAAK,IAAA,IAAQ,KAAA,EAAA,GACb,IAAA,CAAK,IAAA,IAAQ,KAAA,EAAA,GACb,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,GAAA,EACjB;AACA,MAAA,GAAA,CAAI,QAAA,CAAS;AAAA,QACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,QACrB,OAAA,EAAS,CAAA,yBAAA,CAAA;AAAA,QACT,IAAA,EAAM,CAAC,KAAK;AAAA,MACd,CAAC,CAAA;AAAA,IACH;AACA,IAAA,GAAA,CACE,IAAA,CAAK,IAAA,IAAQ,KAAA,EAAA,GACb,IAAA,CAAK,IAAA,IAAQ,KAAA,EAAA,GACb,IAAA,CAAK,SAAA,IAAa,KAAA,EAAA,GAClB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,GAAA,EAChC;AACA,MAAA,GAAA,CAAI,QAAA,CAAS;AAAA,QACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,QACrB,OAAA,EAAS,CAAA,gDAAA,CAAA;AAAA,QACT,IAAA,EAAM,CAAC,UAAU;AAAA,MACnB,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,SAAA,GAAY,IAAA,CAAK,IAAA,IAAQ,KAAA,CAAA,EAAW;AACpD,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS,CAAA,yCAAA,CAAA;AAAA,MACT,IAAA,EAAM,CAAC,KAAK;AAAA,IACd,CAAC,CAAA;AAAA,EACH;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,SAAA,GAAY,IAAA,CAAK,IAAA,IAAQ,KAAA,CAAA,EAAW;AACpD,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS,CAAA,yCAAA,CAAA;AAAA,MACT,IAAA,EAAM,CAAC,KAAK;AAAA,IACd,CAAC,CAAA;AAAA,EACH;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,SAAA,GAAY,IAAA,CAAK,SAAA,IAAa,KAAA,CAAA,EAAW;AACzD,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS,CAAA,8CAAA,CAAA;AAAA,MACT,IAAA,EAAM,CAAC,UAAU;AAAA,IACnB,CAAC,CAAA;AAAA,EACH;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,SAAA,GAAY,IAAA,CAAK,SAAA,IAAa,KAAA,CAAA,EAAW;AACzD,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS,CAAA,8CAAA,CAAA;AAAA,MACT,IAAA,EAAM,CAAC,UAAU;AAAA,IACnB,CAAC,CAAA;AAAA,EACH;AACF,CAAC,CAAA;AAEI,IAAM,sBAAA,EAAwB,oBAAA;AAM9B,IAAM,qBAAA,EAAuB,CAClC,QAAA,EACA,aAAA,EAAA,GACe;AACf,EAAA,MAAM,OAAA,EAAqB,CAAC,CAAA;AAE5B,EAAA,GAAA,CAAI,QAAA,CAAS,KAAA,IAAS,SAAA,GAAY,QAAA,CAAS,SAAA,IAAa,KAAA,CAAA,EAAW;AACjE,IAAA,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,OAAA,IAAW,aAAA,CAAc,MAAA,EAAQ;AACrD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,QACrB,OAAA,EAAS,CAAA,iBAAA,EAAoB,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,mCAAA,EAAsC,aAAA,CAAc,MAAM,CAAA,CAAA,CAAA;AAAA,QAC/G,IAAA,EAAM,CAAC,UAAU;AAAA,MACnB,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AAKO,IAAM,iBAAA,EAAmB,MAAA,CAC7B,MAAA,CAAO,CAAA,CACP,GAAA,CAAI,CAAA,EAAG,6BAA6B,CAAA,CACpC,SAAA,CAAU,CAAC,GAAA,EAAK,GAAA,EAAA,GAAQ;AACvB,EAAA,MAAM,QAAA,EAAU,GAAA,CAAI,IAAA,CAAK,CAAA;AACzB,EAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,IAAW,CAAA,EAAG;AACxB,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS;AAAA,IACX,CAAC,CAAA;AACD,IAAA,OAAO,MAAA,CAAE,KAAA;AAAA,EACX;AAEA,EAAA,MAAM,SAAA,EAAW,OAAA,CAAQ,KAAA,CAAM,WAAW,CAAA;AAI1C,EAAA,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS,CAAA,EAAG;AACvB,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EACE;AAAA,IACJ,CAAC,CAAA;AACD,IAAA,OAAO,MAAA,CAAE,KAAA;AAAA,EACX;AAEA,EAAA,MAAM,aAAA,EAAe,QAAA,CAAS,CAAC,CAAA;AAC/B,EAAA,MAAM,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA;AACvB,EAAA,MAAM,eAAA,EAAiB,QAAA,CAAS,CAAC,CAAA;AAGjC,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,SAAA,EAAW,0BAAA,YAAqB,CAAA;AAAA,EAClC,EAAA,UAAQ;AACN,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS,+BAAA;AAAA,MACT,IAAA,EAAM,CAAC,UAAU;AAAA,IACnB,CAAC,CAAA;AACD,IAAA,OAAO,MAAA,CAAE,KAAA;AAAA,EACX;AAGA,EAAA,MAAM,WAAA,EAAa,kBAAA,CAAmB,SAAA,CAAU,QAAQ,CAAA;AACxD,EAAA,GAAA,CAAI,CAAC,UAAA,CAAW,OAAA,EAAS;AACvB,IAAA,UAAA,CAAW,KAAA,CAAM,MAAA,CAAO,OAAA;AAAA,MAAQ,CAAC,KAAA,EAAA,GAC/B,GAAA,CAAI,QAAA,CAAS;AAAA,QACX,GAAG,KAAA;AAAA,QACH,IAAA,EAAM,CAAC,UAAA,EAAY,GAAG,KAAA,CAAM,IAAI;AAAA,MAClC,CAAC;AAAA,IACH,CAAA;AACA,IAAA,OAAO,MAAA,CAAE,KAAA;AAAA,EACX;AAGA,EAAA,MAAM,aAAA,EAAe,oBAAA,CAAqB,SAAA,CAAU,QAAQ,CAAA;AAC5D,EAAA,GAAA,CAAI,CAAC,YAAA,CAAa,OAAA,EAAS;AACzB,IAAA,YAAA,CAAa,KAAA,CAAM,MAAA,CAAO,OAAA;AAAA,MAAQ,CAAC,KAAA,EAAA,GACjC,GAAA,CAAI,QAAA,CAAS;AAAA,QACX,GAAG,KAAA;AAAA,QACH,IAAA,EAAM,CAAC,UAAA,EAAY,GAAG,KAAA,CAAM,IAAI;AAAA,MAClC,CAAC;AAAA,IACH,CAAA;AAAA,EACF;AAGA,EAAA,GAAA,CAAI,CAAC,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,OAAA,IAAW,CAAA,EAAG;AACrC,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS,8BAAA;AAAA,MACT,IAAA,EAAM,CAAC,MAAM;AAAA,IACf,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,eAAA,EAAiB,UAAA,CAAW,IAAA;AAClC,EAAA,IAAI,cAAA,EAA0B,CAAC,CAAA;AAE/B,EAAA,GAAA,CAAI,cAAA,CAAe,KAAA,IAAS,aAAA,GAAgB,cAAA,EAAgB;AAC1D,IAAA,MAAM,cAAA,EAAgB,cAAA,CACnB,KAAA,CAAM,cAAc,CAAA,CACpB,MAAA,CAAO,CAAC,IAAA,EAAA,GAAS,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,OAAA,EAAS,CAAC,CAAA;AAE1C,IAAA,IAAA,CAAA,MAAW,KAAA,GAAQ,aAAA,EAAe;AAChC,MAAA,GAAA,CAAI,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,IAAI,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,CAAA,EAAI;AACpD,QAAA,GAAA,CAAI,QAAA,CAAS;AAAA,UACX,IAAA,EAAM,MAAA,CAAE,YAAA,CAAa,MAAA;AAAA,UACrB,OAAA,EAAS,CAAA,4FAAA,EAA+F,IAAI,CAAA,CAAA,CAAA;AAAA,UAC5G,IAAA,EAAM,CAAC,WAAW;AAAA,QACpB,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,cAAA,EAAgB,aAAA,CACb,MAAA,CAAO,CAAC,IAAA,EAAA,GAAS,IAAA,CAAK,UAAA,CAAW,IAAI,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAC,CAAA,CAC9D,GAAA,CAAI,CAAC,IAAA,EAAA,GAAS,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,aAAA,EAAe,oBAAA,CAAqB,cAAA,EAAgB,aAAa,CAAA;AACvE,EAAA,YAAA,CAAa,OAAA;AAAA,IAAQ,CAAC,KAAA,EAAA,GACpB,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,GAAG,KAAA;AAAA,MACH,IAAA,EAAM,CAAC,UAAA,EAAY,GAAG,KAAA,CAAM,IAAI;AAAA,IAClC,CAAC;AAAA,EACH,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,cAAA;AAAA,IACV,IAAA,mCAAM,IAAA,2BAAM,IAAA,mBAAK,GAAA,UAAK,IAAA;AAAA,IACtB;AAAA,EACF,CAAA;AACF,CAAC,CAAA;ADnEH;AACA;AE5OA,SAAS,WAAA,CAAY,GAAA,EAAqB;AACxC,EAAA,OAAO,GAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,MAAA,CAAO,CAAC,CAAA,EAAA,GAAM,EAAA,IAAM,EAAE,CAAA,CACtB,IAAA,CAAK,GAAG,CAAA;AACb;AAEA,SAAS,wBAAA,CAAyB,KAAA,EAAyB;AACzD,EAAA,OACE,OAAO,MAAA,IAAU,SAAA,GAChB,OAAO,MAAA,IAAU,SAAA,GAChB,KAAA,CAAM,IAAA,CAAK,EAAA,IAAM,GAAA,GACjB,CAAC,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAEjC;AAEO,SAAS,OAAA,CACd,GAAA,EACA,UAAA,EACA,GAAA,EACqB;AACrB,EAAA,OAAA,CAAQ,UAAA,EAAY;AAAA,IAClB,KAAK,QAAA;AACH,MAAA,OAAO,IAAA,IAAQ,KAAA,CAAA;AAAA,IACjB,KAAK,cAAA;AACH,MAAA,OAAO,IAAA,IAAQ,KAAA,CAAA;AAAA,EACnB;AAEA,EAAA,GAAA,CAAI,IAAA,IAAQ,KAAA,CAAA,EAAW;AAIrB,IAAA,GAAA,CAAI,WAAA,IAAe,cAAA,EAAgB,OAAO,IAAA;AAC1C,IAAA,OAAO,KAAA,CAAA;AAAA,EACT;AAEA,EAAA,GAAA,CAAI,wBAAA,CAAyB,GAAG,EAAA,GAAK,wBAAA,CAAyB,GAAG,CAAA,EAAG;AAClE,IAAA,MAAM,OAAA,EAAS,UAAA,CAAW,GAAa,CAAA;AACvC,IAAA,MAAM,OAAA,EAAS,UAAA,CAAW,GAAa,CAAA;AACvC,IAAA,OAAA,CAAQ,UAAA,EAAY;AAAA,MAClB,KAAK,QAAA;AACH,QAAA,OAAO,OAAA,IAAW,MAAA;AAAA,MACpB,KAAK,cAAA;AACH,QAAA,OAAO,OAAA,IAAW,MAAA;AAAA,MACpB,KAAK,SAAA;AACH,QAAA,OAAO,OAAA,EAAS,MAAA;AAAA,MAClB,KAAK,SAAA;AACH,QAAA,OAAO,OAAA,EAAS,MAAA;AAAA,MAClB,KAAK,WAAA;AACH,QAAA,OAAO,OAAA,GAAU,MAAA;AAAA,MACnB,KAAK,UAAA;AACH,QAAA,OAAO,OAAA,GAAU,MAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,OAAO,IAAA,IAAQ,SAAA,GAAY,CAAC,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACjD,IAAA,OAAA,CAAQ,UAAA,EAAY;AAAA,MAClB,KAAK,kBAAA;AACH,QAAA,OAAO,GAAA,CAAI,OAAA,GAAU,UAAA,CAAW,GAAa,CAAA;AAAA,MAC/C,KAAK,iBAAA;AACH,QAAA,OAAO,GAAA,CAAI,OAAA,GAAU,UAAA,CAAW,GAAa,CAAA;AAAA,IACjD;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,OAAO,IAAA,IAAQ,SAAA,GAAY,OAAO,IAAA,IAAQ,QAAA,EAAU;AACtD,IAAA,OAAA,CAAQ,UAAA,EAAY;AAAA,MAClB,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,IAAQ,GAAA;AAAA,MACjB,KAAK,cAAA;AACH,QAAA,OAAO,IAAA,IAAQ,GAAA;AAAA,MACjB,KAAK,UAAA;AACH,QAAA,OAAO,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA;AAAA,MACzB,KAAK,gBAAA;AACH,QAAA,OAAO,CAAC,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA;AAAA,MAC1B,KAAK,SAAA;AACH,QAAA,OAAO,CAAC,CAAC,GAAA,CAAI,KAAA,CAAM,IAAI,MAAA,CAAO,WAAA,CAAY,GAAG,CAAC,CAAC,CAAA;AAAA,MACjD,KAAK,cAAA;AACH,QAAA,OAAO,CAAC,GAAA,CAAI,KAAA,CAAM,IAAI,MAAA,CAAO,WAAA,CAAY,GAAG,CAAC,CAAC,CAAA;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,OAAO,IAAA,IAAQ,UAAA,GAAa,OAAO,IAAA,IAAQ,SAAA,EAAW;AACxD,IAAA,OAAA,CAAQ,UAAA,EAAY;AAAA,MAClB,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,IAAQ,GAAA;AAAA,MACjB,KAAK,cAAA;AACH,QAAA,OAAO,IAAA,IAAQ,GAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,OAAA,CAAQ,UAAA,EAAY;AAAA,MAClB,KAAK,SAAA;AACH,QAAA,OAAO,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA;AAAA,MACzB,KAAK,YAAA;AACH,QAAA,OAAO,CAAC,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAA;AACT;AFsNA;AACA;AGjUO,SAAS,oBAAA,CAAqB,MAAA,EAA0C;AAE7E,EAAA,MAAM,UAAA,EAAgC,CAAC,CAAA;AACvC,EAAA,IAAI,UAAA,EAA2B,IAAA;AAE/B,EAAA,IAAA,CAAA,MAAW,MAAA,GAAS,MAAA,EAAQ;AAC1B,IAAA,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,MAAA,EAAQ;AAIzB,MAAA,GAAA,CAAI,UAAA,IAAc,IAAA,EAAM;AACtB,QAAA,UAAA,EAAY,KAAA,CAAM,SAAA;AAAA,MACpB;AAAA,IACF,EAAA,KAAA,GAAA,CAAA,CACG,KAAA,CAAM,KAAA,IAAS,QAAA,GACd,KAAA,CAAM,KAAA,IAAS,QAAA,GACf,KAAA,CAAM,KAAA,IAAS,QAAA,EAAA,GACjB,UAAA,IAAc,IAAA,EACd;AACA,MAAA,SAAA,CAAU,IAAA,CAAK,CAAC,SAAA,EAAW,KAAA,CAAM,SAAS,CAAC,CAAA;AAC3C,MAAA,UAAA,EAAY,IAAA;AAAA,IACd;AAAA,EAEF;AAGA,EAAA,GAAA,CAAI,SAAA,CAAU,OAAA,IAAW,CAAA,EAAG,OAAO,CAAC,CAAA;AAGpC,EAAA,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,EAAA,GAAM,CAAA,CAAE,CAAC,EAAA,EAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAGpC,EAAA,MAAM,OAAA,EAA6B,CAAC,SAAA,CAAU,CAAC,CAAC,CAAA;AAChD,EAAA,IAAA,CAAA,IAAS,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAA,EAAK;AACzC,IAAA,MAAM,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,CAAC,CAAA;AACrC,IAAA,MAAM,CAAC,KAAA,EAAO,GAAG,EAAA,EAAI,SAAA,CAAU,CAAC,CAAA;AAChC,IAAA,GAAA,CAAI,MAAA,GAAS,IAAA,CAAK,CAAC,CAAA,EAAG;AAEpB,MAAA,IAAA,CAAK,CAAC,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,GAAG,CAAA;AAAA,IACjC,EAAA,KAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,EAAO,GAAG,CAAC,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AHgTA;AACA;AI7VO,SAAS,iBAAA,CACd,SAAA,EACA,eAAA,EACS;AACT,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,MAAM,EAAA,EAAI,SAAA;AAExC,EAAA,GAAA,CAAI,SAAA,IAAa,kBAAA,EAAoB;AACnC,IAAA,MAAM,OAAA,EAAiC,CAAC,CAAA;AACxC,IAAA,MAAM,cAAA,EAAgB,eAAA,CAAgB,MAAA,CAAO,CAAC,GAAA,EAAA,GAAQ,IAAA,IAAQ,KAAA,CAAS,CAAA;AAEvE,IAAA,GAAA,CAAI,aAAA,CAAc,OAAA,IAAW,CAAA,EAAG,OAAO,KAAA;AAEvC,IAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,GAAA,EAAA,GAAQ;AAC7B,MAAA,MAAM,WAAA,EACJ,OAAO,IAAA,IAAQ,SAAA,EACX,GAAA,CAAI,WAAA,CAAY,CAAA,CAAE,IAAA,CAAK,EAAA,EACvB,CAAA,EAAA;AAC2C,MAAA;AAClD,IAAA;AACiD,IAAA;AAEhD,IAAA;AACwC,MAAA;AACtC,MAAA;AACA,MAAA;AACI,IAAA;AAEV,EAAA;AAEwB,EAAA;AACC,IAAA;AACsC,MAAA;AAC7D,IAAA;AACF,EAAA;AAGuB,EAAA;AACsC,IAAA;AAC7D,EAAA;AACF;AASW;AAC0C,EAAA;AAEZ,EAAA;AACyB,IAAA;AACpB,IAAA;AAC3C,EAAA;AACH;AJwU+E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/stagebook/stagebook/packages/stagebook/dist/chunk-I2WMGA4Q.cjs","sourcesContent":[null,"import { z, ZodIssue } from \"zod\";\nimport { load as loadYaml } from \"js-yaml\";\n\n// This schema is used to ensure that the metadata conforms to the expected structure and types.\n// Cannot be combined with the refine schema, if conditions within z.object fail, superRefine conditions will not be checked.\n// We want all of the condtions to be checked simultaneously, so we use a separate refine schema.\nexport const metadataTypeSchema = z.object({\n name: z.string().optional(),\n type: z.enum([\n \"openResponse\",\n \"multipleChoice\",\n \"noResponse\",\n \"listSorter\",\n \"slider\",\n ]),\n notes: z.string().optional(),\n rows: z.number().int().min(1).optional(),\n shuffleOptions: z.boolean().optional(),\n select: z.enum([\"single\", \"multiple\", \"undefined\"]).optional(),\n layout: z.enum([\"vertical\", \"horizontal\"]).optional(),\n minLength: z.number().int().min(0).optional(),\n maxLength: z.number().int().min(1).optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n interval: z.number().optional(),\n labelPts: z.array(z.number()).optional(),\n});\n\n// Refined schema that adds additional validation rules based on the type of prompt\n// This schema checks that certain fields are only present for specific types of prompts.\n// Conditions in z.object will always pass as long as the extension detects the file,\n// so we are guarenteed to always check against superRefine conditions.\nexport const metadataRefineSchema = z\n .object({\n name: z.any(),\n type: z.any(),\n notes: z.any().optional(),\n rows: z.any().optional(),\n shuffleOptions: z.any().optional(),\n select: z.any().optional(),\n layout: z.any().optional(),\n minLength: z.any().optional(),\n maxLength: z.any().optional(),\n min: z.any().optional(),\n max: z.any().optional(),\n interval: z.any().optional(),\n labelPts: z.any().optional(),\n })\n .superRefine((data, ctx) => {\n if (data.type !== \"openResponse\" && data.rows !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `rows can only be specified for openResponse type`,\n path: [\"rows\"],\n });\n }\n if (data.type !== \"multipleChoice\" && data.select !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `select can only be specified for multipleChoice type`,\n path: [\"select\"],\n });\n }\n if (data.type !== \"multipleChoice\" && data.layout !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `layout can only be specified for multipleChoice type`,\n path: [\"layout\"],\n });\n }\n if (data.type === \"noResponse\" && data.shuffleOptions !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `shuffleOptions cannot be specified for noResponse type`,\n path: [\"shuffleOptions\"],\n });\n }\n if (data.type !== \"openResponse\" && data.minLength !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `minLength can only be specified for openResponse type`,\n path: [\"minLength\"],\n });\n }\n if (data.type !== \"openResponse\" && data.maxLength !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `maxLength can only be specified for openResponse type`,\n path: [\"maxLength\"],\n });\n }\n if (\n data.minLength !== undefined &&\n data.maxLength !== undefined &&\n data.minLength > data.maxLength\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `minLength cannot be greater than maxLength`,\n path: [\"minLength\"],\n });\n }\n // Slider-specific validation\n if (data.type === \"slider\") {\n if (data.min === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min is required for slider type`,\n path: [\"min\"],\n });\n }\n if (data.max === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `max is required for slider type`,\n path: [\"max\"],\n });\n }\n if (data.interval === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `interval is required for slider type`,\n path: [\"interval\"],\n });\n }\n if (\n data.min !== undefined &&\n data.max !== undefined &&\n data.min >= data.max\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min must be less than max`,\n path: [\"min\"],\n });\n }\n if (\n data.min !== undefined &&\n data.max !== undefined &&\n data.interval !== undefined &&\n data.min + data.interval > data.max\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min + interval must be less than or equal to max`,\n path: [\"interval\"],\n });\n }\n }\n if (data.type !== \"slider\" && data.min !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min can only be specified for slider type`,\n path: [\"min\"],\n });\n }\n if (data.type !== \"slider\" && data.max !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `max can only be specified for slider type`,\n path: [\"max\"],\n });\n }\n if (data.type !== \"slider\" && data.interval !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `interval can only be specified for slider type`,\n path: [\"interval\"],\n });\n }\n if (data.type !== \"slider\" && data.labelPts !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `labelPts can only be specified for slider type`,\n path: [\"labelPts\"],\n });\n }\n });\n\nexport const metadataLogicalSchema = metadataRefineSchema;\n\nexport type MetadataType = z.infer<typeof metadataTypeSchema>;\nexport type MetadataRefineType = z.infer<typeof metadataRefineSchema>;\n\n// Function to validate that labelPts length matches the number of response items for slider type\nexport const validateSliderLabels = (\n metadata: MetadataType,\n responseItems: string[],\n): ZodIssue[] => {\n const issues: ZodIssue[] = [];\n\n if (metadata.type === \"slider\" && metadata.labelPts !== undefined) {\n if (metadata.labelPts.length !== responseItems.length) {\n issues.push({\n code: z.ZodIssueCode.custom,\n message: `labelPts length (${metadata.labelPts.length}) must match the number of labels (${responseItems.length})`,\n path: [\"labelPts\"],\n });\n }\n }\n\n return issues;\n};\n\n// Unified schema that validates and parses a complete prompt markdown file.\n// Input: raw markdown string with three sections delimited by ---\n// Output: { metadata, body, responseItems }\nexport const promptFileSchema = z\n .string()\n .min(1, \"Prompt file string is empty\")\n .transform((str, ctx) => {\n const trimmed = str.trim();\n if (trimmed.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Prompt file string is empty\",\n });\n return z.NEVER;\n }\n\n const sections = trimmed.split(/^-{3,}$/gm);\n\n // Expect: [\"\", metadataYaml, body, responseString]\n // The first element is empty because the file starts with ---\n if (sections.length < 4) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Prompt file must have three sections separated by --- delimiters: metadata, body, and responses\",\n });\n return z.NEVER;\n }\n\n const metadataYaml = sections[1];\n const body = sections[2];\n const responseString = sections[3];\n\n // Parse YAML metadata\n let metadata: unknown;\n try {\n metadata = loadYaml(metadataYaml);\n } catch {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Failed to parse metadata YAML\",\n path: [\"metadata\"],\n });\n return z.NEVER;\n }\n\n // Validate metadata against type schema\n const typeResult = metadataTypeSchema.safeParse(metadata);\n if (!typeResult.success) {\n typeResult.error.issues.forEach((issue) =>\n ctx.addIssue({\n ...issue,\n path: [\"metadata\", ...issue.path],\n }),\n );\n return z.NEVER;\n }\n\n // Validate metadata against refine schema (cross-field rules)\n const refineResult = metadataRefineSchema.safeParse(metadata);\n if (!refineResult.success) {\n refineResult.error.issues.forEach((issue) =>\n ctx.addIssue({\n ...issue,\n path: [\"metadata\", ...issue.path],\n }),\n );\n }\n\n // Validate body exists\n if (!body || body.trim().length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Prompt body section is empty\",\n path: [\"body\"],\n });\n }\n\n // Parse and validate response items\n const parsedMetadata = typeResult.data;\n let responseItems: string[] = [];\n\n if (parsedMetadata.type !== \"noResponse\" && responseString) {\n const responseLines = responseString\n .split(/\\r?\\n|\\r|\\n/g)\n .filter((line) => line.trim().length > 0);\n\n for (const line of responseLines) {\n if (!(line.startsWith(\"- \") || line.startsWith(\">\"))) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Response line must start with \"- \" (for multiple choice) or \"> \" (for open response). Got: \"${line}\"`,\n path: [\"responses\"],\n });\n }\n }\n\n responseItems = responseLines\n .filter((line) => line.startsWith(\"- \") || line.startsWith(\">\"))\n .map((line) => line.substring(2).trim());\n }\n\n // Validate slider labelPts against response items\n const sliderIssues = validateSliderLabels(parsedMetadata, responseItems);\n sliderIssues.forEach((issue) =>\n ctx.addIssue({\n ...issue,\n path: [\"metadata\", ...issue.path],\n }),\n );\n\n return {\n metadata: parsedMetadata,\n body: body?.trim() ?? \"\",\n responseItems,\n };\n });\n\nexport type PromptFileType = z.infer<typeof promptFileSchema>;\n","export type Comparator =\n | \"exists\"\n | \"doesNotExist\"\n | \"equals\"\n | \"doesNotEqual\"\n | \"isAbove\"\n | \"isBelow\"\n | \"isAtLeast\"\n | \"isAtMost\"\n | \"hasLengthAtLeast\"\n | \"hasLengthAtMost\"\n | \"includes\"\n | \"doesNotInclude\"\n | \"matches\"\n | \"doesNotMatch\"\n | \"isOneOf\"\n | \"isNotOneOf\";\n\nfunction trimSlashes(str: string): string {\n return str\n .split(\"/\")\n .filter((v) => v !== \"\")\n .join(\"/\");\n}\n\nfunction isNumberOrParsableNumber(value: unknown): boolean {\n return (\n typeof value === \"number\" ||\n (typeof value === \"string\" &&\n value.trim() !== \"\" &&\n !Number.isNaN(Number(value)))\n );\n}\n\nexport function compare(\n lhs: unknown,\n comparator: Comparator,\n rhs?: unknown,\n): boolean | undefined {\n switch (comparator) {\n case \"exists\":\n return lhs !== undefined;\n case \"doesNotExist\":\n return lhs === undefined;\n }\n\n if (lhs === undefined) {\n // When lhs is undefined (e.g. player hasn't typed anything yet),\n // return undefined to signal the comparison can't be made yet.\n // Exception: doesNotEqual returns true because undefined is not equal to anything.\n if (comparator === \"doesNotEqual\") return true;\n return undefined;\n }\n\n if (isNumberOrParsableNumber(lhs) && isNumberOrParsableNumber(rhs)) {\n const numLhs = parseFloat(lhs as string);\n const numRhs = parseFloat(rhs as string);\n switch (comparator) {\n case \"equals\":\n return numLhs === numRhs;\n case \"doesNotEqual\":\n return numLhs !== numRhs;\n case \"isAbove\":\n return numLhs > numRhs;\n case \"isBelow\":\n return numLhs < numRhs;\n case \"isAtLeast\":\n return numLhs >= numRhs;\n case \"isAtMost\":\n return numLhs <= numRhs;\n }\n }\n\n if (typeof lhs === \"string\" && !Number.isNaN(rhs)) {\n switch (comparator) {\n case \"hasLengthAtLeast\":\n return lhs.length >= parseFloat(rhs as string);\n case \"hasLengthAtMost\":\n return lhs.length <= parseFloat(rhs as string);\n }\n }\n\n if (typeof lhs === \"string\" && typeof rhs === \"string\") {\n switch (comparator) {\n case \"equals\":\n return lhs === rhs;\n case \"doesNotEqual\":\n return lhs !== rhs;\n case \"includes\":\n return lhs.includes(rhs);\n case \"doesNotInclude\":\n return !lhs.includes(rhs);\n case \"matches\":\n return !!lhs.match(new RegExp(trimSlashes(rhs)));\n case \"doesNotMatch\":\n return !lhs.match(new RegExp(trimSlashes(rhs)));\n }\n }\n\n if (typeof lhs === \"boolean\" && typeof rhs === \"boolean\") {\n switch (comparator) {\n case \"equals\":\n return lhs === rhs;\n case \"doesNotEqual\":\n return lhs !== rhs;\n }\n }\n\n if (Array.isArray(rhs)) {\n switch (comparator) {\n case \"isOneOf\":\n return rhs.includes(lhs);\n case \"isNotOneOf\":\n return !rhs.includes(lhs);\n }\n }\n\n return undefined;\n}\n","import type { VideoEvent } from \"../components/elements/MediaPlayer.js\";\n\n/**\n * Derives watched time ranges from a VideoEvent log.\n *\n * Pairs each \"play\" event with the next \"pause\" or \"ended\" event to form\n * closed intervals, then merges any that overlap or touch. Open intervals\n * (a \"play\" with no closing event — e.g. mid-playback disconnect) are\n * excluded, as we can't confirm how far the participant actually got.\n *\n * Returns intervals sorted by start time in the form [startSeconds, endSeconds].\n */\nexport function computeWatchedRanges(events: VideoEvent[]): [number, number][] {\n // 1. Build closed intervals from play → pause/ended pairs\n const intervals: [number, number][] = [];\n let openStart: number | null = null;\n\n for (const event of events) {\n if (event.type === \"play\") {\n // Only set start if no interval is already open — prevents duplicate\n // play events (e.g. YouTube PLAYING→BUFFERING→PLAYING) from losing\n // the original start time.\n if (openStart === null) {\n openStart = event.videoTime;\n }\n } else if (\n (event.type === \"pause\" ||\n event.type === \"ended\" ||\n event.type === \"stopAt\") &&\n openStart !== null\n ) {\n intervals.push([openStart, event.videoTime]);\n openStart = null;\n }\n // seek, speed, and unmatched pause/ended are ignored for range tracking\n }\n // open play at end is intentionally excluded\n\n if (intervals.length === 0) return [];\n\n // 2. Sort by start time\n intervals.sort((a, b) => a[0] - b[0]);\n\n // 3. Merge overlapping / adjacent intervals\n const merged: [number, number][] = [intervals[0]];\n for (let i = 1; i < intervals.length; i++) {\n const last = merged[merged.length - 1];\n const [start, end] = intervals[i];\n if (start <= last[1]) {\n // overlapping or touching — extend the end\n last[1] = Math.max(last[1], end);\n } else {\n merged.push([start, end]);\n }\n }\n\n return merged;\n}\n","import { compare, type Comparator } from \"./compare.js\";\n\nexport interface Condition {\n reference: string;\n position?: string;\n comparator: string;\n value?: unknown;\n}\n\n/**\n * Evaluate a single condition against resolved reference values.\n * Returns true if the condition is met, false otherwise.\n */\nexport function evaluateCondition(\n condition: Condition,\n referenceValues: unknown[],\n): boolean {\n const { position, comparator, value } = condition;\n\n if (position === \"percentAgreement\") {\n const counts: Record<string, number> = {};\n const definedValues = referenceValues.filter((val) => val !== undefined);\n\n if (definedValues.length === 0) return false;\n\n definedValues.forEach((val) => {\n const cleanValue =\n typeof val === \"string\"\n ? val.toLowerCase().trim()\n : `${val as string | number | boolean}`;\n counts[cleanValue] = (counts[cleanValue] || 0) + 1;\n });\n const maxCount = Math.max(...Object.values(counts));\n return (\n compare(\n (maxCount / referenceValues.length) * 100,\n comparator as Comparator,\n value,\n ) === true\n );\n }\n\n if (position === \"any\") {\n return referenceValues.some(\n (val) => compare(val, comparator as Comparator, value) === true,\n );\n }\n\n // Default: \"all\" — every value must satisfy\n return referenceValues.every(\n (val) => compare(val, comparator as Comparator, value) === true,\n );\n}\n\n/**\n * Evaluate an array of conditions (AND logic).\n * All conditions must be met for the result to be true.\n */\nexport function evaluateConditions(\n conditions: Condition[],\n resolve: (reference: string, position?: string) => unknown[],\n): boolean {\n if (!conditions || conditions.length === 0) return true;\n\n return conditions.every((condition) => {\n const values = resolve(condition.reference, condition.position);\n return evaluateCondition(condition, values);\n });\n}\n"]}
|
|
@@ -38,9 +38,15 @@ function useElapsedTime() {
|
|
|
38
38
|
function useTextContent(path) {
|
|
39
39
|
const { getTextContent } = useStagebookContext();
|
|
40
40
|
const [data, setData] = _react.useState.call(void 0, void 0);
|
|
41
|
-
const [isLoading, setIsLoading] = _react.useState.call(void 0,
|
|
41
|
+
const [isLoading, setIsLoading] = _react.useState.call(void 0, false);
|
|
42
42
|
const [error, setError] = _react.useState.call(void 0, void 0);
|
|
43
43
|
_react.useEffect.call(void 0, () => {
|
|
44
|
+
if (!path) {
|
|
45
|
+
setData(void 0);
|
|
46
|
+
setError(void 0);
|
|
47
|
+
setIsLoading(false);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
44
50
|
let cancelled = false;
|
|
45
51
|
setIsLoading(true);
|
|
46
52
|
setError(void 0);
|
|
@@ -1316,16 +1322,21 @@ function MediaPlayer({
|
|
|
1316
1322
|
stopAt,
|
|
1317
1323
|
allowScrubOutsideBounds = false,
|
|
1318
1324
|
stepDuration = 1,
|
|
1325
|
+
playback,
|
|
1319
1326
|
controls
|
|
1320
1327
|
}) {
|
|
1321
1328
|
const youtubeVideoId = isYouTubeURL(url);
|
|
1322
1329
|
const saveKey = `mediaPlayer_${name}`;
|
|
1330
|
+
const hasAnyControls = controls !== void 0 && (controls.playPause || controls.seek || controls.step || controls.speed);
|
|
1331
|
+
const effectivePlayback = _nullishCoalesce(playback, () => ( (hasAnyControls || syncToStageTime ? "manual" : "once")));
|
|
1323
1332
|
if (!youtubeVideoId && !isSafeURL(url)) {
|
|
1324
1333
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { "data-testid": "mediaPlayer", role: "alert", children: "Invalid media URL" });
|
|
1325
1334
|
}
|
|
1326
1335
|
const eventsRef = _react.useRef.call(void 0, []);
|
|
1327
1336
|
const videoRef = _react.useRef.call(void 0, null);
|
|
1337
|
+
const autoplayAttemptedRef = _react.useRef.call(void 0, false);
|
|
1328
1338
|
const [isPaused, setIsPaused] = _react.useState.call(void 0, true);
|
|
1339
|
+
const [showPlayOnce, setShowPlayOnce] = _react.useState.call(void 0, false);
|
|
1329
1340
|
const [isHovered, setIsHovered] = _react.useState.call(void 0, false);
|
|
1330
1341
|
const [currentTime, setCurrentTime] = _react.useState.call(void 0, 0);
|
|
1331
1342
|
const [duration, setDuration] = _react.useState.call(void 0, 0);
|
|
@@ -1336,6 +1347,8 @@ function MediaPlayer({
|
|
|
1336
1347
|
const [loadError, setLoadError] = _react.useState.call(void 0, null);
|
|
1337
1348
|
_react.useEffect.call(void 0, () => {
|
|
1338
1349
|
setLoadError(null);
|
|
1350
|
+
autoplayAttemptedRef.current = false;
|
|
1351
|
+
setShowPlayOnce(false);
|
|
1339
1352
|
}, [url]);
|
|
1340
1353
|
const [ytHandle, setYtHandle] = _react.useState.call(void 0, null);
|
|
1341
1354
|
const scrubWasPlayingRef = _react.useRef.call(void 0, false);
|
|
@@ -1512,6 +1525,17 @@ function MediaPlayer({
|
|
|
1512
1525
|
videoRef.current.currentTime = startAt;
|
|
1513
1526
|
}
|
|
1514
1527
|
}, []);
|
|
1528
|
+
_react.useEffect.call(void 0, () => {
|
|
1529
|
+
if (effectivePlayback !== "once") return;
|
|
1530
|
+
if (autoplayAttemptedRef.current) return;
|
|
1531
|
+
const v = videoRef.current;
|
|
1532
|
+
if (!v) return;
|
|
1533
|
+
if (duration === 0) return;
|
|
1534
|
+
autoplayAttemptedRef.current = true;
|
|
1535
|
+
void v.play().catch(() => {
|
|
1536
|
+
setShowPlayOnce(true);
|
|
1537
|
+
});
|
|
1538
|
+
}, [effectivePlayback, duration]);
|
|
1515
1539
|
const recordEvent = _react.useCallback.call(void 0,
|
|
1516
1540
|
(type, videoTime, extra) => {
|
|
1517
1541
|
const event = {
|
|
@@ -1671,6 +1695,7 @@ function MediaPlayer({
|
|
|
1671
1695
|
}, [playbackRate, recordEvent]);
|
|
1672
1696
|
const handleKeyDown = _react.useCallback.call(void 0,
|
|
1673
1697
|
(e) => {
|
|
1698
|
+
if (effectivePlayback === "once") return;
|
|
1674
1699
|
if (ytHandle) {
|
|
1675
1700
|
switch (e.key) {
|
|
1676
1701
|
case " ":
|
|
@@ -1773,7 +1798,13 @@ function MediaPlayer({
|
|
|
1773
1798
|
break;
|
|
1774
1799
|
}
|
|
1775
1800
|
},
|
|
1776
|
-
[
|
|
1801
|
+
[
|
|
1802
|
+
effectivePlayback,
|
|
1803
|
+
seek,
|
|
1804
|
+
stepDuration,
|
|
1805
|
+
playbackRate,
|
|
1806
|
+
enterFastScrubForward
|
|
1807
|
+
]
|
|
1777
1808
|
);
|
|
1778
1809
|
const handleKeyUp = _react.useCallback.call(void 0,
|
|
1779
1810
|
(e) => {
|
|
@@ -2161,10 +2192,86 @@ function MediaPlayer({
|
|
|
2161
2192
|
},
|
|
2162
2193
|
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HTML5Controls, { ...html5ControlsProps })
|
|
2163
2194
|
}
|
|
2195
|
+
),
|
|
2196
|
+
showPlayOnce && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2197
|
+
"button",
|
|
2198
|
+
{
|
|
2199
|
+
type: "button",
|
|
2200
|
+
"data-testid": "mediaPlayer-playOnce",
|
|
2201
|
+
"aria-label": "Play video",
|
|
2202
|
+
onClick: () => {
|
|
2203
|
+
setShowPlayOnce(false);
|
|
2204
|
+
const v = videoRef.current;
|
|
2205
|
+
if (!v) {
|
|
2206
|
+
setShowPlayOnce(true);
|
|
2207
|
+
return;
|
|
2208
|
+
}
|
|
2209
|
+
void v.play().catch(() => {
|
|
2210
|
+
setShowPlayOnce(true);
|
|
2211
|
+
});
|
|
2212
|
+
},
|
|
2213
|
+
style: {
|
|
2214
|
+
position: "absolute",
|
|
2215
|
+
top: "50%",
|
|
2216
|
+
left: "50%",
|
|
2217
|
+
transform: "translate(-50%, -50%)",
|
|
2218
|
+
background: "rgba(0,0,0,0.6)",
|
|
2219
|
+
border: "none",
|
|
2220
|
+
borderRadius: "50%",
|
|
2221
|
+
width: 64,
|
|
2222
|
+
height: 64,
|
|
2223
|
+
cursor: "pointer",
|
|
2224
|
+
display: "flex",
|
|
2225
|
+
alignItems: "center",
|
|
2226
|
+
justifyContent: "center",
|
|
2227
|
+
color: "#fff"
|
|
2228
|
+
},
|
|
2229
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2230
|
+
"svg",
|
|
2231
|
+
{
|
|
2232
|
+
width: 32,
|
|
2233
|
+
height: 32,
|
|
2234
|
+
viewBox: "0 0 24 24",
|
|
2235
|
+
fill: "currentColor",
|
|
2236
|
+
"aria-hidden": "true",
|
|
2237
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "polygon", { points: "6,3 20,12 6,21" })
|
|
2238
|
+
}
|
|
2239
|
+
)
|
|
2240
|
+
}
|
|
2164
2241
|
)
|
|
2165
2242
|
]
|
|
2166
2243
|
}
|
|
2167
2244
|
),
|
|
2245
|
+
!playVideo && showPlayOnce && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2246
|
+
"button",
|
|
2247
|
+
{
|
|
2248
|
+
type: "button",
|
|
2249
|
+
"data-testid": "mediaPlayer-playOnce",
|
|
2250
|
+
"aria-label": "Play audio",
|
|
2251
|
+
onClick: () => {
|
|
2252
|
+
setShowPlayOnce(false);
|
|
2253
|
+
const v = videoRef.current;
|
|
2254
|
+
if (!v) {
|
|
2255
|
+
setShowPlayOnce(true);
|
|
2256
|
+
return;
|
|
2257
|
+
}
|
|
2258
|
+
void v.play().catch(() => {
|
|
2259
|
+
setShowPlayOnce(true);
|
|
2260
|
+
});
|
|
2261
|
+
},
|
|
2262
|
+
style: {
|
|
2263
|
+
background: "rgba(28,28,30,0.96)",
|
|
2264
|
+
border: "1px solid rgba(255,255,255,0.2)",
|
|
2265
|
+
borderRadius: "0.5rem",
|
|
2266
|
+
padding: "0.75rem 1.5rem",
|
|
2267
|
+
cursor: "pointer",
|
|
2268
|
+
color: "#fff",
|
|
2269
|
+
fontSize: "0.875rem",
|
|
2270
|
+
fontWeight: 500
|
|
2271
|
+
},
|
|
2272
|
+
children: "Play"
|
|
2273
|
+
}
|
|
2274
|
+
),
|
|
2168
2275
|
!playVideo && controlsVisible && !loadError && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2169
2276
|
"div",
|
|
2170
2277
|
{
|
|
@@ -5387,7 +5494,10 @@ function Element({ element, onSubmit, stageDuration }) {
|
|
|
5387
5494
|
case "prompt": {
|
|
5388
5495
|
if (promptError) {
|
|
5389
5496
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "p", { style: { color: "#dc2626", fontSize: "0.875rem" }, children: [
|
|
5390
|
-
"Error loading prompt
|
|
5497
|
+
"Error loading prompt",
|
|
5498
|
+
element.file ? ` "${element.file}"` : "",
|
|
5499
|
+
":",
|
|
5500
|
+
" ",
|
|
5391
5501
|
promptError.message
|
|
5392
5502
|
] });
|
|
5393
5503
|
}
|
|
@@ -5404,7 +5514,10 @@ function Element({ element, onSubmit, stageDuration }) {
|
|
|
5404
5514
|
fontSize: "0.875rem"
|
|
5405
5515
|
},
|
|
5406
5516
|
children: [
|
|
5407
|
-
"Error parsing prompt
|
|
5517
|
+
"Error parsing prompt",
|
|
5518
|
+
element.file ? ` "${element.file}"` : "",
|
|
5519
|
+
":",
|
|
5520
|
+
" ",
|
|
5408
5521
|
_optionalChain([parsed, 'access', _102 => _102.error, 'access', _103 => _103.issues, 'access', _104 => _104[0], 'optionalAccess', _105 => _105.message])
|
|
5409
5522
|
]
|
|
5410
5523
|
}
|
|
@@ -5477,6 +5590,7 @@ function Element({ element, onSubmit, stageDuration }) {
|
|
|
5477
5590
|
stopAt: element.stopAt,
|
|
5478
5591
|
allowScrubOutsideBounds: element.allowScrubOutsideBounds,
|
|
5479
5592
|
stepDuration: element.stepDuration,
|
|
5593
|
+
playback: element.playback,
|
|
5480
5594
|
controls: element.controls
|
|
5481
5595
|
}
|
|
5482
5596
|
);
|