@media-quest/engine 0.0.31 → 0.0.32

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.
@@ -233,6 +233,7 @@ interface DStyle {
233
233
  fontWeight: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;
234
234
  textAlign: "right" | "left" | "center";
235
235
  letterSpacing: DCss.Px;
236
+ lineHeight: number;
236
237
  position: "absolute" | "relative";
237
238
  display: "flex" | "block";
238
239
  flexDirection: "row" | "colum";
@@ -368,7 +369,6 @@ declare abstract class DElement<T extends HTMLElement> {
368
369
  updateState(state: TaskStateDiff): void;
369
370
  setState(state: TaskState): void;
370
371
  private handleStateChanges;
371
- private normalize;
372
372
  abstract registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void;
373
373
  protected updateStyles(style: Partial<DStyle>): void;
374
374
  }
@@ -595,10 +595,35 @@ var DStyle;
595
595
  const isNumber = DUtil.isNumber;
596
596
  const isLengthUnit = DCss.isLengthUnit;
597
597
  DStyle2.normalize = (el) => {
598
- el.style.padding = "0";
599
- el.style.margin = "0";
600
- el.style.position = "absolute";
601
- el.style.boxSizing = "border-box";
598
+ const s = el.style;
599
+ s.position = "absolute";
600
+ s.boxSizing = "border-box";
601
+ s.bottom = "";
602
+ s.top = "";
603
+ s.left = "";
604
+ s.right = "";
605
+ s.boxShadow = "";
606
+ s.padding = "0px";
607
+ s.margin = "0px";
608
+ s.fontSize = "12px";
609
+ s.lineHeight = "1";
610
+ s.textAlign = "center";
611
+ s.textDecoration = "none";
612
+ s.boxShadow = "";
613
+ s.boxSizing = "border-box";
614
+ s.fontWeight = "500";
615
+ s.borderStyle = "";
616
+ s.borderRadius = "";
617
+ s.borderWidth = "";
618
+ s.borderWidth = "10px";
619
+ s.borderColor = "black";
620
+ s.backgroundColor = "";
621
+ s.border = "";
622
+ s.borderStyle = "none";
623
+ s.outline = "";
624
+ s.wordSpacing = "";
625
+ s.userSelect = "none";
626
+ s.textShadow = "";
602
627
  return el;
603
628
  };
604
629
  DStyle2.applyStyles = (el, style, scale) => {
@@ -619,6 +644,7 @@ var DStyle;
619
644
  cursor,
620
645
  fontSize,
621
646
  fontWeight,
647
+ lineHeight,
622
648
  textColor,
623
649
  textAlign,
624
650
  translate,
@@ -659,6 +685,9 @@ var DStyle;
659
685
  if (DCss.isLengthUnit(maxWidth)) {
660
686
  el.style.maxWidth = DCss.toString(maxWidth, scale);
661
687
  }
688
+ if (typeof lineHeight === "number") {
689
+ el.style.lineHeight = "" + lineHeight;
690
+ }
662
691
  if (DCss.isLengthUnit(minHeight)) {
663
692
  el.style.minHeight = DCss.toString(minHeight, scale);
664
693
  }
@@ -851,7 +880,6 @@ var DElement = class {
851
880
  this.el.innerText = dto.innerText;
852
881
  }
853
882
  this.setStyle = this.setStyle.bind(this);
854
- this.normalize = this.normalize.bind(this);
855
883
  this.appendYourself = this.appendYourself.bind(this);
856
884
  this.updateStyles = this.updateStyles.bind(this);
857
885
  const { onMouseEnter, onMouseLeave } = dto;
@@ -865,7 +893,7 @@ var DElement = class {
865
893
  this.setStyle(onMouseLeave);
866
894
  };
867
895
  }
868
- this.normalize();
896
+ DStyle.normalize(this.el);
869
897
  if (dto) {
870
898
  this.updateStyles(dto?.style);
871
899
  }
@@ -955,12 +983,6 @@ var DElement = class {
955
983
  this.setStyle(whenVideoEndedAndMuted);
956
984
  }
957
985
  }
958
- normalize() {
959
- this.el.style.padding = "0";
960
- this.el.style.margin = "0";
961
- this.el.style.position = "absolute";
962
- this.el.style.boxSizing = "border-box";
963
- }
964
986
  updateStyles(style) {
965
987
  this.currStyle = Object.assign(this.currStyle, style);
966
988
  DStyle.applyStyles(this.el, this.currStyle, this.scale.scale);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/public-api.ts","../src/engine/history-que.ts","../src/utils/DUtil.ts","../src/rules/condition.ts","../src/rules/rule.ts","../src/rules/rule-engine.ts","../src/engine/next-que.ts","../src/engine/dplayer.ts","../src/engine/scale.ts","../src/Delement/css.ts","../src/Delement/DStyle.ts","../src/common/DTimestamp.ts","../src/page/task-state.ts","../src/Delement/DElement.ts","../src/Delement/Ddiv.ts","../src/Delement/DImg.ts","../src/Delement/DText.ts","../src/Delement/DButton.ts","../src/Delement/element-factory.ts","../src/Delement/button-click-action.ts","../src/events/mq-events.ts","../src/page/Page.ts","../src/page/task.ts","../src/page/task-manager.ts","../src/engine/SchemaEngine.ts"],"sourcesContent":["export * from \"./engine/SchemaResult\";\nexport * from \"./engine/SchemaEngine\";\nexport * from \"./engine/SchemaDto\";\nexport * from \"./engine/page-que-ruleengine-action\";\nexport * from \"./rules/rule\";\nexport * from \"./rules/fact\";\nexport * from \"./rules/rule-engine\";\nexport * from \"./rules/condition\";\nexport * from \"./utils/DUtil\";\n// export * from \"./utils/ID\";\n\nexport * from \"./events/mq-events\";\n\n// ELEMENTS\nexport * from \"./Delement/css\";\nexport * from \"./Delement/DStyle\";\nexport * from \"./Delement/DImg\";\nexport * from \"./Delement/DText\";\nexport * from \"./Delement/DButton\";\nexport * from \"./Delement/Ddiv\";\nexport * from \"./Delement/button-click-action\";\nexport * from \"./Delement/DElement\";\nexport * from \"./Delement/DElement.dto\";\nexport { PageDto } from \"./page/Page\";\nexport * from \"./page/task\";\n","import { Fact } from \"../rules/fact\";\r\nimport { PageResult } from \"../page/page-result\";\r\n\r\nexport class HistoryQue {\r\n private history: PageResult[] = [];\r\n\r\n getFacts(): Array<Fact> {\r\n const answers = this.history.map((h) => h.collectedFacts).flat(1);\r\n // const facts = answers.map((a) => a.fact);\r\n // TODO FIND LATEST FACT (answer) if have multiple.\r\n return answers;\r\n }\r\n\r\n addToHistory(result: PageResult) {\r\n this.history.push(result);\r\n }\r\n}\r\n","// export type RandomObjectId = string & { randomObjectId: true };\r\nexport namespace DUtil {\r\n export const randomString = (length: number): string => {\r\n const letters = \"abcdefghijklmnopqrstuvxyz\";\r\n const uppercase = letters.toUpperCase();\r\n const all = letters + uppercase;\r\n const abs = Math.abs(length);\r\n let result = \"\";\r\n\r\n for (let i = 0; i < abs; i++) {\r\n const char = all.charAt(Math.floor(Math.random() * all.length));\r\n result += char;\r\n }\r\n return result;\r\n };\r\n\r\n export const randomObjectId = () => randomString(32);\r\n\r\n export const deleteProp = <Obj, Key extends keyof Obj>(obj: Obj, key: Key): Omit<Obj, Key> => {\r\n delete obj[key];\r\n return obj;\r\n };\r\n\r\n export const isInRange = (min: number, max: number) => {\r\n return (value: number) => value >= min && value <= max;\r\n };\r\n export const isInfinity = (number: number) => {\r\n return (\r\n number === Number.POSITIVE_INFINITY ||\r\n number === Number.NEGATIVE_INFINITY ||\r\n number === Infinity\r\n );\r\n };\r\n export type NonEmptyArray<T> = [T, ...T[]];\r\n export const isNonEmptyArray = <T>(array: Array<T>): array is NonEmptyArray<T> => {\r\n return array.length > 0;\r\n };\r\n\r\n export const neverCheck = (args: never) => {\r\n console.log(\"OOPS: This value slipped through the never-check\", args);\r\n };\r\n\r\n export const isString = (str: unknown): str is string => typeof str === \"string\";\r\n\r\n export const hasKey = <T extends string>(\r\n obj: unknown,\r\n key: T,\r\n ): obj is Record<typeof key, unknown> => {\r\n if (!isRecord(obj)) {\r\n return false;\r\n }\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n };\r\n\r\n export const isRecord = (obj: unknown): obj is Record<string, unknown> => {\r\n if (!obj) {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return false;\r\n }\r\n\r\n if (typeof obj !== \"object\") {\r\n return false;\r\n }\r\n\r\n if (obj === null) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n export const isBool = (obj?: boolean): obj is boolean => typeof obj === \"boolean\";\r\n\r\n export const isTrue = (bool?: boolean): bool is true => bool === true;\r\n\r\n export const isFalse = (bool?: boolean): bool is false => bool === false;\r\n\r\n export const isDefined = (obj: unknown): boolean => {\r\n const notNull = obj !== null;\r\n const notUndefined = obj !== undefined;\r\n return notNull && notUndefined;\r\n };\r\n\r\n export const hasKind = (obj: unknown): obj is { readonly kind: string } => {\r\n if (!hasKey(obj, \"kind\")) {\r\n return false;\r\n }\r\n if (typeof obj.kind !== \"string\") {\r\n return false;\r\n }\r\n return obj.kind.length > 0;\r\n };\r\n\r\n export const hasValue = (obj: unknown): obj is { value: unknown } => {\r\n return hasKey(obj, \"value\");\r\n };\r\n export const isNumber = (value?: number): value is number => {\r\n const isNumber = typeof value === \"number\";\r\n const notNaN = !Number.isNaN(value);\r\n return isNumber && notNaN;\r\n };\r\n\r\n export const maxFn = (upperLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, upperLimit);\r\n };\r\n };\r\n\r\n export const minFn = (lowerLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, lowerLimit);\r\n };\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\nexport type Condition = Condition.String | Condition.Numeric | Condition.Complex;\r\n\r\nexport namespace Condition {\r\n export type StringOperator = \"eq\" | \"not-eq\" | \"longer-then\" | \"shorter-then\";\r\n\r\n export type NumericOperator =\r\n | \"eq\"\r\n | \"not-eq\"\r\n | \"greater-then\"\r\n | \"less-then\"\r\n | \"greater-then-inclusive\"\r\n | \"less-then-inclusive\";\r\n\r\n export interface Numeric {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"numeric-condition\";\r\n readonly operator: NumericOperator;\r\n readonly value: number;\r\n }\r\n export interface String {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"string-condition\";\r\n readonly operator: StringOperator;\r\n readonly value: string;\r\n }\r\n\r\n export interface Complex {\r\n readonly kind: \"complex-condition\";\r\n readonly name: string;\r\n readonly all: ReadonlyArray<Condition.Simple>;\r\n readonly some: ReadonlyArray<Condition.Simple>;\r\n }\r\n\r\n export type Simple = Condition.String | Condition.Numeric;\r\n\r\n /**\r\n * An empty condition will evaluate to false,\r\n * @param condition: Condition.Any\r\n * @param facts\r\n */\r\n export const evaluate = (condition: Condition, facts: ReadonlyArray<Fact>) => {\r\n let result: boolean = false;\r\n switch (condition.kind) {\r\n case \"string-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"numeric-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"complex-condition\":\r\n result = evaluateComplex(condition, facts);\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateComplex = (condition: Condition.Complex, facts: ReadonlyArray<Fact>): boolean => {\r\n if (condition.some.length === 0 && condition.all.length === 0) {\r\n return false;\r\n }\r\n const allSolved = condition.all.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n\r\n const someEvaluated = condition.some.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n const allResult = allSolved.every(DUtil.isTrue);\r\n const someResult = someEvaluated.length === 0 || someEvaluated.some(DUtil.isTrue);\r\n return someResult && allResult;\r\n };\r\n\r\n const evaluateSimple = (condition: Condition.Simple, facts: ReadonlyArray<Fact>): boolean => {\r\n const fact = facts.find((f) => f.referenceId === condition.referenceId);\r\n if (!fact) {\r\n return false;\r\n }\r\n let res = false;\r\n switch (condition.kind) {\r\n case \"numeric-condition\":\r\n if (fact.kind === \"numeric-fact\") {\r\n res = evaluateNumeric(condition, fact.value);\r\n }\r\n break;\r\n case \"string-condition\":\r\n if (fact.kind === \"string-fact\") {\r\n res = evaluateString(condition, fact.value);\r\n }\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return res;\r\n };\r\n\r\n export const isEmpty = (complex: Complex) => {\r\n return complex.all.length === 0 && complex.some.length === 0;\r\n };\r\n\r\n const evaluateString = (condition: Readonly<Condition.String>, value: string): boolean => {\r\n const operator = condition.operator;\r\n let result = false;\r\n switch (operator) {\r\n case \"eq\":\r\n result = condition.value === value;\r\n break;\r\n case \"not-eq\":\r\n result = condition.value !== value;\r\n break;\r\n case \"shorter-then\":\r\n result = condition.value !== value;\r\n break;\r\n case \"longer-then\":\r\n result = condition.value !== value;\r\n break;\r\n default:\r\n const check: never = operator;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateNumeric = (condition: Numeric, value: number): boolean => {\r\n const op = condition.operator;\r\n const conditionValue = condition.value;\r\n let result = false;\r\n switch (op) {\r\n case \"eq\":\r\n result = value === conditionValue;\r\n break;\r\n case \"not-eq\":\r\n result = value !== conditionValue;\r\n break;\r\n case \"greater-then\":\r\n result = value > conditionValue;\r\n break;\r\n case \"greater-then-inclusive\":\r\n result = value >= conditionValue;\r\n break;\r\n case \"less-then\":\r\n result = value < conditionValue;\r\n break;\r\n case \"less-then-inclusive\":\r\n result = value <= conditionValue;\r\n break;\r\n default:\r\n const check: never = op;\r\n }\r\n return result;\r\n };\r\n\r\n const _getAllSimple = (condition: Condition): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n switch (condition.kind) {\r\n case \"complex-condition\":\r\n simple.push(...condition.all);\r\n simple.push(...condition.some);\r\n break;\r\n case \"numeric-condition\":\r\n simple.push(condition);\r\n break;\r\n case \"string-condition\":\r\n simple.push(condition);\r\n break;\r\n default:\r\n DUtil.neverCheck(condition);\r\n }\r\n return simple;\r\n };\r\n\r\n export const getAllSimpleConditions = (\r\n condition: Condition | Array<Condition>\r\n ): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n if (Array.isArray(condition)) {\r\n condition.forEach((c) => {\r\n simple.push(..._getAllSimple(c));\r\n });\r\n } else {\r\n simple.push(..._getAllSimple(condition));\r\n }\r\n return simple;\r\n };\r\n}\r\n","import { Condition } from \"./condition\";\r\nimport { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\n\r\nexport interface Rule<OnSuccessAction, OnFailureAction> {\r\n readonly id?: string;\r\n readonly description: string;\r\n readonly all: ReadonlyArray<Condition>;\r\n readonly some: ReadonlyArray<Condition>;\r\n readonly onSuccess: ReadonlyArray<OnSuccessAction>;\r\n readonly onFailure: ReadonlyArray<OnFailureAction>;\r\n}\r\n\r\nexport namespace Rule {\r\n /**\r\n * Validates that the rule is valid.\r\n * @param rule\r\n */\r\n\r\n export const isEmpty = (rule: Rule<any, any>): boolean => {\r\n const emptyConditions = rule.all.length === 0 && rule.some.length === 0;\r\n const emptyActions = rule.onSuccess.length === 0 && rule.onFailure.length === 0;\r\n return emptyConditions || emptyActions;\r\n };\r\n\r\n export const solve = (rule: Rule<any, any>, facts: ReadonlyArray<Fact>): boolean => {\r\n if (rule.some.length === 0 && rule.all.length === 0) {\r\n // TODO RETURN WARNING? OR LOGGING ?\r\n return false;\r\n }\r\n\r\n const someSolved = rule.some.map((condition) => Condition.evaluate(condition, facts));\r\n\r\n const someResult = someSolved.length === 0 || someSolved.some(DUtil.isTrue);\r\n\r\n const allSolved = rule.all.map((condition) => Condition.evaluate(condition, facts)).every(DUtil.isTrue);\r\n\r\n return allSolved && someResult;\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { Rule } from \"./rule\";\r\n\r\nexport interface SolveResult<S, F> {\r\n matching: ReadonlyArray<Match<S, F>>;\r\n errors: ReadonlyArray<RuleEngineError>;\r\n}\r\n\r\nexport interface Match<S, F> {\r\n readonly matchingRuleId: string;\r\n readonly ruleDescription: string;\r\n readonly actionList: ReadonlyArray<S> | ReadonlyArray<F>;\r\n}\r\n\r\nexport interface RuleEngineError {\r\n readonly kind?: string;\r\n readonly message: string;\r\n}\r\n\r\nexport class RuleEngine<S, F> {\r\n constructor() {}\r\n\r\n solveAll(rules: Rule<S, F>[], facts: Fact[]): SolveResult<S, F> {\r\n const errors: RuleEngineError[] = [];\r\n const matching: Match<S, F>[] = [];\r\n rules.forEach((rule) => {\r\n if (Rule.isEmpty(rule)) {\r\n errors.push({ message: \"Empty rule: \" + rule.id });\r\n } else if (Rule.solve(rule, facts)) {\r\n const match: Match<S, F> = {\r\n ruleDescription: rule.description,\r\n matchingRuleId: rule.id ?? \"no-id-given\",\r\n actionList: [...rule.onSuccess],\r\n };\r\n matching.push(match);\r\n }\r\n });\r\n return { matching, errors };\r\n }\r\n\r\n solve(rule: Rule<S, F>, facts: Fact[]): boolean {\r\n // TODO Validate, and Return result\r\n return Rule.solve(rule, facts);\r\n }\r\n}\r\n","import { PageDto } from \"../page/Page\";\r\n\r\nexport class NextQue {\r\n private originalOrder: ReadonlyArray<string> = [];\r\n private allPages: PageDto[] = [];\r\n private excludedTags = new Set<string>();\r\n private excludedByPageId = new Set<string>();\r\n private remaining: PageDto[] = [];\r\n constructor(pages: PageDto[] = []) {\r\n this.resetQue(pages);\r\n }\r\n\r\n /**\r\n * Will reset que with the new pages.\r\n * @param pages\r\n */\r\n resetQue(pages: PageDto[]) {\r\n this.allPages = [...pages];\r\n this.remaining = [...pages];\r\n this.excludedTags = new Set();\r\n this.excludedByPageId = new Set();\r\n this.originalOrder = this.allPages.map((p) => p.id);\r\n }\r\n\r\n pop(): PageDto | false {\r\n const next = this.remaining.shift();\r\n // TODO CLONE??\r\n return next ?? false;\r\n }\r\n\r\n peek(): PageDto | false {\r\n const next = this.remaining[0];\r\n return next ?? false;\r\n }\r\n\r\n jumpToPageById(pageId: string): boolean {\r\n const index = this.remaining.findIndex((p) => p.id === pageId);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this.remaining = this.remaining.slice(index);\r\n return true;\r\n }\r\n\r\n removeByTag(tag: string | string[]) {\r\n if (Array.isArray(tag)) {\r\n tag.forEach((tag) => {\r\n this.excludedTags.add(tag);\r\n });\r\n } else {\r\n this.excludedTags.add(tag);\r\n }\r\n this.filterRemaining();\r\n }\r\n\r\n /**\r\n * Will not be included\r\n * @param pages\r\n */\r\n insertAsNextByForce(pages: PageDto[]) {\r\n this.remaining.unshift(...pages);\r\n }\r\n\r\n removeByPageId(pageId: string | string[]) {\r\n if (Array.isArray(pageId)) {\r\n pageId.forEach((id) => {\r\n this.excludedByPageId.add(id);\r\n });\r\n } else {\r\n this.excludedByPageId.add(pageId);\r\n }\r\n this.filterRemaining();\r\n // this.excludedByPageId.add(pageId);\r\n }\r\n\r\n private filterRemaining() {\r\n this.remaining = this.remaining.filter((p) => {\r\n const tags = p.tags ?? [];\r\n const isIncluededByTag = !tags.some((tag) => this.excludedTags.has(tag));\r\n const isIncludedByPageId = !this.excludedByPageId.has(p.id);\r\n return isIncludedByPageId && isIncluededByTag;\r\n });\r\n }\r\n get isEmpty(): boolean {\r\n return this.remaining.length === 0;\r\n }\r\n\r\n /**\r\n * Total number of pages left in que\r\n */\r\n get size(): number {\r\n return this.remaining.length;\r\n }\r\n\r\n /**\r\n * Total number of pages in test\r\n */\r\n get pageCount(): number {\r\n return this.originalOrder.length;\r\n }\r\n}\r\n","import { HistoryQue } from \"./history-que\";\nimport { RuleEngine } from \"../rules/rule-engine\";\nimport { NextQue } from \"./next-que\";\nimport { SchemaDto } from \"./SchemaDto\";\nimport { RuleActionPageQue } from \"./page-que-ruleengine-action\";\nimport { PageDto } from \"../page/Page\";\nimport { PageResult } from \"../page/page-result\";\nimport { Fact } from \"../rules/fact\";\nimport { MqEvent } from \"../events/mq-events\";\n\nexport type DPlayerData = Pick<SchemaDto, \"pages\" | \"pageSequences\" | \"rules\" | \"predefinedFacts\">;\nexport class DPlayer {\n private readonly eventLog: Array<MqEvent> = [];\n private history = new HistoryQue();\n private ruleEngine = new RuleEngine<RuleActionPageQue, never>();\n private nextQue = new NextQue();\n private data: DPlayerData;\n private readonly predefinedFacts: ReadonlyArray<Fact>;\n\n constructor(data: DPlayerData) {\n this.data = data;\n const pages = data.pages ?? [];\n this.predefinedFacts = data.predefinedFacts ? [...data.predefinedFacts] : [];\n this.nextQue.resetQue(pages);\n }\n\n saveEvent(event: MqEvent) {\n this.eventLog.push(event);\n }\n\n saveHistory(pageHistory: PageResult) {\n // console.log(\"SAVE HISTORY\", pageHistory);\n this.history.addToHistory(pageHistory);\n this.eventLog.push(...pageHistory.eventLog);\n // Evaluate rules\n const userGeneratedFact = this.history.getFacts();\n const predefinedFacts = this.predefinedFacts;\n const facts = [...userGeneratedFact, ...predefinedFacts];\n const result = this.ruleEngine.solveAll(this.data.rules, facts);\n\n const matchingRules = result.matching;\n const actions = matchingRules.map((r) => r.actionList).flat(1);\n // Execute actions\n actions.forEach((a) => {\n // console.log(a.payload);\n switch (a.kind) {\n case \"jumpToPage\":\n this.nextQue.jumpToPageById(a.pageId);\n break;\n case \"excludeByPageId\":\n this.nextQue.removeByPageId(a.pageIds);\n break;\n case \"excludeByTag\":\n this.nextQue.removeByTag(a.tagIds);\n break;\n default:\n console.log(\"UNKNOWN ACTION\", a);\n const check: never = a;\n }\n });\n }\n\n getResults() {\n const pagesLeft = this.nextQue.size;\n const answerFacts = this.history.getFacts();\n const predefinedFacts = this.predefinedFacts;\n const eventLog = [...this.eventLog];\n // console.log(answerFacts);\n return { answerFacts, predefinedFacts, eventLog, pagesLeft };\n }\n\n insertSequence(sequenceId: string) {\n this.insertSequenceById(sequenceId);\n }\n\n getNextPage(): PageDto | false {\n const next = this.nextQue.pop();\n return next ?? false;\n }\n\n private insertSequenceById(id: string) {\n const seq = this.data.pageSequences?.find((s) => s.id === id);\n if (seq) {\n this.nextQue.insertAsNextByForce([...seq.pages]);\n } else {\n // HOW TO HANDLE INVALID ID_REFS?? LOGGER??\n // LOG INVALID COMMAND.\n }\n }\n\n /**\n * Total number of pages left in que\n */\n get pagesLeft(): number {\n return this.nextQue.pageCount;\n }\n\n /**\n * Total number of pages in test\n */\n get totalPageCount(): number {\n return this.data.pages.length;\n }\n}\n","export class ScaleService {\r\n private readonly baseHeight;\r\n private readonly baseWidth;\r\n private containerHeight = 1300;\r\n private containerWidth = 1300;\r\n\r\n get scale() {\r\n return this._scale;\r\n }\r\n\r\n get pageHeight() {\r\n return this.baseHeight * this.scale;\r\n }\r\n get pageWidth() {\r\n return this.baseWidth * this._scale;\r\n }\r\n\r\n private _scale = 1;\r\n\r\n private readonly subscribers = new Set<(scale: number) => void>();\r\n\r\n constructor(config: { baseHeight: number; baseWidth: number; containerHeight: number; containerWidth: number }) {\r\n this.baseHeight = config.baseHeight;\r\n this.baseWidth = config.baseWidth;\r\n this.containerHeight = config.containerHeight;\r\n this.containerWidth = config.containerWidth;\r\n this.updateScale();\r\n }\r\n\r\n setContainerBounds(bounds: { height: number; width: number }) {\r\n this.containerWidth = bounds.width;\r\n this.containerHeight = bounds.height;\r\n this.updateScale();\r\n }\r\n private updateScale() {\r\n const scaleFn = Scale.calc(this.baseHeight, this.baseWidth);\r\n const scale = scaleFn({ height: this.containerHeight, width: this.containerWidth });\r\n const hasChanged = this.scale !== scale;\r\n this._scale = scale;\r\n if (hasChanged) {\r\n this.subscribers.forEach((fn) => {\r\n fn(this._scale);\r\n });\r\n }\r\n }\r\n\r\n onChange(scaleChangeHandler: (scale: number) => void, subscriberId: string) {\r\n // console.log(subscriberId);\r\n this.subscribers.add(scaleChangeHandler);\r\n scaleChangeHandler(this._scale);\r\n return () => {\r\n this.subscribers.delete(scaleChangeHandler);\r\n };\r\n }\r\n}\r\nexport namespace Scale {\r\n export const calc = (baseHeight: number, baseWidth: number) => {\r\n return (container: { height: number; width: number }) => {\r\n const heightRatio = container.height / baseHeight;\r\n const widthRatio = container.width / baseWidth;\r\n return Math.min(heightRatio, widthRatio);\r\n };\r\n };\r\n\r\n type ScalePosInput = { x: number; y: number; h: number; w: number };\r\n\r\n export const scaleFunctionCreator = (scale: number) => {\r\n return (value: number) => value * scale;\r\n };\r\n}\r\n","import { DUtil } from \"../utils/DUtil\";\n\nexport namespace DCss {\n export interface Px {\n readonly _unit: \"px\";\n readonly value: number;\n }\n\n export type LengthString = `${number}px` | `${number}%`;\n export interface Percent {\n readonly _unit: \"percent\";\n readonly value: number;\n }\n\n export type LengthUnit = Px | Percent | number;\n\n /**\n * Will scale to 3% of baseScale\n * @param unit\n * @param scale\n */\n export const toString = (unit: Readonly<LengthUnit>, scale: number): LengthString => {\n const _mapped: Percent | Px =\n typeof unit === \"number\" ? { _unit: \"percent\", value: unit } : unit;\n return _toString(_mapped, scale);\n };\n const _toString = (unit: Readonly<Percent | Px>, scale: number): LengthString => {\n const clampedScale = Math.max(scale, 0.03);\n if (unit._unit === \"px\") {\n if (unit.value < 0.1) {\n return \"0px\";\n }\n\n const rounded = Math.round(unit.value * clampedScale);\n const clamped = Math.max(rounded, 1);\n return (clamped + \"px\") as LengthString;\n }\n return (unit.value + \"%\") as LengthString;\n };\n\n export const isLengthUnit = (unit?: LengthUnit): unit is LengthUnit => {\n if (typeof unit === \"number\") {\n return true;\n }\n\n if (!unit) {\n return false;\n }\n\n const unitKey: keyof DCss.Px = \"_unit\";\n const valueKey: keyof DCss.Px = \"value\";\n const hasUnitKey = DUtil.hasKey(unit, unitKey);\n const hasValueKey = DUtil.hasKey(unit, valueKey);\n return hasUnitKey && hasValueKey;\n };\n}\n","import { DCss } from \"./css\";\nimport { DUtil } from \"../utils/DUtil\";\n\nexport type PStyle = Partial<DStyle>;\nexport interface DStyle {\n opacity: number;\n backgroundColor: string;\n visibility: \"visible\" | \"hidden\";\n cursor:\n | \"pointer\"\n | \"help\"\n | \"copy\"\n | \"wait\"\n | \"not-allowed\"\n | \"context-menu\"\n | \"move\"\n | \"grabbing\"\n | \"grab\"\n | \"zoom-in\"\n | \"zoom-out\"\n | \"none\"\n | \"auto\"\n | \"default\";\n\n zIndex: number;\n // POSITION\n h: number;\n w: number;\n x: number;\n y: number;\n height: DCss.LengthUnit;\n maxHeight: DCss.LengthUnit;\n minHeight: DCss.LengthUnit;\n width: DCss.LengthUnit;\n maxWidth: DCss.LengthUnit;\n minWidth: DCss.LengthUnit;\n bottom: DCss.LengthUnit;\n top: DCss.LengthUnit;\n left: DCss.LengthUnit;\n right: DCss.LengthUnit;\n boxShadow: string;\n\n // BORDERS\n borderStyle: \"solid\" | \"none\" | \"dotted\" | \"dashed\";\n borderRadius: DCss.Px | DCss.Percent;\n borderWidth: DCss.Px;\n borderColor: string;\n\n margin: DCss.Px | DCss.Percent;\n padding: DCss.Px | DCss.Percent;\n paddingLeft: DCss.Px | DCss.Percent;\n paddingRight: DCss.Px | DCss.Percent;\n paddingTop: DCss.Px | DCss.Percent;\n paddingBottom: DCss.Px | DCss.Percent;\n\n // Translate\n transform: string;\n translate: string;\n\n // TEXT\n fontSize: DCss.Px;\n textColor: string;\n fontWeight: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n textAlign: \"right\" | \"left\" | \"center\";\n letterSpacing: DCss.Px;\n\n // LAYOUT & POSITIONING OVERRIDE\n position: \"absolute\" | \"relative\";\n display: \"flex\" | \"block\";\n flexDirection: \"row\" | \"colum\";\n flexWrap: \"nowrap\" | \"wrap\";\n justifyContent:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"space-around\"\n | \"space-evenly\"\n | \"space-between\";\n alignItems: \"stretch\" | \"baseline\" | \"center\" | \"flex-start\" | \"flex-end\";\n gap: DCss.Px;\n alignContent:\n | \"stretch\"\n | \"center\"\n | \"flex-start\"\n | \"flex-end\"\n | \"space-around\"\n | \"space-evenly\"\n | \"space-between\";\n}\n\nexport namespace DStyle {\n import isNumber = DUtil.isNumber;\n import isLengthUnit = DCss.isLengthUnit;\n export const normalize = <T extends HTMLElement>(el: T): T => {\n el.style.padding = \"0\";\n el.style.margin = \"0\";\n el.style.position = \"absolute\";\n el.style.boxSizing = \"border-box\";\n return el;\n };\n\n export const applyStyles = <T extends HTMLElement>(\n el: T,\n style: Partial<DStyle>,\n scale: number,\n ): T => {\n // const scalePx = DCss.toStringCre(this.scale);\n const {\n x,\n y,\n left,\n right,\n top,\n bottom,\n backgroundColor,\n borderColor,\n borderWidth,\n borderRadius,\n borderStyle,\n w,\n opacity,\n cursor,\n fontSize,\n fontWeight,\n textColor,\n textAlign,\n translate,\n margin,\n padding,\n letterSpacing,\n h,\n height,\n width,\n transform,\n visibility,\n justifyContent,\n alignContent,\n flexWrap,\n display,\n flexDirection,\n alignItems,\n position,\n paddingLeft,\n paddingTop,\n paddingRight,\n paddingBottom,\n gap,\n\n zIndex,\n //\n boxShadow,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n } = style;\n\n if (typeof zIndex === \"number\") {\n el.style.zIndex = \"\" + zIndex;\n }\n\n if (DCss.isLengthUnit(minWidth)) {\n el.style.minWidth = DCss.toString(minWidth, scale);\n }\n\n if (DCss.isLengthUnit(maxWidth)) {\n el.style.maxWidth = DCss.toString(maxWidth, scale);\n }\n\n if (DCss.isLengthUnit(minHeight)) {\n el.style.minHeight = DCss.toString(minHeight, scale);\n }\n\n if (DCss.isLengthUnit(maxHeight)) {\n el.style.maxHeight = DCss.toString(maxHeight, scale);\n }\n\n if (boxShadow) {\n el.style.boxShadow = boxShadow;\n }\n\n if (gap) {\n el.style.gap = DCss.toString(gap, scale);\n }\n\n if (paddingLeft) {\n el.style.paddingLeft = DCss.toString(paddingLeft, scale);\n }\n\n if (paddingRight) {\n el.style.paddingRight = DCss.toString(paddingRight, scale);\n }\n\n if (paddingTop) {\n el.style.paddingTop = DCss.toString(paddingTop, scale);\n }\n\n if (paddingBottom) {\n el.style.paddingBottom = DCss.toString(paddingBottom, scale);\n }\n\n if (position) {\n el.style.position = position;\n }\n if (justifyContent) {\n el.style.justifyContent = justifyContent;\n }\n\n if (alignContent) {\n el.style.alignContent = alignContent;\n }\n if (flexWrap) {\n el.style.flexWrap = flexWrap;\n }\n if (display) {\n el.style.display = display;\n }\n if (flexDirection) {\n el.style.flexDirection = flexDirection;\n }\n if (alignItems) {\n el.style.alignItems = alignItems;\n }\n\n // this.el.style.fontWeight = '900';\n if (backgroundColor) {\n el.style.backgroundColor = backgroundColor;\n }\n\n if (cursor) {\n el.style.cursor = cursor;\n }\n\n if (transform) {\n el.style.transform = transform;\n }\n\n if (textColor) {\n el.style.color = textColor;\n }\n if (textAlign) {\n el.style.textAlign = textAlign;\n }\n\n if (borderColor) {\n el.style.borderColor = borderColor;\n }\n\n if (borderWidth) {\n el.style.borderWidth = DCss.toString(borderWidth, scale);\n }\n\n if (fontWeight) {\n el.style.fontWeight = fontWeight + \"\";\n }\n\n if (borderStyle) {\n el.style.borderStyle = borderStyle;\n }\n\n if (fontSize) {\n el.style.fontSize = DCss.toString(fontSize, scale);\n }\n\n if (DUtil.isNumber(x)) {\n el.style.left = x + \"%\";\n }\n\n if (DUtil.isNumber(y)) {\n el.style.bottom = y + \"%\";\n }\n\n if (DCss.isLengthUnit(height)) {\n el.style.height = DCss.toString(height, scale);\n }\n\n if (DCss.isLengthUnit(width)) {\n el.style.width = DCss.toString(width, scale);\n }\n\n if (DCss.isLengthUnit(left)) {\n el.style.left = DCss.toString(left, scale);\n }\n\n if (DCss.isLengthUnit(right)) {\n el.style.right = DCss.toString(right, scale);\n }\n\n if (DCss.isLengthUnit(bottom)) {\n el.style.bottom = DCss.toString(bottom, scale);\n }\n\n if (DCss.isLengthUnit(top)) {\n el.style.top = DCss.toString(top, scale);\n }\n\n if (DUtil.isNumber(h)) {\n el.style.height = DCss.toString(h, scale);\n }\n\n if (isNumber(w)) {\n el.style.width = DCss.toString(w, scale);\n }\n\n if (DCss.isLengthUnit(borderRadius)) {\n el.style.borderRadius = DCss.toString(borderRadius, scale);\n }\n\n if (letterSpacing) {\n el.style.letterSpacing = DCss.toString(letterSpacing, scale);\n }\n\n if (margin) {\n el.style.margin = DCss.toString(margin, scale);\n }\n\n if (padding) {\n el.style.padding = DCss.toString(padding, scale);\n }\n\n if (isNumber(opacity)) {\n el.style.opacity = opacity + \"\";\n }\n\n if (visibility) {\n el.style.visibility = visibility;\n }\n return el;\n };\n // const propNames = new Set(...ElementKeyNames);\n // export const validKey = (keyName: string) => propNames.has(keyName);\n}\n","export type DTimestamp = number & { __timestamp__: true };\r\nexport namespace DTimestamp {\r\n export const now = () => Date.now() as DTimestamp;\r\n export type Diff = number & { __diff__: true };\r\n\r\n export const addMills = (t: DTimestamp, ms: number): DTimestamp => {\r\n const res = t + Math.abs(ms);\r\n return res as DTimestamp;\r\n };\r\n\r\n export const diff = (t1: DTimestamp, t2: DTimestamp): Diff => {\r\n const t1Abs = Math.abs(t1);\r\n const t2Abs = Math.abs(t2);\r\n return Math.abs(t1Abs - t2Abs) as Diff;\r\n };\r\n\r\n export const diffNow = (t: DTimestamp): Diff => {\r\n return diff(t, now());\r\n };\r\n}\r\n","import { DTimestamp } from \"../common/DTimestamp\";\nimport diff = DTimestamp.diff;\n\nexport type TaskState = {\n audioIsPlaying: boolean;\n isGifMode: boolean;\n videoPlayState:\n | \"playing\"\n | \"paused\"\n | \"ended\"\n | \"playing-and-muted\"\n | \"paused-and-muted\"\n | \"ended-and-muted\";\n blockFormInput: boolean;\n blockResponseButton: boolean;\n blockAudio: boolean;\n blockVideo: boolean;\n};\n\nexport type TaskStateDiff = Partial<TaskState> & { __diffed__: true };\nexport const TaskState = {\n eq: (a: TaskState, b: TaskState) => {\n return (\n a.audioIsPlaying === b.audioIsPlaying &&\n a.isGifMode === b.isGifMode &&\n a.videoPlayState === b.videoPlayState &&\n a.blockFormInput === b.blockFormInput &&\n a.blockResponseButton === b.blockResponseButton &&\n a.blockAudio === b.blockAudio &&\n a.blockVideo === b.blockVideo\n );\n },\n\n getDiff: (curr: TaskState, prev: TaskState | false): TaskStateDiff => {\n if (prev === false) {\n return curr as TaskStateDiff;\n }\n\n const diff = {} as TaskStateDiff;\n\n if (curr.audioIsPlaying !== prev.audioIsPlaying) {\n diff.audioIsPlaying = curr.audioIsPlaying;\n }\n if (curr.isGifMode !== prev.isGifMode) {\n diff.isGifMode = curr.isGifMode;\n }\n if (curr.videoPlayState !== prev.videoPlayState) {\n diff.videoPlayState = curr.videoPlayState;\n }\n\n if (curr.blockFormInput !== prev.blockFormInput) {\n diff.blockFormInput = curr.blockFormInput;\n }\n if (curr.blockResponseButton !== prev.blockResponseButton) {\n diff.blockResponseButton = curr.blockResponseButton;\n }\n if (curr.blockAudio !== prev.blockAudio) {\n diff.blockAudio = curr.blockAudio;\n }\n if (curr.blockVideo !== prev.blockVideo) {\n diff.blockVideo = curr.blockVideo;\n }\n return diff;\n },\n};\n","import { DStyle, PStyle } from \"./DStyle\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\nimport { DElementDto } from \"./DElement.dto\";\nimport { TaskState, TaskStateDiff } from \"../page/task-state\";\n\nexport interface DElementBaseDto {\n readonly style: PStyle;\n readonly onMouseEnter?: PStyle;\n readonly onMouseLeave?: PStyle;\n readonly onMouseDown?: PStyle;\n readonly onMouseUp?: PStyle;\n readonly innerText?: string;\n\n // ACTIONS HANDLERS\n readonly onClick?: ButtonClickAction;\n\n // VIDEO STATED\n readonly whenVideoPaused?: PStyle;\n readonly whenVideoPausedAndMuted?: PStyle;\n readonly whenVideoEnded?: PStyle;\n readonly whenVideoEndedAndMuted?: PStyle;\n readonly whenVideoPlaying?: PStyle;\n readonly whenVideoPlayingAndMuted?: PStyle;\n\n readonly whenAudioPlaying?: PStyle;\n readonly whenAudioPaused?: PStyle;\n readonly whenAudioBlocked?: PStyle;\n readonly whenVideoBlocked?: PStyle;\n readonly whenAudioUnblocked?: PStyle;\n readonly whenVideoUnblocked?: PStyle;\n readonly whenResponseBlocked?: PStyle;\n readonly whenResponseUnblocked?: PStyle;\n readonly whenFormInputBlocked?: PStyle;\n readonly whenFormInputUnblocked?: PStyle;\n}\n\nconst isFalse = (bool?: boolean): bool is false => bool === false;\nconst isTrue = (bool?: boolean): bool is true => bool === true;\n\nexport abstract class DElement<T extends HTMLElement> {\n private prevState: TaskState | false = false;\n\n protected currStyle: Partial<DStyle> = {\n fontSize: { _unit: \"px\", value: 100 },\n fontWeight: 500,\n textColor: \"black\",\n opacity: 1,\n };\n\n protected constructor(\n protected readonly el: T,\n protected readonly dto: DElementBaseDto,\n protected readonly scale: ScaleService,\n ) {\n if (dto.innerText) {\n this.el.innerText = dto.innerText;\n }\n this.setStyle = this.setStyle.bind(this);\n this.normalize = this.normalize.bind(this);\n this.appendYourself = this.appendYourself.bind(this);\n this.updateStyles = this.updateStyles.bind(this);\n const { onMouseEnter, onMouseLeave } = dto;\n\n if (onMouseEnter) {\n this.el.onmouseenter = () => {\n this.setStyle(onMouseEnter);\n };\n }\n if (onMouseLeave) {\n this.el.onmouseleave = () => {\n this.setStyle(onMouseLeave);\n };\n }\n\n this.normalize();\n\n if (dto) {\n this.updateStyles(dto?.style);\n }\n }\n\n /**\n * This method is called when the element is clicked.\n * This method shall be overridden by the pageClass.\n * @param style\n */\n setStyle(style: PStyle) {\n this.updateStyles(style);\n }\n\n getElementByDangerousReference() {\n return this.el;\n }\n\n appendYourself(parent: { append: (el: HTMLElement) => void }) {\n parent.append(this.el);\n // console.log(parent);\n }\n\n updateState(state: TaskStateDiff) {\n this.handleStateChanges(state);\n }\n\n setState(state: TaskState) {\n const prev = this.prevState;\n const diff = TaskState.getDiff(state, prev);\n this.prevState = state;\n if (Object.keys(diff).length > 0) {\n this.handleStateChanges(diff);\n }\n }\n\n private handleStateChanges(diff: TaskStateDiff) {\n const {\n audioIsPlaying,\n videoPlayState,\n blockAudio,\n blockVideo,\n blockResponseButton,\n blockFormInput,\n isGifMode,\n } = diff;\n const {\n whenAudioPaused,\n whenVideoPaused,\n whenAudioPlaying,\n whenFormInputBlocked,\n whenResponseBlocked,\n\n whenVideoPlaying,\n whenVideoEnded,\n\n whenAudioBlocked,\n whenVideoBlocked,\n whenAudioUnblocked,\n whenVideoUnblocked,\n whenResponseUnblocked,\n whenFormInputUnblocked,\n whenVideoPausedAndMuted,\n whenVideoEndedAndMuted,\n whenVideoPlayingAndMuted,\n } = this.dto;\n\n if (isTrue(audioIsPlaying) && whenAudioPlaying) {\n this.setStyle(whenAudioPlaying);\n }\n\n if (isFalse(audioIsPlaying) && whenAudioPaused) {\n this.setStyle(whenAudioPaused);\n }\n\n if (videoPlayState === \"playing\" && whenVideoPlaying) {\n this.setStyle(whenVideoPlaying);\n }\n\n if (videoPlayState === \"paused\" && whenVideoPaused) {\n this.setStyle(whenVideoPaused);\n }\n\n if (videoPlayState === \"ended\" && whenVideoEnded) {\n this.setStyle(whenVideoEnded);\n }\n if (videoPlayState === \"playing-and-muted\" && whenVideoPlayingAndMuted) {\n this.setStyle(whenVideoPlayingAndMuted);\n }\n\n if (videoPlayState === \"paused-and-muted\" && whenVideoPausedAndMuted) {\n this.setStyle(whenVideoPausedAndMuted);\n }\n\n if (videoPlayState === \"ended-and-muted\" && whenVideoEndedAndMuted) {\n this.setStyle(whenVideoEndedAndMuted);\n }\n }\n\n private normalize() {\n this.el.style.padding = \"0\";\n this.el.style.margin = \"0\";\n this.el.style.position = \"absolute\";\n this.el.style.boxSizing = \"border-box\";\n }\n\n abstract registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void;\n\n protected updateStyles(style: Partial<DStyle>) {\n this.currStyle = Object.assign(this.currStyle, style);\n DStyle.applyStyles(this.el, this.currStyle, this.scale.scale);\n window.getComputedStyle(this.el);\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { DText, DTextDto } from \"./DText\";\nimport { DImg, DImgDto } from \"./DImg\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DButton, DButtonDto } from \"./DButton\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DDivDto extends DElementBaseDto {\n readonly _tag: \"div\";\n readonly children: Array<DTextDto | DImgDto | DButtonDto>;\n}\n\nexport class DDiv extends DElement<HTMLDivElement> {\n private readonly TAG = \"[ DDiv ]: \";\n protected readonly defaultStyle = { x: 22, y: 4 };\n private children: Array<DText | DImg | DButton> = [];\n\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n this.children.forEach((child) => {\n child.registerClickHandler(clickHandler);\n });\n }\n\n constructor(dto: DDivDto, scale: ScaleService, children: Array<DText | DImg | DButton>) {\n const d = document.createElement(\"div\");\n super(d, dto, scale);\n this.children = children;\n\n this.children.forEach((child) => {\n child.appendYourself(this.el);\n });\n }\n protected whenConstructed() {\n this.children.forEach((child) => {\n console.log(child);\n });\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DTimestamp } from \"../common/DTimestamp\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DImgDto extends DElementBaseDto {\n readonly _tag: \"img\";\n // readonly id: string;\n readonly url: string;\n}\n\nexport class DImg extends DElement<HTMLImageElement> {\n private static IMAGE_COUNT = 0;\n private readonly imageCount: number;\n readonly TAG: string;\n readonly TIMING_TAG: string;\n private readonly loadStart: DTimestamp;\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n }\n\n constructor(\n protected readonly dto: DImgDto,\n readonly scaleService: ScaleService,\n ) {\n super(document.createElement(\"img\"), dto, scaleService);\n DImg.IMAGE_COUNT += 1;\n this.imageCount = DImg.IMAGE_COUNT;\n this.TAG = \"[D_IMG \" + DImg.IMAGE_COUNT + \" ]: \";\n this.TIMING_TAG = \"load-time (\" + DImg.IMAGE_COUNT + \") \";\n this.el.loading = \"eager\";\n this.el.style.position = \"absolute\";\n this.setStyle(dto.style);\n\n this.loadStart = DTimestamp.now();\n this.el.onload = () => {};\n this.el.onerror = () => {};\n this.el.src = dto.url;\n console.time(this.TIMING_TAG);\n }\n\n log(): void {}\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DTextDto extends DElementBaseDto {\n readonly _tag: \"p\";\n readonly innerText: string;\n}\n\nexport class DText extends DElement<HTMLParagraphElement> {\n constructor(dto: DTextDto, scale: ScaleService) {\n super(document.createElement(\"p\"), dto, scale);\n }\n\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const onClick = this.dto.onClick;\n if (onClick) {\n clickHandler(onClick);\n }\n };\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DButtonDto extends DElementBaseDto {\n readonly _tag: \"button\";\n}\n\nexport class DButton extends DElement<HTMLButtonElement> {\n private readonly TAG = \"[ DDiv ]: \";\n protected readonly defaultStyle = { x: 40, y: 40 };\n\n constructor(dto: DButtonDto, scale: ScaleService) {\n const d = document.createElement(\"button\");\n super(d, dto, scale);\n }\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n }\n}\n","import { DElement } from \"./DElement\";\nimport { DDiv, DDivDto } from \"./Ddiv\";\nimport { DImg } from \"./DImg\";\nimport { DText } from \"./DText\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DElementDto } from \"./DElement.dto\";\nimport { DButton } from \"./DButton\";\n\nexport const createDElement = (dto: DElementDto, scale: ScaleService): DElement<any> => {\n switch (dto._tag) {\n case \"div\":\n const childEls = createChildrenForDiv(dto, scale);\n return new DDiv(dto, scale, childEls);\n case \"img\":\n return new DImg(dto, scale);\n case \"p\":\n return new DText(dto, scale);\n case \"button\":\n return new DButton(dto, scale);\n default:\n const check: never = dto;\n throw new Error(\"Unknown dto given to the createDElement function.\");\n // TODO LOGGING or create any HTML-ELEMENT??\n }\n};\n\nconst createChildrenForDiv = (dto: DDivDto, scale: ScaleService): DDiv[\"children\"] => {\n const childDto = dto.children;\n const childEls: Array<DImg | DText | DButton> = [];\n childDto.forEach((dto) => {\n switch (dto._tag) {\n case \"p\":\n const newText = new DText(dto, scale);\n childEls.push(newText);\n break;\n case \"img\":\n const newImage = new DImg(dto, scale);\n childEls.push(newImage);\n break;\n case \"button\":\n const newButton = new DButton(dto, scale);\n childEls.push(newButton);\n break;\n default:\n const check: never = dto;\n }\n });\n return childEls;\n};\n","import { PlayAudioTask, PlayVideoTask } from \"../page/task\";\nimport { Fact } from \"../rules/fact\";\n\nexport type ButtonClickAction =\n | { kind: \"play-audio\"; task: PlayAudioTask; vibrateMs?: number }\n | { kind: \"pause-audio\"; vibrateMs?: number }\n | { kind: \"play-video\"; task: PlayVideoTask; vibrateMs?: number }\n | { kind: \"mute-video\"; vibrateMs?: number }\n | { kind: \"un-mute-video\"; vibrateMs?: number }\n | { kind: \"pause-video\"; vibrateMs?: number }\n | { kind: \"submit-fact\"; fact: Fact; vibrateMs?: number }\n | { kind: \"next-page\"; vibrateMs?: number }\n | { kind: \"submit-form\"; vibrateMs?: number };\n\n// export type ButtonClickAction = _ButtonClickAction & ;\nexport const ButtonClickAction = {\n describe: (a: ButtonClickAction): string => {\n switch (a.kind) {\n case \"next-page\":\n return \"go to next page\";\n case \"play-video\":\n return \"VideoId = \" + a.task.videoId;\n case \"play-audio\":\n return \"AudioId = \" + a.task.audioId;\n case \"pause-video\":\n return \"\";\n case \"pause-audio\":\n return \"\";\n case \"submit-fact\":\n return a.fact.label + \" = \" + a.fact.value;\n case \"submit-form\":\n return \"\";\n case \"mute-video\":\n return \"mute-video\";\n case \"un-mute-video\":\n return \"un-mute-video\";\n default:\n const _exhaustiveCheck: never = a;\n return \"\";\n }\n },\n};\n","import { DTimestamp } from \"../common/DTimestamp\";\r\n\r\ninterface _MqEvent<K extends string, P extends object> {\r\n readonly kind: K;\r\n readonly timestamp: DTimestamp;\r\n readonly payload: P;\r\n}\r\n\r\nexport type MqEventEngineStart = _MqEvent<\r\n \"engine-start\",\r\n {\r\n readonly schemaId: string;\r\n readonly schemaPrefix: string;\r\n }\r\n>;\r\nexport interface MqEventPageEnter\r\n extends _MqEvent<\"page-enter\", { readonly pageId: string; readonly pagePrefix: string }> {}\r\nexport interface MqEventPageLeave\r\n extends _MqEvent<\"page-leave\", { readonly pageId: string; readonly pagePrefix: string }> {}\r\n\r\nexport type MqEventUserClicked = _MqEvent<\r\n \"user-clicked\",\r\n { readonly pageId: string; pagePrefix: string; action: string; descriptions: string }\r\n>;\r\n\r\nexport type MqEvent = MqEventPageEnter | MqEventPageLeave | MqEventEngineStart | MqEventUserClicked;\r\n\r\nexport const MqEvent = {\r\n engineStart(schemaId: string, schemaPrefix: string): MqEventEngineStart {\r\n return {\r\n kind: \"engine-start\",\r\n timestamp: DTimestamp.now(),\r\n payload: { schemaId, schemaPrefix },\r\n };\r\n },\r\n pageEnter(pageId: string, pagePrefix: string): MqEventPageEnter {\r\n return {\r\n kind: \"page-enter\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix },\r\n };\r\n },\r\n pageLeave(pageId: string, pagePrefix: string): MqEventPageLeave {\r\n return {\r\n kind: \"page-leave\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix },\r\n };\r\n },\r\n userClicked(data: {\r\n pageId: string;\r\n pagePrefix: string;\r\n action: string;\r\n descriptions: string;\r\n }): MqEventUserClicked {\r\n const { pageId, pagePrefix, action, descriptions } = data;\r\n return {\r\n kind: \"user-clicked\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix, action, descriptions },\r\n };\r\n },\r\n} as const;\r\n","import { DElement } from \"../Delement/DElement\";\nimport { TaskManager } from \"./task-manager\";\nimport { createDElement } from \"../Delement/element-factory\";\nimport { ScaleService } from \"../engine/scale\";\nimport { Task } from \"./task\";\nimport { PStyle } from \"../Delement/DStyle\";\nimport { ButtonClickAction } from \"../Delement/button-click-action\";\nimport { DElementDto } from \"../Delement/DElement.dto\";\nimport { Fact } from \"../rules/fact\";\nimport { DTimestamp } from \"../common/DTimestamp\";\nimport { PageResult } from \"./page-result\";\nimport { TaskState } from \"./task-state\";\nimport { MqEvent } from \"../events/mq-events\";\n\nexport interface VideoPlayerDto {\n playUrl: string;\n style?: PStyle;\n}\n\nexport interface PageDto {\n readonly id: string;\n readonly prefix: string;\n readonly tags: string[];\n background: string;\n elements: Array<DElementDto>;\n videoPlayer?: VideoPlayerDto;\n initialTasks: Array<Task>;\n}\n\nexport const PageDto = {\n createDummy: (id: number): PageDto => {\n return {\n id: \"id\" + id,\n prefix: \"prefix\" + id,\n tags: [],\n background: \"white\",\n elements: [\n {\n _tag: \"div\",\n style: { x: 10, y: 0, w: 40, h: 20, backgroundColor: \"red\" },\n children: [],\n innerText: \"Next btn \" + id,\n },\n ],\n\n initialTasks: [],\n };\n },\n};\n\nexport class Page {\n private readonly TAG = \"[ DPage ]: \";\n private elements: DElement<HTMLElement>[] = [];\n // private elements: PageComponent[] = [];\n // private layoutComponents: PageLayoutComponent[] = [];\n private pageEntered: DTimestamp = DTimestamp.now();\n private previousState: TaskState | false = false;\n private eventLog = new Array<MqEvent>();\n\n constructor(\n private readonly dto: PageDto,\n private readonly taskManager: TaskManager,\n private readonly scaleService: ScaleService,\n private readonly onCompleted: (result: PageResult) => void,\n ) {\n dto.elements.forEach((el) => {\n const element = createDElement(el, scaleService);\n // if (element instanceof DDiv) {\n // }\n element.registerClickHandler((action) => {\n this.handleButtonAction(action);\n });\n\n this.elements.push(element);\n\n // if(element.)\n // element= (action) => {\n // console.log(\"TODO ONCLICK \");\n // this.handleButtonAction(action);\n // };\n // this.elements.push(element);\n });\n\n if (dto.videoPlayer) {\n this.taskManager.loadVideo(dto.videoPlayer.playUrl);\n if (dto.videoPlayer.style) {\n this.taskManager.setVideoStyles(dto.videoPlayer.style);\n }\n }\n\n if (dto.initialTasks.length) {\n this.taskManager.autoPlaySequence(dto.initialTasks);\n }\n }\n\n private createPageResult(facts: Fact[]): PageResult {\n const pageExited = DTimestamp.now();\n const pageTime = DTimestamp.diff(this.pageEntered, pageExited);\n const pageExit = MqEvent.pageLeave(this.dto.id, this.dto.prefix);\n this.eventLog.push(pageExit);\n const eventLog = [...this.eventLog];\n return {\n pagePrefix: this.dto.prefix,\n pageId: this.dto.id,\n eventLog,\n pageTime,\n collectedFacts: facts,\n };\n }\n private handleButtonAction(a: ButtonClickAction) {\n const event = MqEvent.userClicked({\n pageId: this.dto.id,\n pagePrefix: this.dto.prefix,\n action: a.kind,\n descriptions: ButtonClickAction.describe(a),\n });\n this.eventLog.push(event);\n navigator.vibrate(200);\n const { vibrateMs } = a;\n if (vibrateMs) {\n navigator.vibrate(vibrateMs);\n }\n\n switch (a.kind) {\n case \"next-page\":\n const nextPageResult = this.createPageResult([]);\n this.onCompleted(nextPageResult);\n break;\n case \"play-video\":\n this.taskManager.execute(a.task);\n break;\n case \"play-audio\":\n this.taskManager.execute(a.task);\n break;\n case \"pause-video\":\n this.taskManager.pauseVideo();\n break;\n case \"pause-audio\":\n this.taskManager.pauseAudio();\n break;\n case \"mute-video\":\n this.taskManager.muteVideo();\n break;\n case \"un-mute-video\":\n this.taskManager.unMuteVideo();\n break;\n case \"submit-fact\":\n const submitFactResult = this.createPageResult([a.fact]);\n this.onCompleted(submitFactResult);\n break;\n case \"submit-form\":\n // TODO IMPLEMENT Collection of form-data // LOOP OVER ALL INPUTS\n const submitFormResult = this.createPageResult([]);\n this.onCompleted(submitFormResult);\n break;\n default:\n const _exhaustiveCheck: never = a;\n console.log(_exhaustiveCheck);\n }\n }\n\n appendYourself(parent: HTMLElement) {\n const pageEnterEvent = MqEvent.pageEnter(this.dto.id, this.dto.prefix);\n this.pageEntered = DTimestamp.now();\n this.eventLog.push(pageEnterEvent);\n this.elements.forEach((el) => {\n el.appendYourself(parent);\n });\n\n // this.components.forEach((comp) => {\n // comp.appendToParent(parent);\n // });\n // this.layoutComponents.forEach((comp) => {\n // comp.appendToParent(parent);\n // });\n }\n\n destroy() {\n this.taskManager.clear();\n }\n\n tick() {\n const prev = this.previousState;\n const curr = this.taskManager.getState();\n const diff = TaskState.getDiff(curr, prev);\n this.elements.forEach((element) => {\n element.updateState(diff);\n });\n }\n}\n","type BaseTask = {\r\n readonly blockAudio: boolean;\r\n readonly blockVideo: boolean;\r\n readonly blockResponseButton: boolean;\r\n readonly blockFormInput: boolean;\r\n readonly priority:\r\n | \"run-if-idle\"\r\n | \"follow-queue\"\r\n | \"replace-all\"\r\n | \"replace-current\"\r\n | \"replace-queue\"\r\n | \"prepend-to-queue\"\r\n | \"append-to-queue\";\r\n};\r\nexport type DelayTask = BaseTask & {\r\n readonly kind: \"delay-task\";\r\n readonly duration: number;\r\n};\r\n\r\nexport type PlayAudioTask = BaseTask & {\r\n readonly kind: \"play-audio-task\";\r\n readonly url: string;\r\n readonly audioId: string;\r\n};\r\n\r\nexport type PlayVideoTask = BaseTask & {\r\n readonly kind: \"play-video-task\";\r\n readonly url: string;\r\n readonly videoId: string;\r\n readonly loop?: boolean;\r\n readonly startAt?: number;\r\n readonly stopAt?: \"end\" | \"start\" | number;\r\n readonly volume?: number;\r\n};\r\nconst eq = (a: Task, b: Task) => {\r\n if (!b) {\r\n return false;\r\n }\r\n if (a.kind !== b.kind) {\r\n return false;\r\n }\r\n if (a.kind === \"delay-task\" && b.kind === \"delay-task\") {\r\n return a.duration === b.duration;\r\n }\r\n\r\n if (a.kind === \"play-audio-task\" && b.kind === \"play-audio-task\") {\r\n return a.url === b.url && a.audioId === b.audioId;\r\n }\r\n if (a.kind === \"play-video-task\" && b.kind === \"play-video-task\") {\r\n return (\r\n a.url === b.url &&\r\n a.videoId === b.videoId &&\r\n a.startAt === b.startAt &&\r\n a.stopAt === b.stopAt &&\r\n a.volume === b.volume\r\n );\r\n }\r\n return false;\r\n};\r\nconst deleteTaskList = (task: Task) => {\r\n return task.priority === \"replace-all\" || task.priority === \"replace-queue\";\r\n};\r\n\r\nconst shallRemoveCurrent = (task: Task) => {\r\n return task.priority === \"replace-current\" || task.priority === \"replace-all\";\r\n};\r\n\r\nconst notEq = (a: Task, b: Task) => !eq(a, b);\r\n\r\nconst is = (task: Task | undefined | false | null | {}): task is Task => {\r\n if (!task) {\r\n return false;\r\n }\r\n if (typeof task !== \"object\") {\r\n return false;\r\n }\r\n if (Array.isArray(task)) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const Task = {\r\n eq,\r\n is,\r\n notEq,\r\n deleteTaskList,\r\n shallRemoveCurrent,\r\n};\r\nexport type Task = PlayVideoTask | PlayAudioTask | DelayTask;\r\n","import { DTimestamp } from \"../common/DTimestamp\";\nimport { Task } from \"./task\";\nimport { DStyle, PStyle } from \"../Delement/DStyle\";\nimport { ScaleService } from \"../engine/scale\";\nimport { TaskState } from \"./task-state\";\n\nexport class TaskManager {\n private readonly TAG = \"[TaskManager]: \";\n private readonly videoElement = document.createElement(\"video\");\n private readonly audioElement = document.createElement(\"audio\");\n private readonly showConsoleLogs = false;\n private readonly defaultVideoStyles: PStyle = {\n height: 50,\n width: 100,\n top: 0,\n left: 0,\n };\n private videoStyles: PStyle;\n private runningTask: { task: Task; startedAt: DTimestamp } | false = false;\n private taskList: Array<Task> = [];\n private delayRef: number | false = false;\n\n clear() {\n if (this.showConsoleLogs) console.log(this.TAG + \"CLEAR\");\n if (typeof this.delayRef === \"number\") {\n window.clearTimeout(this.delayRef);\n }\n\n this.pauseVideo();\n this.pauseAudio();\n this.videoElement.removeAttribute(\"src\");\n this.videoElement.load();\n this.audioElement.removeAttribute(\"src\");\n this.audioElement.load();\n this.taskList = [];\n this.runningTask = false;\n this.hideVideo();\n }\n\n getState(): TaskState {\n const c = this.runningTask;\n const isGifMode = this.videoElement.loop;\n const audioIsPlaying = c && c.task.kind === \"play-audio-task\" && !this.audioElement.paused;\n const videoIsPlaying = c && c.task.kind === \"play-video-task\" && !this.videoElement.paused;\n const blockResponseButton = c && c.task.blockResponseButton;\n const blockAudio = c && c.task.blockAudio;\n const blockVideo = c && c.task.blockVideo;\n const blockFormInput = c && c.task.blockFormInput;\n const videoIsMuted = this.videoElement.muted;\n\n const videoIsAtTheEnd = this.videoElement.ended;\n let videoPlayState: TaskState[\"videoPlayState\"] = videoIsMuted ? \"paused-and-muted\" : \"paused\";\n\n if (videoIsPlaying) {\n videoPlayState = videoIsMuted ? \"playing-and-muted\" : \"playing\";\n }\n if (videoIsAtTheEnd) {\n videoPlayState = videoIsMuted ? \"ended-and-muted\" : \"ended\";\n }\n\n return {\n audioIsPlaying,\n videoPlayState,\n isGifMode,\n blockFormInput,\n blockResponseButton,\n blockAudio,\n blockVideo,\n };\n }\n\n constructor(\n private readonly mediaLayer: HTMLDivElement,\n private readonly scale: ScaleService,\n private readonly onError: (error: string) => void,\n ) {\n this.hideVideo();\n this.mediaLayer.appendChild(this.videoElement);\n this.mediaLayer.appendChild(this.audioElement);\n this.videoStyles = this.defaultVideoStyles;\n DStyle.normalize(this.videoElement);\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\n\n this.videoElement.onended = () => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n };\n this.videoElement.onerror = (e) => {\n if (this.videoElement.src !== \"\") {\n onError(\"Error playing video: \" + this.videoElement.src);\n }\n };\n\n this.audioElement.onended = () => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n };\n }\n\n execute(task: Task): boolean {\n // console.log(\"EXECUTE TASK\" + task.kind);\n const curr = this.runningTask;\n // TODO Background-task should be handeled as its own kind or something.\n let isBackgroundTask = false;\n\n // Check if we should remove the current task.\n if (curr && Task.shallRemoveCurrent(task) && Task.notEq(curr.task, task)) {\n this.pauseAudio();\n this.pauseVideo();\n this.runningTask = false;\n }\n\n if (!curr) {\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\n } else if (Task.notEq(curr.task, task)) {\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\n }\n\n if (task.priority === \"replace-all\" || task.priority === \"replace-queue\") {\n this.taskList = [];\n }\n\n // STARTING PLAY VIDEO\n if (task.kind === \"play-video-task\") {\n this.showVideo();\n // this.pauseAudio()\n this.loadVideo(task.url);\n if (task.loop) {\n this.videoElement.loop = true;\n isBackgroundTask = true;\n } else {\n this.videoElement.loop = false;\n }\n\n try {\n this.videoElement.play();\n } catch (e) {\n console.error(e);\n }\n }\n\n // STARTING PLAY AUDIO\n if (task.kind === \"play-audio-task\") {\n if (!this.videoElement.loop) {\n this.pauseVideo();\n }\n if (task.url !== this.audioElement.src) {\n this.audioElement.src = task.url;\n }\n this.audioElement.play();\n }\n\n if (task.kind === \"delay-task\") {\n if (typeof this.delayRef === \"number\") {\n window.clearTimeout(this.delayRef);\n }\n this.delayRef = window.setTimeout(() => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n }, task.duration);\n }\n\n if (isBackgroundTask) {\n const startNextTask = this.getNextTask();\n if (startNextTask) {\n this.execute(startNextTask);\n }\n }\n\n return true;\n }\n\n setVideoStyles(styles: PStyle) {\n this.videoStyles = { ...styles };\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\n }\n\n autoPlaySequence(tasks: Task[]) {\n this.taskList = [...tasks];\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n if (next.kind === \"play-video-task\" && next.loop) {\n this.videoElement.loop = true;\n }\n }\n }\n\n loadVideo(url: string) {\n // console.log(\"LOAD VIDEO \" + !!url + \" \");\n if (this.videoElement.src !== url) {\n this.videoElement.src = url;\n }\n this.showVideo();\n }\n\n private playVideoElement() {\n this.videoElement\n .play()\n .then(() => {})\n .catch((e) => {\n console.log(e);\n this.onError(\"Error playing video.\");\n });\n }\n\n private showVideo() {\n this.videoElement.style.display = \"block\";\n }\n\n private hideVideo() {\n this.videoElement.style.display = \"none\";\n }\n\n pauseVideo() {\n try {\n if (!this.videoElement.loop) {\n this.videoElement.pause();\n }\n } catch (e) {\n console.log(e);\n this.onError(\"Error pausing video.\");\n }\n }\n\n pauseAudio() {\n try {\n if (!this.audioElement.loop) {\n this.audioElement.pause();\n }\n } catch (e) {\n console.log(e);\n this.onError(\"Error pausing audio.\");\n }\n }\n\n private getNextTask(): Task | false {\n // console.log(\"Getting next task.\");\n // console.log(this.taskList);\n const first = this.taskList.shift();\n return first ?? false;\n }\n\n muteVideo() {\n this.videoElement.muted = true;\n }\n\n unMuteVideo() {\n this.videoElement.muted = false;\n }\n}\n","import { SchemaDto } from \"./SchemaDto\";\nimport { DPlayer } from \"./dplayer\";\nimport { ScaleService } from \"./scale\";\nimport { Page } from \"../page/Page\";\nimport { TaskManager } from \"../page/task-manager\";\nimport { PageResult } from \"../page/page-result\";\nimport { SchemaResult } from \"./SchemaResult\";\nexport interface EngineLogger {\n info(message: string): void;\n error(message: string): void;\n warn(message: string): void;\n}\n\nconst voidLogger: EngineLogger = {\n info: (message: string) => {},\n error: (message: string) => {},\n warn: (message: string) => {},\n};\n\nexport interface ISchemaEngine {\n onProgress(handler: (result: SchemaResult) => void): void;\n onFatalError(handler: (error: { message: string }) => void): void;\n setLogger(logger: EngineLogger): void;\n}\n\nexport class SchemaEngine implements ISchemaEngine {\n private readonly TAG = \"[ SCHEMA_ENGINE ] :\";\n private readonly scale: ScaleService;\n private readonly hostElement: HTMLDivElement;\n private readonly taskManager: TaskManager;\n private logger: EngineLogger = voidLogger;\n private readonly uiLayer: HTMLDivElement = document.createElement(\"div\");\n private readonly mediaLayer: HTMLDivElement = document.createElement(\"div\");\n private player: DPlayer;\n private currentPage: Page | false = false;\n private readonly tickerRef: number | false = false;\n constructor(\n hostEl: HTMLDivElement,\n private readonly height: number,\n private readonly width: number,\n private readonly schema: SchemaDto,\n ) {\n this.tickerRef = window.setInterval(() => {\n if (this.currentPage) {\n this.currentPage.tick();\n }\n }, 100);\n this.hostElement = hostEl;\n this.hostElement.appendChild(this.mediaLayer);\n this.hostElement.appendChild(this.uiLayer);\n this.scale = new ScaleService({\n baseHeight: schema.baseHeight,\n baseWidth: schema.baseWidth,\n containerWidth: this.width,\n containerHeight: this.height,\n });\n this.logger.info(this.TAG + \"Scale: \" + JSON.stringify(this.scale));\n this.player = new DPlayer(this.schema);\n this.taskManager = new TaskManager(this.mediaLayer, this.scale, (error) => {\n console.log(error);\n });\n\n this.styleSelf();\n this.handlePageCompleted = this.handlePageCompleted.bind(this);\n this.nextPage();\n }\n\n private handlePageCompleted(result: PageResult) {\n // 1 Save data from last page\n this.player.saveHistory(result);\n\n // 2 Emit progress\n const currentResults = this.player.getResults();\n const a: SchemaResult = {\n schemaId: this.schema.id,\n pagesLeft: currentResults.pagesLeft,\n predefinedFacts: currentResults.predefinedFacts,\n eventLog: currentResults.eventLog,\n answers: currentResults.answerFacts,\n };\n if (this._onProgress) {\n this._onProgress(a);\n }\n\n // 3. Next page\n this.nextPage();\n }\n\n private styleSelf() {\n this.hostElement.style.height = this.scale.pageHeight + \"px\";\n this.hostElement.style.width = this.scale.pageWidth + \"px\";\n this.hostElement.style.backgroundColor = this.schema.backgroundColor ?? \"white\";\n this.hostElement.style.position = \"relative\";\n // this.hostElement.style.overflow = \"hidden\";\n const makeStatic = (div: HTMLDivElement) => {\n div.style.height = \"0px\";\n div.style.width = \"0px\";\n div.style.position = \"static\";\n };\n\n makeStatic(this.uiLayer);\n this.uiLayer.style.zIndex = \"10\";\n this.mediaLayer.style.zIndex = \"8\";\n makeStatic(this.mediaLayer);\n }\n\n private nextPage() {\n const nextPage = this.player.getNextPage();\n if (this.currentPage) {\n this.currentPage.destroy();\n this.uiLayer.innerHTML = \"\";\n }\n\n // console.log(nextPage);\n if (nextPage && nextPage.videoPlayer && nextPage.videoPlayer.style) {\n this.taskManager.setVideoStyles(nextPage.videoPlayer.style);\n }\n\n if (!nextPage) {\n // TODO FIGURE OUT WHAQT TO DO AT END OF TEST!! Start over??\n this.player = new DPlayer(this.schema);\n if (this.player.pagesLeft > 0) {\n this.nextPage();\n }\n return false;\n }\n\n const newPage = new Page(nextPage, this.taskManager, this.scale, (result) => {\n this.handlePageCompleted(result);\n });\n this.currentPage = newPage;\n newPage.appendYourself(this.uiLayer);\n return true;\n }\n\n destroy() {\n if (this.currentPage) {\n this.currentPage.destroy();\n this.uiLayer.innerHTML = \"\";\n }\n }\n\n private _onProgress: ((result: SchemaResult) => void) | false = false;\n onProgress(handler: (result: SchemaResult) => void) {\n this._onProgress = handler;\n }\n\n private _onFatalError: ((error: { message: string }) => void) | false = false;\n onFatalError(handler: (error: { message: string }) => void): void {\n this._onFatalError = handler;\n }\n setLogger(logger: EngineLogger) {\n this.logger = logger;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGO,IAAM,aAAN,MAAiB;AAAA,EACd,UAAwB,CAAC;AAAA,EAEjC,WAAwB;AACtB,UAAM,UAAU,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC;AAGhE,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,QAAoB;AAC/B,SAAK,QAAQ,KAAK,MAAM;AAAA,EAC1B;AACF;;;ACfO,IAAU;AAAA,CAAV,CAAUA,WAAV;AACE,EAAMA,OAAA,eAAe,CAAC,WAA2B;AACtD,UAAM,UAAU;AAChB,UAAM,YAAY,QAAQ,YAAY;AACtC,UAAM,MAAM,UAAU;AACtB,UAAM,MAAM,KAAK,IAAI,MAAM;AAC3B,QAAI,SAAS;AAEb,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,YAAM,OAAO,IAAI,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,IAAI,MAAM,CAAC;AAC9D,gBAAU;AAAA,IACZ;AACA,WAAO;AAAA,EACT;AAEO,EAAMA,OAAA,iBAAiB,UAAMA,OAAA,cAAa,EAAE;AAE5C,EAAMA,OAAA,aAAa,CAA6B,KAAU,QAA6B;AAC5F,WAAO,IAAI,GAAG;AACd,WAAO;AAAA,EACT;AAEO,EAAMA,OAAA,YAAY,CAAC,KAAa,QAAgB;AACrD,WAAO,CAAC,UAAkB,SAAS,OAAO,SAAS;AAAA,EACrD;AACO,EAAMA,OAAA,aAAa,CAAC,WAAmB;AAC5C,WACE,WAAW,OAAO,qBAClB,WAAW,OAAO,qBAClB,WAAW;AAAA,EAEf;AAEO,EAAMA,OAAA,kBAAkB,CAAI,UAA+C;AAChF,WAAO,MAAM,SAAS;AAAA,EACxB;AAEO,EAAMA,OAAA,aAAa,CAAC,SAAgB;AACzC,YAAQ,IAAI,oDAAoD,IAAI;AAAA,EACtE;AAEO,EAAMA,OAAA,WAAW,CAAC,QAAgC,OAAO,QAAQ;AAEjE,EAAMA,OAAA,SAAS,CACpB,KACA,QACuC;AACvC,QAAI,KAACA,OAAA,UAAS,GAAG,GAAG;AAClB,aAAO;AAAA,IACT;AACA,WAAO,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG;AAAA,EACtD;AAEO,EAAMA,OAAA,WAAW,CAAC,QAAiD;AACxE,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,QAAQ,UAAU;AAC3B,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,MAAM;AAChB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEO,EAAMA,OAAA,SAAS,CAAC,QAAkC,OAAO,QAAQ;AAEjE,EAAMA,OAAA,SAAS,CAAC,SAAiC,SAAS;AAE1D,EAAMA,OAAA,UAAU,CAAC,SAAkC,SAAS;AAE5D,EAAMA,OAAA,YAAY,CAAC,QAA0B;AAClD,UAAM,UAAU,QAAQ;AACxB,UAAM,eAAe,QAAQ;AAC7B,WAAO,WAAW;AAAA,EACpB;AAEO,EAAMA,OAAA,UAAU,CAAC,QAAmD;AACzE,QAAI,KAACA,OAAA,QAAO,KAAK,MAAM,GAAG;AACxB,aAAO;AAAA,IACT;AACA,QAAI,OAAO,IAAI,SAAS,UAAU;AAChC,aAAO;AAAA,IACT;AACA,WAAO,IAAI,KAAK,SAAS;AAAA,EAC3B;AAEO,EAAMA,OAAA,WAAW,CAAC,QAA4C;AACnE,eAAOA,OAAA,QAAO,KAAK,OAAO;AAAA,EAC5B;AACO,EAAMA,OAAA,WAAW,CAAC,UAAoC;AAC3D,UAAMC,YAAW,OAAO,UAAU;AAClC,UAAM,SAAS,CAAC,OAAO,MAAM,KAAK;AAClC,WAAOA,aAAY;AAAA,EACrB;AAEO,EAAMD,OAAA,QAAQ,CAAC,eAAuB;AAC3C,WAAO,CAAC,UAAkB;AACxB,aAAO,KAAK,IAAI,OAAO,UAAU;AAAA,IACnC;AAAA,EACF;AAEO,EAAMA,OAAA,QAAQ,CAAC,eAAuB;AAC3C,WAAO,CAAC,UAAkB;AACxB,aAAO,KAAK,IAAI,OAAO,UAAU;AAAA,IACnC;AAAA,EACF;AAAA,GAjHe;;;ACGV,IAAU;AAAA,CAAV,CAAUE,eAAV;AA0CI,EAAMA,WAAA,WAAW,CAAC,WAAsB,UAA+B;AAC1E,QAAI,SAAkB;AACtB,YAAQ,UAAU,MAAM;AAAA,MACpB,KAAK;AACD,iBAAS,eAAe,WAAW,KAAK;AACxC;AAAA,MACJ,KAAK;AACD,iBAAS,eAAe,WAAW,KAAK;AACxC;AAAA,MACJ,KAAK;AACD,iBAAS,gBAAgB,WAAW,KAAK;AACzC;AAAA,MACJ;AACI,cAAM,QAAe;AAAA,IAC7B;AACA,WAAO;AAAA,EACX;AAEA,QAAM,kBAAkB,CAAC,WAA8B,UAAwC;AAC3F,QAAI,UAAU,KAAK,WAAW,KAAK,UAAU,IAAI,WAAW,GAAG;AAC3D,aAAO;AAAA,IACX;AACA,UAAM,YAAY,UAAU,IAAI,IAAI,CAACC,eAAc;AAC/C,aAAO,eAAeA,YAAW,KAAK;AAAA,IAC1C,CAAC;AAED,UAAM,gBAAgB,UAAU,KAAK,IAAI,CAACA,eAAc;AACpD,aAAO,eAAeA,YAAW,KAAK;AAAA,IAC1C,CAAC;AACD,UAAM,YAAY,UAAU,MAAM,MAAM,MAAM;AAC9C,UAAM,aAAa,cAAc,WAAW,KAAK,cAAc,KAAK,MAAM,MAAM;AAChF,WAAO,cAAc;AAAA,EACzB;AAEA,QAAM,iBAAiB,CAAC,WAA6B,UAAwC;AACzF,UAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,gBAAgB,UAAU,WAAW;AACtE,QAAI,CAAC,MAAM;AACP,aAAO;AAAA,IACX;AACA,QAAI,MAAM;AACV,YAAQ,UAAU,MAAM;AAAA,MACpB,KAAK;AACD,YAAI,KAAK,SAAS,gBAAgB;AAC9B,gBAAM,gBAAgB,WAAW,KAAK,KAAK;AAAA,QAC/C;AACA;AAAA,MACJ,KAAK;AACD,YAAI,KAAK,SAAS,eAAe;AAC7B,gBAAM,eAAe,WAAW,KAAK,KAAK;AAAA,QAC9C;AACA;AAAA,MACJ;AACI,cAAM,QAAe;AAAA,IAC7B;AACA,WAAO;AAAA,EACX;AAEO,EAAMD,WAAA,UAAU,CAAC,YAAqB;AACzC,WAAO,QAAQ,IAAI,WAAW,KAAK,QAAQ,KAAK,WAAW;AAAA,EAC/D;AAEA,QAAM,iBAAiB,CAAC,WAAuC,UAA2B;AACtF,UAAM,WAAW,UAAU;AAC3B,QAAI,SAAS;AACb,YAAQ,UAAU;AAAA,MACd,KAAK;AACD,iBAAS,UAAU,UAAU;AAC7B;AAAA,MACJ,KAAK;AACD,iBAAS,UAAU,UAAU;AAC7B;AAAA,MACJ,KAAK;AACD,iBAAS,UAAU,UAAU;AAC7B;AAAA,MACJ,KAAK;AACD,iBAAS,UAAU,UAAU;AAC7B;AAAA,MACJ;AACI,cAAM,QAAe;AAAA,IAC7B;AACA,WAAO;AAAA,EACX;AAEA,QAAM,kBAAkB,CAAC,WAAoB,UAA2B;AACpE,UAAM,KAAK,UAAU;AACrB,UAAM,iBAAiB,UAAU;AACjC,QAAI,SAAS;AACb,YAAQ,IAAI;AAAA,MACR,KAAK;AACD,iBAAS,UAAU;AACnB;AAAA,MACJ,KAAK;AACD,iBAAS,UAAU;AACnB;AAAA,MACJ,KAAK;AACD,iBAAS,QAAQ;AACjB;AAAA,MACJ,KAAK;AACD,iBAAS,SAAS;AAClB;AAAA,MACJ,KAAK;AACD,iBAAS,QAAQ;AACjB;AAAA,MACJ,KAAK;AACD,iBAAS,SAAS;AAClB;AAAA,MACJ;AACI,cAAM,QAAe;AAAA,IAC7B;AACA,WAAO;AAAA,EACX;AAEA,QAAM,gBAAgB,CAAC,cAA0D;AAC7E,UAAM,SAAkC,CAAC;AACzC,YAAQ,UAAU,MAAM;AAAA,MACpB,KAAK;AACD,eAAO,KAAK,GAAG,UAAU,GAAG;AAC5B,eAAO,KAAK,GAAG,UAAU,IAAI;AAC7B;AAAA,MACJ,KAAK;AACD,eAAO,KAAK,SAAS;AACrB;AAAA,MACJ,KAAK;AACD,eAAO,KAAK,SAAS;AACrB;AAAA,MACJ;AACI,cAAM,WAAW,SAAS;AAAA,IAClC;AACA,WAAO;AAAA,EACX;AAEO,EAAMA,WAAA,yBAAyB,CAClC,cACkC;AAClC,UAAM,SAAkC,CAAC;AACzC,QAAI,MAAM,QAAQ,SAAS,GAAG;AAC1B,gBAAU,QAAQ,CAAC,MAAM;AACrB,eAAO,KAAK,GAAG,cAAc,CAAC,CAAC;AAAA,MACnC,CAAC;AAAA,IACL,OAAO;AACH,aAAO,KAAK,GAAG,cAAc,SAAS,CAAC;AAAA,IAC3C;AACA,WAAO;AAAA,EACX;AAAA,GAzLa;;;ACSV,IAAU;AAAA,CAAV,CAAUE,UAAV;AAME,EAAMA,MAAA,UAAU,CAAC,SAAkC;AACxD,UAAM,kBAAkB,KAAK,IAAI,WAAW,KAAK,KAAK,KAAK,WAAW;AACtE,UAAM,eAAe,KAAK,UAAU,WAAW,KAAK,KAAK,UAAU,WAAW;AAC9E,WAAO,mBAAmB;AAAA,EAC5B;AAEO,EAAMA,MAAA,QAAQ,CAAC,MAAsB,UAAwC;AAClF,QAAI,KAAK,KAAK,WAAW,KAAK,KAAK,IAAI,WAAW,GAAG;AAEnD,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,KAAK,KAAK,IAAI,CAAC,cAAc,UAAU,SAAS,WAAW,KAAK,CAAC;AAEpF,UAAM,aAAa,WAAW,WAAW,KAAK,WAAW,KAAK,MAAM,MAAM;AAE1E,UAAM,YAAY,KAAK,IAAI,IAAI,CAAC,cAAc,UAAU,SAAS,WAAW,KAAK,CAAC,EAAE,MAAM,MAAM,MAAM;AAEtG,WAAO,aAAa;AAAA,EACtB;AAAA,GAzBe;;;ACMV,IAAM,aAAN,MAAuB;AAAA,EAC5B,cAAc;AAAA,EAAC;AAAA,EAEf,SAAS,OAAqB,OAAkC;AAC9D,UAAM,SAA4B,CAAC;AACnC,UAAM,WAA0B,CAAC;AACjC,UAAM,QAAQ,CAAC,SAAS;AACtB,UAAI,KAAK,QAAQ,IAAI,GAAG;AACtB,eAAO,KAAK,EAAE,SAAS,iBAAiB,KAAK,GAAG,CAAC;AAAA,MACnD,WAAW,KAAK,MAAM,MAAM,KAAK,GAAG;AAClC,cAAM,QAAqB;AAAA,UACzB,iBAAiB,KAAK;AAAA,UACtB,gBAAgB,KAAK,MAAM;AAAA,UAC3B,YAAY,CAAC,GAAG,KAAK,SAAS;AAAA,QAChC;AACA,iBAAS,KAAK,KAAK;AAAA,MACrB;AAAA,IACF,CAAC;AACD,WAAO,EAAE,UAAU,OAAO;AAAA,EAC5B;AAAA,EAEA,MAAM,MAAkB,OAAwB;AAE9C,WAAO,KAAK,MAAM,MAAM,KAAK;AAAA,EAC/B;AACF;;;AC1CO,IAAM,UAAN,MAAc;AAAA,EACX,gBAAuC,CAAC;AAAA,EACxC,WAAsB,CAAC;AAAA,EACvB,eAAe,oBAAI,IAAY;AAAA,EAC/B,mBAAmB,oBAAI,IAAY;AAAA,EACnC,YAAuB,CAAC;AAAA,EAChC,YAAY,QAAmB,CAAC,GAAG;AACjC,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAkB;AACzB,SAAK,WAAW,CAAC,GAAG,KAAK;AACzB,SAAK,YAAY,CAAC,GAAG,KAAK;AAC1B,SAAK,eAAe,oBAAI,IAAI;AAC5B,SAAK,mBAAmB,oBAAI,IAAI;AAChC,SAAK,gBAAgB,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,EACpD;AAAA,EAEA,MAAuB;AACrB,UAAM,OAAO,KAAK,UAAU,MAAM;AAElC,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEA,OAAwB;AACtB,UAAM,OAAO,KAAK,UAAU,CAAC;AAC7B,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEA,eAAe,QAAyB;AACtC,UAAM,QAAQ,KAAK,UAAU,UAAU,CAAC,MAAM,EAAE,OAAO,MAAM;AAC7D,QAAI,QAAQ,GAAG;AACb,aAAO;AAAA,IACT;AACA,SAAK,YAAY,KAAK,UAAU,MAAM,KAAK;AAC3C,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,KAAwB;AAClC,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,UAAI,QAAQ,CAACC,SAAQ;AACnB,aAAK,aAAa,IAAIA,IAAG;AAAA,MAC3B,CAAC;AAAA,IACH,OAAO;AACL,WAAK,aAAa,IAAI,GAAG;AAAA,IAC3B;AACA,SAAK,gBAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,OAAkB;AACpC,SAAK,UAAU,QAAQ,GAAG,KAAK;AAAA,EACjC;AAAA,EAEA,eAAe,QAA2B;AACxC,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAO,QAAQ,CAAC,OAAO;AACrB,aAAK,iBAAiB,IAAI,EAAE;AAAA,MAC9B,CAAC;AAAA,IACH,OAAO;AACL,WAAK,iBAAiB,IAAI,MAAM;AAAA,IAClC;AACA,SAAK,gBAAgB;AAAA,EAEvB;AAAA,EAEQ,kBAAkB;AACxB,SAAK,YAAY,KAAK,UAAU,OAAO,CAAC,MAAM;AAC5C,YAAM,OAAO,EAAE,QAAQ,CAAC;AACxB,YAAM,mBAAmB,CAAC,KAAK,KAAK,CAAC,QAAQ,KAAK,aAAa,IAAI,GAAG,CAAC;AACvE,YAAM,qBAAqB,CAAC,KAAK,iBAAiB,IAAI,EAAE,EAAE;AAC1D,aAAO,sBAAsB;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EACA,IAAI,UAAmB;AACrB,WAAO,KAAK,UAAU,WAAW;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAe;AACjB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAoB;AACtB,WAAO,KAAK,cAAc;AAAA,EAC5B;AACF;;;ACzFO,IAAM,UAAN,MAAc;AAAA,EACF,WAA2B,CAAC;AAAA,EACrC,UAAU,IAAI,WAAW;AAAA,EACzB,aAAa,IAAI,WAAqC;AAAA,EACtD,UAAU,IAAI,QAAQ;AAAA,EACtB;AAAA,EACS;AAAA,EAEjB,YAAY,MAAmB;AAC7B,SAAK,OAAO;AACZ,UAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,SAAK,kBAAkB,KAAK,kBAAkB,CAAC,GAAG,KAAK,eAAe,IAAI,CAAC;AAC3E,SAAK,QAAQ,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,UAAU,OAAgB;AACxB,SAAK,SAAS,KAAK,KAAK;AAAA,EAC1B;AAAA,EAEA,YAAY,aAAyB;AAEnC,SAAK,QAAQ,aAAa,WAAW;AACrC,SAAK,SAAS,KAAK,GAAG,YAAY,QAAQ;AAE1C,UAAM,oBAAoB,KAAK,QAAQ,SAAS;AAChD,UAAM,kBAAkB,KAAK;AAC7B,UAAM,QAAQ,CAAC,GAAG,mBAAmB,GAAG,eAAe;AACvD,UAAM,SAAS,KAAK,WAAW,SAAS,KAAK,KAAK,OAAO,KAAK;AAE9D,UAAM,gBAAgB,OAAO;AAC7B,UAAM,UAAU,cAAc,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;AAE7D,YAAQ,QAAQ,CAAC,MAAM;AAErB,cAAQ,EAAE,MAAM;AAAA,QACd,KAAK;AACH,eAAK,QAAQ,eAAe,EAAE,MAAM;AACpC;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,eAAe,EAAE,OAAO;AACrC;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,YAAY,EAAE,MAAM;AACjC;AAAA,QACF;AACE,kBAAQ,IAAI,kBAAkB,CAAC;AAC/B,gBAAM,QAAe;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,aAAa;AACX,UAAM,YAAY,KAAK,QAAQ;AAC/B,UAAM,cAAc,KAAK,QAAQ,SAAS;AAC1C,UAAM,kBAAkB,KAAK;AAC7B,UAAM,WAAW,CAAC,GAAG,KAAK,QAAQ;AAElC,WAAO,EAAE,aAAa,iBAAiB,UAAU,UAAU;AAAA,EAC7D;AAAA,EAEA,eAAe,YAAoB;AACjC,SAAK,mBAAmB,UAAU;AAAA,EACpC;AAAA,EAEA,cAA+B;AAC7B,UAAM,OAAO,KAAK,QAAQ,IAAI;AAC9B,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEQ,mBAAmB,IAAY;AACrC,UAAM,MAAM,KAAK,KAAK,eAAe,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC5D,QAAI,KAAK;AACP,WAAK,QAAQ,oBAAoB,CAAC,GAAG,IAAI,KAAK,CAAC;AAAA,IACjD,OAAO;AAAA,IAGP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAoB;AACtB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,iBAAyB;AAC3B,WAAO,KAAK,KAAK,MAAM;AAAA,EACzB;AACF;;;ACvGO,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EACA;AAAA,EACT,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EAEzB,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,aAAa,KAAK;AAAA,EAChC;AAAA,EACA,IAAI,YAAY;AACd,WAAO,KAAK,YAAY,KAAK;AAAA,EAC/B;AAAA,EAEQ,SAAS;AAAA,EAEA,cAAc,oBAAI,IAA6B;AAAA,EAEhE,YAAY,QAAoG;AAC9G,SAAK,aAAa,OAAO;AACzB,SAAK,YAAY,OAAO;AACxB,SAAK,kBAAkB,OAAO;AAC9B,SAAK,iBAAiB,OAAO;AAC7B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,mBAAmB,QAA2C;AAC5D,SAAK,iBAAiB,OAAO;AAC7B,SAAK,kBAAkB,OAAO;AAC9B,SAAK,YAAY;AAAA,EACnB;AAAA,EACQ,cAAc;AACpB,UAAM,UAAU,MAAM,KAAK,KAAK,YAAY,KAAK,SAAS;AAC1D,UAAM,QAAQ,QAAQ,EAAE,QAAQ,KAAK,iBAAiB,OAAO,KAAK,eAAe,CAAC;AAClF,UAAM,aAAa,KAAK,UAAU;AAClC,SAAK,SAAS;AACd,QAAI,YAAY;AACd,WAAK,YAAY,QAAQ,CAAC,OAAO;AAC/B,WAAG,KAAK,MAAM;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAS,oBAA6C,cAAsB;AAE1E,SAAK,YAAY,IAAI,kBAAkB;AACvC,uBAAmB,KAAK,MAAM;AAC9B,WAAO,MAAM;AACX,WAAK,YAAY,OAAO,kBAAkB;AAAA,IAC5C;AAAA,EACF;AACF;AACO,IAAU;AAAA,CAAV,CAAUC,WAAV;AACE,EAAMA,OAAA,OAAO,CAAC,YAAoB,cAAsB;AAC7D,WAAO,CAAC,cAAiD;AACvD,YAAM,cAAc,UAAU,SAAS;AACvC,YAAM,aAAa,UAAU,QAAQ;AACrC,aAAO,KAAK,IAAI,aAAa,UAAU;AAAA,IACzC;AAAA,EACF;AAIO,EAAMA,OAAA,uBAAuB,CAAC,UAAkB;AACrD,WAAO,CAAC,UAAkB,QAAQ;AAAA,EACpC;AAAA,GAbe;;;ACrDV,IAAU;AAAA,CAAV,CAAUC,UAAV;AAmBE,EAAMA,MAAA,WAAW,CAAC,MAA4B,UAAgC;AACnF,UAAM,UACJ,OAAO,SAAS,WAAW,EAAE,OAAO,WAAW,OAAO,KAAK,IAAI;AACjE,WAAO,UAAU,SAAS,KAAK;AAAA,EACjC;AACA,QAAM,YAAY,CAAC,MAA8B,UAAgC;AAC/E,UAAM,eAAe,KAAK,IAAI,OAAO,IAAI;AACzC,QAAI,KAAK,UAAU,MAAM;AACvB,UAAI,KAAK,QAAQ,KAAK;AACpB,eAAO;AAAA,MACT;AAEA,YAAM,UAAU,KAAK,MAAM,KAAK,QAAQ,YAAY;AACpD,YAAM,UAAU,KAAK,IAAI,SAAS,CAAC;AACnC,aAAQ,UAAU;AAAA,IACpB;AACA,WAAQ,KAAK,QAAQ;AAAA,EACvB;AAEO,EAAMA,MAAA,eAAe,CAAC,SAA0C;AACrE,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,UAAM,UAAyB;AAC/B,UAAM,WAA0B;AAChC,UAAM,aAAa,MAAM,OAAO,MAAM,OAAO;AAC7C,UAAM,cAAc,MAAM,OAAO,MAAM,QAAQ;AAC/C,WAAO,cAAc;AAAA,EACvB;AAAA,GApDe;;;ACwFV,IAAU;AAAA,CAAV,CAAUC,YAAV;AACL,QAAO,WAAW,MAAM;AACxB,QAAO,eAAe,KAAK;AACpB,EAAMA,QAAA,YAAY,CAAwB,OAAa;AAC5D,OAAG,MAAM,UAAU;AACnB,OAAG,MAAM,SAAS;AAClB,OAAG,MAAM,WAAW;AACpB,OAAG,MAAM,YAAY;AACrB,WAAO;AAAA,EACT;AAEO,EAAMA,QAAA,cAAc,CACzB,IACA,OACA,UACM;AAEN,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAEJ,QAAI,OAAO,WAAW,UAAU;AAC9B,SAAG,MAAM,SAAS,KAAK;AAAA,IACzB;AAEA,QAAI,KAAK,aAAa,QAAQ,GAAG;AAC/B,SAAG,MAAM,WAAW,KAAK,SAAS,UAAU,KAAK;AAAA,IACnD;AAEA,QAAI,KAAK,aAAa,QAAQ,GAAG;AAC/B,SAAG,MAAM,WAAW,KAAK,SAAS,UAAU,KAAK;AAAA,IACnD;AAEA,QAAI,KAAK,aAAa,SAAS,GAAG;AAChC,SAAG,MAAM,YAAY,KAAK,SAAS,WAAW,KAAK;AAAA,IACrD;AAEA,QAAI,KAAK,aAAa,SAAS,GAAG;AAChC,SAAG,MAAM,YAAY,KAAK,SAAS,WAAW,KAAK;AAAA,IACrD;AAEA,QAAI,WAAW;AACb,SAAG,MAAM,YAAY;AAAA,IACvB;AAEA,QAAI,KAAK;AACP,SAAG,MAAM,MAAM,KAAK,SAAS,KAAK,KAAK;AAAA,IACzC;AAEA,QAAI,aAAa;AACf,SAAG,MAAM,cAAc,KAAK,SAAS,aAAa,KAAK;AAAA,IACzD;AAEA,QAAI,cAAc;AAChB,SAAG,MAAM,eAAe,KAAK,SAAS,cAAc,KAAK;AAAA,IAC3D;AAEA,QAAI,YAAY;AACd,SAAG,MAAM,aAAa,KAAK,SAAS,YAAY,KAAK;AAAA,IACvD;AAEA,QAAI,eAAe;AACjB,SAAG,MAAM,gBAAgB,KAAK,SAAS,eAAe,KAAK;AAAA,IAC7D;AAEA,QAAI,UAAU;AACZ,SAAG,MAAM,WAAW;AAAA,IACtB;AACA,QAAI,gBAAgB;AAClB,SAAG,MAAM,iBAAiB;AAAA,IAC5B;AAEA,QAAI,cAAc;AAChB,SAAG,MAAM,eAAe;AAAA,IAC1B;AACA,QAAI,UAAU;AACZ,SAAG,MAAM,WAAW;AAAA,IACtB;AACA,QAAI,SAAS;AACX,SAAG,MAAM,UAAU;AAAA,IACrB;AACA,QAAI,eAAe;AACjB,SAAG,MAAM,gBAAgB;AAAA,IAC3B;AACA,QAAI,YAAY;AACd,SAAG,MAAM,aAAa;AAAA,IACxB;AAGA,QAAI,iBAAiB;AACnB,SAAG,MAAM,kBAAkB;AAAA,IAC7B;AAEA,QAAI,QAAQ;AACV,SAAG,MAAM,SAAS;AAAA,IACpB;AAEA,QAAI,WAAW;AACb,SAAG,MAAM,YAAY;AAAA,IACvB;AAEA,QAAI,WAAW;AACb,SAAG,MAAM,QAAQ;AAAA,IACnB;AACA,QAAI,WAAW;AACb,SAAG,MAAM,YAAY;AAAA,IACvB;AAEA,QAAI,aAAa;AACf,SAAG,MAAM,cAAc;AAAA,IACzB;AAEA,QAAI,aAAa;AACf,SAAG,MAAM,cAAc,KAAK,SAAS,aAAa,KAAK;AAAA,IACzD;AAEA,QAAI,YAAY;AACd,SAAG,MAAM,aAAa,aAAa;AAAA,IACrC;AAEA,QAAI,aAAa;AACf,SAAG,MAAM,cAAc;AAAA,IACzB;AAEA,QAAI,UAAU;AACZ,SAAG,MAAM,WAAW,KAAK,SAAS,UAAU,KAAK;AAAA,IACnD;AAEA,QAAI,MAAM,SAAS,CAAC,GAAG;AACrB,SAAG,MAAM,OAAO,IAAI;AAAA,IACtB;AAEA,QAAI,MAAM,SAAS,CAAC,GAAG;AACrB,SAAG,MAAM,SAAS,IAAI;AAAA,IACxB;AAEA,QAAI,KAAK,aAAa,MAAM,GAAG;AAC7B,SAAG,MAAM,SAAS,KAAK,SAAS,QAAQ,KAAK;AAAA,IAC/C;AAEA,QAAI,KAAK,aAAa,KAAK,GAAG;AAC5B,SAAG,MAAM,QAAQ,KAAK,SAAS,OAAO,KAAK;AAAA,IAC7C;AAEA,QAAI,KAAK,aAAa,IAAI,GAAG;AAC3B,SAAG,MAAM,OAAO,KAAK,SAAS,MAAM,KAAK;AAAA,IAC3C;AAEA,QAAI,KAAK,aAAa,KAAK,GAAG;AAC5B,SAAG,MAAM,QAAQ,KAAK,SAAS,OAAO,KAAK;AAAA,IAC7C;AAEA,QAAI,KAAK,aAAa,MAAM,GAAG;AAC7B,SAAG,MAAM,SAAS,KAAK,SAAS,QAAQ,KAAK;AAAA,IAC/C;AAEA,QAAI,KAAK,aAAa,GAAG,GAAG;AAC1B,SAAG,MAAM,MAAM,KAAK,SAAS,KAAK,KAAK;AAAA,IACzC;AAEA,QAAI,MAAM,SAAS,CAAC,GAAG;AACrB,SAAG,MAAM,SAAS,KAAK,SAAS,GAAG,KAAK;AAAA,IAC1C;AAEA,QAAI,SAAS,CAAC,GAAG;AACf,SAAG,MAAM,QAAQ,KAAK,SAAS,GAAG,KAAK;AAAA,IACzC;AAEA,QAAI,KAAK,aAAa,YAAY,GAAG;AACnC,SAAG,MAAM,eAAe,KAAK,SAAS,cAAc,KAAK;AAAA,IAC3D;AAEA,QAAI,eAAe;AACjB,SAAG,MAAM,gBAAgB,KAAK,SAAS,eAAe,KAAK;AAAA,IAC7D;AAEA,QAAI,QAAQ;AACV,SAAG,MAAM,SAAS,KAAK,SAAS,QAAQ,KAAK;AAAA,IAC/C;AAEA,QAAI,SAAS;AACX,SAAG,MAAM,UAAU,KAAK,SAAS,SAAS,KAAK;AAAA,IACjD;AAEA,QAAI,SAAS,OAAO,GAAG;AACrB,SAAG,MAAM,UAAU,UAAU;AAAA,IAC/B;AAEA,QAAI,YAAY;AACd,SAAG,MAAM,aAAa;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAAA,GA9Oe;;;ACzFV,IAAU;AAAA,CAAV,CAAUC,gBAAV;AACI,EAAMA,YAAA,MAAM,MAAM,KAAK,IAAI;AAG3B,EAAMA,YAAA,WAAW,CAAC,GAAe,OAA2B;AAC/D,UAAM,MAAM,IAAI,KAAK,IAAI,EAAE;AAC3B,WAAO;AAAA,EACX;AAEO,EAAMA,YAAA,OAAO,CAAC,IAAgB,OAAyB;AAC1D,UAAM,QAAQ,KAAK,IAAI,EAAE;AACzB,UAAM,QAAQ,KAAK,IAAI,EAAE;AACzB,WAAO,KAAK,IAAI,QAAQ,KAAK;AAAA,EACjC;AAEO,EAAMA,YAAA,UAAU,CAAC,MAAwB;AAC5C,eAAOA,YAAA,MAAK,OAAGA,YAAA,KAAI,CAAC;AAAA,EACxB;AAAA,GAjBa;;;ACmBV,IAAM,YAAY;AAAA,EACvB,IAAI,CAAC,GAAc,MAAiB;AAClC,WACE,EAAE,mBAAmB,EAAE,kBACvB,EAAE,cAAc,EAAE,aAClB,EAAE,mBAAmB,EAAE,kBACvB,EAAE,mBAAmB,EAAE,kBACvB,EAAE,wBAAwB,EAAE,uBAC5B,EAAE,eAAe,EAAE,cACnB,EAAE,eAAe,EAAE;AAAA,EAEvB;AAAA,EAEA,SAAS,CAAC,MAAiB,SAA2C;AACpE,QAAI,SAAS,OAAO;AAClB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,CAAC;AAEd,QAAI,KAAK,mBAAmB,KAAK,gBAAgB;AAC/C,WAAK,iBAAiB,KAAK;AAAA,IAC7B;AACA,QAAI,KAAK,cAAc,KAAK,WAAW;AACrC,WAAK,YAAY,KAAK;AAAA,IACxB;AACA,QAAI,KAAK,mBAAmB,KAAK,gBAAgB;AAC/C,WAAK,iBAAiB,KAAK;AAAA,IAC7B;AAEA,QAAI,KAAK,mBAAmB,KAAK,gBAAgB;AAC/C,WAAK,iBAAiB,KAAK;AAAA,IAC7B;AACA,QAAI,KAAK,wBAAwB,KAAK,qBAAqB;AACzD,WAAK,sBAAsB,KAAK;AAAA,IAClC;AACA,QAAI,KAAK,eAAe,KAAK,YAAY;AACvC,WAAK,aAAa,KAAK;AAAA,IACzB;AACA,QAAI,KAAK,eAAe,KAAK,YAAY;AACvC,WAAK,aAAa,KAAK;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AACF;;;AC3BA,IAAM,UAAU,CAAC,SAAkC,SAAS;AAC5D,IAAM,SAAS,CAAC,SAAiC,SAAS;AAEnD,IAAe,WAAf,MAA+C;AAAA,EAU1C,YACW,IACA,KACA,OACnB;AAHmB;AACA;AACA;AAEnB,QAAI,IAAI,WAAW;AACjB,WAAK,GAAG,YAAY,IAAI;AAAA,IAC1B;AACA,SAAK,WAAW,KAAK,SAAS,KAAK,IAAI;AACvC,SAAK,YAAY,KAAK,UAAU,KAAK,IAAI;AACzC,SAAK,iBAAiB,KAAK,eAAe,KAAK,IAAI;AACnD,SAAK,eAAe,KAAK,aAAa,KAAK,IAAI;AAC/C,UAAM,EAAE,cAAc,aAAa,IAAI;AAEvC,QAAI,cAAc;AAChB,WAAK,GAAG,eAAe,MAAM;AAC3B,aAAK,SAAS,YAAY;AAAA,MAC5B;AAAA,IACF;AACA,QAAI,cAAc;AAChB,WAAK,GAAG,eAAe,MAAM;AAC3B,aAAK,SAAS,YAAY;AAAA,MAC5B;AAAA,IACF;AAEA,SAAK,UAAU;AAEf,QAAI,KAAK;AACP,WAAK,aAAa,KAAK,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA,EAvCQ,YAA+B;AAAA,EAE7B,YAA6B;AAAA,IACrC,UAAU,EAAE,OAAO,MAAM,OAAO,IAAI;AAAA,IACpC,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuCA,SAAS,OAAe;AACtB,SAAK,aAAa,KAAK;AAAA,EACzB;AAAA,EAEA,iCAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,eAAe,QAA+C;AAC5D,WAAO,OAAO,KAAK,EAAE;AAAA,EAEvB;AAAA,EAEA,YAAY,OAAsB;AAChC,SAAK,mBAAmB,KAAK;AAAA,EAC/B;AAAA,EAEA,SAAS,OAAkB;AACzB,UAAM,OAAO,KAAK;AAClB,UAAM,OAAO,UAAU,QAAQ,OAAO,IAAI;AAC1C,SAAK,YAAY;AACjB,QAAI,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG;AAChC,WAAK,mBAAmB,IAAI;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,mBAAmB,MAAqB;AAC9C,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AACJ,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,KAAK;AAET,QAAI,OAAO,cAAc,KAAK,kBAAkB;AAC9C,WAAK,SAAS,gBAAgB;AAAA,IAChC;AAEA,QAAI,QAAQ,cAAc,KAAK,iBAAiB;AAC9C,WAAK,SAAS,eAAe;AAAA,IAC/B;AAEA,QAAI,mBAAmB,aAAa,kBAAkB;AACpD,WAAK,SAAS,gBAAgB;AAAA,IAChC;AAEA,QAAI,mBAAmB,YAAY,iBAAiB;AAClD,WAAK,SAAS,eAAe;AAAA,IAC/B;AAEA,QAAI,mBAAmB,WAAW,gBAAgB;AAChD,WAAK,SAAS,cAAc;AAAA,IAC9B;AACA,QAAI,mBAAmB,uBAAuB,0BAA0B;AACtE,WAAK,SAAS,wBAAwB;AAAA,IACxC;AAEA,QAAI,mBAAmB,sBAAsB,yBAAyB;AACpE,WAAK,SAAS,uBAAuB;AAAA,IACvC;AAEA,QAAI,mBAAmB,qBAAqB,wBAAwB;AAClE,WAAK,SAAS,sBAAsB;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,YAAY;AAClB,SAAK,GAAG,MAAM,UAAU;AACxB,SAAK,GAAG,MAAM,SAAS;AACvB,SAAK,GAAG,MAAM,WAAW;AACzB,SAAK,GAAG,MAAM,YAAY;AAAA,EAC5B;AAAA,EAIU,aAAa,OAAwB;AAC7C,SAAK,YAAY,OAAO,OAAO,KAAK,WAAW,KAAK;AACpD,WAAO,YAAY,KAAK,IAAI,KAAK,WAAW,KAAK,MAAM,KAAK;AAC5D,WAAO,iBAAiB,KAAK,EAAE;AAAA,EACjC;AACF;;;AClLO,IAAM,OAAN,cAAmB,SAAyB;AAAA,EAChC,MAAM;AAAA,EACJ,eAAe,EAAE,GAAG,IAAI,GAAG,EAAE;AAAA,EACxC,WAA0C,CAAC;AAAA,EAEnD,qBAAqB,cAAmD;AACtE,SAAK,GAAG,UAAU,MAAM;AACtB,YAAM,SAAS,KAAK,IAAI;AACxB,UAAI,QAAQ;AACV,qBAAa,MAAM;AAAA,MACrB;AAAA,IACF;AACA,SAAK,SAAS,QAAQ,CAAC,UAAU;AAC/B,YAAM,qBAAqB,YAAY;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,YAAY,KAAc,OAAqB,UAAyC;AACtF,UAAM,IAAI,SAAS,cAAc,KAAK;AACtC,UAAM,GAAG,KAAK,KAAK;AACnB,SAAK,WAAW;AAEhB,SAAK,SAAS,QAAQ,CAAC,UAAU;AAC/B,YAAM,eAAe,KAAK,EAAE;AAAA,IAC9B,CAAC;AAAA,EACH;AAAA,EACU,kBAAkB;AAC1B,SAAK,SAAS,QAAQ,CAAC,UAAU;AAC/B,cAAQ,IAAI,KAAK;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AChCO,IAAM,OAAN,MAAM,cAAa,SAA2B;AAAA,EAenD,YACqB,KACV,cACT;AACA,UAAM,SAAS,cAAc,KAAK,GAAG,KAAK,YAAY;AAHnC;AACV;AAGT,UAAK,eAAe;AACpB,SAAK,aAAa,MAAK;AACvB,SAAK,MAAM,YAAY,MAAK,cAAc;AAC1C,SAAK,aAAa,gBAAgB,MAAK,cAAc;AACrD,SAAK,GAAG,UAAU;AAClB,SAAK,GAAG,MAAM,WAAW;AACzB,SAAK,SAAS,IAAI,KAAK;AAEvB,SAAK,YAAY,WAAW,IAAI;AAChC,SAAK,GAAG,SAAS,MAAM;AAAA,IAAC;AACxB,SAAK,GAAG,UAAU,MAAM;AAAA,IAAC;AACzB,SAAK,GAAG,MAAM,IAAI;AAClB,YAAQ,KAAK,KAAK,UAAU;AAAA,EAC9B;AAAA,EAhCA,OAAe,cAAc;AAAA,EACZ;AAAA,EACR;AAAA,EACA;AAAA,EACQ;AAAA,EACjB,qBAAqB,cAAyD;AAC5E,SAAK,GAAG,UAAU,MAAM;AACtB,YAAM,SAAS,KAAK,IAAI;AACxB,UAAI,QAAQ;AACV,qBAAa,MAAM;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAsBA,MAAY;AAAA,EAAC;AACf;;;ACtCO,IAAM,QAAN,cAAoB,SAA+B;AAAA,EACxD,YAAY,KAAe,OAAqB;AAC9C,UAAM,SAAS,cAAc,GAAG,GAAG,KAAK,KAAK;AAAA,EAC/C;AAAA,EAEA,qBAAqB,cAAmD;AACtE,SAAK,GAAG,UAAU,MAAM;AACtB,YAAM,UAAU,KAAK,IAAI;AACzB,UAAI,SAAS;AACX,qBAAa,OAAO;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;;;ACdO,IAAM,UAAN,cAAsB,SAA4B;AAAA,EACtC,MAAM;AAAA,EACJ,eAAe,EAAE,GAAG,IAAI,GAAG,GAAG;AAAA,EAEjD,YAAY,KAAiB,OAAqB;AAChD,UAAM,IAAI,SAAS,cAAc,QAAQ;AACzC,UAAM,GAAG,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,qBAAqB,cAAmD;AACtE,SAAK,GAAG,UAAU,MAAM;AACtB,YAAM,SAAS,KAAK,IAAI;AACxB,UAAI,QAAQ;AACV,qBAAa,MAAM;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACF;;;AChBO,IAAM,iBAAiB,CAAC,KAAkB,UAAuC;AACtF,UAAQ,IAAI,MAAM;AAAA,IAChB,KAAK;AACH,YAAM,WAAW,qBAAqB,KAAK,KAAK;AAChD,aAAO,IAAI,KAAK,KAAK,OAAO,QAAQ;AAAA,IACtC,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,KAAK;AAAA,IAC5B,KAAK;AACH,aAAO,IAAI,MAAM,KAAK,KAAK;AAAA,IAC7B,KAAK;AACH,aAAO,IAAI,QAAQ,KAAK,KAAK;AAAA,IAC/B;AACE,YAAM,QAAe;AACrB,YAAM,IAAI,MAAM,mDAAmD;AAAA,EAEvE;AACF;AAEA,IAAM,uBAAuB,CAAC,KAAc,UAA0C;AACpF,QAAM,WAAW,IAAI;AACrB,QAAM,WAA0C,CAAC;AACjD,WAAS,QAAQ,CAACC,SAAQ;AACxB,YAAQA,KAAI,MAAM;AAAA,MAChB,KAAK;AACH,cAAM,UAAU,IAAI,MAAMA,MAAK,KAAK;AACpC,iBAAS,KAAK,OAAO;AACrB;AAAA,MACF,KAAK;AACH,cAAM,WAAW,IAAI,KAAKA,MAAK,KAAK;AACpC,iBAAS,KAAK,QAAQ;AACtB;AAAA,MACF,KAAK;AACH,cAAM,YAAY,IAAI,QAAQA,MAAK,KAAK;AACxC,iBAAS,KAAK,SAAS;AACvB;AAAA,MACF;AACE,cAAM,QAAeA;AAAA,IACzB;AAAA,EACF,CAAC;AACD,SAAO;AACT;;;ACjCO,IAAM,oBAAoB;AAAA,EAC/B,UAAU,CAAC,MAAiC;AAC1C,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO,eAAe,EAAE,KAAK;AAAA,MAC/B,KAAK;AACH,eAAO,eAAe,EAAE,KAAK;AAAA,MAC/B,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO,EAAE,KAAK,QAAQ,QAAQ,EAAE,KAAK;AAAA,MACvC,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,cAAM,mBAA0B;AAChC,eAAO;AAAA,IACX;AAAA,EACF;AACF;;;ACdO,IAAM,UAAU;AAAA,EACrB,YAAY,UAAkB,cAA0C;AACtE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,WAAW,IAAI;AAAA,MAC1B,SAAS,EAAE,UAAU,aAAa;AAAA,IACpC;AAAA,EACF;AAAA,EACA,UAAU,QAAgB,YAAsC;AAC9D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,WAAW,IAAI;AAAA,MAC1B,SAAS,EAAE,QAAQ,WAAW;AAAA,IAChC;AAAA,EACF;AAAA,EACA,UAAU,QAAgB,YAAsC;AAC9D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,WAAW,IAAI;AAAA,MAC1B,SAAS,EAAE,QAAQ,WAAW;AAAA,IAChC;AAAA,EACF;AAAA,EACA,YAAY,MAKW;AACrB,UAAM,EAAE,QAAQ,YAAY,QAAQ,aAAa,IAAI;AACrD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,WAAW,IAAI;AAAA,MAC1B,SAAS,EAAE,QAAQ,YAAY,QAAQ,aAAa;AAAA,IACtD;AAAA,EACF;AACF;;;ACjCO,IAAM,UAAU;AAAA,EACrB,aAAa,CAAC,OAAwB;AACpC,WAAO;AAAA,MACL,IAAI,OAAO;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,CAAC;AAAA,MACP,YAAY;AAAA,MACZ,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,OAAO,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,iBAAiB,MAAM;AAAA,UAC3D,UAAU,CAAC;AAAA,UACX,WAAW,cAAc;AAAA,QAC3B;AAAA,MACF;AAAA,MAEA,cAAc,CAAC;AAAA,IACjB;AAAA,EACF;AACF;AAEO,IAAM,OAAN,MAAW;AAAA,EAShB,YACmB,KACA,aACA,cACA,aACjB;AAJiB;AACA;AACA;AACA;AAEjB,QAAI,SAAS,QAAQ,CAAC,OAAO;AAC3B,YAAM,UAAU,eAAe,IAAI,YAAY;AAG/C,cAAQ,qBAAqB,CAAC,WAAW;AACvC,aAAK,mBAAmB,MAAM;AAAA,MAChC,CAAC;AAED,WAAK,SAAS,KAAK,OAAO;AAAA,IAQ5B,CAAC;AAED,QAAI,IAAI,aAAa;AACnB,WAAK,YAAY,UAAU,IAAI,YAAY,OAAO;AAClD,UAAI,IAAI,YAAY,OAAO;AACzB,aAAK,YAAY,eAAe,IAAI,YAAY,KAAK;AAAA,MACvD;AAAA,IACF;AAEA,QAAI,IAAI,aAAa,QAAQ;AAC3B,WAAK,YAAY,iBAAiB,IAAI,YAAY;AAAA,IACpD;AAAA,EACF;AAAA,EA1CiB,MAAM;AAAA,EACf,WAAoC,CAAC;AAAA;AAAA;AAAA,EAGrC,cAA0B,WAAW,IAAI;AAAA,EACzC,gBAAmC;AAAA,EACnC,WAAW,IAAI,MAAe;AAAA,EAsC9B,iBAAiB,OAA2B;AAClD,UAAM,aAAa,WAAW,IAAI;AAClC,UAAM,WAAW,WAAW,KAAK,KAAK,aAAa,UAAU;AAC7D,UAAM,WAAW,QAAQ,UAAU,KAAK,IAAI,IAAI,KAAK,IAAI,MAAM;AAC/D,SAAK,SAAS,KAAK,QAAQ;AAC3B,UAAM,WAAW,CAAC,GAAG,KAAK,QAAQ;AAClC,WAAO;AAAA,MACL,YAAY,KAAK,IAAI;AAAA,MACrB,QAAQ,KAAK,IAAI;AAAA,MACjB;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,IAClB;AAAA,EACF;AAAA,EACQ,mBAAmB,GAAsB;AAC/C,UAAM,QAAQ,QAAQ,YAAY;AAAA,MAChC,QAAQ,KAAK,IAAI;AAAA,MACjB,YAAY,KAAK,IAAI;AAAA,MACrB,QAAQ,EAAE;AAAA,MACV,cAAc,kBAAkB,SAAS,CAAC;AAAA,IAC5C,CAAC;AACD,SAAK,SAAS,KAAK,KAAK;AACxB,cAAU,QAAQ,GAAG;AACrB,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,WAAW;AACb,gBAAU,QAAQ,SAAS;AAAA,IAC7B;AAEA,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AACH,cAAM,iBAAiB,KAAK,iBAAiB,CAAC,CAAC;AAC/C,aAAK,YAAY,cAAc;AAC/B;AAAA,MACF,KAAK;AACH,aAAK,YAAY,QAAQ,EAAE,IAAI;AAC/B;AAAA,MACF,KAAK;AACH,aAAK,YAAY,QAAQ,EAAE,IAAI;AAC/B;AAAA,MACF,KAAK;AACH,aAAK,YAAY,WAAW;AAC5B;AAAA,MACF,KAAK;AACH,aAAK,YAAY,WAAW;AAC5B;AAAA,MACF,KAAK;AACH,aAAK,YAAY,UAAU;AAC3B;AAAA,MACF,KAAK;AACH,aAAK,YAAY,YAAY;AAC7B;AAAA,MACF,KAAK;AACH,cAAM,mBAAmB,KAAK,iBAAiB,CAAC,EAAE,IAAI,CAAC;AACvD,aAAK,YAAY,gBAAgB;AACjC;AAAA,MACF,KAAK;AAEH,cAAM,mBAAmB,KAAK,iBAAiB,CAAC,CAAC;AACjD,aAAK,YAAY,gBAAgB;AACjC;AAAA,MACF;AACE,cAAM,mBAA0B;AAChC,gBAAQ,IAAI,gBAAgB;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,eAAe,QAAqB;AAClC,UAAM,iBAAiB,QAAQ,UAAU,KAAK,IAAI,IAAI,KAAK,IAAI,MAAM;AACrE,SAAK,cAAc,WAAW,IAAI;AAClC,SAAK,SAAS,KAAK,cAAc;AACjC,SAAK,SAAS,QAAQ,CAAC,OAAO;AAC5B,SAAG,eAAe,MAAM;AAAA,IAC1B,CAAC;AAAA,EAQH;AAAA,EAEA,UAAU;AACR,SAAK,YAAY,MAAM;AAAA,EACzB;AAAA,EAEA,OAAO;AACL,UAAM,OAAO,KAAK;AAClB,UAAM,OAAO,KAAK,YAAY,SAAS;AACvC,UAAM,OAAO,UAAU,QAAQ,MAAM,IAAI;AACzC,SAAK,SAAS,QAAQ,CAAC,YAAY;AACjC,cAAQ,YAAY,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AACF;;;AC3JA,IAAM,KAAK,CAAC,GAAS,MAAY;AAC/B,MAAI,CAAC,GAAG;AACN,WAAO;AAAA,EACT;AACA,MAAI,EAAE,SAAS,EAAE,MAAM;AACrB,WAAO;AAAA,EACT;AACA,MAAI,EAAE,SAAS,gBAAgB,EAAE,SAAS,cAAc;AACtD,WAAO,EAAE,aAAa,EAAE;AAAA,EAC1B;AAEA,MAAI,EAAE,SAAS,qBAAqB,EAAE,SAAS,mBAAmB;AAChE,WAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;AAAA,EAC5C;AACA,MAAI,EAAE,SAAS,qBAAqB,EAAE,SAAS,mBAAmB;AAChE,WACE,EAAE,QAAQ,EAAE,OACZ,EAAE,YAAY,EAAE,WAChB,EAAE,YAAY,EAAE,WAChB,EAAE,WAAW,EAAE,UACf,EAAE,WAAW,EAAE;AAAA,EAEnB;AACA,SAAO;AACT;AACA,IAAM,iBAAiB,CAAC,SAAe;AACrC,SAAO,KAAK,aAAa,iBAAiB,KAAK,aAAa;AAC9D;AAEA,IAAM,qBAAqB,CAAC,SAAe;AACzC,SAAO,KAAK,aAAa,qBAAqB,KAAK,aAAa;AAClE;AAEA,IAAM,QAAQ,CAAC,GAAS,MAAY,CAAC,GAAG,GAAG,CAAC;AAE5C,IAAM,KAAK,CAAC,SAA6D;AACvE,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AClFO,IAAM,cAAN,MAAkB;AAAA,EAiEvB,YACmB,YACA,OACA,SACjB;AAHiB;AACA;AACA;AAEjB,SAAK,UAAU;AACf,SAAK,WAAW,YAAY,KAAK,YAAY;AAC7C,SAAK,WAAW,YAAY,KAAK,YAAY;AAC7C,SAAK,cAAc,KAAK;AACxB,WAAO,UAAU,KAAK,YAAY;AAClC,WAAO,YAAY,KAAK,cAAc,KAAK,aAAa,KAAK,MAAM,KAAK;AAExE,SAAK,aAAa,UAAU,MAAM;AAChC,YAAM,OAAO,KAAK,YAAY;AAC9B,UAAI,MAAM;AACR,aAAK,QAAQ,IAAI;AAAA,MACnB,OAAO;AACL,aAAK,cAAc;AAAA,MACrB;AAAA,IACF;AACA,SAAK,aAAa,UAAU,CAAC,MAAM;AACjC,UAAI,KAAK,aAAa,QAAQ,IAAI;AAChC,gBAAQ,0BAA0B,KAAK,aAAa,GAAG;AAAA,MACzD;AAAA,IACF;AAEA,SAAK,aAAa,UAAU,MAAM;AAChC,YAAM,OAAO,KAAK,YAAY;AAC9B,UAAI,MAAM;AACR,aAAK,QAAQ,IAAI;AAAA,MACnB,OAAO;AACL,aAAK,cAAc;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAlGiB,MAAM;AAAA,EACN,eAAe,SAAS,cAAc,OAAO;AAAA,EAC7C,eAAe,SAAS,cAAc,OAAO;AAAA,EAC7C,kBAAkB;AAAA,EAClB,qBAA6B;AAAA,IAC5C,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACQ;AAAA,EACA,cAA6D;AAAA,EAC7D,WAAwB,CAAC;AAAA,EACzB,WAA2B;AAAA,EAEnC,QAAQ;AACN,QAAI,KAAK;AAAiB,cAAQ,IAAI,KAAK,MAAM,OAAO;AACxD,QAAI,OAAO,KAAK,aAAa,UAAU;AACrC,aAAO,aAAa,KAAK,QAAQ;AAAA,IACnC;AAEA,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,aAAa,gBAAgB,KAAK;AACvC,SAAK,aAAa,KAAK;AACvB,SAAK,aAAa,gBAAgB,KAAK;AACvC,SAAK,aAAa,KAAK;AACvB,SAAK,WAAW,CAAC;AACjB,SAAK,cAAc;AACnB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,WAAsB;AACpB,UAAM,IAAI,KAAK;AACf,UAAM,YAAY,KAAK,aAAa;AACpC,UAAM,iBAAiB,KAAK,EAAE,KAAK,SAAS,qBAAqB,CAAC,KAAK,aAAa;AACpF,UAAM,iBAAiB,KAAK,EAAE,KAAK,SAAS,qBAAqB,CAAC,KAAK,aAAa;AACpF,UAAM,sBAAsB,KAAK,EAAE,KAAK;AACxC,UAAM,aAAa,KAAK,EAAE,KAAK;AAC/B,UAAM,aAAa,KAAK,EAAE,KAAK;AAC/B,UAAM,iBAAiB,KAAK,EAAE,KAAK;AACnC,UAAM,eAAe,KAAK,aAAa;AAEvC,UAAM,kBAAkB,KAAK,aAAa;AAC1C,QAAI,iBAA8C,eAAe,qBAAqB;AAEtF,QAAI,gBAAgB;AAClB,uBAAiB,eAAe,sBAAsB;AAAA,IACxD;AACA,QAAI,iBAAiB;AACnB,uBAAiB,eAAe,oBAAoB;AAAA,IACtD;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAsCA,QAAQ,MAAqB;AAE3B,UAAM,OAAO,KAAK;AAElB,QAAI,mBAAmB;AAGvB,QAAI,QAAQ,KAAK,mBAAmB,IAAI,KAAK,KAAK,MAAM,KAAK,MAAM,IAAI,GAAG;AACxE,WAAK,WAAW;AAChB,WAAK,WAAW;AAChB,WAAK,cAAc;AAAA,IACrB;AAEA,QAAI,CAAC,MAAM;AACT,WAAK,cAAc,EAAE,WAAW,WAAW,IAAI,GAAG,KAAW;AAAA,IAC/D,WAAW,KAAK,MAAM,KAAK,MAAM,IAAI,GAAG;AACtC,WAAK,cAAc,EAAE,WAAW,WAAW,IAAI,GAAG,KAAW;AAAA,IAC/D;AAEA,QAAI,KAAK,aAAa,iBAAiB,KAAK,aAAa,iBAAiB;AACxE,WAAK,WAAW,CAAC;AAAA,IACnB;AAGA,QAAI,KAAK,SAAS,mBAAmB;AACnC,WAAK,UAAU;AAEf,WAAK,UAAU,KAAK,GAAG;AACvB,UAAI,KAAK,MAAM;AACb,aAAK,aAAa,OAAO;AACzB,2BAAmB;AAAA,MACrB,OAAO;AACL,aAAK,aAAa,OAAO;AAAA,MAC3B;AAEA,UAAI;AACF,aAAK,aAAa,KAAK;AAAA,MACzB,SAAS,GAAG;AACV,gBAAQ,MAAM,CAAC;AAAA,MACjB;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,mBAAmB;AACnC,UAAI,CAAC,KAAK,aAAa,MAAM;AAC3B,aAAK,WAAW;AAAA,MAClB;AACA,UAAI,KAAK,QAAQ,KAAK,aAAa,KAAK;AACtC,aAAK,aAAa,MAAM,KAAK;AAAA,MAC/B;AACA,WAAK,aAAa,KAAK;AAAA,IACzB;AAEA,QAAI,KAAK,SAAS,cAAc;AAC9B,UAAI,OAAO,KAAK,aAAa,UAAU;AACrC,eAAO,aAAa,KAAK,QAAQ;AAAA,MACnC;AACA,WAAK,WAAW,OAAO,WAAW,MAAM;AACtC,cAAM,OAAO,KAAK,YAAY;AAC9B,YAAI,MAAM;AACR,eAAK,QAAQ,IAAI;AAAA,QACnB,OAAO;AACL,eAAK,cAAc;AAAA,QACrB;AAAA,MACF,GAAG,KAAK,QAAQ;AAAA,IAClB;AAEA,QAAI,kBAAkB;AACpB,YAAM,gBAAgB,KAAK,YAAY;AACvC,UAAI,eAAe;AACjB,aAAK,QAAQ,aAAa;AAAA,MAC5B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,QAAgB;AAC7B,SAAK,cAAc,EAAE,GAAG,OAAO;AAC/B,WAAO,YAAY,KAAK,cAAc,KAAK,aAAa,KAAK,MAAM,KAAK;AAAA,EAC1E;AAAA,EAEA,iBAAiB,OAAe;AAC9B,SAAK,WAAW,CAAC,GAAG,KAAK;AACzB,UAAM,OAAO,KAAK,YAAY;AAC9B,QAAI,MAAM;AACR,WAAK,QAAQ,IAAI;AACjB,UAAI,KAAK,SAAS,qBAAqB,KAAK,MAAM;AAChD,aAAK,aAAa,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,KAAa;AAErB,QAAI,KAAK,aAAa,QAAQ,KAAK;AACjC,WAAK,aAAa,MAAM;AAAA,IAC1B;AACA,SAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,mBAAmB;AACzB,SAAK,aACF,KAAK,EACL,KAAK,MAAM;AAAA,IAAC,CAAC,EACb,MAAM,CAAC,MAAM;AACZ,cAAQ,IAAI,CAAC;AACb,WAAK,QAAQ,sBAAsB;AAAA,IACrC,CAAC;AAAA,EACL;AAAA,EAEQ,YAAY;AAClB,SAAK,aAAa,MAAM,UAAU;AAAA,EACpC;AAAA,EAEQ,YAAY;AAClB,SAAK,aAAa,MAAM,UAAU;AAAA,EACpC;AAAA,EAEA,aAAa;AACX,QAAI;AACF,UAAI,CAAC,KAAK,aAAa,MAAM;AAC3B,aAAK,aAAa,MAAM;AAAA,MAC1B;AAAA,IACF,SAAS,GAAG;AACV,cAAQ,IAAI,CAAC;AACb,WAAK,QAAQ,sBAAsB;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,aAAa;AACX,QAAI;AACF,UAAI,CAAC,KAAK,aAAa,MAAM;AAC3B,aAAK,aAAa,MAAM;AAAA,MAC1B;AAAA,IACF,SAAS,GAAG;AACV,cAAQ,IAAI,CAAC;AACb,WAAK,QAAQ,sBAAsB;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,cAA4B;AAGlC,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,YAAY;AACV,SAAK,aAAa,QAAQ;AAAA,EAC5B;AAAA,EAEA,cAAc;AACZ,SAAK,aAAa,QAAQ;AAAA,EAC5B;AACF;;;ACzPA,IAAM,aAA2B;AAAA,EAC/B,MAAM,CAAC,YAAoB;AAAA,EAAC;AAAA,EAC5B,OAAO,CAAC,YAAoB;AAAA,EAAC;AAAA,EAC7B,MAAM,CAAC,YAAoB;AAAA,EAAC;AAC9B;AAQO,IAAM,eAAN,MAA4C;AAAA,EAWjD,YACE,QACiB,QACA,OACA,QACjB;AAHiB;AACA;AACA;AAEjB,SAAK,YAAY,OAAO,YAAY,MAAM;AACxC,UAAI,KAAK,aAAa;AACpB,aAAK,YAAY,KAAK;AAAA,MACxB;AAAA,IACF,GAAG,GAAG;AACN,SAAK,cAAc;AACnB,SAAK,YAAY,YAAY,KAAK,UAAU;AAC5C,SAAK,YAAY,YAAY,KAAK,OAAO;AACzC,SAAK,QAAQ,IAAI,aAAa;AAAA,MAC5B,YAAY,OAAO;AAAA,MACnB,WAAW,OAAO;AAAA,MAClB,gBAAgB,KAAK;AAAA,MACrB,iBAAiB,KAAK;AAAA,IACxB,CAAC;AACD,SAAK,OAAO,KAAK,KAAK,MAAM,YAAY,KAAK,UAAU,KAAK,KAAK,CAAC;AAClE,SAAK,SAAS,IAAI,QAAQ,KAAK,MAAM;AACrC,SAAK,cAAc,IAAI,YAAY,KAAK,YAAY,KAAK,OAAO,CAAC,UAAU;AACzE,cAAQ,IAAI,KAAK;AAAA,IACnB,CAAC;AAED,SAAK,UAAU;AACf,SAAK,sBAAsB,KAAK,oBAAoB,KAAK,IAAI;AAC7D,SAAK,SAAS;AAAA,EAChB;AAAA,EAvCiB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACT,SAAuB;AAAA,EACd,UAA0B,SAAS,cAAc,KAAK;AAAA,EACtD,aAA6B,SAAS,cAAc,KAAK;AAAA,EAClE;AAAA,EACA,cAA4B;AAAA,EACnB,YAA4B;AAAA,EAgCrC,oBAAoB,QAAoB;AAE9C,SAAK,OAAO,YAAY,MAAM;AAG9B,UAAM,iBAAiB,KAAK,OAAO,WAAW;AAC9C,UAAM,IAAkB;AAAA,MACtB,UAAU,KAAK,OAAO;AAAA,MACtB,WAAW,eAAe;AAAA,MAC1B,iBAAiB,eAAe;AAAA,MAChC,UAAU,eAAe;AAAA,MACzB,SAAS,eAAe;AAAA,IAC1B;AACA,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,CAAC;AAAA,IACpB;AAGA,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,YAAY;AAClB,SAAK,YAAY,MAAM,SAAS,KAAK,MAAM,aAAa;AACxD,SAAK,YAAY,MAAM,QAAQ,KAAK,MAAM,YAAY;AACtD,SAAK,YAAY,MAAM,kBAAkB,KAAK,OAAO,mBAAmB;AACxE,SAAK,YAAY,MAAM,WAAW;AAElC,UAAM,aAAa,CAAC,QAAwB;AAC1C,UAAI,MAAM,SAAS;AACnB,UAAI,MAAM,QAAQ;AAClB,UAAI,MAAM,WAAW;AAAA,IACvB;AAEA,eAAW,KAAK,OAAO;AACvB,SAAK,QAAQ,MAAM,SAAS;AAC5B,SAAK,WAAW,MAAM,SAAS;AAC/B,eAAW,KAAK,UAAU;AAAA,EAC5B;AAAA,EAEQ,WAAW;AACjB,UAAM,WAAW,KAAK,OAAO,YAAY;AACzC,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,QAAQ;AACzB,WAAK,QAAQ,YAAY;AAAA,IAC3B;AAGA,QAAI,YAAY,SAAS,eAAe,SAAS,YAAY,OAAO;AAClE,WAAK,YAAY,eAAe,SAAS,YAAY,KAAK;AAAA,IAC5D;AAEA,QAAI,CAAC,UAAU;AAEb,WAAK,SAAS,IAAI,QAAQ,KAAK,MAAM;AACrC,UAAI,KAAK,OAAO,YAAY,GAAG;AAC7B,aAAK,SAAS;AAAA,MAChB;AACA,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,IAAI,KAAK,UAAU,KAAK,aAAa,KAAK,OAAO,CAAC,WAAW;AAC3E,WAAK,oBAAoB,MAAM;AAAA,IACjC,CAAC;AACD,SAAK,cAAc;AACnB,YAAQ,eAAe,KAAK,OAAO;AACnC,WAAO;AAAA,EACT;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,QAAQ;AACzB,WAAK,QAAQ,YAAY;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,cAAwD;AAAA,EAChE,WAAW,SAAyC;AAClD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAgE;AAAA,EACxE,aAAa,SAAqD;AAChE,SAAK,gBAAgB;AAAA,EACvB;AAAA,EACA,UAAU,QAAsB;AAC9B,SAAK,SAAS;AAAA,EAChB;AACF;","names":["DUtil","isNumber","Condition","condition","Rule","tag","Scale","DCss","DStyle","DTimestamp","dto"]}
1
+ {"version":3,"sources":["../src/public-api.ts","../src/engine/history-que.ts","../src/utils/DUtil.ts","../src/rules/condition.ts","../src/rules/rule.ts","../src/rules/rule-engine.ts","../src/engine/next-que.ts","../src/engine/dplayer.ts","../src/engine/scale.ts","../src/Delement/css.ts","../src/Delement/DStyle.ts","../src/common/DTimestamp.ts","../src/page/task-state.ts","../src/Delement/DElement.ts","../src/Delement/Ddiv.ts","../src/Delement/DImg.ts","../src/Delement/DText.ts","../src/Delement/DButton.ts","../src/Delement/element-factory.ts","../src/Delement/button-click-action.ts","../src/events/mq-events.ts","../src/page/Page.ts","../src/page/task.ts","../src/page/task-manager.ts","../src/engine/SchemaEngine.ts"],"sourcesContent":["export * from \"./engine/SchemaResult\";\nexport * from \"./engine/SchemaEngine\";\nexport * from \"./engine/SchemaDto\";\nexport * from \"./engine/page-que-ruleengine-action\";\nexport * from \"./rules/rule\";\nexport * from \"./rules/fact\";\nexport * from \"./rules/rule-engine\";\nexport * from \"./rules/condition\";\nexport * from \"./utils/DUtil\";\n// export * from \"./utils/ID\";\n\nexport * from \"./events/mq-events\";\n\n// ELEMENTS\nexport * from \"./Delement/css\";\nexport * from \"./Delement/DStyle\";\nexport * from \"./Delement/DImg\";\nexport * from \"./Delement/DText\";\nexport * from \"./Delement/DButton\";\nexport * from \"./Delement/Ddiv\";\nexport * from \"./Delement/button-click-action\";\nexport * from \"./Delement/DElement\";\nexport * from \"./Delement/DElement.dto\";\nexport { PageDto } from \"./page/Page\";\nexport * from \"./page/task\";\n","import { Fact } from \"../rules/fact\";\r\nimport { PageResult } from \"../page/page-result\";\r\n\r\nexport class HistoryQue {\r\n private history: PageResult[] = [];\r\n\r\n getFacts(): Array<Fact> {\r\n const answers = this.history.map((h) => h.collectedFacts).flat(1);\r\n // const facts = answers.map((a) => a.fact);\r\n // TODO FIND LATEST FACT (answer) if have multiple.\r\n return answers;\r\n }\r\n\r\n addToHistory(result: PageResult) {\r\n this.history.push(result);\r\n }\r\n}\r\n","// export type RandomObjectId = string & { randomObjectId: true };\r\nexport namespace DUtil {\r\n export const randomString = (length: number): string => {\r\n const letters = \"abcdefghijklmnopqrstuvxyz\";\r\n const uppercase = letters.toUpperCase();\r\n const all = letters + uppercase;\r\n const abs = Math.abs(length);\r\n let result = \"\";\r\n\r\n for (let i = 0; i < abs; i++) {\r\n const char = all.charAt(Math.floor(Math.random() * all.length));\r\n result += char;\r\n }\r\n return result;\r\n };\r\n\r\n export const randomObjectId = () => randomString(32);\r\n\r\n export const deleteProp = <Obj, Key extends keyof Obj>(obj: Obj, key: Key): Omit<Obj, Key> => {\r\n delete obj[key];\r\n return obj;\r\n };\r\n\r\n export const isInRange = (min: number, max: number) => {\r\n return (value: number) => value >= min && value <= max;\r\n };\r\n export const isInfinity = (number: number) => {\r\n return (\r\n number === Number.POSITIVE_INFINITY ||\r\n number === Number.NEGATIVE_INFINITY ||\r\n number === Infinity\r\n );\r\n };\r\n export type NonEmptyArray<T> = [T, ...T[]];\r\n export const isNonEmptyArray = <T>(array: Array<T>): array is NonEmptyArray<T> => {\r\n return array.length > 0;\r\n };\r\n\r\n export const neverCheck = (args: never) => {\r\n console.log(\"OOPS: This value slipped through the never-check\", args);\r\n };\r\n\r\n export const isString = (str: unknown): str is string => typeof str === \"string\";\r\n\r\n export const hasKey = <T extends string>(\r\n obj: unknown,\r\n key: T,\r\n ): obj is Record<typeof key, unknown> => {\r\n if (!isRecord(obj)) {\r\n return false;\r\n }\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n };\r\n\r\n export const isRecord = (obj: unknown): obj is Record<string, unknown> => {\r\n if (!obj) {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return false;\r\n }\r\n\r\n if (typeof obj !== \"object\") {\r\n return false;\r\n }\r\n\r\n if (obj === null) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n export const isBool = (obj?: boolean): obj is boolean => typeof obj === \"boolean\";\r\n\r\n export const isTrue = (bool?: boolean): bool is true => bool === true;\r\n\r\n export const isFalse = (bool?: boolean): bool is false => bool === false;\r\n\r\n export const isDefined = (obj: unknown): boolean => {\r\n const notNull = obj !== null;\r\n const notUndefined = obj !== undefined;\r\n return notNull && notUndefined;\r\n };\r\n\r\n export const hasKind = (obj: unknown): obj is { readonly kind: string } => {\r\n if (!hasKey(obj, \"kind\")) {\r\n return false;\r\n }\r\n if (typeof obj.kind !== \"string\") {\r\n return false;\r\n }\r\n return obj.kind.length > 0;\r\n };\r\n\r\n export const hasValue = (obj: unknown): obj is { value: unknown } => {\r\n return hasKey(obj, \"value\");\r\n };\r\n export const isNumber = (value?: number): value is number => {\r\n const isNumber = typeof value === \"number\";\r\n const notNaN = !Number.isNaN(value);\r\n return isNumber && notNaN;\r\n };\r\n\r\n export const maxFn = (upperLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, upperLimit);\r\n };\r\n };\r\n\r\n export const minFn = (lowerLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, lowerLimit);\r\n };\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\nexport type Condition = Condition.String | Condition.Numeric | Condition.Complex;\r\n\r\nexport namespace Condition {\r\n export type StringOperator = \"eq\" | \"not-eq\" | \"longer-then\" | \"shorter-then\";\r\n\r\n export type NumericOperator =\r\n | \"eq\"\r\n | \"not-eq\"\r\n | \"greater-then\"\r\n | \"less-then\"\r\n | \"greater-then-inclusive\"\r\n | \"less-then-inclusive\";\r\n\r\n export interface Numeric {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"numeric-condition\";\r\n readonly operator: NumericOperator;\r\n readonly value: number;\r\n }\r\n export interface String {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"string-condition\";\r\n readonly operator: StringOperator;\r\n readonly value: string;\r\n }\r\n\r\n export interface Complex {\r\n readonly kind: \"complex-condition\";\r\n readonly name: string;\r\n readonly all: ReadonlyArray<Condition.Simple>;\r\n readonly some: ReadonlyArray<Condition.Simple>;\r\n }\r\n\r\n export type Simple = Condition.String | Condition.Numeric;\r\n\r\n /**\r\n * An empty condition will evaluate to false,\r\n * @param condition: Condition.Any\r\n * @param facts\r\n */\r\n export const evaluate = (condition: Condition, facts: ReadonlyArray<Fact>) => {\r\n let result: boolean = false;\r\n switch (condition.kind) {\r\n case \"string-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"numeric-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"complex-condition\":\r\n result = evaluateComplex(condition, facts);\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateComplex = (condition: Condition.Complex, facts: ReadonlyArray<Fact>): boolean => {\r\n if (condition.some.length === 0 && condition.all.length === 0) {\r\n return false;\r\n }\r\n const allSolved = condition.all.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n\r\n const someEvaluated = condition.some.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n const allResult = allSolved.every(DUtil.isTrue);\r\n const someResult = someEvaluated.length === 0 || someEvaluated.some(DUtil.isTrue);\r\n return someResult && allResult;\r\n };\r\n\r\n const evaluateSimple = (condition: Condition.Simple, facts: ReadonlyArray<Fact>): boolean => {\r\n const fact = facts.find((f) => f.referenceId === condition.referenceId);\r\n if (!fact) {\r\n return false;\r\n }\r\n let res = false;\r\n switch (condition.kind) {\r\n case \"numeric-condition\":\r\n if (fact.kind === \"numeric-fact\") {\r\n res = evaluateNumeric(condition, fact.value);\r\n }\r\n break;\r\n case \"string-condition\":\r\n if (fact.kind === \"string-fact\") {\r\n res = evaluateString(condition, fact.value);\r\n }\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return res;\r\n };\r\n\r\n export const isEmpty = (complex: Complex) => {\r\n return complex.all.length === 0 && complex.some.length === 0;\r\n };\r\n\r\n const evaluateString = (condition: Readonly<Condition.String>, value: string): boolean => {\r\n const operator = condition.operator;\r\n let result = false;\r\n switch (operator) {\r\n case \"eq\":\r\n result = condition.value === value;\r\n break;\r\n case \"not-eq\":\r\n result = condition.value !== value;\r\n break;\r\n case \"shorter-then\":\r\n result = condition.value !== value;\r\n break;\r\n case \"longer-then\":\r\n result = condition.value !== value;\r\n break;\r\n default:\r\n const check: never = operator;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateNumeric = (condition: Numeric, value: number): boolean => {\r\n const op = condition.operator;\r\n const conditionValue = condition.value;\r\n let result = false;\r\n switch (op) {\r\n case \"eq\":\r\n result = value === conditionValue;\r\n break;\r\n case \"not-eq\":\r\n result = value !== conditionValue;\r\n break;\r\n case \"greater-then\":\r\n result = value > conditionValue;\r\n break;\r\n case \"greater-then-inclusive\":\r\n result = value >= conditionValue;\r\n break;\r\n case \"less-then\":\r\n result = value < conditionValue;\r\n break;\r\n case \"less-then-inclusive\":\r\n result = value <= conditionValue;\r\n break;\r\n default:\r\n const check: never = op;\r\n }\r\n return result;\r\n };\r\n\r\n const _getAllSimple = (condition: Condition): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n switch (condition.kind) {\r\n case \"complex-condition\":\r\n simple.push(...condition.all);\r\n simple.push(...condition.some);\r\n break;\r\n case \"numeric-condition\":\r\n simple.push(condition);\r\n break;\r\n case \"string-condition\":\r\n simple.push(condition);\r\n break;\r\n default:\r\n DUtil.neverCheck(condition);\r\n }\r\n return simple;\r\n };\r\n\r\n export const getAllSimpleConditions = (\r\n condition: Condition | Array<Condition>\r\n ): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n if (Array.isArray(condition)) {\r\n condition.forEach((c) => {\r\n simple.push(..._getAllSimple(c));\r\n });\r\n } else {\r\n simple.push(..._getAllSimple(condition));\r\n }\r\n return simple;\r\n };\r\n}\r\n","import { Condition } from \"./condition\";\r\nimport { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\n\r\nexport interface Rule<OnSuccessAction, OnFailureAction> {\r\n readonly id?: string;\r\n readonly description: string;\r\n readonly all: ReadonlyArray<Condition>;\r\n readonly some: ReadonlyArray<Condition>;\r\n readonly onSuccess: ReadonlyArray<OnSuccessAction>;\r\n readonly onFailure: ReadonlyArray<OnFailureAction>;\r\n}\r\n\r\nexport namespace Rule {\r\n /**\r\n * Validates that the rule is valid.\r\n * @param rule\r\n */\r\n\r\n export const isEmpty = (rule: Rule<any, any>): boolean => {\r\n const emptyConditions = rule.all.length === 0 && rule.some.length === 0;\r\n const emptyActions = rule.onSuccess.length === 0 && rule.onFailure.length === 0;\r\n return emptyConditions || emptyActions;\r\n };\r\n\r\n export const solve = (rule: Rule<any, any>, facts: ReadonlyArray<Fact>): boolean => {\r\n if (rule.some.length === 0 && rule.all.length === 0) {\r\n // TODO RETURN WARNING? OR LOGGING ?\r\n return false;\r\n }\r\n\r\n const someSolved = rule.some.map((condition) => Condition.evaluate(condition, facts));\r\n\r\n const someResult = someSolved.length === 0 || someSolved.some(DUtil.isTrue);\r\n\r\n const allSolved = rule.all.map((condition) => Condition.evaluate(condition, facts)).every(DUtil.isTrue);\r\n\r\n return allSolved && someResult;\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { Rule } from \"./rule\";\r\n\r\nexport interface SolveResult<S, F> {\r\n matching: ReadonlyArray<Match<S, F>>;\r\n errors: ReadonlyArray<RuleEngineError>;\r\n}\r\n\r\nexport interface Match<S, F> {\r\n readonly matchingRuleId: string;\r\n readonly ruleDescription: string;\r\n readonly actionList: ReadonlyArray<S> | ReadonlyArray<F>;\r\n}\r\n\r\nexport interface RuleEngineError {\r\n readonly kind?: string;\r\n readonly message: string;\r\n}\r\n\r\nexport class RuleEngine<S, F> {\r\n constructor() {}\r\n\r\n solveAll(rules: Rule<S, F>[], facts: Fact[]): SolveResult<S, F> {\r\n const errors: RuleEngineError[] = [];\r\n const matching: Match<S, F>[] = [];\r\n rules.forEach((rule) => {\r\n if (Rule.isEmpty(rule)) {\r\n errors.push({ message: \"Empty rule: \" + rule.id });\r\n } else if (Rule.solve(rule, facts)) {\r\n const match: Match<S, F> = {\r\n ruleDescription: rule.description,\r\n matchingRuleId: rule.id ?? \"no-id-given\",\r\n actionList: [...rule.onSuccess],\r\n };\r\n matching.push(match);\r\n }\r\n });\r\n return { matching, errors };\r\n }\r\n\r\n solve(rule: Rule<S, F>, facts: Fact[]): boolean {\r\n // TODO Validate, and Return result\r\n return Rule.solve(rule, facts);\r\n }\r\n}\r\n","import { PageDto } from \"../page/Page\";\r\n\r\nexport class NextQue {\r\n private originalOrder: ReadonlyArray<string> = [];\r\n private allPages: PageDto[] = [];\r\n private excludedTags = new Set<string>();\r\n private excludedByPageId = new Set<string>();\r\n private remaining: PageDto[] = [];\r\n constructor(pages: PageDto[] = []) {\r\n this.resetQue(pages);\r\n }\r\n\r\n /**\r\n * Will reset que with the new pages.\r\n * @param pages\r\n */\r\n resetQue(pages: PageDto[]) {\r\n this.allPages = [...pages];\r\n this.remaining = [...pages];\r\n this.excludedTags = new Set();\r\n this.excludedByPageId = new Set();\r\n this.originalOrder = this.allPages.map((p) => p.id);\r\n }\r\n\r\n pop(): PageDto | false {\r\n const next = this.remaining.shift();\r\n // TODO CLONE??\r\n return next ?? false;\r\n }\r\n\r\n peek(): PageDto | false {\r\n const next = this.remaining[0];\r\n return next ?? false;\r\n }\r\n\r\n jumpToPageById(pageId: string): boolean {\r\n const index = this.remaining.findIndex((p) => p.id === pageId);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this.remaining = this.remaining.slice(index);\r\n return true;\r\n }\r\n\r\n removeByTag(tag: string | string[]) {\r\n if (Array.isArray(tag)) {\r\n tag.forEach((tag) => {\r\n this.excludedTags.add(tag);\r\n });\r\n } else {\r\n this.excludedTags.add(tag);\r\n }\r\n this.filterRemaining();\r\n }\r\n\r\n /**\r\n * Will not be included\r\n * @param pages\r\n */\r\n insertAsNextByForce(pages: PageDto[]) {\r\n this.remaining.unshift(...pages);\r\n }\r\n\r\n removeByPageId(pageId: string | string[]) {\r\n if (Array.isArray(pageId)) {\r\n pageId.forEach((id) => {\r\n this.excludedByPageId.add(id);\r\n });\r\n } else {\r\n this.excludedByPageId.add(pageId);\r\n }\r\n this.filterRemaining();\r\n // this.excludedByPageId.add(pageId);\r\n }\r\n\r\n private filterRemaining() {\r\n this.remaining = this.remaining.filter((p) => {\r\n const tags = p.tags ?? [];\r\n const isIncluededByTag = !tags.some((tag) => this.excludedTags.has(tag));\r\n const isIncludedByPageId = !this.excludedByPageId.has(p.id);\r\n return isIncludedByPageId && isIncluededByTag;\r\n });\r\n }\r\n get isEmpty(): boolean {\r\n return this.remaining.length === 0;\r\n }\r\n\r\n /**\r\n * Total number of pages left in que\r\n */\r\n get size(): number {\r\n return this.remaining.length;\r\n }\r\n\r\n /**\r\n * Total number of pages in test\r\n */\r\n get pageCount(): number {\r\n return this.originalOrder.length;\r\n }\r\n}\r\n","import { HistoryQue } from \"./history-que\";\nimport { RuleEngine } from \"../rules/rule-engine\";\nimport { NextQue } from \"./next-que\";\nimport { SchemaDto } from \"./SchemaDto\";\nimport { RuleActionPageQue } from \"./page-que-ruleengine-action\";\nimport { PageDto } from \"../page/Page\";\nimport { PageResult } from \"../page/page-result\";\nimport { Fact } from \"../rules/fact\";\nimport { MqEvent } from \"../events/mq-events\";\n\nexport type DPlayerData = Pick<SchemaDto, \"pages\" | \"pageSequences\" | \"rules\" | \"predefinedFacts\">;\nexport class DPlayer {\n private readonly eventLog: Array<MqEvent> = [];\n private history = new HistoryQue();\n private ruleEngine = new RuleEngine<RuleActionPageQue, never>();\n private nextQue = new NextQue();\n private data: DPlayerData;\n private readonly predefinedFacts: ReadonlyArray<Fact>;\n\n constructor(data: DPlayerData) {\n this.data = data;\n const pages = data.pages ?? [];\n this.predefinedFacts = data.predefinedFacts ? [...data.predefinedFacts] : [];\n this.nextQue.resetQue(pages);\n }\n\n saveEvent(event: MqEvent) {\n this.eventLog.push(event);\n }\n\n saveHistory(pageHistory: PageResult) {\n // console.log(\"SAVE HISTORY\", pageHistory);\n this.history.addToHistory(pageHistory);\n this.eventLog.push(...pageHistory.eventLog);\n // Evaluate rules\n const userGeneratedFact = this.history.getFacts();\n const predefinedFacts = this.predefinedFacts;\n const facts = [...userGeneratedFact, ...predefinedFacts];\n const result = this.ruleEngine.solveAll(this.data.rules, facts);\n\n const matchingRules = result.matching;\n const actions = matchingRules.map((r) => r.actionList).flat(1);\n // Execute actions\n actions.forEach((a) => {\n // console.log(a.payload);\n switch (a.kind) {\n case \"jumpToPage\":\n this.nextQue.jumpToPageById(a.pageId);\n break;\n case \"excludeByPageId\":\n this.nextQue.removeByPageId(a.pageIds);\n break;\n case \"excludeByTag\":\n this.nextQue.removeByTag(a.tagIds);\n break;\n default:\n console.log(\"UNKNOWN ACTION\", a);\n const check: never = a;\n }\n });\n }\n\n getResults() {\n const pagesLeft = this.nextQue.size;\n const answerFacts = this.history.getFacts();\n const predefinedFacts = this.predefinedFacts;\n const eventLog = [...this.eventLog];\n // console.log(answerFacts);\n return { answerFacts, predefinedFacts, eventLog, pagesLeft };\n }\n\n insertSequence(sequenceId: string) {\n this.insertSequenceById(sequenceId);\n }\n\n getNextPage(): PageDto | false {\n const next = this.nextQue.pop();\n return next ?? false;\n }\n\n private insertSequenceById(id: string) {\n const seq = this.data.pageSequences?.find((s) => s.id === id);\n if (seq) {\n this.nextQue.insertAsNextByForce([...seq.pages]);\n } else {\n // HOW TO HANDLE INVALID ID_REFS?? LOGGER??\n // LOG INVALID COMMAND.\n }\n }\n\n /**\n * Total number of pages left in que\n */\n get pagesLeft(): number {\n return this.nextQue.pageCount;\n }\n\n /**\n * Total number of pages in test\n */\n get totalPageCount(): number {\n return this.data.pages.length;\n }\n}\n","export class ScaleService {\r\n private readonly baseHeight;\r\n private readonly baseWidth;\r\n private containerHeight = 1300;\r\n private containerWidth = 1300;\r\n\r\n get scale() {\r\n return this._scale;\r\n }\r\n\r\n get pageHeight() {\r\n return this.baseHeight * this.scale;\r\n }\r\n get pageWidth() {\r\n return this.baseWidth * this._scale;\r\n }\r\n\r\n private _scale = 1;\r\n\r\n private readonly subscribers = new Set<(scale: number) => void>();\r\n\r\n constructor(config: { baseHeight: number; baseWidth: number; containerHeight: number; containerWidth: number }) {\r\n this.baseHeight = config.baseHeight;\r\n this.baseWidth = config.baseWidth;\r\n this.containerHeight = config.containerHeight;\r\n this.containerWidth = config.containerWidth;\r\n this.updateScale();\r\n }\r\n\r\n setContainerBounds(bounds: { height: number; width: number }) {\r\n this.containerWidth = bounds.width;\r\n this.containerHeight = bounds.height;\r\n this.updateScale();\r\n }\r\n private updateScale() {\r\n const scaleFn = Scale.calc(this.baseHeight, this.baseWidth);\r\n const scale = scaleFn({ height: this.containerHeight, width: this.containerWidth });\r\n const hasChanged = this.scale !== scale;\r\n this._scale = scale;\r\n if (hasChanged) {\r\n this.subscribers.forEach((fn) => {\r\n fn(this._scale);\r\n });\r\n }\r\n }\r\n\r\n onChange(scaleChangeHandler: (scale: number) => void, subscriberId: string) {\r\n // console.log(subscriberId);\r\n this.subscribers.add(scaleChangeHandler);\r\n scaleChangeHandler(this._scale);\r\n return () => {\r\n this.subscribers.delete(scaleChangeHandler);\r\n };\r\n }\r\n}\r\nexport namespace Scale {\r\n export const calc = (baseHeight: number, baseWidth: number) => {\r\n return (container: { height: number; width: number }) => {\r\n const heightRatio = container.height / baseHeight;\r\n const widthRatio = container.width / baseWidth;\r\n return Math.min(heightRatio, widthRatio);\r\n };\r\n };\r\n\r\n type ScalePosInput = { x: number; y: number; h: number; w: number };\r\n\r\n export const scaleFunctionCreator = (scale: number) => {\r\n return (value: number) => value * scale;\r\n };\r\n}\r\n","import { DUtil } from \"../utils/DUtil\";\n\nexport namespace DCss {\n export interface Px {\n readonly _unit: \"px\";\n readonly value: number;\n }\n\n export type LengthString = `${number}px` | `${number}%`;\n export interface Percent {\n readonly _unit: \"percent\";\n readonly value: number;\n }\n\n export type LengthUnit = Px | Percent | number;\n\n /**\n * Will scale to 3% of baseScale\n * @param unit\n * @param scale\n */\n export const toString = (unit: Readonly<LengthUnit>, scale: number): LengthString => {\n const _mapped: Percent | Px =\n typeof unit === \"number\" ? { _unit: \"percent\", value: unit } : unit;\n return _toString(_mapped, scale);\n };\n const _toString = (unit: Readonly<Percent | Px>, scale: number): LengthString => {\n const clampedScale = Math.max(scale, 0.03);\n if (unit._unit === \"px\") {\n if (unit.value < 0.1) {\n return \"0px\";\n }\n\n const rounded = Math.round(unit.value * clampedScale);\n const clamped = Math.max(rounded, 1);\n return (clamped + \"px\") as LengthString;\n }\n return (unit.value + \"%\") as LengthString;\n };\n\n export const isLengthUnit = (unit?: LengthUnit): unit is LengthUnit => {\n if (typeof unit === \"number\") {\n return true;\n }\n\n if (!unit) {\n return false;\n }\n\n const unitKey: keyof DCss.Px = \"_unit\";\n const valueKey: keyof DCss.Px = \"value\";\n const hasUnitKey = DUtil.hasKey(unit, unitKey);\n const hasValueKey = DUtil.hasKey(unit, valueKey);\n return hasUnitKey && hasValueKey;\n };\n}\n","import { DCss } from \"./css\";\nimport { DUtil } from \"../utils/DUtil\";\n\nexport type PStyle = Partial<DStyle>;\nexport interface DStyle {\n opacity: number;\n backgroundColor: string;\n visibility: \"visible\" | \"hidden\";\n cursor:\n | \"pointer\"\n | \"help\"\n | \"copy\"\n | \"wait\"\n | \"not-allowed\"\n | \"context-menu\"\n | \"move\"\n | \"grabbing\"\n | \"grab\"\n | \"zoom-in\"\n | \"zoom-out\"\n | \"none\"\n | \"auto\"\n | \"default\";\n\n zIndex: number;\n // POSITION\n h: number;\n w: number;\n x: number;\n y: number;\n height: DCss.LengthUnit;\n maxHeight: DCss.LengthUnit;\n minHeight: DCss.LengthUnit;\n width: DCss.LengthUnit;\n maxWidth: DCss.LengthUnit;\n minWidth: DCss.LengthUnit;\n bottom: DCss.LengthUnit;\n top: DCss.LengthUnit;\n left: DCss.LengthUnit;\n right: DCss.LengthUnit;\n boxShadow: string;\n\n // BORDERS\n borderStyle: \"solid\" | \"none\" | \"dotted\" | \"dashed\";\n borderRadius: DCss.Px | DCss.Percent;\n borderWidth: DCss.Px;\n borderColor: string;\n\n margin: DCss.Px | DCss.Percent;\n padding: DCss.Px | DCss.Percent;\n paddingLeft: DCss.Px | DCss.Percent;\n paddingRight: DCss.Px | DCss.Percent;\n paddingTop: DCss.Px | DCss.Percent;\n paddingBottom: DCss.Px | DCss.Percent;\n\n // Translate\n transform: string;\n translate: string;\n\n // TEXT\n fontSize: DCss.Px;\n textColor: string;\n fontWeight: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n textAlign: \"right\" | \"left\" | \"center\";\n letterSpacing: DCss.Px;\n lineHeight: number;\n\n // LAYOUT & POSITIONING OVERRIDE\n position: \"absolute\" | \"relative\";\n display: \"flex\" | \"block\";\n flexDirection: \"row\" | \"colum\";\n flexWrap: \"nowrap\" | \"wrap\";\n justifyContent:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"space-around\"\n | \"space-evenly\"\n | \"space-between\";\n alignItems: \"stretch\" | \"baseline\" | \"center\" | \"flex-start\" | \"flex-end\";\n gap: DCss.Px;\n alignContent:\n | \"stretch\"\n | \"center\"\n | \"flex-start\"\n | \"flex-end\"\n | \"space-around\"\n | \"space-evenly\"\n | \"space-between\";\n}\n\nexport namespace DStyle {\n import isNumber = DUtil.isNumber;\n import isLengthUnit = DCss.isLengthUnit;\n export const normalize = <T extends HTMLElement>(el: T): T => {\n const s = el.style;\n // el.style.padding = \"\";\n // el.style.margin = \"\";\n // el.style.position = \"absolute\";\n // el.style.boxSizing = \"border-box\";\n s.position = \"absolute\";\n s.boxSizing = \"border-box\";\n s.bottom = \"\";\n s.top = \"\";\n s.left = \"\";\n s.right = \"\";\n s.boxShadow = \"\";\n s.padding = \"0px\";\n s.margin = \"0px\";\n s.fontSize = \"12px\";\n s.lineHeight = \"1\";\n s.textAlign = \"center\";\n s.textDecoration = \"none\";\n s.boxShadow = \"\";\n s.boxSizing = \"border-box\";\n s.fontWeight = \"500\";\n s.borderStyle = \"\";\n s.borderRadius = \"\";\n s.borderWidth = \"\";\n s.borderWidth = \"10px\";\n s.borderColor = \"black\";\n s.backgroundColor = \"\";\n s.border = \"\";\n s.borderStyle = \"none\";\n s.outline = \"\";\n s.wordSpacing = \"\";\n s.userSelect = \"none\";\n s.textShadow = \"\";\n return el;\n };\n\n export const applyStyles = <T extends HTMLElement>(\n el: T,\n style: Partial<DStyle>,\n scale: number,\n ): T => {\n // const scalePx = DCss.toStringCre(this.scale);\n const {\n x,\n y,\n left,\n right,\n top,\n bottom,\n backgroundColor,\n borderColor,\n borderWidth,\n borderRadius,\n borderStyle,\n w,\n opacity,\n cursor,\n fontSize,\n fontWeight,\n lineHeight,\n textColor,\n textAlign,\n translate,\n margin,\n padding,\n letterSpacing,\n h,\n height,\n width,\n transform,\n visibility,\n justifyContent,\n alignContent,\n flexWrap,\n display,\n flexDirection,\n alignItems,\n position,\n paddingLeft,\n paddingTop,\n paddingRight,\n paddingBottom,\n gap,\n\n zIndex,\n //\n boxShadow,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n } = style;\n\n if (typeof zIndex === \"number\") {\n el.style.zIndex = \"\" + zIndex;\n }\n\n if (DCss.isLengthUnit(minWidth)) {\n el.style.minWidth = DCss.toString(minWidth, scale);\n }\n\n if (DCss.isLengthUnit(maxWidth)) {\n el.style.maxWidth = DCss.toString(maxWidth, scale);\n }\n\n if (typeof lineHeight === \"number\") {\n el.style.lineHeight = \"\" + lineHeight;\n }\n\n if (DCss.isLengthUnit(minHeight)) {\n el.style.minHeight = DCss.toString(minHeight, scale);\n }\n\n if (DCss.isLengthUnit(maxHeight)) {\n el.style.maxHeight = DCss.toString(maxHeight, scale);\n }\n\n if (boxShadow) {\n el.style.boxShadow = boxShadow;\n }\n\n if (gap) {\n el.style.gap = DCss.toString(gap, scale);\n }\n\n if (paddingLeft) {\n el.style.paddingLeft = DCss.toString(paddingLeft, scale);\n }\n\n if (paddingRight) {\n el.style.paddingRight = DCss.toString(paddingRight, scale);\n }\n\n if (paddingTop) {\n el.style.paddingTop = DCss.toString(paddingTop, scale);\n }\n\n if (paddingBottom) {\n el.style.paddingBottom = DCss.toString(paddingBottom, scale);\n }\n\n if (position) {\n el.style.position = position;\n }\n if (justifyContent) {\n el.style.justifyContent = justifyContent;\n }\n\n if (alignContent) {\n el.style.alignContent = alignContent;\n }\n if (flexWrap) {\n el.style.flexWrap = flexWrap;\n }\n if (display) {\n el.style.display = display;\n }\n if (flexDirection) {\n el.style.flexDirection = flexDirection;\n }\n if (alignItems) {\n el.style.alignItems = alignItems;\n }\n\n // this.el.style.fontWeight = '900';\n if (backgroundColor) {\n el.style.backgroundColor = backgroundColor;\n }\n\n if (cursor) {\n el.style.cursor = cursor;\n }\n\n if (transform) {\n el.style.transform = transform;\n }\n\n if (textColor) {\n el.style.color = textColor;\n }\n if (textAlign) {\n el.style.textAlign = textAlign;\n }\n\n if (borderColor) {\n el.style.borderColor = borderColor;\n }\n\n if (borderWidth) {\n el.style.borderWidth = DCss.toString(borderWidth, scale);\n }\n\n if (fontWeight) {\n el.style.fontWeight = fontWeight + \"\";\n }\n\n if (borderStyle) {\n el.style.borderStyle = borderStyle;\n }\n\n if (fontSize) {\n el.style.fontSize = DCss.toString(fontSize, scale);\n }\n\n if (DUtil.isNumber(x)) {\n el.style.left = x + \"%\";\n }\n\n if (DUtil.isNumber(y)) {\n el.style.bottom = y + \"%\";\n }\n\n if (DCss.isLengthUnit(height)) {\n el.style.height = DCss.toString(height, scale);\n }\n\n if (DCss.isLengthUnit(width)) {\n el.style.width = DCss.toString(width, scale);\n }\n\n if (DCss.isLengthUnit(left)) {\n el.style.left = DCss.toString(left, scale);\n }\n\n if (DCss.isLengthUnit(right)) {\n el.style.right = DCss.toString(right, scale);\n }\n\n if (DCss.isLengthUnit(bottom)) {\n el.style.bottom = DCss.toString(bottom, scale);\n }\n\n if (DCss.isLengthUnit(top)) {\n el.style.top = DCss.toString(top, scale);\n }\n\n if (DUtil.isNumber(h)) {\n el.style.height = DCss.toString(h, scale);\n }\n\n if (isNumber(w)) {\n el.style.width = DCss.toString(w, scale);\n }\n\n if (DCss.isLengthUnit(borderRadius)) {\n el.style.borderRadius = DCss.toString(borderRadius, scale);\n }\n\n if (letterSpacing) {\n el.style.letterSpacing = DCss.toString(letterSpacing, scale);\n }\n\n if (margin) {\n el.style.margin = DCss.toString(margin, scale);\n }\n\n if (padding) {\n el.style.padding = DCss.toString(padding, scale);\n }\n\n if (isNumber(opacity)) {\n el.style.opacity = opacity + \"\";\n }\n\n if (visibility) {\n el.style.visibility = visibility;\n }\n return el;\n };\n\n // const propNames = new Set(...ElementKeyNames);\n // export const validKey = (keyName: string) => propNames.has(keyName);\n}\n","export type DTimestamp = number & { __timestamp__: true };\r\nexport namespace DTimestamp {\r\n export const now = () => Date.now() as DTimestamp;\r\n export type Diff = number & { __diff__: true };\r\n\r\n export const addMills = (t: DTimestamp, ms: number): DTimestamp => {\r\n const res = t + Math.abs(ms);\r\n return res as DTimestamp;\r\n };\r\n\r\n export const diff = (t1: DTimestamp, t2: DTimestamp): Diff => {\r\n const t1Abs = Math.abs(t1);\r\n const t2Abs = Math.abs(t2);\r\n return Math.abs(t1Abs - t2Abs) as Diff;\r\n };\r\n\r\n export const diffNow = (t: DTimestamp): Diff => {\r\n return diff(t, now());\r\n };\r\n}\r\n","import { DTimestamp } from \"../common/DTimestamp\";\nimport diff = DTimestamp.diff;\n\nexport type TaskState = {\n audioIsPlaying: boolean;\n isGifMode: boolean;\n videoPlayState:\n | \"playing\"\n | \"paused\"\n | \"ended\"\n | \"playing-and-muted\"\n | \"paused-and-muted\"\n | \"ended-and-muted\";\n blockFormInput: boolean;\n blockResponseButton: boolean;\n blockAudio: boolean;\n blockVideo: boolean;\n};\n\nexport type TaskStateDiff = Partial<TaskState> & { __diffed__: true };\nexport const TaskState = {\n eq: (a: TaskState, b: TaskState) => {\n return (\n a.audioIsPlaying === b.audioIsPlaying &&\n a.isGifMode === b.isGifMode &&\n a.videoPlayState === b.videoPlayState &&\n a.blockFormInput === b.blockFormInput &&\n a.blockResponseButton === b.blockResponseButton &&\n a.blockAudio === b.blockAudio &&\n a.blockVideo === b.blockVideo\n );\n },\n\n getDiff: (curr: TaskState, prev: TaskState | false): TaskStateDiff => {\n if (prev === false) {\n return curr as TaskStateDiff;\n }\n\n const diff = {} as TaskStateDiff;\n\n if (curr.audioIsPlaying !== prev.audioIsPlaying) {\n diff.audioIsPlaying = curr.audioIsPlaying;\n }\n if (curr.isGifMode !== prev.isGifMode) {\n diff.isGifMode = curr.isGifMode;\n }\n if (curr.videoPlayState !== prev.videoPlayState) {\n diff.videoPlayState = curr.videoPlayState;\n }\n\n if (curr.blockFormInput !== prev.blockFormInput) {\n diff.blockFormInput = curr.blockFormInput;\n }\n if (curr.blockResponseButton !== prev.blockResponseButton) {\n diff.blockResponseButton = curr.blockResponseButton;\n }\n if (curr.blockAudio !== prev.blockAudio) {\n diff.blockAudio = curr.blockAudio;\n }\n if (curr.blockVideo !== prev.blockVideo) {\n diff.blockVideo = curr.blockVideo;\n }\n return diff;\n },\n};\n","import { DStyle, PStyle } from \"./DStyle\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\nimport { TaskState, TaskStateDiff } from \"../page/task-state\";\n\nexport interface DElementBaseDto {\n readonly style: PStyle;\n readonly onMouseEnter?: PStyle;\n readonly onMouseLeave?: PStyle;\n readonly onMouseDown?: PStyle;\n readonly onMouseUp?: PStyle;\n readonly innerText?: string;\n\n // ACTIONS HANDLERS\n readonly onClick?: ButtonClickAction;\n\n // VIDEO STATED\n readonly whenVideoPaused?: PStyle;\n readonly whenVideoPausedAndMuted?: PStyle;\n readonly whenVideoEnded?: PStyle;\n readonly whenVideoEndedAndMuted?: PStyle;\n readonly whenVideoPlaying?: PStyle;\n readonly whenVideoPlayingAndMuted?: PStyle;\n\n readonly whenAudioPlaying?: PStyle;\n readonly whenAudioPaused?: PStyle;\n readonly whenAudioBlocked?: PStyle;\n readonly whenVideoBlocked?: PStyle;\n readonly whenAudioUnblocked?: PStyle;\n readonly whenVideoUnblocked?: PStyle;\n readonly whenResponseBlocked?: PStyle;\n readonly whenResponseUnblocked?: PStyle;\n readonly whenFormInputBlocked?: PStyle;\n readonly whenFormInputUnblocked?: PStyle;\n}\n\nconst isFalse = (bool?: boolean): bool is false => bool === false;\nconst isTrue = (bool?: boolean): bool is true => bool === true;\n\nexport abstract class DElement<T extends HTMLElement> {\n private prevState: TaskState | false = false;\n\n protected currStyle: Partial<DStyle> = {\n fontSize: { _unit: \"px\", value: 100 },\n fontWeight: 500,\n textColor: \"black\",\n opacity: 1,\n };\n\n protected constructor(\n protected readonly el: T,\n protected readonly dto: DElementBaseDto,\n protected readonly scale: ScaleService,\n ) {\n if (dto.innerText) {\n this.el.innerText = dto.innerText;\n }\n this.setStyle = this.setStyle.bind(this);\n // this.normalize = this.normalize.bind(this);\n this.appendYourself = this.appendYourself.bind(this);\n this.updateStyles = this.updateStyles.bind(this);\n const { onMouseEnter, onMouseLeave } = dto;\n\n if (onMouseEnter) {\n this.el.onmouseenter = () => {\n this.setStyle(onMouseEnter);\n };\n }\n if (onMouseLeave) {\n this.el.onmouseleave = () => {\n this.setStyle(onMouseLeave);\n };\n }\n\n DStyle.normalize(this.el);\n\n if (dto) {\n this.updateStyles(dto?.style);\n }\n }\n\n /**\n * This method is called when the element is clicked.\n * This method shall be overridden by the pageClass.\n * @param style\n */\n setStyle(style: PStyle) {\n this.updateStyles(style);\n }\n\n getElementByDangerousReference() {\n return this.el;\n }\n\n appendYourself(parent: { append: (el: HTMLElement) => void }) {\n parent.append(this.el);\n // console.log(parent);\n }\n\n updateState(state: TaskStateDiff) {\n this.handleStateChanges(state);\n }\n\n setState(state: TaskState) {\n const prev = this.prevState;\n const diff = TaskState.getDiff(state, prev);\n this.prevState = state;\n if (Object.keys(diff).length > 0) {\n this.handleStateChanges(diff);\n }\n }\n\n private handleStateChanges(diff: TaskStateDiff) {\n const {\n audioIsPlaying,\n videoPlayState,\n blockAudio,\n blockVideo,\n blockResponseButton,\n blockFormInput,\n isGifMode,\n } = diff;\n const {\n whenAudioPaused,\n whenVideoPaused,\n whenAudioPlaying,\n whenFormInputBlocked,\n whenResponseBlocked,\n\n whenVideoPlaying,\n whenVideoEnded,\n\n whenAudioBlocked,\n whenVideoBlocked,\n whenAudioUnblocked,\n whenVideoUnblocked,\n whenResponseUnblocked,\n whenFormInputUnblocked,\n whenVideoPausedAndMuted,\n whenVideoEndedAndMuted,\n whenVideoPlayingAndMuted,\n } = this.dto;\n\n if (isTrue(audioIsPlaying) && whenAudioPlaying) {\n this.setStyle(whenAudioPlaying);\n }\n\n if (isFalse(audioIsPlaying) && whenAudioPaused) {\n this.setStyle(whenAudioPaused);\n }\n\n if (videoPlayState === \"playing\" && whenVideoPlaying) {\n this.setStyle(whenVideoPlaying);\n }\n\n if (videoPlayState === \"paused\" && whenVideoPaused) {\n this.setStyle(whenVideoPaused);\n }\n\n if (videoPlayState === \"ended\" && whenVideoEnded) {\n this.setStyle(whenVideoEnded);\n }\n if (videoPlayState === \"playing-and-muted\" && whenVideoPlayingAndMuted) {\n this.setStyle(whenVideoPlayingAndMuted);\n }\n\n if (videoPlayState === \"paused-and-muted\" && whenVideoPausedAndMuted) {\n this.setStyle(whenVideoPausedAndMuted);\n }\n\n if (videoPlayState === \"ended-and-muted\" && whenVideoEndedAndMuted) {\n this.setStyle(whenVideoEndedAndMuted);\n }\n }\n\n // private normalize() {\n // this.el.style.padding = \"0\";\n // this.el.style.margin = \"0\";\n // this.el.style.position = \"absolute\";\n // this.el.style.boxSizing = \"border-box\";\n // }\n\n abstract registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void;\n\n protected updateStyles(style: Partial<DStyle>) {\n this.currStyle = Object.assign(this.currStyle, style);\n DStyle.applyStyles(this.el, this.currStyle, this.scale.scale);\n window.getComputedStyle(this.el);\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { DText, DTextDto } from \"./DText\";\nimport { DImg, DImgDto } from \"./DImg\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DButton, DButtonDto } from \"./DButton\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DDivDto extends DElementBaseDto {\n readonly _tag: \"div\";\n readonly children: Array<DTextDto | DImgDto | DButtonDto>;\n}\n\nexport class DDiv extends DElement<HTMLDivElement> {\n private readonly TAG = \"[ DDiv ]: \";\n protected readonly defaultStyle = { x: 22, y: 4 };\n private children: Array<DText | DImg | DButton> = [];\n\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n this.children.forEach((child) => {\n child.registerClickHandler(clickHandler);\n });\n }\n\n constructor(dto: DDivDto, scale: ScaleService, children: Array<DText | DImg | DButton>) {\n const d = document.createElement(\"div\");\n super(d, dto, scale);\n this.children = children;\n\n this.children.forEach((child) => {\n child.appendYourself(this.el);\n });\n }\n protected whenConstructed() {\n this.children.forEach((child) => {\n console.log(child);\n });\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DTimestamp } from \"../common/DTimestamp\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DImgDto extends DElementBaseDto {\n readonly _tag: \"img\";\n // readonly id: string;\n readonly url: string;\n}\n\nexport class DImg extends DElement<HTMLImageElement> {\n private static IMAGE_COUNT = 0;\n private readonly imageCount: number;\n readonly TAG: string;\n readonly TIMING_TAG: string;\n private readonly loadStart: DTimestamp;\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n }\n\n constructor(\n protected readonly dto: DImgDto,\n readonly scaleService: ScaleService,\n ) {\n super(document.createElement(\"img\"), dto, scaleService);\n DImg.IMAGE_COUNT += 1;\n this.imageCount = DImg.IMAGE_COUNT;\n this.TAG = \"[D_IMG \" + DImg.IMAGE_COUNT + \" ]: \";\n this.TIMING_TAG = \"load-time (\" + DImg.IMAGE_COUNT + \") \";\n this.el.loading = \"eager\";\n this.el.style.position = \"absolute\";\n this.setStyle(dto.style);\n\n this.loadStart = DTimestamp.now();\n this.el.onload = () => {};\n this.el.onerror = () => {};\n this.el.src = dto.url;\n console.time(this.TIMING_TAG);\n }\n\n log(): void {}\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DTextDto extends DElementBaseDto {\n readonly _tag: \"p\";\n readonly innerText: string;\n}\n\nexport class DText extends DElement<HTMLParagraphElement> {\n constructor(dto: DTextDto, scale: ScaleService) {\n super(document.createElement(\"p\"), dto, scale);\n }\n\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const onClick = this.dto.onClick;\n if (onClick) {\n clickHandler(onClick);\n }\n };\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DButtonDto extends DElementBaseDto {\n readonly _tag: \"button\";\n}\n\nexport class DButton extends DElement<HTMLButtonElement> {\n private readonly TAG = \"[ DDiv ]: \";\n protected readonly defaultStyle = { x: 40, y: 40 };\n\n constructor(dto: DButtonDto, scale: ScaleService) {\n const d = document.createElement(\"button\");\n super(d, dto, scale);\n }\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n }\n}\n","import { DElement } from \"./DElement\";\nimport { DDiv, DDivDto } from \"./Ddiv\";\nimport { DImg } from \"./DImg\";\nimport { DText } from \"./DText\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DElementDto } from \"./DElement.dto\";\nimport { DButton } from \"./DButton\";\n\nexport const createDElement = (dto: DElementDto, scale: ScaleService): DElement<any> => {\n switch (dto._tag) {\n case \"div\":\n const childEls = createChildrenForDiv(dto, scale);\n return new DDiv(dto, scale, childEls);\n case \"img\":\n return new DImg(dto, scale);\n case \"p\":\n return new DText(dto, scale);\n case \"button\":\n return new DButton(dto, scale);\n default:\n const check: never = dto;\n throw new Error(\"Unknown dto given to the createDElement function.\");\n // TODO LOGGING or create any HTML-ELEMENT??\n }\n};\n\nconst createChildrenForDiv = (dto: DDivDto, scale: ScaleService): DDiv[\"children\"] => {\n const childDto = dto.children;\n const childEls: Array<DImg | DText | DButton> = [];\n childDto.forEach((dto) => {\n switch (dto._tag) {\n case \"p\":\n const newText = new DText(dto, scale);\n childEls.push(newText);\n break;\n case \"img\":\n const newImage = new DImg(dto, scale);\n childEls.push(newImage);\n break;\n case \"button\":\n const newButton = new DButton(dto, scale);\n childEls.push(newButton);\n break;\n default:\n const check: never = dto;\n }\n });\n return childEls;\n};\n","import { PlayAudioTask, PlayVideoTask } from \"../page/task\";\nimport { Fact } from \"../rules/fact\";\n\nexport type ButtonClickAction =\n | { kind: \"play-audio\"; task: PlayAudioTask; vibrateMs?: number }\n | { kind: \"pause-audio\"; vibrateMs?: number }\n | { kind: \"play-video\"; task: PlayVideoTask; vibrateMs?: number }\n | { kind: \"mute-video\"; vibrateMs?: number }\n | { kind: \"un-mute-video\"; vibrateMs?: number }\n | { kind: \"pause-video\"; vibrateMs?: number }\n | { kind: \"submit-fact\"; fact: Fact; vibrateMs?: number }\n | { kind: \"next-page\"; vibrateMs?: number }\n | { kind: \"submit-form\"; vibrateMs?: number };\n\n// export type ButtonClickAction = _ButtonClickAction & ;\nexport const ButtonClickAction = {\n describe: (a: ButtonClickAction): string => {\n switch (a.kind) {\n case \"next-page\":\n return \"go to next page\";\n case \"play-video\":\n return \"VideoId = \" + a.task.videoId;\n case \"play-audio\":\n return \"AudioId = \" + a.task.audioId;\n case \"pause-video\":\n return \"\";\n case \"pause-audio\":\n return \"\";\n case \"submit-fact\":\n return a.fact.label + \" = \" + a.fact.value;\n case \"submit-form\":\n return \"\";\n case \"mute-video\":\n return \"mute-video\";\n case \"un-mute-video\":\n return \"un-mute-video\";\n default:\n const _exhaustiveCheck: never = a;\n return \"\";\n }\n },\n};\n","import { DTimestamp } from \"../common/DTimestamp\";\r\n\r\ninterface _MqEvent<K extends string, P extends object> {\r\n readonly kind: K;\r\n readonly timestamp: DTimestamp;\r\n readonly payload: P;\r\n}\r\n\r\nexport type MqEventEngineStart = _MqEvent<\r\n \"engine-start\",\r\n {\r\n readonly schemaId: string;\r\n readonly schemaPrefix: string;\r\n }\r\n>;\r\nexport interface MqEventPageEnter\r\n extends _MqEvent<\"page-enter\", { readonly pageId: string; readonly pagePrefix: string }> {}\r\nexport interface MqEventPageLeave\r\n extends _MqEvent<\"page-leave\", { readonly pageId: string; readonly pagePrefix: string }> {}\r\n\r\nexport type MqEventUserClicked = _MqEvent<\r\n \"user-clicked\",\r\n { readonly pageId: string; pagePrefix: string; action: string; descriptions: string }\r\n>;\r\n\r\nexport type MqEvent = MqEventPageEnter | MqEventPageLeave | MqEventEngineStart | MqEventUserClicked;\r\n\r\nexport const MqEvent = {\r\n engineStart(schemaId: string, schemaPrefix: string): MqEventEngineStart {\r\n return {\r\n kind: \"engine-start\",\r\n timestamp: DTimestamp.now(),\r\n payload: { schemaId, schemaPrefix },\r\n };\r\n },\r\n pageEnter(pageId: string, pagePrefix: string): MqEventPageEnter {\r\n return {\r\n kind: \"page-enter\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix },\r\n };\r\n },\r\n pageLeave(pageId: string, pagePrefix: string): MqEventPageLeave {\r\n return {\r\n kind: \"page-leave\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix },\r\n };\r\n },\r\n userClicked(data: {\r\n pageId: string;\r\n pagePrefix: string;\r\n action: string;\r\n descriptions: string;\r\n }): MqEventUserClicked {\r\n const { pageId, pagePrefix, action, descriptions } = data;\r\n return {\r\n kind: \"user-clicked\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix, action, descriptions },\r\n };\r\n },\r\n} as const;\r\n","import { DElement } from \"../Delement/DElement\";\nimport { TaskManager } from \"./task-manager\";\nimport { createDElement } from \"../Delement/element-factory\";\nimport { ScaleService } from \"../engine/scale\";\nimport { Task } from \"./task\";\nimport { PStyle } from \"../Delement/DStyle\";\nimport { ButtonClickAction } from \"../Delement/button-click-action\";\nimport { DElementDto } from \"../Delement/DElement.dto\";\nimport { Fact } from \"../rules/fact\";\nimport { DTimestamp } from \"../common/DTimestamp\";\nimport { PageResult } from \"./page-result\";\nimport { TaskState } from \"./task-state\";\nimport { MqEvent } from \"../events/mq-events\";\n\nexport interface VideoPlayerDto {\n playUrl: string;\n style?: PStyle;\n}\n\nexport interface PageDto {\n readonly id: string;\n readonly prefix: string;\n readonly tags: string[];\n background: string;\n elements: Array<DElementDto>;\n videoPlayer?: VideoPlayerDto;\n initialTasks: Array<Task>;\n}\n\nexport const PageDto = {\n createDummy: (id: number): PageDto => {\n return {\n id: \"id\" + id,\n prefix: \"prefix\" + id,\n tags: [],\n background: \"white\",\n elements: [\n {\n _tag: \"div\",\n style: { x: 10, y: 0, w: 40, h: 20, backgroundColor: \"red\" },\n children: [],\n innerText: \"Next btn \" + id,\n },\n ],\n\n initialTasks: [],\n };\n },\n};\n\nexport class Page {\n private readonly TAG = \"[ DPage ]: \";\n private elements: DElement<HTMLElement>[] = [];\n // private elements: PageComponent[] = [];\n // private layoutComponents: PageLayoutComponent[] = [];\n private pageEntered: DTimestamp = DTimestamp.now();\n private previousState: TaskState | false = false;\n private eventLog = new Array<MqEvent>();\n\n constructor(\n private readonly dto: PageDto,\n private readonly taskManager: TaskManager,\n private readonly scaleService: ScaleService,\n private readonly onCompleted: (result: PageResult) => void,\n ) {\n dto.elements.forEach((el) => {\n const element = createDElement(el, scaleService);\n // if (element instanceof DDiv) {\n // }\n element.registerClickHandler((action) => {\n this.handleButtonAction(action);\n });\n\n this.elements.push(element);\n\n // if(element.)\n // element= (action) => {\n // console.log(\"TODO ONCLICK \");\n // this.handleButtonAction(action);\n // };\n // this.elements.push(element);\n });\n\n if (dto.videoPlayer) {\n this.taskManager.loadVideo(dto.videoPlayer.playUrl);\n if (dto.videoPlayer.style) {\n this.taskManager.setVideoStyles(dto.videoPlayer.style);\n }\n }\n\n if (dto.initialTasks.length) {\n this.taskManager.autoPlaySequence(dto.initialTasks);\n }\n }\n\n private createPageResult(facts: Fact[]): PageResult {\n const pageExited = DTimestamp.now();\n const pageTime = DTimestamp.diff(this.pageEntered, pageExited);\n const pageExit = MqEvent.pageLeave(this.dto.id, this.dto.prefix);\n this.eventLog.push(pageExit);\n const eventLog = [...this.eventLog];\n return {\n pagePrefix: this.dto.prefix,\n pageId: this.dto.id,\n eventLog,\n pageTime,\n collectedFacts: facts,\n };\n }\n private handleButtonAction(a: ButtonClickAction) {\n const event = MqEvent.userClicked({\n pageId: this.dto.id,\n pagePrefix: this.dto.prefix,\n action: a.kind,\n descriptions: ButtonClickAction.describe(a),\n });\n this.eventLog.push(event);\n navigator.vibrate(200);\n const { vibrateMs } = a;\n if (vibrateMs) {\n navigator.vibrate(vibrateMs);\n }\n\n switch (a.kind) {\n case \"next-page\":\n const nextPageResult = this.createPageResult([]);\n this.onCompleted(nextPageResult);\n break;\n case \"play-video\":\n this.taskManager.execute(a.task);\n break;\n case \"play-audio\":\n this.taskManager.execute(a.task);\n break;\n case \"pause-video\":\n this.taskManager.pauseVideo();\n break;\n case \"pause-audio\":\n this.taskManager.pauseAudio();\n break;\n case \"mute-video\":\n this.taskManager.muteVideo();\n break;\n case \"un-mute-video\":\n this.taskManager.unMuteVideo();\n break;\n case \"submit-fact\":\n const submitFactResult = this.createPageResult([a.fact]);\n this.onCompleted(submitFactResult);\n break;\n case \"submit-form\":\n // TODO IMPLEMENT Collection of form-data // LOOP OVER ALL INPUTS\n const submitFormResult = this.createPageResult([]);\n this.onCompleted(submitFormResult);\n break;\n default:\n const _exhaustiveCheck: never = a;\n console.log(_exhaustiveCheck);\n }\n }\n\n appendYourself(parent: HTMLElement) {\n const pageEnterEvent = MqEvent.pageEnter(this.dto.id, this.dto.prefix);\n this.pageEntered = DTimestamp.now();\n this.eventLog.push(pageEnterEvent);\n this.elements.forEach((el) => {\n el.appendYourself(parent);\n });\n\n // this.components.forEach((comp) => {\n // comp.appendToParent(parent);\n // });\n // this.layoutComponents.forEach((comp) => {\n // comp.appendToParent(parent);\n // });\n }\n\n destroy() {\n this.taskManager.clear();\n }\n\n tick() {\n const prev = this.previousState;\n const curr = this.taskManager.getState();\n const diff = TaskState.getDiff(curr, prev);\n this.elements.forEach((element) => {\n element.updateState(diff);\n });\n }\n}\n","type BaseTask = {\r\n readonly blockAudio: boolean;\r\n readonly blockVideo: boolean;\r\n readonly blockResponseButton: boolean;\r\n readonly blockFormInput: boolean;\r\n readonly priority:\r\n | \"run-if-idle\"\r\n | \"follow-queue\"\r\n | \"replace-all\"\r\n | \"replace-current\"\r\n | \"replace-queue\"\r\n | \"prepend-to-queue\"\r\n | \"append-to-queue\";\r\n};\r\nexport type DelayTask = BaseTask & {\r\n readonly kind: \"delay-task\";\r\n readonly duration: number;\r\n};\r\n\r\nexport type PlayAudioTask = BaseTask & {\r\n readonly kind: \"play-audio-task\";\r\n readonly url: string;\r\n readonly audioId: string;\r\n};\r\n\r\nexport type PlayVideoTask = BaseTask & {\r\n readonly kind: \"play-video-task\";\r\n readonly url: string;\r\n readonly videoId: string;\r\n readonly loop?: boolean;\r\n readonly startAt?: number;\r\n readonly stopAt?: \"end\" | \"start\" | number;\r\n readonly volume?: number;\r\n};\r\nconst eq = (a: Task, b: Task) => {\r\n if (!b) {\r\n return false;\r\n }\r\n if (a.kind !== b.kind) {\r\n return false;\r\n }\r\n if (a.kind === \"delay-task\" && b.kind === \"delay-task\") {\r\n return a.duration === b.duration;\r\n }\r\n\r\n if (a.kind === \"play-audio-task\" && b.kind === \"play-audio-task\") {\r\n return a.url === b.url && a.audioId === b.audioId;\r\n }\r\n if (a.kind === \"play-video-task\" && b.kind === \"play-video-task\") {\r\n return (\r\n a.url === b.url &&\r\n a.videoId === b.videoId &&\r\n a.startAt === b.startAt &&\r\n a.stopAt === b.stopAt &&\r\n a.volume === b.volume\r\n );\r\n }\r\n return false;\r\n};\r\nconst deleteTaskList = (task: Task) => {\r\n return task.priority === \"replace-all\" || task.priority === \"replace-queue\";\r\n};\r\n\r\nconst shallRemoveCurrent = (task: Task) => {\r\n return task.priority === \"replace-current\" || task.priority === \"replace-all\";\r\n};\r\n\r\nconst notEq = (a: Task, b: Task) => !eq(a, b);\r\n\r\nconst is = (task: Task | undefined | false | null | {}): task is Task => {\r\n if (!task) {\r\n return false;\r\n }\r\n if (typeof task !== \"object\") {\r\n return false;\r\n }\r\n if (Array.isArray(task)) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const Task = {\r\n eq,\r\n is,\r\n notEq,\r\n deleteTaskList,\r\n shallRemoveCurrent,\r\n};\r\nexport type Task = PlayVideoTask | PlayAudioTask | DelayTask;\r\n","import { DTimestamp } from \"../common/DTimestamp\";\nimport { Task } from \"./task\";\nimport { DStyle, PStyle } from \"../Delement/DStyle\";\nimport { ScaleService } from \"../engine/scale\";\nimport { TaskState } from \"./task-state\";\n\nexport class TaskManager {\n private readonly TAG = \"[TaskManager]: \";\n private readonly videoElement = document.createElement(\"video\");\n private readonly audioElement = document.createElement(\"audio\");\n private readonly showConsoleLogs = false;\n private readonly defaultVideoStyles: PStyle = {\n height: 50,\n width: 100,\n top: 0,\n left: 0,\n };\n private videoStyles: PStyle;\n private runningTask: { task: Task; startedAt: DTimestamp } | false = false;\n private taskList: Array<Task> = [];\n private delayRef: number | false = false;\n\n clear() {\n if (this.showConsoleLogs) console.log(this.TAG + \"CLEAR\");\n if (typeof this.delayRef === \"number\") {\n window.clearTimeout(this.delayRef);\n }\n\n this.pauseVideo();\n this.pauseAudio();\n this.videoElement.removeAttribute(\"src\");\n this.videoElement.load();\n this.audioElement.removeAttribute(\"src\");\n this.audioElement.load();\n this.taskList = [];\n this.runningTask = false;\n this.hideVideo();\n }\n\n getState(): TaskState {\n const c = this.runningTask;\n const isGifMode = this.videoElement.loop;\n const audioIsPlaying = c && c.task.kind === \"play-audio-task\" && !this.audioElement.paused;\n const videoIsPlaying = c && c.task.kind === \"play-video-task\" && !this.videoElement.paused;\n const blockResponseButton = c && c.task.blockResponseButton;\n const blockAudio = c && c.task.blockAudio;\n const blockVideo = c && c.task.blockVideo;\n const blockFormInput = c && c.task.blockFormInput;\n const videoIsMuted = this.videoElement.muted;\n\n const videoIsAtTheEnd = this.videoElement.ended;\n let videoPlayState: TaskState[\"videoPlayState\"] = videoIsMuted ? \"paused-and-muted\" : \"paused\";\n\n if (videoIsPlaying) {\n videoPlayState = videoIsMuted ? \"playing-and-muted\" : \"playing\";\n }\n if (videoIsAtTheEnd) {\n videoPlayState = videoIsMuted ? \"ended-and-muted\" : \"ended\";\n }\n\n return {\n audioIsPlaying,\n videoPlayState,\n isGifMode,\n blockFormInput,\n blockResponseButton,\n blockAudio,\n blockVideo,\n };\n }\n\n constructor(\n private readonly mediaLayer: HTMLDivElement,\n private readonly scale: ScaleService,\n private readonly onError: (error: string) => void,\n ) {\n this.hideVideo();\n this.mediaLayer.appendChild(this.videoElement);\n this.mediaLayer.appendChild(this.audioElement);\n this.videoStyles = this.defaultVideoStyles;\n DStyle.normalize(this.videoElement);\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\n\n this.videoElement.onended = () => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n };\n this.videoElement.onerror = (e) => {\n if (this.videoElement.src !== \"\") {\n onError(\"Error playing video: \" + this.videoElement.src);\n }\n };\n\n this.audioElement.onended = () => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n };\n }\n\n execute(task: Task): boolean {\n // console.log(\"EXECUTE TASK\" + task.kind);\n const curr = this.runningTask;\n // TODO Background-task should be handeled as its own kind or something.\n let isBackgroundTask = false;\n\n // Check if we should remove the current task.\n if (curr && Task.shallRemoveCurrent(task) && Task.notEq(curr.task, task)) {\n this.pauseAudio();\n this.pauseVideo();\n this.runningTask = false;\n }\n\n if (!curr) {\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\n } else if (Task.notEq(curr.task, task)) {\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\n }\n\n if (task.priority === \"replace-all\" || task.priority === \"replace-queue\") {\n this.taskList = [];\n }\n\n // STARTING PLAY VIDEO\n if (task.kind === \"play-video-task\") {\n this.showVideo();\n // this.pauseAudio()\n this.loadVideo(task.url);\n if (task.loop) {\n this.videoElement.loop = true;\n isBackgroundTask = true;\n } else {\n this.videoElement.loop = false;\n }\n\n try {\n this.videoElement.play();\n } catch (e) {\n console.error(e);\n }\n }\n\n // STARTING PLAY AUDIO\n if (task.kind === \"play-audio-task\") {\n if (!this.videoElement.loop) {\n this.pauseVideo();\n }\n if (task.url !== this.audioElement.src) {\n this.audioElement.src = task.url;\n }\n this.audioElement.play();\n }\n\n if (task.kind === \"delay-task\") {\n if (typeof this.delayRef === \"number\") {\n window.clearTimeout(this.delayRef);\n }\n this.delayRef = window.setTimeout(() => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n }, task.duration);\n }\n\n if (isBackgroundTask) {\n const startNextTask = this.getNextTask();\n if (startNextTask) {\n this.execute(startNextTask);\n }\n }\n\n return true;\n }\n\n setVideoStyles(styles: PStyle) {\n this.videoStyles = { ...styles };\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\n }\n\n autoPlaySequence(tasks: Task[]) {\n this.taskList = [...tasks];\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n if (next.kind === \"play-video-task\" && next.loop) {\n this.videoElement.loop = true;\n }\n }\n }\n\n loadVideo(url: string) {\n // console.log(\"LOAD VIDEO \" + !!url + \" \");\n if (this.videoElement.src !== url) {\n this.videoElement.src = url;\n }\n this.showVideo();\n }\n\n private playVideoElement() {\n this.videoElement\n .play()\n .then(() => {})\n .catch((e) => {\n console.log(e);\n this.onError(\"Error playing video.\");\n });\n }\n\n private showVideo() {\n this.videoElement.style.display = \"block\";\n }\n\n private hideVideo() {\n this.videoElement.style.display = \"none\";\n }\n\n pauseVideo() {\n try {\n if (!this.videoElement.loop) {\n this.videoElement.pause();\n }\n } catch (e) {\n console.log(e);\n this.onError(\"Error pausing video.\");\n }\n }\n\n pauseAudio() {\n try {\n if (!this.audioElement.loop) {\n this.audioElement.pause();\n }\n } catch (e) {\n console.log(e);\n this.onError(\"Error pausing audio.\");\n }\n }\n\n private getNextTask(): Task | false {\n // console.log(\"Getting next task.\");\n // console.log(this.taskList);\n const first = this.taskList.shift();\n return first ?? false;\n }\n\n muteVideo() {\n this.videoElement.muted = true;\n }\n\n unMuteVideo() {\n this.videoElement.muted = false;\n }\n}\n","import { SchemaDto } from \"./SchemaDto\";\nimport { DPlayer } from \"./dplayer\";\nimport { ScaleService } from \"./scale\";\nimport { Page } from \"../page/Page\";\nimport { TaskManager } from \"../page/task-manager\";\nimport { PageResult } from \"../page/page-result\";\nimport { SchemaResult } from \"./SchemaResult\";\nexport interface EngineLogger {\n info(message: string): void;\n error(message: string): void;\n warn(message: string): void;\n}\n\nconst voidLogger: EngineLogger = {\n info: (message: string) => {},\n error: (message: string) => {},\n warn: (message: string) => {},\n};\n\nexport interface ISchemaEngine {\n onProgress(handler: (result: SchemaResult) => void): void;\n onFatalError(handler: (error: { message: string }) => void): void;\n setLogger(logger: EngineLogger): void;\n}\n\nexport class SchemaEngine implements ISchemaEngine {\n private readonly TAG = \"[ SCHEMA_ENGINE ] :\";\n private readonly scale: ScaleService;\n private readonly hostElement: HTMLDivElement;\n private readonly taskManager: TaskManager;\n private logger: EngineLogger = voidLogger;\n private readonly uiLayer: HTMLDivElement = document.createElement(\"div\");\n private readonly mediaLayer: HTMLDivElement = document.createElement(\"div\");\n private player: DPlayer;\n private currentPage: Page | false = false;\n private readonly tickerRef: number | false = false;\n constructor(\n hostEl: HTMLDivElement,\n private readonly height: number,\n private readonly width: number,\n private readonly schema: SchemaDto,\n ) {\n this.tickerRef = window.setInterval(() => {\n if (this.currentPage) {\n this.currentPage.tick();\n }\n }, 100);\n this.hostElement = hostEl;\n this.hostElement.appendChild(this.mediaLayer);\n this.hostElement.appendChild(this.uiLayer);\n this.scale = new ScaleService({\n baseHeight: schema.baseHeight,\n baseWidth: schema.baseWidth,\n containerWidth: this.width,\n containerHeight: this.height,\n });\n this.logger.info(this.TAG + \"Scale: \" + JSON.stringify(this.scale));\n this.player = new DPlayer(this.schema);\n this.taskManager = new TaskManager(this.mediaLayer, this.scale, (error) => {\n console.log(error);\n });\n\n this.styleSelf();\n this.handlePageCompleted = this.handlePageCompleted.bind(this);\n this.nextPage();\n }\n\n private handlePageCompleted(result: PageResult) {\n // 1 Save data from last page\n this.player.saveHistory(result);\n\n // 2 Emit progress\n const currentResults = this.player.getResults();\n const a: SchemaResult = {\n schemaId: this.schema.id,\n pagesLeft: currentResults.pagesLeft,\n predefinedFacts: currentResults.predefinedFacts,\n eventLog: currentResults.eventLog,\n answers: currentResults.answerFacts,\n };\n if (this._onProgress) {\n this._onProgress(a);\n }\n\n // 3. Next page\n this.nextPage();\n }\n\n private styleSelf() {\n this.hostElement.style.height = this.scale.pageHeight + \"px\";\n this.hostElement.style.width = this.scale.pageWidth + \"px\";\n this.hostElement.style.backgroundColor = this.schema.backgroundColor ?? \"white\";\n this.hostElement.style.position = \"relative\";\n // this.hostElement.style.overflow = \"hidden\";\n const makeStatic = (div: HTMLDivElement) => {\n div.style.height = \"0px\";\n div.style.width = \"0px\";\n div.style.position = \"static\";\n };\n\n makeStatic(this.uiLayer);\n this.uiLayer.style.zIndex = \"10\";\n this.mediaLayer.style.zIndex = \"8\";\n makeStatic(this.mediaLayer);\n }\n\n private nextPage() {\n const nextPage = this.player.getNextPage();\n if (this.currentPage) {\n this.currentPage.destroy();\n this.uiLayer.innerHTML = \"\";\n }\n\n // console.log(nextPage);\n if (nextPage && nextPage.videoPlayer && nextPage.videoPlayer.style) {\n this.taskManager.setVideoStyles(nextPage.videoPlayer.style);\n }\n\n if (!nextPage) {\n // TODO FIGURE OUT WHAQT TO DO AT END OF TEST!! Start over??\n this.player = new DPlayer(this.schema);\n if (this.player.pagesLeft > 0) {\n this.nextPage();\n }\n return false;\n }\n\n const newPage = new Page(nextPage, this.taskManager, this.scale, (result) => {\n this.handlePageCompleted(result);\n });\n this.currentPage = newPage;\n newPage.appendYourself(this.uiLayer);\n return true;\n }\n\n destroy() {\n if (this.currentPage) {\n this.currentPage.destroy();\n this.uiLayer.innerHTML = \"\";\n }\n }\n\n private _onProgress: ((result: SchemaResult) => void) | false = false;\n onProgress(handler: (result: SchemaResult) => void) {\n this._onProgress = handler;\n }\n\n private _onFatalError: ((error: { message: string }) => void) | false = false;\n onFatalError(handler: (error: { message: string }) => void): void {\n this._onFatalError = handler;\n }\n setLogger(logger: EngineLogger) {\n this.logger = logger;\n }\n}\n"],"mappings":"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","names":["DUtil","isNumber","Condition","condition","Rule","tag","Scale","DCss","DStyle","DTimestamp","dto"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@media-quest/engine",
3
- "version": "0.0.31",
3
+ "version": "0.0.32",
4
4
  "description": "Rendering engine for media-quest schemas.",
5
5
  "main": "dist/public-api.js",
6
6
  "types": "dist/public-api.d.ts",
@@ -1,7 +1,6 @@
1
1
  import { DStyle, PStyle } from "./DStyle";
2
2
  import { ScaleService } from "../engine/scale";
3
3
  import { ButtonClickAction } from "./button-click-action";
4
- import { DElementDto } from "./DElement.dto";
5
4
  import { TaskState, TaskStateDiff } from "../page/task-state";
6
5
 
7
6
  export interface DElementBaseDto {
@@ -57,7 +56,7 @@ export abstract class DElement<T extends HTMLElement> {
57
56
  this.el.innerText = dto.innerText;
58
57
  }
59
58
  this.setStyle = this.setStyle.bind(this);
60
- this.normalize = this.normalize.bind(this);
59
+ // this.normalize = this.normalize.bind(this);
61
60
  this.appendYourself = this.appendYourself.bind(this);
62
61
  this.updateStyles = this.updateStyles.bind(this);
63
62
  const { onMouseEnter, onMouseLeave } = dto;
@@ -73,7 +72,7 @@ export abstract class DElement<T extends HTMLElement> {
73
72
  };
74
73
  }
75
74
 
76
- this.normalize();
75
+ DStyle.normalize(this.el);
77
76
 
78
77
  if (dto) {
79
78
  this.updateStyles(dto?.style);
@@ -174,12 +173,12 @@ export abstract class DElement<T extends HTMLElement> {
174
173
  }
175
174
  }
176
175
 
177
- private normalize() {
178
- this.el.style.padding = "0";
179
- this.el.style.margin = "0";
180
- this.el.style.position = "absolute";
181
- this.el.style.boxSizing = "border-box";
182
- }
176
+ // private normalize() {
177
+ // this.el.style.padding = "0";
178
+ // this.el.style.margin = "0";
179
+ // this.el.style.position = "absolute";
180
+ // this.el.style.boxSizing = "border-box";
181
+ // }
183
182
 
184
183
  abstract registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void;
185
184
 
@@ -63,6 +63,7 @@ export interface DStyle {
63
63
  fontWeight: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;
64
64
  textAlign: "right" | "left" | "center";
65
65
  letterSpacing: DCss.Px;
66
+ lineHeight: number;
66
67
 
67
68
  // LAYOUT & POSITIONING OVERRIDE
68
69
  position: "absolute" | "relative";
@@ -92,10 +93,39 @@ export namespace DStyle {
92
93
  import isNumber = DUtil.isNumber;
93
94
  import isLengthUnit = DCss.isLengthUnit;
94
95
  export const normalize = <T extends HTMLElement>(el: T): T => {
95
- el.style.padding = "0";
96
- el.style.margin = "0";
97
- el.style.position = "absolute";
98
- el.style.boxSizing = "border-box";
96
+ const s = el.style;
97
+ // el.style.padding = "";
98
+ // el.style.margin = "";
99
+ // el.style.position = "absolute";
100
+ // el.style.boxSizing = "border-box";
101
+ s.position = "absolute";
102
+ s.boxSizing = "border-box";
103
+ s.bottom = "";
104
+ s.top = "";
105
+ s.left = "";
106
+ s.right = "";
107
+ s.boxShadow = "";
108
+ s.padding = "0px";
109
+ s.margin = "0px";
110
+ s.fontSize = "12px";
111
+ s.lineHeight = "1";
112
+ s.textAlign = "center";
113
+ s.textDecoration = "none";
114
+ s.boxShadow = "";
115
+ s.boxSizing = "border-box";
116
+ s.fontWeight = "500";
117
+ s.borderStyle = "";
118
+ s.borderRadius = "";
119
+ s.borderWidth = "";
120
+ s.borderWidth = "10px";
121
+ s.borderColor = "black";
122
+ s.backgroundColor = "";
123
+ s.border = "";
124
+ s.borderStyle = "none";
125
+ s.outline = "";
126
+ s.wordSpacing = "";
127
+ s.userSelect = "none";
128
+ s.textShadow = "";
99
129
  return el;
100
130
  };
101
131
 
@@ -122,6 +152,7 @@ export namespace DStyle {
122
152
  cursor,
123
153
  fontSize,
124
154
  fontWeight,
155
+ lineHeight,
125
156
  textColor,
126
157
  textAlign,
127
158
  translate,
@@ -167,6 +198,10 @@ export namespace DStyle {
167
198
  el.style.maxWidth = DCss.toString(maxWidth, scale);
168
199
  }
169
200
 
201
+ if (typeof lineHeight === "number") {
202
+ el.style.lineHeight = "" + lineHeight;
203
+ }
204
+
170
205
  if (DCss.isLengthUnit(minHeight)) {
171
206
  el.style.minHeight = DCss.toString(minHeight, scale);
172
207
  }
@@ -327,6 +362,7 @@ export namespace DStyle {
327
362
  }
328
363
  return el;
329
364
  };
365
+
330
366
  // const propNames = new Set(...ElementKeyNames);
331
367
  // export const validKey = (keyName: string) => propNames.has(keyName);
332
368
  }