From 192453c1fb38e3cadc85599db8b8546212b6ddba Mon Sep 17 00:00:00 2001 From: sanex Date: Sun, 15 Aug 2021 19:47:45 +0300 Subject: [PATCH 01/14] String control flow flattening prototype --- src/JavaScriptObfuscator.ts | 3 +- .../ControlFlowTransformersModule.ts | 10 ++ .../StringLiteralNode.ts | 4 +- .../ControlFlowStorageNode.ts | 29 +++-- .../node-transformers/NodeTransformer.ts | 1 + .../ControlFlowReplacer.ts | 1 + .../FunctionControlFlowTransformer.ts | 120 ++++++++---------- .../StringArrayControlFlowTransformer.ts | 89 +++++++++++++ .../AbstractControlFlowReplacer.ts | 39 ++---- .../StringArrayCallControlFlowReplacer.ts | 78 ++++++++++++ .../StringLiteralControlFlowReplacer.ts | 2 +- src/node/NodeAppender.ts | 14 +- src/node/NodeLiteralUtils.ts | 9 ++ src/types/node/TNumberLiteralNode.ts | 3 + test/dev/dev.ts | 30 +++-- 15 files changed, 300 insertions(+), 132 deletions(-) create mode 100644 src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts create mode 100644 src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts create mode 100644 src/types/node/TNumberLiteralNode.ts diff --git a/src/JavaScriptObfuscator.ts b/src/JavaScriptObfuscator.ts index 76deb867b..0e61ccf0b 100644 --- a/src/JavaScriptObfuscator.ts +++ b/src/JavaScriptObfuscator.ts @@ -21,13 +21,13 @@ import { CodeTransformationStage } from './enums/code-transformers/CodeTransform import { LoggingMessage } from './enums/logger/LoggingMessage'; import { NodeTransformer } from './enums/node-transformers/NodeTransformer'; import { NodeTransformationStage } from './enums/node-transformers/NodeTransformationStage'; +import { SourceMapSourcesMode } from './enums/source-map/SourceMapSourcesMode'; import { ecmaVersion } from './constants/EcmaVersion'; import { ASTParserFacade } from './ASTParserFacade'; import { NodeGuards } from './node/NodeGuards'; import { Utils } from './utils/Utils'; -import { SourceMapSourcesMode } from './enums/source-map/SourceMapSourcesMode'; @injectable() export class JavaScriptObfuscator implements IJavaScriptObfuscator { @@ -90,6 +90,7 @@ export class JavaScriptObfuscator implements IJavaScriptObfuscator { NodeTransformer.ScopeIdentifiersTransformer, NodeTransformer.ScopeThroughIdentifiersTransformer, NodeTransformer.SplitStringTransformer, + NodeTransformer.StringArrayControlFlowTransformer, NodeTransformer.StringArrayRotateFunctionTransformer, NodeTransformer.StringArrayScopeCallsWrapperTransformer, NodeTransformer.StringArrayTransformer, diff --git a/src/container/modules/node-transformers/ControlFlowTransformersModule.ts b/src/container/modules/node-transformers/ControlFlowTransformersModule.ts index c8d8ecf12..972580cd7 100644 --- a/src/container/modules/node-transformers/ControlFlowTransformersModule.ts +++ b/src/container/modules/node-transformers/ControlFlowTransformersModule.ts @@ -13,6 +13,8 @@ import { BlockStatementControlFlowTransformer } from '../../../node-transformers import { CallExpressionControlFlowReplacer } from '../../../node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer'; import { FunctionControlFlowTransformer } from '../../../node-transformers/control-flow-transformers/FunctionControlFlowTransformer'; import { LogicalExpressionControlFlowReplacer } from '../../../node-transformers/control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer'; +import { StringArrayCallControlFlowReplacer } from '../../../node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer'; +import { StringArrayControlFlowTransformer } from '../../../node-transformers/control-flow-transformers/StringArrayControlFlowTransformer'; import { StringLiteralControlFlowReplacer } from '../../../node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer'; export const controlFlowTransformersModule: interfaces.ContainerModule = new ContainerModule((bind: interfaces.Bind) => { @@ -25,6 +27,10 @@ export const controlFlowTransformersModule: interfaces.ContainerModule = new Con .to(FunctionControlFlowTransformer) .whenTargetNamed(NodeTransformer.FunctionControlFlowTransformer); + bind(ServiceIdentifiers.INodeTransformer) + .to(StringArrayControlFlowTransformer) + .whenTargetNamed(NodeTransformer.StringArrayControlFlowTransformer); + // control flow replacers bind(ServiceIdentifiers.IControlFlowReplacer) .to(BinaryExpressionControlFlowReplacer) @@ -38,6 +44,10 @@ export const controlFlowTransformersModule: interfaces.ContainerModule = new Con .to(LogicalExpressionControlFlowReplacer) .whenTargetNamed(ControlFlowReplacer.LogicalExpressionControlFlowReplacer); + bind(ServiceIdentifiers.IControlFlowReplacer) + .to(StringArrayCallControlFlowReplacer) + .whenTargetNamed(ControlFlowReplacer.StringArrayCallControlFlowReplacer); + bind(ServiceIdentifiers.IControlFlowReplacer) .to(StringLiteralControlFlowReplacer) .whenTargetNamed(ControlFlowReplacer.StringLiteralControlFlowReplacer); diff --git a/src/custom-nodes/control-flow-flattening-nodes/StringLiteralNode.ts b/src/custom-nodes/control-flow-flattening-nodes/StringLiteralNode.ts index 936cd428b..6099fa2a6 100644 --- a/src/custom-nodes/control-flow-flattening-nodes/StringLiteralNode.ts +++ b/src/custom-nodes/control-flow-flattening-nodes/StringLiteralNode.ts @@ -19,7 +19,7 @@ export class StringLiteralNode extends AbstractCustomNode { * @type {string} */ @initializable() - private literalValue!: string; + private literalValue!: string | number; /** * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory @@ -45,7 +45,7 @@ export class StringLiteralNode extends AbstractCustomNode { /** * @param {string} literalValue */ - public initialize (literalValue: string): void { + public initialize (literalValue: string | number): void { this.literalValue = literalValue; } diff --git a/src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ControlFlowStorageNode.ts b/src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ControlFlowStorageNode.ts index 9fed22cc5..17cda7429 100644 --- a/src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ControlFlowStorageNode.ts +++ b/src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ControlFlowStorageNode.ts @@ -17,7 +17,6 @@ import { initializable } from '../../../decorators/Initializable'; import { AbstractCustomNode } from '../../AbstractCustomNode'; import { NodeFactory } from '../../../node/NodeFactory'; import { NodeGuards } from '../../../node/NodeGuards'; -import { NodeUtils } from '../../../node/NodeUtils'; @injectable() export class ControlFlowStorageNode extends AbstractCustomNode { @@ -59,22 +58,26 @@ export class ControlFlowStorageNode extends AbstractCustomNode { * @returns {TStatement[]} */ protected getNodeStructure (): TStatement[] { - const propertyNodes: ESTree.Property[] = Array - .from<[string, ICustomNode]>(this.controlFlowStorage.getStorage()) - .map(([key, value]: [string, ICustomNode]) => { - const node: ESTree.Node = value.getNode()[0]; + const propertyNodes: ESTree.Property[] = []; - if (!NodeGuards.isExpressionStatementNode(node)) { - throw new Error('Function node for control flow storage object should be passed inside the `ExpressionStatement` node!'); - } + const controlFlowStorageMap: Map = this.controlFlowStorage.getStorage(); - return NodeFactory.propertyNode( + for (const [key, value] of controlFlowStorageMap) { + const node: ESTree.Node = value.getNode()[0]; + + if (!NodeGuards.isExpressionStatementNode(node)) { + throw new Error('Function node for control flow storage object should be passed inside the `ExpressionStatement` node!'); + } + + propertyNodes.push( + NodeFactory.propertyNode( NodeFactory.identifierNode(key), node.expression - ); - }); + ) + ); + } - let structure: ESTree.Node = NodeFactory.variableDeclarationNode( + const structure: ESTree.Node = NodeFactory.variableDeclarationNode( [ NodeFactory.variableDeclaratorNode( NodeFactory.identifierNode(this.controlFlowStorage.getStorageId()), @@ -84,8 +87,6 @@ export class ControlFlowStorageNode extends AbstractCustomNode { 'const' ); - structure = NodeUtils.parentizeAst(structure); - return [structure]; } } diff --git a/src/enums/node-transformers/NodeTransformer.ts b/src/enums/node-transformers/NodeTransformer.ts index bd3e1897a..a466737f5 100644 --- a/src/enums/node-transformers/NodeTransformer.ts +++ b/src/enums/node-transformers/NodeTransformer.ts @@ -28,6 +28,7 @@ export enum NodeTransformer { ScopeIdentifiersTransformer = 'ScopeIdentifiersTransformer', ScopeThroughIdentifiersTransformer = 'ScopeThroughIdentifiersTransformer', SplitStringTransformer = 'SplitStringTransformer', + StringArrayControlFlowTransformer = 'StringArrayControlFlowTransformer', StringArrayTransformer = 'StringArrayTransformer', StringArrayRotateFunctionTransformer = 'StringArrayRotateFunctionTransformer', StringArrayScopeCallsWrapperTransformer = 'StringArrayScopeCallsWrapperTransformer', diff --git a/src/enums/node-transformers/control-flow-transformers/control-flow-replacers/ControlFlowReplacer.ts b/src/enums/node-transformers/control-flow-transformers/control-flow-replacers/ControlFlowReplacer.ts index 079ec1d20..03e2e5cfa 100644 --- a/src/enums/node-transformers/control-flow-transformers/control-flow-replacers/ControlFlowReplacer.ts +++ b/src/enums/node-transformers/control-flow-transformers/control-flow-replacers/ControlFlowReplacer.ts @@ -2,5 +2,6 @@ export enum ControlFlowReplacer { BinaryExpressionControlFlowReplacer = 'BinaryExpressionControlFlowReplacer', CallExpressionControlFlowReplacer = 'CallExpressionControlFlowReplacer', LogicalExpressionControlFlowReplacer = 'LogicalExpressionControlFlowReplacer', + StringArrayCallControlFlowReplacer = 'StringArrayCallControlFlowReplacer', StringLiteralControlFlowReplacer = 'StringLiteralControlFlowReplacer' } diff --git a/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts b/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts index cb0299010..66aee363f 100644 --- a/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts +++ b/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts @@ -31,16 +31,6 @@ import { NodeUtils } from '../../node/NodeUtils'; @injectable() export class FunctionControlFlowTransformer extends AbstractNodeTransformer { - /** - * @type {Map } - */ - private static readonly controlFlowReplacersMap: Map = new Map([ - [NodeType.BinaryExpression, ControlFlowReplacer.BinaryExpressionControlFlowReplacer], - [NodeType.CallExpression, ControlFlowReplacer.CallExpressionControlFlowReplacer], - [NodeType.LogicalExpression, ControlFlowReplacer.LogicalExpressionControlFlowReplacer], - [NodeType.Literal, ControlFlowReplacer.StringLiteralControlFlowReplacer] - ]); - /** * @type {number} */ @@ -51,6 +41,16 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { */ private static readonly hostNodeSearchMaxDepth: number = 2; + /** + * @type {Map } + */ + protected readonly controlFlowReplacersMap: Map = new Map([ + [NodeType.BinaryExpression, ControlFlowReplacer.BinaryExpressionControlFlowReplacer], + [NodeType.CallExpression, ControlFlowReplacer.CallExpressionControlFlowReplacer], + [NodeType.LogicalExpression, ControlFlowReplacer.LogicalExpressionControlFlowReplacer], + [NodeType.Literal, ControlFlowReplacer.StringLiteralControlFlowReplacer] + ]); + /** * @type {Map} */ @@ -113,14 +113,11 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { switch (nodeTransformationStage) { case NodeTransformationStage.ControlFlowFlattening: return { - leave: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => { - if ( - parentNode && ( - NodeGuards.isFunctionDeclarationNode(node) || - NodeGuards.isFunctionExpressionNode(node) || - NodeGuards.isArrowFunctionExpressionNode(node) - ) - ) { + leave: ( + node: ESTree.Node, + parentNode: ESTree.Node | null + ): ESTree.Node | estraverse.VisitorOption | void => { + if (parentNode && NodeGuards.isFunctionNode(node)) { return this.transformNode(node, parentNode); } } @@ -133,7 +130,7 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { /** * @param {Function} functionNode - * @param {NodeGuards} parentNode + * @param {Node} parentNode * @returns {Function} */ public transformNode (functionNode: ESTree.Function, parentNode: ESTree.Node): ESTree.Function { @@ -146,7 +143,6 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { const hostNode: TNodeWithStatements = this.getHostNode(functionNode.body); const controlFlowStorage: TControlFlowStorage = this.getControlFlowStorage(hostNode); - this.controlFlowData.set(hostNode, controlFlowStorage); this.transformFunctionBody(functionNode.body, controlFlowStorage); if (!controlFlowStorage.getLength()) { @@ -160,14 +156,33 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { const controlFlowStorageNode: ESTree.VariableDeclaration = this.getControlFlowStorageNode(controlFlowStorage); + NodeUtils.parentizeAst(controlFlowStorageNode); NodeAppender.prepend(hostNode, [controlFlowStorageNode]); - this.hostNodesWithControlFlowNode.set(hostNode, controlFlowStorageNode); - NodeUtils.parentizeAst(functionNode); + this.hostNodesWithControlFlowNode.set(hostNode, controlFlowStorageNode); return functionNode; } + /** + * @param {TControlFlowStorage} controlFlowStorage + * @returns {VariableDeclaration} + */ + protected getControlFlowStorageNode (controlFlowStorage: TControlFlowStorage): ESTree.VariableDeclaration { + const controlFlowStorageCustomNode: ICustomNode> = + this.controlFlowCustomNodeFactory(ControlFlowCustomNode.ControlFlowStorageNode); + + controlFlowStorageCustomNode.initialize(controlFlowStorage); + + const controlFlowStorageNode: ESTree.Node = controlFlowStorageCustomNode.getNode()[0]; + + if (!NodeGuards.isVariableDeclarationNode(controlFlowStorageNode)) { + throw new Error('`controlFlowStorageNode` should contain `VariableDeclaration` node with control flow storage object'); + } + + return controlFlowStorageNode; + } + /** * @param {TNodeWithStatements} hostNode * @returns {TControlFlowStorage} @@ -175,7 +190,9 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { private getControlFlowStorage (hostNode: TNodeWithStatements): TControlFlowStorage { const controlFlowStorage: TControlFlowStorage = this.controlFlowStorageFactory(); - if (this.controlFlowData.has(hostNode)) { + const hostControlFlowStorage: TControlFlowStorage | null = this.controlFlowData.get(hostNode) ?? null; + + if (hostControlFlowStorage) { const existingControlFlowStorageNode: ESTree.VariableDeclaration | null = this.hostNodesWithControlFlowNode.get(hostNode) ?? null; @@ -183,31 +200,12 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { NodeAppender.remove(hostNode, existingControlFlowStorageNode); } - const hostControlFlowStorage: TControlFlowStorage = this.controlFlowData.get(hostNode); - controlFlowStorage.mergeWith(hostControlFlowStorage, true); } - return controlFlowStorage; - } - - /** - * @param {TControlFlowStorage} controlFlowStorage - * @returns {VariableDeclaration} - */ - private getControlFlowStorageNode (controlFlowStorage: TControlFlowStorage): ESTree.VariableDeclaration { - const controlFlowStorageCustomNode: ICustomNode> = - this.controlFlowCustomNodeFactory(ControlFlowCustomNode.ControlFlowStorageNode); - - controlFlowStorageCustomNode.initialize(controlFlowStorage); - - const controlFlowStorageNode: ESTree.Node = controlFlowStorageCustomNode.getNode()[0]; - - if (!NodeGuards.isVariableDeclarationNode(controlFlowStorageNode)) { - throw new Error('`controlFlowStorageNode` should contain `VariableDeclaration` node with control flow storage object'); - } + this.controlFlowData.set(hostNode, controlFlowStorage); - return controlFlowStorageNode; + return controlFlowStorage; } /** @@ -239,11 +237,7 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { * @returns {boolean} */ private isVisitedFunctionNode (node: ESTree.Node): boolean { - return ( - NodeGuards.isFunctionDeclarationNode(node) || - NodeGuards.isFunctionExpressionNode(node) || - NodeGuards.isArrowFunctionExpressionNode(node) - ) && this.visitedFunctionNodes.has(node); + return NodeGuards.isFunctionNode(node) && this.visitedFunctionNodes.has(node); } /** @@ -253,15 +247,18 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { private transformFunctionBody (functionNodeBody: ESTree.BlockStatement, controlFlowStorage: TControlFlowStorage): void { estraverse.replace(functionNodeBody, { enter: (node: ESTree.Node, parentNode: ESTree.Node | null): estraverse.VisitorOption | ESTree.Node => { - if (NodeMetadata.isIgnoredNode(node)) { - return estraverse.VisitorOption.Skip; - } + const shouldBreakTraverse = !parentNode + || NodeMetadata.isIgnoredNode(node) + || this.isVisitedFunctionNode(node); - if (this.isVisitedFunctionNode(node) || !parentNode) { - return estraverse.VisitorOption.Skip; + if (shouldBreakTraverse) { + return estraverse.VisitorOption.Break; } - if (!FunctionControlFlowTransformer.controlFlowReplacersMap.has(node.type)) { + const controlFlowReplacerName: ControlFlowReplacer | null = this.controlFlowReplacersMap.get(node.type) + ?? null; + + if (!controlFlowReplacerName) { return node; } @@ -269,17 +266,12 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { return node; } - const controlFlowReplacerName: ControlFlowReplacer = FunctionControlFlowTransformer - .controlFlowReplacersMap.get(node.type); + const replacedNode: ESTree.Node = this.controlFlowReplacerFactory(controlFlowReplacerName) + .replace(node, parentNode, controlFlowStorage); - if (controlFlowReplacerName === undefined) { - return node; - } + NodeUtils.parentizeNode(replacedNode, parentNode); - return { - ...this.controlFlowReplacerFactory(controlFlowReplacerName).replace(node, parentNode, controlFlowStorage), - parentNode - }; + return replacedNode; } }); } diff --git a/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts b/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts new file mode 100644 index 000000000..ae58e8543 --- /dev/null +++ b/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts @@ -0,0 +1,89 @@ +import { inject, injectable, } from 'inversify'; +import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; + +import * as estraverse from '@javascript-obfuscator/estraverse'; +import * as ESTree from 'estree'; + +import { TControlFlowCustomNodeFactory } from '../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; +import { TControlFlowReplacerFactory } from '../../types/container/node-transformers/TControlFlowReplacerFactory'; +import { TControlFlowStorageFactory } from '../../types/container/node-transformers/TControlFlowStorageFactory'; + +import { IOptions } from '../../interfaces/options/IOptions'; +import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; +import { IVisitor } from '../../interfaces/node-transformers/IVisitor'; + +import { ControlFlowReplacer } from '../../enums/node-transformers/control-flow-transformers/control-flow-replacers/ControlFlowReplacer'; +import { NodeType } from '../../enums/node/NodeType'; +import { NodeTransformationStage } from '../../enums/node-transformers/NodeTransformationStage'; +import { NodeTransformer } from '../../enums/node-transformers/NodeTransformer'; + +import { FunctionControlFlowTransformer } from './FunctionControlFlowTransformer'; +import { NodeGuards } from '../../node/NodeGuards'; + +@injectable() +export class StringArrayControlFlowTransformer extends FunctionControlFlowTransformer { + /** + * @type {NodeTransformer[]} + */ + public override readonly runAfter: NodeTransformer[] = [ + NodeTransformer.StringArrayTransformer, + NodeTransformer.StringArrayRotateFunctionTransformer, + NodeTransformer.StringArrayScopeCallsWrapperTransformer + ]; + + /** + * @type {Map } + */ + protected override readonly controlFlowReplacersMap: Map = new Map([ + [NodeType.Literal, ControlFlowReplacer.StringArrayCallControlFlowReplacer] + ]); + + /** + * @param {TControlFlowStorageFactory} controlFlowStorageFactory + * @param {TControlFlowReplacerFactory} controlFlowReplacerFactory + * @param {TControlFlowCustomNodeFactory} controlFlowCustomNodeFactory + * @param {IRandomGenerator} randomGenerator + * @param {IOptions} options + */ + public constructor ( + @inject(ServiceIdentifiers.Factory__TControlFlowStorage) + controlFlowStorageFactory: TControlFlowStorageFactory, + @inject(ServiceIdentifiers.Factory__IControlFlowReplacer) + controlFlowReplacerFactory: TControlFlowReplacerFactory, + @inject(ServiceIdentifiers.Factory__IControlFlowCustomNode) + controlFlowCustomNodeFactory: TControlFlowCustomNodeFactory, + @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, + @inject(ServiceIdentifiers.IOptions) options: IOptions + ) { + super( + controlFlowStorageFactory, + controlFlowReplacerFactory, + controlFlowCustomNodeFactory, + randomGenerator, + options + ); + } + + /** + * @param {NodeTransformationStage} nodeTransformationStage + * @returns {IVisitor | null} + */ + public override getVisitor (nodeTransformationStage: NodeTransformationStage): IVisitor | null { + switch (nodeTransformationStage) { + case NodeTransformationStage.StringArray: + return { + leave: ( + node: ESTree.Node, + parentNode: ESTree.Node | null + ): ESTree.Node | estraverse.VisitorOption | void => { + if (parentNode && NodeGuards.isFunctionNode(node)) { + return this.transformNode(node, parentNode); + } + } + }; + + default: + return null; + } + } +} diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts index cef311376..9e5065d0a 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts @@ -49,26 +49,6 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace this.options = options; } - /** - * @param {Map>} identifierDataByControlFlowStorageId - * @param {string} controlFlowStorageId - * @returns {Map} - */ - protected static getStorageKeysByIdForCurrentStorage ( - identifierDataByControlFlowStorageId: Map>, - controlFlowStorageId: string - ): Map { - let storageKeysById: Map; - - if (identifierDataByControlFlowStorageId.has(controlFlowStorageId)) { - storageKeysById = >identifierDataByControlFlowStorageId.get(controlFlowStorageId); - } else { - storageKeysById = new Map (); - } - - return storageKeysById; - } - /** * @param {ICustomNode} customNode * @param {TControlFlowStorage} controlFlowStorage @@ -83,22 +63,21 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace usingExistingIdentifierChance: number ): string { const controlFlowStorageId: string = controlFlowStorage.getStorageId(); - const storageKeysById: Map = AbstractControlFlowReplacer - .getStorageKeysByIdForCurrentStorage(this.replacerDataByControlFlowStorageId, controlFlowStorageId); - const storageKeysForCurrentId: string[] | undefined = storageKeysById.get(replacerId); - - if ( - this.randomGenerator.getMathRandom() < usingExistingIdentifierChance && - storageKeysForCurrentId && - storageKeysForCurrentId.length - ) { + const storageKeysById: Map = this.replacerDataByControlFlowStorageId.get(controlFlowStorageId) + ?? new Map (); + const storageKeysForCurrentId: string[] | null = storageKeysById.get(replacerId) ?? null; + + const shouldPickFromStorageKeysById = this.randomGenerator.getMathRandom() < usingExistingIdentifierChance + && storageKeysForCurrentId?.length; + + if (shouldPickFromStorageKeysById) { return this.randomGenerator.getRandomGenerator().pickone(storageKeysForCurrentId); } const generateStorageKey: (length: number) => string = (length: number) => { const key: string = this.randomGenerator.getRandomString(length); - if (controlFlowStorage.getStorage().has(key)) { + if (controlFlowStorage.has(key)) { return generateStorageKey(length); } diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts new file mode 100644 index 000000000..a321ef16f --- /dev/null +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts @@ -0,0 +1,78 @@ +import { inject, injectable, } from 'inversify'; +import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers'; + +import * as ESTree from 'estree'; + +import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; +import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; +import { TInitialData } from '../../../types/TInitialData'; + +import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; +import { IOptions } from '../../../interfaces/options/IOptions'; +import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator'; + +import { ControlFlowCustomNode } from '../../../enums/custom-nodes/ControlFlowCustomNode'; + +import { NodeMetadata } from '../../../node/NodeMetadata'; +import { StringLiteralControlFlowReplacer } from './StringLiteralControlFlowReplacer'; +import { StringLiteralNode } from '../../../custom-nodes/control-flow-flattening-nodes/StringLiteralNode'; +import { NodeLiteralUtils } from '../../../node/NodeLiteralUtils'; + +@injectable() +export class StringArrayCallControlFlowReplacer extends StringLiteralControlFlowReplacer { + /** + * @type {number} + */ + protected static override readonly usingExistingIdentifierChance: number = 1; + + /** + * @param {TControlFlowCustomNodeFactory} controlFlowCustomNodeFactory + * @param {IRandomGenerator} randomGenerator + * @param {IOptions} options + */ + public constructor ( + @inject(ServiceIdentifiers.Factory__IControlFlowCustomNode) + controlFlowCustomNodeFactory: TControlFlowCustomNodeFactory, + @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, + @inject(ServiceIdentifiers.IOptions) options: IOptions + ) { + super(controlFlowCustomNodeFactory, randomGenerator, options); + } + + /** + * @param {Literal} literalNode + * @param {NodeGuards} parentNode + * @param {TControlFlowStorage} controlFlowStorage + * @returns {NodeGuards} + */ + public override replace ( + literalNode: ESTree.Literal, + parentNode: ESTree.Node, + controlFlowStorage: TControlFlowStorage + ): ESTree.Node { + const isStringArrayCallLiteralNode = NodeMetadata.isStringArrayCallLiteralNode(literalNode) + && ( + NodeLiteralUtils.isNumberLiteralNode(literalNode) + || NodeLiteralUtils.isStringLiteralNode(literalNode) + ); + + if (!isStringArrayCallLiteralNode) { + return literalNode; + } + + const replacerId: string = String(literalNode.value); + const literalFunctionCustomNode: ICustomNode> = + this.controlFlowCustomNodeFactory(ControlFlowCustomNode.StringLiteralNode); + + literalFunctionCustomNode.initialize(literalNode.value); + + const storageKey: string = this.insertCustomNodeToControlFlowStorage( + literalFunctionCustomNode, + controlFlowStorage, + replacerId, + StringArrayCallControlFlowReplacer.usingExistingIdentifierChance + ); + + return this.getControlFlowStorageCallNode(controlFlowStorage.getStorageId(), storageKey); + } +} diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts index 2d20ece5e..7aaa16151 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts @@ -25,7 +25,7 @@ export class StringLiteralControlFlowReplacer extends AbstractControlFlowReplace /** * @type {number} */ - private static readonly usingExistingIdentifierChance: number = 1; + protected static readonly usingExistingIdentifierChance: number = 1; /** * @param {TControlFlowCustomNodeFactory} controlFlowCustomNodeFactory diff --git a/src/node/NodeAppender.ts b/src/node/NodeAppender.ts index e16fd3f37..6600644db 100644 --- a/src/node/NodeAppender.ts +++ b/src/node/NodeAppender.ts @@ -15,10 +15,9 @@ export class NodeAppender { public static append (nodeWithStatements: TNodeWithStatements, statements: TStatement[]): void { statements = NodeAppender.parentizeScopeStatementsBeforeAppend(nodeWithStatements, statements); - NodeAppender.setScopeStatements(nodeWithStatements, [ - ...NodeAppender.getScopeStatements(nodeWithStatements), - ...statements - ]); + const updatedStatements: TStatement[] = NodeAppender.getScopeStatements(nodeWithStatements).concat(statements); + + NodeAppender.setScopeStatements(nodeWithStatements, updatedStatements); } /** @@ -154,10 +153,9 @@ export class NodeAppender { public static prepend (nodeWithStatements: TNodeWithStatements, statements: TStatement[]): void { statements = NodeAppender.parentizeScopeStatementsBeforeAppend(nodeWithStatements, statements); - NodeAppender.setScopeStatements(nodeWithStatements, [ - ...statements, - ...NodeAppender.getScopeStatements(nodeWithStatements), - ]); + const updatedStatements: TStatement[] = statements.concat(NodeAppender.getScopeStatements(nodeWithStatements)); + + NodeAppender.setScopeStatements(nodeWithStatements, updatedStatements); } /** diff --git a/src/node/NodeLiteralUtils.ts b/src/node/NodeLiteralUtils.ts index 55ada91bb..037b207ad 100644 --- a/src/node/NodeLiteralUtils.ts +++ b/src/node/NodeLiteralUtils.ts @@ -1,10 +1,19 @@ import * as ESTree from 'estree'; +import { TNumberLiteralNode } from '../types/node/TNumberLiteralNode'; import { TStringLiteralNode } from '../types/node/TStringLiteralNode'; import { NodeGuards } from './NodeGuards'; export class NodeLiteralUtils { + /** + * @param {Literal} literalNode + * @returns {literalNode is TNumberLiteralNode} + */ + public static isNumberLiteralNode (literalNode: ESTree.Literal): literalNode is TNumberLiteralNode { + return typeof literalNode.value === 'number'; + } + /** * @param {Literal} literalNode * @returns {literalNode is TStringLiteralNode} diff --git a/src/types/node/TNumberLiteralNode.ts b/src/types/node/TNumberLiteralNode.ts new file mode 100644 index 000000000..11ed90ee1 --- /dev/null +++ b/src/types/node/TNumberLiteralNode.ts @@ -0,0 +1,3 @@ +import * as ESTree from 'estree'; + +export type TNumberLiteralNode = ESTree.Literal & {value: number}; diff --git a/test/dev/dev.ts b/test/dev/dev.ts index cdb55b461..f2dd13207 100644 --- a/test/dev/dev.ts +++ b/test/dev/dev.ts @@ -1,25 +1,31 @@ 'use strict'; -import { readFileAsString } from '../helpers/readFileAsString'; - (function () { const JavaScriptObfuscator: any = require('../../index'); - const code: string = readFileAsString(__dirname + '/../functional-tests/javascript-obfuscator/fixtures/custom-nodes-identifier-names-collision.js'); - let obfuscationResult = JavaScriptObfuscator.obfuscate( - code, + let obfuscatedCode: string = JavaScriptObfuscator.obfuscate( + ` + function foo () { + var bar = 'bar'; + + return bar; + } + + console.log(foo()); + `, { + seed: 1, identifierNamesGenerator: 'mangled', compact: false, + controlFlowFlattening: true, + controlFlowFlatteningThreshold: 1, + simplify: false, stringArray: true, - seed: 429105580 + stringArrayIndexesType: ['hexadecimal-numeric-string'], + stringArrayThreshold: 1 } - ); - - let obfuscatedCode: string = obfuscationResult.getObfuscatedCode(); - let identifierNamesCache = obfuscationResult.getIdentifierNamesCache(); + ).getObfuscatedCode(); console.log(obfuscatedCode); console.log(eval(obfuscatedCode)); - console.log(identifierNamesCache); -})(); \ No newline at end of file +})(); From 7e96e8756d9232b2c06b245a608d3b1c228323a2 Mon Sep 17 00:00:00 2001 From: sanex Date: Mon, 16 Aug 2021 22:19:28 +0300 Subject: [PATCH 02/14] Added `stringArrayCallsTransform` and `stringArrayCallsTransformThreshold` options --- CHANGELOG.md | 4 + README.md | 35 +++- package.json | 2 +- src/JavaScriptObfuscator.ts | 4 +- src/cli/JavaScriptObfuscatorCLI.ts | 12 +- .../modules/storages/StoragesModule.ts | 9 +- .../IControlFlowReplacer.ts | 11 +- src/interfaces/options/IOptions.ts | 2 + .../BlockStatementControlFlowTransformer.ts | 4 + .../FunctionControlFlowTransformer.ts | 193 +++++++++++------- .../StringArrayControlFlowTransformer.ts | 50 +++++ .../AbstractControlFlowReplacer.ts | 30 ++- .../BinaryExpressionControlFlowReplacer.ts | 15 +- .../CallExpressionControlFlowReplacer.ts | 19 +- ...pressionWithOperatorControlFlowReplacer.ts | 11 +- .../LogicalExpressionControlFlowReplacer.ts | 19 +- .../StringArrayCallControlFlowReplacer.ts | 21 +- .../StringLiteralControlFlowReplacer.ts | 19 +- src/options/Options.ts | 14 ++ src/options/OptionsNormalizer.ts | 2 + .../StringArrayCallsTransform.ts | 19 ++ .../normalizer-rules/StringArrayRule.ts | 2 + src/options/presets/Default.ts | 2 + src/options/presets/HighObfuscation.ts | 1 + src/options/presets/LowObfuscation.ts | 4 +- src/options/presets/MediumObfuscation.ts | 1 + src/options/presets/NoCustomNodes.ts | 2 + .../custom-nodes/ControlFlowStorage.ts | 22 +- test/dev/dev.ts | 22 +- .../JavaScriptObfuscator.spec.ts | 2 + ...inaryExpressionControlFlowReplacer.spec.ts | 14 +- .../CallExpressionControlFlowReplacer.spec.ts | 42 ++-- ...gicalExpressionControlFlowReplacer.spec.ts | 22 +- .../StringLiteralControlFlowReplacer.spec.ts | 10 +- .../FunctionControlFlowTransformer.spec.ts | 12 +- .../ObjectExpressionKeysTransformer.spec.ts | 8 +- .../EvalCallExpressionTransformer.spec.ts | 6 +- ...ConditionalCommentObfuscatingGuard.spec.ts | 2 +- ...ringArrayRotateFunctionTransformer.spec.ts | 2 + .../options/OptionsNormalizer.spec.ts | 26 ++- .../JavaScriptObfuscatorRuntime.spec.ts | 2 + 41 files changed, 544 insertions(+), 155 deletions(-) create mode 100644 src/options/normalizer-rules/StringArrayCallsTransform.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 202c864fa..8872a3884 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ Change Log +v2.20.0 +--- +* **New options**: `stringArrayCallsTransform` and `stringArrayCallsTransformThreshold` + v2.19.0 --- * Fixed very rare cases when `rotateStringArray` couldn't rotate array properly diff --git a/README.md b/README.md index 89bbdeb68..f1128151c 100644 --- a/README.md +++ b/README.md @@ -381,10 +381,12 @@ Following options are available for the JS Obfuscator: splitStrings: false, splitStringsChunkLength: 10, stringArray: true, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 0.5, + stringArrayEncoding: [], stringArrayIndexesType: [ 'hexadecimal-number' ], - stringArrayEncoding: [], stringArrayIndexShift: true, stringArrayWrappersCount: 1, stringArrayWrappersChainedCalls: true, @@ -443,8 +445,10 @@ Following options are available for the JS Obfuscator: --split-strings --split-strings-chunk-length --string-array - --string-array-indexes-type '' (comma separated) [hexadecimal-number, hexadecimal-numeric-string] + --string-array-calls-transform + --string-array-calls-transform-threshold --string-array-encoding '' (comma separated) [none, base64, rc4] + --string-array-indexes-type '' (comma separated) [hexadecimal-number, hexadecimal-numeric-string] --string-array-index-shift --string-array-wrappers-count --string-array-wrappers-chained-calls @@ -1111,6 +1115,20 @@ Type: `boolean` Default: `true` Removes string literals and place them in a special array. For instance, the string `"Hello World"` in `var m = "Hello World";` will be replaced with something like `var m = _0x12c456[0x1];` +### `stringArrayCallsTransform` +Type: `boolean` Default: `true` + +##### :warning: [`stringArray`](#stringarray) option must be enabled + +Enables the transformation of calls to the [`stringArray`](#stringarray). All arguments of these calls may be extracted to different object depending on [`stringArrayCallsTransformThreshold`](#stringarraycallstransformthreshold) value. + +### `stringArrayCallsTransformThreshold` +Type: `number` Default: `0.5` + +##### :warning: [`stringArray`](#stringarray) and [`stringArrayCallsTransformThreshold`](#stringarraycallstransformthreshold) options must be enabled + +You can use this setting to adjust the probability (from 0 to 1) that calls to the string array will be transformed. + ### `stringArrayEncoding` Type: `string[]` Default: `[]` @@ -1419,7 +1437,7 @@ Unicode escape sequence increases code size greatly and strings easily can be re ## Preset Options ### High obfuscation, low performance -Performance will 50-100% slower than without obfuscation +The performance will be much slower than without obfuscation ```javascript { @@ -1442,6 +1460,8 @@ Performance will 50-100% slower than without obfuscation splitStrings: true, splitStringsChunkLength: 5, stringArray: true, + stringArray: true, + stringArrayCallsTransform: true, stringArrayEncoding: ['rc4'], stringArrayIndexShift: true, stringArrayWrappersCount: 5, @@ -1456,7 +1476,7 @@ Performance will 50-100% slower than without obfuscation ### Medium obfuscation, optimal performance -Performance will 30-35% slower than without obfuscation +The performance will be slower than without obfuscation ```javascript { @@ -1479,6 +1499,8 @@ Performance will 30-35% slower than without obfuscation splitStrings: true, splitStringsChunkLength: 10, stringArray: true, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 0.75, stringArrayEncoding: ['base64'], stringArrayIndexShift: true, stringArrayWrappersCount: 2, @@ -1493,7 +1515,7 @@ Performance will 30-35% slower than without obfuscation ### Low obfuscation, High performance -Performance will slightly slower than without obfuscation +The performance will be at a relatively normal level ```javascript { @@ -1513,6 +1535,7 @@ Performance will slightly slower than without obfuscation simplify: true, splitStrings: false, stringArray: true, + stringArrayCallsTransform: false, stringArrayEncoding: [], stringArrayIndexShift: true, stringArrayWrappersCount: 1, @@ -1544,6 +1567,8 @@ Performance will slightly slower than without obfuscation simplify: true, splitStrings: false, stringArray: true, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 0.5, stringArrayEncoding: [], stringArrayIndexShift: true, stringArrayWrappersCount: 1, diff --git a/package.json b/package.json index 75c7ecd45..bee0c66ff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "javascript-obfuscator", - "version": "2.19.0", + "version": "2.20.0", "description": "JavaScript obfuscator", "keywords": [ "obfuscator", diff --git a/src/JavaScriptObfuscator.ts b/src/JavaScriptObfuscator.ts index 0e61ccf0b..4728c05a3 100644 --- a/src/JavaScriptObfuscator.ts +++ b/src/JavaScriptObfuscator.ts @@ -221,9 +221,7 @@ export class JavaScriptObfuscator implements IJavaScriptObfuscator { astTree = this.runNodeTransformationStage(astTree, NodeTransformationStage.DeadCodeInjection); } - if (this.options.controlFlowFlattening) { - astTree = this.runNodeTransformationStage(astTree, NodeTransformationStage.ControlFlowFlattening); - } + astTree = this.runNodeTransformationStage(astTree, NodeTransformationStage.ControlFlowFlattening); if (this.options.renameProperties) { astTree = this.runNodeTransformationStage(astTree, NodeTransformationStage.RenameProperties); diff --git a/src/cli/JavaScriptObfuscatorCLI.ts b/src/cli/JavaScriptObfuscatorCLI.ts index ed41723b1..ca4b88b8e 100644 --- a/src/cli/JavaScriptObfuscatorCLI.ts +++ b/src/cli/JavaScriptObfuscatorCLI.ts @@ -371,9 +371,19 @@ export class JavaScriptObfuscatorCLI implements IInitializable { ) .option( '--string-array ', - 'Disables gathering of all literal strings into an array and replacing every literal string with an array call', + 'Enables gathering of all literal strings into an array and replacing every literal string with an array call', BooleanSanitizer ) + .option( + '--string-array-calls-transform ', + 'Enables the transformation of calls to the string array', + BooleanSanitizer + ) + .option( + '--string-array-calls-transform-threshold ', + 'The probability that that calls to the string array will be transformed', + parseFloat + ) .option( '--string-array-encoding (comma separated, without whitespaces)', 'Encodes each string in strings array using base64 or rc4 (this option can slow down your code speed). ' + diff --git a/src/container/modules/storages/StoragesModule.ts b/src/container/modules/storages/StoragesModule.ts index 3e0227210..54d13fa5f 100644 --- a/src/container/modules/storages/StoragesModule.ts +++ b/src/container/modules/storages/StoragesModule.ts @@ -3,6 +3,7 @@ import { ServiceIdentifiers } from '../../ServiceIdentifiers'; import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TCustomCodeHelperGroupStorage } from '../../../types/storages/TCustomCodeHelperGroupStorage'; +import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { IGlobalIdentifierNamesCacheStorage } from '../../../interfaces/storages/identifier-names-cache/IGlobalIdentifierNamesCacheStorage'; import { ILiteralNodesCacheStorage } from '../../../interfaces/storages/string-array-transformers/ILiteralNodesCacheStorage'; @@ -61,12 +62,18 @@ export const storagesModule: interfaces.ContainerModule = new ContainerModule((b return (): TControlFlowStorage => { const constructor: interfaces.Newable = context.container .get>(ServiceIdentifiers.Newable__TControlFlowStorage); + const identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory = context.container + .get(ServiceIdentifiers.Factory__IIdentifierNamesGenerator); const randomGenerator: IRandomGenerator = context.container .get(ServiceIdentifiers.IRandomGenerator); const options: IOptions = context.container .get(ServiceIdentifiers.IOptions); - const storage: TControlFlowStorage = new constructor(randomGenerator, options); + const storage: TControlFlowStorage = new constructor( + identifierNamesGeneratorFactory, + randomGenerator, + options + ); storage.initialize(); diff --git a/src/interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer.ts b/src/interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer.ts index bd868ff2c..b5a302911 100644 --- a/src/interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer.ts +++ b/src/interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer.ts @@ -1,17 +1,20 @@ import * as ESTree from 'estree'; import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; +import { TNodeWithLexicalScope } from '../../../types/node/TNodeWithLexicalScope'; export interface IControlFlowReplacer { /** - * @param node - * @param parentNode - * @param controlFlowStorage - * @returns ESTree.Node + * @param {Node} node + * @param {Node} parentNode + * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode + * @param {TControlFlowStorage} controlFlowStorage + * @returns {Node} */ replace ( node: ESTree.Node, parentNode: ESTree.Node, + controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage ): ESTree.Node; } diff --git a/src/interfaces/options/IOptions.ts b/src/interfaces/options/IOptions.ts index 07d480c98..65e15f55d 100644 --- a/src/interfaces/options/IOptions.ts +++ b/src/interfaces/options/IOptions.ts @@ -50,6 +50,8 @@ export interface IOptions { readonly splitStrings: boolean; readonly splitStringsChunkLength: number; readonly stringArray: boolean; + readonly stringArrayCallsTransform: boolean; + readonly stringArrayCallsTransformThreshold: number; readonly stringArrayEncoding: TStringArrayEncoding[]; readonly stringArrayIndexesType: TStringArrayIndexesType[]; readonly stringArrayIndexShift: boolean; diff --git a/src/node-transformers/control-flow-transformers/BlockStatementControlFlowTransformer.ts b/src/node-transformers/control-flow-transformers/BlockStatementControlFlowTransformer.ts index 595cd66ea..62ff4b8bf 100644 --- a/src/node-transformers/control-flow-transformers/BlockStatementControlFlowTransformer.ts +++ b/src/node-transformers/control-flow-transformers/BlockStatementControlFlowTransformer.ts @@ -101,6 +101,10 @@ export class BlockStatementControlFlowTransformer extends AbstractNodeTransforme * @returns {IVisitor | null} */ public getVisitor (nodeTransformationStage: NodeTransformationStage): IVisitor | null { + if (!this.options.controlFlowFlattening) { + return null; + } + switch (nodeTransformationStage) { case NodeTransformationStage.ControlFlowFlattening: return { diff --git a/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts b/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts index 66aee363f..9df56a05e 100644 --- a/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts +++ b/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts @@ -54,32 +54,32 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { /** * @type {Map} */ - private readonly controlFlowData: Map = new Map(); - - /** - * @type {Set} - */ - private readonly visitedFunctionNodes: Set = new Set(); + protected readonly controlFlowData: Map = new Map(); /** * @type {WeakMap} */ - private readonly hostNodesWithControlFlowNode: WeakMap = new WeakMap(); + protected readonly hostNodesWithControlFlowNode: WeakMap = new WeakMap(); /** * @type {TControlFlowReplacerFactory} */ - private readonly controlFlowReplacerFactory: TControlFlowReplacerFactory; + protected readonly controlFlowReplacerFactory: TControlFlowReplacerFactory; /** * @type {TControlFlowStorageFactory} */ - private readonly controlFlowStorageFactory: TControlFlowStorageFactory; + protected readonly controlFlowStorageFactory: TControlFlowStorageFactory; /** * @type {TControlFlowCustomNodeFactory} */ - private readonly controlFlowCustomNodeFactory: TControlFlowCustomNodeFactory; + protected readonly controlFlowCustomNodeFactory: TControlFlowCustomNodeFactory; + + /** + * @type {WeakSet} + */ + protected readonly visitedFunctionNodes: WeakSet = new WeakSet(); /** * @param {TControlFlowStorageFactory} controlFlowStorageFactory @@ -110,6 +110,10 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { * @returns {IVisitor | null} */ public getVisitor (nodeTransformationStage: NodeTransformationStage): IVisitor | null { + if (!this.options.controlFlowFlattening) { + return null; + } + switch (nodeTransformationStage) { case NodeTransformationStage.ControlFlowFlattening: return { @@ -143,76 +147,80 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { const hostNode: TNodeWithStatements = this.getHostNode(functionNode.body); const controlFlowStorage: TControlFlowStorage = this.getControlFlowStorage(hostNode); - this.transformFunctionBody(functionNode.body, controlFlowStorage); + this.transformFunctionBody(functionNode, controlFlowStorage); if (!controlFlowStorage.getLength()) { return functionNode; } - const controlFlowStorageCustomNode: ICustomNode> = - this.controlFlowCustomNodeFactory(ControlFlowCustomNode.ControlFlowStorageNode); - - controlFlowStorageCustomNode.initialize(controlFlowStorage); - const controlFlowStorageNode: ESTree.VariableDeclaration = this.getControlFlowStorageNode(controlFlowStorage); - NodeUtils.parentizeAst(controlFlowStorageNode); - NodeAppender.prepend(hostNode, [controlFlowStorageNode]); - - this.hostNodesWithControlFlowNode.set(hostNode, controlFlowStorageNode); + this.appendControlFlowStorageNode(hostNode, controlFlowStorageNode); return functionNode; } /** + * @param {BlockStatement} functionNode * @param {TControlFlowStorage} controlFlowStorage - * @returns {VariableDeclaration} */ - protected getControlFlowStorageNode (controlFlowStorage: TControlFlowStorage): ESTree.VariableDeclaration { - const controlFlowStorageCustomNode: ICustomNode> = - this.controlFlowCustomNodeFactory(ControlFlowCustomNode.ControlFlowStorageNode); - - controlFlowStorageCustomNode.initialize(controlFlowStorage); - - const controlFlowStorageNode: ESTree.Node = controlFlowStorageCustomNode.getNode()[0]; - - if (!NodeGuards.isVariableDeclarationNode(controlFlowStorageNode)) { - throw new Error('`controlFlowStorageNode` should contain `VariableDeclaration` node with control flow storage object'); - } - - return controlFlowStorageNode; + protected transformFunctionBody (functionNode: ESTree.Function, controlFlowStorage: TControlFlowStorage): void { + estraverse.replace(functionNode.body, { + enter: (node: ESTree.Node, parentNode: ESTree.Node | null): estraverse.VisitorOption | ESTree.Node => + this.transformFunctionBodyNode(node, parentNode, functionNode, controlFlowStorage) + }); } /** - * @param {TNodeWithStatements} hostNode - * @returns {TControlFlowStorage} + * @param {Node} node + * @param {Node | null} parentNode + * @param {Function} functionNode + * @param {TControlFlowStorage} controlFlowStorage + * @returns {ESTraverse.VisitorOption | Node} */ - private getControlFlowStorage (hostNode: TNodeWithStatements): TControlFlowStorage { - const controlFlowStorage: TControlFlowStorage = this.controlFlowStorageFactory(); - - const hostControlFlowStorage: TControlFlowStorage | null = this.controlFlowData.get(hostNode) ?? null; + protected transformFunctionBodyNode ( + node: ESTree.Node, + parentNode: ESTree.Node | null, + functionNode: ESTree.Function, + controlFlowStorage: TControlFlowStorage + ): estraverse.VisitorOption | ESTree.Node { + const shouldSkipTraverse = !parentNode + || NodeMetadata.isIgnoredNode(node) + || this.isVisitedFunctionNode(node); + + if (shouldSkipTraverse) { + return estraverse.VisitorOption.Skip; + } - if (hostControlFlowStorage) { - const existingControlFlowStorageNode: ESTree.VariableDeclaration | null = - this.hostNodesWithControlFlowNode.get(hostNode) ?? null; + const controlFlowReplacerName: ControlFlowReplacer | null = this.controlFlowReplacersMap.get(node.type) + ?? null; - if (existingControlFlowStorageNode) { - NodeAppender.remove(hostNode, existingControlFlowStorageNode); - } + if (!controlFlowReplacerName) { + return node; + } - controlFlowStorage.mergeWith(hostControlFlowStorage, true); + if (!this.isAllowedTransformationByThreshold()) { + return node; } - this.controlFlowData.set(hostNode, controlFlowStorage); + const replacedNode: ESTree.Node = this.controlFlowReplacerFactory(controlFlowReplacerName) + .replace( + node, + parentNode, + functionNode, + controlFlowStorage + ); - return controlFlowStorage; + NodeUtils.parentizeNode(replacedNode, parentNode); + + return replacedNode; } /** * @param {BlockStatement} functionNodeBody * @returns {TNodeWithStatements} */ - private getHostNode (functionNodeBody: ESTree.BlockStatement): TNodeWithStatements { + protected getHostNode (functionNodeBody: ESTree.BlockStatement): TNodeWithStatements { const blockScopesOfNode: TNodeWithStatements[] = NodeStatementUtils.getParentNodesWithStatements(functionNodeBody); if (blockScopesOfNode.length === 1) { @@ -233,46 +241,75 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { } /** - * @param {NodeGuards} node - * @returns {boolean} + * @param {TNodeWithStatements} hostNode + * @returns {TControlFlowStorage} */ - private isVisitedFunctionNode (node: ESTree.Node): boolean { - return NodeGuards.isFunctionNode(node) && this.visitedFunctionNodes.has(node); + protected getControlFlowStorage (hostNode: TNodeWithStatements): TControlFlowStorage { + const controlFlowStorage: TControlFlowStorage = this.controlFlowStorageFactory(); + + const hostControlFlowStorage: TControlFlowStorage | null = this.controlFlowData.get(hostNode) ?? null; + + if (hostControlFlowStorage) { + const existingControlFlowStorageNode: ESTree.VariableDeclaration | null = + this.hostNodesWithControlFlowNode.get(hostNode) ?? null; + + if (existingControlFlowStorageNode) { + NodeAppender.remove(hostNode, existingControlFlowStorageNode); + } + + controlFlowStorage.mergeWith(hostControlFlowStorage, true); + } + + this.controlFlowData.set(hostNode, controlFlowStorage); + + return controlFlowStorage; } /** - * @param {BlockStatement} functionNodeBody * @param {TControlFlowStorage} controlFlowStorage + * @returns {VariableDeclaration} */ - private transformFunctionBody (functionNodeBody: ESTree.BlockStatement, controlFlowStorage: TControlFlowStorage): void { - estraverse.replace(functionNodeBody, { - enter: (node: ESTree.Node, parentNode: ESTree.Node | null): estraverse.VisitorOption | ESTree.Node => { - const shouldBreakTraverse = !parentNode - || NodeMetadata.isIgnoredNode(node) - || this.isVisitedFunctionNode(node); + protected getControlFlowStorageNode (controlFlowStorage: TControlFlowStorage): ESTree.VariableDeclaration { + const controlFlowStorageCustomNode: ICustomNode> = + this.controlFlowCustomNodeFactory(ControlFlowCustomNode.ControlFlowStorageNode); - if (shouldBreakTraverse) { - return estraverse.VisitorOption.Break; - } + controlFlowStorageCustomNode.initialize(controlFlowStorage); - const controlFlowReplacerName: ControlFlowReplacer | null = this.controlFlowReplacersMap.get(node.type) - ?? null; + const controlFlowStorageNode: ESTree.Node = controlFlowStorageCustomNode.getNode()[0]; - if (!controlFlowReplacerName) { - return node; - } + if (!NodeGuards.isVariableDeclarationNode(controlFlowStorageNode)) { + throw new Error('`controlFlowStorageNode` should contain `VariableDeclaration` node with control flow storage object'); + } - if (this.randomGenerator.getMathRandom() > this.options.controlFlowFlatteningThreshold) { - return node; - } + return controlFlowStorageNode; + } + + /** + * @param {TNodeWithStatements} hostNode + * @param {VariableDeclaration} controlFlowStorageNode + */ + protected appendControlFlowStorageNode ( + hostNode: TNodeWithStatements, + controlFlowStorageNode: ESTree.VariableDeclaration + ): void { + NodeUtils.parentizeAst(controlFlowStorageNode); + NodeAppender.prepend(hostNode, [controlFlowStorageNode]); - const replacedNode: ESTree.Node = this.controlFlowReplacerFactory(controlFlowReplacerName) - .replace(node, parentNode, controlFlowStorage); + this.hostNodesWithControlFlowNode.set(hostNode, controlFlowStorageNode); + } - NodeUtils.parentizeNode(replacedNode, parentNode); + /** + * @param {NodeGuards} node + * @returns {boolean} + */ + protected isVisitedFunctionNode (node: ESTree.Node): boolean { + return NodeGuards.isFunctionNode(node) && this.visitedFunctionNodes.has(node); + } - return replacedNode; - } - }); + /** + * @returns {boolean} + */ + protected isAllowedTransformationByThreshold (): boolean { + return this.randomGenerator.getMathRandom() <= this.options.controlFlowFlatteningThreshold; } } diff --git a/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts b/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts index ae58e8543..75a5db654 100644 --- a/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts +++ b/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts @@ -6,7 +6,9 @@ import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; import { TControlFlowReplacerFactory } from '../../types/container/node-transformers/TControlFlowReplacerFactory'; +import { TControlFlowStorage } from '../../types/storages/TControlFlowStorage'; import { TControlFlowStorageFactory } from '../../types/container/node-transformers/TControlFlowStorageFactory'; +import { TNodeWithStatements } from '../../types/node/TNodeWithStatements'; import { IOptions } from '../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; @@ -38,6 +40,11 @@ export class StringArrayControlFlowTransformer extends FunctionControlFlowTransf [NodeType.Literal, ControlFlowReplacer.StringArrayCallControlFlowReplacer] ]); + /** + * @type {WeakSet} + */ + protected readonly controlFlowStorageNodes: WeakSet = new WeakSet(); + /** * @param {TControlFlowStorageFactory} controlFlowStorageFactory * @param {TControlFlowReplacerFactory} controlFlowReplacerFactory @@ -86,4 +93,47 @@ export class StringArrayControlFlowTransformer extends FunctionControlFlowTransf return null; } } + + /** + * @param {Node} node + * @param {Node | null} parentNode + * @param {Function} functionNode + * @param {TControlFlowStorage} controlFlowStorage + * @returns {ESTraverse.VisitorOption | Node} + */ + protected override transformFunctionBodyNode ( + node: ESTree.Node, + parentNode: ESTree.Node | null, + functionNode: ESTree.Function, + controlFlowStorage: TControlFlowStorage + ): estraverse.VisitorOption | ESTree.Node { + const shouldBreakTraverse = NodeGuards.isVariableDeclarationNode(node) + && this.controlFlowStorageNodes.has(node); + + if (shouldBreakTraverse) { + return estraverse.VisitorOption.Break; + } + + return super.transformFunctionBodyNode(node, parentNode, functionNode, controlFlowStorage); + } + + /** + * @param {TNodeWithStatements} hostNode + * @param {VariableDeclaration} controlFlowStorageNode + */ + protected override appendControlFlowStorageNode ( + hostNode: TNodeWithStatements, + controlFlowStorageNode: ESTree.VariableDeclaration + ): void { + super.appendControlFlowStorageNode(hostNode, controlFlowStorageNode); + + this.controlFlowStorageNodes.add(controlFlowStorageNode); + } + + /** + * @returns {boolean} + */ + protected override isAllowedTransformationByThreshold (): boolean { + return this.randomGenerator.getMathRandom() <= this.options.stringArrayCallsTransformThreshold; + } } diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts index 9e5065d0a..3ee2abd49 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts @@ -5,9 +5,12 @@ import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; +import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; +import { TNodeWithLexicalScope } from '../../../types/node/TNodeWithLexicalScope'; import { IControlFlowReplacer } from '../../../interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; +import { IIdentifierNamesGenerator } from '../../../interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator'; import { IOptions } from '../../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator'; @@ -18,6 +21,11 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace */ protected readonly controlFlowCustomNodeFactory: TControlFlowCustomNodeFactory; + /** + * @type {IIdentifierNamesGenerator} + */ + protected readonly identifierNamesGenerator: IIdentifierNamesGenerator; + /** * @type {IOptions} */ @@ -35,22 +43,27 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace /** * @param {TControlFlowCustomNodeFactory} controlFlowCustomNodeFactory + * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory * @param {IRandomGenerator} randomGenerator * @param {IOptions} options */ public constructor ( @inject(ServiceIdentifiers.Factory__IControlFlowCustomNode) controlFlowCustomNodeFactory: TControlFlowCustomNodeFactory, + @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator) + identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory, @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, @inject(ServiceIdentifiers.IOptions) options: IOptions ) { this.controlFlowCustomNodeFactory = controlFlowCustomNodeFactory; + this.identifierNamesGenerator = identifierNamesGeneratorFactory(options); this.randomGenerator = randomGenerator; this.options = options; } /** * @param {ICustomNode} customNode + * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode * @param {TControlFlowStorage} controlFlowStorage * @param {string} replacerId * @param {number} usingExistingIdentifierChance @@ -58,6 +71,7 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace */ protected insertCustomNodeToControlFlowStorage ( customNode: ICustomNode, + controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage, replacerId: string, usingExistingIdentifierChance: number @@ -74,16 +88,16 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace return this.randomGenerator.getRandomGenerator().pickone(storageKeysForCurrentId); } - const generateStorageKey: (length: number) => string = (length: number) => { - const key: string = this.randomGenerator.getRandomString(length); + const generateStorageKey: () => string = () => { + const key: string = this.identifierNamesGenerator.generateNext(); if (controlFlowStorage.has(key)) { - return generateStorageKey(length); + return generateStorageKey(); } return key; }; - const storageKey: string = generateStorageKey(5); + const storageKey: string = generateStorageKey(); storageKeysById.set(replacerId, [storageKey]); this.replacerDataByControlFlowStorageId.set(controlFlowStorageId, storageKeysById); @@ -95,8 +109,14 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace /** * @param {Node} node * @param {Node} parentNode + * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode * @param {TControlFlowStorage} controlFlowStorage * @returns {Node} */ - public abstract replace (node: ESTree.Node, parentNode: ESTree.Node, controlFlowStorage: TControlFlowStorage): ESTree.Node; + public abstract replace ( + node: ESTree.Node, + parentNode: ESTree.Node, + controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, + controlFlowStorage: TControlFlowStorage + ): ESTree.Node; } diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.ts index 3dc0bbc5c..e169d7108 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.ts @@ -5,7 +5,9 @@ import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; +import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; +import { TNodeWithLexicalScope } from '../../../types/node/TNodeWithLexicalScope'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../../../interfaces/options/IOptions'; @@ -25,27 +27,37 @@ export class BinaryExpressionControlFlowReplacer extends ExpressionWithOperatorC /** * @param {TControlFlowCustomNodeFactory} controlFlowCustomNodeFactory + * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory * @param {IRandomGenerator} randomGenerator * @param {IOptions} options */ public constructor ( @inject(ServiceIdentifiers.Factory__IControlFlowCustomNode) controlFlowCustomNodeFactory: TControlFlowCustomNodeFactory, + @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator) + identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory, @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, @inject(ServiceIdentifiers.IOptions) options: IOptions ) { - super(controlFlowCustomNodeFactory, randomGenerator, options); + super( + controlFlowCustomNodeFactory, + identifierNamesGeneratorFactory, + randomGenerator, + options + ); } /** * @param {BinaryExpression} binaryExpressionNode * @param {Node} parentNode + * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode * @param {TControlFlowStorage} controlFlowStorage * @returns {Node} */ public replace ( binaryExpressionNode: ESTree.BinaryExpression, parentNode: ESTree.Node, + controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage ): ESTree.Node { const operator: ESTree.BinaryOperator = binaryExpressionNode.operator; @@ -56,6 +68,7 @@ export class BinaryExpressionControlFlowReplacer extends ExpressionWithOperatorC const storageKey: string = this.insertCustomNodeToControlFlowStorage( binaryExpressionFunctionCustomNode, + controlFlowStorageLexicalScopeNode, controlFlowStorage, operator, BinaryExpressionControlFlowReplacer.usingExistingIdentifierChance diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.ts index a67e9a306..ddf1fee32 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.ts @@ -5,7 +5,9 @@ import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; +import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; +import { TNodeWithLexicalScope } from '../../../types/node/TNodeWithLexicalScope'; import { TStatement } from '../../../types/node/TStatement'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; @@ -28,27 +30,37 @@ export class CallExpressionControlFlowReplacer extends AbstractControlFlowReplac /** * @param {TControlFlowCustomNodeFactory} controlFlowCustomNodeFactory + * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory * @param {IRandomGenerator} randomGenerator * @param {IOptions} options */ public constructor ( @inject(ServiceIdentifiers.Factory__IControlFlowCustomNode) controlFlowCustomNodeFactory: TControlFlowCustomNodeFactory, + @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator) + identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory, @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, @inject(ServiceIdentifiers.IOptions) options: IOptions ) { - super(controlFlowCustomNodeFactory, randomGenerator, options); + super( + controlFlowCustomNodeFactory, + identifierNamesGeneratorFactory, + randomGenerator, + options + ); } /** * @param {CallExpression} callExpressionNode - * @param {NodeGuards} parentNode + * @param {Node} parentNode + * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode * @param {TControlFlowStorage} controlFlowStorage - * @returns {NodeGuards} + * @returns {Node} */ public replace ( callExpressionNode: ESTree.CallExpression, parentNode: ESTree.Node, + controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage ): ESTree.Node { const callee: ESTree.Expression = callExpressionNode.callee; @@ -66,6 +78,7 @@ export class CallExpressionControlFlowReplacer extends AbstractControlFlowReplac const storageKey: string = this.insertCustomNodeToControlFlowStorage( callExpressionFunctionCustomNode, + controlFlowStorageLexicalScopeNode, controlFlowStorage, replacerId, CallExpressionControlFlowReplacer.usingExistingIdentifierChance diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/ExpressionWithOperatorControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/ExpressionWithOperatorControlFlowReplacer.ts index 45e51ffcb..88e5129f6 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/ExpressionWithOperatorControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/ExpressionWithOperatorControlFlowReplacer.ts @@ -4,6 +4,7 @@ import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers'; import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; +import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; import { TStatement } from '../../../types/node/TStatement'; @@ -21,16 +22,24 @@ import { NodeGuards } from '../../../node/NodeGuards'; export abstract class ExpressionWithOperatorControlFlowReplacer extends AbstractControlFlowReplacer { /** * @param {TControlFlowCustomNodeFactory} controlFlowCustomNodeFactory + * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory * @param {IRandomGenerator} randomGenerator * @param {IOptions} options */ public constructor ( @inject(ServiceIdentifiers.Factory__IControlFlowCustomNode) controlFlowCustomNodeFactory: TControlFlowCustomNodeFactory, + @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator) + identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory, @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, @inject(ServiceIdentifiers.IOptions) options: IOptions ) { - super(controlFlowCustomNodeFactory, randomGenerator, options); + super( + controlFlowCustomNodeFactory, + identifierNamesGeneratorFactory, + randomGenerator, + options + ); } /** diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer.ts index a03de6da3..927d3f3d6 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer.ts @@ -5,7 +5,9 @@ import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; +import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; +import { TNodeWithLexicalScope } from '../../../types/node/TNodeWithLexicalScope'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../../../interfaces/options/IOptions'; @@ -27,27 +29,37 @@ export class LogicalExpressionControlFlowReplacer extends ExpressionWithOperator /** * @param {TControlFlowCustomNodeFactory} controlFlowCustomNodeFactory + * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory * @param {IRandomGenerator} randomGenerator * @param {IOptions} options */ public constructor ( @inject(ServiceIdentifiers.Factory__IControlFlowCustomNode) controlFlowCustomNodeFactory: TControlFlowCustomNodeFactory, + @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator) + identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory, @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, @inject(ServiceIdentifiers.IOptions) options: IOptions ) { - super(controlFlowCustomNodeFactory, randomGenerator, options); + super( + controlFlowCustomNodeFactory, + identifierNamesGeneratorFactory, + randomGenerator, + options + ); } /** * @param {LogicalExpression} logicalExpressionNode - * @param {NodeGuards} parentNode + * @param {Node} parentNode + * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode * @param {TControlFlowStorage} controlFlowStorage - * @returns {NodeGuards} + * @returns {Node} */ public replace ( logicalExpressionNode: ESTree.LogicalExpression, parentNode: ESTree.Node, + controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage ): ESTree.Node { if (this.checkForProhibitedExpressions(logicalExpressionNode.left, logicalExpressionNode.right)) { @@ -62,6 +74,7 @@ export class LogicalExpressionControlFlowReplacer extends ExpressionWithOperator const storageKey: string = this.insertCustomNodeToControlFlowStorage( logicalExpressionFunctionCustomNode, + controlFlowStorageLexicalScopeNode, controlFlowStorage, operator, LogicalExpressionControlFlowReplacer.usingExistingIdentifierChance diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts index a321ef16f..2e752fc79 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts @@ -5,7 +5,9 @@ import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; +import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; +import { TNodeWithLexicalScope } from '../../../types/node/TNodeWithLexicalScope'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../../../interfaces/options/IOptions'; @@ -23,31 +25,41 @@ export class StringArrayCallControlFlowReplacer extends StringLiteralControlFlow /** * @type {number} */ - protected static override readonly usingExistingIdentifierChance: number = 1; + protected static override readonly usingExistingIdentifierChance: number = 0.5; /** * @param {TControlFlowCustomNodeFactory} controlFlowCustomNodeFactory + * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory * @param {IRandomGenerator} randomGenerator * @param {IOptions} options */ public constructor ( @inject(ServiceIdentifiers.Factory__IControlFlowCustomNode) controlFlowCustomNodeFactory: TControlFlowCustomNodeFactory, + @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator) + identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory, @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, @inject(ServiceIdentifiers.IOptions) options: IOptions ) { - super(controlFlowCustomNodeFactory, randomGenerator, options); + super( + controlFlowCustomNodeFactory, + identifierNamesGeneratorFactory, + randomGenerator, + options + ); } /** * @param {Literal} literalNode - * @param {NodeGuards} parentNode + * @param {Node} parentNode + * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode * @param {TControlFlowStorage} controlFlowStorage - * @returns {NodeGuards} + * @returns {Node} */ public override replace ( literalNode: ESTree.Literal, parentNode: ESTree.Node, + controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage ): ESTree.Node { const isStringArrayCallLiteralNode = NodeMetadata.isStringArrayCallLiteralNode(literalNode) @@ -68,6 +80,7 @@ export class StringArrayCallControlFlowReplacer extends StringLiteralControlFlow const storageKey: string = this.insertCustomNodeToControlFlowStorage( literalFunctionCustomNode, + controlFlowStorageLexicalScopeNode, controlFlowStorage, replacerId, StringArrayCallControlFlowReplacer.usingExistingIdentifierChance diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts index 7aaa16151..3c3d22b70 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts @@ -5,7 +5,9 @@ import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; +import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; +import { TNodeWithLexicalScope } from '../../../types/node/TNodeWithLexicalScope'; import { TStatement } from '../../../types/node/TStatement'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; @@ -29,27 +31,37 @@ export class StringLiteralControlFlowReplacer extends AbstractControlFlowReplace /** * @param {TControlFlowCustomNodeFactory} controlFlowCustomNodeFactory + * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory * @param {IRandomGenerator} randomGenerator * @param {IOptions} options */ public constructor ( @inject(ServiceIdentifiers.Factory__IControlFlowCustomNode) controlFlowCustomNodeFactory: TControlFlowCustomNodeFactory, + @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator) + identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory, @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, @inject(ServiceIdentifiers.IOptions) options: IOptions ) { - super(controlFlowCustomNodeFactory, randomGenerator, options); + super( + controlFlowCustomNodeFactory, + identifierNamesGeneratorFactory, + randomGenerator, + options + ); } /** * @param {Literal} literalNode - * @param {NodeGuards} parentNode + * @param {Node} parentNode + * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode * @param {TControlFlowStorage} controlFlowStorage - * @returns {NodeGuards} + * @returns {Node} */ public replace ( literalNode: ESTree.Literal, parentNode: ESTree.Node, + controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage ): ESTree.Node { if (NodeGuards.isPropertyNode(parentNode) && parentNode.key === literalNode) { @@ -68,6 +80,7 @@ export class StringLiteralControlFlowReplacer extends AbstractControlFlowReplace const storageKey: string = this.insertCustomNodeToControlFlowStorage( literalFunctionCustomNode, + controlFlowStorageLexicalScopeNode, controlFlowStorage, replacerId, StringLiteralControlFlowReplacer.usingExistingIdentifierChance diff --git a/src/options/Options.ts b/src/options/Options.ts index 84044afe3..73028a184 100644 --- a/src/options/Options.ts +++ b/src/options/Options.ts @@ -340,6 +340,20 @@ export class Options implements IOptions { @IsBoolean() public readonly stringArray!: boolean; + /** + * @type {boolean} + */ + @IsBoolean() + public readonly stringArrayCallsTransform!: boolean; + + /** + * @type {number} + */ + @IsNumber() + @Min(0) + @Max(1) + public readonly stringArrayCallsTransformThreshold!: number; + /** * @type {TStringArrayEncoding[]} */ diff --git a/src/options/OptionsNormalizer.ts b/src/options/OptionsNormalizer.ts index 84d269cbc..4a1490a5e 100644 --- a/src/options/OptionsNormalizer.ts +++ b/src/options/OptionsNormalizer.ts @@ -18,6 +18,7 @@ import { SourceMapBaseUrlRule } from './normalizer-rules/SourceMapBaseUrlRule'; import { SourceMapFileNameRule } from './normalizer-rules/SourceMapFileNameRule'; import { SplitStringsChunkLengthRule } from './normalizer-rules/SplitStringsChunkLengthRule'; import { StringArrayRule } from './normalizer-rules/StringArrayRule'; +import { StringArrayCallsTransformRule } from './normalizer-rules/StringArrayCallsTransform'; import { StringArrayEncodingRule } from './normalizer-rules/StringArrayEncodingRule'; import { StringArrayWrappersChainedCallsRule } from './normalizer-rules/StringArrayWappersChainedCalls'; @@ -40,6 +41,7 @@ export class OptionsNormalizer implements IOptionsNormalizer { SourceMapFileNameRule, SplitStringsChunkLengthRule, StringArrayRule, + StringArrayCallsTransformRule, StringArrayEncodingRule, StringArrayWrappersChainedCallsRule, ]; diff --git a/src/options/normalizer-rules/StringArrayCallsTransform.ts b/src/options/normalizer-rules/StringArrayCallsTransform.ts new file mode 100644 index 000000000..e606ba282 --- /dev/null +++ b/src/options/normalizer-rules/StringArrayCallsTransform.ts @@ -0,0 +1,19 @@ +import { TOptionsNormalizerRule } from '../../types/options/TOptionsNormalizerRule'; + +import { IOptions } from '../../interfaces/options/IOptions'; + +/** + * @param {IOptions} options + * @returns {IOptions} + */ +export const StringArrayCallsTransformRule: TOptionsNormalizerRule = (options: IOptions): IOptions => { + if (!options.stringArrayCallsTransform) { + options = { + ...options, + stringArrayCallsTransform: false, + stringArrayCallsTransformThreshold: 0 + }; + } + + return options; +}; diff --git a/src/options/normalizer-rules/StringArrayRule.ts b/src/options/normalizer-rules/StringArrayRule.ts index dd9ff051f..10280982b 100644 --- a/src/options/normalizer-rules/StringArrayRule.ts +++ b/src/options/normalizer-rules/StringArrayRule.ts @@ -15,6 +15,8 @@ export const StringArrayRule: TOptionsNormalizerRule = (options: IOptions): IOpt rotateStringArray: false, shuffleStringArray: false, stringArray: false, + stringArrayCallsTransform: false, + stringArrayCallsTransformThreshold: 0, stringArrayEncoding: [ StringArrayEncoding.None ], diff --git a/src/options/presets/Default.ts b/src/options/presets/Default.ts index de79de299..0e8dc4518 100644 --- a/src/options/presets/Default.ts +++ b/src/options/presets/Default.ts @@ -51,6 +51,8 @@ export const DEFAULT_PRESET: TInputOptions = Object.freeze({ splitStrings: false, splitStringsChunkLength: 10, stringArray: true, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 0.5, stringArrayEncoding: [ StringArrayEncoding.None ], diff --git a/src/options/presets/HighObfuscation.ts b/src/options/presets/HighObfuscation.ts index 0a01af737..e704b8902 100644 --- a/src/options/presets/HighObfuscation.ts +++ b/src/options/presets/HighObfuscation.ts @@ -13,6 +13,7 @@ export const HIGH_OBFUSCATION_PRESET: TInputOptions = Object.freeze({ debugProtectionInterval: true, optionsPreset: OptionsPreset.HighObfuscation, splitStringsChunkLength: 5, + stringArrayCallsTransformThreshold: 1, stringArrayEncoding: [ StringArrayEncoding.Rc4 ], diff --git a/src/options/presets/LowObfuscation.ts b/src/options/presets/LowObfuscation.ts index 8f95cf3f8..a4bd0d95a 100644 --- a/src/options/presets/LowObfuscation.ts +++ b/src/options/presets/LowObfuscation.ts @@ -11,5 +11,7 @@ export const LOW_OBFUSCATION_PRESET: TInputOptions = Object.freeze({ rotateStringArray: true, selfDefending: true, shuffleStringArray: true, - simplify: true + simplify: true, + stringArrayCallsTransform: false, + stringArrayCallsTransformThreshold: 0 }); diff --git a/src/options/presets/MediumObfuscation.ts b/src/options/presets/MediumObfuscation.ts index a88044e6b..721a1cfe9 100644 --- a/src/options/presets/MediumObfuscation.ts +++ b/src/options/presets/MediumObfuscation.ts @@ -14,6 +14,7 @@ export const MEDIUM_OBFUSCATION_PRESET: TInputOptions = Object.freeze({ optionsPreset: OptionsPreset.MediumObfuscation, splitStrings: true, splitStringsChunkLength: 10, + stringArrayCallsTransformThreshold: 0.75, stringArrayEncoding: [ StringArrayEncoding.Base64 ], diff --git a/src/options/presets/NoCustomNodes.ts b/src/options/presets/NoCustomNodes.ts index 647dcde2c..705f995a7 100644 --- a/src/options/presets/NoCustomNodes.ts +++ b/src/options/presets/NoCustomNodes.ts @@ -47,6 +47,8 @@ export const NO_ADDITIONAL_NODES_PRESET: TInputOptions = Object.freeze({ splitStrings: false, splitStringsChunkLength: 0, stringArray: false, + stringArrayCallsTransform: false, + stringArrayCallsTransformThreshold: 0, stringArrayEncoding: [ StringArrayEncoding.None ], diff --git a/src/storages/custom-nodes/ControlFlowStorage.ts b/src/storages/custom-nodes/ControlFlowStorage.ts index 1ee3a3580..808142753 100644 --- a/src/storages/custom-nodes/ControlFlowStorage.ts +++ b/src/storages/custom-nodes/ControlFlowStorage.ts @@ -1,7 +1,10 @@ -import { inject, injectable, } from 'inversify'; +import { inject, injectable, postConstruct, } from 'inversify'; import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; +import { TIdentifierNamesGeneratorFactory } from '../../types/container/generators/TIdentifierNamesGeneratorFactory'; + import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode'; +import { IIdentifierNamesGenerator } from '../../interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator'; import { IOptions } from '../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; @@ -10,13 +13,30 @@ import { MapStorage } from '../MapStorage'; @injectable() export class ControlFlowStorage extends MapStorage { /** + * @type {IIdentifierNamesGenerator} + */ + private readonly identifierNamesGenerator: IIdentifierNamesGenerator; + + /** + * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory * @param {IRandomGenerator} randomGenerator * @param {IOptions} options */ public constructor ( + @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator) + identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory, @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, @inject(ServiceIdentifiers.IOptions) options: IOptions ) { super(randomGenerator, options); + + this.identifierNamesGenerator = identifierNamesGeneratorFactory(options); + } + + @postConstruct() + public override initialize (): void { + super.initialize(); + + this.storageId = this.identifierNamesGenerator.generateNext(); } } diff --git a/test/dev/dev.ts b/test/dev/dev.ts index f2dd13207..5d8a115cb 100644 --- a/test/dev/dev.ts +++ b/test/dev/dev.ts @@ -1,5 +1,7 @@ 'use strict'; +import { StringArrayWrappersType } from '../../src/enums/node-transformers/string-array-transformers/StringArrayWrappersType'; + (function () { const JavaScriptObfuscator: any = require('../../index'); @@ -8,7 +10,13 @@ function foo () { var bar = 'bar'; - return bar; + function baz () { + var baz = 'baz'; + + return baz; + } + + return bar + baz(); } console.log(foo()); @@ -21,8 +29,16 @@ controlFlowFlatteningThreshold: 1, simplify: false, stringArray: true, - stringArrayIndexesType: ['hexadecimal-numeric-string'], - stringArrayThreshold: 1 + stringArrayIndexesType: [ + 'hexadecimal-number', + 'hexadecimal-numeric-string' + ], + stringArrayThreshold: 1, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 0.5, + rotateStringArray: true, + stringArrayWrappersType: StringArrayWrappersType.Function, + transformObjectKeys: true, } ).getObfuscatedCode(); diff --git a/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts b/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts index 9e7573cff..72c87656b 100644 --- a/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts +++ b/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts @@ -1274,6 +1274,8 @@ describe('JavaScriptObfuscator', () => { renameProperties: true, rotateStringArray: true, stringArray: true, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 1, stringArrayEncoding: [ StringArrayEncoding.Base64, StringArrayEncoding.Rc4 diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts index 2712512ec..7f80b77e3 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts @@ -10,8 +10,12 @@ describe('BinaryExpressionControlFlowReplacer', function () { this.timeout(100000); describe('replace', () => { + const variableMatch: string = '_0x([a-f0-9]){4,6}'; + describe('Variant #1 - single binary expression', () => { - const controlFlowStorageCallRegExp: RegExp = /var _0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['\w{5}'\]\(0x1, *0x2\);/; + const controlFlowStorageCallRegExp: RegExp = new RegExp( + `var ${variableMatch} *= *${variableMatch}\\['${variableMatch}'\\]\\(0x1, *0x2\\);` + ); let obfuscatedCode: string; @@ -40,8 +44,12 @@ describe('BinaryExpressionControlFlowReplacer', function () { const samplesCount: number = 1000; const delta: number = 0.1; - const controlFlowStorageCallRegExp1: RegExp = /var _0x(?:[a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['\w{5}'\])\(0x1, *0x2\);/; - const controlFlowStorageCallRegExp2: RegExp = /var _0x(?:[a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['\w{5}'\])\(0x2, *0x3\);/; + const controlFlowStorageCallRegExp1: RegExp = new RegExp( + `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['${variableMatch}'\\])\\(0x1, *0x2\\);` + ); + const controlFlowStorageCallRegExp2: RegExp = new RegExp( + `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['${variableMatch}'\\])\\(0x2, *0x3\\);` + ); let matchErrorsCount: number = 0, usingExistingIdentifierChance: number; diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts index 9dc1a6bd2..12a6fce7d 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts @@ -10,8 +10,12 @@ describe('CallExpressionControlFlowReplacer', function () { this.timeout(100000); describe('replace', () => { + const variableMatch: string = '_0x([a-f0-9]){4,6}'; + describe('Variant #1 - single call expression', () => { - const controlFlowStorageCallRegExp: RegExp = /var _0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['\w{5}'\]\(_0x([a-f0-9]){4,6}, *0x1, *0x2\);/; + const controlFlowStorageCallRegExp: RegExp = new RegExp( + `var ${variableMatch} *= *${variableMatch}\\['${variableMatch}'\\]\\(${variableMatch}, *0x1, *0x2\\);` + ); let obfuscatedCode: string; @@ -40,8 +44,12 @@ describe('CallExpressionControlFlowReplacer', function () { const samplesCount: number = 1000; const delta: number = 0.1; - const controlFlowStorageCallRegExp1: RegExp = /var _0x(?:[a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['\w{5}'\])\(_0x([a-f0-9]){4,6}, *0x1, *0x2\);/; - const controlFlowStorageCallRegExp2: RegExp = /var _0x(?:[a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['\w{5}'\])\(_0x([a-f0-9]){4,6}, *0x2, *0x3\);/; + const controlFlowStorageCallRegExp1: RegExp = new RegExp( + `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['${variableMatch}'\\])\\(${variableMatch}, *0x1, *0x2\\);` + ); + const controlFlowStorageCallRegExp2: RegExp = new RegExp( + `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['${variableMatch}'\\])\\(${variableMatch}, *0x2, *0x3\\);` + ); let matchErrorsCount: number = 0, usingExistingIdentifierChance: number; @@ -96,7 +104,9 @@ describe('CallExpressionControlFlowReplacer', function () { }); describe('Variant #3 - call expression callee is member expression node', () => { - const regExp: RegExp = /var _0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['sum'\]\(0x1, *0x2\);/; + const regExp: RegExp = new RegExp( + `var ${variableMatch} *= *${variableMatch}\\['sum'\\]\\(0x1, *0x2\\);` + ); let obfuscatedCode: string; @@ -119,10 +129,12 @@ describe('CallExpressionControlFlowReplacer', function () { }); describe('Variant #4 - rest as start call argument', () => { - const controlFlowStorageCallRegExp: RegExp = /_0x([a-f0-9]){4,6}\['\w{5}']\(_0x([a-f0-9]){4,6}, *\.\.\._0x([a-f0-9]){4,6}, *_0x([a-f0-9]){4,6}\);/; + const controlFlowStorageCallRegExp: RegExp = new RegExp( + `${variableMatch}\\['${variableMatch}']\\(${variableMatch}, *\\.\\.\\.${variableMatch}, *${variableMatch}\\);` + ); const controlFlowStorageNodeRegExp: RegExp = new RegExp(`` + - `'\\w{5}' *: *function *\\(_0x([a-f0-9]){4,6}, *\.\.\._0x([a-f0-9]){4,6}\\) *\\{` + - `return *_0x([a-f0-9]){4,6}\\(\.\.\._0x([a-f0-9]){4,6}\\);` + + `'${variableMatch}' *: *function *\\(${variableMatch}, *\.\.\.${variableMatch}\\) *\\{` + + `return *${variableMatch}\\(\.\.\.${variableMatch}\\);` + `\\}` + ``); @@ -151,10 +163,12 @@ describe('CallExpressionControlFlowReplacer', function () { }); describe('Variant #5 - rest as middle call argument', () => { - const controlFlowStorageCallRegExp: RegExp = /_0x([a-f0-9]){4,6}\['\w{5}']\(_0x([a-f0-9]){4,6}, *_0x([a-f0-9]){4,6}, *\.\.\._0x([a-f0-9]){4,6}, *_0x([a-f0-9]){4,6}\);/; + const controlFlowStorageCallRegExp: RegExp = new RegExp( + `${variableMatch}\\['${variableMatch}']\\(${variableMatch}, *${variableMatch}, *\\.\\.\\.${variableMatch}, *${variableMatch}\\);` + ); const controlFlowStorageNodeRegExp: RegExp = new RegExp(`` + - `'\\w{5}' *: *function *\\(_0x([a-f0-9]){4,6}, *_0x([a-f0-9]){4,6}, *\.\.\._0x([a-f0-9]){4,6}\\) *\\{` + - `return *_0x([a-f0-9]){4,6}\\(_0x([a-f0-9]){4,6}, *\.\.\._0x([a-f0-9]){4,6}\\);` + + `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}, *\.\.\.${variableMatch}\\) *\\{` + + `return *${variableMatch}\\(${variableMatch}, *\.\.\.${variableMatch}\\);` + `\\}` + ``); @@ -183,10 +197,12 @@ describe('CallExpressionControlFlowReplacer', function () { }); describe('Variant #6 - rest as last call argument', () => { - const controlFlowStorageCallRegExp: RegExp = /_0x([a-f0-9]){4,6}\['\w{5}']\(_0x([a-f0-9]){4,6}, *_0x([a-f0-9]){4,6}, *\.\.\._0x([a-f0-9]){4,6}\);/; + const controlFlowStorageCallRegExp: RegExp = new RegExp( + `${variableMatch}\\['${variableMatch}']\\(${variableMatch}, *${variableMatch}, *\\.\\.\\.${variableMatch}\\);` + ); const controlFlowStorageNodeRegExp: RegExp = new RegExp(`` + - `'\\w{5}' *: *function *\\(_0x([a-f0-9]){4,6}, *_0x([a-f0-9]){4,6}, *\.\.\._0x([a-f0-9]){4,6}\\) *\\{` + - `return *_0x([a-f0-9]){4,6}\\(_0x([a-f0-9]){4,6}, *\.\.\._0x([a-f0-9]){4,6}\\);` + + `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}, *\.\.\.${variableMatch}\\) *\\{` + + `return *${variableMatch}\\(${variableMatch}, *\.\.\.${variableMatch}\\);` + `\\}` + ``); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts index 0e06e265e..d1427eaad 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts @@ -10,8 +10,12 @@ describe('LogicalExpressionControlFlowReplacer', function () { this.timeout(100000); describe('replace', () => { + const variableMatch: string = '_0x([a-f0-9]){4,6}'; + describe('Variant #1 - single logical expression', () => { - const controlFlowStorageCallRegExp: RegExp = /var _0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['\w{5}'\]\(!!\[\], *!\[\]\);/; + const controlFlowStorageCallRegExp: RegExp = new RegExp( + `var ${variableMatch} *= *${variableMatch}\\['${variableMatch}'\\]\\(!!\\[\\], *!\\[\\]\\);` + ); let obfuscatedCode: string; @@ -40,8 +44,12 @@ describe('LogicalExpressionControlFlowReplacer', function () { const samplesCount: number = 1000; const delta: number = 0.1; - const controlFlowStorageCallRegExp1: RegExp = /var _0x(?:[a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['\w{5}'\])\(!!\[\], *!\[\]\);/; - const controlFlowStorageCallRegExp2: RegExp = /var _0x(?:[a-f0-9]){4,6} *= *(_0x([a-f0-9]){4,6}\['\w{5}'\])\(!\[\], *!!\[\]\);/; + const controlFlowStorageCallRegExp1: RegExp = new RegExp( + `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['${variableMatch}'\\])\\(!!\\[\\], *!\\[\\]\\);` + ); + const controlFlowStorageCallRegExp2: RegExp = new RegExp( + `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['${variableMatch}'\\])\\(!\\[\\], *!!\\[\\]\\);` + ); let matchErrorsCount: number = 0, usingExistingIdentifierChance: number; @@ -96,7 +104,9 @@ describe('LogicalExpressionControlFlowReplacer', function () { }); describe('Variant #3 - single logical expression with unary expression', () => { - const controlFlowStorageCallRegExp: RegExp = /var _0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['\w{5}'\]\(!_0x([a-f0-9]){4,6}, *!_0x([a-f0-9]){4,6}\);/; + const controlFlowStorageCallRegExp: RegExp = new RegExp( + `var ${variableMatch} *= *${variableMatch}\\['${variableMatch}'\\]\\(!${variableMatch}, *!${variableMatch}\\);` + ); let obfuscatedCode: string; @@ -119,7 +129,9 @@ describe('LogicalExpressionControlFlowReplacer', function () { }); describe('prohibited nodes Variant #1', () => { - const regExp: RegExp = /var _0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\[_0x([a-f0-9]){4,6}\] *&& *!\[\];/; + const regExp: RegExp = new RegExp( + `var ${variableMatch} *= *${variableMatch}\\[${variableMatch}\\] *&& *!\\[\\];` + ); let obfuscatedCode: string; diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts index 8833d9976..561da0863 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts @@ -8,8 +8,14 @@ import { JavaScriptObfuscator } from '../../../../../../src/JavaScriptObfuscator describe('StringLiteralControlFlowReplacer', () => { describe('replace', () => { - const controlFlowStorageStringLiteralRegExp: RegExp = /var _0x([a-f0-9]){4,6} *= *\{'\w{5}' *: *'test'\};/; - const controlFlowStorageCallRegExp: RegExp = /var _0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['\w{5}'\];/; + const variableMatch: string = '_0x([a-f0-9]){4,6}'; + + const controlFlowStorageStringLiteralRegExp: RegExp = new RegExp( + `var ${variableMatch} *= *\\{'${variableMatch}' *: *'test'\\};` + ); + const controlFlowStorageCallRegExp: RegExp = new RegExp( + `var ${variableMatch} *= *${variableMatch}\\['${variableMatch}'\\];` + ); let obfuscatedCode: string; diff --git a/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts index 55dc0b45b..382466153 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts @@ -12,15 +12,15 @@ describe('FunctionControlFlowTransformer', function () { const variableMatch: string = '_0x([a-f0-9]){4,6}'; const rootControlFlowStorageNodeMatch: string = `` + `var ${variableMatch} *= *\\{` + - `'\\w{5}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + `return *${variableMatch} *\\+ *${variableMatch};` + `\\}` + `\\};` + ``; const innerControlFlowStorageNodeMatch: string = `` + `var ${variableMatch} *= *\\{` + - `'\\w{5}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + - `return *${variableMatch}\\['\\w{5}'\\]\\(${variableMatch}, *${variableMatch}\\);` + + `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `return *${variableMatch}\\['${variableMatch}'\\]\\(${variableMatch}, *${variableMatch}\\);` + `\\}` + `\\};` + ``; @@ -102,10 +102,10 @@ describe('FunctionControlFlowTransformer', function () { describe('Variant #3 - single `control flow storage` node with multiple items', () => { const regexp: RegExp = new RegExp( `var ${variableMatch} *= *\\{` + - `'\\w{5}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + `return *${variableMatch} *\\+ *${variableMatch};` + `\\}, *` + - `'\\w{5}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + `return *${variableMatch} *- *${variableMatch};` + `\\}` + `\\};` @@ -160,7 +160,7 @@ describe('FunctionControlFlowTransformer', function () { const regExp: RegExp = new RegExp( `var [a-zA-Z]{6} *= *\\{` + - `'\\w{5}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + `return *${variableMatch} *\\+ *${variableMatch};` + `\\}` + `\\};` diff --git a/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/ObjectExpressionKeysTransformer.spec.ts b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/ObjectExpressionKeysTransformer.spec.ts index 5085de466..fb2831a27 100644 --- a/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/ObjectExpressionKeysTransformer.spec.ts +++ b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/ObjectExpressionKeysTransformer.spec.ts @@ -257,11 +257,11 @@ describe('ObjectExpressionKeysTransformer', () => { describe('Variant #9: correct integration with control flow flattening object #1', () => { const match: string = `` + `var ${variableMatch} *= *{};` + - `${variableMatch}\\['\\w{5}'] *= *function *\\(${variableMatch}, *${variableMatch}\\) *{` + + `${variableMatch}\\['${variableMatch}'] *= *function *\\(${variableMatch}, *${variableMatch}\\) *{` + `return *${variableMatch} *\\+ *${variableMatch};` + `};` + `var ${variableMatch} *= *${variableMatch};` + - `var ${variableMatch} *= *${variableMatch}\\['\\w{5}']\\(0x1, *0x2\\);` + + `var ${variableMatch} *= *${variableMatch}\\['${variableMatch}']\\(0x1, *0x2\\);` + ``; const regExp: RegExp = new RegExp(match); @@ -289,7 +289,7 @@ describe('ObjectExpressionKeysTransformer', () => { describe('Variant #10: correct integration with control flow flattening object #2', () => { const match: string = `` + `var ${variableMatch} *= *{};` + - `${variableMatch}\\['\\w{5}'] *= *function *\\(${variableMatch}, *${variableMatch}\\) *{` + + `${variableMatch}\\['${variableMatch}'] *= *function *\\(${variableMatch}, *${variableMatch}\\) *{` + `return *${variableMatch} *\\+ *${variableMatch};` + `};` + `var ${variableMatch} *= *${variableMatch};` + @@ -297,7 +297,7 @@ describe('ObjectExpressionKeysTransformer', () => { `${variableMatch}\\['foo'] *= *0x1;` + `var ${variableMatch} *= *{};` + `${variableMatch}\\['bar'] *= *0x2;` + - `var ${variableMatch} *= *${variableMatch}\\['\\w{5}']\\(${variableMatch}\\['foo'], *${variableMatch}\\['bar']\\);` + + `var ${variableMatch} *= *${variableMatch}\\['${variableMatch}']\\(${variableMatch}\\['foo'], *${variableMatch}\\['bar']\\);` + ``; const regExp: RegExp = new RegExp(match); diff --git a/test/functional-tests/node-transformers/preparing-transformers/eval-call-expression-transformer/EvalCallExpressionTransformer.spec.ts b/test/functional-tests/node-transformers/preparing-transformers/eval-call-expression-transformer/EvalCallExpressionTransformer.spec.ts index 0021e9c29..bb427cf36 100644 --- a/test/functional-tests/node-transformers/preparing-transformers/eval-call-expression-transformer/EvalCallExpressionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/preparing-transformers/eval-call-expression-transformer/EvalCallExpressionTransformer.spec.ts @@ -320,13 +320,15 @@ describe('EvalCallExpressionTransformer', () => { const variableMatch: string = '_0x([a-f0-9]){4,6}'; const controlFlowStorageNodeMatch: string = `` + `var ${variableMatch} *= *\\{` + - `'\\w{5}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + `return *${variableMatch} *\\+ *${variableMatch};` + `\\}` + `\\};` + ``; const controlFlowStorageNodeRegExp: RegExp = new RegExp(controlFlowStorageNodeMatch); - const evalExpressionRegExp: RegExp = /eval *\('_0x([a-f0-9]){4,6}\[\\'\w{5}\\']\(_0x([a-f0-9]){4,6}, *_0x([a-f0-9]){4,6}\);'\);/; + const evalExpressionRegExp: RegExp = new RegExp( + `eval *\\('${variableMatch}\\[\\\\'${variableMatch}\\\\']\\(${variableMatch}, *${variableMatch}\\);'\\);` + ); let obfuscatedCode: string; diff --git a/test/functional-tests/node-transformers/preparing-transformers/obfuscating-guards/conditional-comment-obfuscating-guard/ConditionalCommentObfuscatingGuard.spec.ts b/test/functional-tests/node-transformers/preparing-transformers/obfuscating-guards/conditional-comment-obfuscating-guard/ConditionalCommentObfuscatingGuard.spec.ts index c1277a4e9..34b9863dd 100644 --- a/test/functional-tests/node-transformers/preparing-transformers/obfuscating-guards/conditional-comment-obfuscating-guard/ConditionalCommentObfuscatingGuard.spec.ts +++ b/test/functional-tests/node-transformers/preparing-transformers/obfuscating-guards/conditional-comment-obfuscating-guard/ConditionalCommentObfuscatingGuard.spec.ts @@ -209,7 +209,7 @@ describe('ConditionalCommentObfuscatingGuard', () => { }); describe('Variant #6: `disable` and `enable` conditional comments with control flow flattening', () => { - const obfuscatedVariableDeclarationRegExp: RegExp = /var _0x([a-f0-9]){5,6} *= *_0x([a-f0-9]){5,6}\['[a-zA-Z0-9]{1,5}'];/; + const obfuscatedVariableDeclarationRegExp: RegExp = /var _0x([a-f0-9]){5,6} *= *_0x([a-f0-9]){5,6}\['_0x([a-f0-9]){5,6}'];/; const ignoredVariableDeclarationRegExp: RegExp = /var bar *= *'bar';/; let obfuscatedCode: string; diff --git a/test/functional-tests/node-transformers/string-array-transformers/string-array-rotate-function-transformer/StringArrayRotateFunctionTransformer.spec.ts b/test/functional-tests/node-transformers/string-array-transformers/string-array-rotate-function-transformer/StringArrayRotateFunctionTransformer.spec.ts index f2c6a71bc..f9d130719 100644 --- a/test/functional-tests/node-transformers/string-array-transformers/string-array-rotate-function-transformer/StringArrayRotateFunctionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/string-array-transformers/string-array-rotate-function-transformer/StringArrayRotateFunctionTransformer.spec.ts @@ -160,6 +160,8 @@ describe('StringArrayRotateFunctionTransformer', function () { splitStrings: true, splitStringsChunkLength: 3, stringArray: true, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 1, stringArrayEncoding: [ StringArrayEncoding.None, StringArrayEncoding.Base64, diff --git a/test/functional-tests/options/OptionsNormalizer.spec.ts b/test/functional-tests/options/OptionsNormalizer.spec.ts index de6d72c27..e1e0c5d45 100644 --- a/test/functional-tests/options/OptionsNormalizer.spec.ts +++ b/test/functional-tests/options/OptionsNormalizer.spec.ts @@ -741,6 +741,8 @@ describe('OptionsNormalizer', () => { ...getDefaultOptions(), shuffleStringArray: true, stringArray: false, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 1, stringArrayEncoding: [StringArrayEncoding.Rc4], stringArrayIndexShift: true, stringArrayWrappersChainedCalls: true, @@ -753,6 +755,8 @@ describe('OptionsNormalizer', () => { ...getDefaultOptions(), shuffleStringArray: false, stringArray: false, + stringArrayCallsTransform: false, + stringArrayCallsTransformThreshold: 0, stringArrayEncoding: [StringArrayEncoding.None], stringArrayIndexShift: false, stringArrayWrappersChainedCalls: false, @@ -767,6 +771,26 @@ describe('OptionsNormalizer', () => { }); }); + describe('stringArrayCallsTransformRule', () => { + before(() => { + optionsPreset = getNormalizedOptions({ + ...getDefaultOptions(), + stringArrayCallsTransform: false, + stringArrayCallsTransformThreshold: 1 + }); + + expectedOptionsPreset = { + ...getDefaultOptions(), + stringArrayCallsTransform: false, + stringArrayCallsTransformThreshold: 0 + }; + }); + + it('should normalize options preset', () => { + assert.deepEqual(optionsPreset, expectedOptionsPreset); + }); + }); + describe('stringArrayEncodingRule', () => { before(() => { optionsPreset = getNormalizedOptions({ @@ -807,4 +831,4 @@ describe('OptionsNormalizer', () => { }); }); }); -}); +}); \ No newline at end of file diff --git a/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts b/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts index 1f49ae5c0..556636040 100644 --- a/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts +++ b/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts @@ -38,6 +38,8 @@ describe('JavaScriptObfuscator runtime eval', function () { splitStrings: true, splitStringsChunkLength: 3, stringArray: true, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 1, stringArrayEncoding: [ StringArrayEncoding.None, StringArrayEncoding.Base64, From 346ec62a554005f3b0aefeb72cb31a0ed83e4c78 Mon Sep 17 00:00:00 2001 From: sanex Date: Tue, 17 Aug 2021 19:25:54 +0300 Subject: [PATCH 03/14] Improved string array control flow flattening logic --- src/JavaScriptObfuscator.ts | 2 +- .../modules/storages/StoragesModule.ts | 4 -- .../AbstractIdentifierNamesGenerator.ts | 45 +++++++++++++++++++ .../DictionaryIdentifierNamesGenerator.ts | 16 +++++++ .../HexadecimalIdentifierNamesGenerator.ts | 9 ++++ .../MangledIdentifierNamesGenerator.ts | 38 ++++++++++++++++ .../IIdentifierNamesGenerator.ts | 19 ++++++++ .../IControlFlowReplacer.ts | 9 ++-- .../FunctionControlFlowTransformer.ts | 1 - .../AbstractControlFlowReplacer.ts | 32 +++++++------ .../BinaryExpressionControlFlowReplacer.ts | 3 -- .../CallExpressionControlFlowReplacer.ts | 4 -- .../LogicalExpressionControlFlowReplacer.ts | 4 -- .../StringArrayCallControlFlowReplacer.ts | 21 +++++++-- .../StringLiteralControlFlowReplacer.ts | 4 -- .../custom-nodes/ControlFlowStorage.ts | 21 +-------- test/dev/dev.ts | 2 +- .../JavaScriptObfuscatorRuntime.spec.ts | 2 +- 18 files changed, 172 insertions(+), 64 deletions(-) diff --git a/src/JavaScriptObfuscator.ts b/src/JavaScriptObfuscator.ts index 4728c05a3..255e7d1c0 100644 --- a/src/JavaScriptObfuscator.ts +++ b/src/JavaScriptObfuscator.ts @@ -228,8 +228,8 @@ export class JavaScriptObfuscator implements IJavaScriptObfuscator { } astTree = this.runNodeTransformationStage(astTree, NodeTransformationStage.Converting); - astTree = this.runNodeTransformationStage(astTree, NodeTransformationStage.RenameIdentifiers); astTree = this.runNodeTransformationStage(astTree, NodeTransformationStage.StringArray); + astTree = this.runNodeTransformationStage(astTree, NodeTransformationStage.RenameIdentifiers); if (this.options.simplify) { astTree = this.runNodeTransformationStage(astTree, NodeTransformationStage.Simplifying); diff --git a/src/container/modules/storages/StoragesModule.ts b/src/container/modules/storages/StoragesModule.ts index 54d13fa5f..6c0664022 100644 --- a/src/container/modules/storages/StoragesModule.ts +++ b/src/container/modules/storages/StoragesModule.ts @@ -3,7 +3,6 @@ import { ServiceIdentifiers } from '../../ServiceIdentifiers'; import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TCustomCodeHelperGroupStorage } from '../../../types/storages/TCustomCodeHelperGroupStorage'; -import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { IGlobalIdentifierNamesCacheStorage } from '../../../interfaces/storages/identifier-names-cache/IGlobalIdentifierNamesCacheStorage'; import { ILiteralNodesCacheStorage } from '../../../interfaces/storages/string-array-transformers/ILiteralNodesCacheStorage'; @@ -62,15 +61,12 @@ export const storagesModule: interfaces.ContainerModule = new ContainerModule((b return (): TControlFlowStorage => { const constructor: interfaces.Newable = context.container .get>(ServiceIdentifiers.Newable__TControlFlowStorage); - const identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory = context.container - .get(ServiceIdentifiers.Factory__IIdentifierNamesGenerator); const randomGenerator: IRandomGenerator = context.container .get(ServiceIdentifiers.IRandomGenerator); const options: IOptions = context.container .get(ServiceIdentifiers.IOptions); const storage: TControlFlowStorage = new constructor( - identifierNamesGeneratorFactory, randomGenerator, options ); diff --git a/src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts b/src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts index 4617c165c..4a1ccdb06 100644 --- a/src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts +++ b/src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts @@ -31,6 +31,11 @@ export abstract class AbstractIdentifierNamesGenerator implements IIdentifierNam */ protected readonly lexicalScopesPreservedNamesMap: Map> = new Map(); + /** + * @type {Map>} + */ + protected readonly labelsPreservedNamesMap: Map> = new Map(); + /** * @param {IRandomGenerator} randomGenerator * @param {IOptions} options @@ -74,6 +79,19 @@ export abstract class AbstractIdentifierNamesGenerator implements IIdentifierNam this.lexicalScopesPreservedNamesMap.set(lexicalScopeNode, preservedNamesForLexicalScopeSet); } + /** + * @param {string} name + * @param {string} label + */ + public preserveNameForLabel (name: string, label: string): void { + const preservedNamesForLexicalScopeSet: Set = + this.labelsPreservedNamesMap.get(label) ?? new Set(); + + preservedNamesForLexicalScopeSet.add(name); + + this.labelsPreservedNamesMap.set(label, preservedNamesForLexicalScopeSet); + } + /** * @param {string} name * @returns {boolean} @@ -108,6 +126,26 @@ export abstract class AbstractIdentifierNamesGenerator implements IIdentifierNam return true; } + /** + * @param {string} name + * @param {string} label + * @returns {boolean} + */ + public isValidIdentifierNameForLabel (name: string, label: string): boolean { + if (!this.isValidIdentifierName(name)) { + return false; + } + + const preservedNamesForLexicalScopeSet: Set | null = + this.labelsPreservedNamesMap.get(label) ?? null; + + if (!preservedNamesForLexicalScopeSet) { + return true; + } + + return !preservedNamesForLexicalScopeSet.has(name); + } + /** * @param {string} name * @returns {boolean} @@ -134,6 +172,13 @@ export abstract class AbstractIdentifierNamesGenerator implements IIdentifierNam */ public abstract generateForLexicalScope (lexicalScopeNode: TNodeWithLexicalScope, nameLength?: number): string; + /** + * @param {string} label + * @param {number} nameLength + * @returns {string} + */ + public abstract generateForLabel (label: string, nameLength?: number): string; + /** * @param {number} nameLength * @returns {string} diff --git a/src/generators/identifier-names-generators/DictionaryIdentifierNamesGenerator.ts b/src/generators/identifier-names-generators/DictionaryIdentifierNamesGenerator.ts index 44235af4d..65c1325f8 100644 --- a/src/generators/identifier-names-generators/DictionaryIdentifierNamesGenerator.ts +++ b/src/generators/identifier-names-generators/DictionaryIdentifierNamesGenerator.ts @@ -116,6 +116,22 @@ export class DictionaryIdentifierNamesGenerator extends AbstractIdentifierNamesG return identifierName; } + /** + * @param {string} label + * @returns {string} + */ + public generateForLabel (label: string): string { + const identifierName: string = this.generateNewDictionaryName(); + + if (!this.isValidIdentifierNameForLabel(identifierName, label)) { + return this.generateForLabel(label); + } + + this.preserveNameForLabel(identifierName, label); + + return identifierName; + } + /** * @returns {string} */ diff --git a/src/generators/identifier-names-generators/HexadecimalIdentifierNamesGenerator.ts b/src/generators/identifier-names-generators/HexadecimalIdentifierNamesGenerator.ts index c5da0458f..c5f0e2c18 100644 --- a/src/generators/identifier-names-generators/HexadecimalIdentifierNamesGenerator.ts +++ b/src/generators/identifier-names-generators/HexadecimalIdentifierNamesGenerator.ts @@ -70,4 +70,13 @@ export class HexadecimalIdentifierNamesGenerator extends AbstractIdentifierNames public generateForLexicalScope (lexicalScopeNode: TNodeWithLexicalScope, nameLength?: number): string { return this.generateNext(nameLength); } + + /** + * @param {string} label + * @param {number} nameLength + * @returns {string} + */ + public generateForLabel (label: string, nameLength?: number): string { + return this.generateNext(nameLength); + } } diff --git a/src/generators/identifier-names-generators/MangledIdentifierNamesGenerator.ts b/src/generators/identifier-names-generators/MangledIdentifierNamesGenerator.ts index 3dff896c5..7c794eca7 100644 --- a/src/generators/identifier-names-generators/MangledIdentifierNamesGenerator.ts +++ b/src/generators/identifier-names-generators/MangledIdentifierNamesGenerator.ts @@ -25,6 +25,11 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene */ private static readonly lastMangledNameInScopeMap: WeakMap = new WeakMap(); + /** + * @type {WeakMap} + */ + private static readonly lastMangledNameForLabelMap: Map = new Map(); + /** * @type {string[]} */ @@ -124,6 +129,28 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene return identifierName; } + /** + * @param {string} label + * @param {number} nameLength + * @returns {string} + */ + public generateForLabel (label: string, nameLength?: number): string { + const lastMangledNameForLabel: string = this.getLastMangledNameForLabel(label); + + let identifierName: string = lastMangledNameForLabel; + + do { + identifierName = this.generateNewMangledName(identifierName); + } while (!this.isValidIdentifierNameForLabel(identifierName, label)); + + MangledIdentifierNamesGenerator.lastMangledNameForLabelMap.set(label, identifierName); + + this.updatePreviousMangledName(identifierName); + this.preserveNameForLabel(identifierName, label); + + return identifierName; + } + /** * @param {string} nextName * @param {string} prevName @@ -253,4 +280,15 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene return MangledIdentifierNamesGenerator.initMangledNameCharacter; } + + /** + * @param {string} label + * @returns {string} + */ + private getLastMangledNameForLabel (label: string): string { + const lastMangledName: string | null = MangledIdentifierNamesGenerator.lastMangledNameForLabelMap + .get(label) ?? null; + + return lastMangledName ?? MangledIdentifierNamesGenerator.initMangledNameCharacter; + } } diff --git a/src/interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator.ts b/src/interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator.ts index 2791e3ac5..01c06b3cf 100644 --- a/src/interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator.ts +++ b/src/interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator.ts @@ -21,6 +21,12 @@ export interface IIdentifierNamesGenerator { */ generateForLexicalScope (lexicalScopeNode: TNodeWithLexicalScope, nameLength?: number): string; + /** + * @param {string} label + * @param {number} nameLength + * @returns {string} + */ + generateForLabel (label: string, nameLength?: number): string; /** * @param {number} nameLength @@ -41,6 +47,13 @@ export interface IIdentifierNamesGenerator { */ isValidIdentifierNameInLexicalScopes (identifierName: string, lexicalScopeNodes: TNodeWithLexicalScope[]): boolean; + /** + * @param {string} identifierName + * @param {string} label + * @returns {boolean} + */ + isValidIdentifierNameForLabel (identifierName: string, label: string): boolean; + /** * @param {string} identifierName */ @@ -51,4 +64,10 @@ export interface IIdentifierNamesGenerator { * @param {TNodeWithLexicalScope} lexicalScope */ preserveNameForLexicalScope (identifierName: string, lexicalScope: TNodeWithLexicalScope): void; + + /** + * @param {string} identifierName + * @param {string} label + */ + preserveNameForLabel (identifierName: string, label: string): void; } diff --git a/src/interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer.ts b/src/interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer.ts index b5a302911..a3881ebe6 100644 --- a/src/interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer.ts +++ b/src/interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer.ts @@ -1,20 +1,23 @@ import * as ESTree from 'estree'; import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; -import { TNodeWithLexicalScope } from '../../../types/node/TNodeWithLexicalScope'; export interface IControlFlowReplacer { /** * @param {Node} node * @param {Node} parentNode - * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode * @param {TControlFlowStorage} controlFlowStorage * @returns {Node} */ replace ( node: ESTree.Node, parentNode: ESTree.Node, - controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage ): ESTree.Node; + + /** + * @param {TControlFlowStorage} controlFlowStorage + * @returns {string} + */ + generateStorageKey (controlFlowStorage: TControlFlowStorage): string; } diff --git a/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts b/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts index 9df56a05e..1354f3950 100644 --- a/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts +++ b/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts @@ -207,7 +207,6 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { .replace( node, parentNode, - functionNode, controlFlowStorage ); diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts index 3ee2abd49..9c98d5367 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts @@ -6,7 +6,6 @@ import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; -import { TNodeWithLexicalScope } from '../../../types/node/TNodeWithLexicalScope'; import { IControlFlowReplacer } from '../../../interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; @@ -61,9 +60,25 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace this.options = options; } + /** + * Generates storage key with length of 5 characters to prevent collisions and to guarantee that + * these keys will be added to the string array storage + * + * @param {TControlFlowStorage} controlFlowStorage + * @returns {string} + */ + public generateStorageKey (controlFlowStorage: TControlFlowStorage): string { + const key: string = this.randomGenerator.getRandomString(5); + + if (controlFlowStorage.has(key)) { + return this.generateStorageKey(controlFlowStorage); + } + + return key; + } + /** * @param {ICustomNode} customNode - * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode * @param {TControlFlowStorage} controlFlowStorage * @param {string} replacerId * @param {number} usingExistingIdentifierChance @@ -71,7 +86,6 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace */ protected insertCustomNodeToControlFlowStorage ( customNode: ICustomNode, - controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage, replacerId: string, usingExistingIdentifierChance: number @@ -88,16 +102,7 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace return this.randomGenerator.getRandomGenerator().pickone(storageKeysForCurrentId); } - const generateStorageKey: () => string = () => { - const key: string = this.identifierNamesGenerator.generateNext(); - - if (controlFlowStorage.has(key)) { - return generateStorageKey(); - } - - return key; - }; - const storageKey: string = generateStorageKey(); + const storageKey: string = this.generateStorageKey(controlFlowStorage); storageKeysById.set(replacerId, [storageKey]); this.replacerDataByControlFlowStorageId.set(controlFlowStorageId, storageKeysById); @@ -116,7 +121,6 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace public abstract replace ( node: ESTree.Node, parentNode: ESTree.Node, - controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage ): ESTree.Node; } diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.ts index e169d7108..e3df01c2e 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.ts @@ -7,7 +7,6 @@ import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-n import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; -import { TNodeWithLexicalScope } from '../../../types/node/TNodeWithLexicalScope'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../../../interfaces/options/IOptions'; @@ -57,7 +56,6 @@ export class BinaryExpressionControlFlowReplacer extends ExpressionWithOperatorC public replace ( binaryExpressionNode: ESTree.BinaryExpression, parentNode: ESTree.Node, - controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage ): ESTree.Node { const operator: ESTree.BinaryOperator = binaryExpressionNode.operator; @@ -68,7 +66,6 @@ export class BinaryExpressionControlFlowReplacer extends ExpressionWithOperatorC const storageKey: string = this.insertCustomNodeToControlFlowStorage( binaryExpressionFunctionCustomNode, - controlFlowStorageLexicalScopeNode, controlFlowStorage, operator, BinaryExpressionControlFlowReplacer.usingExistingIdentifierChance diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.ts index ddf1fee32..de4ef72d5 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.ts @@ -7,7 +7,6 @@ import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-n import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; -import { TNodeWithLexicalScope } from '../../../types/node/TNodeWithLexicalScope'; import { TStatement } from '../../../types/node/TStatement'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; @@ -53,14 +52,12 @@ export class CallExpressionControlFlowReplacer extends AbstractControlFlowReplac /** * @param {CallExpression} callExpressionNode * @param {Node} parentNode - * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode * @param {TControlFlowStorage} controlFlowStorage * @returns {Node} */ public replace ( callExpressionNode: ESTree.CallExpression, parentNode: ESTree.Node, - controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage ): ESTree.Node { const callee: ESTree.Expression = callExpressionNode.callee; @@ -78,7 +75,6 @@ export class CallExpressionControlFlowReplacer extends AbstractControlFlowReplac const storageKey: string = this.insertCustomNodeToControlFlowStorage( callExpressionFunctionCustomNode, - controlFlowStorageLexicalScopeNode, controlFlowStorage, replacerId, CallExpressionControlFlowReplacer.usingExistingIdentifierChance diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer.ts index 927d3f3d6..a2403f9d1 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer.ts @@ -7,7 +7,6 @@ import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-n import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; -import { TNodeWithLexicalScope } from '../../../types/node/TNodeWithLexicalScope'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../../../interfaces/options/IOptions'; @@ -52,14 +51,12 @@ export class LogicalExpressionControlFlowReplacer extends ExpressionWithOperator /** * @param {LogicalExpression} logicalExpressionNode * @param {Node} parentNode - * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode * @param {TControlFlowStorage} controlFlowStorage * @returns {Node} */ public replace ( logicalExpressionNode: ESTree.LogicalExpression, parentNode: ESTree.Node, - controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage ): ESTree.Node { if (this.checkForProhibitedExpressions(logicalExpressionNode.left, logicalExpressionNode.right)) { @@ -74,7 +71,6 @@ export class LogicalExpressionControlFlowReplacer extends ExpressionWithOperator const storageKey: string = this.insertCustomNodeToControlFlowStorage( logicalExpressionFunctionCustomNode, - controlFlowStorageLexicalScopeNode, controlFlowStorage, operator, LogicalExpressionControlFlowReplacer.usingExistingIdentifierChance diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts index 2e752fc79..c4763a9e7 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts @@ -7,7 +7,6 @@ import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-n import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; -import { TNodeWithLexicalScope } from '../../../types/node/TNodeWithLexicalScope'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../../../interfaces/options/IOptions'; @@ -52,14 +51,12 @@ export class StringArrayCallControlFlowReplacer extends StringLiteralControlFlow /** * @param {Literal} literalNode * @param {Node} parentNode - * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode * @param {TControlFlowStorage} controlFlowStorage * @returns {Node} */ public override replace ( literalNode: ESTree.Literal, parentNode: ESTree.Node, - controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage ): ESTree.Node { const isStringArrayCallLiteralNode = NodeMetadata.isStringArrayCallLiteralNode(literalNode) @@ -80,7 +77,6 @@ export class StringArrayCallControlFlowReplacer extends StringLiteralControlFlow const storageKey: string = this.insertCustomNodeToControlFlowStorage( literalFunctionCustomNode, - controlFlowStorageLexicalScopeNode, controlFlowStorage, replacerId, StringArrayCallControlFlowReplacer.usingExistingIdentifierChance @@ -88,4 +84,21 @@ export class StringArrayCallControlFlowReplacer extends StringLiteralControlFlow return this.getControlFlowStorageCallNode(controlFlowStorage.getStorageId(), storageKey); } + + /** + * Generates storage key based on a current control flow storage identifier + * + * @param {TControlFlowStorage} controlFlowStorage + * @returns {string} + */ + public override generateStorageKey (controlFlowStorage: TControlFlowStorage): string { + const key: string = this.identifierNamesGenerator + .generateForLabel(controlFlowStorage.getStorageId()); + + if (controlFlowStorage.has(key)) { + return this.generateStorageKey(controlFlowStorage); + } + + return key; + } } diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts index 3c3d22b70..061618f4f 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts @@ -7,7 +7,6 @@ import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-n import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; -import { TNodeWithLexicalScope } from '../../../types/node/TNodeWithLexicalScope'; import { TStatement } from '../../../types/node/TStatement'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; @@ -54,14 +53,12 @@ export class StringLiteralControlFlowReplacer extends AbstractControlFlowReplace /** * @param {Literal} literalNode * @param {Node} parentNode - * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode * @param {TControlFlowStorage} controlFlowStorage * @returns {Node} */ public replace ( literalNode: ESTree.Literal, parentNode: ESTree.Node, - controlFlowStorageLexicalScopeNode: TNodeWithLexicalScope, controlFlowStorage: TControlFlowStorage ): ESTree.Node { if (NodeGuards.isPropertyNode(parentNode) && parentNode.key === literalNode) { @@ -80,7 +77,6 @@ export class StringLiteralControlFlowReplacer extends AbstractControlFlowReplace const storageKey: string = this.insertCustomNodeToControlFlowStorage( literalFunctionCustomNode, - controlFlowStorageLexicalScopeNode, controlFlowStorage, replacerId, StringLiteralControlFlowReplacer.usingExistingIdentifierChance diff --git a/src/storages/custom-nodes/ControlFlowStorage.ts b/src/storages/custom-nodes/ControlFlowStorage.ts index 808142753..6da02985c 100644 --- a/src/storages/custom-nodes/ControlFlowStorage.ts +++ b/src/storages/custom-nodes/ControlFlowStorage.ts @@ -1,10 +1,7 @@ -import { inject, injectable, postConstruct, } from 'inversify'; +import { inject, injectable, } from 'inversify'; import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; -import { TIdentifierNamesGeneratorFactory } from '../../types/container/generators/TIdentifierNamesGeneratorFactory'; - import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode'; -import { IIdentifierNamesGenerator } from '../../interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator'; import { IOptions } from '../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; @@ -12,31 +9,15 @@ import { MapStorage } from '../MapStorage'; @injectable() export class ControlFlowStorage extends MapStorage { - /** - * @type {IIdentifierNamesGenerator} - */ - private readonly identifierNamesGenerator: IIdentifierNamesGenerator; - /** * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory * @param {IRandomGenerator} randomGenerator * @param {IOptions} options */ public constructor ( - @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator) - identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory, @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, @inject(ServiceIdentifiers.IOptions) options: IOptions ) { super(randomGenerator, options); - - this.identifierNamesGenerator = identifierNamesGeneratorFactory(options); - } - - @postConstruct() - public override initialize (): void { - super.initialize(); - - this.storageId = this.identifierNamesGenerator.generateNext(); } } diff --git a/test/dev/dev.ts b/test/dev/dev.ts index 5d8a115cb..68b50c44c 100644 --- a/test/dev/dev.ts +++ b/test/dev/dev.ts @@ -35,7 +35,7 @@ import { StringArrayWrappersType } from '../../src/enums/node-transformers/strin ], stringArrayThreshold: 1, stringArrayCallsTransform: true, - stringArrayCallsTransformThreshold: 0.5, + stringArrayCallsTransformThreshold: 1, rotateStringArray: true, stringArrayWrappersType: StringArrayWrappersType.Function, transformObjectKeys: true, diff --git a/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts b/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts index 556636040..d870468be 100644 --- a/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts +++ b/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts @@ -59,7 +59,7 @@ describe('JavaScriptObfuscator runtime eval', function () { unicodeEscapeSequence: true }; - this.timeout(200000); + this.timeout(600000); const options: Partial[] = [ { From ec9105e36b5e66d4f4c132d48367188df038ade8 Mon Sep 17 00:00:00 2001 From: sanex Date: Sat, 16 Oct 2021 10:49:07 +0300 Subject: [PATCH 04/14] wip --- .../StringArrayStorageAnalyzer.ts | 4 +- .../AbstractIdentifierNamesGenerator.ts | 4 +- .../node-transformers/INodeTransformer.ts | 2 + src/interfaces/storages/IArrayStorage.ts | 2 + src/interfaces/storages/IMapStorage.ts | 2 + src/interfaces/storages/IWeakMapStorage.ts | 37 +++++++ ...tringArrayScopeCallsWrappersDataStorage.ts | 4 +- .../NodeTransformersRunner.ts | 10 ++ .../FunctionControlFlowTransformer.ts | 4 +- .../DeadCodeInjectionTransformer.ts | 25 ++--- .../ScopeIdentifiersTransformer.ts | 24 ++-- .../replacer/IdentifierReplacer.ts | 33 +++--- .../StringArrayRotateFunctionTransformer.ts | 80 ++------------ src/storages/ArrayStorage.ts | 4 + src/storages/MapStorage.ts | 4 + src/storages/WeakMapStorage.ts | 103 ++++++++++++++++++ ...tringArrayScopeCallsWrappersDataStorage.ts | 4 +- ...tringArrayRotateFunctionCodeHelper.spec.ts | 6 +- ...inaryExpressionControlFlowReplacer.spec.ts | 6 +- .../CallExpressionControlFlowReplacer.spec.ts | 18 +-- ...gicalExpressionControlFlowReplacer.spec.ts | 8 +- .../StringLiteralControlFlowReplacer.spec.ts | 4 +- .../FunctionControlFlowTransformer.spec.ts | 12 +- .../ObjectExpressionKeysTransformer.spec.ts | 8 +- .../EscapeSequenceTransformer.spec.ts | 16 +-- .../EvalCallExpressionTransformer.spec.ts | 4 +- ...ConditionalCommentObfuscatingGuard.spec.ts | 2 +- ...ringArrayRotateFunctionTransformer.spec.ts | 2 +- ...gArrayScopeCallsWrapperTransformer.spec.ts | 78 ++++++------- ...ictionarylIdentifierNamesGenerator.spec.ts | 35 ++++++ ...exadecimalIdentifierNamesGenerator.spec.ts | 42 +++++++ ...dShuffledlIdentifierNamesGenerator.spec.ts | 34 ++++++ .../MangledlIdentifierNamesGenerator.spec.ts | 40 +++++++ 33 files changed, 451 insertions(+), 210 deletions(-) create mode 100644 src/interfaces/storages/IWeakMapStorage.ts create mode 100644 src/storages/WeakMapStorage.ts diff --git a/src/analyzers/string-array-storage-analyzer/StringArrayStorageAnalyzer.ts b/src/analyzers/string-array-storage-analyzer/StringArrayStorageAnalyzer.ts index 96c758b82..b714759a5 100644 --- a/src/analyzers/string-array-storage-analyzer/StringArrayStorageAnalyzer.ts +++ b/src/analyzers/string-array-storage-analyzer/StringArrayStorageAnalyzer.ts @@ -42,9 +42,9 @@ export class StringArrayStorageAnalyzer implements IStringArrayStorageAnalyzer { private readonly stringArrayStorage: IStringArrayStorage; /** - * @type {Map} + * @type {WeakMap} */ - private readonly stringArrayStorageData: Map = new Map(); + private readonly stringArrayStorageData: WeakMap = new WeakMap(); /** * @param {IStringArrayStorage} stringArrayStorage diff --git a/src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts b/src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts index 4a1ccdb06..8c9ffed13 100644 --- a/src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts +++ b/src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts @@ -27,9 +27,9 @@ export abstract class AbstractIdentifierNamesGenerator implements IIdentifierNam protected readonly preservedNamesSet: Set = new Set(); /** - * @type {Map>} + * @type {WeakMap>} */ - protected readonly lexicalScopesPreservedNamesMap: Map> = new Map(); + protected readonly lexicalScopesPreservedNamesMap: WeakMap> = new WeakMap(); /** * @type {Map>} diff --git a/src/interfaces/node-transformers/INodeTransformer.ts b/src/interfaces/node-transformers/INodeTransformer.ts index 3798edbe8..6068a0fb5 100644 --- a/src/interfaces/node-transformers/INodeTransformer.ts +++ b/src/interfaces/node-transformers/INodeTransformer.ts @@ -32,4 +32,6 @@ export interface INodeTransformer extends ITransformer { * @returns {Node | VisitorOption} */ transformNode (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | estraverse.VisitorOption; + + onTransformComplete ? (): void; } diff --git a/src/interfaces/storages/IArrayStorage.ts b/src/interfaces/storages/IArrayStorage.ts index 771b21f89..6a6cada34 100644 --- a/src/interfaces/storages/IArrayStorage.ts +++ b/src/interfaces/storages/IArrayStorage.ts @@ -1,6 +1,8 @@ import { IInitializable } from '../IInitializable'; export interface IArrayStorage extends IInitializable { + clear (): void; + /** * @param {number} key * @returns {V | undefined} diff --git a/src/interfaces/storages/IMapStorage.ts b/src/interfaces/storages/IMapStorage.ts index 50f004ca1..3ac841eb8 100644 --- a/src/interfaces/storages/IMapStorage.ts +++ b/src/interfaces/storages/IMapStorage.ts @@ -3,6 +3,8 @@ import { TDictionary } from '../../types/TDictionary'; import { IInitializable } from '../IInitializable'; export interface IMapStorage extends IInitializable { + clear (): void; + /** * @param {K} key * @returns {V | undefined} diff --git a/src/interfaces/storages/IWeakMapStorage.ts b/src/interfaces/storages/IWeakMapStorage.ts new file mode 100644 index 000000000..82b91560a --- /dev/null +++ b/src/interfaces/storages/IWeakMapStorage.ts @@ -0,0 +1,37 @@ +import { IInitializable } from '../IInitializable'; + +export interface IWeakMapStorage extends IInitializable { + /** + * @param {K} key + * @returns {V | undefined} + */ + get (key: K): V | undefined; + + /** + * @param {K} key + * @returns {V} + */ + getOrThrow (key: K): V; + + /** + * @returns {WeakMap} + */ + getStorage (): WeakMap ; + + /** + * @returns string + */ + getStorageId (): string; + + /** + * @param {K} key + * @returns {boolean} + */ + has (key: K): boolean; + + /** + * @param {K} key + * @param {V} value + */ + set (key: K, value: V): void; +} diff --git a/src/interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage.ts b/src/interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage.ts index 2b7c59c65..ed9e71341 100644 --- a/src/interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage.ts +++ b/src/interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage.ts @@ -1,10 +1,10 @@ import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements'; import { TStringArrayScopeCallsWrappersDataByEncoding } from '../../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrappersDataByEncoding'; -import { IMapStorage } from '../IMapStorage'; +import { IWeakMapStorage } from '../IWeakMapStorage'; // eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface IStringArrayScopeCallsWrappersDataStorage extends IMapStorage< +export interface IStringArrayScopeCallsWrappersDataStorage extends IWeakMapStorage< TNodeWithLexicalScopeStatements, TStringArrayScopeCallsWrappersDataByEncoding > {} diff --git a/src/node-transformers/NodeTransformersRunner.ts b/src/node-transformers/NodeTransformersRunner.ts index 8e423bae3..015c2ff6f 100644 --- a/src/node-transformers/NodeTransformersRunner.ts +++ b/src/node-transformers/NodeTransformersRunner.ts @@ -61,6 +61,7 @@ export class NodeTransformersRunner implements INodeTransformersRunner { * @param {NodeTransformationStage} nodeTransformationStage * @returns {T} */ + // eslint-disable-next-line complexity public transform ( astTree: T, nodeTransformerNames: NodeTransformer[], @@ -78,6 +79,7 @@ export class NodeTransformersRunner implements INodeTransformersRunner { for (const nodeTransformerNamesGroup of nodeTransformerNamesGroups) { const enterVisitors: IVisitor[] = []; const leaveVisitors: IVisitor[] = []; + const onTransformCompleteHandlers: INodeTransformer['onTransformComplete'][] = []; for (const nodeTransformerName of nodeTransformerNamesGroup) { const nodeTransformer: INodeTransformer = normalizedNodeTransformers[nodeTransformerName]; @@ -94,6 +96,10 @@ export class NodeTransformersRunner implements INodeTransformersRunner { if (visitor.leave) { leaveVisitors.push({ leave: visitor.leave }); } + + if (nodeTransformer.onTransformComplete) { + onTransformCompleteHandlers.push(nodeTransformer.onTransformComplete.bind(nodeTransformer)); + } } if (!enterVisitors.length && !leaveVisitors.length) { @@ -104,6 +110,10 @@ export class NodeTransformersRunner implements INodeTransformersRunner { enter: this.mergeVisitorsForDirection(enterVisitors, VisitorDirection.Enter), leave: this.mergeVisitorsForDirection(leaveVisitors, VisitorDirection.Leave) }); + + for (const onTransformCompleteHandler of onTransformCompleteHandlers) { + onTransformCompleteHandler?.(); + } } return astTree; diff --git a/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts b/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts index 1354f3950..8fc8dc3ed 100644 --- a/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts +++ b/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts @@ -52,9 +52,9 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { ]); /** - * @type {Map} + * @type {WeakMap} */ - protected readonly controlFlowData: Map = new Map(); + protected readonly controlFlowData: WeakMap = new WeakMap(); /** * @type {WeakMap} diff --git a/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts b/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts index f78b9d401..46493ba62 100644 --- a/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts +++ b/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts @@ -53,16 +53,9 @@ export class DeadCodeInjectionTransformer extends AbstractNodeTransformer { ]; /** - * @type {NodeTransformer[]} - */ - public override readonly runAfter: NodeTransformer[] = [ - NodeTransformer.ScopeIdentifiersTransformer - ]; - - /** - * @type {Set } + * @type {WeakSet } */ - private readonly deadCodeInjectionRootAstHostNodeSet: Set = new Set(); + private readonly deadCodeInjectionRootAstHostNodeSet: WeakSet = new WeakSet(); /** * @type {ESTree.BlockStatement[]} @@ -244,11 +237,7 @@ export class DeadCodeInjectionTransformer extends AbstractNodeTransformer { } }; - case NodeTransformationStage.RenameIdentifiers: - if (!this.deadCodeInjectionRootAstHostNodeSet.size) { - return null; - } - + case NodeTransformationStage.StringArray: return { enter: ( node: ESTree.Node, @@ -351,7 +340,13 @@ export class DeadCodeInjectionTransformer extends AbstractNodeTransformer { * @returns {boolean} */ private isDeadCodeInjectionRootAstHostNode (node: ESTree.Node): node is ESTree.BlockStatement { - return NodeGuards.isBlockStatementNode(node) && this.deadCodeInjectionRootAstHostNodeSet.has(node); + const isDeadCodeInjectionRootAstHostNode = NodeGuards.isBlockStatementNode(node) && this.deadCodeInjectionRootAstHostNodeSet.has(node); + + if (isDeadCodeInjectionRootAstHostNode) { + this.deadCodeInjectionRootAstHostNodeSet.delete(node); + } + + return isDeadCodeInjectionRootAstHostNode; } /** diff --git a/src/node-transformers/rename-identifiers-transformers/ScopeIdentifiersTransformer.ts b/src/node-transformers/rename-identifiers-transformers/ScopeIdentifiersTransformer.ts index d376d50ed..6eef3e984 100644 --- a/src/node-transformers/rename-identifiers-transformers/ScopeIdentifiersTransformer.ts +++ b/src/node-transformers/rename-identifiers-transformers/ScopeIdentifiersTransformer.ts @@ -31,9 +31,9 @@ export class ScopeIdentifiersTransformer extends AbstractNodeTransformer { private readonly identifierReplacer: IIdentifierReplacer; /** - * @type {Map} + * @type {WeakMap} */ - private readonly lexicalScopesWithObjectPatternWithoutDeclarationMap: Map = new Map(); + private readonly lexicalScopesWithObjectPatternWithoutDeclarationMap: WeakMap = new WeakMap(); /** * @type {IScopeIdentifiersTraverser} @@ -362,24 +362,16 @@ export class ScopeIdentifiersTransformer extends AbstractNodeTransformer { const properties: (ESTree.Property | ESTree.RestElement)[] = node.properties; for (const property of properties) { - if (!NodeGuards.isPropertyNode(property)) { - continue; - } - - if (property.computed || !property.shorthand) { - continue; - } + isProhibitedVariableDeclaration = NodeGuards.isPropertyNode(property) + && !property.computed + && property.shorthand + && NodeGuards.isIdentifierNode(property.key) + && identifierNode.name === property.key.name; - if (!NodeGuards.isIdentifierNode(property.key)) { + if (!isProhibitedVariableDeclaration) { continue; } - if (identifierNode.name !== property.key.name) { - continue; - } - - isProhibitedVariableDeclaration = true; - return estraverse.VisitorOption.Break; } } diff --git a/src/node-transformers/rename-identifiers-transformers/replacer/IdentifierReplacer.ts b/src/node-transformers/rename-identifiers-transformers/replacer/IdentifierReplacer.ts index b729e91af..9fbd0c636 100644 --- a/src/node-transformers/rename-identifiers-transformers/replacer/IdentifierReplacer.ts +++ b/src/node-transformers/rename-identifiers-transformers/replacer/IdentifierReplacer.ts @@ -26,9 +26,9 @@ export class IdentifierReplacer implements IIdentifierReplacer { private readonly identifierNamesGenerator: IIdentifierNamesGenerator; /** - * @type {Map>} + * @type {WeakMap>} */ - private readonly blockScopesMap: Map> = new Map(); + private readonly blockScopesMap: WeakMap> = new WeakMap(); /** * @type {IOptions} @@ -68,13 +68,10 @@ export class IdentifierReplacer implements IIdentifierReplacer { const newIdentifierName: string = this.identifierNamesGenerator.generateForGlobalScope(); - if (!this.blockScopesMap.has(lexicalScopeNode)) { - this.blockScopesMap.set(lexicalScopeNode, new Map()); - } - - const namesMap: Map = >this.blockScopesMap.get(lexicalScopeNode); + const namesMap: Map = this.blockScopesMap.get(lexicalScopeNode) ?? new Map(); namesMap.set(identifierName, newIdentifierName); + this.blockScopesMap.set(lexicalScopeNode, namesMap); // Have to write all global identifier names to the identifier names cache storage if (this.options.identifierNamesCache) { @@ -97,14 +94,10 @@ export class IdentifierReplacer implements IIdentifierReplacer { } const newIdentifierName: string = this.identifierNamesGenerator.generateForLexicalScope(lexicalScopeNode); - - if (!this.blockScopesMap.has(lexicalScopeNode)) { - this.blockScopesMap.set(lexicalScopeNode, new Map()); - } - - const namesMap: Map = >this.blockScopesMap.get(lexicalScopeNode); + const namesMap: Map | null = this.blockScopesMap.get(lexicalScopeNode) ?? new Map(); namesMap.set(identifierName, newIdentifierName); + this.blockScopesMap.set(lexicalScopeNode, namesMap); } /** @@ -113,14 +106,16 @@ export class IdentifierReplacer implements IIdentifierReplacer { * @returns {Identifier} */ public replace (identifierNode: ESTree.Identifier, lexicalScopeNode: TNodeWithLexicalScope): ESTree.Identifier { - let identifierName: string = identifierNode.name; + const namesMap: Map | null = this.blockScopesMap.get(lexicalScopeNode) ?? null; + + if (!namesMap) { + return identifierNode; + } - if (this.blockScopesMap.has(lexicalScopeNode)) { - const namesMap: Map = >this.blockScopesMap.get(lexicalScopeNode); + const identifierName: string | null = namesMap.get(identifierNode.name) ?? null; - if (namesMap.has(identifierName)) { - identifierName = namesMap.get(identifierName); - } + if (!identifierName) { + return identifierNode; } return NodeFactory.identifierNode(identifierName); diff --git a/src/node-transformers/string-array-transformers/StringArrayRotateFunctionTransformer.ts b/src/node-transformers/string-array-transformers/StringArrayRotateFunctionTransformer.ts index 29785a5bf..095b64104 100644 --- a/src/node-transformers/string-array-transformers/StringArrayRotateFunctionTransformer.ts +++ b/src/node-transformers/string-array-transformers/StringArrayRotateFunctionTransformer.ts @@ -8,15 +8,12 @@ import { TCustomCodeHelperFactory } from '../../types/container/custom-code-help import { TInitialData } from '../../types/TInitialData'; import { TNumberNumericalExpressionData } from '../../types/analyzers/number-numerical-expression-analyzer/TNumberNumericalExpressionData'; import { TStatement } from '../../types/node/TStatement'; -import { TStringLiteralNode } from '../../types/node/TStringLiteralNode'; import { ICustomCodeHelper } from '../../interfaces/custom-code-helpers/ICustomCodeHelper'; -import { INodeTransformersRunner } from '../../interfaces/node-transformers/INodeTransformersRunner'; import { INumberNumericalExpressionAnalyzer } from '../../interfaces/analyzers/number-numerical-expression-analyzer/INumberNumericalExpressionAnalyzer'; import { IOptions } from '../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; import { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage'; -import { IStringArrayStorageAnalyzer } from '../../interfaces/analyzers/string-array-storage-analyzer/IStringArrayStorageAnalyzer'; import { IVisitor } from '../../interfaces/node-transformers/IVisitor'; import { CustomCodeHelper } from '../../enums/custom-code-helpers/CustomCodeHelper'; @@ -28,7 +25,6 @@ import { NodeGuards } from '../../node/NodeGuards'; import { NodeFactory } from '../../node/NodeFactory'; import { NodeLiteralUtils } from '../../node/NodeLiteralUtils'; import { NodeMetadata } from '../../node/NodeMetadata'; -import { NodeTransformer } from '../../enums/node-transformers/NodeTransformer'; import { NodeUtils } from '../../node/NodeUtils'; import { NumericalExpressionDataToNodeConverter } from '../../node/NumericalExpressionDataToNodeConverter'; import { StringArrayRotateFunctionCodeHelper } from '../../custom-code-helpers/string-array/StringArrayRotateFunctionCodeHelper'; @@ -36,21 +32,17 @@ import { StringArrayRotateFunctionCodeHelper } from '../../custom-code-helpers/s @injectable() export class StringArrayRotateFunctionTransformer extends AbstractNodeTransformer { /** - * @type {NodeTransformer[]} + * @type {number} */ - private static readonly stringArrayRotateFunctionTransformers: NodeTransformer[] = [ - NodeTransformer.BooleanLiteralTransformer, - NodeTransformer.MemberExpressionTransformer, - NodeTransformer.NumberLiteralTransformer, - NodeTransformer.NumberToNumericalExpressionTransformer, - NodeTransformer.ParentificationTransformer, - NodeTransformer.ScopeIdentifiersTransformer - ]; + private static readonly comparisonExpressionAdditionalPartsCount: number = 7; /** - * @type {number} + * @type {string[]} */ - private static readonly comparisonExpressionAdditionalPartsCount: number = 7; + private static readonly stringArrayShiftMethodNames: string[] = [ + 'push', + 'shift' + ]; /** * @type {INumberNumericalExpressionAnalyzer} @@ -62,36 +54,22 @@ export class StringArrayRotateFunctionTransformer extends AbstractNodeTransforme */ private readonly stringArrayStorage: IStringArrayStorage; - /** - * @type {IStringArrayStorageAnalyzer} - */ - private readonly stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer; - /** * @type {TCustomCodeHelperFactory} */ private readonly customCodeHelperFactory: TCustomCodeHelperFactory; - /** - * @type {INodeTransformersRunner} - */ - private readonly transformersRunner: INodeTransformersRunner; - /** * @param {IRandomGenerator} randomGenerator * @param {IOptions} options - * @param {INodeTransformersRunner} transformersRunner * @param {IStringArrayStorage} stringArrayStorage - * @param {IStringArrayStorageAnalyzer} stringArrayStorageAnalyzer * @param {TCustomCodeHelperFactory} customCodeHelperFactory * @param {INumberNumericalExpressionAnalyzer} numberNumericalExpressionAnalyzer */ public constructor ( @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, @inject(ServiceIdentifiers.IOptions) options: IOptions, - @inject(ServiceIdentifiers.INodeTransformersRunner) transformersRunner: INodeTransformersRunner, @inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage, - @inject(ServiceIdentifiers.IStringArrayStorageAnalyzer) stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer, @inject(ServiceIdentifiers.Factory__ICustomCodeHelper) customCodeHelperFactory: TCustomCodeHelperFactory, @inject(ServiceIdentifiers.INumberNumericalExpressionAnalyzer) numberNumericalExpressionAnalyzer: INumberNumericalExpressionAnalyzer @@ -99,8 +77,6 @@ export class StringArrayRotateFunctionTransformer extends AbstractNodeTransforme super(randomGenerator, options); this.stringArrayStorage = stringArrayStorage; - this.stringArrayStorageAnalyzer = stringArrayStorageAnalyzer; - this.transformersRunner = transformersRunner; this.customCodeHelperFactory = customCodeHelperFactory; this.numberNumericalExpressionAnalyzer = numberNumericalExpressionAnalyzer; } @@ -167,31 +143,8 @@ export class StringArrayRotateFunctionTransformer extends AbstractNodeTransforme */ public transformNode (programNode: ESTree.Program): ESTree.Node { const stringArrayRotateFunctionNode: TStatement = this.getStringArrayRotateFunctionNode(); - const wrappedStringArrayRotateFunctionNode: ESTree.Program = NodeFactory.programNode([ - stringArrayRotateFunctionNode - ]); - - NodeUtils.parentizeAst(wrappedStringArrayRotateFunctionNode); - - const transformationStages: NodeTransformationStage[] = [ - NodeTransformationStage.Preparing, - NodeTransformationStage.Converting, - NodeTransformationStage.RenameIdentifiers, - NodeTransformationStage.Finalizing - ]; - - // custom transformation of string array rotate function node - for (const transformationStage of transformationStages) { - this.transformersRunner.transform( - wrappedStringArrayRotateFunctionNode, - StringArrayRotateFunctionTransformer.stringArrayRotateFunctionTransformers, - transformationStage - ); - } - // mark all child nodes (except literals inside comparison expression) - // as ignored to prevent additional transformation of these nodes - estraverse.traverse(wrappedStringArrayRotateFunctionNode, { + estraverse.traverse(stringArrayRotateFunctionNode, { enter: (node: ESTree.Node): void => { if ( !NodeGuards.isLiteralNode(node) @@ -200,16 +153,15 @@ export class StringArrayRotateFunctionTransformer extends AbstractNodeTransforme return; } - // force add item data for string literal nodes of comparison expressions - // set all other nodes as ignored to prevent them from obfuscation - if (this.isComparisonExpressionStringLiteralNode(node)) { - this.stringArrayStorageAnalyzer.addItemDataForLiteralNode(node); - } else { + // set string array shift method names as ignored + // to prevent its extraction to string array + if (StringArrayRotateFunctionTransformer.stringArrayShiftMethodNames.includes(node.value)) { NodeMetadata.set(node, {ignoredNode: true}); } } }); + NodeUtils.parentizeAst(stringArrayRotateFunctionNode); NodeAppender.prepend(programNode, [stringArrayRotateFunctionNode]); return programNode; @@ -268,14 +220,6 @@ export class StringArrayRotateFunctionTransformer extends AbstractNodeTransforme return stringArrayRotateFunctionCodeHelper.getNode()[0]; } - /** - * @param {TStringLiteralNode} stringLiteralNode - * @returns {boolean} - */ - private isComparisonExpressionStringLiteralNode (stringLiteralNode: TStringLiteralNode): boolean { - return /\d/.test(stringLiteralNode.value); - } - /** * Extracted to a standalone method to correctly stub this behaviour * diff --git a/src/storages/ArrayStorage.ts b/src/storages/ArrayStorage.ts index d78856b71..62e9cc205 100644 --- a/src/storages/ArrayStorage.ts +++ b/src/storages/ArrayStorage.ts @@ -54,6 +54,10 @@ export abstract class ArrayStorage implements IArrayStorage { this.storageId = this.randomGenerator.getRandomString(6); } + public clear (): void { + this.storage = []; + } + /** * @param {number} key * @returns {V | undefined} diff --git a/src/storages/MapStorage.ts b/src/storages/MapStorage.ts index cc9b88423..31924dcca 100644 --- a/src/storages/MapStorage.ts +++ b/src/storages/MapStorage.ts @@ -50,6 +50,10 @@ export abstract class MapStorage implements IMapStorage { this.storageId = this.randomGenerator.getRandomString(6); } + public clear (): void { + this.storage.clear(); + } + /** * @param {K} key * @returns {V | undefined} diff --git a/src/storages/WeakMapStorage.ts b/src/storages/WeakMapStorage.ts new file mode 100644 index 000000000..bfe2f7bc9 --- /dev/null +++ b/src/storages/WeakMapStorage.ts @@ -0,0 +1,103 @@ +import { inject, injectable, postConstruct } from 'inversify'; +import { ServiceIdentifiers } from '../container/ServiceIdentifiers'; + +import { IOptions } from '../interfaces/options/IOptions'; +import { IRandomGenerator } from '../interfaces/utils/IRandomGenerator'; +import { IWeakMapStorage } from '../interfaces/storages/IWeakMapStorage'; + +import { initializable } from '../decorators/Initializable'; + +@injectable() +export abstract class WeakMapStorage implements IWeakMapStorage { + /** + * @type {string} + */ + @initializable() + protected storageId!: string; + + /** + * @type {WeakMap } + */ + @initializable() + protected storage!: WeakMap ; + + /** + * @type {IOptions} + */ + protected readonly options: IOptions; + + /** + * @type {IRandomGenerator} + */ + protected readonly randomGenerator: IRandomGenerator; + + /** + * @param {IRandomGenerator} randomGenerator + * @param {IOptions} options + */ + public constructor ( + @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, + @inject(ServiceIdentifiers.IOptions) options: IOptions + ) { + this.randomGenerator = randomGenerator; + this.options = options; + } + + @postConstruct() + public initialize (): void { + this.storage = new Map (); + this.storageId = this.randomGenerator.getRandomString(6); + } + + /** + * @param {K} key + * @returns {V | undefined} + */ + public get (key: K): V | undefined { + return this.storage.get(key); + } + + /** + * @param {K} key + * @returns {V} + */ + public getOrThrow (key: K): V { + const value: V | undefined = this.get(key); + + if (!value) { + throw new Error(`No value found in weak map storage with key \`${key}\``); + } + + return value; + } + + /** + * @returns {WeakMap} + */ + public getStorage (): WeakMap { + return this.storage; + } + + /** + * @returns {string} + */ + public getStorageId (): string { + return this.storageId; + } + + /** + * @param {K} key + * @returns {boolean} + */ + public has (key: K): boolean { + return this.storage.has(key); + } + + /** + * @param {K} key + * @param {V} value + */ + public set (key: K, value: V): void { + this.storage.set(key, value); + } +} diff --git a/src/storages/string-array-transformers/StringArrayScopeCallsWrappersDataStorage.ts b/src/storages/string-array-transformers/StringArrayScopeCallsWrappersDataStorage.ts index 7fbb882e0..153b0abf6 100644 --- a/src/storages/string-array-transformers/StringArrayScopeCallsWrappersDataStorage.ts +++ b/src/storages/string-array-transformers/StringArrayScopeCallsWrappersDataStorage.ts @@ -8,10 +8,10 @@ import { IOptions } from '../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; import { IStringArrayScopeCallsWrappersDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage'; -import { MapStorage } from '../MapStorage'; +import { WeakMapStorage } from '../WeakMapStorage'; @injectable() -export class StringArrayScopeCallsWrappersDataStorage extends MapStorage < +export class StringArrayScopeCallsWrappersDataStorage extends WeakMapStorage < TNodeWithLexicalScopeStatements, TStringArrayScopeCallsWrappersDataByEncoding > implements IStringArrayScopeCallsWrappersDataStorage { diff --git a/test/functional-tests/custom-code-helpers/string-array/StringArrayRotateFunctionCodeHelper.spec.ts b/test/functional-tests/custom-code-helpers/string-array/StringArrayRotateFunctionCodeHelper.spec.ts index b48584218..0e4aa641e 100644 --- a/test/functional-tests/custom-code-helpers/string-array/StringArrayRotateFunctionCodeHelper.spec.ts +++ b/test/functional-tests/custom-code-helpers/string-array/StringArrayRotateFunctionCodeHelper.spec.ts @@ -10,7 +10,7 @@ import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscatorFacade describe('StringArrayRotateFunctionCodeHelper', () => { describe('Base behaviour', () => { - const regExp: RegExp = /while *\(!!\[]\) *\{/; + const regExp: RegExp = /while *\(true\) *\{/; describe('`stringArray` option is set', () => { let obfuscatedCode: string; @@ -84,8 +84,8 @@ describe('StringArrayRotateFunctionCodeHelper', () => { }); describe('Preserve string array name', () => { - const arrayRotateRegExp: RegExp = /e\['push']\(e\['shift']\(\)\);/; - const comparisonRegExp: RegExp = /if *\(f *=== *d\) *{/; + const arrayRotateRegExp: RegExp = /f\['push']\(f\['shift']\(\)\);/; + const comparisonRegExp: RegExp = /if *\(g *=== *d\) *{/; let obfuscatedCode: string; diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts index 7f80b77e3..1886150dd 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts @@ -14,7 +14,7 @@ describe('BinaryExpressionControlFlowReplacer', function () { describe('Variant #1 - single binary expression', () => { const controlFlowStorageCallRegExp: RegExp = new RegExp( - `var ${variableMatch} *= *${variableMatch}\\['${variableMatch}'\\]\\(0x1, *0x2\\);` + `var ${variableMatch} *= *${variableMatch}\\['\\w{5}'\\]\\(0x1, *0x2\\);` ); let obfuscatedCode: string; @@ -45,10 +45,10 @@ describe('BinaryExpressionControlFlowReplacer', function () { const delta: number = 0.1; const controlFlowStorageCallRegExp1: RegExp = new RegExp( - `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['${variableMatch}'\\])\\(0x1, *0x2\\);` + `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['\\w{5}'\\])\\(0x1, *0x2\\);` ); const controlFlowStorageCallRegExp2: RegExp = new RegExp( - `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['${variableMatch}'\\])\\(0x2, *0x3\\);` + `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['\\w{5}'\\])\\(0x2, *0x3\\);` ); let matchErrorsCount: number = 0, diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts index 12a6fce7d..10a260bdc 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts @@ -14,7 +14,7 @@ describe('CallExpressionControlFlowReplacer', function () { describe('Variant #1 - single call expression', () => { const controlFlowStorageCallRegExp: RegExp = new RegExp( - `var ${variableMatch} *= *${variableMatch}\\['${variableMatch}'\\]\\(${variableMatch}, *0x1, *0x2\\);` + `var ${variableMatch} *= *${variableMatch}\\['\\w{5}'\\]\\(${variableMatch}, *0x1, *0x2\\);` ); let obfuscatedCode: string; @@ -45,10 +45,10 @@ describe('CallExpressionControlFlowReplacer', function () { const delta: number = 0.1; const controlFlowStorageCallRegExp1: RegExp = new RegExp( - `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['${variableMatch}'\\])\\(${variableMatch}, *0x1, *0x2\\);` + `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['\\w{5}'\\])\\(${variableMatch}, *0x1, *0x2\\);` ); const controlFlowStorageCallRegExp2: RegExp = new RegExp( - `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['${variableMatch}'\\])\\(${variableMatch}, *0x2, *0x3\\);` + `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['\\w{5}'\\])\\(${variableMatch}, *0x2, *0x3\\);` ); let matchErrorsCount: number = 0, @@ -130,10 +130,10 @@ describe('CallExpressionControlFlowReplacer', function () { describe('Variant #4 - rest as start call argument', () => { const controlFlowStorageCallRegExp: RegExp = new RegExp( - `${variableMatch}\\['${variableMatch}']\\(${variableMatch}, *\\.\\.\\.${variableMatch}, *${variableMatch}\\);` + `${variableMatch}\\['\\w{5}']\\(${variableMatch}, *\\.\\.\\.${variableMatch}, *${variableMatch}\\);` ); const controlFlowStorageNodeRegExp: RegExp = new RegExp(`` + - `'${variableMatch}' *: *function *\\(${variableMatch}, *\.\.\.${variableMatch}\\) *\\{` + + `'\\w{5}' *: *function *\\(${variableMatch}, *\.\.\.${variableMatch}\\) *\\{` + `return *${variableMatch}\\(\.\.\.${variableMatch}\\);` + `\\}` + ``); @@ -164,10 +164,10 @@ describe('CallExpressionControlFlowReplacer', function () { describe('Variant #5 - rest as middle call argument', () => { const controlFlowStorageCallRegExp: RegExp = new RegExp( - `${variableMatch}\\['${variableMatch}']\\(${variableMatch}, *${variableMatch}, *\\.\\.\\.${variableMatch}, *${variableMatch}\\);` + `${variableMatch}\\['\\w{5}']\\(${variableMatch}, *${variableMatch}, *\\.\\.\\.${variableMatch}, *${variableMatch}\\);` ); const controlFlowStorageNodeRegExp: RegExp = new RegExp(`` + - `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}, *\.\.\.${variableMatch}\\) *\\{` + + `'\\w{5}' *: *function *\\(${variableMatch}, *${variableMatch}, *\.\.\.${variableMatch}\\) *\\{` + `return *${variableMatch}\\(${variableMatch}, *\.\.\.${variableMatch}\\);` + `\\}` + ``); @@ -198,10 +198,10 @@ describe('CallExpressionControlFlowReplacer', function () { describe('Variant #6 - rest as last call argument', () => { const controlFlowStorageCallRegExp: RegExp = new RegExp( - `${variableMatch}\\['${variableMatch}']\\(${variableMatch}, *${variableMatch}, *\\.\\.\\.${variableMatch}\\);` + `${variableMatch}\\['\\w{5}']\\(${variableMatch}, *${variableMatch}, *\\.\\.\\.${variableMatch}\\);` ); const controlFlowStorageNodeRegExp: RegExp = new RegExp(`` + - `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}, *\.\.\.${variableMatch}\\) *\\{` + + `'\\w{5}' *: *function *\\(${variableMatch}, *${variableMatch}, *\.\.\.${variableMatch}\\) *\\{` + `return *${variableMatch}\\(${variableMatch}, *\.\.\.${variableMatch}\\);` + `\\}` + ``); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts index d1427eaad..4ad5ccd5f 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts @@ -14,7 +14,7 @@ describe('LogicalExpressionControlFlowReplacer', function () { describe('Variant #1 - single logical expression', () => { const controlFlowStorageCallRegExp: RegExp = new RegExp( - `var ${variableMatch} *= *${variableMatch}\\['${variableMatch}'\\]\\(!!\\[\\], *!\\[\\]\\);` + `var ${variableMatch} *= *${variableMatch}\\['\\w{5}'\\]\\(!!\\[\\], *!\\[\\]\\);` ); let obfuscatedCode: string; @@ -45,10 +45,10 @@ describe('LogicalExpressionControlFlowReplacer', function () { const delta: number = 0.1; const controlFlowStorageCallRegExp1: RegExp = new RegExp( - `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['${variableMatch}'\\])\\(!!\\[\\], *!\\[\\]\\);` + `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['\\w{5}'\\])\\(!!\\[\\], *!\\[\\]\\);` ); const controlFlowStorageCallRegExp2: RegExp = new RegExp( - `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['${variableMatch}'\\])\\(!\\[\\], *!!\\[\\]\\);` + `var _0x(?:[a-f0-9]){4,6} *= *(${variableMatch}\\['\\w{5}'\\])\\(!\\[\\], *!!\\[\\]\\);` ); let matchErrorsCount: number = 0, @@ -105,7 +105,7 @@ describe('LogicalExpressionControlFlowReplacer', function () { describe('Variant #3 - single logical expression with unary expression', () => { const controlFlowStorageCallRegExp: RegExp = new RegExp( - `var ${variableMatch} *= *${variableMatch}\\['${variableMatch}'\\]\\(!${variableMatch}, *!${variableMatch}\\);` + `var ${variableMatch} *= *${variableMatch}\\['\\w{5}'\\]\\(!${variableMatch}, *!${variableMatch}\\);` ); let obfuscatedCode: string; diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts index 561da0863..1ab7f1adc 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts @@ -11,10 +11,10 @@ describe('StringLiteralControlFlowReplacer', () => { const variableMatch: string = '_0x([a-f0-9]){4,6}'; const controlFlowStorageStringLiteralRegExp: RegExp = new RegExp( - `var ${variableMatch} *= *\\{'${variableMatch}' *: *'test'\\};` + `var ${variableMatch} *= *\\{'\\w{5}' *: *'test'\\};` ); const controlFlowStorageCallRegExp: RegExp = new RegExp( - `var ${variableMatch} *= *${variableMatch}\\['${variableMatch}'\\];` + `var ${variableMatch} *= *${variableMatch}\\['\\w{5}'\\];` ); let obfuscatedCode: string; diff --git a/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts index 382466153..55dc0b45b 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts @@ -12,15 +12,15 @@ describe('FunctionControlFlowTransformer', function () { const variableMatch: string = '_0x([a-f0-9]){4,6}'; const rootControlFlowStorageNodeMatch: string = `` + `var ${variableMatch} *= *\\{` + - `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `'\\w{5}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + `return *${variableMatch} *\\+ *${variableMatch};` + `\\}` + `\\};` + ``; const innerControlFlowStorageNodeMatch: string = `` + `var ${variableMatch} *= *\\{` + - `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + - `return *${variableMatch}\\['${variableMatch}'\\]\\(${variableMatch}, *${variableMatch}\\);` + + `'\\w{5}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `return *${variableMatch}\\['\\w{5}'\\]\\(${variableMatch}, *${variableMatch}\\);` + `\\}` + `\\};` + ``; @@ -102,10 +102,10 @@ describe('FunctionControlFlowTransformer', function () { describe('Variant #3 - single `control flow storage` node with multiple items', () => { const regexp: RegExp = new RegExp( `var ${variableMatch} *= *\\{` + - `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `'\\w{5}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + `return *${variableMatch} *\\+ *${variableMatch};` + `\\}, *` + - `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `'\\w{5}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + `return *${variableMatch} *- *${variableMatch};` + `\\}` + `\\};` @@ -160,7 +160,7 @@ describe('FunctionControlFlowTransformer', function () { const regExp: RegExp = new RegExp( `var [a-zA-Z]{6} *= *\\{` + - `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `'\\w{5}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + `return *${variableMatch} *\\+ *${variableMatch};` + `\\}` + `\\};` diff --git a/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/ObjectExpressionKeysTransformer.spec.ts b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/ObjectExpressionKeysTransformer.spec.ts index fb2831a27..5085de466 100644 --- a/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/ObjectExpressionKeysTransformer.spec.ts +++ b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/ObjectExpressionKeysTransformer.spec.ts @@ -257,11 +257,11 @@ describe('ObjectExpressionKeysTransformer', () => { describe('Variant #9: correct integration with control flow flattening object #1', () => { const match: string = `` + `var ${variableMatch} *= *{};` + - `${variableMatch}\\['${variableMatch}'] *= *function *\\(${variableMatch}, *${variableMatch}\\) *{` + + `${variableMatch}\\['\\w{5}'] *= *function *\\(${variableMatch}, *${variableMatch}\\) *{` + `return *${variableMatch} *\\+ *${variableMatch};` + `};` + `var ${variableMatch} *= *${variableMatch};` + - `var ${variableMatch} *= *${variableMatch}\\['${variableMatch}']\\(0x1, *0x2\\);` + + `var ${variableMatch} *= *${variableMatch}\\['\\w{5}']\\(0x1, *0x2\\);` + ``; const regExp: RegExp = new RegExp(match); @@ -289,7 +289,7 @@ describe('ObjectExpressionKeysTransformer', () => { describe('Variant #10: correct integration with control flow flattening object #2', () => { const match: string = `` + `var ${variableMatch} *= *{};` + - `${variableMatch}\\['${variableMatch}'] *= *function *\\(${variableMatch}, *${variableMatch}\\) *{` + + `${variableMatch}\\['\\w{5}'] *= *function *\\(${variableMatch}, *${variableMatch}\\) *{` + `return *${variableMatch} *\\+ *${variableMatch};` + `};` + `var ${variableMatch} *= *${variableMatch};` + @@ -297,7 +297,7 @@ describe('ObjectExpressionKeysTransformer', () => { `${variableMatch}\\['foo'] *= *0x1;` + `var ${variableMatch} *= *{};` + `${variableMatch}\\['bar'] *= *0x2;` + - `var ${variableMatch} *= *${variableMatch}\\['${variableMatch}']\\(${variableMatch}\\['foo'], *${variableMatch}\\['bar']\\);` + + `var ${variableMatch} *= *${variableMatch}\\['\\w{5}']\\(${variableMatch}\\['foo'], *${variableMatch}\\['bar']\\);` + ``; const regExp: RegExp = new RegExp(match); diff --git a/test/functional-tests/node-transformers/finalizing-transformers/escape-sequence-transformer/EscapeSequenceTransformer.spec.ts b/test/functional-tests/node-transformers/finalizing-transformers/escape-sequence-transformer/EscapeSequenceTransformer.spec.ts index 016f06f55..88a2c60d7 100644 --- a/test/functional-tests/node-transformers/finalizing-transformers/escape-sequence-transformer/EscapeSequenceTransformer.spec.ts +++ b/test/functional-tests/node-transformers/finalizing-transformers/escape-sequence-transformer/EscapeSequenceTransformer.spec.ts @@ -171,15 +171,15 @@ describe('EscapeSequenceTransformer', function () { describe('Variant #6: `stringArrayWrappersCount` option enabled', () => { const stringArrayCallRegExp: RegExp = new RegExp( - 'const f *= *b;.*' + - 'const foo *= *f\\(\'\\\\x30\\\\x78\\\\x30\'\\);.*' + - 'const bar *= *f\\(\'\\\\x30\\\\x78\\\\x31\'\\);.*' + - 'const baz *= *f\\(\'\\\\x30\\\\x78\\\\x32\'\\);.*' + + 'const c *= *b;.*' + + 'const foo *= *c\\(\'\\\\x30\\\\x78\\\\x30\'\\);.*' + + 'const bar *= *c\\(\'\\\\x30\\\\x78\\\\x31\'\\);.*' + + 'const baz *= *c\\(\'\\\\x30\\\\x78\\\\x32\'\\);.*' + 'function test\\( *\\) *{' + - 'const g *= *f;' + - 'const c *= *g\\(\'\\\\x30\\\\x78\\\\x33\'\\);' + - 'const d *= *g\\(\'\\\\x30\\\\x78\\\\x34\'\\);' + - 'const e *= *g\\(\'\\\\x30\\\\x78\\\\x35\'\\);' + + 'const e *= *c;' + + 'const f *= *e\\(\'\\\\x30\\\\x78\\\\x33\'\\);' + + 'const g *= *e\\(\'\\\\x30\\\\x78\\\\x34\'\\);' + + 'const h *= *e\\(\'\\\\x30\\\\x78\\\\x35\'\\);' + '}' ); diff --git a/test/functional-tests/node-transformers/preparing-transformers/eval-call-expression-transformer/EvalCallExpressionTransformer.spec.ts b/test/functional-tests/node-transformers/preparing-transformers/eval-call-expression-transformer/EvalCallExpressionTransformer.spec.ts index bb427cf36..0032215d0 100644 --- a/test/functional-tests/node-transformers/preparing-transformers/eval-call-expression-transformer/EvalCallExpressionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/preparing-transformers/eval-call-expression-transformer/EvalCallExpressionTransformer.spec.ts @@ -320,14 +320,14 @@ describe('EvalCallExpressionTransformer', () => { const variableMatch: string = '_0x([a-f0-9]){4,6}'; const controlFlowStorageNodeMatch: string = `` + `var ${variableMatch} *= *\\{` + - `'${variableMatch}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + + `'\\w{5}' *: *function *\\(${variableMatch}, *${variableMatch}\\) *\\{` + `return *${variableMatch} *\\+ *${variableMatch};` + `\\}` + `\\};` + ``; const controlFlowStorageNodeRegExp: RegExp = new RegExp(controlFlowStorageNodeMatch); const evalExpressionRegExp: RegExp = new RegExp( - `eval *\\('${variableMatch}\\[\\\\'${variableMatch}\\\\']\\(${variableMatch}, *${variableMatch}\\);'\\);` + `eval *\\('${variableMatch}\\[\\\\'\\w{5}\\\\']\\(${variableMatch}, *${variableMatch}\\);'\\);` ); let obfuscatedCode: string; diff --git a/test/functional-tests/node-transformers/preparing-transformers/obfuscating-guards/conditional-comment-obfuscating-guard/ConditionalCommentObfuscatingGuard.spec.ts b/test/functional-tests/node-transformers/preparing-transformers/obfuscating-guards/conditional-comment-obfuscating-guard/ConditionalCommentObfuscatingGuard.spec.ts index 34b9863dd..56b32117e 100644 --- a/test/functional-tests/node-transformers/preparing-transformers/obfuscating-guards/conditional-comment-obfuscating-guard/ConditionalCommentObfuscatingGuard.spec.ts +++ b/test/functional-tests/node-transformers/preparing-transformers/obfuscating-guards/conditional-comment-obfuscating-guard/ConditionalCommentObfuscatingGuard.spec.ts @@ -209,7 +209,7 @@ describe('ConditionalCommentObfuscatingGuard', () => { }); describe('Variant #6: `disable` and `enable` conditional comments with control flow flattening', () => { - const obfuscatedVariableDeclarationRegExp: RegExp = /var _0x([a-f0-9]){5,6} *= *_0x([a-f0-9]){5,6}\['_0x([a-f0-9]){5,6}'];/; + const obfuscatedVariableDeclarationRegExp: RegExp = /var _0x([a-f0-9]){5,6} *= *_0x([a-f0-9]){5,6}\['\w{5}'];/; const ignoredVariableDeclarationRegExp: RegExp = /var bar *= *'bar';/; let obfuscatedCode: string; diff --git a/test/functional-tests/node-transformers/string-array-transformers/string-array-rotate-function-transformer/StringArrayRotateFunctionTransformer.spec.ts b/test/functional-tests/node-transformers/string-array-transformers/string-array-rotate-function-transformer/StringArrayRotateFunctionTransformer.spec.ts index f9d130719..e97592b02 100644 --- a/test/functional-tests/node-transformers/string-array-transformers/string-array-rotate-function-transformer/StringArrayRotateFunctionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/string-array-transformers/string-array-rotate-function-transformer/StringArrayRotateFunctionTransformer.spec.ts @@ -19,7 +19,7 @@ describe('StringArrayRotateFunctionTransformer', function () { this.timeout(120000); describe('Code helper append', () => { - const regExp: RegExp = /while *\(!!\[]\) *\{/; + const regExp: RegExp = /while *\(true\) *\{/; describe('`stringArray` option is set', () => { let obfuscatedCode: string; diff --git a/test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/StringArrayScopeCallsWrapperTransformer.spec.ts b/test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/StringArrayScopeCallsWrapperTransformer.spec.ts index 49b58313e..9f542d22f 100644 --- a/test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/StringArrayScopeCallsWrapperTransformer.spec.ts +++ b/test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/StringArrayScopeCallsWrapperTransformer.spec.ts @@ -82,11 +82,11 @@ describe('StringArrayScopeCallsWrapperTransformer', function () { describe('Variant #3: correct wrappers order', () => { const stringArrayCallRegExp: RegExp = new RegExp( - 'const f *= *b;.*' + - 'const g *= *b;.*' + - 'const foo *= *[f|g]\\(0x0\\);.*' + - 'const bar *= *[f|g]\\(0x1\\);.*' + - 'const baz *= *[f|g]\\(0x2\\);' + 'const c *= *b;.*' + + 'const d *= *b;.*' + + 'const foo *= *[c|d]\\(0x0\\);.*' + + 'const bar *= *[c|d]\\(0x1\\);.*' + + 'const baz *= *[c|d]\\(0x2\\);' ); let obfuscatedCode: string; @@ -113,11 +113,11 @@ describe('StringArrayScopeCallsWrapperTransformer', function () { describe('Variant #4: `identifiersPrefix` option is set', () => { const stringArrayCallRegExp: RegExp = new RegExp( + 'const foo_c *= *foo_b;.*' + 'const foo_d *= *foo_b;.*' + - 'const foo_e *= *foo_b;.*' + - 'const foo *= *foo_[d|e]\\(0x0\\);.*' + - 'const bar *= *foo_[d|e]\\(0x1\\);.*' + - 'const baz *= *foo_[d|e]\\(0x2\\);' + 'const foo *= *foo_[c|d]\\(0x0\\);.*' + + 'const bar *= *foo_[c|d]\\(0x1\\);.*' + + 'const baz *= *foo_[c|d]\\(0x2\\);' ); let obfuscatedCode: string; @@ -213,11 +213,11 @@ describe('StringArrayScopeCallsWrapperTransformer', function () { describe('Variant #3: correct wrappers order', () => { const stringArrayCallRegExp: RegExp = new RegExp( 'function test *\\( *\\) *{' + + 'const g *= *b;' + 'const h *= *b;' + - 'const i *= *b;' + - 'const c *= *[h|i]\\(0x3\\);' + - 'const d *= *[h|i]\\(0x4\\);' + - 'const e *= *[h|i]\\(0x5\\);' + + 'const i *= *[g|h]\\(0x3\\);' + + 'const j *= *[g|h]\\(0x4\\);' + + 'const k *= *[g|h]\\(0x5\\);' + '}' ); @@ -245,11 +245,11 @@ describe('StringArrayScopeCallsWrapperTransformer', function () { describe('Variant #4: correct wrapper for the function default parameter', () => { const stringArrayCallRegExp: RegExp = new RegExp( - 'const e *= *b;.*' + - 'const foo *= *e\\(0x0\\);.*' + - 'function test *\\(c *= *e\\(0x1\\)\\) *{' + + 'const c *= *b;.*' + + 'const foo *= *c\\(0x0\\);.*' + + 'function test *\\(e *= *c\\(0x1\\)\\) *{' + 'const f *= *b;' + - 'const d *= *f\\(0x2\\);' + + 'const g *= *f\\(0x2\\);' + '}' ); @@ -278,11 +278,11 @@ describe('StringArrayScopeCallsWrapperTransformer', function () { describe('Variant #5: `identifiersPrefix` option is set', () => { const stringArrayCallRegExp: RegExp = new RegExp( 'function test *\\( *\\) *{' + - 'const f *= *foo_b;' + - 'const g *= *foo_b;' + - 'const a *= *[f|g]\\(0x3\\);' + - 'const b *= *[f|g]\\(0x4\\);' + - 'const c *= *[f|g]\\(0x5\\);' + + 'const a *= *foo_b;' + + 'const b *= *foo_b;' + + 'const c *= *[a|b]\\(0x3\\);' + + 'const d *= *[a|b]\\(0x4\\);' + + 'const g *= *[a|b]\\(0x5\\);' + '}' ); @@ -430,25 +430,25 @@ describe('StringArrayScopeCallsWrapperTransformer', function () { describe('Variant #1: correct chained calls', () => { describe('Variant #1: `Mangled` identifier names generator', () => { const stringArrayCallRegExp: RegExp = new RegExp( - 'const q *= *b;.*' + - 'const foo *= *q\\(0x0\\);.*' + - 'function test\\(c, *d\\) *{' + - 'const r *= *q;' + - 'const e *= *r\\(0x1\\);' + - 'const f *= *r\\(0x2\\);' + - 'function g\\(h, *i\\) *{' + - 'const s *= *r;' + - 'const j *= *s\\(0x3\\);' + - 'const k *= *s\\(0x4\\);' + - 'function l\\(m, *n *\\) *{' + - 'const t *= *s;' + - 'const o *= *t\\(0x3\\);' + - 'const p *= *t\\(0x4\\);' + - 'return o *\\+ *p;' + + 'const c *= *b;.*' + + 'const foo *= *c\\(0x0\\);.*' + + 'function test\\(g, *h\\) *{' + + 'const i *= *c;' + + 'const j *= *i\\(0x1\\);' + + 'const k *= *i\\(0x2\\);' + + 'function l\\(m, *n\\) *{' + + 'const o *= *i;' + + 'const p *= *o\\(0x3\\);' + + 'const q *= *o\\(0x4\\);' + + 'function r\\(s, *t *\\) *{' + + 'const u *= *o;' + + 'const v *= *u\\(0x3\\);' + + 'const w *= *u\\(0x4\\);' + + 'return v *\\+ *w;' + '}' + - 'return j *\\+ *k;' + + 'return p *\\+ *q;' + '}' + - 'return e *\\+ *f *\\+ *g\\(\\);' + + 'return j *\\+ *k *\\+ *l\\(\\);' + '}' ); diff --git a/test/unit-tests/generators/identifier-names-generators/DictionarylIdentifierNamesGenerator.spec.ts b/test/unit-tests/generators/identifier-names-generators/DictionarylIdentifierNamesGenerator.spec.ts index 9995f1641..69a362119 100644 --- a/test/unit-tests/generators/identifier-names-generators/DictionarylIdentifierNamesGenerator.spec.ts +++ b/test/unit-tests/generators/identifier-names-generators/DictionarylIdentifierNamesGenerator.spec.ts @@ -224,4 +224,39 @@ describe('DictionaryIdentifierNamesGenerator', () => { }); }); }); + + describe('generateForLabel', () => { + const label1: string = 'label1'; + const label2: string = 'label2'; + + const dictionaryNames1: string[] = []; + const dictionaryNames2: string[] = []; + + let identifierNamesGenerator: IIdentifierNamesGenerator; + + before(() => { + const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade(); + + inversifyContainerFacade.load('', '', { + identifiersPrefix: 'foo', + identifiersDictionary: ['a', 'b', 'c'] + }); + identifierNamesGenerator = inversifyContainerFacade.getNamed( + ServiceIdentifiers.IIdentifierNamesGenerator, + IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator + ); + + dictionaryNames1.push(identifierNamesGenerator.generateForLabel(label1)); + dictionaryNames1.push(identifierNamesGenerator.generateForLabel(label1)); + dictionaryNames1.push(identifierNamesGenerator.generateForLabel(label1)); + + dictionaryNames2.push(identifierNamesGenerator.generateForLabel(label2)); + dictionaryNames2.push(identifierNamesGenerator.generateForLabel(label2)); + dictionaryNames2.push(identifierNamesGenerator.generateForLabel(label2)); + }); + + it('should return different dictionary names for different labels', () => { + assert.notDeepEqual(dictionaryNames1, dictionaryNames2); + }); + }); }); diff --git a/test/unit-tests/generators/identifier-names-generators/HexadecimalIdentifierNamesGenerator.spec.ts b/test/unit-tests/generators/identifier-names-generators/HexadecimalIdentifierNamesGenerator.spec.ts index 665926d5b..3800b7716 100644 --- a/test/unit-tests/generators/identifier-names-generators/HexadecimalIdentifierNamesGenerator.spec.ts +++ b/test/unit-tests/generators/identifier-names-generators/HexadecimalIdentifierNamesGenerator.spec.ts @@ -84,4 +84,46 @@ describe('HexadecimalIdentifierNamesGenerator', () => { assert.match(hexadecimalIdentifierName, regExp); }) }); + + describe('generateForLabel', () => { + const label1: string = 'label1'; + const label2: string = 'label2'; + const regExp: RegExp = /^_0x(\w){4,6}$/; + + let identifierNamesGenerator: IIdentifierNamesGenerator, + hexadecimalIdentifierName1: string, + hexadecimalIdentifierName2: string; + + before(() => { + const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade(); + + inversifyContainerFacade.load('', '', { + identifiersPrefix: 'foo' + }); + identifierNamesGenerator = inversifyContainerFacade.getNamed( + ServiceIdentifiers.IIdentifierNamesGenerator, + IdentifierNamesGenerator.HexadecimalIdentifierNamesGenerator + ); + + identifierNamesGenerator.generateForLabel(label1) + identifierNamesGenerator.generateForLabel(label1) + hexadecimalIdentifierName1 = identifierNamesGenerator.generateForLabel(label1); + + identifierNamesGenerator.generateForLabel(label2) + identifierNamesGenerator.generateForLabel(label2) + hexadecimalIdentifierName2 = identifierNamesGenerator.generateForLabel(label2); + }); + + it('should return valid hexadecimal name 1', () => { + assert.match(hexadecimalIdentifierName1, regExp); + }) + + it('should return valid hexadecimal name 2', () => { + assert.match(hexadecimalIdentifierName2, regExp); + }) + + it('should generate different hexadecimal names for different labels', () => { + assert.notEqual(hexadecimalIdentifierName1, hexadecimalIdentifierName2); + }) + }); }); diff --git a/test/unit-tests/generators/identifier-names-generators/MangledShuffledlIdentifierNamesGenerator.spec.ts b/test/unit-tests/generators/identifier-names-generators/MangledShuffledlIdentifierNamesGenerator.spec.ts index c5ca688c1..da739b3e9 100644 --- a/test/unit-tests/generators/identifier-names-generators/MangledShuffledlIdentifierNamesGenerator.spec.ts +++ b/test/unit-tests/generators/identifier-names-generators/MangledShuffledlIdentifierNamesGenerator.spec.ts @@ -114,6 +114,40 @@ describe('MangledShuffledIdentifierNamesGenerator', () => { }); }); + describe('generateForLabel', () => { + const label1: string = 'label1'; + const label2: string = 'label2'; + + const mangledNames1: string[] = []; + const mangledNames2: string[] = []; + + let identifierNamesGenerator: IIdentifierNamesGenerator; + + before(() => { + const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade(); + + inversifyContainerFacade.load('', '', { + identifiersPrefix: 'foo' + }); + identifierNamesGenerator = inversifyContainerFacade.getNamed( + ServiceIdentifiers.IIdentifierNamesGenerator, + IdentifierNamesGenerator.MangledShuffledIdentifierNamesGenerator + ); + + mangledNames1.push(identifierNamesGenerator.generateForLabel(label1)); + mangledNames1.push(identifierNamesGenerator.generateForLabel(label1)); + mangledNames1.push(identifierNamesGenerator.generateForLabel(label1)); + + mangledNames2.push(identifierNamesGenerator.generateForLabel(label2)); + mangledNames2.push(identifierNamesGenerator.generateForLabel(label2)); + mangledNames2.push(identifierNamesGenerator.generateForLabel(label2)); + }); + + it('should return the same mangled names set for different labels', () => { + assert.deepEqual(mangledNames1, mangledNames2); + }) + }); + describe('isIncrementedMangledName', function () { this.timeout(60000); diff --git a/test/unit-tests/generators/identifier-names-generators/MangledlIdentifierNamesGenerator.spec.ts b/test/unit-tests/generators/identifier-names-generators/MangledlIdentifierNamesGenerator.spec.ts index 808344028..ab536a446 100644 --- a/test/unit-tests/generators/identifier-names-generators/MangledlIdentifierNamesGenerator.spec.ts +++ b/test/unit-tests/generators/identifier-names-generators/MangledlIdentifierNamesGenerator.spec.ts @@ -171,6 +171,46 @@ describe('MangledIdentifierNamesGenerator', () => { }); }); + describe('generateForLabel', () => { + const label1: string = 'label1'; + const label2: string = 'label2'; + + const mangledNames1: string[] = []; + const mangledNames2: string[] = []; + + const expectedMangledNames1: string[] = ['a', 'b', 'c'] + const expectedMangledNames2: string[] = ['a', 'b'] + + let identifierNamesGenerator: IIdentifierNamesGenerator; + + before(() => { + const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade(); + + inversifyContainerFacade.load('', '', { + identifiersPrefix: 'foo' + }); + identifierNamesGenerator = inversifyContainerFacade.getNamed( + ServiceIdentifiers.IIdentifierNamesGenerator, + IdentifierNamesGenerator.MangledIdentifierNamesGenerator + ); + + mangledNames1.push(identifierNamesGenerator.generateForLabel(label1)); + mangledNames1.push(identifierNamesGenerator.generateForLabel(label1)); + mangledNames1.push(identifierNamesGenerator.generateForLabel(label1)); + + mangledNames2.push(identifierNamesGenerator.generateForLabel(label2)); + mangledNames2.push(identifierNamesGenerator.generateForLabel(label2)); + }); + + it('should return valid mangled names for label 1', () => { + assert.deepEqual(mangledNames1, expectedMangledNames1); + }) + + it('should return valid mangled names for label 2', () => { + assert.deepEqual(mangledNames2, expectedMangledNames2); + }) + }); + describe('isIncrementedMangledName', function () { this.timeout(60000); From d75494bdc5dac8e595771541c4cf7c70332f8a9f Mon Sep 17 00:00:00 2001 From: sanex Date: Wed, 2 Feb 2022 12:54:13 +0300 Subject: [PATCH 05/14] String Control Flow Flattening WIP --- src/JavaScriptObfuscator.ts | 2 +- src/container/ServiceIdentifiers.ts | 3 +- .../modules/storages/StoragesModule.ts | 57 +++++---- src/container/modules/utils/UtilsModule.ts | 7 ++ .../ControlFlowStorageNode.ts | 10 +- src/enums/storages/ControlFlowStorage.ts | 4 + .../AbstractIdentifierNamesGenerator.ts | 38 ------ .../DictionaryIdentifierNamesGenerator.ts | 39 +++--- .../MangledIdentifierNamesGenerator.ts | 114 ++++++++++++------ ...MangledShuffledIdentifierNamesGenerator.ts | 15 +-- .../IIdentifierNamesGenerator.ts | 13 -- .../IControlFlowReplacer.ts | 8 +- .../IControlFlowStorage.ts | 5 + src/interfaces/utils/ISetUtils.ts | 7 ++ .../FunctionControlFlowTransformer.ts | 46 ++++--- .../StringArrayControlFlowTransformer.ts | 19 +-- .../AbstractControlFlowReplacer.ts | 14 +-- .../BinaryExpressionControlFlowReplacer.ts | 6 +- .../CallExpressionControlFlowReplacer.ts | 6 +- .../LogicalExpressionControlFlowReplacer.ts | 6 +- .../StringArrayCallControlFlowReplacer.ts | 10 +- .../StringLiteralControlFlowReplacer.ts | 6 +- .../StringArrayRotateFunctionTransformer.ts | 84 ++++++++++--- .../FunctionControlFlowStorage.ts | 38 ++++++ .../StringControlFlowStorage.ts | 33 +++++ .../custom-nodes/ControlFlowStorage.ts | 23 ---- .../TControlFlowStorageFactory.ts | 4 +- .../TControlFlowStorageFactoryCreator.ts | 5 + src/types/storages/TControlFlowStorage.ts | 4 - src/utils/SetUtils.ts | 32 +++++ test/dev/dev.ts | 2 +- ...tringArrayRotateFunctionCodeHelper.spec.ts | 6 +- .../EscapeSequenceTransformer.spec.ts | 16 +-- ...ringArrayRotateFunctionTransformer.spec.ts | 2 +- ...gArrayScopeCallsWrapperTransformer.spec.ts | 78 ++++++------ test/index.spec.ts | 1 + .../JavaScriptObfuscatorRuntime.spec.ts | 8 +- test/unit-tests/utils/SetUtils.spec.ts | 87 +++++++++++++ 38 files changed, 549 insertions(+), 309 deletions(-) create mode 100644 src/enums/storages/ControlFlowStorage.ts create mode 100644 src/interfaces/storages/control-flow-transformers/IControlFlowStorage.ts create mode 100644 src/interfaces/utils/ISetUtils.ts create mode 100644 src/storages/control-flow-transformers/FunctionControlFlowStorage.ts create mode 100644 src/storages/control-flow-transformers/StringControlFlowStorage.ts delete mode 100644 src/storages/custom-nodes/ControlFlowStorage.ts create mode 100644 src/types/container/node-transformers/TControlFlowStorageFactoryCreator.ts delete mode 100644 src/types/storages/TControlFlowStorage.ts create mode 100644 src/utils/SetUtils.ts create mode 100644 test/unit-tests/utils/SetUtils.spec.ts diff --git a/src/JavaScriptObfuscator.ts b/src/JavaScriptObfuscator.ts index 255e7d1c0..4728c05a3 100644 --- a/src/JavaScriptObfuscator.ts +++ b/src/JavaScriptObfuscator.ts @@ -228,8 +228,8 @@ export class JavaScriptObfuscator implements IJavaScriptObfuscator { } astTree = this.runNodeTransformationStage(astTree, NodeTransformationStage.Converting); - astTree = this.runNodeTransformationStage(astTree, NodeTransformationStage.StringArray); astTree = this.runNodeTransformationStage(astTree, NodeTransformationStage.RenameIdentifiers); + astTree = this.runNodeTransformationStage(astTree, NodeTransformationStage.StringArray); if (this.options.simplify) { astTree = this.runNodeTransformationStage(astTree, NodeTransformationStage.Simplifying); diff --git a/src/container/ServiceIdentifiers.ts b/src/container/ServiceIdentifiers.ts index 041e75af8..c1d3569cb 100644 --- a/src/container/ServiceIdentifiers.ts +++ b/src/container/ServiceIdentifiers.ts @@ -21,6 +21,7 @@ export enum ServiceIdentifiers { ICodeTransformer = 'ICodeTransformer', ICodeTransformerNamesGroupsBuilder = 'ICodeTransformerNamesGroupsBuilder', ICodeTransformersRunner = 'ICodeTransformersRunner', + IControlFlowStorage = 'IControlFlowStorage', ICryptUtils = 'ICryptUtils', ICryptUtilsStringArray = 'ICryptUtilsStringArray', ICustomCodeHelper = 'ICustomCodeHelper', @@ -50,6 +51,7 @@ export enum ServiceIdentifiers { IRandomGenerator = 'IRandomGenerator', IRenamePropertiesReplacer = 'IRenamePropertiesReplacer', IScopeIdentifiersTraverser = 'IScopeIdentifiersTraverser', + ISetUtils = 'ISetUtils', ISourceCode = 'ISourceCode', IScopeAnalyzer = 'IScopeAnalyzer', IStringArrayIndexNode = 'IStringArrayIndexNode', @@ -59,7 +61,6 @@ export enum ServiceIdentifiers { IThroughIdentifierReplacer = 'IThroughIdentifierReplacer', IVisitedLexicalScopeNodesStackStorage = 'IVisitedLexicalScopeNodesStackStorage', Newable__ICustomNode = 'Newable', - Newable__TControlFlowStorage = 'Newable', TCustomNodeGroupStorage = 'TCustomNodeGroupStorage', TInputOptions = 'TInputOptions' } diff --git a/src/container/modules/storages/StoragesModule.ts b/src/container/modules/storages/StoragesModule.ts index 58fb5011a..52bc65055 100644 --- a/src/container/modules/storages/StoragesModule.ts +++ b/src/container/modules/storages/StoragesModule.ts @@ -1,25 +1,31 @@ import { ContainerModule, interfaces } from 'inversify'; import { ServiceIdentifiers } from '../../ServiceIdentifiers'; -import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; -import { TConstructor } from '../../../types/TConstructor'; +import { TControlFlowStorageFactory } from '../../../types/container/node-transformers/TControlFlowStorageFactory'; +import { + TControlFlowStorageFactoryCreator +} from '../../../types/container/node-transformers/TControlFlowStorageFactoryCreator'; import { TCustomCodeHelperGroupStorage } from '../../../types/storages/TCustomCodeHelperGroupStorage'; +import { IControlFlowStorage } from '../../../interfaces/storages/control-flow-transformers/IControlFlowStorage'; import { IGlobalIdentifierNamesCacheStorage } from '../../../interfaces/storages/identifier-names-cache/IGlobalIdentifierNamesCacheStorage'; import { ILiteralNodesCacheStorage } from '../../../interfaces/storages/string-array-transformers/ILiteralNodesCacheStorage'; -import { IOptions } from '../../../interfaces/options/IOptions'; import { IPropertyIdentifierNamesCacheStorage } from '../../../interfaces/storages/identifier-names-cache/IPropertyIdentifierNamesCacheStorage'; -import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator'; import { IStringArrayScopeCallsWrappersDataStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage'; import { IStringArrayStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayStorage'; import { IVisitedLexicalScopeNodesStackStorage } from '../../../interfaces/storages/string-array-transformers/IVisitedLexicalScopeNodesStackStorage'; -import { ControlFlowStorage } from '../../../storages/custom-nodes/ControlFlowStorage'; +import { ControlFlowStorage } from '../../../enums/storages/ControlFlowStorage'; + import { CustomCodeHelperGroupStorage } from '../../../storages/custom-code-helpers/CustomCodeHelperGroupStorage'; +import { FunctionControlFlowStorage } from '../../../storages/control-flow-transformers/FunctionControlFlowStorage'; import { GlobalIdentifierNamesCacheStorage } from '../../../storages/identifier-names-cache/GlobalIdentifierNamesCacheStorage'; import { LiteralNodesCacheStorage } from '../../../storages/string-array-transformers/LiteralNodesCacheStorage'; import { PropertyIdentifierNamesCacheStorage } from '../../../storages/identifier-names-cache/PropertyIdentifierNamesCacheStorage'; import { StringArrayScopeCallsWrappersDataStorage } from '../../../storages/string-array-transformers/StringArrayScopeCallsWrappersDataStorage'; +import { + StringControlFlowStorage +} from '../../../storages/control-flow-transformers/StringControlFlowStorage'; import { StringArrayStorage } from '../../../storages/string-array-transformers/StringArrayStorage'; import { VisitedLexicalScopeNodesStackStorage } from '../../../storages/string-array-transformers/VisitedLexicalScopeNodesStackStorage'; @@ -29,6 +35,10 @@ export const storagesModule: interfaces.ContainerModule = new ContainerModule((b .to(CustomCodeHelperGroupStorage) .inSingletonScope(); + bind(ServiceIdentifiers.IControlFlowStorage) + .to(FunctionControlFlowStorage) + .whenTargetNamed(ControlFlowStorage.FunctionControlFlowStorage); + bind(ServiceIdentifiers.IGlobalIdentifierNamesCacheStorage) .to(GlobalIdentifierNamesCacheStorage) .inSingletonScope(); @@ -49,34 +59,21 @@ export const storagesModule: interfaces.ContainerModule = new ContainerModule((b .to(StringArrayScopeCallsWrappersDataStorage) .inSingletonScope(); + bind(ServiceIdentifiers.IControlFlowStorage) + .to(StringControlFlowStorage) + .whenTargetNamed(ControlFlowStorage.StringControlFlowStorage); + bind(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage) .to(VisitedLexicalScopeNodesStackStorage) .inSingletonScope(); - bind>(ServiceIdentifiers.Newable__TControlFlowStorage) - .toConstructor(ControlFlowStorage); - // controlFlowStorage factory - bind(ServiceIdentifiers.Factory__TControlFlowStorage) - .toFactory((context: interfaces.Context) => { - return (): TControlFlowStorage => { - const constructor = context.container - .get>( - ServiceIdentifiers.Newable__TControlFlowStorage - ); - const randomGenerator: IRandomGenerator = context.container - .get(ServiceIdentifiers.IRandomGenerator); - const options: IOptions = context.container - .get(ServiceIdentifiers.IOptions); - - const storage: TControlFlowStorage = new constructor( - randomGenerator, - options - ); - - storage.initialize(); - - return storage; - }; - }); + bind(ServiceIdentifiers.Factory__TControlFlowStorage) + .toFactory((context: interfaces.Context): TControlFlowStorageFactoryCreator => + (controlFlowStorageName: ControlFlowStorage): TControlFlowStorageFactory => (): IControlFlowStorage => + context.container.getNamed( + ServiceIdentifiers.IControlFlowStorage, + controlFlowStorageName + ) + ); }); diff --git a/src/container/modules/utils/UtilsModule.ts b/src/container/modules/utils/UtilsModule.ts index b83e83f36..8ec11832a 100644 --- a/src/container/modules/utils/UtilsModule.ts +++ b/src/container/modules/utils/UtilsModule.ts @@ -7,6 +7,7 @@ import { ICryptUtilsStringArray } from '../../../interfaces/utils/ICryptUtilsStr import { IEscapeSequenceEncoder } from '../../../interfaces/utils/IEscapeSequenceEncoder'; import { ILevelledTopologicalSorter } from '../../../interfaces/utils/ILevelledTopologicalSorter'; import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator'; +import { ISetUtils } from '../../../interfaces/utils/ISetUtils'; import { ArrayUtils } from '../../../utils/ArrayUtils'; import { CryptUtils } from '../../../utils/CryptUtils'; @@ -14,6 +15,7 @@ import { CryptUtilsStringArray } from '../../../utils/CryptUtilsStringArray'; import { EscapeSequenceEncoder } from '../../../utils/EscapeSequenceEncoder'; import { LevelledTopologicalSorter } from '../../../utils/LevelledTopologicalSorter'; import { RandomGenerator } from '../../../utils/RandomGenerator'; +import { SetUtils } from '../../../utils/SetUtils'; export const utilsModule: interfaces.ContainerModule = new ContainerModule((bind: interfaces.Bind) => { // array utils @@ -44,4 +46,9 @@ export const utilsModule: interfaces.ContainerModule = new ContainerModule((bind // levelled topological sorter bind(ServiceIdentifiers.ILevelledTopologicalSorter) .to(LevelledTopologicalSorter); + + // set utils + bind(ServiceIdentifiers.ISetUtils) + .to(SetUtils) + .inSingletonScope(); }); diff --git a/src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ControlFlowStorageNode.ts b/src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ControlFlowStorageNode.ts index a8ddf5fd9..8db3102df 100644 --- a/src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ControlFlowStorageNode.ts +++ b/src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ControlFlowStorageNode.ts @@ -3,10 +3,10 @@ import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers'; import * as ESTree from 'estree'; -import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TStatement } from '../../../types/node/TStatement'; +import { IControlFlowStorage } from '../../../interfaces/storages/control-flow-transformers/IControlFlowStorage'; import { ICustomCodeHelperFormatter } from '../../../interfaces/custom-code-helpers/ICustomCodeHelperFormatter'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../../../interfaces/options/IOptions'; @@ -21,10 +21,10 @@ import { NodeGuards } from '../../../node/NodeGuards'; @injectable() export class ControlFlowStorageNode extends AbstractCustomNode { /** - * @type {TControlFlowStorage} + * @type {IControlFlowStorage} */ @initializable() - private controlFlowStorage!: TControlFlowStorage; + private controlFlowStorage!: IControlFlowStorage; /** * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory @@ -48,9 +48,9 @@ export class ControlFlowStorageNode extends AbstractCustomNode { } /** - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage */ - public initialize (controlFlowStorage: TControlFlowStorage): void { + public initialize (controlFlowStorage: IControlFlowStorage): void { this.controlFlowStorage = controlFlowStorage; } diff --git a/src/enums/storages/ControlFlowStorage.ts b/src/enums/storages/ControlFlowStorage.ts new file mode 100644 index 000000000..a563b0ff5 --- /dev/null +++ b/src/enums/storages/ControlFlowStorage.ts @@ -0,0 +1,4 @@ +export enum ControlFlowStorage { + FunctionControlFlowStorage = 'function-control-flow-storage', + StringControlFlowStorage = 'string-control-flow-storage' +} diff --git a/src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts b/src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts index 8c9ffed13..5dc970709 100644 --- a/src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts +++ b/src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts @@ -31,11 +31,6 @@ export abstract class AbstractIdentifierNamesGenerator implements IIdentifierNam */ protected readonly lexicalScopesPreservedNamesMap: WeakMap> = new WeakMap(); - /** - * @type {Map>} - */ - protected readonly labelsPreservedNamesMap: Map> = new Map(); - /** * @param {IRandomGenerator} randomGenerator * @param {IOptions} options @@ -79,19 +74,6 @@ export abstract class AbstractIdentifierNamesGenerator implements IIdentifierNam this.lexicalScopesPreservedNamesMap.set(lexicalScopeNode, preservedNamesForLexicalScopeSet); } - /** - * @param {string} name - * @param {string} label - */ - public preserveNameForLabel (name: string, label: string): void { - const preservedNamesForLexicalScopeSet: Set = - this.labelsPreservedNamesMap.get(label) ?? new Set(); - - preservedNamesForLexicalScopeSet.add(name); - - this.labelsPreservedNamesMap.set(label, preservedNamesForLexicalScopeSet); - } - /** * @param {string} name * @returns {boolean} @@ -126,26 +108,6 @@ export abstract class AbstractIdentifierNamesGenerator implements IIdentifierNam return true; } - /** - * @param {string} name - * @param {string} label - * @returns {boolean} - */ - public isValidIdentifierNameForLabel (name: string, label: string): boolean { - if (!this.isValidIdentifierName(name)) { - return false; - } - - const preservedNamesForLexicalScopeSet: Set | null = - this.labelsPreservedNamesMap.get(label) ?? null; - - if (!preservedNamesForLexicalScopeSet) { - return true; - } - - return !preservedNamesForLexicalScopeSet.has(name); - } - /** * @param {string} name * @returns {boolean} diff --git a/src/generators/identifier-names-generators/DictionaryIdentifierNamesGenerator.ts b/src/generators/identifier-names-generators/DictionaryIdentifierNamesGenerator.ts index 65c1325f8..e0e62101e 100644 --- a/src/generators/identifier-names-generators/DictionaryIdentifierNamesGenerator.ts +++ b/src/generators/identifier-names-generators/DictionaryIdentifierNamesGenerator.ts @@ -84,12 +84,13 @@ export class DictionaryIdentifierNamesGenerator extends AbstractIdentifierNamesG const prefix: string = this.options.identifiersPrefix ? `${this.options.identifiersPrefix}` : ''; - const identifierName: string = this.generateNewDictionaryName(); - const identifierNameWithPrefix: string = `${prefix}${identifierName}`; - if (!this.isValidIdentifierName(identifierNameWithPrefix)) { - return this.generateForGlobalScope(); - } + const identifierName: string = this.generateNewDictionaryName((newIdentifierName: string) => { + const identifierNameWithPrefix: string = `${prefix}${newIdentifierName}`; + + return this.isValidIdentifierName(identifierNameWithPrefix); + }); + const identifierNameWithPrefix = `${prefix}${identifierName}`; this.preserveName(identifierNameWithPrefix); @@ -105,11 +106,9 @@ export class DictionaryIdentifierNamesGenerator extends AbstractIdentifierNamesG lexicalScopeNode, ...NodeLexicalScopeUtils.getLexicalScopes(lexicalScopeNode) ]; - const identifierName: string = this.generateNewDictionaryName(); - - if (!this.isValidIdentifierNameInLexicalScopes(identifierName, lexicalScopes)) { - return this.generateForLexicalScope(lexicalScopeNode); - } + const identifierName: string = this.generateNewDictionaryName((newIdentifierName: string) => + this.isValidIdentifierNameInLexicalScopes(newIdentifierName, lexicalScopes) + ); this.preserveNameForLexicalScope(identifierName, lexicalScopeNode); @@ -121,21 +120,14 @@ export class DictionaryIdentifierNamesGenerator extends AbstractIdentifierNamesG * @returns {string} */ public generateForLabel (label: string): string { - const identifierName: string = this.generateNewDictionaryName(); - - if (!this.isValidIdentifierNameForLabel(identifierName, label)) { - return this.generateForLabel(label); - } - - this.preserveNameForLabel(identifierName, label); - - return identifierName; + return this.generateNewDictionaryName(); } /** + * @param {(newIdentifierName: string) => boolean} validationFunction * @returns {string} */ - private generateNewDictionaryName (): string { + private generateNewDictionaryName (validationFunction?: (newIdentifierName: string) => boolean): string { if (!this.identifierNamesSet.size) { throw new Error('Too many identifiers in the code, add more words to identifiers dictionary'); } @@ -143,9 +135,12 @@ export class DictionaryIdentifierNamesGenerator extends AbstractIdentifierNamesG const iteratorResult: IteratorResult = this.identifiersIterator.next(); if (!iteratorResult.done) { - const identifierName: string =iteratorResult.value; + const identifierName: string = iteratorResult.value; + + const isValidIdentifierName = validationFunction?.(identifierName) + ?? this.isValidIdentifierName(identifierName); - if (!this.isValidIdentifierName(identifierName)) { + if (!isValidIdentifierName) { return this.generateNewDictionaryName(); } diff --git a/src/generators/identifier-names-generators/MangledIdentifierNamesGenerator.ts b/src/generators/identifier-names-generators/MangledIdentifierNamesGenerator.ts index 7c794eca7..c38d403dc 100644 --- a/src/generators/identifier-names-generators/MangledIdentifierNamesGenerator.ts +++ b/src/generators/identifier-names-generators/MangledIdentifierNamesGenerator.ts @@ -5,6 +5,7 @@ import { TNodeWithLexicalScope } from '../../types/node/TNodeWithLexicalScope'; import { IOptions } from '../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; +import { ISetUtils } from '../../interfaces/utils/ISetUtils'; import { numbersString } from '../../constants/NumbersString'; import { alphabetString } from '../../constants/AlphabetString'; @@ -15,6 +16,11 @@ import { NodeLexicalScopeUtils } from '../../node/NodeLexicalScopeUtils'; @injectable() export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGenerator { + /** + * @type {number} + */ + private static readonly maxRegenerationAttempts: number = 20; + /** * @type {string} */ @@ -25,11 +31,6 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene */ private static readonly lastMangledNameInScopeMap: WeakMap = new WeakMap(); - /** - * @type {WeakMap} - */ - private static readonly lastMangledNameForLabelMap: Map = new Map(); - /** * @type {string[]} */ @@ -48,20 +49,34 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene 'var', 'void', 'with' ]); + /** + * @type {WeakMap} + */ + private readonly lastMangledNameForLabelMap: Map = new Map(); + /** * @type {string} */ private previousMangledName: string = MangledIdentifierNamesGenerator.initMangledNameCharacter; + /** + * @type {ISetUtils} + */ + private readonly setUtils: ISetUtils; + /** * @param {IRandomGenerator} randomGenerator * @param {IOptions} options + * @param {ISetUtils} setUtils */ public constructor ( @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, - @inject(ServiceIdentifiers.IOptions) options: IOptions + @inject(ServiceIdentifiers.IOptions) options: IOptions, + @inject(ServiceIdentifiers.ISetUtils) setUtils: ISetUtils, ) { super(randomGenerator, options); + + this.setUtils = setUtils; } /** @@ -88,15 +103,18 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene const prefix: string = this.options.identifiersPrefix ? `${this.options.identifiersPrefix}` : ''; - const identifierName: string = this.generateNewMangledName(this.previousMangledName); - const identifierNameWithPrefix: string = `${prefix}${identifierName}`; - this.updatePreviousMangledName(identifierName); + const identifierName: string = this.generateNewMangledName( + this.previousMangledName, + (newIdentifierName: string) => { + const identifierNameWithPrefix: string = `${prefix}${newIdentifierName}`; - if (!this.isValidIdentifierName(identifierNameWithPrefix)) { - return this.generateForGlobalScope(nameLength); - } + return this.isValidIdentifierName(identifierNameWithPrefix); + } + ); + const identifierNameWithPrefix: string = `${prefix}${identifierName}`; + this.updatePreviousMangledName(identifierName); this.preserveName(identifierNameWithPrefix); return identifierNameWithPrefix; @@ -114,12 +132,11 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene ]; const lastMangledNameForScope: string = this.getLastMangledNameForScopes(lexicalScopes); - - let identifierName: string = lastMangledNameForScope; - - do { - identifierName = this.generateNewMangledName(identifierName); - } while (!this.isValidIdentifierNameInLexicalScopes(identifierName, lexicalScopes)); + const identifierName: string = this.generateNewMangledName( + lastMangledNameForScope, + (newIdentifierName: string) => + this.isValidIdentifierNameInLexicalScopes(newIdentifierName, lexicalScopes) + ); MangledIdentifierNamesGenerator.lastMangledNameInScopeMap.set(lexicalScopeNode, identifierName); @@ -137,16 +154,9 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene public generateForLabel (label: string, nameLength?: number): string { const lastMangledNameForLabel: string = this.getLastMangledNameForLabel(label); - let identifierName: string = lastMangledNameForLabel; + const identifierName: string = this.generateNewMangledName(lastMangledNameForLabel); - do { - identifierName = this.generateNewMangledName(identifierName); - } while (!this.isValidIdentifierNameForLabel(identifierName, label)); - - MangledIdentifierNamesGenerator.lastMangledNameForLabelMap.set(label, identifierName); - - this.updatePreviousMangledName(identifierName); - this.preserveNameForLabel(identifierName, label); + this.updatePreviousMangledNameForLabel(identifierName, label, lastMangledNameForLabel); return identifierName; } @@ -215,12 +225,42 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene this.previousMangledName = name; } + /** + * @param {string} name + * @param {string} label + * @param {string} lastMangledNameForLabel + */ + protected updatePreviousMangledNameForLabel (name: string, label: string, lastMangledNameForLabel: string): void { + if (!this.isIncrementedMangledName(name, lastMangledNameForLabel)) { + return; + } + + this.lastMangledNameForLabelMap.set(label, name); + } + /** * @param {string} previousMangledName + * @param {(newIdentifierName: string) => boolean} validationFunction * @returns {string} */ - protected generateNewMangledName (previousMangledName: string): string { - const generateNewMangledName: (name: string) => string = (name: string): string => { + protected generateNewMangledName ( + previousMangledName: string, + validationFunction?: (newIdentifierName: string) => boolean + ): string { + const generateNewMangledName = (name: string, regenerationAttempt: number = 0): string => { + /** + * Attempt to decrease amount of regeneration tries because of large preserved names set + * When we reached the limit, we're trying to generate next mangled name based on the latest + * preserved name + */ + if (regenerationAttempt > MangledIdentifierNamesGenerator.maxRegenerationAttempts) { + const lastPreservedName = this.setUtils.getLastElement(this.preservedNamesSet); + + if (lastPreservedName) { + return this.generateNewMangledName(lastPreservedName); + } + } + const nameSequence: string[] = this.getNameSequence(); const nameSequenceLength: number = nameSequence.length; const nameLength: number = name.length; @@ -253,13 +293,16 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene return `${firstLetterCharacter}${zeroSequence(nameLength)}`; }; - let newMangledName: string = generateNewMangledName(previousMangledName); + let identifierName: string = previousMangledName; + let isValidIdentifierName: boolean; - if (!this.isValidIdentifierName(newMangledName)) { - newMangledName = this.generateNewMangledName(newMangledName); - } + do { + identifierName = generateNewMangledName(identifierName); + isValidIdentifierName = validationFunction?.(identifierName) + ?? this.isValidIdentifierName(identifierName); + } while (!isValidIdentifierName); - return newMangledName; + return identifierName; } /** @@ -286,8 +329,7 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene * @returns {string} */ private getLastMangledNameForLabel (label: string): string { - const lastMangledName: string | null = MangledIdentifierNamesGenerator.lastMangledNameForLabelMap - .get(label) ?? null; + const lastMangledName: string | null = this.lastMangledNameForLabelMap.get(label) ?? null; return lastMangledName ?? MangledIdentifierNamesGenerator.initMangledNameCharacter; } diff --git a/src/generators/identifier-names-generators/MangledShuffledIdentifierNamesGenerator.ts b/src/generators/identifier-names-generators/MangledShuffledIdentifierNamesGenerator.ts index eeef9b346..aeeaf5928 100644 --- a/src/generators/identifier-names-generators/MangledShuffledIdentifierNamesGenerator.ts +++ b/src/generators/identifier-names-generators/MangledShuffledIdentifierNamesGenerator.ts @@ -4,6 +4,7 @@ import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; import { IArrayUtils } from '../../interfaces/utils/IArrayUtils'; import { IOptions } from '../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; +import { ISetUtils } from '../../interfaces/utils/ISetUtils'; import { numbersString } from '../../constants/NumbersString'; import { alphabetString } from '../../constants/AlphabetString'; @@ -27,13 +28,15 @@ export class MangledShuffledIdentifierNamesGenerator extends MangledIdentifierNa * @param {IArrayUtils} arrayUtils * @param {IRandomGenerator} randomGenerator * @param {IOptions} options + * @param {ISetUtils} setUtils */ public constructor ( @inject(ServiceIdentifiers.IArrayUtils) arrayUtils: IArrayUtils, @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, - @inject(ServiceIdentifiers.IOptions) options: IOptions + @inject(ServiceIdentifiers.IOptions) options: IOptions, + @inject(ServiceIdentifiers.ISetUtils) setUtils: ISetUtils ) { - super(randomGenerator, options); + super(randomGenerator, options, setUtils); this.arrayUtils = arrayUtils; } @@ -61,12 +64,4 @@ export class MangledShuffledIdentifierNamesGenerator extends MangledIdentifierNa protected override getNameSequence (): string[] { return MangledShuffledIdentifierNamesGenerator.shuffledNameSequence; } - - /** - * @param {string} previousMangledName - * @returns {string} - */ - protected override generateNewMangledName (previousMangledName: string): string { - return super.generateNewMangledName(previousMangledName); - } } diff --git a/src/interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator.ts b/src/interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator.ts index 01c06b3cf..f0d2f8974 100644 --- a/src/interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator.ts +++ b/src/interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator.ts @@ -47,13 +47,6 @@ export interface IIdentifierNamesGenerator { */ isValidIdentifierNameInLexicalScopes (identifierName: string, lexicalScopeNodes: TNodeWithLexicalScope[]): boolean; - /** - * @param {string} identifierName - * @param {string} label - * @returns {boolean} - */ - isValidIdentifierNameForLabel (identifierName: string, label: string): boolean; - /** * @param {string} identifierName */ @@ -64,10 +57,4 @@ export interface IIdentifierNamesGenerator { * @param {TNodeWithLexicalScope} lexicalScope */ preserveNameForLexicalScope (identifierName: string, lexicalScope: TNodeWithLexicalScope): void; - - /** - * @param {string} identifierName - * @param {string} label - */ - preserveNameForLabel (identifierName: string, label: string): void; } diff --git a/src/interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer.ts b/src/interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer.ts index a3881ebe6..67c183f88 100644 --- a/src/interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer.ts +++ b/src/interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer.ts @@ -1,23 +1,23 @@ import * as ESTree from 'estree'; -import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; +import { IControlFlowStorage } from '../../storages/control-flow-transformers/IControlFlowStorage'; export interface IControlFlowReplacer { /** * @param {Node} node * @param {Node} parentNode - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage * @returns {Node} */ replace ( node: ESTree.Node, parentNode: ESTree.Node, - controlFlowStorage: TControlFlowStorage + controlFlowStorage: IControlFlowStorage ): ESTree.Node; /** * @param {TControlFlowStorage} controlFlowStorage * @returns {string} */ - generateStorageKey (controlFlowStorage: TControlFlowStorage): string; + generateStorageKey (controlFlowStorage: IControlFlowStorage): string; } diff --git a/src/interfaces/storages/control-flow-transformers/IControlFlowStorage.ts b/src/interfaces/storages/control-flow-transformers/IControlFlowStorage.ts new file mode 100644 index 000000000..7c59d6df7 --- /dev/null +++ b/src/interfaces/storages/control-flow-transformers/IControlFlowStorage.ts @@ -0,0 +1,5 @@ +import { IMapStorage } from '../IMapStorage'; +import { ICustomNode } from '../../custom-nodes/ICustomNode'; + +// eslint-disable-next-line +export interface IControlFlowStorage extends IMapStorage {} diff --git a/src/interfaces/utils/ISetUtils.ts b/src/interfaces/utils/ISetUtils.ts new file mode 100644 index 000000000..7a81941e1 --- /dev/null +++ b/src/interfaces/utils/ISetUtils.ts @@ -0,0 +1,7 @@ +export interface ISetUtils { + /** + * @param {Set} set + * @returns {T | undefined} + */ + getLastElement (set: Set): T | undefined; +} diff --git a/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts b/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts index 8fc8dc3ed..489dc0706 100644 --- a/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts +++ b/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts @@ -6,23 +6,31 @@ import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; import { TControlFlowReplacerFactory } from '../../types/container/node-transformers/TControlFlowReplacerFactory'; -import { TControlFlowStorage } from '../../types/storages/TControlFlowStorage'; import { TControlFlowStorageFactory } from '../../types/container/node-transformers/TControlFlowStorageFactory'; +import { + TControlFlowStorageFactoryCreator +} from '../../types/container/node-transformers/TControlFlowStorageFactoryCreator'; import { TInitialData } from '../../types/TInitialData'; import { TNodeWithStatements } from '../../types/node/TNodeWithStatements'; +import { IControlFlowStorage } from '../../interfaces/storages/control-flow-transformers/IControlFlowStorage'; import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; import { IVisitor } from '../../interfaces/node-transformers/IVisitor'; import { ControlFlowCustomNode } from '../../enums/custom-nodes/ControlFlowCustomNode'; -import { ControlFlowReplacer } from '../../enums/node-transformers/control-flow-transformers/control-flow-replacers/ControlFlowReplacer'; +import { + ControlFlowReplacer +} from '../../enums/node-transformers/control-flow-transformers/control-flow-replacers/ControlFlowReplacer'; +import { ControlFlowStorage } from '../../enums/storages/ControlFlowStorage'; import { NodeType } from '../../enums/node/NodeType'; import { NodeTransformationStage } from '../../enums/node-transformers/NodeTransformationStage'; import { AbstractNodeTransformer } from '../AbstractNodeTransformer'; -import { ControlFlowStorageNode } from '../../custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ControlFlowStorageNode'; +import { + ControlFlowStorageNode +} from '../../custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ControlFlowStorageNode'; import { NodeAppender } from '../../node/NodeAppender'; import { NodeGuards } from '../../node/NodeGuards'; import { NodeMetadata } from '../../node/NodeMetadata'; @@ -52,9 +60,9 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { ]); /** - * @type {WeakMap} + * @type {WeakMap} */ - protected readonly controlFlowData: WeakMap = new WeakMap(); + protected readonly controlFlowData: WeakMap = new WeakMap(); /** * @type {WeakMap} @@ -69,7 +77,7 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { /** * @type {TControlFlowStorageFactory} */ - protected readonly controlFlowStorageFactory: TControlFlowStorageFactory; + protected controlFlowStorageFactory: TControlFlowStorageFactory; /** * @type {TControlFlowCustomNodeFactory} @@ -82,7 +90,7 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { protected readonly visitedFunctionNodes: WeakSet = new WeakSet(); /** - * @param {TControlFlowStorageFactory} controlFlowStorageFactory + * @param {TControlFlowStorageFactoryCreator} controlFlowStorageFactoryCreator * @param {TControlFlowReplacerFactory} controlFlowReplacerFactory * @param {TControlFlowCustomNodeFactory} controlFlowCustomNodeFactory * @param {IRandomGenerator} randomGenerator @@ -90,7 +98,7 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { */ public constructor ( @inject(ServiceIdentifiers.Factory__TControlFlowStorage) - controlFlowStorageFactory: TControlFlowStorageFactory, + controlFlowStorageFactoryCreator: TControlFlowStorageFactoryCreator, @inject(ServiceIdentifiers.Factory__IControlFlowReplacer) controlFlowReplacerFactory: TControlFlowReplacerFactory, @inject(ServiceIdentifiers.Factory__IControlFlowCustomNode) @@ -100,7 +108,7 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { ) { super(randomGenerator, options); - this.controlFlowStorageFactory = controlFlowStorageFactory; + this.controlFlowStorageFactory = controlFlowStorageFactoryCreator(ControlFlowStorage.FunctionControlFlowStorage); this.controlFlowReplacerFactory = controlFlowReplacerFactory; this.controlFlowCustomNodeFactory = controlFlowCustomNodeFactory; } @@ -145,7 +153,7 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { } const hostNode: TNodeWithStatements = this.getHostNode(functionNode.body); - const controlFlowStorage: TControlFlowStorage = this.getControlFlowStorage(hostNode); + const controlFlowStorage: IControlFlowStorage = this.getControlFlowStorage(hostNode); this.transformFunctionBody(functionNode, controlFlowStorage); @@ -162,9 +170,9 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { /** * @param {BlockStatement} functionNode - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage */ - protected transformFunctionBody (functionNode: ESTree.Function, controlFlowStorage: TControlFlowStorage): void { + protected transformFunctionBody (functionNode: ESTree.Function, controlFlowStorage: IControlFlowStorage): void { estraverse.replace(functionNode.body, { enter: (node: ESTree.Node, parentNode: ESTree.Node | null): estraverse.VisitorOption | ESTree.Node => this.transformFunctionBodyNode(node, parentNode, functionNode, controlFlowStorage) @@ -175,14 +183,14 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { * @param {Node} node * @param {Node | null} parentNode * @param {Function} functionNode - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage * @returns {ESTraverse.VisitorOption | Node} */ protected transformFunctionBodyNode ( node: ESTree.Node, parentNode: ESTree.Node | null, functionNode: ESTree.Function, - controlFlowStorage: TControlFlowStorage + controlFlowStorage: IControlFlowStorage ): estraverse.VisitorOption | ESTree.Node { const shouldSkipTraverse = !parentNode || NodeMetadata.isIgnoredNode(node) @@ -243,10 +251,10 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { * @param {TNodeWithStatements} hostNode * @returns {TControlFlowStorage} */ - protected getControlFlowStorage (hostNode: TNodeWithStatements): TControlFlowStorage { - const controlFlowStorage: TControlFlowStorage = this.controlFlowStorageFactory(); + protected getControlFlowStorage (hostNode: TNodeWithStatements): IControlFlowStorage { + const controlFlowStorage: IControlFlowStorage = this.controlFlowStorageFactory(); - const hostControlFlowStorage: TControlFlowStorage | null = this.controlFlowData.get(hostNode) ?? null; + const hostControlFlowStorage: IControlFlowStorage | null = this.controlFlowData.get(hostNode) ?? null; if (hostControlFlowStorage) { const existingControlFlowStorageNode: ESTree.VariableDeclaration | null = @@ -265,10 +273,10 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { } /** - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage * @returns {VariableDeclaration} */ - protected getControlFlowStorageNode (controlFlowStorage: TControlFlowStorage): ESTree.VariableDeclaration { + protected getControlFlowStorageNode (controlFlowStorage: IControlFlowStorage): ESTree.VariableDeclaration { const controlFlowStorageCustomNode: ICustomNode> = this.controlFlowCustomNodeFactory(ControlFlowCustomNode.ControlFlowStorageNode); diff --git a/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts b/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts index 75a5db654..8d673d19a 100644 --- a/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts +++ b/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts @@ -6,8 +6,9 @@ import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; import { TControlFlowReplacerFactory } from '../../types/container/node-transformers/TControlFlowReplacerFactory'; -import { TControlFlowStorage } from '../../types/storages/TControlFlowStorage'; -import { TControlFlowStorageFactory } from '../../types/container/node-transformers/TControlFlowStorageFactory'; +import { + TControlFlowStorageFactoryCreator +} from '../../types/container/node-transformers/TControlFlowStorageFactoryCreator'; import { TNodeWithStatements } from '../../types/node/TNodeWithStatements'; import { IOptions } from '../../interfaces/options/IOptions'; @@ -15,12 +16,14 @@ import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; import { IVisitor } from '../../interfaces/node-transformers/IVisitor'; import { ControlFlowReplacer } from '../../enums/node-transformers/control-flow-transformers/control-flow-replacers/ControlFlowReplacer'; +import { ControlFlowStorage } from '../../enums/storages/ControlFlowStorage'; import { NodeType } from '../../enums/node/NodeType'; import { NodeTransformationStage } from '../../enums/node-transformers/NodeTransformationStage'; import { NodeTransformer } from '../../enums/node-transformers/NodeTransformer'; import { FunctionControlFlowTransformer } from './FunctionControlFlowTransformer'; import { NodeGuards } from '../../node/NodeGuards'; +import { IControlFlowStorage } from '../../interfaces/storages/control-flow-transformers/IControlFlowStorage'; @injectable() export class StringArrayControlFlowTransformer extends FunctionControlFlowTransformer { @@ -46,7 +49,7 @@ export class StringArrayControlFlowTransformer extends FunctionControlFlowTransf protected readonly controlFlowStorageNodes: WeakSet = new WeakSet(); /** - * @param {TControlFlowStorageFactory} controlFlowStorageFactory + * @param {TControlFlowStorageFactoryCreator} controlFlowStorageFactoryCreator * @param {TControlFlowReplacerFactory} controlFlowReplacerFactory * @param {TControlFlowCustomNodeFactory} controlFlowCustomNodeFactory * @param {IRandomGenerator} randomGenerator @@ -54,7 +57,7 @@ export class StringArrayControlFlowTransformer extends FunctionControlFlowTransf */ public constructor ( @inject(ServiceIdentifiers.Factory__TControlFlowStorage) - controlFlowStorageFactory: TControlFlowStorageFactory, + controlFlowStorageFactoryCreator: TControlFlowStorageFactoryCreator, @inject(ServiceIdentifiers.Factory__IControlFlowReplacer) controlFlowReplacerFactory: TControlFlowReplacerFactory, @inject(ServiceIdentifiers.Factory__IControlFlowCustomNode) @@ -63,12 +66,14 @@ export class StringArrayControlFlowTransformer extends FunctionControlFlowTransf @inject(ServiceIdentifiers.IOptions) options: IOptions ) { super( - controlFlowStorageFactory, + controlFlowStorageFactoryCreator, controlFlowReplacerFactory, controlFlowCustomNodeFactory, randomGenerator, options ); + + this.controlFlowStorageFactory = controlFlowStorageFactoryCreator(ControlFlowStorage.StringControlFlowStorage); } /** @@ -98,14 +103,14 @@ export class StringArrayControlFlowTransformer extends FunctionControlFlowTransf * @param {Node} node * @param {Node | null} parentNode * @param {Function} functionNode - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage * @returns {ESTraverse.VisitorOption | Node} */ protected override transformFunctionBodyNode ( node: ESTree.Node, parentNode: ESTree.Node | null, functionNode: ESTree.Function, - controlFlowStorage: TControlFlowStorage + controlFlowStorage: IControlFlowStorage ): estraverse.VisitorOption | ESTree.Node { const shouldBreakTraverse = NodeGuards.isVariableDeclarationNode(node) && this.controlFlowStorageNodes.has(node); diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts index 9c98d5367..4f510184c 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts @@ -4,10 +4,10 @@ import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers'; import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; -import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { IControlFlowReplacer } from '../../../interfaces/node-transformers/control-flow-transformers/IControlFlowReplacer'; +import { IControlFlowStorage } from '../../../interfaces/storages/control-flow-transformers/IControlFlowStorage'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; import { IIdentifierNamesGenerator } from '../../../interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator'; import { IOptions } from '../../../interfaces/options/IOptions'; @@ -64,10 +64,10 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace * Generates storage key with length of 5 characters to prevent collisions and to guarantee that * these keys will be added to the string array storage * - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage * @returns {string} */ - public generateStorageKey (controlFlowStorage: TControlFlowStorage): string { + public generateStorageKey (controlFlowStorage: IControlFlowStorage): string { const key: string = this.randomGenerator.getRandomString(5); if (controlFlowStorage.has(key)) { @@ -79,14 +79,14 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace /** * @param {ICustomNode} customNode - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage * @param {string} replacerId * @param {number} usingExistingIdentifierChance * @returns {string} */ protected insertCustomNodeToControlFlowStorage ( customNode: ICustomNode, - controlFlowStorage: TControlFlowStorage, + controlFlowStorage: IControlFlowStorage, replacerId: string, usingExistingIdentifierChance: number ): string { @@ -115,12 +115,12 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace * @param {Node} node * @param {Node} parentNode * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage * @returns {Node} */ public abstract replace ( node: ESTree.Node, parentNode: ESTree.Node, - controlFlowStorage: TControlFlowStorage + controlFlowStorage: IControlFlowStorage ): ESTree.Node; } diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.ts index e3df01c2e..d92e2a53f 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.ts @@ -4,10 +4,10 @@ import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers'; import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; -import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; +import { IControlFlowStorage } from '../../../interfaces/storages/control-flow-transformers/IControlFlowStorage'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator'; @@ -50,13 +50,13 @@ export class BinaryExpressionControlFlowReplacer extends ExpressionWithOperatorC * @param {BinaryExpression} binaryExpressionNode * @param {Node} parentNode * @param {TNodeWithLexicalScope} controlFlowStorageLexicalScopeNode - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage * @returns {Node} */ public replace ( binaryExpressionNode: ESTree.BinaryExpression, parentNode: ESTree.Node, - controlFlowStorage: TControlFlowStorage + controlFlowStorage: IControlFlowStorage ): ESTree.Node { const operator: ESTree.BinaryOperator = binaryExpressionNode.operator; const binaryExpressionFunctionCustomNode: ICustomNode> = diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.ts index de4ef72d5..7196b4d30 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.ts @@ -4,11 +4,11 @@ import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers'; import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; -import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; import { TStatement } from '../../../types/node/TStatement'; +import { IControlFlowStorage } from '../../../interfaces/storages/control-flow-transformers/IControlFlowStorage'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator'; @@ -52,13 +52,13 @@ export class CallExpressionControlFlowReplacer extends AbstractControlFlowReplac /** * @param {CallExpression} callExpressionNode * @param {Node} parentNode - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage * @returns {Node} */ public replace ( callExpressionNode: ESTree.CallExpression, parentNode: ESTree.Node, - controlFlowStorage: TControlFlowStorage + controlFlowStorage: IControlFlowStorage ): ESTree.Node { const callee: ESTree.Expression = callExpressionNode.callee; diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer.ts index a2403f9d1..ef24c3a69 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer.ts @@ -4,10 +4,10 @@ import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers'; import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; -import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; +import { IControlFlowStorage } from '../../../interfaces/storages/control-flow-transformers/IControlFlowStorage'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator'; @@ -51,13 +51,13 @@ export class LogicalExpressionControlFlowReplacer extends ExpressionWithOperator /** * @param {LogicalExpression} logicalExpressionNode * @param {Node} parentNode - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage * @returns {Node} */ public replace ( logicalExpressionNode: ESTree.LogicalExpression, parentNode: ESTree.Node, - controlFlowStorage: TControlFlowStorage + controlFlowStorage: IControlFlowStorage ): ESTree.Node { if (this.checkForProhibitedExpressions(logicalExpressionNode.left, logicalExpressionNode.right)) { return logicalExpressionNode; diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts index c4763a9e7..b25fac7f3 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts @@ -4,10 +4,10 @@ import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers'; import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; -import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; +import { IControlFlowStorage } from '../../../interfaces/storages/control-flow-transformers/IControlFlowStorage'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator'; @@ -51,13 +51,13 @@ export class StringArrayCallControlFlowReplacer extends StringLiteralControlFlow /** * @param {Literal} literalNode * @param {Node} parentNode - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage * @returns {Node} */ public override replace ( literalNode: ESTree.Literal, parentNode: ESTree.Node, - controlFlowStorage: TControlFlowStorage + controlFlowStorage: IControlFlowStorage ): ESTree.Node { const isStringArrayCallLiteralNode = NodeMetadata.isStringArrayCallLiteralNode(literalNode) && ( @@ -88,10 +88,10 @@ export class StringArrayCallControlFlowReplacer extends StringLiteralControlFlow /** * Generates storage key based on a current control flow storage identifier * - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage * @returns {string} */ - public override generateStorageKey (controlFlowStorage: TControlFlowStorage): string { + public override generateStorageKey (controlFlowStorage: IControlFlowStorage): string { const key: string = this.identifierNamesGenerator .generateForLabel(controlFlowStorage.getStorageId()); diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts index 061618f4f..11e650425 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts @@ -4,11 +4,11 @@ import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers'; import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; -import { TControlFlowStorage } from '../../../types/storages/TControlFlowStorage'; import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; import { TStatement } from '../../../types/node/TStatement'; +import { IControlFlowStorage } from '../../../interfaces/storages/control-flow-transformers/IControlFlowStorage'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator'; @@ -53,13 +53,13 @@ export class StringLiteralControlFlowReplacer extends AbstractControlFlowReplace /** * @param {Literal} literalNode * @param {Node} parentNode - * @param {TControlFlowStorage} controlFlowStorage + * @param {IControlFlowStorage} controlFlowStorage * @returns {Node} */ public replace ( literalNode: ESTree.Literal, parentNode: ESTree.Node, - controlFlowStorage: TControlFlowStorage + controlFlowStorage: IControlFlowStorage ): ESTree.Node { if (NodeGuards.isPropertyNode(parentNode) && parentNode.key === literalNode) { return literalNode; diff --git a/src/node-transformers/string-array-transformers/StringArrayRotateFunctionTransformer.ts b/src/node-transformers/string-array-transformers/StringArrayRotateFunctionTransformer.ts index 931c110df..bed28bcd7 100644 --- a/src/node-transformers/string-array-transformers/StringArrayRotateFunctionTransformer.ts +++ b/src/node-transformers/string-array-transformers/StringArrayRotateFunctionTransformer.ts @@ -8,12 +8,15 @@ import { TCustomCodeHelperFactory } from '../../types/container/custom-code-help import { TInitialData } from '../../types/TInitialData'; import { TNumberNumericalExpressionData } from '../../types/analyzers/number-numerical-expression-analyzer/TNumberNumericalExpressionData'; import { TStatement } from '../../types/node/TStatement'; +import { TStringLiteralNode } from '../../types/node/TStringLiteralNode'; import { ICustomCodeHelper } from '../../interfaces/custom-code-helpers/ICustomCodeHelper'; +import { INodeTransformersRunner } from '../../interfaces/node-transformers/INodeTransformersRunner'; import { INumberNumericalExpressionAnalyzer } from '../../interfaces/analyzers/number-numerical-expression-analyzer/INumberNumericalExpressionAnalyzer'; import { IOptions } from '../../interfaces/options/IOptions'; import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; import { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage'; +import { IStringArrayStorageAnalyzer } from '../../interfaces/analyzers/string-array-storage-analyzer/IStringArrayStorageAnalyzer'; import { IVisitor } from '../../interfaces/node-transformers/IVisitor'; import { CustomCodeHelper } from '../../enums/custom-code-helpers/CustomCodeHelper'; @@ -25,6 +28,7 @@ import { NodeGuards } from '../../node/NodeGuards'; import { NodeFactory } from '../../node/NodeFactory'; import { NodeLiteralUtils } from '../../node/NodeLiteralUtils'; import { NodeMetadata } from '../../node/NodeMetadata'; +import { NodeTransformer } from '../../enums/node-transformers/NodeTransformer'; import { NodeUtils } from '../../node/NodeUtils'; import { NumericalExpressionDataToNodeConverter } from '../../node/NumericalExpressionDataToNodeConverter'; import { StringArrayRotateFunctionCodeHelper } from '../../custom-code-helpers/string-array/StringArrayRotateFunctionCodeHelper'; @@ -32,17 +36,21 @@ import { StringArrayRotateFunctionCodeHelper } from '../../custom-code-helpers/s @injectable() export class StringArrayRotateFunctionTransformer extends AbstractNodeTransformer { /** - * @type {number} + * @type {NodeTransformer[]} */ - private static readonly comparisonExpressionAdditionalPartsCount: number = 7; + private static readonly stringArrayRotateFunctionTransformers: NodeTransformer[] = [ + NodeTransformer.BooleanLiteralTransformer, + NodeTransformer.MemberExpressionTransformer, + NodeTransformer.NumberLiteralTransformer, + NodeTransformer.NumberToNumericalExpressionTransformer, + NodeTransformer.ParentificationTransformer, + NodeTransformer.ScopeIdentifiersTransformer + ]; /** - * @type {string[]} + * @type {number} */ - private static readonly stringArrayShiftMethodNames: string[] = [ - 'push', - 'shift' - ]; + private static readonly comparisonExpressionAdditionalPartsCount: number = 7; /** * @type {INumberNumericalExpressionAnalyzer} @@ -54,22 +62,36 @@ export class StringArrayRotateFunctionTransformer extends AbstractNodeTransforme */ private readonly stringArrayStorage: IStringArrayStorage; + /** + * @type {IStringArrayStorageAnalyzer} + */ + private readonly stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer; + /** * @type {TCustomCodeHelperFactory} */ private readonly customCodeHelperFactory: TCustomCodeHelperFactory; + /** + * @type {INodeTransformersRunner} + */ + private readonly transformersRunner: INodeTransformersRunner; + /** * @param {IRandomGenerator} randomGenerator * @param {IOptions} options + * @param {INodeTransformersRunner} transformersRunner * @param {IStringArrayStorage} stringArrayStorage + * @param {IStringArrayStorageAnalyzer} stringArrayStorageAnalyzer * @param {TCustomCodeHelperFactory} customCodeHelperFactory * @param {INumberNumericalExpressionAnalyzer} numberNumericalExpressionAnalyzer */ public constructor ( @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, @inject(ServiceIdentifiers.IOptions) options: IOptions, + @inject(ServiceIdentifiers.INodeTransformersRunner) transformersRunner: INodeTransformersRunner, @inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage, + @inject(ServiceIdentifiers.IStringArrayStorageAnalyzer) stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer, @inject(ServiceIdentifiers.Factory__ICustomCodeHelper) customCodeHelperFactory: TCustomCodeHelperFactory, @inject(ServiceIdentifiers.INumberNumericalExpressionAnalyzer) numberNumericalExpressionAnalyzer: INumberNumericalExpressionAnalyzer @@ -77,6 +99,8 @@ export class StringArrayRotateFunctionTransformer extends AbstractNodeTransforme super(randomGenerator, options); this.stringArrayStorage = stringArrayStorage; + this.stringArrayStorageAnalyzer = stringArrayStorageAnalyzer; + this.transformersRunner = transformersRunner; this.customCodeHelperFactory = customCodeHelperFactory; this.numberNumericalExpressionAnalyzer = numberNumericalExpressionAnalyzer; } @@ -143,25 +167,49 @@ export class StringArrayRotateFunctionTransformer extends AbstractNodeTransforme */ public transformNode (programNode: ESTree.Program): ESTree.Node { const stringArrayRotateFunctionNode: TStatement = this.getStringArrayRotateFunctionNode(); + const wrappedStringArrayRotateFunctionNode: ESTree.Program = NodeFactory.programNode([ + stringArrayRotateFunctionNode + ]); + + NodeUtils.parentizeAst(wrappedStringArrayRotateFunctionNode); + + const transformationStages: NodeTransformationStage[] = [ + NodeTransformationStage.Preparing, + NodeTransformationStage.Converting, + NodeTransformationStage.RenameIdentifiers, + NodeTransformationStage.Finalizing + ]; + + // custom transformation of string array rotate function node + for (const transformationStage of transformationStages) { + this.transformersRunner.transform( + wrappedStringArrayRotateFunctionNode, + StringArrayRotateFunctionTransformer.stringArrayRotateFunctionTransformers, + transformationStage + ); + } - estraverse.traverse(stringArrayRotateFunctionNode, { + // mark all child nodes (except literals inside comparison expression) + // as ignored to prevent additional transformation of these nodes + estraverse.traverse(wrappedStringArrayRotateFunctionNode, { enter: (node: ESTree.Node): void => { if ( !NodeGuards.isLiteralNode(node) || !NodeLiteralUtils.isStringLiteralNode(node) ) { - return; + return; } - // set string array shift method names as ignored - // to prevent its extraction to string array - if (StringArrayRotateFunctionTransformer.stringArrayShiftMethodNames.includes(node.value)) { + // force add item data for string literal nodes of comparison expressions + // set all other nodes as ignored to prevent them from obfuscation + if (this.isComparisonExpressionStringLiteralNode(node)) { + this.stringArrayStorageAnalyzer.addItemDataForLiteralNode(node); + } else { NodeMetadata.set(node, {ignoredNode: true}); } } }); - NodeUtils.parentizeAst(stringArrayRotateFunctionNode); NodeAppender.prepend(programNode, [stringArrayRotateFunctionNode]); return programNode; @@ -220,6 +268,14 @@ export class StringArrayRotateFunctionTransformer extends AbstractNodeTransforme return stringArrayRotateFunctionCodeHelper.getNode()[0]; } + /** + * @param {TStringLiteralNode} stringLiteralNode + * @returns {boolean} + */ + private isComparisonExpressionStringLiteralNode (stringLiteralNode: TStringLiteralNode): boolean { + return /\d/.test(stringLiteralNode.value); + } + /** * Extracted to a standalone method to correctly stub this behaviour * @@ -228,4 +284,4 @@ export class StringArrayRotateFunctionTransformer extends AbstractNodeTransforme private getComparisonValue (): number { return this.randomGenerator.getRandomInteger(100000, 1_000_000); } -} +} \ No newline at end of file diff --git a/src/storages/control-flow-transformers/FunctionControlFlowStorage.ts b/src/storages/control-flow-transformers/FunctionControlFlowStorage.ts new file mode 100644 index 000000000..655f23e11 --- /dev/null +++ b/src/storages/control-flow-transformers/FunctionControlFlowStorage.ts @@ -0,0 +1,38 @@ +import { inject, injectable } from 'inversify'; +import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; + +import { TIdentifierNamesGeneratorFactory } from '../../types/container/generators/TIdentifierNamesGeneratorFactory'; + +import { IControlFlowStorage } from '../../interfaces/storages/control-flow-transformers/IControlFlowStorage'; +import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode'; +import { + IIdentifierNamesGenerator +} from '../../interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator'; +import { IOptions } from '../../interfaces/options/IOptions'; +import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; + +import { MapStorage } from '../MapStorage'; + +@injectable() +export class FunctionControlFlowStorage extends MapStorage implements IControlFlowStorage { + /** + * @type {IIdentifierNamesGenerator} + */ + protected readonly identifierNamesGenerator: IIdentifierNamesGenerator; + + /** + * @param {IRandomGenerator} randomGenerator + * @param {IOptions} options + * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory + */ + public constructor ( + @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, + @inject(ServiceIdentifiers.IOptions) options: IOptions, + @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator) + identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory, + ) { + super(randomGenerator, options); + + this.identifierNamesGenerator = identifierNamesGeneratorFactory(options); + } +} diff --git a/src/storages/control-flow-transformers/StringControlFlowStorage.ts b/src/storages/control-flow-transformers/StringControlFlowStorage.ts new file mode 100644 index 000000000..5ff22c7d2 --- /dev/null +++ b/src/storages/control-flow-transformers/StringControlFlowStorage.ts @@ -0,0 +1,33 @@ +import { inject, injectable } from 'inversify'; +import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; + +import { TIdentifierNamesGeneratorFactory } from '../../types/container/generators/TIdentifierNamesGeneratorFactory'; + +import { IOptions } from '../../interfaces/options/IOptions'; +import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; + +import { FunctionControlFlowStorage } from './FunctionControlFlowStorage'; + +@injectable() +export class StringControlFlowStorage extends FunctionControlFlowStorage { + /** + * @param {IRandomGenerator} randomGenerator + * @param {IOptions} options + * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory + */ + public constructor ( + + @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, + @inject(ServiceIdentifiers.IOptions) options: IOptions, + @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator) + identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory, + ) { + super(randomGenerator, options, identifierNamesGeneratorFactory); + } + + public override initialize (): void { + super.initialize(); + + this.storageId = this.identifierNamesGenerator.generateForGlobalScope(); + } +} diff --git a/src/storages/custom-nodes/ControlFlowStorage.ts b/src/storages/custom-nodes/ControlFlowStorage.ts deleted file mode 100644 index 6da02985c..000000000 --- a/src/storages/custom-nodes/ControlFlowStorage.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { inject, injectable, } from 'inversify'; -import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; - -import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode'; -import { IOptions } from '../../interfaces/options/IOptions'; -import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; - -import { MapStorage } from '../MapStorage'; - -@injectable() -export class ControlFlowStorage extends MapStorage { - /** - * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory - * @param {IRandomGenerator} randomGenerator - * @param {IOptions} options - */ - public constructor ( - @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, - @inject(ServiceIdentifiers.IOptions) options: IOptions - ) { - super(randomGenerator, options); - } -} diff --git a/src/types/container/node-transformers/TControlFlowStorageFactory.ts b/src/types/container/node-transformers/TControlFlowStorageFactory.ts index 5b1b9e439..d7d82667b 100644 --- a/src/types/container/node-transformers/TControlFlowStorageFactory.ts +++ b/src/types/container/node-transformers/TControlFlowStorageFactory.ts @@ -1,3 +1,3 @@ -import { TControlFlowStorage } from '../../storages/TControlFlowStorage'; +import { IControlFlowStorage } from '../../../interfaces/storages/control-flow-transformers/IControlFlowStorage'; -export type TControlFlowStorageFactory = () => TControlFlowStorage; +export type TControlFlowStorageFactory = () => IControlFlowStorage; diff --git a/src/types/container/node-transformers/TControlFlowStorageFactoryCreator.ts b/src/types/container/node-transformers/TControlFlowStorageFactoryCreator.ts new file mode 100644 index 000000000..3a2a1ecbc --- /dev/null +++ b/src/types/container/node-transformers/TControlFlowStorageFactoryCreator.ts @@ -0,0 +1,5 @@ +import { TControlFlowStorageFactory } from './TControlFlowStorageFactory'; + +import { ControlFlowStorage } from '../../../enums/storages/ControlFlowStorage'; + +export type TControlFlowStorageFactoryCreator = (controlFlowStorageName: ControlFlowStorage) => TControlFlowStorageFactory; diff --git a/src/types/storages/TControlFlowStorage.ts b/src/types/storages/TControlFlowStorage.ts deleted file mode 100644 index 512491a6a..000000000 --- a/src/types/storages/TControlFlowStorage.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode'; -import { IMapStorage } from '../../interfaces/storages/IMapStorage'; - -export type TControlFlowStorage = IMapStorage ; diff --git a/src/utils/SetUtils.ts b/src/utils/SetUtils.ts new file mode 100644 index 000000000..e19ef24b0 --- /dev/null +++ b/src/utils/SetUtils.ts @@ -0,0 +1,32 @@ +import { inject, injectable } from 'inversify'; +import { ServiceIdentifiers } from '../container/ServiceIdentifiers'; + +import { IArrayUtils } from '../interfaces/utils/IArrayUtils'; +import { ISetUtils } from '../interfaces/utils/ISetUtils'; + +@injectable() +export class SetUtils implements ISetUtils { + /** + * @type {IArrayUtils} + */ + private readonly arrayUtils: IArrayUtils; + + /** + * @param {IArrayUtils} arrayUtils + */ + public constructor ( + @inject(ServiceIdentifiers.IArrayUtils) arrayUtils: IArrayUtils + ) { + this.arrayUtils = arrayUtils; + } + + /** + * @param {Set} set + * @returns {T | undefined} + */ + public getLastElement (set: Set): T | undefined { + const array = [...set]; + + return this.arrayUtils.getLastElement(array); + } +} diff --git a/test/dev/dev.ts b/test/dev/dev.ts index 68b50c44c..1aab4de01 100644 --- a/test/dev/dev.ts +++ b/test/dev/dev.ts @@ -38,7 +38,7 @@ import { StringArrayWrappersType } from '../../src/enums/node-transformers/strin stringArrayCallsTransformThreshold: 1, rotateStringArray: true, stringArrayWrappersType: StringArrayWrappersType.Function, - transformObjectKeys: true, + transformObjectKeys: true } ).getObfuscatedCode(); diff --git a/test/functional-tests/custom-code-helpers/string-array/StringArrayRotateFunctionCodeHelper.spec.ts b/test/functional-tests/custom-code-helpers/string-array/StringArrayRotateFunctionCodeHelper.spec.ts index f6bfc2682..7c4443ed1 100644 --- a/test/functional-tests/custom-code-helpers/string-array/StringArrayRotateFunctionCodeHelper.spec.ts +++ b/test/functional-tests/custom-code-helpers/string-array/StringArrayRotateFunctionCodeHelper.spec.ts @@ -10,7 +10,7 @@ import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscatorFacade describe('StringArrayRotateFunctionCodeHelper', () => { describe('Base behaviour', () => { - const regExp: RegExp = /while *\(true\) *\{/; + const regExp: RegExp = /while *\(!!\[]\) *\{/; describe('`stringArray` option is set', () => { let obfuscatedCode: string; @@ -84,8 +84,8 @@ describe('StringArrayRotateFunctionCodeHelper', () => { }); describe('Preserve string array name', () => { - const arrayRotateRegExp: RegExp = /f\['push']\(f\['shift']\(\)\);/; - const comparisonRegExp: RegExp = /if *\(g *=== *d\) *{/; + const arrayRotateRegExp: RegExp = /e\['push']\(e\['shift']\(\)\);/; + const comparisonRegExp: RegExp = /if *\(f *=== *d\) *{/; let obfuscatedCode: string; diff --git a/test/functional-tests/node-transformers/finalizing-transformers/escape-sequence-transformer/EscapeSequenceTransformer.spec.ts b/test/functional-tests/node-transformers/finalizing-transformers/escape-sequence-transformer/EscapeSequenceTransformer.spec.ts index 88a2c60d7..016f06f55 100644 --- a/test/functional-tests/node-transformers/finalizing-transformers/escape-sequence-transformer/EscapeSequenceTransformer.spec.ts +++ b/test/functional-tests/node-transformers/finalizing-transformers/escape-sequence-transformer/EscapeSequenceTransformer.spec.ts @@ -171,15 +171,15 @@ describe('EscapeSequenceTransformer', function () { describe('Variant #6: `stringArrayWrappersCount` option enabled', () => { const stringArrayCallRegExp: RegExp = new RegExp( - 'const c *= *b;.*' + - 'const foo *= *c\\(\'\\\\x30\\\\x78\\\\x30\'\\);.*' + - 'const bar *= *c\\(\'\\\\x30\\\\x78\\\\x31\'\\);.*' + - 'const baz *= *c\\(\'\\\\x30\\\\x78\\\\x32\'\\);.*' + + 'const f *= *b;.*' + + 'const foo *= *f\\(\'\\\\x30\\\\x78\\\\x30\'\\);.*' + + 'const bar *= *f\\(\'\\\\x30\\\\x78\\\\x31\'\\);.*' + + 'const baz *= *f\\(\'\\\\x30\\\\x78\\\\x32\'\\);.*' + 'function test\\( *\\) *{' + - 'const e *= *c;' + - 'const f *= *e\\(\'\\\\x30\\\\x78\\\\x33\'\\);' + - 'const g *= *e\\(\'\\\\x30\\\\x78\\\\x34\'\\);' + - 'const h *= *e\\(\'\\\\x30\\\\x78\\\\x35\'\\);' + + 'const g *= *f;' + + 'const c *= *g\\(\'\\\\x30\\\\x78\\\\x33\'\\);' + + 'const d *= *g\\(\'\\\\x30\\\\x78\\\\x34\'\\);' + + 'const e *= *g\\(\'\\\\x30\\\\x78\\\\x35\'\\);' + '}' ); diff --git a/test/functional-tests/node-transformers/string-array-transformers/string-array-rotate-function-transformer/StringArrayRotateFunctionTransformer.spec.ts b/test/functional-tests/node-transformers/string-array-transformers/string-array-rotate-function-transformer/StringArrayRotateFunctionTransformer.spec.ts index bdc82dbc8..c3176699c 100644 --- a/test/functional-tests/node-transformers/string-array-transformers/string-array-rotate-function-transformer/StringArrayRotateFunctionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/string-array-transformers/string-array-rotate-function-transformer/StringArrayRotateFunctionTransformer.spec.ts @@ -19,7 +19,7 @@ describe('StringArrayRotateFunctionTransformer', function () { this.timeout(120000); describe('Code helper append', () => { - const regExp: RegExp = /while *\(true\) *\{/; + const regExp: RegExp = /while *\(!!\[]\) *\{/; describe('`stringArray` option is set', () => { let obfuscatedCode: string; diff --git a/test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/StringArrayScopeCallsWrapperTransformer.spec.ts b/test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/StringArrayScopeCallsWrapperTransformer.spec.ts index 9f542d22f..49b58313e 100644 --- a/test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/StringArrayScopeCallsWrapperTransformer.spec.ts +++ b/test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/StringArrayScopeCallsWrapperTransformer.spec.ts @@ -82,11 +82,11 @@ describe('StringArrayScopeCallsWrapperTransformer', function () { describe('Variant #3: correct wrappers order', () => { const stringArrayCallRegExp: RegExp = new RegExp( - 'const c *= *b;.*' + - 'const d *= *b;.*' + - 'const foo *= *[c|d]\\(0x0\\);.*' + - 'const bar *= *[c|d]\\(0x1\\);.*' + - 'const baz *= *[c|d]\\(0x2\\);' + 'const f *= *b;.*' + + 'const g *= *b;.*' + + 'const foo *= *[f|g]\\(0x0\\);.*' + + 'const bar *= *[f|g]\\(0x1\\);.*' + + 'const baz *= *[f|g]\\(0x2\\);' ); let obfuscatedCode: string; @@ -113,11 +113,11 @@ describe('StringArrayScopeCallsWrapperTransformer', function () { describe('Variant #4: `identifiersPrefix` option is set', () => { const stringArrayCallRegExp: RegExp = new RegExp( - 'const foo_c *= *foo_b;.*' + 'const foo_d *= *foo_b;.*' + - 'const foo *= *foo_[c|d]\\(0x0\\);.*' + - 'const bar *= *foo_[c|d]\\(0x1\\);.*' + - 'const baz *= *foo_[c|d]\\(0x2\\);' + 'const foo_e *= *foo_b;.*' + + 'const foo *= *foo_[d|e]\\(0x0\\);.*' + + 'const bar *= *foo_[d|e]\\(0x1\\);.*' + + 'const baz *= *foo_[d|e]\\(0x2\\);' ); let obfuscatedCode: string; @@ -213,11 +213,11 @@ describe('StringArrayScopeCallsWrapperTransformer', function () { describe('Variant #3: correct wrappers order', () => { const stringArrayCallRegExp: RegExp = new RegExp( 'function test *\\( *\\) *{' + - 'const g *= *b;' + 'const h *= *b;' + - 'const i *= *[g|h]\\(0x3\\);' + - 'const j *= *[g|h]\\(0x4\\);' + - 'const k *= *[g|h]\\(0x5\\);' + + 'const i *= *b;' + + 'const c *= *[h|i]\\(0x3\\);' + + 'const d *= *[h|i]\\(0x4\\);' + + 'const e *= *[h|i]\\(0x5\\);' + '}' ); @@ -245,11 +245,11 @@ describe('StringArrayScopeCallsWrapperTransformer', function () { describe('Variant #4: correct wrapper for the function default parameter', () => { const stringArrayCallRegExp: RegExp = new RegExp( - 'const c *= *b;.*' + - 'const foo *= *c\\(0x0\\);.*' + - 'function test *\\(e *= *c\\(0x1\\)\\) *{' + + 'const e *= *b;.*' + + 'const foo *= *e\\(0x0\\);.*' + + 'function test *\\(c *= *e\\(0x1\\)\\) *{' + 'const f *= *b;' + - 'const g *= *f\\(0x2\\);' + + 'const d *= *f\\(0x2\\);' + '}' ); @@ -278,11 +278,11 @@ describe('StringArrayScopeCallsWrapperTransformer', function () { describe('Variant #5: `identifiersPrefix` option is set', () => { const stringArrayCallRegExp: RegExp = new RegExp( 'function test *\\( *\\) *{' + - 'const a *= *foo_b;' + - 'const b *= *foo_b;' + - 'const c *= *[a|b]\\(0x3\\);' + - 'const d *= *[a|b]\\(0x4\\);' + - 'const g *= *[a|b]\\(0x5\\);' + + 'const f *= *foo_b;' + + 'const g *= *foo_b;' + + 'const a *= *[f|g]\\(0x3\\);' + + 'const b *= *[f|g]\\(0x4\\);' + + 'const c *= *[f|g]\\(0x5\\);' + '}' ); @@ -430,25 +430,25 @@ describe('StringArrayScopeCallsWrapperTransformer', function () { describe('Variant #1: correct chained calls', () => { describe('Variant #1: `Mangled` identifier names generator', () => { const stringArrayCallRegExp: RegExp = new RegExp( - 'const c *= *b;.*' + - 'const foo *= *c\\(0x0\\);.*' + - 'function test\\(g, *h\\) *{' + - 'const i *= *c;' + - 'const j *= *i\\(0x1\\);' + - 'const k *= *i\\(0x2\\);' + - 'function l\\(m, *n\\) *{' + - 'const o *= *i;' + - 'const p *= *o\\(0x3\\);' + - 'const q *= *o\\(0x4\\);' + - 'function r\\(s, *t *\\) *{' + - 'const u *= *o;' + - 'const v *= *u\\(0x3\\);' + - 'const w *= *u\\(0x4\\);' + - 'return v *\\+ *w;' + + 'const q *= *b;.*' + + 'const foo *= *q\\(0x0\\);.*' + + 'function test\\(c, *d\\) *{' + + 'const r *= *q;' + + 'const e *= *r\\(0x1\\);' + + 'const f *= *r\\(0x2\\);' + + 'function g\\(h, *i\\) *{' + + 'const s *= *r;' + + 'const j *= *s\\(0x3\\);' + + 'const k *= *s\\(0x4\\);' + + 'function l\\(m, *n *\\) *{' + + 'const t *= *s;' + + 'const o *= *t\\(0x3\\);' + + 'const p *= *t\\(0x4\\);' + + 'return o *\\+ *p;' + '}' + - 'return p *\\+ *q;' + + 'return j *\\+ *k;' + '}' + - 'return j *\\+ *k *\\+ *l\\(\\);' + + 'return e *\\+ *f *\\+ *g\\(\\);' + '}' ); diff --git a/test/index.spec.ts b/test/index.spec.ts index 903c6b43d..dd44ae672 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -49,6 +49,7 @@ import './unit-tests/utils/EscapeSequenceEncoder.spec'; import './unit-tests/utils/LevelledTopologicalSorter.spec'; import './unit-tests/utils/NumberUtils.spec'; import './unit-tests/utils/RandomGenerator.spec'; +import './unit-tests/utils/SetUtils.spec'; import './unit-tests/utils/StringUtils.spec'; import './unit-tests/utils/Utils.spec'; diff --git a/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts b/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts index f2af0051c..0c2e58dfb 100644 --- a/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts +++ b/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts @@ -25,7 +25,7 @@ describe('JavaScriptObfuscator runtime eval', function () { controlFlowFlatteningThreshold: 1, deadCodeInjection: true, deadCodeInjectionThreshold: 1, - debugProtection: true, + debugProtection: false, disableConsoleOutput: true, domainLock: ['obfuscator.io'], log: true, @@ -260,17 +260,17 @@ describe('JavaScriptObfuscator runtime eval', function () { stringArray: false }, { - debugProtection: true, + debugProtection: false, selfDefending: false, stringArray: false }, { - debugProtection: true, + debugProtection: false, selfDefending: true, stringArray: false }, { - debugProtection: true, + debugProtection: false, selfDefending: true, stringArray: true } diff --git a/test/unit-tests/utils/SetUtils.spec.ts b/test/unit-tests/utils/SetUtils.spec.ts new file mode 100644 index 000000000..5aafc635f --- /dev/null +++ b/test/unit-tests/utils/SetUtils.spec.ts @@ -0,0 +1,87 @@ +import 'reflect-metadata'; + +import { assert } from 'chai'; + +import { ServiceIdentifiers } from '../../../src/container/ServiceIdentifiers'; + +import { IInversifyContainerFacade } from '../../../src/interfaces/container/IInversifyContainerFacade'; +import { ISetUtils } from '../../../src/interfaces/utils/ISetUtils'; + +import { InversifyContainerFacade } from '../../../src/container/InversifyContainerFacade'; + +describe('SetUtils', () => { + let setUtils: ISetUtils; + + before(() => { + const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade(); + + inversifyContainerFacade.load('', '', {}); + setUtils = inversifyContainerFacade.get(ServiceIdentifiers.ISetUtils); + }); + + describe('getLastElement', () => { + describe('empty set', () => { + const set: Set = new Set(); + const expectedLastElement: undefined = undefined; + + let lastElement: string | undefined; + + before(() => { + lastElement = setUtils.getLastElement(set); + }); + + it('should return undefined if set is empty', () => { + assert.equal(lastElement, expectedLastElement); + }); + }); + + describe('set length: `1`', () => { + const set: Set = new Set(['foo']); + const expectedLastElement: string = 'foo'; + + let lastElement: string | undefined; + + before(() => { + lastElement = setUtils.getLastElement(set); + }); + + it('should return first element for set with length: `1`', () => { + assert.equal(lastElement, expectedLastElement); + }); + }); + + describe('set length: `3`', () => { + const set: Set = new Set(['foo', 'bar', 'baz']); + const expectedLastElement: string = 'baz'; + + let lastElement: string | undefined; + + before(() => { + lastElement = setUtils.getLastElement(set); + }); + + it('should return last element for set with length: `3`', () => { + assert.equal(lastElement, expectedLastElement); + }); + }); + + describe('changed set with length: `2`', () => { + const set: Set = new Set(['foo', 'bar', 'baz']); + set.add('bark'); + set.delete('bark'); + set.delete('bar'); + + const expectedLastElement: string = 'baz'; + + let lastElement: string | undefined; + + before(() => { + lastElement = setUtils.getLastElement(set); + }); + + it('should return last element for changed set with length: `2`', () => { + assert.equal(lastElement, expectedLastElement); + }); + }); + }); +}); From 5f7a3958eef341e8e732e778fc0c83d5113f9e87 Mon Sep 17 00:00:00 2001 From: sanex Date: Thu, 3 Feb 2022 21:08:05 +0300 Subject: [PATCH 06/14] String Control Flow Flattening WIP --- .../DictionaryIdentifierNamesGenerator.ts | 34 +++++++++++-------- ...DictionaryIdentifierNamesGenerator.spec.ts | 9 ++--- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/generators/identifier-names-generators/DictionaryIdentifierNamesGenerator.ts b/src/generators/identifier-names-generators/DictionaryIdentifierNamesGenerator.ts index e0e62101e..448a251b5 100644 --- a/src/generators/identifier-names-generators/DictionaryIdentifierNamesGenerator.ts +++ b/src/generators/identifier-names-generators/DictionaryIdentifierNamesGenerator.ts @@ -128,29 +128,33 @@ export class DictionaryIdentifierNamesGenerator extends AbstractIdentifierNamesG * @returns {string} */ private generateNewDictionaryName (validationFunction?: (newIdentifierName: string) => boolean): string { - if (!this.identifierNamesSet.size) { - throw new Error('Too many identifiers in the code, add more words to identifiers dictionary'); - } + const generateNewDictionaryName = (): string => { + if (!this.identifierNamesSet.size) { + throw new Error('Too many identifiers in the code, add more words to identifiers dictionary'); + } + + const iteratorResult: IteratorResult = this.identifiersIterator.next(); - const iteratorResult: IteratorResult = this.identifiersIterator.next(); + if (!iteratorResult.done) { + const identifierName: string = iteratorResult.value; - if (!iteratorResult.done) { - const identifierName: string = iteratorResult.value; + const isValidIdentifierName = validationFunction?.(identifierName) + ?? this.isValidIdentifierName(identifierName); - const isValidIdentifierName = validationFunction?.(identifierName) - ?? this.isValidIdentifierName(identifierName); + if (!isValidIdentifierName) { + return generateNewDictionaryName(); + } - if (!isValidIdentifierName) { - return this.generateNewDictionaryName(); + return iteratorResult.value; } - return iteratorResult.value; - } + this.identifierNamesSet = new Set(this.getIncrementedIdentifierNames([...this.identifierNamesSet])); + this.identifiersIterator = this.identifierNamesSet.values(); - this.identifierNamesSet = new Set(this.getIncrementedIdentifierNames([...this.identifierNamesSet])); - this.identifiersIterator = this.identifierNamesSet.values(); + return generateNewDictionaryName(); + }; - return this.generateNewDictionaryName(); + return generateNewDictionaryName(); } /** diff --git a/test/functional-tests/generators/identifier-names-generators/dictionary-identifier-names-generator/DictionaryIdentifierNamesGenerator.spec.ts b/test/functional-tests/generators/identifier-names-generators/dictionary-identifier-names-generator/DictionaryIdentifierNamesGenerator.spec.ts index ef577d133..39e734db2 100644 --- a/test/functional-tests/generators/identifier-names-generators/dictionary-identifier-names-generator/DictionaryIdentifierNamesGenerator.spec.ts +++ b/test/functional-tests/generators/identifier-names-generators/dictionary-identifier-names-generator/DictionaryIdentifierNamesGenerator.spec.ts @@ -37,11 +37,12 @@ describe('DictionaryIdentifierNamesGenerator', () => { { ...NO_ADDITIONAL_NODES_PRESET, identifierNamesGenerator: IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator, - identifiersDictionary: ['a', 'b', 'c'], + identifiersDictionary: ['a', 'b', 'c', 'd'], identifiersPrefix: 'a', transformObjectKeys: true, stringArray: true, - stringArrayThreshold: 1 + stringArrayThreshold: 1, + seed: 1 } ).getObfuscatedCode(); @@ -153,7 +154,7 @@ describe('DictionaryIdentifierNamesGenerator', () => { { ...NO_ADDITIONAL_NODES_PRESET, identifierNamesGenerator: IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator, - identifiersDictionary: ['a', 'b', 'aa'], + identifiersDictionary: ['a', 'b', 'aa', 'ab'], identifiersPrefix: 'a', transformObjectKeys: true, stringArray: true, @@ -198,7 +199,7 @@ describe('DictionaryIdentifierNamesGenerator', () => { { ...NO_ADDITIONAL_NODES_PRESET, identifierNamesGenerator: IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator, - identifiersDictionary: ['a', 'b', 'aa'], + identifiersDictionary: ['a', 'b', 'aa', 'ab'], identifiersPrefix: 'a', renameGlobals: true, transformObjectKeys: true, From a0d5b48efe3b4e18f9cadc3f0c1d8b8ec1032536 Mon Sep 17 00:00:00 2001 From: sanex Date: Thu, 3 Feb 2022 21:53:13 +0300 Subject: [PATCH 07/14] String Control Flow Flattening WIP --- src/interfaces/node-transformers/INodeTransformer.ts | 2 -- src/interfaces/storages/IArrayStorage.ts | 2 -- src/interfaces/storages/IMapStorage.ts | 2 -- src/node-transformers/NodeTransformersRunner.ts | 10 ---------- .../StringArrayControlFlowTransformer.ts | 4 ++++ .../StringArrayRotateFunctionTransformer.ts | 2 +- src/storages/ArrayStorage.ts | 4 ---- src/storages/MapStorage.ts | 4 ---- test/dev/dev.ts | 1 - .../DictionaryIdentifierNamesGenerator.spec.ts | 6 +++--- 10 files changed, 8 insertions(+), 29 deletions(-) diff --git a/src/interfaces/node-transformers/INodeTransformer.ts b/src/interfaces/node-transformers/INodeTransformer.ts index 6068a0fb5..3798edbe8 100644 --- a/src/interfaces/node-transformers/INodeTransformer.ts +++ b/src/interfaces/node-transformers/INodeTransformer.ts @@ -32,6 +32,4 @@ export interface INodeTransformer extends ITransformer { * @returns {Node | VisitorOption} */ transformNode (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | estraverse.VisitorOption; - - onTransformComplete ? (): void; } diff --git a/src/interfaces/storages/IArrayStorage.ts b/src/interfaces/storages/IArrayStorage.ts index 6a6cada34..771b21f89 100644 --- a/src/interfaces/storages/IArrayStorage.ts +++ b/src/interfaces/storages/IArrayStorage.ts @@ -1,8 +1,6 @@ import { IInitializable } from '../IInitializable'; export interface IArrayStorage extends IInitializable { - clear (): void; - /** * @param {number} key * @returns {V | undefined} diff --git a/src/interfaces/storages/IMapStorage.ts b/src/interfaces/storages/IMapStorage.ts index 3ac841eb8..50f004ca1 100644 --- a/src/interfaces/storages/IMapStorage.ts +++ b/src/interfaces/storages/IMapStorage.ts @@ -3,8 +3,6 @@ import { TDictionary } from '../../types/TDictionary'; import { IInitializable } from '../IInitializable'; export interface IMapStorage extends IInitializable { - clear (): void; - /** * @param {K} key * @returns {V | undefined} diff --git a/src/node-transformers/NodeTransformersRunner.ts b/src/node-transformers/NodeTransformersRunner.ts index 015c2ff6f..8e423bae3 100644 --- a/src/node-transformers/NodeTransformersRunner.ts +++ b/src/node-transformers/NodeTransformersRunner.ts @@ -61,7 +61,6 @@ export class NodeTransformersRunner implements INodeTransformersRunner { * @param {NodeTransformationStage} nodeTransformationStage * @returns {T} */ - // eslint-disable-next-line complexity public transform ( astTree: T, nodeTransformerNames: NodeTransformer[], @@ -79,7 +78,6 @@ export class NodeTransformersRunner implements INodeTransformersRunner { for (const nodeTransformerNamesGroup of nodeTransformerNamesGroups) { const enterVisitors: IVisitor[] = []; const leaveVisitors: IVisitor[] = []; - const onTransformCompleteHandlers: INodeTransformer['onTransformComplete'][] = []; for (const nodeTransformerName of nodeTransformerNamesGroup) { const nodeTransformer: INodeTransformer = normalizedNodeTransformers[nodeTransformerName]; @@ -96,10 +94,6 @@ export class NodeTransformersRunner implements INodeTransformersRunner { if (visitor.leave) { leaveVisitors.push({ leave: visitor.leave }); } - - if (nodeTransformer.onTransformComplete) { - onTransformCompleteHandlers.push(nodeTransformer.onTransformComplete.bind(nodeTransformer)); - } } if (!enterVisitors.length && !leaveVisitors.length) { @@ -110,10 +104,6 @@ export class NodeTransformersRunner implements INodeTransformersRunner { enter: this.mergeVisitorsForDirection(enterVisitors, VisitorDirection.Enter), leave: this.mergeVisitorsForDirection(leaveVisitors, VisitorDirection.Leave) }); - - for (const onTransformCompleteHandler of onTransformCompleteHandlers) { - onTransformCompleteHandler?.(); - } } return astTree; diff --git a/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts b/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts index 8d673d19a..643c5eed9 100644 --- a/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts +++ b/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts @@ -81,6 +81,10 @@ export class StringArrayControlFlowTransformer extends FunctionControlFlowTransf * @returns {IVisitor | null} */ public override getVisitor (nodeTransformationStage: NodeTransformationStage): IVisitor | null { + if (!this.options.stringArrayCallsTransform) { + return null; + } + switch (nodeTransformationStage) { case NodeTransformationStage.StringArray: return { diff --git a/src/node-transformers/string-array-transformers/StringArrayRotateFunctionTransformer.ts b/src/node-transformers/string-array-transformers/StringArrayRotateFunctionTransformer.ts index bed28bcd7..eac0bcba8 100644 --- a/src/node-transformers/string-array-transformers/StringArrayRotateFunctionTransformer.ts +++ b/src/node-transformers/string-array-transformers/StringArrayRotateFunctionTransformer.ts @@ -284,4 +284,4 @@ export class StringArrayRotateFunctionTransformer extends AbstractNodeTransforme private getComparisonValue (): number { return this.randomGenerator.getRandomInteger(100000, 1_000_000); } -} \ No newline at end of file +} diff --git a/src/storages/ArrayStorage.ts b/src/storages/ArrayStorage.ts index 7d43e4a2b..a29d32c84 100644 --- a/src/storages/ArrayStorage.ts +++ b/src/storages/ArrayStorage.ts @@ -54,10 +54,6 @@ export abstract class ArrayStorage implements IArrayStorage { this.storageId = this.randomGenerator.getRandomString(6); } - public clear (): void { - this.storage = []; - } - /** * @param {number} key * @returns {V | undefined} diff --git a/src/storages/MapStorage.ts b/src/storages/MapStorage.ts index 31924dcca..cc9b88423 100644 --- a/src/storages/MapStorage.ts +++ b/src/storages/MapStorage.ts @@ -50,10 +50,6 @@ export abstract class MapStorage implements IMapStorage { this.storageId = this.randomGenerator.getRandomString(6); } - public clear (): void { - this.storage.clear(); - } - /** * @param {K} key * @returns {V | undefined} diff --git a/test/dev/dev.ts b/test/dev/dev.ts index 1aab4de01..611ca670a 100644 --- a/test/dev/dev.ts +++ b/test/dev/dev.ts @@ -22,7 +22,6 @@ import { StringArrayWrappersType } from '../../src/enums/node-transformers/strin console.log(foo()); `, { - seed: 1, identifierNamesGenerator: 'mangled', compact: false, controlFlowFlattening: true, diff --git a/test/functional-tests/generators/identifier-names-generators/dictionary-identifier-names-generator/DictionaryIdentifierNamesGenerator.spec.ts b/test/functional-tests/generators/identifier-names-generators/dictionary-identifier-names-generator/DictionaryIdentifierNamesGenerator.spec.ts index 39e734db2..8d2520d28 100644 --- a/test/functional-tests/generators/identifier-names-generators/dictionary-identifier-names-generator/DictionaryIdentifierNamesGenerator.spec.ts +++ b/test/functional-tests/generators/identifier-names-generators/dictionary-identifier-names-generator/DictionaryIdentifierNamesGenerator.spec.ts @@ -37,7 +37,7 @@ describe('DictionaryIdentifierNamesGenerator', () => { { ...NO_ADDITIONAL_NODES_PRESET, identifierNamesGenerator: IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator, - identifiersDictionary: ['a', 'b', 'c', 'd'], + identifiersDictionary: ['a', 'b', 'c'], identifiersPrefix: 'a', transformObjectKeys: true, stringArray: true, @@ -154,7 +154,7 @@ describe('DictionaryIdentifierNamesGenerator', () => { { ...NO_ADDITIONAL_NODES_PRESET, identifierNamesGenerator: IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator, - identifiersDictionary: ['a', 'b', 'aa', 'ab'], + identifiersDictionary: ['a', 'b', 'aa'], identifiersPrefix: 'a', transformObjectKeys: true, stringArray: true, @@ -199,7 +199,7 @@ describe('DictionaryIdentifierNamesGenerator', () => { { ...NO_ADDITIONAL_NODES_PRESET, identifierNamesGenerator: IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator, - identifiersDictionary: ['a', 'b', 'aa', 'ab'], + identifiersDictionary: ['a', 'b', 'aa'], identifiersPrefix: 'a', renameGlobals: true, transformObjectKeys: true, From f3fc82953653ed867f5159a9451e499803d514b2 Mon Sep 17 00:00:00 2001 From: sanex Date: Thu, 3 Feb 2022 22:07:53 +0300 Subject: [PATCH 08/14] Moved dom-properties list --- src/constants/DomProperties.ts | 7778 +++++++++++++++++ .../replacer/RenamePropertiesReplacer.ts | 10 +- .../replacer/ReservedDomProperties.json | 7771 ---------------- 3 files changed, 7780 insertions(+), 7779 deletions(-) create mode 100644 src/constants/DomProperties.ts delete mode 100644 src/node-transformers/rename-properties-transformers/replacer/ReservedDomProperties.json diff --git a/src/constants/DomProperties.ts b/src/constants/DomProperties.ts new file mode 100644 index 000000000..419529386 --- /dev/null +++ b/src/constants/DomProperties.ts @@ -0,0 +1,7778 @@ +/* eslint-disable max-lines */ +/** + * Properties list taken from `UglifyJS` and `terser` + * https://github.com/mishoo/UglifyJS/blob/master/tools/domprops.json + * https://github.com/terser/terser/blob/master/tools/domprops.js + * Copyright 2012-2018 (c) Mihai Bazon + */ +export const domProperties = [ + '$&', + '$\'', + '$*', + '$+', + '$1', + '$2', + '$3', + '$4', + '$5', + '$6', + '$7', + '$8', + '$9', + '$_', + '$`', + '$input', + '-moz-animation', + '-moz-animation-delay', + '-moz-animation-direction', + '-moz-animation-duration', + '-moz-animation-fill-mode', + '-moz-animation-iteration-count', + '-moz-animation-name', + '-moz-animation-play-state', + '-moz-animation-timing-function', + '-moz-appearance', + '-moz-backface-visibility', + '-moz-border-end', + '-moz-border-end-color', + '-moz-border-end-style', + '-moz-border-end-width', + '-moz-border-image', + '-moz-border-start', + '-moz-border-start-color', + '-moz-border-start-style', + '-moz-border-start-width', + '-moz-box-align', + '-moz-box-direction', + '-moz-box-flex', + '-moz-box-ordinal-group', + '-moz-box-orient', + '-moz-box-pack', + '-moz-box-sizing', + '-moz-float-edge', + '-moz-font-feature-settings', + '-moz-font-language-override', + '-moz-force-broken-image-icon', + '-moz-hyphens', + '-moz-image-region', + '-moz-margin-end', + '-moz-margin-start', + '-moz-orient', + '-moz-osx-font-smoothing', + '-moz-outline-radius', + '-moz-outline-radius-bottomleft', + '-moz-outline-radius-bottomright', + '-moz-outline-radius-topleft', + '-moz-outline-radius-topright', + '-moz-padding-end', + '-moz-padding-start', + '-moz-perspective', + '-moz-perspective-origin', + '-moz-tab-size', + '-moz-text-size-adjust', + '-moz-transform', + '-moz-transform-origin', + '-moz-transform-style', + '-moz-transition', + '-moz-transition-delay', + '-moz-transition-duration', + '-moz-transition-property', + '-moz-transition-timing-function', + '-moz-user-focus', + '-moz-user-input', + '-moz-user-modify', + '-moz-user-select', + '-moz-window-dragging', + '-webkit-align-content', + '-webkit-align-items', + '-webkit-align-self', + '-webkit-animation', + '-webkit-animation-delay', + '-webkit-animation-direction', + '-webkit-animation-duration', + '-webkit-animation-fill-mode', + '-webkit-animation-iteration-count', + '-webkit-animation-name', + '-webkit-animation-play-state', + '-webkit-animation-timing-function', + '-webkit-appearance', + '-webkit-backface-visibility', + '-webkit-background-clip', + '-webkit-background-origin', + '-webkit-background-size', + '-webkit-border-bottom-left-radius', + '-webkit-border-bottom-right-radius', + '-webkit-border-image', + '-webkit-border-radius', + '-webkit-border-top-left-radius', + '-webkit-border-top-right-radius', + '-webkit-box-align', + '-webkit-box-direction', + '-webkit-box-flex', + '-webkit-box-ordinal-group', + '-webkit-box-orient', + '-webkit-box-pack', + '-webkit-box-shadow', + '-webkit-box-sizing', + '-webkit-filter', + '-webkit-flex', + '-webkit-flex-basis', + '-webkit-flex-direction', + '-webkit-flex-flow', + '-webkit-flex-grow', + '-webkit-flex-shrink', + '-webkit-flex-wrap', + '-webkit-justify-content', + '-webkit-line-clamp', + '-webkit-mask', + '-webkit-mask-clip', + '-webkit-mask-composite', + '-webkit-mask-image', + '-webkit-mask-origin', + '-webkit-mask-position', + '-webkit-mask-position-x', + '-webkit-mask-position-y', + '-webkit-mask-repeat', + '-webkit-mask-size', + '-webkit-order', + '-webkit-perspective', + '-webkit-perspective-origin', + '-webkit-text-fill-color', + '-webkit-text-size-adjust', + '-webkit-text-stroke', + '-webkit-text-stroke-color', + '-webkit-text-stroke-width', + '-webkit-transform', + '-webkit-transform-origin', + '-webkit-transform-style', + '-webkit-transition', + '-webkit-transition-delay', + '-webkit-transition-duration', + '-webkit-transition-property', + '-webkit-transition-timing-function', + '-webkit-user-select', + '0', + '1', + '10', + '11', + '12', + '13', + '14', + '15', + '16', + '17', + '18', + '19', + '2', + '20', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '@@iterator', + 'ABORT_ERR', + 'ACTIVE', + 'ACTIVE_ATTRIBUTES', + 'ACTIVE_TEXTURE', + 'ACTIVE_UNIFORMS', + 'ACTIVE_UNIFORM_BLOCKS', + 'ADDITION', + 'ALIASED_LINE_WIDTH_RANGE', + 'ALIASED_POINT_SIZE_RANGE', + 'ALLOW_KEYBOARD_INPUT', + 'ALLPASS', + 'ALPHA', + 'ALPHA_BITS', + 'ALREADY_SIGNALED', + 'ALT_MASK', + 'ALWAYS', + 'ANY_SAMPLES_PASSED', + 'ANY_SAMPLES_PASSED_CONSERVATIVE', + 'ANY_TYPE', + 'ANY_UNORDERED_NODE_TYPE', + 'ARRAY_BUFFER', + 'ARRAY_BUFFER_BINDING', + 'ATTACHED_SHADERS', + 'ATTRIBUTE_NODE', + 'AT_TARGET', + 'AbortController', + 'AbortSignal', + 'AbsoluteOrientationSensor', + 'AbstractRange', + 'Accelerometer', + 'AddSearchProvider', + 'AggregateError', + 'AnalyserNode', + 'Animation', + 'AnimationEffect', + 'AnimationEvent', + 'AnimationPlaybackEvent', + 'AnimationTimeline', + 'AnonXMLHttpRequest', + 'Any', + 'ApplicationCache', + 'ApplicationCacheErrorEvent', + 'Array', + 'ArrayBuffer', + 'ArrayType', + 'Atomics', + 'Attr', + 'Audio', + 'AudioBuffer', + 'AudioBufferSourceNode', + 'AudioContext', + 'AudioDestinationNode', + 'AudioListener', + 'AudioNode', + 'AudioParam', + 'AudioParamMap', + 'AudioProcessingEvent', + 'AudioScheduledSourceNode', + 'AudioStreamTrack', + 'AudioWorklet', + 'AudioWorkletNode', + 'AuthenticatorAssertionResponse', + 'AuthenticatorAttestationResponse', + 'AuthenticatorResponse', + 'AutocompleteErrorEvent', + 'BACK', + 'BAD_BOUNDARYPOINTS_ERR', + 'BAD_REQUEST', + 'BANDPASS', + 'BLEND', + 'BLEND_COLOR', + 'BLEND_DST_ALPHA', + 'BLEND_DST_RGB', + 'BLEND_EQUATION', + 'BLEND_EQUATION_ALPHA', + 'BLEND_EQUATION_RGB', + 'BLEND_SRC_ALPHA', + 'BLEND_SRC_RGB', + 'BLUE_BITS', + 'BLUR', + 'BOOL', + 'BOOLEAN_TYPE', + 'BOOL_VEC2', + 'BOOL_VEC3', + 'BOOL_VEC4', + 'BOTH', + 'BROWSER_DEFAULT_WEBGL', + 'BUBBLING_PHASE', + 'BUFFER_SIZE', + 'BUFFER_USAGE', + 'BYTE', + 'BYTES_PER_ELEMENT', + 'BackgroundFetchManager', + 'BackgroundFetchRecord', + 'BackgroundFetchRegistration', + 'BarProp', + 'BarcodeDetector', + 'BaseAudioContext', + 'BaseHref', + 'BatteryManager', + 'BeforeInstallPromptEvent', + 'BeforeLoadEvent', + 'BeforeUnloadEvent', + 'BigInt', + 'BigInt64Array', + 'BigUint64Array', + 'BiquadFilterNode', + 'Blob', + 'BlobEvent', + 'Bluetooth', + 'BluetoothCharacteristicProperties', + 'BluetoothDevice', + 'BluetoothRemoteGATTCharacteristic', + 'BluetoothRemoteGATTDescriptor', + 'BluetoothRemoteGATTServer', + 'BluetoothRemoteGATTService', + 'BluetoothUUID', + 'Boolean', + 'BroadcastChannel', + 'ByteLengthQueuingStrategy', + 'CAPTURING_PHASE', + 'CCW', + 'CDATASection', + 'CDATA_SECTION_NODE', + 'CHANGE', + 'CHARSET_RULE', + 'CHECKING', + 'CLAMP_TO_EDGE', + 'CLICK', + 'CLOSED', + 'CLOSING', + 'COLOR', + 'COLOR_ATTACHMENT0', + 'COLOR_ATTACHMENT1', + 'COLOR_ATTACHMENT10', + 'COLOR_ATTACHMENT11', + 'COLOR_ATTACHMENT12', + 'COLOR_ATTACHMENT13', + 'COLOR_ATTACHMENT14', + 'COLOR_ATTACHMENT15', + 'COLOR_ATTACHMENT2', + 'COLOR_ATTACHMENT3', + 'COLOR_ATTACHMENT4', + 'COLOR_ATTACHMENT5', + 'COLOR_ATTACHMENT6', + 'COLOR_ATTACHMENT7', + 'COLOR_ATTACHMENT8', + 'COLOR_ATTACHMENT9', + 'COLOR_BUFFER_BIT', + 'COLOR_CLEAR_VALUE', + 'COLOR_WRITEMASK', + 'COMMENT_NODE', + 'COMPARE_REF_TO_TEXTURE', + 'COMPILE_STATUS', + 'COMPRESSED_RGBA_S3TC_DXT1_EXT', + 'COMPRESSED_RGBA_S3TC_DXT3_EXT', + 'COMPRESSED_RGBA_S3TC_DXT5_EXT', + 'COMPRESSED_RGB_S3TC_DXT1_EXT', + 'COMPRESSED_TEXTURE_FORMATS', + 'CONDITION_SATISFIED', + 'CONFIGURATION_UNSUPPORTED', + 'CONNECTING', + 'CONSTANT_ALPHA', + 'CONSTANT_COLOR', + 'CONSTRAINT_ERR', + 'CONTEXT_LOST_WEBGL', + 'CONTROL_MASK', + 'COPY_READ_BUFFER', + 'COPY_READ_BUFFER_BINDING', + 'COPY_WRITE_BUFFER', + 'COPY_WRITE_BUFFER_BINDING', + 'COUNTER_STYLE_RULE', + 'CSS', + 'CSS2Properties', + 'CSSAnimation', + 'CSSCharsetRule', + 'CSSConditionRule', + 'CSSCounterStyleRule', + 'CSSFontFaceRule', + 'CSSFontFeatureValuesRule', + 'CSSGroupingRule', + 'CSSImageValue', + 'CSSImportRule', + 'CSSKeyframeRule', + 'CSSKeyframesRule', + 'CSSKeywordValue', + 'CSSMathInvert', + 'CSSMathMax', + 'CSSMathMin', + 'CSSMathNegate', + 'CSSMathProduct', + 'CSSMathSum', + 'CSSMathValue', + 'CSSMatrixComponent', + 'CSSMediaRule', + 'CSSMozDocumentRule', + 'CSSNameSpaceRule', + 'CSSNamespaceRule', + 'CSSNumericArray', + 'CSSNumericValue', + 'CSSPageRule', + 'CSSPerspective', + 'CSSPositionValue', + 'CSSPrimitiveValue', + 'CSSRotate', + 'CSSRule', + 'CSSRuleList', + 'CSSScale', + 'CSSSkew', + 'CSSSkewX', + 'CSSSkewY', + 'CSSStyleDeclaration', + 'CSSStyleRule', + 'CSSStyleSheet', + 'CSSStyleValue', + 'CSSSupportsRule', + 'CSSTransformComponent', + 'CSSTransformValue', + 'CSSTransition', + 'CSSTranslate', + 'CSSUnitValue', + 'CSSUnknownRule', + 'CSSUnparsedValue', + 'CSSValue', + 'CSSValueList', + 'CSSVariableReferenceValue', + 'CSSVariablesDeclaration', + 'CSSVariablesRule', + 'CSSViewportRule', + 'CSS_ATTR', + 'CSS_CM', + 'CSS_COUNTER', + 'CSS_CUSTOM', + 'CSS_DEG', + 'CSS_DIMENSION', + 'CSS_EMS', + 'CSS_EXS', + 'CSS_FILTER_BLUR', + 'CSS_FILTER_BRIGHTNESS', + 'CSS_FILTER_CONTRAST', + 'CSS_FILTER_CUSTOM', + 'CSS_FILTER_DROP_SHADOW', + 'CSS_FILTER_GRAYSCALE', + 'CSS_FILTER_HUE_ROTATE', + 'CSS_FILTER_INVERT', + 'CSS_FILTER_OPACITY', + 'CSS_FILTER_REFERENCE', + 'CSS_FILTER_SATURATE', + 'CSS_FILTER_SEPIA', + 'CSS_GRAD', + 'CSS_HZ', + 'CSS_IDENT', + 'CSS_IN', + 'CSS_INHERIT', + 'CSS_KHZ', + 'CSS_MATRIX', + 'CSS_MATRIX3D', + 'CSS_MM', + 'CSS_MS', + 'CSS_NUMBER', + 'CSS_PC', + 'CSS_PERCENTAGE', + 'CSS_PERSPECTIVE', + 'CSS_PRIMITIVE_VALUE', + 'CSS_PT', + 'CSS_PX', + 'CSS_RAD', + 'CSS_RECT', + 'CSS_RGBCOLOR', + 'CSS_ROTATE', + 'CSS_ROTATE3D', + 'CSS_ROTATEX', + 'CSS_ROTATEY', + 'CSS_ROTATEZ', + 'CSS_S', + 'CSS_SCALE', + 'CSS_SCALE3D', + 'CSS_SCALEX', + 'CSS_SCALEY', + 'CSS_SCALEZ', + 'CSS_SKEW', + 'CSS_SKEWX', + 'CSS_SKEWY', + 'CSS_STRING', + 'CSS_TRANSLATE', + 'CSS_TRANSLATE3D', + 'CSS_TRANSLATEX', + 'CSS_TRANSLATEY', + 'CSS_TRANSLATEZ', + 'CSS_UNKNOWN', + 'CSS_URI', + 'CSS_VALUE_LIST', + 'CSS_VH', + 'CSS_VMAX', + 'CSS_VMIN', + 'CSS_VW', + 'CULL_FACE', + 'CULL_FACE_MODE', + 'CURRENT_PROGRAM', + 'CURRENT_QUERY', + 'CURRENT_VERTEX_ATTRIB', + 'CUSTOM', + 'CW', + 'Cache', + 'CacheStorage', + 'CanvasCaptureMediaStream', + 'CanvasCaptureMediaStreamTrack', + 'CanvasGradient', + 'CanvasPattern', + 'CanvasRenderingContext2D', + 'CaretPosition', + 'ChannelMergerNode', + 'ChannelSplitterNode', + 'CharacterData', + 'ClientRect', + 'ClientRectList', + 'Clipboard', + 'ClipboardEvent', + 'ClipboardItem', + 'CloseEvent', + 'Collator', + 'CommandEvent', + 'Comment', + 'CompileError', + 'CompositionEvent', + 'CompressionStream', + 'Console', + 'ConstantSourceNode', + 'Controllers', + 'ConvolverNode', + 'CountQueuingStrategy', + 'Counter', + 'Credential', + 'CredentialsContainer', + 'Crypto', + 'CryptoKey', + 'CustomElementRegistry', + 'CustomEvent', + 'DATABASE_ERR', + 'DATA_CLONE_ERR', + 'DATA_ERR', + 'DBLCLICK', + 'DECR', + 'DECR_WRAP', + 'DELETE_STATUS', + 'DEPTH', + 'DEPTH24_STENCIL8', + 'DEPTH32F_STENCIL8', + 'DEPTH_ATTACHMENT', + 'DEPTH_BITS', + 'DEPTH_BUFFER_BIT', + 'DEPTH_CLEAR_VALUE', + 'DEPTH_COMPONENT', + 'DEPTH_COMPONENT16', + 'DEPTH_COMPONENT24', + 'DEPTH_COMPONENT32F', + 'DEPTH_FUNC', + 'DEPTH_RANGE', + 'DEPTH_STENCIL', + 'DEPTH_STENCIL_ATTACHMENT', + 'DEPTH_TEST', + 'DEPTH_WRITEMASK', + 'DEVICE_INELIGIBLE', + 'DIRECTION_DOWN', + 'DIRECTION_LEFT', + 'DIRECTION_RIGHT', + 'DIRECTION_UP', + 'DISABLED', + 'DISPATCH_REQUEST_ERR', + 'DITHER', + 'DOCUMENT_FRAGMENT_NODE', + 'DOCUMENT_NODE', + 'DOCUMENT_POSITION_CONTAINED_BY', + 'DOCUMENT_POSITION_CONTAINS', + 'DOCUMENT_POSITION_DISCONNECTED', + 'DOCUMENT_POSITION_FOLLOWING', + 'DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC', + 'DOCUMENT_POSITION_PRECEDING', + 'DOCUMENT_TYPE_NODE', + 'DOMCursor', + 'DOMError', + 'DOMException', + 'DOMImplementation', + 'DOMImplementationLS', + 'DOMMatrix', + 'DOMMatrixReadOnly', + 'DOMParser', + 'DOMPoint', + 'DOMPointReadOnly', + 'DOMQuad', + 'DOMRect', + 'DOMRectList', + 'DOMRectReadOnly', + 'DOMRequest', + 'DOMSTRING_SIZE_ERR', + 'DOMSettableTokenList', + 'DOMStringList', + 'DOMStringMap', + 'DOMTokenList', + 'DOMTransactionEvent', + 'DOM_DELTA_LINE', + 'DOM_DELTA_PAGE', + 'DOM_DELTA_PIXEL', + 'DOM_INPUT_METHOD_DROP', + 'DOM_INPUT_METHOD_HANDWRITING', + 'DOM_INPUT_METHOD_IME', + 'DOM_INPUT_METHOD_KEYBOARD', + 'DOM_INPUT_METHOD_MULTIMODAL', + 'DOM_INPUT_METHOD_OPTION', + 'DOM_INPUT_METHOD_PASTE', + 'DOM_INPUT_METHOD_SCRIPT', + 'DOM_INPUT_METHOD_UNKNOWN', + 'DOM_INPUT_METHOD_VOICE', + 'DOM_KEY_LOCATION_JOYSTICK', + 'DOM_KEY_LOCATION_LEFT', + 'DOM_KEY_LOCATION_MOBILE', + 'DOM_KEY_LOCATION_NUMPAD', + 'DOM_KEY_LOCATION_RIGHT', + 'DOM_KEY_LOCATION_STANDARD', + 'DOM_VK_0', + 'DOM_VK_1', + 'DOM_VK_2', + 'DOM_VK_3', + 'DOM_VK_4', + 'DOM_VK_5', + 'DOM_VK_6', + 'DOM_VK_7', + 'DOM_VK_8', + 'DOM_VK_9', + 'DOM_VK_A', + 'DOM_VK_ACCEPT', + 'DOM_VK_ADD', + 'DOM_VK_ALT', + 'DOM_VK_ALTGR', + 'DOM_VK_AMPERSAND', + 'DOM_VK_ASTERISK', + 'DOM_VK_AT', + 'DOM_VK_ATTN', + 'DOM_VK_B', + 'DOM_VK_BACKSPACE', + 'DOM_VK_BACK_QUOTE', + 'DOM_VK_BACK_SLASH', + 'DOM_VK_BACK_SPACE', + 'DOM_VK_C', + 'DOM_VK_CANCEL', + 'DOM_VK_CAPS_LOCK', + 'DOM_VK_CIRCUMFLEX', + 'DOM_VK_CLEAR', + 'DOM_VK_CLOSE_BRACKET', + 'DOM_VK_CLOSE_CURLY_BRACKET', + 'DOM_VK_CLOSE_PAREN', + 'DOM_VK_COLON', + 'DOM_VK_COMMA', + 'DOM_VK_CONTEXT_MENU', + 'DOM_VK_CONTROL', + 'DOM_VK_CONVERT', + 'DOM_VK_CRSEL', + 'DOM_VK_CTRL', + 'DOM_VK_D', + 'DOM_VK_DECIMAL', + 'DOM_VK_DELETE', + 'DOM_VK_DIVIDE', + 'DOM_VK_DOLLAR', + 'DOM_VK_DOUBLE_QUOTE', + 'DOM_VK_DOWN', + 'DOM_VK_E', + 'DOM_VK_EISU', + 'DOM_VK_END', + 'DOM_VK_ENTER', + 'DOM_VK_EQUALS', + 'DOM_VK_EREOF', + 'DOM_VK_ESCAPE', + 'DOM_VK_EXCLAMATION', + 'DOM_VK_EXECUTE', + 'DOM_VK_EXSEL', + 'DOM_VK_F', + 'DOM_VK_F1', + 'DOM_VK_F10', + 'DOM_VK_F11', + 'DOM_VK_F12', + 'DOM_VK_F13', + 'DOM_VK_F14', + 'DOM_VK_F15', + 'DOM_VK_F16', + 'DOM_VK_F17', + 'DOM_VK_F18', + 'DOM_VK_F19', + 'DOM_VK_F2', + 'DOM_VK_F20', + 'DOM_VK_F21', + 'DOM_VK_F22', + 'DOM_VK_F23', + 'DOM_VK_F24', + 'DOM_VK_F25', + 'DOM_VK_F26', + 'DOM_VK_F27', + 'DOM_VK_F28', + 'DOM_VK_F29', + 'DOM_VK_F3', + 'DOM_VK_F30', + 'DOM_VK_F31', + 'DOM_VK_F32', + 'DOM_VK_F33', + 'DOM_VK_F34', + 'DOM_VK_F35', + 'DOM_VK_F36', + 'DOM_VK_F4', + 'DOM_VK_F5', + 'DOM_VK_F6', + 'DOM_VK_F7', + 'DOM_VK_F8', + 'DOM_VK_F9', + 'DOM_VK_FINAL', + 'DOM_VK_FRONT', + 'DOM_VK_G', + 'DOM_VK_GREATER_THAN', + 'DOM_VK_H', + 'DOM_VK_HANGUL', + 'DOM_VK_HANJA', + 'DOM_VK_HASH', + 'DOM_VK_HELP', + 'DOM_VK_HK_TOGGLE', + 'DOM_VK_HOME', + 'DOM_VK_HYPHEN_MINUS', + 'DOM_VK_I', + 'DOM_VK_INSERT', + 'DOM_VK_J', + 'DOM_VK_JUNJA', + 'DOM_VK_K', + 'DOM_VK_KANA', + 'DOM_VK_KANJI', + 'DOM_VK_L', + 'DOM_VK_LEFT', + 'DOM_VK_LEFT_TAB', + 'DOM_VK_LESS_THAN', + 'DOM_VK_M', + 'DOM_VK_META', + 'DOM_VK_MODECHANGE', + 'DOM_VK_MULTIPLY', + 'DOM_VK_N', + 'DOM_VK_NONCONVERT', + 'DOM_VK_NUMPAD0', + 'DOM_VK_NUMPAD1', + 'DOM_VK_NUMPAD2', + 'DOM_VK_NUMPAD3', + 'DOM_VK_NUMPAD4', + 'DOM_VK_NUMPAD5', + 'DOM_VK_NUMPAD6', + 'DOM_VK_NUMPAD7', + 'DOM_VK_NUMPAD8', + 'DOM_VK_NUMPAD9', + 'DOM_VK_NUM_LOCK', + 'DOM_VK_O', + 'DOM_VK_OEM_1', + 'DOM_VK_OEM_102', + 'DOM_VK_OEM_2', + 'DOM_VK_OEM_3', + 'DOM_VK_OEM_4', + 'DOM_VK_OEM_5', + 'DOM_VK_OEM_6', + 'DOM_VK_OEM_7', + 'DOM_VK_OEM_8', + 'DOM_VK_OEM_COMMA', + 'DOM_VK_OEM_MINUS', + 'DOM_VK_OEM_PERIOD', + 'DOM_VK_OEM_PLUS', + 'DOM_VK_OPEN_BRACKET', + 'DOM_VK_OPEN_CURLY_BRACKET', + 'DOM_VK_OPEN_PAREN', + 'DOM_VK_P', + 'DOM_VK_PA1', + 'DOM_VK_PAGEDOWN', + 'DOM_VK_PAGEUP', + 'DOM_VK_PAGE_DOWN', + 'DOM_VK_PAGE_UP', + 'DOM_VK_PAUSE', + 'DOM_VK_PERCENT', + 'DOM_VK_PERIOD', + 'DOM_VK_PIPE', + 'DOM_VK_PLAY', + 'DOM_VK_PLUS', + 'DOM_VK_PRINT', + 'DOM_VK_PRINTSCREEN', + 'DOM_VK_PROCESSKEY', + 'DOM_VK_PROPERITES', + 'DOM_VK_Q', + 'DOM_VK_QUESTION_MARK', + 'DOM_VK_QUOTE', + 'DOM_VK_R', + 'DOM_VK_REDO', + 'DOM_VK_RETURN', + 'DOM_VK_RIGHT', + 'DOM_VK_S', + 'DOM_VK_SCROLL_LOCK', + 'DOM_VK_SELECT', + 'DOM_VK_SEMICOLON', + 'DOM_VK_SEPARATOR', + 'DOM_VK_SHIFT', + 'DOM_VK_SLASH', + 'DOM_VK_SLEEP', + 'DOM_VK_SPACE', + 'DOM_VK_SUBTRACT', + 'DOM_VK_T', + 'DOM_VK_TAB', + 'DOM_VK_TILDE', + 'DOM_VK_U', + 'DOM_VK_UNDERSCORE', + 'DOM_VK_UNDO', + 'DOM_VK_UNICODE', + 'DOM_VK_UP', + 'DOM_VK_V', + 'DOM_VK_VOLUME_DOWN', + 'DOM_VK_VOLUME_MUTE', + 'DOM_VK_VOLUME_UP', + 'DOM_VK_W', + 'DOM_VK_WIN', + 'DOM_VK_WINDOW', + 'DOM_VK_WIN_ICO_00', + 'DOM_VK_WIN_ICO_CLEAR', + 'DOM_VK_WIN_ICO_HELP', + 'DOM_VK_WIN_OEM_ATTN', + 'DOM_VK_WIN_OEM_AUTO', + 'DOM_VK_WIN_OEM_BACKTAB', + 'DOM_VK_WIN_OEM_CLEAR', + 'DOM_VK_WIN_OEM_COPY', + 'DOM_VK_WIN_OEM_CUSEL', + 'DOM_VK_WIN_OEM_ENLW', + 'DOM_VK_WIN_OEM_FINISH', + 'DOM_VK_WIN_OEM_FJ_JISHO', + 'DOM_VK_WIN_OEM_FJ_LOYA', + 'DOM_VK_WIN_OEM_FJ_MASSHOU', + 'DOM_VK_WIN_OEM_FJ_ROYA', + 'DOM_VK_WIN_OEM_FJ_TOUROKU', + 'DOM_VK_WIN_OEM_JUMP', + 'DOM_VK_WIN_OEM_PA1', + 'DOM_VK_WIN_OEM_PA2', + 'DOM_VK_WIN_OEM_PA3', + 'DOM_VK_WIN_OEM_RESET', + 'DOM_VK_WIN_OEM_WSCTRL', + 'DOM_VK_X', + 'DOM_VK_XF86XK_ADD_FAVORITE', + 'DOM_VK_XF86XK_APPLICATION_LEFT', + 'DOM_VK_XF86XK_APPLICATION_RIGHT', + 'DOM_VK_XF86XK_AUDIO_CYCLE_TRACK', + 'DOM_VK_XF86XK_AUDIO_FORWARD', + 'DOM_VK_XF86XK_AUDIO_LOWER_VOLUME', + 'DOM_VK_XF86XK_AUDIO_MEDIA', + 'DOM_VK_XF86XK_AUDIO_MUTE', + 'DOM_VK_XF86XK_AUDIO_NEXT', + 'DOM_VK_XF86XK_AUDIO_PAUSE', + 'DOM_VK_XF86XK_AUDIO_PLAY', + 'DOM_VK_XF86XK_AUDIO_PREV', + 'DOM_VK_XF86XK_AUDIO_RAISE_VOLUME', + 'DOM_VK_XF86XK_AUDIO_RANDOM_PLAY', + 'DOM_VK_XF86XK_AUDIO_RECORD', + 'DOM_VK_XF86XK_AUDIO_REPEAT', + 'DOM_VK_XF86XK_AUDIO_REWIND', + 'DOM_VK_XF86XK_AUDIO_STOP', + 'DOM_VK_XF86XK_AWAY', + 'DOM_VK_XF86XK_BACK', + 'DOM_VK_XF86XK_BACK_FORWARD', + 'DOM_VK_XF86XK_BATTERY', + 'DOM_VK_XF86XK_BLUE', + 'DOM_VK_XF86XK_BLUETOOTH', + 'DOM_VK_XF86XK_BOOK', + 'DOM_VK_XF86XK_BRIGHTNESS_ADJUST', + 'DOM_VK_XF86XK_CALCULATOR', + 'DOM_VK_XF86XK_CALENDAR', + 'DOM_VK_XF86XK_CD', + 'DOM_VK_XF86XK_CLOSE', + 'DOM_VK_XF86XK_COMMUNITY', + 'DOM_VK_XF86XK_CONTRAST_ADJUST', + 'DOM_VK_XF86XK_COPY', + 'DOM_VK_XF86XK_CUT', + 'DOM_VK_XF86XK_CYCLE_ANGLE', + 'DOM_VK_XF86XK_DISPLAY', + 'DOM_VK_XF86XK_DOCUMENTS', + 'DOM_VK_XF86XK_DOS', + 'DOM_VK_XF86XK_EJECT', + 'DOM_VK_XF86XK_EXCEL', + 'DOM_VK_XF86XK_EXPLORER', + 'DOM_VK_XF86XK_FAVORITES', + 'DOM_VK_XF86XK_FINANCE', + 'DOM_VK_XF86XK_FORWARD', + 'DOM_VK_XF86XK_FRAME_BACK', + 'DOM_VK_XF86XK_FRAME_FORWARD', + 'DOM_VK_XF86XK_GAME', + 'DOM_VK_XF86XK_GO', + 'DOM_VK_XF86XK_GREEN', + 'DOM_VK_XF86XK_HIBERNATE', + 'DOM_VK_XF86XK_HISTORY', + 'DOM_VK_XF86XK_HOME_PAGE', + 'DOM_VK_XF86XK_HOT_LINKS', + 'DOM_VK_XF86XK_I_TOUCH', + 'DOM_VK_XF86XK_KBD_BRIGHTNESS_DOWN', + 'DOM_VK_XF86XK_KBD_BRIGHTNESS_UP', + 'DOM_VK_XF86XK_KBD_LIGHT_ON_OFF', + 'DOM_VK_XF86XK_LAUNCH0', + 'DOM_VK_XF86XK_LAUNCH1', + 'DOM_VK_XF86XK_LAUNCH2', + 'DOM_VK_XF86XK_LAUNCH3', + 'DOM_VK_XF86XK_LAUNCH4', + 'DOM_VK_XF86XK_LAUNCH5', + 'DOM_VK_XF86XK_LAUNCH6', + 'DOM_VK_XF86XK_LAUNCH7', + 'DOM_VK_XF86XK_LAUNCH8', + 'DOM_VK_XF86XK_LAUNCH9', + 'DOM_VK_XF86XK_LAUNCH_A', + 'DOM_VK_XF86XK_LAUNCH_B', + 'DOM_VK_XF86XK_LAUNCH_C', + 'DOM_VK_XF86XK_LAUNCH_D', + 'DOM_VK_XF86XK_LAUNCH_E', + 'DOM_VK_XF86XK_LAUNCH_F', + 'DOM_VK_XF86XK_LIGHT_BULB', + 'DOM_VK_XF86XK_LOG_OFF', + 'DOM_VK_XF86XK_MAIL', + 'DOM_VK_XF86XK_MAIL_FORWARD', + 'DOM_VK_XF86XK_MARKET', + 'DOM_VK_XF86XK_MEETING', + 'DOM_VK_XF86XK_MEMO', + 'DOM_VK_XF86XK_MENU_KB', + 'DOM_VK_XF86XK_MENU_PB', + 'DOM_VK_XF86XK_MESSENGER', + 'DOM_VK_XF86XK_MON_BRIGHTNESS_DOWN', + 'DOM_VK_XF86XK_MON_BRIGHTNESS_UP', + 'DOM_VK_XF86XK_MUSIC', + 'DOM_VK_XF86XK_MY_COMPUTER', + 'DOM_VK_XF86XK_MY_SITES', + 'DOM_VK_XF86XK_NEW', + 'DOM_VK_XF86XK_NEWS', + 'DOM_VK_XF86XK_OFFICE_HOME', + 'DOM_VK_XF86XK_OPEN', + 'DOM_VK_XF86XK_OPEN_URL', + 'DOM_VK_XF86XK_OPTION', + 'DOM_VK_XF86XK_PASTE', + 'DOM_VK_XF86XK_PHONE', + 'DOM_VK_XF86XK_PICTURES', + 'DOM_VK_XF86XK_POWER_DOWN', + 'DOM_VK_XF86XK_POWER_OFF', + 'DOM_VK_XF86XK_RED', + 'DOM_VK_XF86XK_REFRESH', + 'DOM_VK_XF86XK_RELOAD', + 'DOM_VK_XF86XK_REPLY', + 'DOM_VK_XF86XK_ROCKER_DOWN', + 'DOM_VK_XF86XK_ROCKER_ENTER', + 'DOM_VK_XF86XK_ROCKER_UP', + 'DOM_VK_XF86XK_ROTATE_WINDOWS', + 'DOM_VK_XF86XK_ROTATION_KB', + 'DOM_VK_XF86XK_ROTATION_PB', + 'DOM_VK_XF86XK_SAVE', + 'DOM_VK_XF86XK_SCREEN_SAVER', + 'DOM_VK_XF86XK_SCROLL_CLICK', + 'DOM_VK_XF86XK_SCROLL_DOWN', + 'DOM_VK_XF86XK_SCROLL_UP', + 'DOM_VK_XF86XK_SEARCH', + 'DOM_VK_XF86XK_SEND', + 'DOM_VK_XF86XK_SHOP', + 'DOM_VK_XF86XK_SPELL', + 'DOM_VK_XF86XK_SPLIT_SCREEN', + 'DOM_VK_XF86XK_STANDBY', + 'DOM_VK_XF86XK_START', + 'DOM_VK_XF86XK_STOP', + 'DOM_VK_XF86XK_SUBTITLE', + 'DOM_VK_XF86XK_SUPPORT', + 'DOM_VK_XF86XK_SUSPEND', + 'DOM_VK_XF86XK_TASK_PANE', + 'DOM_VK_XF86XK_TERMINAL', + 'DOM_VK_XF86XK_TIME', + 'DOM_VK_XF86XK_TOOLS', + 'DOM_VK_XF86XK_TOP_MENU', + 'DOM_VK_XF86XK_TO_DO_LIST', + 'DOM_VK_XF86XK_TRAVEL', + 'DOM_VK_XF86XK_USER1KB', + 'DOM_VK_XF86XK_USER2KB', + 'DOM_VK_XF86XK_USER_PB', + 'DOM_VK_XF86XK_UWB', + 'DOM_VK_XF86XK_VENDOR_HOME', + 'DOM_VK_XF86XK_VIDEO', + 'DOM_VK_XF86XK_VIEW', + 'DOM_VK_XF86XK_WAKE_UP', + 'DOM_VK_XF86XK_WEB_CAM', + 'DOM_VK_XF86XK_WHEEL_BUTTON', + 'DOM_VK_XF86XK_WLAN', + 'DOM_VK_XF86XK_WORD', + 'DOM_VK_XF86XK_WWW', + 'DOM_VK_XF86XK_XFER', + 'DOM_VK_XF86XK_YELLOW', + 'DOM_VK_XF86XK_ZOOM_IN', + 'DOM_VK_XF86XK_ZOOM_OUT', + 'DOM_VK_Y', + 'DOM_VK_Z', + 'DOM_VK_ZOOM', + 'DONE', + 'DONT_CARE', + 'DOWNLOADING', + 'DRAGDROP', + 'DRAW_BUFFER0', + 'DRAW_BUFFER1', + 'DRAW_BUFFER10', + 'DRAW_BUFFER11', + 'DRAW_BUFFER12', + 'DRAW_BUFFER13', + 'DRAW_BUFFER14', + 'DRAW_BUFFER15', + 'DRAW_BUFFER2', + 'DRAW_BUFFER3', + 'DRAW_BUFFER4', + 'DRAW_BUFFER5', + 'DRAW_BUFFER6', + 'DRAW_BUFFER7', + 'DRAW_BUFFER8', + 'DRAW_BUFFER9', + 'DRAW_FRAMEBUFFER', + 'DRAW_FRAMEBUFFER_BINDING', + 'DST_ALPHA', + 'DST_COLOR', + 'DYNAMIC_COPY', + 'DYNAMIC_DRAW', + 'DYNAMIC_READ', + 'DataChannel', + 'DataTransfer', + 'DataTransferItem', + 'DataTransferItemList', + 'DataView', + 'Date', + 'DateTimeFormat', + 'DecompressionStream', + 'DelayNode', + 'DeprecationReportBody', + 'DesktopNotification', + 'DesktopNotificationCenter', + 'DeviceLightEvent', + 'DeviceMotionEvent', + 'DeviceMotionEventAcceleration', + 'DeviceMotionEventRotationRate', + 'DeviceOrientationEvent', + 'DeviceProximityEvent', + 'DeviceStorage', + 'DeviceStorageChangeEvent', + 'Directory', + 'DisplayNames', + 'Document', + 'DocumentFragment', + 'DocumentTimeline', + 'DocumentType', + 'DragEvent', + 'DynamicsCompressorNode', + 'E', + 'ELEMENT_ARRAY_BUFFER', + 'ELEMENT_ARRAY_BUFFER_BINDING', + 'ELEMENT_NODE', + 'EMPTY', + 'ENCODING_ERR', + 'ENDED', + 'END_TO_END', + 'END_TO_START', + 'ENTITY_NODE', + 'ENTITY_REFERENCE_NODE', + 'EPSILON', + 'EQUAL', + 'EQUALPOWER', + 'ERROR', + 'EXPONENTIAL_DISTANCE', + 'Element', + 'ElementInternals', + 'ElementQuery', + 'EnterPictureInPictureEvent', + 'Entity', + 'EntityReference', + 'Error', + 'ErrorEvent', + 'EvalError', + 'Event', + 'EventException', + 'EventSource', + 'EventTarget', + 'External', + 'FASTEST', + 'FIDOSDK', + 'FILTER_ACCEPT', + 'FILTER_INTERRUPT', + 'FILTER_REJECT', + 'FILTER_SKIP', + 'FINISHED_STATE', + 'FIRST_ORDERED_NODE_TYPE', + 'FLOAT', + 'FLOAT_32_UNSIGNED_INT_24_8_REV', + 'FLOAT_MAT2', + 'FLOAT_MAT2x3', + 'FLOAT_MAT2x4', + 'FLOAT_MAT3', + 'FLOAT_MAT3x2', + 'FLOAT_MAT3x4', + 'FLOAT_MAT4', + 'FLOAT_MAT4x2', + 'FLOAT_MAT4x3', + 'FLOAT_VEC2', + 'FLOAT_VEC3', + 'FLOAT_VEC4', + 'FOCUS', + 'FONT_FACE_RULE', + 'FONT_FEATURE_VALUES_RULE', + 'FRAGMENT_SHADER', + 'FRAGMENT_SHADER_DERIVATIVE_HINT', + 'FRAGMENT_SHADER_DERIVATIVE_HINT_OES', + 'FRAMEBUFFER', + 'FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE', + 'FRAMEBUFFER_ATTACHMENT_BLUE_SIZE', + 'FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING', + 'FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE', + 'FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE', + 'FRAMEBUFFER_ATTACHMENT_GREEN_SIZE', + 'FRAMEBUFFER_ATTACHMENT_OBJECT_NAME', + 'FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE', + 'FRAMEBUFFER_ATTACHMENT_RED_SIZE', + 'FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE', + 'FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE', + 'FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER', + 'FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL', + 'FRAMEBUFFER_BINDING', + 'FRAMEBUFFER_COMPLETE', + 'FRAMEBUFFER_DEFAULT', + 'FRAMEBUFFER_INCOMPLETE_ATTACHMENT', + 'FRAMEBUFFER_INCOMPLETE_DIMENSIONS', + 'FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT', + 'FRAMEBUFFER_INCOMPLETE_MULTISAMPLE', + 'FRAMEBUFFER_UNSUPPORTED', + 'FRONT', + 'FRONT_AND_BACK', + 'FRONT_FACE', + 'FUNC_ADD', + 'FUNC_REVERSE_SUBTRACT', + 'FUNC_SUBTRACT', + 'FeaturePolicy', + 'FeaturePolicyViolationReportBody', + 'FederatedCredential', + 'Feed', + 'FeedEntry', + 'File', + 'FileError', + 'FileList', + 'FileReader', + 'FileSystem', + 'FileSystemDirectoryEntry', + 'FileSystemDirectoryReader', + 'FileSystemEntry', + 'FileSystemFileEntry', + 'FinalizationRegistry', + 'FindInPage', + 'Float32Array', + 'Float64Array', + 'FocusEvent', + 'FontFace', + 'FontFaceSet', + 'FontFaceSetLoadEvent', + 'FormData', + 'FormDataEvent', + 'FragmentDirective', + 'Function', + 'GENERATE_MIPMAP_HINT', + 'GEQUAL', + 'GREATER', + 'GREEN_BITS', + 'GainNode', + 'Gamepad', + 'GamepadAxisMoveEvent', + 'GamepadButton', + 'GamepadButtonEvent', + 'GamepadEvent', + 'GamepadHapticActuator', + 'GamepadPose', + 'Geolocation', + 'GeolocationCoordinates', + 'GeolocationPosition', + 'GeolocationPositionError', + 'GestureEvent', + 'Global', + 'Gyroscope', + 'HALF_FLOAT', + 'HAVE_CURRENT_DATA', + 'HAVE_ENOUGH_DATA', + 'HAVE_FUTURE_DATA', + 'HAVE_METADATA', + 'HAVE_NOTHING', + 'HEADERS_RECEIVED', + 'HIDDEN', + 'HIERARCHY_REQUEST_ERR', + 'HIGHPASS', + 'HIGHSHELF', + 'HIGH_FLOAT', + 'HIGH_INT', + 'HORIZONTAL', + 'HORIZONTAL_AXIS', + 'HRTF', + 'HTMLAllCollection', + 'HTMLAnchorElement', + 'HTMLAppletElement', + 'HTMLAreaElement', + 'HTMLAudioElement', + 'HTMLBRElement', + 'HTMLBaseElement', + 'HTMLBaseFontElement', + 'HTMLBlockquoteElement', + 'HTMLBodyElement', + 'HTMLButtonElement', + 'HTMLCanvasElement', + 'HTMLCollection', + 'HTMLCommandElement', + 'HTMLContentElement', + 'HTMLDListElement', + 'HTMLDataElement', + 'HTMLDataListElement', + 'HTMLDetailsElement', + 'HTMLDialogElement', + 'HTMLDirectoryElement', + 'HTMLDivElement', + 'HTMLDocument', + 'HTMLElement', + 'HTMLEmbedElement', + 'HTMLFieldSetElement', + 'HTMLFontElement', + 'HTMLFormControlsCollection', + 'HTMLFormElement', + 'HTMLFrameElement', + 'HTMLFrameSetElement', + 'HTMLHRElement', + 'HTMLHeadElement', + 'HTMLHeadingElement', + 'HTMLHtmlElement', + 'HTMLIFrameElement', + 'HTMLImageElement', + 'HTMLInputElement', + 'HTMLIsIndexElement', + 'HTMLKeygenElement', + 'HTMLLIElement', + 'HTMLLabelElement', + 'HTMLLegendElement', + 'HTMLLinkElement', + 'HTMLMapElement', + 'HTMLMarqueeElement', + 'HTMLMediaElement', + 'HTMLMenuElement', + 'HTMLMenuItemElement', + 'HTMLMetaElement', + 'HTMLMeterElement', + 'HTMLModElement', + 'HTMLOListElement', + 'HTMLObjectElement', + 'HTMLOptGroupElement', + 'HTMLOptionElement', + 'HTMLOptionsCollection', + 'HTMLOutputElement', + 'HTMLParagraphElement', + 'HTMLParamElement', + 'HTMLPictureElement', + 'HTMLPreElement', + 'HTMLProgressElement', + 'HTMLPropertiesCollection', + 'HTMLQuoteElement', + 'HTMLScriptElement', + 'HTMLSelectElement', + 'HTMLShadowElement', + 'HTMLSlotElement', + 'HTMLSourceElement', + 'HTMLSpanElement', + 'HTMLStyleElement', + 'HTMLTableCaptionElement', + 'HTMLTableCellElement', + 'HTMLTableColElement', + 'HTMLTableElement', + 'HTMLTableRowElement', + 'HTMLTableSectionElement', + 'HTMLTemplateElement', + 'HTMLTextAreaElement', + 'HTMLTimeElement', + 'HTMLTitleElement', + 'HTMLTrackElement', + 'HTMLUListElement', + 'HTMLUnknownElement', + 'HTMLVideoElement', + 'HashChangeEvent', + 'Headers', + 'History', + 'Hz', + 'ICE_CHECKING', + 'ICE_CLOSED', + 'ICE_COMPLETED', + 'ICE_CONNECTED', + 'ICE_FAILED', + 'ICE_GATHERING', + 'ICE_WAITING', + 'IDBCursor', + 'IDBCursorWithValue', + 'IDBDatabase', + 'IDBDatabaseException', + 'IDBFactory', + 'IDBFileHandle', + 'IDBFileRequest', + 'IDBIndex', + 'IDBKeyRange', + 'IDBMutableFile', + 'IDBObjectStore', + 'IDBOpenDBRequest', + 'IDBRequest', + 'IDBTransaction', + 'IDBVersionChangeEvent', + 'IDLE', + 'IIRFilterNode', + 'IMPLEMENTATION_COLOR_READ_FORMAT', + 'IMPLEMENTATION_COLOR_READ_TYPE', + 'IMPORT_RULE', + 'INCR', + 'INCR_WRAP', + 'INDEX_SIZE_ERR', + 'INT', + 'INTERLEAVED_ATTRIBS', + 'INT_2_10_10_10_REV', + 'INT_SAMPLER_2D', + 'INT_SAMPLER_2D_ARRAY', + 'INT_SAMPLER_3D', + 'INT_SAMPLER_CUBE', + 'INT_VEC2', + 'INT_VEC3', + 'INT_VEC4', + 'INUSE_ATTRIBUTE_ERR', + 'INVALID_ACCESS_ERR', + 'INVALID_CHARACTER_ERR', + 'INVALID_ENUM', + 'INVALID_EXPRESSION_ERR', + 'INVALID_FRAMEBUFFER_OPERATION', + 'INVALID_INDEX', + 'INVALID_MODIFICATION_ERR', + 'INVALID_NODE_TYPE_ERR', + 'INVALID_OPERATION', + 'INVALID_STATE_ERR', + 'INVALID_VALUE', + 'INVERSE_DISTANCE', + 'INVERT', + 'IceCandidate', + 'IdleDeadline', + 'Image', + 'ImageBitmap', + 'ImageBitmapRenderingContext', + 'ImageCapture', + 'ImageData', + 'Infinity', + 'InputDeviceCapabilities', + 'InputDeviceInfo', + 'InputEvent', + 'InputMethodContext', + 'InstallTrigger', + 'InstallTriggerImpl', + 'Instance', + 'Int16Array', + 'Int32Array', + 'Int8Array', + 'Intent', + 'InternalError', + 'IntersectionObserver', + 'IntersectionObserverEntry', + 'Intl', + 'IsSearchProviderInstalled', + 'Iterator', + 'JSON', + 'KEEP', + 'KEYDOWN', + 'KEYFRAMES_RULE', + 'KEYFRAME_RULE', + 'KEYPRESS', + 'KEYUP', + 'KeyEvent', + 'Keyboard', + 'KeyboardEvent', + 'KeyboardLayoutMap', + 'KeyframeEffect', + 'LENGTHADJUST_SPACING', + 'LENGTHADJUST_SPACINGANDGLYPHS', + 'LENGTHADJUST_UNKNOWN', + 'LEQUAL', + 'LESS', + 'LINEAR', + 'LINEAR_DISTANCE', + 'LINEAR_MIPMAP_LINEAR', + 'LINEAR_MIPMAP_NEAREST', + 'LINES', + 'LINE_LOOP', + 'LINE_STRIP', + 'LINE_WIDTH', + 'LINK_STATUS', + 'LIVE', + 'LN10', + 'LN2', + 'LOADED', + 'LOADING', + 'LOG10E', + 'LOG2E', + 'LOWPASS', + 'LOWSHELF', + 'LOW_FLOAT', + 'LOW_INT', + 'LSException', + 'LSParserFilter', + 'LUMINANCE', + 'LUMINANCE_ALPHA', + 'LargestContentfulPaint', + 'LayoutShift', + 'LayoutShiftAttribution', + 'LinearAccelerationSensor', + 'LinkError', + 'ListFormat', + 'LocalMediaStream', + 'Locale', + 'Location', + 'Lock', + 'LockManager', + 'MAX', + 'MAX_3D_TEXTURE_SIZE', + 'MAX_ARRAY_TEXTURE_LAYERS', + 'MAX_CLIENT_WAIT_TIMEOUT_WEBGL', + 'MAX_COLOR_ATTACHMENTS', + 'MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS', + 'MAX_COMBINED_TEXTURE_IMAGE_UNITS', + 'MAX_COMBINED_UNIFORM_BLOCKS', + 'MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS', + 'MAX_CUBE_MAP_TEXTURE_SIZE', + 'MAX_DRAW_BUFFERS', + 'MAX_ELEMENTS_INDICES', + 'MAX_ELEMENTS_VERTICES', + 'MAX_ELEMENT_INDEX', + 'MAX_FRAGMENT_INPUT_COMPONENTS', + 'MAX_FRAGMENT_UNIFORM_BLOCKS', + 'MAX_FRAGMENT_UNIFORM_COMPONENTS', + 'MAX_FRAGMENT_UNIFORM_VECTORS', + 'MAX_PROGRAM_TEXEL_OFFSET', + 'MAX_RENDERBUFFER_SIZE', + 'MAX_SAFE_INTEGER', + 'MAX_SAMPLES', + 'MAX_SERVER_WAIT_TIMEOUT', + 'MAX_TEXTURE_IMAGE_UNITS', + 'MAX_TEXTURE_LOD_BIAS', + 'MAX_TEXTURE_MAX_ANISOTROPY_EXT', + 'MAX_TEXTURE_SIZE', + 'MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS', + 'MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS', + 'MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS', + 'MAX_UNIFORM_BLOCK_SIZE', + 'MAX_UNIFORM_BUFFER_BINDINGS', + 'MAX_VALUE', + 'MAX_VARYING_COMPONENTS', + 'MAX_VARYING_VECTORS', + 'MAX_VERTEX_ATTRIBS', + 'MAX_VERTEX_OUTPUT_COMPONENTS', + 'MAX_VERTEX_TEXTURE_IMAGE_UNITS', + 'MAX_VERTEX_UNIFORM_BLOCKS', + 'MAX_VERTEX_UNIFORM_COMPONENTS', + 'MAX_VERTEX_UNIFORM_VECTORS', + 'MAX_VIEWPORT_DIMS', + 'MEDIA_ERR_ABORTED', + 'MEDIA_ERR_DECODE', + 'MEDIA_ERR_ENCRYPTED', + 'MEDIA_ERR_NETWORK', + 'MEDIA_ERR_SRC_NOT_SUPPORTED', + 'MEDIA_KEYERR_CLIENT', + 'MEDIA_KEYERR_DOMAIN', + 'MEDIA_KEYERR_HARDWARECHANGE', + 'MEDIA_KEYERR_OUTPUT', + 'MEDIA_KEYERR_SERVICE', + 'MEDIA_KEYERR_UNKNOWN', + 'MEDIA_RULE', + 'MEDIUM_FLOAT', + 'MEDIUM_INT', + 'META_MASK', + 'MIDIAccess', + 'MIDIConnectionEvent', + 'MIDIInput', + 'MIDIInputMap', + 'MIDIMessageEvent', + 'MIDIOutput', + 'MIDIOutputMap', + 'MIDIPort', + 'MIN', + 'MIN_PROGRAM_TEXEL_OFFSET', + 'MIN_SAFE_INTEGER', + 'MIN_VALUE', + 'MIRRORED_REPEAT', + 'MODE_ASYNCHRONOUS', + 'MODE_SYNCHRONOUS', + 'MODIFICATION', + 'MOUSEDOWN', + 'MOUSEDRAG', + 'MOUSEMOVE', + 'MOUSEOUT', + 'MOUSEOVER', + 'MOUSEUP', + 'MOZ_KEYFRAMES_RULE', + 'MOZ_KEYFRAME_RULE', + 'MOZ_SOURCE_CURSOR', + 'MOZ_SOURCE_ERASER', + 'MOZ_SOURCE_KEYBOARD', + 'MOZ_SOURCE_MOUSE', + 'MOZ_SOURCE_PEN', + 'MOZ_SOURCE_TOUCH', + 'MOZ_SOURCE_UNKNOWN', + 'MSGESTURE_FLAG_BEGIN', + 'MSGESTURE_FLAG_CANCEL', + 'MSGESTURE_FLAG_END', + 'MSGESTURE_FLAG_INERTIA', + 'MSGESTURE_FLAG_NONE', + 'MSPOINTER_TYPE_MOUSE', + 'MSPOINTER_TYPE_PEN', + 'MSPOINTER_TYPE_TOUCH', + 'MS_ASYNC_CALLBACK_STATUS_ASSIGN_DELEGATE', + 'MS_ASYNC_CALLBACK_STATUS_CANCEL', + 'MS_ASYNC_CALLBACK_STATUS_CHOOSEANY', + 'MS_ASYNC_CALLBACK_STATUS_ERROR', + 'MS_ASYNC_CALLBACK_STATUS_JOIN', + 'MS_ASYNC_OP_STATUS_CANCELED', + 'MS_ASYNC_OP_STATUS_ERROR', + 'MS_ASYNC_OP_STATUS_SUCCESS', + 'MS_MANIPULATION_STATE_ACTIVE', + 'MS_MANIPULATION_STATE_CANCELLED', + 'MS_MANIPULATION_STATE_COMMITTED', + 'MS_MANIPULATION_STATE_DRAGGING', + 'MS_MANIPULATION_STATE_INERTIA', + 'MS_MANIPULATION_STATE_PRESELECT', + 'MS_MANIPULATION_STATE_SELECTING', + 'MS_MANIPULATION_STATE_STOPPED', + 'MS_MEDIA_ERR_ENCRYPTED', + 'MS_MEDIA_KEYERR_CLIENT', + 'MS_MEDIA_KEYERR_DOMAIN', + 'MS_MEDIA_KEYERR_HARDWARECHANGE', + 'MS_MEDIA_KEYERR_OUTPUT', + 'MS_MEDIA_KEYERR_SERVICE', + 'MS_MEDIA_KEYERR_UNKNOWN', + 'Map', + 'Math', + 'MathMLElement', + 'MediaCapabilities', + 'MediaCapabilitiesInfo', + 'MediaController', + 'MediaDeviceInfo', + 'MediaDevices', + 'MediaElementAudioSourceNode', + 'MediaEncryptedEvent', + 'MediaError', + 'MediaKeyError', + 'MediaKeyEvent', + 'MediaKeyMessageEvent', + 'MediaKeyNeededEvent', + 'MediaKeySession', + 'MediaKeyStatusMap', + 'MediaKeySystemAccess', + 'MediaKeys', + 'MediaList', + 'MediaMetadata', + 'MediaQueryList', + 'MediaQueryListEvent', + 'MediaRecorder', + 'MediaRecorderErrorEvent', + 'MediaSession', + 'MediaSettingsRange', + 'MediaSource', + 'MediaStream', + 'MediaStreamAudioDestinationNode', + 'MediaStreamAudioSourceNode', + 'MediaStreamEvent', + 'MediaStreamTrack', + 'MediaStreamTrackAudioSourceNode', + 'MediaStreamTrackEvent', + 'Memory', + 'MessageChannel', + 'MessageEvent', + 'MessagePort', + 'Methods', + 'MimeType', + 'MimeTypeArray', + 'Module', + 'MouseEvent', + 'MouseScrollEvent', + 'MozAnimation', + 'MozAnimationDelay', + 'MozAnimationDirection', + 'MozAnimationDuration', + 'MozAnimationFillMode', + 'MozAnimationIterationCount', + 'MozAnimationName', + 'MozAnimationPlayState', + 'MozAnimationTimingFunction', + 'MozAppearance', + 'MozBackfaceVisibility', + 'MozBinding', + 'MozBorderBottomColors', + 'MozBorderEnd', + 'MozBorderEndColor', + 'MozBorderEndStyle', + 'MozBorderEndWidth', + 'MozBorderImage', + 'MozBorderLeftColors', + 'MozBorderRightColors', + 'MozBorderStart', + 'MozBorderStartColor', + 'MozBorderStartStyle', + 'MozBorderStartWidth', + 'MozBorderTopColors', + 'MozBoxAlign', + 'MozBoxDirection', + 'MozBoxFlex', + 'MozBoxOrdinalGroup', + 'MozBoxOrient', + 'MozBoxPack', + 'MozBoxSizing', + 'MozCSSKeyframeRule', + 'MozCSSKeyframesRule', + 'MozColumnCount', + 'MozColumnFill', + 'MozColumnGap', + 'MozColumnRule', + 'MozColumnRuleColor', + 'MozColumnRuleStyle', + 'MozColumnRuleWidth', + 'MozColumnWidth', + 'MozColumns', + 'MozContactChangeEvent', + 'MozFloatEdge', + 'MozFontFeatureSettings', + 'MozFontLanguageOverride', + 'MozForceBrokenImageIcon', + 'MozHyphens', + 'MozImageRegion', + 'MozMarginEnd', + 'MozMarginStart', + 'MozMmsEvent', + 'MozMmsMessage', + 'MozMobileMessageThread', + 'MozOSXFontSmoothing', + 'MozOrient', + 'MozOsxFontSmoothing', + 'MozOutlineRadius', + 'MozOutlineRadiusBottomleft', + 'MozOutlineRadiusBottomright', + 'MozOutlineRadiusTopleft', + 'MozOutlineRadiusTopright', + 'MozPaddingEnd', + 'MozPaddingStart', + 'MozPerspective', + 'MozPerspectiveOrigin', + 'MozPowerManager', + 'MozSettingsEvent', + 'MozSmsEvent', + 'MozSmsMessage', + 'MozStackSizing', + 'MozTabSize', + 'MozTextAlignLast', + 'MozTextDecorationColor', + 'MozTextDecorationLine', + 'MozTextDecorationStyle', + 'MozTextSizeAdjust', + 'MozTransform', + 'MozTransformOrigin', + 'MozTransformStyle', + 'MozTransition', + 'MozTransitionDelay', + 'MozTransitionDuration', + 'MozTransitionProperty', + 'MozTransitionTimingFunction', + 'MozUserFocus', + 'MozUserInput', + 'MozUserModify', + 'MozUserSelect', + 'MozWindowDragging', + 'MozWindowShadow', + 'MutationEvent', + 'MutationObserver', + 'MutationRecord', + 'NAMESPACE_ERR', + 'NAMESPACE_RULE', + 'NEAREST', + 'NEAREST_MIPMAP_LINEAR', + 'NEAREST_MIPMAP_NEAREST', + 'NEGATIVE_INFINITY', + 'NETWORK_EMPTY', + 'NETWORK_ERR', + 'NETWORK_IDLE', + 'NETWORK_LOADED', + 'NETWORK_LOADING', + 'NETWORK_NO_SOURCE', + 'NEVER', + 'NEW', + 'NEXT', + 'NEXT_NO_DUPLICATE', + 'NICEST', + 'NODE_AFTER', + 'NODE_BEFORE', + 'NODE_BEFORE_AND_AFTER', + 'NODE_INSIDE', + 'NONE', + 'NON_TRANSIENT_ERR', + 'NOTATION_NODE', + 'NOTCH', + 'NOTEQUAL', + 'NOT_ALLOWED_ERR', + 'NOT_FOUND_ERR', + 'NOT_READABLE_ERR', + 'NOT_SUPPORTED_ERR', + 'NO_DATA_ALLOWED_ERR', + 'NO_ERR', + 'NO_ERROR', + 'NO_MODIFICATION_ALLOWED_ERR', + 'NUMBER_TYPE', + 'NUM_COMPRESSED_TEXTURE_FORMATS', + 'NaN', + 'NamedNodeMap', + 'NavigationPreloadManager', + 'Navigator', + 'NearbyLinks', + 'NetworkInformation', + 'Node', + 'NodeFilter', + 'NodeIterator', + 'NodeList', + 'Notation', + 'Notification', + 'NotifyPaintEvent', + 'Number', + 'NumberFormat', + 'OBJECT_TYPE', + 'OBSOLETE', + 'OK', + 'ONE', + 'ONE_MINUS_CONSTANT_ALPHA', + 'ONE_MINUS_CONSTANT_COLOR', + 'ONE_MINUS_DST_ALPHA', + 'ONE_MINUS_DST_COLOR', + 'ONE_MINUS_SRC_ALPHA', + 'ONE_MINUS_SRC_COLOR', + 'OPEN', + 'OPENED', + 'OPENING', + 'ORDERED_NODE_ITERATOR_TYPE', + 'ORDERED_NODE_SNAPSHOT_TYPE', + 'OTHER_ERROR', + 'OUT_OF_MEMORY', + 'Object', + 'OfflineAudioCompletionEvent', + 'OfflineAudioContext', + 'OfflineResourceList', + 'OffscreenCanvas', + 'OffscreenCanvasRenderingContext2D', + 'Option', + 'OrientationSensor', + 'OscillatorNode', + 'OverconstrainedError', + 'OverflowEvent', + 'PACK_ALIGNMENT', + 'PACK_ROW_LENGTH', + 'PACK_SKIP_PIXELS', + 'PACK_SKIP_ROWS', + 'PAGE_RULE', + 'PARSE_ERR', + 'PATHSEG_ARC_ABS', + 'PATHSEG_ARC_REL', + 'PATHSEG_CLOSEPATH', + 'PATHSEG_CURVETO_CUBIC_ABS', + 'PATHSEG_CURVETO_CUBIC_REL', + 'PATHSEG_CURVETO_CUBIC_SMOOTH_ABS', + 'PATHSEG_CURVETO_CUBIC_SMOOTH_REL', + 'PATHSEG_CURVETO_QUADRATIC_ABS', + 'PATHSEG_CURVETO_QUADRATIC_REL', + 'PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS', + 'PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL', + 'PATHSEG_LINETO_ABS', + 'PATHSEG_LINETO_HORIZONTAL_ABS', + 'PATHSEG_LINETO_HORIZONTAL_REL', + 'PATHSEG_LINETO_REL', + 'PATHSEG_LINETO_VERTICAL_ABS', + 'PATHSEG_LINETO_VERTICAL_REL', + 'PATHSEG_MOVETO_ABS', + 'PATHSEG_MOVETO_REL', + 'PATHSEG_UNKNOWN', + 'PATH_EXISTS_ERR', + 'PEAKING', + 'PERMISSION_DENIED', + 'PERSISTENT', + 'PI', + 'PIXEL_PACK_BUFFER', + 'PIXEL_PACK_BUFFER_BINDING', + 'PIXEL_UNPACK_BUFFER', + 'PIXEL_UNPACK_BUFFER_BINDING', + 'PLAYING_STATE', + 'POINTS', + 'POLYGON_OFFSET_FACTOR', + 'POLYGON_OFFSET_FILL', + 'POLYGON_OFFSET_UNITS', + 'POSITION_UNAVAILABLE', + 'POSITIVE_INFINITY', + 'PREV', + 'PREV_NO_DUPLICATE', + 'PROCESSING_INSTRUCTION_NODE', + 'PageChangeEvent', + 'PageTransitionEvent', + 'PaintRequest', + 'PaintRequestList', + 'PannerNode', + 'PasswordCredential', + 'Path2D', + 'PaymentAddress', + 'PaymentInstruments', + 'PaymentManager', + 'PaymentMethodChangeEvent', + 'PaymentRequest', + 'PaymentRequestUpdateEvent', + 'PaymentResponse', + 'Performance', + 'PerformanceElementTiming', + 'PerformanceEntry', + 'PerformanceEventTiming', + 'PerformanceLongTaskTiming', + 'PerformanceMark', + 'PerformanceMeasure', + 'PerformanceNavigation', + 'PerformanceNavigationTiming', + 'PerformanceObserver', + 'PerformanceObserverEntryList', + 'PerformancePaintTiming', + 'PerformanceResourceTiming', + 'PerformanceServerTiming', + 'PerformanceTiming', + 'PeriodicSyncManager', + 'PeriodicWave', + 'PermissionStatus', + 'Permissions', + 'PhotoCapabilities', + 'PictureInPictureWindow', + 'Plugin', + 'PluginArray', + 'PluralRules', + 'PointerEvent', + 'PopStateEvent', + 'PopupBlockedEvent', + 'Presentation', + 'PresentationAvailability', + 'PresentationConnection', + 'PresentationConnectionAvailableEvent', + 'PresentationConnectionCloseEvent', + 'PresentationConnectionList', + 'PresentationReceiver', + 'PresentationRequest', + 'ProcessingInstruction', + 'ProgressEvent', + 'Promise', + 'PromiseRejectionEvent', + 'PropertyNodeList', + 'Proxy', + 'PublicKeyCredential', + 'PushManager', + 'PushSubscription', + 'PushSubscriptionOptions', + 'Q', + 'QUERY_RESULT', + 'QUERY_RESULT_AVAILABLE', + 'QUOTA_ERR', + 'QUOTA_EXCEEDED_ERR', + 'QueryInterface', + 'R11F_G11F_B10F', + 'R16F', + 'R16I', + 'R16UI', + 'R32F', + 'R32I', + 'R32UI', + 'R8', + 'R8I', + 'R8UI', + 'R8_SNORM', + 'RASTERIZER_DISCARD', + 'READ_BUFFER', + 'READ_FRAMEBUFFER', + 'READ_FRAMEBUFFER_BINDING', + 'READ_ONLY', + 'READ_ONLY_ERR', + 'READ_WRITE', + 'RED', + 'RED_BITS', + 'RED_INTEGER', + 'REMOVAL', + 'RENDERBUFFER', + 'RENDERBUFFER_ALPHA_SIZE', + 'RENDERBUFFER_BINDING', + 'RENDERBUFFER_BLUE_SIZE', + 'RENDERBUFFER_DEPTH_SIZE', + 'RENDERBUFFER_GREEN_SIZE', + 'RENDERBUFFER_HEIGHT', + 'RENDERBUFFER_INTERNAL_FORMAT', + 'RENDERBUFFER_RED_SIZE', + 'RENDERBUFFER_SAMPLES', + 'RENDERBUFFER_STENCIL_SIZE', + 'RENDERBUFFER_WIDTH', + 'RENDERER', + 'RENDERING_INTENT_ABSOLUTE_COLORIMETRIC', + 'RENDERING_INTENT_AUTO', + 'RENDERING_INTENT_PERCEPTUAL', + 'RENDERING_INTENT_RELATIVE_COLORIMETRIC', + 'RENDERING_INTENT_SATURATION', + 'RENDERING_INTENT_UNKNOWN', + 'REPEAT', + 'REPLACE', + 'RG', + 'RG16F', + 'RG16I', + 'RG16UI', + 'RG32F', + 'RG32I', + 'RG32UI', + 'RG8', + 'RG8I', + 'RG8UI', + 'RG8_SNORM', + 'RGB', + 'RGB10_A2', + 'RGB10_A2UI', + 'RGB16F', + 'RGB16I', + 'RGB16UI', + 'RGB32F', + 'RGB32I', + 'RGB32UI', + 'RGB565', + 'RGB5_A1', + 'RGB8', + 'RGB8I', + 'RGB8UI', + 'RGB8_SNORM', + 'RGB9_E5', + 'RGBA', + 'RGBA16F', + 'RGBA16I', + 'RGBA16UI', + 'RGBA32F', + 'RGBA32I', + 'RGBA32UI', + 'RGBA4', + 'RGBA8', + 'RGBA8I', + 'RGBA8UI', + 'RGBA8_SNORM', + 'RGBA_INTEGER', + 'RGBColor', + 'RGB_INTEGER', + 'RG_INTEGER', + 'ROTATION_CLOCKWISE', + 'ROTATION_COUNTERCLOCKWISE', + 'RTCCertificate', + 'RTCDTMFSender', + 'RTCDTMFToneChangeEvent', + 'RTCDataChannel', + 'RTCDataChannelEvent', + 'RTCDtlsTransport', + 'RTCError', + 'RTCErrorEvent', + 'RTCIceCandidate', + 'RTCIceTransport', + 'RTCPeerConnection', + 'RTCPeerConnectionIceErrorEvent', + 'RTCPeerConnectionIceEvent', + 'RTCRtpReceiver', + 'RTCRtpSender', + 'RTCRtpTransceiver', + 'RTCSctpTransport', + 'RTCSessionDescription', + 'RTCStatsReport', + 'RTCTrackEvent', + 'RadioNodeList', + 'Range', + 'RangeError', + 'RangeException', + 'ReadableStream', + 'ReadableStreamDefaultReader', + 'RecordErrorEvent', + 'Rect', + 'ReferenceError', + 'Reflect', + 'RegExp', + 'RelativeOrientationSensor', + 'RelativeTimeFormat', + 'RemotePlayback', + 'Report', + 'ReportBody', + 'ReportingObserver', + 'Request', + 'ResizeObserver', + 'ResizeObserverEntry', + 'ResizeObserverSize', + 'Response', + 'RuntimeError', + 'SAMPLER_2D', + 'SAMPLER_2D_ARRAY', + 'SAMPLER_2D_ARRAY_SHADOW', + 'SAMPLER_2D_SHADOW', + 'SAMPLER_3D', + 'SAMPLER_BINDING', + 'SAMPLER_CUBE', + 'SAMPLER_CUBE_SHADOW', + 'SAMPLES', + 'SAMPLE_ALPHA_TO_COVERAGE', + 'SAMPLE_BUFFERS', + 'SAMPLE_COVERAGE', + 'SAMPLE_COVERAGE_INVERT', + 'SAMPLE_COVERAGE_VALUE', + 'SAWTOOTH', + 'SCHEDULED_STATE', + 'SCISSOR_BOX', + 'SCISSOR_TEST', + 'SCROLL_PAGE_DOWN', + 'SCROLL_PAGE_UP', + 'SDP_ANSWER', + 'SDP_OFFER', + 'SDP_PRANSWER', + 'SECURITY_ERR', + 'SELECT', + 'SEPARATE_ATTRIBS', + 'SERIALIZE_ERR', + 'SEVERITY_ERROR', + 'SEVERITY_FATAL_ERROR', + 'SEVERITY_WARNING', + 'SHADER_COMPILER', + 'SHADER_TYPE', + 'SHADING_LANGUAGE_VERSION', + 'SHIFT_MASK', + 'SHORT', + 'SHOWING', + 'SHOW_ALL', + 'SHOW_ATTRIBUTE', + 'SHOW_CDATA_SECTION', + 'SHOW_COMMENT', + 'SHOW_DOCUMENT', + 'SHOW_DOCUMENT_FRAGMENT', + 'SHOW_DOCUMENT_TYPE', + 'SHOW_ELEMENT', + 'SHOW_ENTITY', + 'SHOW_ENTITY_REFERENCE', + 'SHOW_NOTATION', + 'SHOW_PROCESSING_INSTRUCTION', + 'SHOW_TEXT', + 'SIGNALED', + 'SIGNED_NORMALIZED', + 'SINE', + 'SOUNDFIELD', + 'SQLException', + 'SQRT1_2', + 'SQRT2', + 'SQUARE', + 'SRC_ALPHA', + 'SRC_ALPHA_SATURATE', + 'SRC_COLOR', + 'SRGB', + 'SRGB8', + 'SRGB8_ALPHA8', + 'START_TO_END', + 'START_TO_START', + 'STATIC_COPY', + 'STATIC_DRAW', + 'STATIC_READ', + 'STENCIL', + 'STENCIL_ATTACHMENT', + 'STENCIL_BACK_FAIL', + 'STENCIL_BACK_FUNC', + 'STENCIL_BACK_PASS_DEPTH_FAIL', + 'STENCIL_BACK_PASS_DEPTH_PASS', + 'STENCIL_BACK_REF', + 'STENCIL_BACK_VALUE_MASK', + 'STENCIL_BACK_WRITEMASK', + 'STENCIL_BITS', + 'STENCIL_BUFFER_BIT', + 'STENCIL_CLEAR_VALUE', + 'STENCIL_FAIL', + 'STENCIL_FUNC', + 'STENCIL_INDEX', + 'STENCIL_INDEX8', + 'STENCIL_PASS_DEPTH_FAIL', + 'STENCIL_PASS_DEPTH_PASS', + 'STENCIL_REF', + 'STENCIL_TEST', + 'STENCIL_VALUE_MASK', + 'STENCIL_WRITEMASK', + 'STREAM_COPY', + 'STREAM_DRAW', + 'STREAM_READ', + 'STRING_TYPE', + 'STYLE_RULE', + 'SUBPIXEL_BITS', + 'SUPPORTS_RULE', + 'SVGAElement', + 'SVGAltGlyphDefElement', + 'SVGAltGlyphElement', + 'SVGAltGlyphItemElement', + 'SVGAngle', + 'SVGAnimateColorElement', + 'SVGAnimateElement', + 'SVGAnimateMotionElement', + 'SVGAnimateTransformElement', + 'SVGAnimatedAngle', + 'SVGAnimatedBoolean', + 'SVGAnimatedEnumeration', + 'SVGAnimatedInteger', + 'SVGAnimatedLength', + 'SVGAnimatedLengthList', + 'SVGAnimatedNumber', + 'SVGAnimatedNumberList', + 'SVGAnimatedPreserveAspectRatio', + 'SVGAnimatedRect', + 'SVGAnimatedString', + 'SVGAnimatedTransformList', + 'SVGAnimationElement', + 'SVGCircleElement', + 'SVGClipPathElement', + 'SVGColor', + 'SVGComponentTransferFunctionElement', + 'SVGCursorElement', + 'SVGDefsElement', + 'SVGDescElement', + 'SVGDiscardElement', + 'SVGDocument', + 'SVGElement', + 'SVGElementInstance', + 'SVGElementInstanceList', + 'SVGEllipseElement', + 'SVGException', + 'SVGFEBlendElement', + 'SVGFEColorMatrixElement', + 'SVGFEComponentTransferElement', + 'SVGFECompositeElement', + 'SVGFEConvolveMatrixElement', + 'SVGFEDiffuseLightingElement', + 'SVGFEDisplacementMapElement', + 'SVGFEDistantLightElement', + 'SVGFEDropShadowElement', + 'SVGFEFloodElement', + 'SVGFEFuncAElement', + 'SVGFEFuncBElement', + 'SVGFEFuncGElement', + 'SVGFEFuncRElement', + 'SVGFEGaussianBlurElement', + 'SVGFEImageElement', + 'SVGFEMergeElement', + 'SVGFEMergeNodeElement', + 'SVGFEMorphologyElement', + 'SVGFEOffsetElement', + 'SVGFEPointLightElement', + 'SVGFESpecularLightingElement', + 'SVGFESpotLightElement', + 'SVGFETileElement', + 'SVGFETurbulenceElement', + 'SVGFilterElement', + 'SVGFontElement', + 'SVGFontFaceElement', + 'SVGFontFaceFormatElement', + 'SVGFontFaceNameElement', + 'SVGFontFaceSrcElement', + 'SVGFontFaceUriElement', + 'SVGForeignObjectElement', + 'SVGGElement', + 'SVGGeometryElement', + 'SVGGlyphElement', + 'SVGGlyphRefElement', + 'SVGGradientElement', + 'SVGGraphicsElement', + 'SVGHKernElement', + 'SVGImageElement', + 'SVGLength', + 'SVGLengthList', + 'SVGLineElement', + 'SVGLinearGradientElement', + 'SVGMPathElement', + 'SVGMarkerElement', + 'SVGMaskElement', + 'SVGMatrix', + 'SVGMetadataElement', + 'SVGMissingGlyphElement', + 'SVGNumber', + 'SVGNumberList', + 'SVGPaint', + 'SVGPathElement', + 'SVGPathSeg', + 'SVGPathSegArcAbs', + 'SVGPathSegArcRel', + 'SVGPathSegClosePath', + 'SVGPathSegCurvetoCubicAbs', + 'SVGPathSegCurvetoCubicRel', + 'SVGPathSegCurvetoCubicSmoothAbs', + 'SVGPathSegCurvetoCubicSmoothRel', + 'SVGPathSegCurvetoQuadraticAbs', + 'SVGPathSegCurvetoQuadraticRel', + 'SVGPathSegCurvetoQuadraticSmoothAbs', + 'SVGPathSegCurvetoQuadraticSmoothRel', + 'SVGPathSegLinetoAbs', + 'SVGPathSegLinetoHorizontalAbs', + 'SVGPathSegLinetoHorizontalRel', + 'SVGPathSegLinetoRel', + 'SVGPathSegLinetoVerticalAbs', + 'SVGPathSegLinetoVerticalRel', + 'SVGPathSegList', + 'SVGPathSegMovetoAbs', + 'SVGPathSegMovetoRel', + 'SVGPatternElement', + 'SVGPoint', + 'SVGPointList', + 'SVGPolygonElement', + 'SVGPolylineElement', + 'SVGPreserveAspectRatio', + 'SVGRadialGradientElement', + 'SVGRect', + 'SVGRectElement', + 'SVGRenderingIntent', + 'SVGSVGElement', + 'SVGScriptElement', + 'SVGSetElement', + 'SVGStopElement', + 'SVGStringList', + 'SVGStyleElement', + 'SVGSwitchElement', + 'SVGSymbolElement', + 'SVGTRefElement', + 'SVGTSpanElement', + 'SVGTextContentElement', + 'SVGTextElement', + 'SVGTextPathElement', + 'SVGTextPositioningElement', + 'SVGTitleElement', + 'SVGTransform', + 'SVGTransformList', + 'SVGUnitTypes', + 'SVGUseElement', + 'SVGVKernElement', + 'SVGViewElement', + 'SVGViewSpec', + 'SVGZoomAndPan', + 'SVGZoomEvent', + 'SVG_ANGLETYPE_DEG', + 'SVG_ANGLETYPE_GRAD', + 'SVG_ANGLETYPE_RAD', + 'SVG_ANGLETYPE_UNKNOWN', + 'SVG_ANGLETYPE_UNSPECIFIED', + 'SVG_CHANNEL_A', + 'SVG_CHANNEL_B', + 'SVG_CHANNEL_G', + 'SVG_CHANNEL_R', + 'SVG_CHANNEL_UNKNOWN', + 'SVG_COLORTYPE_CURRENTCOLOR', + 'SVG_COLORTYPE_RGBCOLOR', + 'SVG_COLORTYPE_RGBCOLOR_ICCCOLOR', + 'SVG_COLORTYPE_UNKNOWN', + 'SVG_EDGEMODE_DUPLICATE', + 'SVG_EDGEMODE_NONE', + 'SVG_EDGEMODE_UNKNOWN', + 'SVG_EDGEMODE_WRAP', + 'SVG_FEBLEND_MODE_COLOR', + 'SVG_FEBLEND_MODE_COLOR_BURN', + 'SVG_FEBLEND_MODE_COLOR_DODGE', + 'SVG_FEBLEND_MODE_DARKEN', + 'SVG_FEBLEND_MODE_DIFFERENCE', + 'SVG_FEBLEND_MODE_EXCLUSION', + 'SVG_FEBLEND_MODE_HARD_LIGHT', + 'SVG_FEBLEND_MODE_HUE', + 'SVG_FEBLEND_MODE_LIGHTEN', + 'SVG_FEBLEND_MODE_LUMINOSITY', + 'SVG_FEBLEND_MODE_MULTIPLY', + 'SVG_FEBLEND_MODE_NORMAL', + 'SVG_FEBLEND_MODE_OVERLAY', + 'SVG_FEBLEND_MODE_SATURATION', + 'SVG_FEBLEND_MODE_SCREEN', + 'SVG_FEBLEND_MODE_SOFT_LIGHT', + 'SVG_FEBLEND_MODE_UNKNOWN', + 'SVG_FECOLORMATRIX_TYPE_HUEROTATE', + 'SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA', + 'SVG_FECOLORMATRIX_TYPE_MATRIX', + 'SVG_FECOLORMATRIX_TYPE_SATURATE', + 'SVG_FECOLORMATRIX_TYPE_UNKNOWN', + 'SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE', + 'SVG_FECOMPONENTTRANSFER_TYPE_GAMMA', + 'SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY', + 'SVG_FECOMPONENTTRANSFER_TYPE_LINEAR', + 'SVG_FECOMPONENTTRANSFER_TYPE_TABLE', + 'SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN', + 'SVG_FECOMPOSITE_OPERATOR_ARITHMETIC', + 'SVG_FECOMPOSITE_OPERATOR_ATOP', + 'SVG_FECOMPOSITE_OPERATOR_IN', + 'SVG_FECOMPOSITE_OPERATOR_OUT', + 'SVG_FECOMPOSITE_OPERATOR_OVER', + 'SVG_FECOMPOSITE_OPERATOR_UNKNOWN', + 'SVG_FECOMPOSITE_OPERATOR_XOR', + 'SVG_INVALID_VALUE_ERR', + 'SVG_LENGTHTYPE_CM', + 'SVG_LENGTHTYPE_EMS', + 'SVG_LENGTHTYPE_EXS', + 'SVG_LENGTHTYPE_IN', + 'SVG_LENGTHTYPE_MM', + 'SVG_LENGTHTYPE_NUMBER', + 'SVG_LENGTHTYPE_PC', + 'SVG_LENGTHTYPE_PERCENTAGE', + 'SVG_LENGTHTYPE_PT', + 'SVG_LENGTHTYPE_PX', + 'SVG_LENGTHTYPE_UNKNOWN', + 'SVG_MARKERUNITS_STROKEWIDTH', + 'SVG_MARKERUNITS_UNKNOWN', + 'SVG_MARKERUNITS_USERSPACEONUSE', + 'SVG_MARKER_ORIENT_ANGLE', + 'SVG_MARKER_ORIENT_AUTO', + 'SVG_MARKER_ORIENT_UNKNOWN', + 'SVG_MASKTYPE_ALPHA', + 'SVG_MASKTYPE_LUMINANCE', + 'SVG_MATRIX_NOT_INVERTABLE', + 'SVG_MEETORSLICE_MEET', + 'SVG_MEETORSLICE_SLICE', + 'SVG_MEETORSLICE_UNKNOWN', + 'SVG_MORPHOLOGY_OPERATOR_DILATE', + 'SVG_MORPHOLOGY_OPERATOR_ERODE', + 'SVG_MORPHOLOGY_OPERATOR_UNKNOWN', + 'SVG_PAINTTYPE_CURRENTCOLOR', + 'SVG_PAINTTYPE_NONE', + 'SVG_PAINTTYPE_RGBCOLOR', + 'SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR', + 'SVG_PAINTTYPE_UNKNOWN', + 'SVG_PAINTTYPE_URI', + 'SVG_PAINTTYPE_URI_CURRENTCOLOR', + 'SVG_PAINTTYPE_URI_NONE', + 'SVG_PAINTTYPE_URI_RGBCOLOR', + 'SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR', + 'SVG_PRESERVEASPECTRATIO_NONE', + 'SVG_PRESERVEASPECTRATIO_UNKNOWN', + 'SVG_PRESERVEASPECTRATIO_XMAXYMAX', + 'SVG_PRESERVEASPECTRATIO_XMAXYMID', + 'SVG_PRESERVEASPECTRATIO_XMAXYMIN', + 'SVG_PRESERVEASPECTRATIO_XMIDYMAX', + 'SVG_PRESERVEASPECTRATIO_XMIDYMID', + 'SVG_PRESERVEASPECTRATIO_XMIDYMIN', + 'SVG_PRESERVEASPECTRATIO_XMINYMAX', + 'SVG_PRESERVEASPECTRATIO_XMINYMID', + 'SVG_PRESERVEASPECTRATIO_XMINYMIN', + 'SVG_SPREADMETHOD_PAD', + 'SVG_SPREADMETHOD_REFLECT', + 'SVG_SPREADMETHOD_REPEAT', + 'SVG_SPREADMETHOD_UNKNOWN', + 'SVG_STITCHTYPE_NOSTITCH', + 'SVG_STITCHTYPE_STITCH', + 'SVG_STITCHTYPE_UNKNOWN', + 'SVG_TRANSFORM_MATRIX', + 'SVG_TRANSFORM_ROTATE', + 'SVG_TRANSFORM_SCALE', + 'SVG_TRANSFORM_SKEWX', + 'SVG_TRANSFORM_SKEWY', + 'SVG_TRANSFORM_TRANSLATE', + 'SVG_TRANSFORM_UNKNOWN', + 'SVG_TURBULENCE_TYPE_FRACTALNOISE', + 'SVG_TURBULENCE_TYPE_TURBULENCE', + 'SVG_TURBULENCE_TYPE_UNKNOWN', + 'SVG_UNIT_TYPE_OBJECTBOUNDINGBOX', + 'SVG_UNIT_TYPE_UNKNOWN', + 'SVG_UNIT_TYPE_USERSPACEONUSE', + 'SVG_WRONG_TYPE_ERR', + 'SVG_ZOOMANDPAN_DISABLE', + 'SVG_ZOOMANDPAN_MAGNIFY', + 'SVG_ZOOMANDPAN_UNKNOWN', + 'SYNC_CONDITION', + 'SYNC_FENCE', + 'SYNC_FLAGS', + 'SYNC_FLUSH_COMMANDS_BIT', + 'SYNC_GPU_COMMANDS_COMPLETE', + 'SYNC_STATUS', + 'SYNTAX_ERR', + 'SavedPages', + 'Screen', + 'ScreenOrientation', + 'Script', + 'ScriptProcessorNode', + 'ScrollAreaEvent', + 'SecurityPolicyViolationEvent', + 'Selection', + 'Sensor', + 'SensorErrorEvent', + 'ServiceWorker', + 'ServiceWorkerContainer', + 'ServiceWorkerRegistration', + 'SessionDescription', + 'Set', + 'ShadowRoot', + 'SharedArrayBuffer', + 'SharedWorker', + 'SimpleGestureEvent', + 'SourceBuffer', + 'SourceBufferList', + 'SpeechSynthesis', + 'SpeechSynthesisErrorEvent', + 'SpeechSynthesisEvent', + 'SpeechSynthesisUtterance', + 'SpeechSynthesisVoice', + 'StaticRange', + 'StereoPannerNode', + 'StopIteration', + 'Storage', + 'StorageEvent', + 'StorageManager', + 'String', + 'StructType', + 'StylePropertyMap', + 'StylePropertyMapReadOnly', + 'StyleSheet', + 'StyleSheetList', + 'SubmitEvent', + 'SubtleCrypto', + 'Symbol', + 'SyncManager', + 'SyntaxError', + 'TEMPORARY', + 'TEXTPATH_METHODTYPE_ALIGN', + 'TEXTPATH_METHODTYPE_STRETCH', + 'TEXTPATH_METHODTYPE_UNKNOWN', + 'TEXTPATH_SPACINGTYPE_AUTO', + 'TEXTPATH_SPACINGTYPE_EXACT', + 'TEXTPATH_SPACINGTYPE_UNKNOWN', + 'TEXTURE', + 'TEXTURE0', + 'TEXTURE1', + 'TEXTURE10', + 'TEXTURE11', + 'TEXTURE12', + 'TEXTURE13', + 'TEXTURE14', + 'TEXTURE15', + 'TEXTURE16', + 'TEXTURE17', + 'TEXTURE18', + 'TEXTURE19', + 'TEXTURE2', + 'TEXTURE20', + 'TEXTURE21', + 'TEXTURE22', + 'TEXTURE23', + 'TEXTURE24', + 'TEXTURE25', + 'TEXTURE26', + 'TEXTURE27', + 'TEXTURE28', + 'TEXTURE29', + 'TEXTURE3', + 'TEXTURE30', + 'TEXTURE31', + 'TEXTURE4', + 'TEXTURE5', + 'TEXTURE6', + 'TEXTURE7', + 'TEXTURE8', + 'TEXTURE9', + 'TEXTURE_2D', + 'TEXTURE_2D_ARRAY', + 'TEXTURE_3D', + 'TEXTURE_BASE_LEVEL', + 'TEXTURE_BINDING_2D', + 'TEXTURE_BINDING_2D_ARRAY', + 'TEXTURE_BINDING_3D', + 'TEXTURE_BINDING_CUBE_MAP', + 'TEXTURE_COMPARE_FUNC', + 'TEXTURE_COMPARE_MODE', + 'TEXTURE_CUBE_MAP', + 'TEXTURE_CUBE_MAP_NEGATIVE_X', + 'TEXTURE_CUBE_MAP_NEGATIVE_Y', + 'TEXTURE_CUBE_MAP_NEGATIVE_Z', + 'TEXTURE_CUBE_MAP_POSITIVE_X', + 'TEXTURE_CUBE_MAP_POSITIVE_Y', + 'TEXTURE_CUBE_MAP_POSITIVE_Z', + 'TEXTURE_IMMUTABLE_FORMAT', + 'TEXTURE_IMMUTABLE_LEVELS', + 'TEXTURE_MAG_FILTER', + 'TEXTURE_MAX_ANISOTROPY_EXT', + 'TEXTURE_MAX_LEVEL', + 'TEXTURE_MAX_LOD', + 'TEXTURE_MIN_FILTER', + 'TEXTURE_MIN_LOD', + 'TEXTURE_WRAP_R', + 'TEXTURE_WRAP_S', + 'TEXTURE_WRAP_T', + 'TEXT_NODE', + 'TIMEOUT', + 'TIMEOUT_ERR', + 'TIMEOUT_EXPIRED', + 'TIMEOUT_IGNORED', + 'TOO_LARGE_ERR', + 'TRANSACTION_INACTIVE_ERR', + 'TRANSFORM_FEEDBACK', + 'TRANSFORM_FEEDBACK_ACTIVE', + 'TRANSFORM_FEEDBACK_BINDING', + 'TRANSFORM_FEEDBACK_BUFFER', + 'TRANSFORM_FEEDBACK_BUFFER_BINDING', + 'TRANSFORM_FEEDBACK_BUFFER_MODE', + 'TRANSFORM_FEEDBACK_BUFFER_SIZE', + 'TRANSFORM_FEEDBACK_BUFFER_START', + 'TRANSFORM_FEEDBACK_PAUSED', + 'TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN', + 'TRANSFORM_FEEDBACK_VARYINGS', + 'TRIANGLE', + 'TRIANGLES', + 'TRIANGLE_FAN', + 'TRIANGLE_STRIP', + 'TYPE_BACK_FORWARD', + 'TYPE_ERR', + 'TYPE_MISMATCH_ERR', + 'TYPE_NAVIGATE', + 'TYPE_RELOAD', + 'TYPE_RESERVED', + 'Table', + 'TaskAttributionTiming', + 'Text', + 'TextDecoder', + 'TextDecoderStream', + 'TextEncoder', + 'TextEncoderStream', + 'TextEvent', + 'TextMetrics', + 'TextTrack', + 'TextTrackCue', + 'TextTrackCueList', + 'TextTrackList', + 'TimeEvent', + 'TimeRanges', + 'Touch', + 'TouchEvent', + 'TouchList', + 'TrackEvent', + 'TransformStream', + 'TransitionEvent', + 'TreeWalker', + 'TrustedHTML', + 'TrustedScript', + 'TrustedScriptURL', + 'TrustedTypePolicy', + 'TrustedTypePolicyFactory', + 'TypeError', + 'TypedObject', + 'U2F', + 'UIEvent', + 'UNCACHED', + 'UNIFORM_ARRAY_STRIDE', + 'UNIFORM_BLOCK_ACTIVE_UNIFORMS', + 'UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES', + 'UNIFORM_BLOCK_BINDING', + 'UNIFORM_BLOCK_DATA_SIZE', + 'UNIFORM_BLOCK_INDEX', + 'UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER', + 'UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER', + 'UNIFORM_BUFFER', + 'UNIFORM_BUFFER_BINDING', + 'UNIFORM_BUFFER_OFFSET_ALIGNMENT', + 'UNIFORM_BUFFER_SIZE', + 'UNIFORM_BUFFER_START', + 'UNIFORM_IS_ROW_MAJOR', + 'UNIFORM_MATRIX_STRIDE', + 'UNIFORM_OFFSET', + 'UNIFORM_SIZE', + 'UNIFORM_TYPE', + 'UNKNOWN_ERR', + 'UNKNOWN_RULE', + 'UNMASKED_RENDERER_WEBGL', + 'UNMASKED_VENDOR_WEBGL', + 'UNORDERED_NODE_ITERATOR_TYPE', + 'UNORDERED_NODE_SNAPSHOT_TYPE', + 'UNPACK_ALIGNMENT', + 'UNPACK_COLORSPACE_CONVERSION_WEBGL', + 'UNPACK_FLIP_Y_WEBGL', + 'UNPACK_IMAGE_HEIGHT', + 'UNPACK_PREMULTIPLY_ALPHA_WEBGL', + 'UNPACK_ROW_LENGTH', + 'UNPACK_SKIP_IMAGES', + 'UNPACK_SKIP_PIXELS', + 'UNPACK_SKIP_ROWS', + 'UNSCHEDULED_STATE', + 'UNSENT', + 'UNSIGNALED', + 'UNSIGNED_BYTE', + 'UNSIGNED_INT', + 'UNSIGNED_INT_10F_11F_11F_REV', + 'UNSIGNED_INT_24_8', + 'UNSIGNED_INT_2_10_10_10_REV', + 'UNSIGNED_INT_5_9_9_9_REV', + 'UNSIGNED_INT_SAMPLER_2D', + 'UNSIGNED_INT_SAMPLER_2D_ARRAY', + 'UNSIGNED_INT_SAMPLER_3D', + 'UNSIGNED_INT_SAMPLER_CUBE', + 'UNSIGNED_INT_VEC2', + 'UNSIGNED_INT_VEC3', + 'UNSIGNED_INT_VEC4', + 'UNSIGNED_NORMALIZED', + 'UNSIGNED_SHORT', + 'UNSIGNED_SHORT_4_4_4_4', + 'UNSIGNED_SHORT_5_5_5_1', + 'UNSIGNED_SHORT_5_6_5', + 'UNSPECIFIED_EVENT_TYPE_ERR', + 'UPDATEREADY', + 'URIError', + 'URL', + 'URLSearchParams', + 'URLUnencoded', + 'URL_MISMATCH_ERR', + 'USB', + 'USBAlternateInterface', + 'USBConfiguration', + 'USBConnectionEvent', + 'USBDevice', + 'USBEndpoint', + 'USBInTransferResult', + 'USBInterface', + 'USBIsochronousInTransferPacket', + 'USBIsochronousInTransferResult', + 'USBIsochronousOutTransferPacket', + 'USBIsochronousOutTransferResult', + 'USBOutTransferResult', + 'UTC', + 'Uint16Array', + 'Uint32Array', + 'Uint8Array', + 'Uint8ClampedArray', + 'UserActivation', + 'UserMessageHandler', + 'UserMessageHandlersNamespace', + 'UserProximityEvent', + 'VALIDATE_STATUS', + 'VALIDATION_ERR', + 'VARIABLES_RULE', + 'VENDOR', + 'VERSION', + 'VERSION_CHANGE', + 'VERSION_ERR', + 'VERTEX_ARRAY_BINDING', + 'VERTEX_ATTRIB_ARRAY_BUFFER_BINDING', + 'VERTEX_ATTRIB_ARRAY_DIVISOR', + 'VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE', + 'VERTEX_ATTRIB_ARRAY_ENABLED', + 'VERTEX_ATTRIB_ARRAY_INTEGER', + 'VERTEX_ATTRIB_ARRAY_NORMALIZED', + 'VERTEX_ATTRIB_ARRAY_POINTER', + 'VERTEX_ATTRIB_ARRAY_SIZE', + 'VERTEX_ATTRIB_ARRAY_STRIDE', + 'VERTEX_ATTRIB_ARRAY_TYPE', + 'VERTEX_SHADER', + 'VERTICAL', + 'VERTICAL_AXIS', + 'VER_ERR', + 'VIEWPORT', + 'VIEWPORT_RULE', + 'VRDisplay', + 'VRDisplayCapabilities', + 'VRDisplayEvent', + 'VREyeParameters', + 'VRFieldOfView', + 'VRFrameData', + 'VRPose', + 'VRStageParameters', + 'VTTCue', + 'VTTRegion', + 'ValidityState', + 'VideoPlaybackQuality', + 'VideoStreamTrack', + 'VisualViewport', + 'WAIT_FAILED', + 'WEBKIT_FILTER_RULE', + 'WEBKIT_KEYFRAMES_RULE', + 'WEBKIT_KEYFRAME_RULE', + 'WEBKIT_REGION_RULE', + 'WRONG_DOCUMENT_ERR', + 'WakeLock', + 'WakeLockSentinel', + 'WasmAnyRef', + 'WaveShaperNode', + 'WeakMap', + 'WeakRef', + 'WeakSet', + 'WebAssembly', + 'WebGL2RenderingContext', + 'WebGLActiveInfo', + 'WebGLBuffer', + 'WebGLContextEvent', + 'WebGLFramebuffer', + 'WebGLProgram', + 'WebGLQuery', + 'WebGLRenderbuffer', + 'WebGLRenderingContext', + 'WebGLSampler', + 'WebGLShader', + 'WebGLShaderPrecisionFormat', + 'WebGLSync', + 'WebGLTexture', + 'WebGLTransformFeedback', + 'WebGLUniformLocation', + 'WebGLVertexArray', + 'WebGLVertexArrayObject', + 'WebKitAnimationEvent', + 'WebKitBlobBuilder', + 'WebKitCSSFilterRule', + 'WebKitCSSFilterValue', + 'WebKitCSSKeyframeRule', + 'WebKitCSSKeyframesRule', + 'WebKitCSSMatrix', + 'WebKitCSSRegionRule', + 'WebKitCSSTransformValue', + 'WebKitDataCue', + 'WebKitGamepad', + 'WebKitMediaKeyError', + 'WebKitMediaKeyMessageEvent', + 'WebKitMediaKeySession', + 'WebKitMediaKeys', + 'WebKitMediaSource', + 'WebKitMutationObserver', + 'WebKitNamespace', + 'WebKitPlaybackTargetAvailabilityEvent', + 'WebKitPoint', + 'WebKitShadowRoot', + 'WebKitSourceBuffer', + 'WebKitSourceBufferList', + 'WebKitTransitionEvent', + 'WebSocket', + 'WebkitAlignContent', + 'WebkitAlignItems', + 'WebkitAlignSelf', + 'WebkitAnimation', + 'WebkitAnimationDelay', + 'WebkitAnimationDirection', + 'WebkitAnimationDuration', + 'WebkitAnimationFillMode', + 'WebkitAnimationIterationCount', + 'WebkitAnimationName', + 'WebkitAnimationPlayState', + 'WebkitAnimationTimingFunction', + 'WebkitAppearance', + 'WebkitBackfaceVisibility', + 'WebkitBackgroundClip', + 'WebkitBackgroundOrigin', + 'WebkitBackgroundSize', + 'WebkitBorderBottomLeftRadius', + 'WebkitBorderBottomRightRadius', + 'WebkitBorderImage', + 'WebkitBorderRadius', + 'WebkitBorderTopLeftRadius', + 'WebkitBorderTopRightRadius', + 'WebkitBoxAlign', + 'WebkitBoxDirection', + 'WebkitBoxFlex', + 'WebkitBoxOrdinalGroup', + 'WebkitBoxOrient', + 'WebkitBoxPack', + 'WebkitBoxShadow', + 'WebkitBoxSizing', + 'WebkitFilter', + 'WebkitFlex', + 'WebkitFlexBasis', + 'WebkitFlexDirection', + 'WebkitFlexFlow', + 'WebkitFlexGrow', + 'WebkitFlexShrink', + 'WebkitFlexWrap', + 'WebkitJustifyContent', + 'WebkitLineClamp', + 'WebkitMask', + 'WebkitMaskClip', + 'WebkitMaskComposite', + 'WebkitMaskImage', + 'WebkitMaskOrigin', + 'WebkitMaskPosition', + 'WebkitMaskPositionX', + 'WebkitMaskPositionY', + 'WebkitMaskRepeat', + 'WebkitMaskSize', + 'WebkitOrder', + 'WebkitPerspective', + 'WebkitPerspectiveOrigin', + 'WebkitTextFillColor', + 'WebkitTextSizeAdjust', + 'WebkitTextStroke', + 'WebkitTextStrokeColor', + 'WebkitTextStrokeWidth', + 'WebkitTransform', + 'WebkitTransformOrigin', + 'WebkitTransformStyle', + 'WebkitTransition', + 'WebkitTransitionDelay', + 'WebkitTransitionDuration', + 'WebkitTransitionProperty', + 'WebkitTransitionTimingFunction', + 'WebkitUserSelect', + 'WheelEvent', + 'Window', + 'Worker', + 'Worklet', + 'WritableStream', + 'WritableStreamDefaultWriter', + 'XMLDocument', + 'XMLHttpRequest', + 'XMLHttpRequestEventTarget', + 'XMLHttpRequestException', + 'XMLHttpRequestProgressEvent', + 'XMLHttpRequestUpload', + 'XMLSerializer', + 'XMLStylesheetProcessingInstruction', + 'XPathEvaluator', + 'XPathException', + 'XPathExpression', + 'XPathNSResolver', + 'XPathResult', + 'XRBoundedReferenceSpace', + 'XRDOMOverlayState', + 'XRFrame', + 'XRHitTestResult', + 'XRHitTestSource', + 'XRInputSource', + 'XRInputSourceArray', + 'XRInputSourceEvent', + 'XRInputSourcesChangeEvent', + 'XRLayer', + 'XRPose', + 'XRRay', + 'XRReferenceSpace', + 'XRReferenceSpaceEvent', + 'XRRenderState', + 'XRRigidTransform', + 'XRSession', + 'XRSessionEvent', + 'XRSpace', + 'XRSystem', + 'XRTransientInputHitTestResult', + 'XRTransientInputHitTestSource', + 'XRView', + 'XRViewerPose', + 'XRViewport', + 'XRWebGLLayer', + 'XSLTProcessor', + 'ZERO', + '_XD0M_', + '_YD0M_', + '__defineGetter__', + '__defineSetter__', + '__lookupGetter__', + '__lookupSetter__', + '__opera', + '__proto__', + '_browserjsran', + 'a', + 'aLink', + 'abbr', + 'abort', + 'aborted', + 'abs', + 'absolute', + 'acceleration', + 'accelerationIncludingGravity', + 'accelerator', + 'accept', + 'acceptCharset', + 'acceptNode', + 'accessKey', + 'accessKeyLabel', + 'accuracy', + 'acos', + 'acosh', + 'action', + 'actionURL', + 'actions', + 'activated', + 'active', + 'activeCues', + 'activeElement', + 'activeSourceBuffers', + 'activeSourceCount', + 'activeTexture', + 'activeVRDisplays', + 'actualBoundingBoxAscent', + 'actualBoundingBoxDescent', + 'actualBoundingBoxLeft', + 'actualBoundingBoxRight', + 'add', + 'addAll', + 'addBehavior', + 'addCandidate', + 'addColorStop', + 'addCue', + 'addElement', + 'addEventListener', + 'addFilter', + 'addFromString', + 'addFromUri', + 'addIceCandidate', + 'addImport', + 'addListener', + 'addModule', + 'addNamed', + 'addPageRule', + 'addPath', + 'addPointer', + 'addRange', + 'addRegion', + 'addRule', + 'addSearchEngine', + 'addSourceBuffer', + 'addStream', + 'addTextTrack', + 'addTrack', + 'addTransceiver', + 'addWakeLockListener', + 'added', + 'addedNodes', + 'additionalName', + 'additiveSymbols', + 'addons', + 'address', + 'addressLine', + 'adoptNode', + 'adoptedStyleSheets', + 'adr', + 'advance', + 'after', + 'album', + 'alert', + 'algorithm', + 'align', + 'align-content', + 'align-items', + 'align-self', + 'alignContent', + 'alignItems', + 'alignSelf', + 'alignmentBaseline', + 'alinkColor', + 'all', + 'allSettled', + 'allow', + 'allowFullscreen', + 'allowPaymentRequest', + 'allowedDirections', + 'allowedFeatures', + 'allowedToPlay', + 'allowsFeature', + 'alpha', + 'alt', + 'altGraphKey', + 'altHtml', + 'altKey', + 'altLeft', + 'alternate', + 'alternateSetting', + 'alternates', + 'altitude', + 'altitudeAccuracy', + 'amplitude', + 'ancestorOrigins', + 'anchor', + 'anchorNode', + 'anchorOffset', + 'anchors', + 'and', + 'angle', + 'angularAcceleration', + 'angularVelocity', + 'animVal', + 'animate', + 'animatedInstanceRoot', + 'animatedNormalizedPathSegList', + 'animatedPathSegList', + 'animatedPoints', + 'animation', + 'animation-delay', + 'animation-direction', + 'animation-duration', + 'animation-fill-mode', + 'animation-iteration-count', + 'animation-name', + 'animation-play-state', + 'animation-timing-function', + 'animationDelay', + 'animationDirection', + 'animationDuration', + 'animationFillMode', + 'animationIterationCount', + 'animationName', + 'animationPlayState', + 'animationStartTime', + 'animationTimingFunction', + 'animationsPaused', + 'anniversary', + 'antialias', + 'anticipatedRemoval', + 'any', + 'app', + 'appCodeName', + 'appMinorVersion', + 'appName', + 'appNotifications', + 'appVersion', + 'appearance', + 'append', + 'appendBuffer', + 'appendChild', + 'appendData', + 'appendItem', + 'appendMedium', + 'appendNamed', + 'appendRule', + 'appendStream', + 'appendWindowEnd', + 'appendWindowStart', + 'applets', + 'applicationCache', + 'applicationServerKey', + 'apply', + 'applyConstraints', + 'applyElement', + 'arc', + 'arcTo', + 'archive', + 'areas', + 'arguments', + 'ariaAtomic', + 'ariaAutoComplete', + 'ariaBusy', + 'ariaChecked', + 'ariaColCount', + 'ariaColIndex', + 'ariaColSpan', + 'ariaCurrent', + 'ariaDescription', + 'ariaDisabled', + 'ariaExpanded', + 'ariaHasPopup', + 'ariaHidden', + 'ariaKeyShortcuts', + 'ariaLabel', + 'ariaLevel', + 'ariaLive', + 'ariaModal', + 'ariaMultiLine', + 'ariaMultiSelectable', + 'ariaOrientation', + 'ariaPlaceholder', + 'ariaPosInSet', + 'ariaPressed', + 'ariaReadOnly', + 'ariaRelevant', + 'ariaRequired', + 'ariaRoleDescription', + 'ariaRowCount', + 'ariaRowIndex', + 'ariaRowSpan', + 'ariaSelected', + 'ariaSetSize', + 'ariaSort', + 'ariaValueMax', + 'ariaValueMin', + 'ariaValueNow', + 'ariaValueText', + 'arrayBuffer', + 'artist', + 'artwork', + 'as', + 'asIntN', + 'asUintN', + 'asin', + 'asinh', + 'assert', + 'assign', + 'assignedElements', + 'assignedNodes', + 'assignedSlot', + 'async', + 'asyncIterator', + 'atEnd', + 'atan', + 'atan2', + 'atanh', + 'atob', + 'attachEvent', + 'attachInternals', + 'attachShader', + 'attachShadow', + 'attachments', + 'attack', + 'attestationObject', + 'attrChange', + 'attrName', + 'attributeFilter', + 'attributeName', + 'attributeNamespace', + 'attributeOldValue', + 'attributeStyleMap', + 'attributes', + 'attribution', + 'audioBitsPerSecond', + 'audioTracks', + 'audioWorklet', + 'authenticatedSignedWrites', + 'authenticatorData', + 'autoIncrement', + 'autobuffer', + 'autocapitalize', + 'autocomplete', + 'autocorrect', + 'autofocus', + 'automationRate', + 'autoplay', + 'availHeight', + 'availLeft', + 'availTop', + 'availWidth', + 'availability', + 'available', + 'aversion', + 'ax', + 'axes', + 'axis', + 'ay', + 'azimuth', + 'b', + 'back', + 'backface-visibility', + 'backfaceVisibility', + 'background', + 'background-attachment', + 'background-blend-mode', + 'background-clip', + 'background-color', + 'background-image', + 'background-origin', + 'background-position', + 'background-position-x', + 'background-position-y', + 'background-repeat', + 'background-size', + 'backgroundAttachment', + 'backgroundBlendMode', + 'backgroundClip', + 'backgroundColor', + 'backgroundFetch', + 'backgroundImage', + 'backgroundOrigin', + 'backgroundPosition', + 'backgroundPositionX', + 'backgroundPositionY', + 'backgroundRepeat', + 'backgroundSize', + 'badInput', + 'badge', + 'balance', + 'baseFrequencyX', + 'baseFrequencyY', + 'baseLatency', + 'baseLayer', + 'baseNode', + 'baseOffset', + 'baseURI', + 'baseVal', + 'baselineShift', + 'battery', + 'bday', + 'before', + 'beginElement', + 'beginElementAt', + 'beginPath', + 'beginQuery', + 'beginTransformFeedback', + 'behavior', + 'behaviorCookie', + 'behaviorPart', + 'behaviorUrns', + 'beta', + 'bezierCurveTo', + 'bgColor', + 'bgProperties', + 'bias', + 'big', + 'bigint64', + 'biguint64', + 'binaryType', + 'bind', + 'bindAttribLocation', + 'bindBuffer', + 'bindBufferBase', + 'bindBufferRange', + 'bindFramebuffer', + 'bindRenderbuffer', + 'bindSampler', + 'bindTexture', + 'bindTransformFeedback', + 'bindVertexArray', + 'blendColor', + 'blendEquation', + 'blendEquationSeparate', + 'blendFunc', + 'blendFuncSeparate', + 'blink', + 'blitFramebuffer', + 'blob', + 'block-size', + 'blockDirection', + 'blockSize', + 'blockedURI', + 'blue', + 'bluetooth', + 'blur', + 'body', + 'bodyUsed', + 'bold', + 'bookmarks', + 'booleanValue', + 'border', + 'border-block', + 'border-block-color', + 'border-block-end', + 'border-block-end-color', + 'border-block-end-style', + 'border-block-end-width', + 'border-block-start', + 'border-block-start-color', + 'border-block-start-style', + 'border-block-start-width', + 'border-block-style', + 'border-block-width', + 'border-bottom', + 'border-bottom-color', + 'border-bottom-left-radius', + 'border-bottom-right-radius', + 'border-bottom-style', + 'border-bottom-width', + 'border-collapse', + 'border-color', + 'border-end-end-radius', + 'border-end-start-radius', + 'border-image', + 'border-image-outset', + 'border-image-repeat', + 'border-image-slice', + 'border-image-source', + 'border-image-width', + 'border-inline', + 'border-inline-color', + 'border-inline-end', + 'border-inline-end-color', + 'border-inline-end-style', + 'border-inline-end-width', + 'border-inline-start', + 'border-inline-start-color', + 'border-inline-start-style', + 'border-inline-start-width', + 'border-inline-style', + 'border-inline-width', + 'border-left', + 'border-left-color', + 'border-left-style', + 'border-left-width', + 'border-radius', + 'border-right', + 'border-right-color', + 'border-right-style', + 'border-right-width', + 'border-spacing', + 'border-start-end-radius', + 'border-start-start-radius', + 'border-style', + 'border-top', + 'border-top-color', + 'border-top-left-radius', + 'border-top-right-radius', + 'border-top-style', + 'border-top-width', + 'border-width', + 'borderBlock', + 'borderBlockColor', + 'borderBlockEnd', + 'borderBlockEndColor', + 'borderBlockEndStyle', + 'borderBlockEndWidth', + 'borderBlockStart', + 'borderBlockStartColor', + 'borderBlockStartStyle', + 'borderBlockStartWidth', + 'borderBlockStyle', + 'borderBlockWidth', + 'borderBottom', + 'borderBottomColor', + 'borderBottomLeftRadius', + 'borderBottomRightRadius', + 'borderBottomStyle', + 'borderBottomWidth', + 'borderBoxSize', + 'borderCollapse', + 'borderColor', + 'borderColorDark', + 'borderColorLight', + 'borderEndEndRadius', + 'borderEndStartRadius', + 'borderImage', + 'borderImageOutset', + 'borderImageRepeat', + 'borderImageSlice', + 'borderImageSource', + 'borderImageWidth', + 'borderInline', + 'borderInlineColor', + 'borderInlineEnd', + 'borderInlineEndColor', + 'borderInlineEndStyle', + 'borderInlineEndWidth', + 'borderInlineStart', + 'borderInlineStartColor', + 'borderInlineStartStyle', + 'borderInlineStartWidth', + 'borderInlineStyle', + 'borderInlineWidth', + 'borderLeft', + 'borderLeftColor', + 'borderLeftStyle', + 'borderLeftWidth', + 'borderRadius', + 'borderRight', + 'borderRightColor', + 'borderRightStyle', + 'borderRightWidth', + 'borderSpacing', + 'borderStartEndRadius', + 'borderStartStartRadius', + 'borderStyle', + 'borderTop', + 'borderTopColor', + 'borderTopLeftRadius', + 'borderTopRightRadius', + 'borderTopStyle', + 'borderTopWidth', + 'borderWidth', + 'bottom', + 'bottomMargin', + 'bound', + 'boundElements', + 'boundingClientRect', + 'boundingHeight', + 'boundingLeft', + 'boundingTop', + 'boundingWidth', + 'bounds', + 'boundsGeometry', + 'box-decoration-break', + 'box-shadow', + 'box-sizing', + 'boxDecorationBreak', + 'boxShadow', + 'boxSizing', + 'break-after', + 'break-before', + 'break-inside', + 'breakAfter', + 'breakBefore', + 'breakInside', + 'broadcast', + 'browserLanguage', + 'btoa', + 'bubbles', + 'buffer', + 'bufferData', + 'bufferDepth', + 'bufferSize', + 'bufferSubData', + 'buffered', + 'bufferedAmount', + 'bufferedAmountLowThreshold', + 'buildID', + 'buildNumber', + 'button', + 'buttonID', + 'buttons', + 'byteLength', + 'byteOffset', + 'bytesWritten', + 'c', + 'cache', + 'caches', + 'call', + 'caller', + 'canBeFormatted', + 'canBeMounted', + 'canBeShared', + 'canHaveChildren', + 'canHaveHTML', + 'canInsertDTMF', + 'canMakePayment', + 'canPlayType', + 'canPresent', + 'canTrickleIceCandidates', + 'cancel', + 'cancelAndHoldAtTime', + 'cancelAnimationFrame', + 'cancelBubble', + 'cancelIdleCallback', + 'cancelScheduledValues', + 'cancelVideoFrameCallback', + 'cancelWatchAvailability', + 'cancelable', + 'candidate', + 'canonicalUUID', + 'canvas', + 'capabilities', + 'caption', + 'caption-side', + 'captionSide', + 'capture', + 'captureEvents', + 'captureStackTrace', + 'captureStream', + 'caret-color', + 'caretBidiLevel', + 'caretColor', + 'caretPositionFromPoint', + 'caretRangeFromPoint', + 'cast', + 'catch', + 'category', + 'cbrt', + 'cd', + 'ceil', + 'cellIndex', + 'cellPadding', + 'cellSpacing', + 'cells', + 'ch', + 'chOff', + 'chain', + 'challenge', + 'changeType', + 'changedTouches', + 'channel', + 'channelCount', + 'channelCountMode', + 'channelInterpretation', + 'char', + 'charAt', + 'charCode', + 'charCodeAt', + 'charIndex', + 'charLength', + 'characterData', + 'characterDataOldValue', + 'characterSet', + 'characteristic', + 'charging', + 'chargingTime', + 'charset', + 'check', + 'checkEnclosure', + 'checkFramebufferStatus', + 'checkIntersection', + 'checkValidity', + 'checked', + 'childElementCount', + 'childList', + 'childNodes', + 'children', + 'chrome', + 'ciphertext', + 'cite', + 'city', + 'claimInterface', + 'claimed', + 'classList', + 'className', + 'classid', + 'clear', + 'clearAppBadge', + 'clearAttributes', + 'clearBufferfi', + 'clearBufferfv', + 'clearBufferiv', + 'clearBufferuiv', + 'clearColor', + 'clearData', + 'clearDepth', + 'clearHalt', + 'clearImmediate', + 'clearInterval', + 'clearLiveSeekableRange', + 'clearMarks', + 'clearMaxGCPauseAccumulator', + 'clearMeasures', + 'clearParameters', + 'clearRect', + 'clearResourceTimings', + 'clearShadow', + 'clearStencil', + 'clearTimeout', + 'clearWatch', + 'click', + 'clickCount', + 'clientDataJSON', + 'clientHeight', + 'clientInformation', + 'clientLeft', + 'clientRect', + 'clientRects', + 'clientTop', + 'clientWaitSync', + 'clientWidth', + 'clientX', + 'clientY', + 'clip', + 'clip-path', + 'clip-rule', + 'clipBottom', + 'clipLeft', + 'clipPath', + 'clipPathUnits', + 'clipRight', + 'clipRule', + 'clipTop', + 'clipboard', + 'clipboardData', + 'clone', + 'cloneContents', + 'cloneNode', + 'cloneRange', + 'close', + 'closePath', + 'closed', + 'closest', + 'clz', + 'clz32', + 'cm', + 'cmp', + 'code', + 'codeBase', + 'codePointAt', + 'codeType', + 'colSpan', + 'collapse', + 'collapseToEnd', + 'collapseToStart', + 'collapsed', + 'collect', + 'colno', + 'color', + 'color-adjust', + 'color-interpolation', + 'color-interpolation-filters', + 'colorAdjust', + 'colorDepth', + 'colorInterpolation', + 'colorInterpolationFilters', + 'colorMask', + 'colorType', + 'cols', + 'column-count', + 'column-fill', + 'column-gap', + 'column-rule', + 'column-rule-color', + 'column-rule-style', + 'column-rule-width', + 'column-span', + 'column-width', + 'columnCount', + 'columnFill', + 'columnGap', + 'columnNumber', + 'columnRule', + 'columnRuleColor', + 'columnRuleStyle', + 'columnRuleWidth', + 'columnSpan', + 'columnWidth', + 'columns', + 'command', + 'commit', + 'commitPreferences', + 'commitStyles', + 'commonAncestorContainer', + 'compact', + 'compareBoundaryPoints', + 'compareDocumentPosition', + 'compareEndPoints', + 'compareExchange', + 'compareNode', + 'comparePoint', + 'compatMode', + 'compatible', + 'compile', + 'compileShader', + 'compileStreaming', + 'complete', + 'component', + 'componentFromPoint', + 'composed', + 'composedPath', + 'composite', + 'compositionEndOffset', + 'compositionStartOffset', + 'compressedTexImage2D', + 'compressedTexImage3D', + 'compressedTexSubImage2D', + 'compressedTexSubImage3D', + 'computedStyleMap', + 'concat', + 'conditionText', + 'coneInnerAngle', + 'coneOuterAngle', + 'coneOuterGain', + 'configuration', + 'configurationName', + 'configurationValue', + 'configurations', + 'confirm', + 'confirmComposition', + 'confirmSiteSpecificTrackingException', + 'confirmWebWideTrackingException', + 'connect', + 'connectEnd', + 'connectShark', + 'connectStart', + 'connected', + 'connection', + 'connectionList', + 'connectionSpeed', + 'connectionState', + 'connections', + 'console', + 'consolidate', + 'constraint', + 'constrictionActive', + 'construct', + 'constructor', + 'contactID', + 'contain', + 'containerId', + 'containerName', + 'containerSrc', + 'containerType', + 'contains', + 'containsNode', + 'content', + 'contentBoxSize', + 'contentDocument', + 'contentEditable', + 'contentHint', + 'contentOverflow', + 'contentRect', + 'contentScriptType', + 'contentStyleType', + 'contentType', + 'contentWindow', + 'context', + 'contextMenu', + 'contextmenu', + 'continue', + 'continuePrimaryKey', + 'continuous', + 'control', + 'controlTransferIn', + 'controlTransferOut', + 'controller', + 'controls', + 'controlsList', + 'convertPointFromNode', + 'convertQuadFromNode', + 'convertRectFromNode', + 'convertToBlob', + 'convertToSpecifiedUnits', + 'cookie', + 'cookieEnabled', + 'coords', + 'copyBufferSubData', + 'copyFromChannel', + 'copyTexImage2D', + 'copyTexSubImage2D', + 'copyTexSubImage3D', + 'copyToChannel', + 'copyWithin', + 'correspondingElement', + 'correspondingUseElement', + 'corruptedVideoFrames', + 'cos', + 'cosh', + 'count', + 'countReset', + 'counter-increment', + 'counter-reset', + 'counter-set', + 'counterIncrement', + 'counterReset', + 'counterSet', + 'country', + 'cpuClass', + 'cpuSleepAllowed', + 'create', + 'createAnalyser', + 'createAnswer', + 'createAttribute', + 'createAttributeNS', + 'createBiquadFilter', + 'createBuffer', + 'createBufferSource', + 'createCDATASection', + 'createCSSStyleSheet', + 'createCaption', + 'createChannelMerger', + 'createChannelSplitter', + 'createComment', + 'createConstantSource', + 'createContextualFragment', + 'createControlRange', + 'createConvolver', + 'createDTMFSender', + 'createDataChannel', + 'createDelay', + 'createDelayNode', + 'createDocument', + 'createDocumentFragment', + 'createDocumentType', + 'createDynamicsCompressor', + 'createElement', + 'createElementNS', + 'createEntityReference', + 'createEvent', + 'createEventObject', + 'createExpression', + 'createFramebuffer', + 'createFunction', + 'createGain', + 'createGainNode', + 'createHTML', + 'createHTMLDocument', + 'createIIRFilter', + 'createImageBitmap', + 'createImageData', + 'createIndex', + 'createJavaScriptNode', + 'createLinearGradient', + 'createMediaElementSource', + 'createMediaKeys', + 'createMediaStreamDestination', + 'createMediaStreamSource', + 'createMediaStreamTrackSource', + 'createMutableFile', + 'createNSResolver', + 'createNodeIterator', + 'createNotification', + 'createObjectStore', + 'createObjectURL', + 'createOffer', + 'createOscillator', + 'createPanner', + 'createPattern', + 'createPeriodicWave', + 'createPolicy', + 'createPopup', + 'createProcessingInstruction', + 'createProgram', + 'createQuery', + 'createRadialGradient', + 'createRange', + 'createRangeCollection', + 'createReader', + 'createRenderbuffer', + 'createSVGAngle', + 'createSVGLength', + 'createSVGMatrix', + 'createSVGNumber', + 'createSVGPathSegArcAbs', + 'createSVGPathSegArcRel', + 'createSVGPathSegClosePath', + 'createSVGPathSegCurvetoCubicAbs', + 'createSVGPathSegCurvetoCubicRel', + 'createSVGPathSegCurvetoCubicSmoothAbs', + 'createSVGPathSegCurvetoCubicSmoothRel', + 'createSVGPathSegCurvetoQuadraticAbs', + 'createSVGPathSegCurvetoQuadraticRel', + 'createSVGPathSegCurvetoQuadraticSmoothAbs', + 'createSVGPathSegCurvetoQuadraticSmoothRel', + 'createSVGPathSegLinetoAbs', + 'createSVGPathSegLinetoHorizontalAbs', + 'createSVGPathSegLinetoHorizontalRel', + 'createSVGPathSegLinetoRel', + 'createSVGPathSegLinetoVerticalAbs', + 'createSVGPathSegLinetoVerticalRel', + 'createSVGPathSegMovetoAbs', + 'createSVGPathSegMovetoRel', + 'createSVGPoint', + 'createSVGRect', + 'createSVGTransform', + 'createSVGTransformFromMatrix', + 'createSampler', + 'createScript', + 'createScriptProcessor', + 'createScriptURL', + 'createSession', + 'createShader', + 'createShadowRoot', + 'createStereoPanner', + 'createStyleSheet', + 'createTBody', + 'createTFoot', + 'createTHead', + 'createTextNode', + 'createTextRange', + 'createTexture', + 'createTouch', + 'createTouchList', + 'createTransformFeedback', + 'createTreeWalker', + 'createVertexArray', + 'createWaveShaper', + 'creationTime', + 'credentials', + 'crossOrigin', + 'crossOriginIsolated', + 'crypto', + 'csi', + 'csp', + 'cssFloat', + 'cssRules', + 'cssText', + 'cssValueType', + 'ctrlKey', + 'ctrlLeft', + 'cues', + 'cullFace', + 'currentDirection', + 'currentLocalDescription', + 'currentNode', + 'currentPage', + 'currentRect', + 'currentRemoteDescription', + 'currentScale', + 'currentScript', + 'currentSrc', + 'currentState', + 'currentStyle', + 'currentTarget', + 'currentTime', + 'currentTranslate', + 'currentView', + 'cursor', + 'curve', + 'customElements', + 'customError', + 'cx', + 'cy', + 'd', + 'data', + 'dataFld', + 'dataFormatAs', + 'dataLoss', + 'dataLossMessage', + 'dataPageSize', + 'dataSrc', + 'dataTransfer', + 'database', + 'databases', + 'dataset', + 'dateTime', + 'db', + 'debug', + 'debuggerEnabled', + 'declare', + 'decode', + 'decodeAudioData', + 'decodeURI', + 'decodeURIComponent', + 'decodedBodySize', + 'decoding', + 'decodingInfo', + 'decrypt', + 'default', + 'defaultCharset', + 'defaultChecked', + 'defaultMuted', + 'defaultPlaybackRate', + 'defaultPolicy', + 'defaultPrevented', + 'defaultRequest', + 'defaultSelected', + 'defaultStatus', + 'defaultURL', + 'defaultValue', + 'defaultView', + 'defaultstatus', + 'defer', + 'define', + 'defineMagicFunction', + 'defineMagicVariable', + 'defineProperties', + 'defineProperty', + 'deg', + 'delay', + 'delayTime', + 'delegatesFocus', + 'delete', + 'deleteBuffer', + 'deleteCaption', + 'deleteCell', + 'deleteContents', + 'deleteData', + 'deleteDatabase', + 'deleteFramebuffer', + 'deleteFromDocument', + 'deleteIndex', + 'deleteMedium', + 'deleteObjectStore', + 'deleteProgram', + 'deleteProperty', + 'deleteQuery', + 'deleteRenderbuffer', + 'deleteRow', + 'deleteRule', + 'deleteSampler', + 'deleteShader', + 'deleteSync', + 'deleteTFoot', + 'deleteTHead', + 'deleteTexture', + 'deleteTransformFeedback', + 'deleteVertexArray', + 'deliverChangeRecords', + 'delivery', + 'deliveryInfo', + 'deliveryStatus', + 'deliveryTimestamp', + 'delta', + 'deltaMode', + 'deltaX', + 'deltaY', + 'deltaZ', + 'dependentLocality', + 'depthFar', + 'depthFunc', + 'depthMask', + 'depthNear', + 'depthRange', + 'deref', + 'deriveBits', + 'deriveKey', + 'description', + 'deselectAll', + 'designMode', + 'desiredSize', + 'destination', + 'destinationURL', + 'detach', + 'detachEvent', + 'detachShader', + 'detail', + 'details', + 'detect', + 'detune', + 'device', + 'deviceClass', + 'deviceId', + 'deviceMemory', + 'devicePixelContentBoxSize', + 'devicePixelRatio', + 'deviceProtocol', + 'deviceSubclass', + 'deviceVersionMajor', + 'deviceVersionMinor', + 'deviceVersionSubminor', + 'deviceXDPI', + 'deviceYDPI', + 'didTimeout', + 'diffuseConstant', + 'digest', + 'dimensions', + 'dir', + 'dirName', + 'direction', + 'dirxml', + 'disable', + 'disablePictureInPicture', + 'disableRemotePlayback', + 'disableVertexAttribArray', + 'disabled', + 'dischargingTime', + 'disconnect', + 'disconnectShark', + 'dispatchEvent', + 'display', + 'displayId', + 'displayName', + 'disposition', + 'distanceModel', + 'div', + 'divisor', + 'djsapi', + 'djsproxy', + 'doImport', + 'doNotTrack', + 'doScroll', + 'doctype', + 'document', + 'documentElement', + 'documentMode', + 'documentURI', + 'dolphin', + 'dolphinGameCenter', + 'dolphininfo', + 'dolphinmeta', + 'domComplete', + 'domContentLoadedEventEnd', + 'domContentLoadedEventStart', + 'domInteractive', + 'domLoading', + 'domOverlayState', + 'domain', + 'domainLookupEnd', + 'domainLookupStart', + 'dominant-baseline', + 'dominantBaseline', + 'done', + 'dopplerFactor', + 'dotAll', + 'downDegrees', + 'downlink', + 'download', + 'downloadTotal', + 'downloaded', + 'dpcm', + 'dpi', + 'dppx', + 'dragDrop', + 'draggable', + 'drawArrays', + 'drawArraysInstanced', + 'drawArraysInstancedANGLE', + 'drawBuffers', + 'drawCustomFocusRing', + 'drawElements', + 'drawElementsInstanced', + 'drawElementsInstancedANGLE', + 'drawFocusIfNeeded', + 'drawImage', + 'drawImageFromRect', + 'drawRangeElements', + 'drawSystemFocusRing', + 'drawingBufferHeight', + 'drawingBufferWidth', + 'dropEffect', + 'droppedVideoFrames', + 'dropzone', + 'dtmf', + 'dump', + 'dumpProfile', + 'duplicate', + 'durability', + 'duration', + 'dvname', + 'dvnum', + 'dx', + 'dy', + 'dynsrc', + 'e', + 'edgeMode', + 'effect', + 'effectAllowed', + 'effectiveDirective', + 'effectiveType', + 'elapsedTime', + 'element', + 'elementFromPoint', + 'elementTiming', + 'elements', + 'elementsFromPoint', + 'elevation', + 'ellipse', + 'em', + 'email', + 'embeds', + 'emma', + 'empty', + 'empty-cells', + 'emptyCells', + 'emptyHTML', + 'emptyScript', + 'emulatedPosition', + 'enable', + 'enableBackground', + 'enableDelegations', + 'enableStyleSheetsForSet', + 'enableVertexAttribArray', + 'enabled', + 'enabledPlugin', + 'encode', + 'encodeInto', + 'encodeURI', + 'encodeURIComponent', + 'encodedBodySize', + 'encoding', + 'encodingInfo', + 'encrypt', + 'enctype', + 'end', + 'endContainer', + 'endElement', + 'endElementAt', + 'endOfStream', + 'endOffset', + 'endQuery', + 'endTime', + 'endTransformFeedback', + 'ended', + 'endpoint', + 'endpointNumber', + 'endpoints', + 'endsWith', + 'enterKeyHint', + 'entities', + 'entries', + 'entryType', + 'enumerate', + 'enumerateDevices', + 'enumerateEditable', + 'environmentBlendMode', + 'equals', + 'error', + 'errorCode', + 'errorDetail', + 'errorText', + 'escape', + 'estimate', + 'eval', + 'evaluate', + 'event', + 'eventPhase', + 'every', + 'ex', + 'exception', + 'exchange', + 'exec', + 'execCommand', + 'execCommandShowHelp', + 'execScript', + 'exitFullscreen', + 'exitPictureInPicture', + 'exitPointerLock', + 'exitPresent', + 'exp', + 'expand', + 'expandEntityReferences', + 'expando', + 'expansion', + 'expiration', + 'expirationTime', + 'expires', + 'expiryDate', + 'explicitOriginalTarget', + 'expm1', + 'exponent', + 'exponentialRampToValueAtTime', + 'exportKey', + 'exports', + 'extend', + 'extensions', + 'extentNode', + 'extentOffset', + 'external', + 'externalResourcesRequired', + 'extractContents', + 'extractable', + 'eye', + 'f', + 'face', + 'factoryReset', + 'failureReason', + 'fallback', + 'family', + 'familyName', + 'farthestViewportElement', + 'fastSeek', + 'fatal', + 'featureId', + 'featurePolicy', + 'featureSettings', + 'features', + 'fenceSync', + 'fetch', + 'fetchStart', + 'fftSize', + 'fgColor', + 'fieldOfView', + 'file', + 'fileCreatedDate', + 'fileHandle', + 'fileModifiedDate', + 'fileName', + 'fileSize', + 'fileUpdatedDate', + 'filename', + 'files', + 'filesystem', + 'fill', + 'fill-opacity', + 'fill-rule', + 'fillLightMode', + 'fillOpacity', + 'fillRect', + 'fillRule', + 'fillStyle', + 'fillText', + 'filter', + 'filterResX', + 'filterResY', + 'filterUnits', + 'filters', + 'finally', + 'find', + 'findIndex', + 'findRule', + 'findText', + 'finish', + 'finished', + 'fireEvent', + 'firesTouchEvents', + 'firstChild', + 'firstElementChild', + 'firstPage', + 'fixed', + 'flags', + 'flat', + 'flatMap', + 'flex', + 'flex-basis', + 'flex-direction', + 'flex-flow', + 'flex-grow', + 'flex-shrink', + 'flex-wrap', + 'flexBasis', + 'flexDirection', + 'flexFlow', + 'flexGrow', + 'flexShrink', + 'flexWrap', + 'flipX', + 'flipY', + 'float', + 'float32', + 'float64', + 'flood-color', + 'flood-opacity', + 'floodColor', + 'floodOpacity', + 'floor', + 'flush', + 'focus', + 'focusNode', + 'focusOffset', + 'font', + 'font-family', + 'font-feature-settings', + 'font-kerning', + 'font-language-override', + 'font-optical-sizing', + 'font-size', + 'font-size-adjust', + 'font-stretch', + 'font-style', + 'font-synthesis', + 'font-variant', + 'font-variant-alternates', + 'font-variant-caps', + 'font-variant-east-asian', + 'font-variant-ligatures', + 'font-variant-numeric', + 'font-variant-position', + 'font-variation-settings', + 'font-weight', + 'fontFamily', + 'fontFeatureSettings', + 'fontKerning', + 'fontLanguageOverride', + 'fontOpticalSizing', + 'fontSize', + 'fontSizeAdjust', + 'fontSmoothingEnabled', + 'fontStretch', + 'fontStyle', + 'fontSynthesis', + 'fontVariant', + 'fontVariantAlternates', + 'fontVariantCaps', + 'fontVariantEastAsian', + 'fontVariantLigatures', + 'fontVariantNumeric', + 'fontVariantPosition', + 'fontVariationSettings', + 'fontWeight', + 'fontcolor', + 'fontfaces', + 'fonts', + 'fontsize', + 'for', + 'forEach', + 'force', + 'forceRedraw', + 'form', + 'formAction', + 'formData', + 'formEnctype', + 'formMethod', + 'formNoValidate', + 'formTarget', + 'format', + 'formatToParts', + 'forms', + 'forward', + 'forwardX', + 'forwardY', + 'forwardZ', + 'foundation', + 'fr', + 'fragmentDirective', + 'frame', + 'frameBorder', + 'frameElement', + 'frameSpacing', + 'framebuffer', + 'framebufferHeight', + 'framebufferRenderbuffer', + 'framebufferTexture2D', + 'framebufferTextureLayer', + 'framebufferWidth', + 'frames', + 'freeSpace', + 'freeze', + 'frequency', + 'frequencyBinCount', + 'from', + 'fromCharCode', + 'fromCodePoint', + 'fromElement', + 'fromEntries', + 'fromFloat32Array', + 'fromFloat64Array', + 'fromMatrix', + 'fromPoint', + 'fromQuad', + 'fromRect', + 'frontFace', + 'fround', + 'fullPath', + 'fullScreen', + 'fullscreen', + 'fullscreenElement', + 'fullscreenEnabled', + 'fx', + 'fy', + 'gain', + 'gamepad', + 'gamma', + 'gap', + 'gatheringState', + 'gatt', + 'genderIdentity', + 'generateCertificate', + 'generateKey', + 'generateMipmap', + 'generateRequest', + 'geolocation', + 'gestureObject', + 'get', + 'getActiveAttrib', + 'getActiveUniform', + 'getActiveUniformBlockName', + 'getActiveUniformBlockParameter', + 'getActiveUniforms', + 'getAdjacentText', + 'getAll', + 'getAllKeys', + 'getAllResponseHeaders', + 'getAllowlistForFeature', + 'getAnimations', + 'getAsFile', + 'getAsString', + 'getAttachedShaders', + 'getAttribLocation', + 'getAttribute', + 'getAttributeNS', + 'getAttributeNames', + 'getAttributeNode', + 'getAttributeNodeNS', + 'getAttributeType', + 'getAudioTracks', + 'getAvailability', + 'getBBox', + 'getBattery', + 'getBigInt64', + 'getBigUint64', + 'getBlob', + 'getBookmark', + 'getBoundingClientRect', + 'getBounds', + 'getBoxQuads', + 'getBufferParameter', + 'getBufferSubData', + 'getByteFrequencyData', + 'getByteTimeDomainData', + 'getCSSCanvasContext', + 'getCTM', + 'getCandidateWindowClientRect', + 'getCanonicalLocales', + 'getCapabilities', + 'getChannelData', + 'getCharNumAtPosition', + 'getCharacteristic', + 'getCharacteristics', + 'getClientExtensionResults', + 'getClientRect', + 'getClientRects', + 'getCoalescedEvents', + 'getCompositionAlternatives', + 'getComputedStyle', + 'getComputedTextLength', + 'getComputedTiming', + 'getConfiguration', + 'getConstraints', + 'getContext', + 'getContextAttributes', + 'getContributingSources', + 'getCounterValue', + 'getCueAsHTML', + 'getCueById', + 'getCurrentPosition', + 'getCurrentTime', + 'getData', + 'getDatabaseNames', + 'getDate', + 'getDay', + 'getDefaultComputedStyle', + 'getDescriptor', + 'getDescriptors', + 'getDestinationInsertionPoints', + 'getDevices', + 'getDirectory', + 'getDisplayMedia', + 'getDistributedNodes', + 'getEditable', + 'getElementById', + 'getElementsByClassName', + 'getElementsByName', + 'getElementsByTagName', + 'getElementsByTagNameNS', + 'getEnclosureList', + 'getEndPositionOfChar', + 'getEntries', + 'getEntriesByName', + 'getEntriesByType', + 'getError', + 'getExtension', + 'getExtentOfChar', + 'getEyeParameters', + 'getFeature', + 'getFile', + 'getFiles', + 'getFilesAndDirectories', + 'getFingerprints', + 'getFloat32', + 'getFloat64', + 'getFloatFrequencyData', + 'getFloatTimeDomainData', + 'getFloatValue', + 'getFragDataLocation', + 'getFrameData', + 'getFramebufferAttachmentParameter', + 'getFrequencyResponse', + 'getFullYear', + 'getGamepads', + 'getHitTestResults', + 'getHitTestResultsForTransientInput', + 'getHours', + 'getIdentityAssertion', + 'getIds', + 'getImageData', + 'getIndexedParameter', + 'getInstalledRelatedApps', + 'getInt16', + 'getInt32', + 'getInt8', + 'getInternalformatParameter', + 'getIntersectionList', + 'getItem', + 'getItems', + 'getKey', + 'getKeyframes', + 'getLayers', + 'getLayoutMap', + 'getLineDash', + 'getLocalCandidates', + 'getLocalParameters', + 'getLocalStreams', + 'getMarks', + 'getMatchedCSSRules', + 'getMaxGCPauseSinceClear', + 'getMeasures', + 'getMetadata', + 'getMilliseconds', + 'getMinutes', + 'getModifierState', + 'getMonth', + 'getNamedItem', + 'getNamedItemNS', + 'getNativeFramebufferScaleFactor', + 'getNotifications', + 'getNotifier', + 'getNumberOfChars', + 'getOffsetReferenceSpace', + 'getOutputTimestamp', + 'getOverrideHistoryNavigationMode', + 'getOverrideStyle', + 'getOwnPropertyDescriptor', + 'getOwnPropertyDescriptors', + 'getOwnPropertyNames', + 'getOwnPropertySymbols', + 'getParameter', + 'getParameters', + 'getParent', + 'getPathSegAtLength', + 'getPhotoCapabilities', + 'getPhotoSettings', + 'getPointAtLength', + 'getPose', + 'getPredictedEvents', + 'getPreference', + 'getPreferenceDefault', + 'getPresentationAttribute', + 'getPreventDefault', + 'getPrimaryService', + 'getPrimaryServices', + 'getProgramInfoLog', + 'getProgramParameter', + 'getPropertyCSSValue', + 'getPropertyPriority', + 'getPropertyShorthand', + 'getPropertyType', + 'getPropertyValue', + 'getPrototypeOf', + 'getQuery', + 'getQueryParameter', + 'getRGBColorValue', + 'getRandomValues', + 'getRangeAt', + 'getReader', + 'getReceivers', + 'getRectValue', + 'getRegistration', + 'getRegistrations', + 'getRemoteCandidates', + 'getRemoteCertificates', + 'getRemoteParameters', + 'getRemoteStreams', + 'getRenderbufferParameter', + 'getResponseHeader', + 'getRoot', + 'getRootNode', + 'getRotationOfChar', + 'getSVGDocument', + 'getSamplerParameter', + 'getScreenCTM', + 'getSeconds', + 'getSelectedCandidatePair', + 'getSelection', + 'getSenders', + 'getService', + 'getSettings', + 'getShaderInfoLog', + 'getShaderParameter', + 'getShaderPrecisionFormat', + 'getShaderSource', + 'getSimpleDuration', + 'getSiteIcons', + 'getSources', + 'getSpeculativeParserUrls', + 'getStartPositionOfChar', + 'getStartTime', + 'getState', + 'getStats', + 'getStatusForPolicy', + 'getStorageUpdates', + 'getStreamById', + 'getStringValue', + 'getSubStringLength', + 'getSubscription', + 'getSupportedConstraints', + 'getSupportedExtensions', + 'getSupportedFormats', + 'getSyncParameter', + 'getSynchronizationSources', + 'getTags', + 'getTargetRanges', + 'getTexParameter', + 'getTime', + 'getTimezoneOffset', + 'getTiming', + 'getTotalLength', + 'getTrackById', + 'getTracks', + 'getTransceivers', + 'getTransform', + 'getTransformFeedbackVarying', + 'getTransformToElement', + 'getTransports', + 'getType', + 'getTypeMapping', + 'getUTCDate', + 'getUTCDay', + 'getUTCFullYear', + 'getUTCHours', + 'getUTCMilliseconds', + 'getUTCMinutes', + 'getUTCMonth', + 'getUTCSeconds', + 'getUint16', + 'getUint32', + 'getUint8', + 'getUniform', + 'getUniformBlockIndex', + 'getUniformIndices', + 'getUniformLocation', + 'getUserMedia', + 'getVRDisplays', + 'getValues', + 'getVarDate', + 'getVariableValue', + 'getVertexAttrib', + 'getVertexAttribOffset', + 'getVideoPlaybackQuality', + 'getVideoTracks', + 'getViewerPose', + 'getViewport', + 'getVoices', + 'getWakeLockState', + 'getWriter', + 'getYear', + 'givenName', + 'global', + 'globalAlpha', + 'globalCompositeOperation', + 'globalThis', + 'glyphOrientationHorizontal', + 'glyphOrientationVertical', + 'glyphRef', + 'go', + 'grabFrame', + 'grad', + 'gradientTransform', + 'gradientUnits', + 'grammars', + 'green', + 'grid', + 'grid-area', + 'grid-auto-columns', + 'grid-auto-flow', + 'grid-auto-rows', + 'grid-column', + 'grid-column-end', + 'grid-column-gap', + 'grid-column-start', + 'grid-gap', + 'grid-row', + 'grid-row-end', + 'grid-row-gap', + 'grid-row-start', + 'grid-template', + 'grid-template-areas', + 'grid-template-columns', + 'grid-template-rows', + 'gridArea', + 'gridAutoColumns', + 'gridAutoFlow', + 'gridAutoRows', + 'gridColumn', + 'gridColumnEnd', + 'gridColumnGap', + 'gridColumnStart', + 'gridGap', + 'gridRow', + 'gridRowEnd', + 'gridRowGap', + 'gridRowStart', + 'gridTemplate', + 'gridTemplateAreas', + 'gridTemplateColumns', + 'gridTemplateRows', + 'gripSpace', + 'group', + 'groupCollapsed', + 'groupEnd', + 'groupId', + 'hadRecentInput', + 'hand', + 'handedness', + 'hapticActuators', + 'hardwareConcurrency', + 'has', + 'hasAttribute', + 'hasAttributeNS', + 'hasAttributes', + 'hasBeenActive', + 'hasChildNodes', + 'hasComposition', + 'hasEnrolledInstrument', + 'hasExtension', + 'hasExternalDisplay', + 'hasFeature', + 'hasFocus', + 'hasInstance', + 'hasLayout', + 'hasOrientation', + 'hasOwnProperty', + 'hasPointerCapture', + 'hasPosition', + 'hasReading', + 'hasStorageAccess', + 'hash', + 'head', + 'headers', + 'heading', + 'height', + 'hidden', + 'hide', + 'hideFocus', + 'high', + 'highWaterMark', + 'hint', + 'history', + 'honorificPrefix', + 'honorificSuffix', + 'horizontalOverflow', + 'host', + 'hostCandidate', + 'hostname', + 'href', + 'hrefTranslate', + 'hreflang', + 'hspace', + 'html5TagCheckInerface', + 'htmlFor', + 'htmlText', + 'httpEquiv', + 'httpRequestStatusCode', + 'hwTimestamp', + 'hyphens', + 'hypot', + 'iccId', + 'iceConnectionState', + 'iceGatheringState', + 'iceTransport', + 'icon', + 'iconURL', + 'id', + 'identifier', + 'identity', + 'idpLoginUrl', + 'ignoreBOM', + 'ignoreCase', + 'ignoreDepthValues', + 'image-orientation', + 'image-rendering', + 'imageHeight', + 'imageOrientation', + 'imageRendering', + 'imageSizes', + 'imageSmoothingEnabled', + 'imageSmoothingQuality', + 'imageSrcset', + 'imageWidth', + 'images', + 'ime-mode', + 'imeMode', + 'implementation', + 'importKey', + 'importNode', + 'importStylesheet', + 'imports', + 'impp', + 'imul', + 'in', + 'in1', + 'in2', + 'inBandMetadataTrackDispatchType', + 'inRange', + 'includes', + 'incremental', + 'indeterminate', + 'index', + 'indexNames', + 'indexOf', + 'indexedDB', + 'indicate', + 'inertiaDestinationX', + 'inertiaDestinationY', + 'info', + 'init', + 'initAnimationEvent', + 'initBeforeLoadEvent', + 'initClipboardEvent', + 'initCloseEvent', + 'initCommandEvent', + 'initCompositionEvent', + 'initCustomEvent', + 'initData', + 'initDataType', + 'initDeviceMotionEvent', + 'initDeviceOrientationEvent', + 'initDragEvent', + 'initErrorEvent', + 'initEvent', + 'initFocusEvent', + 'initGestureEvent', + 'initHashChangeEvent', + 'initKeyEvent', + 'initKeyboardEvent', + 'initMSManipulationEvent', + 'initMessageEvent', + 'initMouseEvent', + 'initMouseScrollEvent', + 'initMouseWheelEvent', + 'initMutationEvent', + 'initNSMouseEvent', + 'initOverflowEvent', + 'initPageEvent', + 'initPageTransitionEvent', + 'initPointerEvent', + 'initPopStateEvent', + 'initProgressEvent', + 'initScrollAreaEvent', + 'initSimpleGestureEvent', + 'initStorageEvent', + 'initTextEvent', + 'initTimeEvent', + 'initTouchEvent', + 'initTransitionEvent', + 'initUIEvent', + 'initWebKitAnimationEvent', + 'initWebKitTransitionEvent', + 'initWebKitWheelEvent', + 'initWheelEvent', + 'initialTime', + 'initialize', + 'initiatorType', + 'inline-size', + 'inlineSize', + 'inlineVerticalFieldOfView', + 'inner', + 'innerHTML', + 'innerHeight', + 'innerText', + 'innerWidth', + 'input', + 'inputBuffer', + 'inputEncoding', + 'inputMethod', + 'inputMode', + 'inputSource', + 'inputSources', + 'inputType', + 'inputs', + 'insertAdjacentElement', + 'insertAdjacentHTML', + 'insertAdjacentText', + 'insertBefore', + 'insertCell', + 'insertDTMF', + 'insertData', + 'insertItemBefore', + 'insertNode', + 'insertRow', + 'insertRule', + 'inset', + 'inset-block', + 'inset-block-end', + 'inset-block-start', + 'inset-inline', + 'inset-inline-end', + 'inset-inline-start', + 'insetBlock', + 'insetBlockEnd', + 'insetBlockStart', + 'insetInline', + 'insetInlineEnd', + 'insetInlineStart', + 'installing', + 'instanceRoot', + 'instantiate', + 'instantiateStreaming', + 'instruments', + 'int16', + 'int32', + 'int8', + 'integrity', + 'interactionMode', + 'intercept', + 'interfaceClass', + 'interfaceName', + 'interfaceNumber', + 'interfaceProtocol', + 'interfaceSubclass', + 'interfaces', + 'interimResults', + 'internalSubset', + 'interpretation', + 'intersectionRatio', + 'intersectionRect', + 'intersectsNode', + 'interval', + 'invalidIteratorState', + 'invalidateFramebuffer', + 'invalidateSubFramebuffer', + 'inverse', + 'invertSelf', + 'is', + 'is2D', + 'isActive', + 'isAlternate', + 'isArray', + 'isBingCurrentSearchDefault', + 'isBuffer', + 'isCandidateWindowVisible', + 'isChar', + 'isCollapsed', + 'isComposing', + 'isConcatSpreadable', + 'isConnected', + 'isContentEditable', + 'isContentHandlerRegistered', + 'isContextLost', + 'isDefaultNamespace', + 'isDirectory', + 'isDisabled', + 'isEnabled', + 'isEqual', + 'isEqualNode', + 'isExtensible', + 'isExternalCTAP2SecurityKeySupported', + 'isFile', + 'isFinite', + 'isFramebuffer', + 'isFrozen', + 'isGenerator', + 'isHTML', + 'isHistoryNavigation', + 'isId', + 'isIdentity', + 'isInjected', + 'isInteger', + 'isIntersecting', + 'isLockFree', + 'isMap', + 'isMultiLine', + 'isNaN', + 'isOpen', + 'isPointInFill', + 'isPointInPath', + 'isPointInRange', + 'isPointInStroke', + 'isPrefAlternate', + 'isPresenting', + 'isPrimary', + 'isProgram', + 'isPropertyImplicit', + 'isProtocolHandlerRegistered', + 'isPrototypeOf', + 'isQuery', + 'isRenderbuffer', + 'isSafeInteger', + 'isSameNode', + 'isSampler', + 'isScript', + 'isScriptURL', + 'isSealed', + 'isSecureContext', + 'isSessionSupported', + 'isShader', + 'isSupported', + 'isSync', + 'isTextEdit', + 'isTexture', + 'isTransformFeedback', + 'isTrusted', + 'isTypeSupported', + 'isUserVerifyingPlatformAuthenticatorAvailable', + 'isVertexArray', + 'isView', + 'isVisible', + 'isochronousTransferIn', + 'isochronousTransferOut', + 'isolation', + 'italics', + 'item', + 'itemId', + 'itemProp', + 'itemRef', + 'itemScope', + 'itemType', + 'itemValue', + 'items', + 'iterateNext', + 'iterationComposite', + 'iterator', + 'javaEnabled', + 'jobTitle', + 'join', + 'json', + 'justify-content', + 'justify-items', + 'justify-self', + 'justifyContent', + 'justifyItems', + 'justifySelf', + 'k1', + 'k2', + 'k3', + 'k4', + 'kHz', + 'keepalive', + 'kernelMatrix', + 'kernelUnitLengthX', + 'kernelUnitLengthY', + 'kerning', + 'key', + 'keyCode', + 'keyFor', + 'keyIdentifier', + 'keyLightEnabled', + 'keyLocation', + 'keyPath', + 'keyStatuses', + 'keySystem', + 'keyText', + 'keyUsage', + 'keyboard', + 'keys', + 'keytype', + 'kind', + 'knee', + 'label', + 'labels', + 'lang', + 'language', + 'languages', + 'largeArcFlag', + 'lastChild', + 'lastElementChild', + 'lastEventId', + 'lastIndex', + 'lastIndexOf', + 'lastInputTime', + 'lastMatch', + 'lastMessageSubject', + 'lastMessageType', + 'lastModified', + 'lastModifiedDate', + 'lastPage', + 'lastParen', + 'lastState', + 'lastStyleSheetSet', + 'latitude', + 'layerX', + 'layerY', + 'layoutFlow', + 'layoutGrid', + 'layoutGridChar', + 'layoutGridLine', + 'layoutGridMode', + 'layoutGridType', + 'lbound', + 'left', + 'leftContext', + 'leftDegrees', + 'leftMargin', + 'leftProjectionMatrix', + 'leftViewMatrix', + 'length', + 'lengthAdjust', + 'lengthComputable', + 'letter-spacing', + 'letterSpacing', + 'level', + 'lighting-color', + 'lightingColor', + 'limitingConeAngle', + 'line', + 'line-break', + 'line-height', + 'lineAlign', + 'lineBreak', + 'lineCap', + 'lineDashOffset', + 'lineHeight', + 'lineJoin', + 'lineNumber', + 'lineTo', + 'lineWidth', + 'linearAcceleration', + 'linearRampToValueAtTime', + 'linearVelocity', + 'lineno', + 'lines', + 'link', + 'linkColor', + 'linkProgram', + 'links', + 'list', + 'list-style', + 'list-style-image', + 'list-style-position', + 'list-style-type', + 'listStyle', + 'listStyleImage', + 'listStylePosition', + 'listStyleType', + 'listener', + 'load', + 'loadEventEnd', + 'loadEventStart', + 'loadTime', + 'loadTimes', + 'loaded', + 'loading', + 'localDescription', + 'localName', + 'localService', + 'localStorage', + 'locale', + 'localeCompare', + 'location', + 'locationbar', + 'lock', + 'locked', + 'lockedFile', + 'locks', + 'log', + 'log10', + 'log1p', + 'log2', + 'logicalXDPI', + 'logicalYDPI', + 'longDesc', + 'longitude', + 'lookupNamespaceURI', + 'lookupPrefix', + 'loop', + 'loopEnd', + 'loopStart', + 'looping', + 'low', + 'lower', + 'lowerBound', + 'lowerOpen', + 'lowsrc', + 'm11', + 'm12', + 'm13', + 'm14', + 'm21', + 'm22', + 'm23', + 'm24', + 'm31', + 'm32', + 'm33', + 'm34', + 'm41', + 'm42', + 'm43', + 'm44', + 'makeXRCompatible', + 'manifest', + 'manufacturer', + 'manufacturerName', + 'map', + 'mapping', + 'margin', + 'margin-block', + 'margin-block-end', + 'margin-block-start', + 'margin-bottom', + 'margin-inline', + 'margin-inline-end', + 'margin-inline-start', + 'margin-left', + 'margin-right', + 'margin-top', + 'marginBlock', + 'marginBlockEnd', + 'marginBlockStart', + 'marginBottom', + 'marginHeight', + 'marginInline', + 'marginInlineEnd', + 'marginInlineStart', + 'marginLeft', + 'marginRight', + 'marginTop', + 'marginWidth', + 'mark', + 'marker', + 'marker-end', + 'marker-mid', + 'marker-offset', + 'marker-start', + 'markerEnd', + 'markerHeight', + 'markerMid', + 'markerOffset', + 'markerStart', + 'markerUnits', + 'markerWidth', + 'marks', + 'mask', + 'mask-clip', + 'mask-composite', + 'mask-image', + 'mask-mode', + 'mask-origin', + 'mask-position', + 'mask-position-x', + 'mask-position-y', + 'mask-repeat', + 'mask-size', + 'mask-type', + 'maskClip', + 'maskComposite', + 'maskContentUnits', + 'maskImage', + 'maskMode', + 'maskOrigin', + 'maskPosition', + 'maskPositionX', + 'maskPositionY', + 'maskRepeat', + 'maskSize', + 'maskType', + 'maskUnits', + 'match', + 'matchAll', + 'matchMedia', + 'matchMedium', + 'matches', + 'matrix', + 'matrixTransform', + 'max', + 'max-block-size', + 'max-height', + 'max-inline-size', + 'max-width', + 'maxActions', + 'maxAlternatives', + 'maxBlockSize', + 'maxChannelCount', + 'maxChannels', + 'maxConnectionsPerServer', + 'maxDecibels', + 'maxDistance', + 'maxHeight', + 'maxInlineSize', + 'maxLayers', + 'maxLength', + 'maxMessageSize', + 'maxPacketLifeTime', + 'maxRetransmits', + 'maxTouchPoints', + 'maxValue', + 'maxWidth', + 'measure', + 'measureText', + 'media', + 'mediaCapabilities', + 'mediaDevices', + 'mediaElement', + 'mediaGroup', + 'mediaKeys', + 'mediaSession', + 'mediaStream', + 'mediaText', + 'meetOrSlice', + 'memory', + 'menubar', + 'mergeAttributes', + 'message', + 'messageClass', + 'messageHandlers', + 'messageType', + 'metaKey', + 'metadata', + 'method', + 'methodDetails', + 'methodName', + 'mid', + 'mimeType', + 'mimeTypes', + 'min', + 'min-block-size', + 'min-height', + 'min-inline-size', + 'min-width', + 'minBlockSize', + 'minDecibels', + 'minHeight', + 'minInlineSize', + 'minLength', + 'minValue', + 'minWidth', + 'miterLimit', + 'mix-blend-mode', + 'mixBlendMode', + 'mm', + 'mode', + 'modify', + 'mount', + 'move', + 'moveBy', + 'moveEnd', + 'moveFirst', + 'moveFocusDown', + 'moveFocusLeft', + 'moveFocusRight', + 'moveFocusUp', + 'moveNext', + 'moveRow', + 'moveStart', + 'moveTo', + 'moveToBookmark', + 'moveToElementText', + 'moveToPoint', + 'movementX', + 'movementY', + 'mozAdd', + 'mozAnimationStartTime', + 'mozAnon', + 'mozApps', + 'mozAudioCaptured', + 'mozAudioChannelType', + 'mozAutoplayEnabled', + 'mozCancelAnimationFrame', + 'mozCancelFullScreen', + 'mozCancelRequestAnimationFrame', + 'mozCaptureStream', + 'mozCaptureStreamUntilEnded', + 'mozClearDataAt', + 'mozContact', + 'mozContacts', + 'mozCreateFileHandle', + 'mozCurrentTransform', + 'mozCurrentTransformInverse', + 'mozCursor', + 'mozDash', + 'mozDashOffset', + 'mozDecodedFrames', + 'mozExitPointerLock', + 'mozFillRule', + 'mozFragmentEnd', + 'mozFrameDelay', + 'mozFullScreen', + 'mozFullScreenElement', + 'mozFullScreenEnabled', + 'mozGetAll', + 'mozGetAllKeys', + 'mozGetAsFile', + 'mozGetDataAt', + 'mozGetMetadata', + 'mozGetUserMedia', + 'mozHasAudio', + 'mozHasItem', + 'mozHidden', + 'mozImageSmoothingEnabled', + 'mozIndexedDB', + 'mozInnerScreenX', + 'mozInnerScreenY', + 'mozInputSource', + 'mozIsTextField', + 'mozItem', + 'mozItemCount', + 'mozItems', + 'mozLength', + 'mozLockOrientation', + 'mozMatchesSelector', + 'mozMovementX', + 'mozMovementY', + 'mozOpaque', + 'mozOrientation', + 'mozPaintCount', + 'mozPaintedFrames', + 'mozParsedFrames', + 'mozPay', + 'mozPointerLockElement', + 'mozPresentedFrames', + 'mozPreservesPitch', + 'mozPressure', + 'mozPrintCallback', + 'mozRTCIceCandidate', + 'mozRTCPeerConnection', + 'mozRTCSessionDescription', + 'mozRemove', + 'mozRequestAnimationFrame', + 'mozRequestFullScreen', + 'mozRequestPointerLock', + 'mozSetDataAt', + 'mozSetImageElement', + 'mozSourceNode', + 'mozSrcObject', + 'mozSystem', + 'mozTCPSocket', + 'mozTextStyle', + 'mozTypesAt', + 'mozUnlockOrientation', + 'mozUserCancelled', + 'mozVisibilityState', + 'ms', + 'msAnimation', + 'msAnimationDelay', + 'msAnimationDirection', + 'msAnimationDuration', + 'msAnimationFillMode', + 'msAnimationIterationCount', + 'msAnimationName', + 'msAnimationPlayState', + 'msAnimationStartTime', + 'msAnimationTimingFunction', + 'msBackfaceVisibility', + 'msBlockProgression', + 'msCSSOMElementFloatMetrics', + 'msCaching', + 'msCachingEnabled', + 'msCancelRequestAnimationFrame', + 'msCapsLockWarningOff', + 'msClearImmediate', + 'msClose', + 'msContentZoomChaining', + 'msContentZoomFactor', + 'msContentZoomLimit', + 'msContentZoomLimitMax', + 'msContentZoomLimitMin', + 'msContentZoomSnap', + 'msContentZoomSnapPoints', + 'msContentZoomSnapType', + 'msContentZooming', + 'msConvertURL', + 'msCrypto', + 'msDoNotTrack', + 'msElementsFromPoint', + 'msElementsFromRect', + 'msExitFullscreen', + 'msExtendedCode', + 'msFillRule', + 'msFirstPaint', + 'msFlex', + 'msFlexAlign', + 'msFlexDirection', + 'msFlexFlow', + 'msFlexItemAlign', + 'msFlexLinePack', + 'msFlexNegative', + 'msFlexOrder', + 'msFlexPack', + 'msFlexPositive', + 'msFlexPreferredSize', + 'msFlexWrap', + 'msFlowFrom', + 'msFlowInto', + 'msFontFeatureSettings', + 'msFullscreenElement', + 'msFullscreenEnabled', + 'msGetInputContext', + 'msGetRegionContent', + 'msGetUntransformedBounds', + 'msGraphicsTrustStatus', + 'msGridColumn', + 'msGridColumnAlign', + 'msGridColumnSpan', + 'msGridColumns', + 'msGridRow', + 'msGridRowAlign', + 'msGridRowSpan', + 'msGridRows', + 'msHidden', + 'msHighContrastAdjust', + 'msHyphenateLimitChars', + 'msHyphenateLimitLines', + 'msHyphenateLimitZone', + 'msHyphens', + 'msImageSmoothingEnabled', + 'msImeAlign', + 'msIndexedDB', + 'msInterpolationMode', + 'msIsStaticHTML', + 'msKeySystem', + 'msKeys', + 'msLaunchUri', + 'msLockOrientation', + 'msManipulationViewsEnabled', + 'msMatchMedia', + 'msMatchesSelector', + 'msMaxTouchPoints', + 'msOrientation', + 'msOverflowStyle', + 'msPerspective', + 'msPerspectiveOrigin', + 'msPlayToDisabled', + 'msPlayToPreferredSourceUri', + 'msPlayToPrimary', + 'msPointerEnabled', + 'msRegionOverflow', + 'msReleasePointerCapture', + 'msRequestAnimationFrame', + 'msRequestFullscreen', + 'msSaveBlob', + 'msSaveOrOpenBlob', + 'msScrollChaining', + 'msScrollLimit', + 'msScrollLimitXMax', + 'msScrollLimitXMin', + 'msScrollLimitYMax', + 'msScrollLimitYMin', + 'msScrollRails', + 'msScrollSnapPointsX', + 'msScrollSnapPointsY', + 'msScrollSnapType', + 'msScrollSnapX', + 'msScrollSnapY', + 'msScrollTranslation', + 'msSetImmediate', + 'msSetMediaKeys', + 'msSetPointerCapture', + 'msTextCombineHorizontal', + 'msTextSizeAdjust', + 'msToBlob', + 'msTouchAction', + 'msTouchSelect', + 'msTraceAsyncCallbackCompleted', + 'msTraceAsyncCallbackStarting', + 'msTraceAsyncOperationCompleted', + 'msTraceAsyncOperationStarting', + 'msTransform', + 'msTransformOrigin', + 'msTransformStyle', + 'msTransition', + 'msTransitionDelay', + 'msTransitionDuration', + 'msTransitionProperty', + 'msTransitionTimingFunction', + 'msUnlockOrientation', + 'msUpdateAsyncCallbackRelation', + 'msUserSelect', + 'msVisibilityState', + 'msWrapFlow', + 'msWrapMargin', + 'msWrapThrough', + 'msWriteProfilerMark', + 'msZoom', + 'msZoomTo', + 'mt', + 'mul', + 'multiEntry', + 'multiSelectionObj', + 'multiline', + 'multiple', + 'multiply', + 'multiplySelf', + 'mutableFile', + 'muted', + 'n', + 'name', + 'nameProp', + 'namedItem', + 'namedRecordset', + 'names', + 'namespaceURI', + 'namespaces', + 'naturalHeight', + 'naturalWidth', + 'navigate', + 'navigation', + 'navigationMode', + 'navigationPreload', + 'navigationStart', + 'navigator', + 'near', + 'nearestViewportElement', + 'negative', + 'negotiated', + 'netscape', + 'networkState', + 'newScale', + 'newTranslate', + 'newURL', + 'newValue', + 'newValueSpecifiedUnits', + 'newVersion', + 'newhome', + 'next', + 'nextElementSibling', + 'nextHopProtocol', + 'nextNode', + 'nextPage', + 'nextSibling', + 'nickname', + 'noHref', + 'noModule', + 'noResize', + 'noShade', + 'noValidate', + 'noWrap', + 'node', + 'nodeName', + 'nodeType', + 'nodeValue', + 'nonce', + 'normalize', + 'normalizedPathSegList', + 'notationName', + 'notations', + 'note', + 'noteGrainOn', + 'noteOff', + 'noteOn', + 'notify', + 'now', + 'numOctaves', + 'number', + 'numberOfChannels', + 'numberOfInputs', + 'numberOfItems', + 'numberOfOutputs', + 'numberValue', + 'oMatchesSelector', + 'object', + 'object-fit', + 'object-position', + 'objectFit', + 'objectPosition', + 'objectStore', + 'objectStoreNames', + 'objectType', + 'observe', + 'of', + 'offscreenBuffering', + 'offset', + 'offset-anchor', + 'offset-distance', + 'offset-path', + 'offset-rotate', + 'offsetAnchor', + 'offsetDistance', + 'offsetHeight', + 'offsetLeft', + 'offsetNode', + 'offsetParent', + 'offsetPath', + 'offsetRotate', + 'offsetTop', + 'offsetWidth', + 'offsetX', + 'offsetY', + 'ok', + 'oldURL', + 'oldValue', + 'oldVersion', + 'olderShadowRoot', + 'onLine', + 'onabort', + 'onabsolutedeviceorientation', + 'onactivate', + 'onactive', + 'onaddsourcebuffer', + 'onaddstream', + 'onaddtrack', + 'onafterprint', + 'onafterscriptexecute', + 'onafterupdate', + 'onanimationcancel', + 'onanimationend', + 'onanimationiteration', + 'onanimationstart', + 'onappinstalled', + 'onaudioend', + 'onaudioprocess', + 'onaudiostart', + 'onautocomplete', + 'onautocompleteerror', + 'onauxclick', + 'onbeforeactivate', + 'onbeforecopy', + 'onbeforecut', + 'onbeforedeactivate', + 'onbeforeeditfocus', + 'onbeforeinstallprompt', + 'onbeforepaste', + 'onbeforeprint', + 'onbeforescriptexecute', + 'onbeforeunload', + 'onbeforeupdate', + 'onbeforexrselect', + 'onbegin', + 'onblocked', + 'onblur', + 'onbounce', + 'onboundary', + 'onbufferedamountlow', + 'oncached', + 'oncancel', + 'oncandidatewindowhide', + 'oncandidatewindowshow', + 'oncandidatewindowupdate', + 'oncanplay', + 'oncanplaythrough', + 'once', + 'oncellchange', + 'onchange', + 'oncharacteristicvaluechanged', + 'onchargingchange', + 'onchargingtimechange', + 'onchecking', + 'onclick', + 'onclose', + 'onclosing', + 'oncompassneedscalibration', + 'oncomplete', + 'onconnect', + 'onconnecting', + 'onconnectionavailable', + 'onconnectionstatechange', + 'oncontextmenu', + 'oncontrollerchange', + 'oncontrolselect', + 'oncopy', + 'oncuechange', + 'oncut', + 'ondataavailable', + 'ondatachannel', + 'ondatasetchanged', + 'ondatasetcomplete', + 'ondblclick', + 'ondeactivate', + 'ondevicechange', + 'ondevicelight', + 'ondevicemotion', + 'ondeviceorientation', + 'ondeviceorientationabsolute', + 'ondeviceproximity', + 'ondischargingtimechange', + 'ondisconnect', + 'ondisplay', + 'ondownloading', + 'ondrag', + 'ondragend', + 'ondragenter', + 'ondragexit', + 'ondragleave', + 'ondragover', + 'ondragstart', + 'ondrop', + 'ondurationchange', + 'onemptied', + 'onencrypted', + 'onend', + 'onended', + 'onenter', + 'onenterpictureinpicture', + 'onerror', + 'onerrorupdate', + 'onexit', + 'onfilterchange', + 'onfinish', + 'onfocus', + 'onfocusin', + 'onfocusout', + 'onformdata', + 'onfreeze', + 'onfullscreenchange', + 'onfullscreenerror', + 'ongatheringstatechange', + 'ongattserverdisconnected', + 'ongesturechange', + 'ongestureend', + 'ongesturestart', + 'ongotpointercapture', + 'onhashchange', + 'onhelp', + 'onicecandidate', + 'onicecandidateerror', + 'oniceconnectionstatechange', + 'onicegatheringstatechange', + 'oninactive', + 'oninput', + 'oninputsourceschange', + 'oninvalid', + 'onkeydown', + 'onkeypress', + 'onkeystatuseschange', + 'onkeyup', + 'onlanguagechange', + 'onlayoutcomplete', + 'onleavepictureinpicture', + 'onlevelchange', + 'onload', + 'onloadeddata', + 'onloadedmetadata', + 'onloadend', + 'onloading', + 'onloadingdone', + 'onloadingerror', + 'onloadstart', + 'onlosecapture', + 'onlostpointercapture', + 'only', + 'onmark', + 'onmessage', + 'onmessageerror', + 'onmidimessage', + 'onmousedown', + 'onmouseenter', + 'onmouseleave', + 'onmousemove', + 'onmouseout', + 'onmouseover', + 'onmouseup', + 'onmousewheel', + 'onmove', + 'onmoveend', + 'onmovestart', + 'onmozfullscreenchange', + 'onmozfullscreenerror', + 'onmozorientationchange', + 'onmozpointerlockchange', + 'onmozpointerlockerror', + 'onmscontentzoom', + 'onmsfullscreenchange', + 'onmsfullscreenerror', + 'onmsgesturechange', + 'onmsgesturedoubletap', + 'onmsgestureend', + 'onmsgesturehold', + 'onmsgesturestart', + 'onmsgesturetap', + 'onmsgotpointercapture', + 'onmsinertiastart', + 'onmslostpointercapture', + 'onmsmanipulationstatechanged', + 'onmsneedkey', + 'onmsorientationchange', + 'onmspointercancel', + 'onmspointerdown', + 'onmspointerenter', + 'onmspointerhover', + 'onmspointerleave', + 'onmspointermove', + 'onmspointerout', + 'onmspointerover', + 'onmspointerup', + 'onmssitemodejumplistitemremoved', + 'onmsthumbnailclick', + 'onmute', + 'onnegotiationneeded', + 'onnomatch', + 'onnoupdate', + 'onobsolete', + 'onoffline', + 'ononline', + 'onopen', + 'onorientationchange', + 'onpagechange', + 'onpagehide', + 'onpageshow', + 'onpaste', + 'onpause', + 'onpayerdetailchange', + 'onpaymentmethodchange', + 'onplay', + 'onplaying', + 'onpluginstreamstart', + 'onpointercancel', + 'onpointerdown', + 'onpointerenter', + 'onpointerleave', + 'onpointerlockchange', + 'onpointerlockerror', + 'onpointermove', + 'onpointerout', + 'onpointerover', + 'onpointerrawupdate', + 'onpointerup', + 'onpopstate', + 'onprocessorerror', + 'onprogress', + 'onpropertychange', + 'onratechange', + 'onreading', + 'onreadystatechange', + 'onrejectionhandled', + 'onrelease', + 'onremove', + 'onremovesourcebuffer', + 'onremovestream', + 'onremovetrack', + 'onrepeat', + 'onreset', + 'onresize', + 'onresizeend', + 'onresizestart', + 'onresourcetimingbufferfull', + 'onresult', + 'onresume', + 'onrowenter', + 'onrowexit', + 'onrowsdelete', + 'onrowsinserted', + 'onscroll', + 'onsearch', + 'onsecuritypolicyviolation', + 'onseeked', + 'onseeking', + 'onselect', + 'onselectedcandidatepairchange', + 'onselectend', + 'onselectionchange', + 'onselectstart', + 'onshippingaddresschange', + 'onshippingoptionchange', + 'onshow', + 'onsignalingstatechange', + 'onsoundend', + 'onsoundstart', + 'onsourceclose', + 'onsourceclosed', + 'onsourceended', + 'onsourceopen', + 'onspeechend', + 'onspeechstart', + 'onsqueeze', + 'onsqueezeend', + 'onsqueezestart', + 'onstalled', + 'onstart', + 'onstatechange', + 'onstop', + 'onstorage', + 'onstoragecommit', + 'onsubmit', + 'onsuccess', + 'onsuspend', + 'onterminate', + 'ontextinput', + 'ontimeout', + 'ontimeupdate', + 'ontoggle', + 'ontonechange', + 'ontouchcancel', + 'ontouchend', + 'ontouchmove', + 'ontouchstart', + 'ontrack', + 'ontransitioncancel', + 'ontransitionend', + 'ontransitionrun', + 'ontransitionstart', + 'onunhandledrejection', + 'onunload', + 'onunmute', + 'onupdate', + 'onupdateend', + 'onupdatefound', + 'onupdateready', + 'onupdatestart', + 'onupgradeneeded', + 'onuserproximity', + 'onversionchange', + 'onvisibilitychange', + 'onvoiceschanged', + 'onvolumechange', + 'onvrdisplayactivate', + 'onvrdisplayconnect', + 'onvrdisplaydeactivate', + 'onvrdisplaydisconnect', + 'onvrdisplaypresentchange', + 'onwaiting', + 'onwaitingforkey', + 'onwarning', + 'onwebkitanimationend', + 'onwebkitanimationiteration', + 'onwebkitanimationstart', + 'onwebkitcurrentplaybacktargetiswirelesschanged', + 'onwebkitfullscreenchange', + 'onwebkitfullscreenerror', + 'onwebkitkeyadded', + 'onwebkitkeyerror', + 'onwebkitkeymessage', + 'onwebkitneedkey', + 'onwebkitorientationchange', + 'onwebkitplaybacktargetavailabilitychanged', + 'onwebkitpointerlockchange', + 'onwebkitpointerlockerror', + 'onwebkitresourcetimingbufferfull', + 'onwebkittransitionend', + 'onwheel', + 'onzoom', + 'opacity', + 'open', + 'openCursor', + 'openDatabase', + 'openKeyCursor', + 'opened', + 'opener', + 'opera', + 'operationType', + 'operator', + 'opr', + 'optimum', + 'options', + 'or', + 'order', + 'orderX', + 'orderY', + 'ordered', + 'org', + 'organization', + 'orient', + 'orientAngle', + 'orientType', + 'orientation', + 'orientationX', + 'orientationY', + 'orientationZ', + 'origin', + 'originalPolicy', + 'originalTarget', + 'orphans', + 'oscpu', + 'outerHTML', + 'outerHeight', + 'outerText', + 'outerWidth', + 'outline', + 'outline-color', + 'outline-offset', + 'outline-style', + 'outline-width', + 'outlineColor', + 'outlineOffset', + 'outlineStyle', + 'outlineWidth', + 'outputBuffer', + 'outputLatency', + 'outputs', + 'overflow', + 'overflow-anchor', + 'overflow-block', + 'overflow-inline', + 'overflow-wrap', + 'overflow-x', + 'overflow-y', + 'overflowAnchor', + 'overflowBlock', + 'overflowInline', + 'overflowWrap', + 'overflowX', + 'overflowY', + 'overrideMimeType', + 'oversample', + 'overscroll-behavior', + 'overscroll-behavior-block', + 'overscroll-behavior-inline', + 'overscroll-behavior-x', + 'overscroll-behavior-y', + 'overscrollBehavior', + 'overscrollBehaviorBlock', + 'overscrollBehaviorInline', + 'overscrollBehaviorX', + 'overscrollBehaviorY', + 'ownKeys', + 'ownerDocument', + 'ownerElement', + 'ownerNode', + 'ownerRule', + 'ownerSVGElement', + 'owningElement', + 'p1', + 'p2', + 'p3', + 'p4', + 'packetSize', + 'packets', + 'pad', + 'padEnd', + 'padStart', + 'padding', + 'padding-block', + 'padding-block-end', + 'padding-block-start', + 'padding-bottom', + 'padding-inline', + 'padding-inline-end', + 'padding-inline-start', + 'padding-left', + 'padding-right', + 'padding-top', + 'paddingBlock', + 'paddingBlockEnd', + 'paddingBlockStart', + 'paddingBottom', + 'paddingInline', + 'paddingInlineEnd', + 'paddingInlineStart', + 'paddingLeft', + 'paddingRight', + 'paddingTop', + 'page', + 'page-break-after', + 'page-break-before', + 'page-break-inside', + 'pageBreakAfter', + 'pageBreakBefore', + 'pageBreakInside', + 'pageCount', + 'pageLeft', + 'pageTop', + 'pageX', + 'pageXOffset', + 'pageY', + 'pageYOffset', + 'pages', + 'paint-order', + 'paintOrder', + 'paintRequests', + 'paintType', + 'paintWorklet', + 'palette', + 'pan', + 'panningModel', + 'parameters', + 'parent', + 'parentElement', + 'parentNode', + 'parentRule', + 'parentStyleSheet', + 'parentTextEdit', + 'parentWindow', + 'parse', + 'parseAll', + 'parseFloat', + 'parseFromString', + 'parseInt', + 'part', + 'participants', + 'passive', + 'password', + 'pasteHTML', + 'path', + 'pathLength', + 'pathSegList', + 'pathSegType', + 'pathSegTypeAsLetter', + 'pathname', + 'pattern', + 'patternContentUnits', + 'patternMismatch', + 'patternTransform', + 'patternUnits', + 'pause', + 'pauseAnimations', + 'pauseOnExit', + 'pauseProfilers', + 'pauseTransformFeedback', + 'paused', + 'payerEmail', + 'payerName', + 'payerPhone', + 'paymentManager', + 'pc', + 'peerIdentity', + 'pending', + 'pendingLocalDescription', + 'pendingRemoteDescription', + 'percent', + 'performance', + 'periodicSync', + 'permission', + 'permissionState', + 'permissions', + 'persist', + 'persisted', + 'personalbar', + 'perspective', + 'perspective-origin', + 'perspectiveOrigin', + 'phone', + 'phoneticFamilyName', + 'phoneticGivenName', + 'photo', + 'pictureInPictureElement', + 'pictureInPictureEnabled', + 'pictureInPictureWindow', + 'ping', + 'pipeThrough', + 'pipeTo', + 'pitch', + 'pixelBottom', + 'pixelDepth', + 'pixelHeight', + 'pixelLeft', + 'pixelRight', + 'pixelStorei', + 'pixelTop', + 'pixelUnitToMillimeterX', + 'pixelUnitToMillimeterY', + 'pixelWidth', + 'place-content', + 'place-items', + 'place-self', + 'placeContent', + 'placeItems', + 'placeSelf', + 'placeholder', + 'platform', + 'platforms', + 'play', + 'playEffect', + 'playState', + 'playbackRate', + 'playbackState', + 'playbackTime', + 'played', + 'playoutDelayHint', + 'playsInline', + 'plugins', + 'pluginspage', + 'pname', + 'pointer-events', + 'pointerBeforeReferenceNode', + 'pointerEnabled', + 'pointerEvents', + 'pointerId', + 'pointerLockElement', + 'pointerType', + 'points', + 'pointsAtX', + 'pointsAtY', + 'pointsAtZ', + 'polygonOffset', + 'pop', + 'populateMatrix', + 'popupWindowFeatures', + 'popupWindowName', + 'popupWindowURI', + 'port', + 'port1', + 'port2', + 'ports', + 'posBottom', + 'posHeight', + 'posLeft', + 'posRight', + 'posTop', + 'posWidth', + 'pose', + 'position', + 'positionAlign', + 'positionX', + 'positionY', + 'positionZ', + 'postError', + 'postMessage', + 'postalCode', + 'poster', + 'pow', + 'powerEfficient', + 'powerOff', + 'preMultiplySelf', + 'precision', + 'preferredStyleSheetSet', + 'preferredStylesheetSet', + 'prefix', + 'preload', + 'prepend', + 'presentation', + 'preserveAlpha', + 'preserveAspectRatio', + 'preserveAspectRatioString', + 'pressed', + 'pressure', + 'prevValue', + 'preventDefault', + 'preventExtensions', + 'preventSilentAccess', + 'previousElementSibling', + 'previousNode', + 'previousPage', + 'previousRect', + 'previousScale', + 'previousSibling', + 'previousTranslate', + 'primaryKey', + 'primitiveType', + 'primitiveUnits', + 'principals', + 'print', + 'priority', + 'privateKey', + 'probablySupportsContext', + 'process', + 'processIceMessage', + 'processingEnd', + 'processingStart', + 'product', + 'productId', + 'productName', + 'productSub', + 'profile', + 'profileEnd', + 'profiles', + 'projectionMatrix', + 'promise', + 'prompt', + 'properties', + 'propertyIsEnumerable', + 'propertyName', + 'protocol', + 'protocolLong', + 'prototype', + 'provider', + 'pseudoClass', + 'pseudoElement', + 'pt', + 'publicId', + 'publicKey', + 'published', + 'pulse', + 'push', + 'pushManager', + 'pushNotification', + 'pushState', + 'put', + 'putImageData', + 'px', + 'quadraticCurveTo', + 'qualifier', + 'quaternion', + 'query', + 'queryCommandEnabled', + 'queryCommandIndeterm', + 'queryCommandState', + 'queryCommandSupported', + 'queryCommandText', + 'queryCommandValue', + 'querySelector', + 'querySelectorAll', + 'queueMicrotask', + 'quote', + 'quotes', + 'r', + 'r1', + 'r2', + 'race', + 'rad', + 'radiogroup', + 'radiusX', + 'radiusY', + 'random', + 'range', + 'rangeCount', + 'rangeMax', + 'rangeMin', + 'rangeOffset', + 'rangeOverflow', + 'rangeParent', + 'rangeUnderflow', + 'rate', + 'ratio', + 'raw', + 'rawId', + 'read', + 'readAsArrayBuffer', + 'readAsBinaryString', + 'readAsBlob', + 'readAsDataURL', + 'readAsText', + 'readBuffer', + 'readEntries', + 'readOnly', + 'readPixels', + 'readReportRequested', + 'readText', + 'readValue', + 'readable', + 'ready', + 'readyState', + 'reason', + 'reboot', + 'receivedAlert', + 'receiver', + 'receivers', + 'recipient', + 'reconnect', + 'recordNumber', + 'recordsAvailable', + 'recordset', + 'rect', + 'red', + 'redEyeReduction', + 'redirect', + 'redirectCount', + 'redirectEnd', + 'redirectStart', + 'redirected', + 'reduce', + 'reduceRight', + 'reduction', + 'refDistance', + 'refX', + 'refY', + 'referenceNode', + 'referenceSpace', + 'referrer', + 'referrerPolicy', + 'refresh', + 'region', + 'regionAnchorX', + 'regionAnchorY', + 'regionId', + 'regions', + 'register', + 'registerContentHandler', + 'registerElement', + 'registerProperty', + 'registerProtocolHandler', + 'reject', + 'rel', + 'relList', + 'relatedAddress', + 'relatedNode', + 'relatedPort', + 'relatedTarget', + 'release', + 'releaseCapture', + 'releaseEvents', + 'releaseInterface', + 'releaseLock', + 'releasePointerCapture', + 'releaseShaderCompiler', + 'reliable', + 'reliableWrite', + 'reload', + 'rem', + 'remainingSpace', + 'remote', + 'remoteDescription', + 'remove', + 'removeAllRanges', + 'removeAttribute', + 'removeAttributeNS', + 'removeAttributeNode', + 'removeBehavior', + 'removeChild', + 'removeCue', + 'removeEventListener', + 'removeFilter', + 'removeImport', + 'removeItem', + 'removeListener', + 'removeNamedItem', + 'removeNamedItemNS', + 'removeNode', + 'removeParameter', + 'removeProperty', + 'removeRange', + 'removeRegion', + 'removeRule', + 'removeSiteSpecificTrackingException', + 'removeSourceBuffer', + 'removeStream', + 'removeTrack', + 'removeVariable', + 'removeWakeLockListener', + 'removeWebWideTrackingException', + 'removed', + 'removedNodes', + 'renderHeight', + 'renderState', + 'renderTime', + 'renderWidth', + 'renderbufferStorage', + 'renderbufferStorageMultisample', + 'renderedBuffer', + 'renderingMode', + 'renotify', + 'repeat', + 'replace', + 'replaceAdjacentText', + 'replaceAll', + 'replaceChild', + 'replaceChildren', + 'replaceData', + 'replaceId', + 'replaceItem', + 'replaceNode', + 'replaceState', + 'replaceSync', + 'replaceTrack', + 'replaceWholeText', + 'replaceWith', + 'reportValidity', + 'request', + 'requestAnimationFrame', + 'requestAutocomplete', + 'requestData', + 'requestDevice', + 'requestFrame', + 'requestFullscreen', + 'requestHitTestSource', + 'requestHitTestSourceForTransientInput', + 'requestId', + 'requestIdleCallback', + 'requestMIDIAccess', + 'requestMediaKeySystemAccess', + 'requestPermission', + 'requestPictureInPicture', + 'requestPointerLock', + 'requestPresent', + 'requestReferenceSpace', + 'requestSession', + 'requestStart', + 'requestStorageAccess', + 'requestSubmit', + 'requestVideoFrameCallback', + 'requestingWindow', + 'requireInteraction', + 'required', + 'requiredExtensions', + 'requiredFeatures', + 'reset', + 'resetPose', + 'resetTransform', + 'resize', + 'resizeBy', + 'resizeTo', + 'resolve', + 'response', + 'responseBody', + 'responseEnd', + 'responseReady', + 'responseStart', + 'responseText', + 'responseType', + 'responseURL', + 'responseXML', + 'restartIce', + 'restore', + 'result', + 'resultIndex', + 'resultType', + 'results', + 'resume', + 'resumeProfilers', + 'resumeTransformFeedback', + 'retry', + 'returnValue', + 'rev', + 'reverse', + 'reversed', + 'revocable', + 'revokeObjectURL', + 'rgbColor', + 'right', + 'rightContext', + 'rightDegrees', + 'rightMargin', + 'rightProjectionMatrix', + 'rightViewMatrix', + 'role', + 'rolloffFactor', + 'root', + 'rootBounds', + 'rootElement', + 'rootMargin', + 'rotate', + 'rotateAxisAngle', + 'rotateAxisAngleSelf', + 'rotateFromVector', + 'rotateFromVectorSelf', + 'rotateSelf', + 'rotation', + 'rotationAngle', + 'rotationRate', + 'round', + 'row-gap', + 'rowGap', + 'rowIndex', + 'rowSpan', + 'rows', + 'rtcpTransport', + 'rtt', + 'ruby-align', + 'ruby-position', + 'rubyAlign', + 'rubyOverhang', + 'rubyPosition', + 'rules', + 'runtime', + 'runtimeStyle', + 'rx', + 'ry', + 's', + 'safari', + 'sample', + 'sampleCoverage', + 'sampleRate', + 'samplerParameterf', + 'samplerParameteri', + 'sandbox', + 'save', + 'saveData', + 'scale', + 'scale3d', + 'scale3dSelf', + 'scaleNonUniform', + 'scaleNonUniformSelf', + 'scaleSelf', + 'scheme', + 'scissor', + 'scope', + 'scopeName', + 'scoped', + 'screen', + 'screenBrightness', + 'screenEnabled', + 'screenLeft', + 'screenPixelToMillimeterX', + 'screenPixelToMillimeterY', + 'screenTop', + 'screenX', + 'screenY', + 'scriptURL', + 'scripts', + 'scroll', + 'scroll-behavior', + 'scroll-margin', + 'scroll-margin-block', + 'scroll-margin-block-end', + 'scroll-margin-block-start', + 'scroll-margin-bottom', + 'scroll-margin-inline', + 'scroll-margin-inline-end', + 'scroll-margin-inline-start', + 'scroll-margin-left', + 'scroll-margin-right', + 'scroll-margin-top', + 'scroll-padding', + 'scroll-padding-block', + 'scroll-padding-block-end', + 'scroll-padding-block-start', + 'scroll-padding-bottom', + 'scroll-padding-inline', + 'scroll-padding-inline-end', + 'scroll-padding-inline-start', + 'scroll-padding-left', + 'scroll-padding-right', + 'scroll-padding-top', + 'scroll-snap-align', + 'scroll-snap-type', + 'scrollAmount', + 'scrollBehavior', + 'scrollBy', + 'scrollByLines', + 'scrollByPages', + 'scrollDelay', + 'scrollHeight', + 'scrollIntoView', + 'scrollIntoViewIfNeeded', + 'scrollLeft', + 'scrollLeftMax', + 'scrollMargin', + 'scrollMarginBlock', + 'scrollMarginBlockEnd', + 'scrollMarginBlockStart', + 'scrollMarginBottom', + 'scrollMarginInline', + 'scrollMarginInlineEnd', + 'scrollMarginInlineStart', + 'scrollMarginLeft', + 'scrollMarginRight', + 'scrollMarginTop', + 'scrollMaxX', + 'scrollMaxY', + 'scrollPadding', + 'scrollPaddingBlock', + 'scrollPaddingBlockEnd', + 'scrollPaddingBlockStart', + 'scrollPaddingBottom', + 'scrollPaddingInline', + 'scrollPaddingInlineEnd', + 'scrollPaddingInlineStart', + 'scrollPaddingLeft', + 'scrollPaddingRight', + 'scrollPaddingTop', + 'scrollRestoration', + 'scrollSnapAlign', + 'scrollSnapType', + 'scrollTo', + 'scrollTop', + 'scrollTopMax', + 'scrollWidth', + 'scrollX', + 'scrollY', + 'scrollbar-color', + 'scrollbar-width', + 'scrollbar3dLightColor', + 'scrollbarArrowColor', + 'scrollbarBaseColor', + 'scrollbarColor', + 'scrollbarDarkShadowColor', + 'scrollbarFaceColor', + 'scrollbarHighlightColor', + 'scrollbarShadowColor', + 'scrollbarTrackColor', + 'scrollbarWidth', + 'scrollbars', + 'scrolling', + 'scrollingElement', + 'sctp', + 'sctpCauseCode', + 'sdp', + 'sdpLineNumber', + 'sdpMLineIndex', + 'sdpMid', + 'seal', + 'search', + 'searchBox', + 'searchBoxJavaBridge_', + 'searchParams', + 'sectionRowIndex', + 'secureConnectionStart', + 'security', + 'seed', + 'seekToNextFrame', + 'seekable', + 'seeking', + 'select', + 'selectAllChildren', + 'selectAlternateInterface', + 'selectConfiguration', + 'selectNode', + 'selectNodeContents', + 'selectNodes', + 'selectSingleNode', + 'selectSubString', + 'selected', + 'selectedIndex', + 'selectedOptions', + 'selectedStyleSheetSet', + 'selectedStylesheetSet', + 'selection', + 'selectionDirection', + 'selectionEnd', + 'selectionStart', + 'selector', + 'selectorText', + 'self', + 'send', + 'sendAsBinary', + 'sendBeacon', + 'sender', + 'sentAlert', + 'sentTimestamp', + 'separator', + 'serialNumber', + 'serializeToString', + 'serverTiming', + 'service', + 'serviceWorker', + 'session', + 'sessionId', + 'sessionStorage', + 'set', + 'setActionHandler', + 'setActive', + 'setAlpha', + 'setAppBadge', + 'setAttribute', + 'setAttributeNS', + 'setAttributeNode', + 'setAttributeNodeNS', + 'setBaseAndExtent', + 'setBigInt64', + 'setBigUint64', + 'setBingCurrentSearchDefault', + 'setCapture', + 'setCodecPreferences', + 'setColor', + 'setCompositeOperation', + 'setConfiguration', + 'setCurrentTime', + 'setCustomValidity', + 'setData', + 'setDate', + 'setDragImage', + 'setEnd', + 'setEndAfter', + 'setEndBefore', + 'setEndPoint', + 'setFillColor', + 'setFilterRes', + 'setFloat32', + 'setFloat64', + 'setFloatValue', + 'setFormValue', + 'setFullYear', + 'setHeaderValue', + 'setHours', + 'setIdentityProvider', + 'setImmediate', + 'setInt16', + 'setInt32', + 'setInt8', + 'setInterval', + 'setItem', + 'setKeyframes', + 'setLineCap', + 'setLineDash', + 'setLineJoin', + 'setLineWidth', + 'setLiveSeekableRange', + 'setLocalDescription', + 'setMatrix', + 'setMatrixValue', + 'setMediaKeys', + 'setMilliseconds', + 'setMinutes', + 'setMiterLimit', + 'setMonth', + 'setNamedItem', + 'setNamedItemNS', + 'setNonUserCodeExceptions', + 'setOrientToAngle', + 'setOrientToAuto', + 'setOrientation', + 'setOverrideHistoryNavigationMode', + 'setPaint', + 'setParameter', + 'setParameters', + 'setPeriodicWave', + 'setPointerCapture', + 'setPosition', + 'setPositionState', + 'setPreference', + 'setProperty', + 'setPrototypeOf', + 'setRGBColor', + 'setRGBColorICCColor', + 'setRadius', + 'setRangeText', + 'setRemoteDescription', + 'setRequestHeader', + 'setResizable', + 'setResourceTimingBufferSize', + 'setRotate', + 'setScale', + 'setSeconds', + 'setSelectionRange', + 'setServerCertificate', + 'setShadow', + 'setSinkId', + 'setSkewX', + 'setSkewY', + 'setStart', + 'setStartAfter', + 'setStartBefore', + 'setStdDeviation', + 'setStreams', + 'setStringValue', + 'setStrokeColor', + 'setSuggestResult', + 'setTargetAtTime', + 'setTargetValueAtTime', + 'setTime', + 'setTimeout', + 'setTransform', + 'setTranslate', + 'setUTCDate', + 'setUTCFullYear', + 'setUTCHours', + 'setUTCMilliseconds', + 'setUTCMinutes', + 'setUTCMonth', + 'setUTCSeconds', + 'setUint16', + 'setUint32', + 'setUint8', + 'setUri', + 'setValidity', + 'setValueAtTime', + 'setValueCurveAtTime', + 'setVariable', + 'setVelocity', + 'setVersion', + 'setYear', + 'settingName', + 'settingValue', + 'sex', + 'shaderSource', + 'shadowBlur', + 'shadowColor', + 'shadowOffsetX', + 'shadowOffsetY', + 'shadowRoot', + 'shape', + 'shape-image-threshold', + 'shape-margin', + 'shape-outside', + 'shape-rendering', + 'shapeImageThreshold', + 'shapeMargin', + 'shapeOutside', + 'shapeRendering', + 'sheet', + 'shift', + 'shiftKey', + 'shiftLeft', + 'shippingAddress', + 'shippingOption', + 'shippingType', + 'show', + 'showHelp', + 'showModal', + 'showModalDialog', + 'showModelessDialog', + 'showNotification', + 'sidebar', + 'sign', + 'signal', + 'signalingState', + 'signature', + 'silent', + 'sin', + 'singleNodeValue', + 'sinh', + 'sinkId', + 'sittingToStandingTransform', + 'size', + 'sizeToContent', + 'sizeX', + 'sizeZ', + 'sizes', + 'skewX', + 'skewXSelf', + 'skewY', + 'skewYSelf', + 'slice', + 'slope', + 'slot', + 'small', + 'smil', + 'smooth', + 'smoothingTimeConstant', + 'snapToLines', + 'snapshotItem', + 'snapshotLength', + 'some', + 'sort', + 'sortingCode', + 'source', + 'sourceBuffer', + 'sourceBuffers', + 'sourceCapabilities', + 'sourceFile', + 'sourceIndex', + 'sources', + 'spacing', + 'span', + 'speak', + 'speakAs', + 'speaking', + 'species', + 'specified', + 'specularConstant', + 'specularExponent', + 'speechSynthesis', + 'speed', + 'speedOfSound', + 'spellcheck', + 'splice', + 'split', + 'splitText', + 'spreadMethod', + 'sqrt', + 'src', + 'srcElement', + 'srcFilter', + 'srcObject', + 'srcUrn', + 'srcdoc', + 'srclang', + 'srcset', + 'stack', + 'stackTraceLimit', + 'stacktrace', + 'stageParameters', + 'standalone', + 'standby', + 'start', + 'startContainer', + 'startIce', + 'startMessages', + 'startNotifications', + 'startOffset', + 'startProfiling', + 'startRendering', + 'startShark', + 'startTime', + 'startsWith', + 'state', + 'status', + 'statusCode', + 'statusMessage', + 'statusText', + 'statusbar', + 'stdDeviationX', + 'stdDeviationY', + 'stencilFunc', + 'stencilFuncSeparate', + 'stencilMask', + 'stencilMaskSeparate', + 'stencilOp', + 'stencilOpSeparate', + 'step', + 'stepDown', + 'stepMismatch', + 'stepUp', + 'sticky', + 'stitchTiles', + 'stop', + 'stop-color', + 'stop-opacity', + 'stopColor', + 'stopImmediatePropagation', + 'stopNotifications', + 'stopOpacity', + 'stopProfiling', + 'stopPropagation', + 'stopShark', + 'stopped', + 'storage', + 'storageArea', + 'storageName', + 'storageStatus', + 'store', + 'storeSiteSpecificTrackingException', + 'storeWebWideTrackingException', + 'stpVersion', + 'stream', + 'streams', + 'stretch', + 'strike', + 'string', + 'stringValue', + 'stringify', + 'stroke', + 'stroke-dasharray', + 'stroke-dashoffset', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-miterlimit', + 'stroke-opacity', + 'stroke-width', + 'strokeDasharray', + 'strokeDashoffset', + 'strokeLinecap', + 'strokeLinejoin', + 'strokeMiterlimit', + 'strokeOpacity', + 'strokeRect', + 'strokeStyle', + 'strokeText', + 'strokeWidth', + 'style', + 'styleFloat', + 'styleMap', + 'styleMedia', + 'styleSheet', + 'styleSheetSets', + 'styleSheets', + 'sub', + 'subarray', + 'subject', + 'submit', + 'submitFrame', + 'submitter', + 'subscribe', + 'substr', + 'substring', + 'substringData', + 'subtle', + 'subtree', + 'suffix', + 'suffixes', + 'summary', + 'sup', + 'supported', + 'supportedContentEncodings', + 'supportedEntryTypes', + 'supports', + 'supportsSession', + 'surfaceScale', + 'surroundContents', + 'suspend', + 'suspendRedraw', + 'swapCache', + 'swapNode', + 'sweepFlag', + 'symbols', + 'sync', + 'sysexEnabled', + 'system', + 'systemCode', + 'systemId', + 'systemLanguage', + 'systemXDPI', + 'systemYDPI', + 'tBodies', + 'tFoot', + 'tHead', + 'tabIndex', + 'table', + 'table-layout', + 'tableLayout', + 'tableValues', + 'tag', + 'tagName', + 'tagUrn', + 'tags', + 'taintEnabled', + 'takePhoto', + 'takeRecords', + 'tan', + 'tangentialPressure', + 'tanh', + 'target', + 'targetElement', + 'targetRayMode', + 'targetRaySpace', + 'targetTouches', + 'targetX', + 'targetY', + 'tcpType', + 'tee', + 'tel', + 'terminate', + 'test', + 'texImage2D', + 'texImage3D', + 'texParameterf', + 'texParameteri', + 'texStorage2D', + 'texStorage3D', + 'texSubImage2D', + 'texSubImage3D', + 'text', + 'text-align', + 'text-align-last', + 'text-anchor', + 'text-combine-upright', + 'text-decoration', + 'text-decoration-color', + 'text-decoration-line', + 'text-decoration-skip-ink', + 'text-decoration-style', + 'text-decoration-thickness', + 'text-emphasis', + 'text-emphasis-color', + 'text-emphasis-position', + 'text-emphasis-style', + 'text-indent', + 'text-justify', + 'text-orientation', + 'text-overflow', + 'text-rendering', + 'text-shadow', + 'text-transform', + 'text-underline-offset', + 'text-underline-position', + 'textAlign', + 'textAlignLast', + 'textAnchor', + 'textAutospace', + 'textBaseline', + 'textCombineUpright', + 'textContent', + 'textDecoration', + 'textDecorationBlink', + 'textDecorationColor', + 'textDecorationLine', + 'textDecorationLineThrough', + 'textDecorationNone', + 'textDecorationOverline', + 'textDecorationSkipInk', + 'textDecorationStyle', + 'textDecorationThickness', + 'textDecorationUnderline', + 'textEmphasis', + 'textEmphasisColor', + 'textEmphasisPosition', + 'textEmphasisStyle', + 'textIndent', + 'textJustify', + 'textJustifyTrim', + 'textKashida', + 'textKashidaSpace', + 'textLength', + 'textOrientation', + 'textOverflow', + 'textRendering', + 'textShadow', + 'textTracks', + 'textTransform', + 'textUnderlineOffset', + 'textUnderlinePosition', + 'then', + 'threadId', + 'threshold', + 'thresholds', + 'tiltX', + 'tiltY', + 'time', + 'timeEnd', + 'timeLog', + 'timeOrigin', + 'timeRemaining', + 'timeStamp', + 'timecode', + 'timeline', + 'timelineTime', + 'timeout', + 'timestamp', + 'timestampOffset', + 'timing', + 'title', + 'to', + 'toArray', + 'toBlob', + 'toDataURL', + 'toDateString', + 'toElement', + 'toExponential', + 'toFixed', + 'toFloat32Array', + 'toFloat64Array', + 'toGMTString', + 'toISOString', + 'toJSON', + 'toLocaleDateString', + 'toLocaleFormat', + 'toLocaleLowerCase', + 'toLocaleString', + 'toLocaleTimeString', + 'toLocaleUpperCase', + 'toLowerCase', + 'toMatrix', + 'toMethod', + 'toPrecision', + 'toPrimitive', + 'toSdp', + 'toSource', + 'toStaticHTML', + 'toString', + 'toStringTag', + 'toSum', + 'toTimeString', + 'toUTCString', + 'toUpperCase', + 'toggle', + 'toggleAttribute', + 'toggleLongPressEnabled', + 'tone', + 'toneBuffer', + 'tooLong', + 'tooShort', + 'toolbar', + 'top', + 'topMargin', + 'total', + 'totalFrameDelay', + 'totalVideoFrames', + 'touch-action', + 'touchAction', + 'touched', + 'touches', + 'trace', + 'track', + 'trackVisibility', + 'transaction', + 'transactions', + 'transceiver', + 'transferControlToOffscreen', + 'transferFromImageBitmap', + 'transferImageBitmap', + 'transferIn', + 'transferOut', + 'transferSize', + 'transferToImageBitmap', + 'transform', + 'transform-box', + 'transform-origin', + 'transform-style', + 'transformBox', + 'transformFeedbackVaryings', + 'transformOrigin', + 'transformPoint', + 'transformString', + 'transformStyle', + 'transformToDocument', + 'transformToFragment', + 'transition', + 'transition-delay', + 'transition-duration', + 'transition-property', + 'transition-timing-function', + 'transitionDelay', + 'transitionDuration', + 'transitionProperty', + 'transitionTimingFunction', + 'translate', + 'translateSelf', + 'translationX', + 'translationY', + 'transport', + 'trim', + 'trimEnd', + 'trimLeft', + 'trimRight', + 'trimStart', + 'trueSpeed', + 'trunc', + 'truncate', + 'trustedTypes', + 'turn', + 'twist', + 'type', + 'typeDetail', + 'typeMismatch', + 'typeMustMatch', + 'types', + 'u2f', + 'ubound', + 'uint16', + 'uint32', + 'uint8', + 'uint8Clamped', + 'undefined', + 'unescape', + 'uneval', + 'unicode', + 'unicode-bidi', + 'unicodeBidi', + 'unicodeRange', + 'uniform1f', + 'uniform1fv', + 'uniform1i', + 'uniform1iv', + 'uniform1ui', + 'uniform1uiv', + 'uniform2f', + 'uniform2fv', + 'uniform2i', + 'uniform2iv', + 'uniform2ui', + 'uniform2uiv', + 'uniform3f', + 'uniform3fv', + 'uniform3i', + 'uniform3iv', + 'uniform3ui', + 'uniform3uiv', + 'uniform4f', + 'uniform4fv', + 'uniform4i', + 'uniform4iv', + 'uniform4ui', + 'uniform4uiv', + 'uniformBlockBinding', + 'uniformMatrix2fv', + 'uniformMatrix2x3fv', + 'uniformMatrix2x4fv', + 'uniformMatrix3fv', + 'uniformMatrix3x2fv', + 'uniformMatrix3x4fv', + 'uniformMatrix4fv', + 'uniformMatrix4x2fv', + 'uniformMatrix4x3fv', + 'unique', + 'uniqueID', + 'uniqueNumber', + 'unit', + 'unitType', + 'units', + 'unloadEventEnd', + 'unloadEventStart', + 'unlock', + 'unmount', + 'unobserve', + 'unpause', + 'unpauseAnimations', + 'unreadCount', + 'unregister', + 'unregisterContentHandler', + 'unregisterProtocolHandler', + 'unscopables', + 'unselectable', + 'unshift', + 'unsubscribe', + 'unsuspendRedraw', + 'unsuspendRedrawAll', + 'unwatch', + 'unwrapKey', + 'upDegrees', + 'upX', + 'upY', + 'upZ', + 'update', + 'updateCommands', + 'updateIce', + 'updateInterval', + 'updatePlaybackRate', + 'updateRenderState', + 'updateSettings', + 'updateTiming', + 'updateViaCache', + 'updateWith', + 'updated', + 'updating', + 'upgrade', + 'upload', + 'uploadTotal', + 'uploaded', + 'upper', + 'upperBound', + 'upperOpen', + 'uri', + 'url', + 'urn', + 'urns', + 'usages', + 'usb', + 'usbVersionMajor', + 'usbVersionMinor', + 'usbVersionSubminor', + 'useCurrentView', + 'useMap', + 'useProgram', + 'usedSpace', + 'user-select', + 'userActivation', + 'userAgent', + 'userChoice', + 'userHandle', + 'userHint', + 'userLanguage', + 'userSelect', + 'userVisibleOnly', + 'username', + 'usernameFragment', + 'utterance', + 'uuid', + 'v8BreakIterator', + 'vAlign', + 'vLink', + 'valid', + 'validate', + 'validateProgram', + 'validationMessage', + 'validity', + 'value', + 'valueAsDate', + 'valueAsNumber', + 'valueAsString', + 'valueInSpecifiedUnits', + 'valueMissing', + 'valueOf', + 'valueText', + 'valueType', + 'values', + 'variable', + 'variant', + 'variationSettings', + 'vector-effect', + 'vectorEffect', + 'velocityAngular', + 'velocityExpansion', + 'velocityX', + 'velocityY', + 'vendor', + 'vendorId', + 'vendorSub', + 'verify', + 'version', + 'vertexAttrib1f', + 'vertexAttrib1fv', + 'vertexAttrib2f', + 'vertexAttrib2fv', + 'vertexAttrib3f', + 'vertexAttrib3fv', + 'vertexAttrib4f', + 'vertexAttrib4fv', + 'vertexAttribDivisor', + 'vertexAttribDivisorANGLE', + 'vertexAttribI4i', + 'vertexAttribI4iv', + 'vertexAttribI4ui', + 'vertexAttribI4uiv', + 'vertexAttribIPointer', + 'vertexAttribPointer', + 'vertical', + 'vertical-align', + 'verticalAlign', + 'verticalOverflow', + 'vh', + 'vibrate', + 'vibrationActuator', + 'videoBitsPerSecond', + 'videoHeight', + 'videoTracks', + 'videoWidth', + 'view', + 'viewBox', + 'viewBoxString', + 'viewTarget', + 'viewTargetString', + 'viewport', + 'viewportAnchorX', + 'viewportAnchorY', + 'viewportElement', + 'views', + 'violatedDirective', + 'visibility', + 'visibilityState', + 'visible', + 'visualViewport', + 'vlinkColor', + 'vmax', + 'vmin', + 'voice', + 'voiceURI', + 'volume', + 'vrml', + 'vspace', + 'vw', + 'w', + 'wait', + 'waitSync', + 'waiting', + 'wake', + 'wakeLock', + 'wand', + 'warn', + 'wasClean', + 'wasDiscarded', + 'watch', + 'watchAvailability', + 'watchPosition', + 'webdriver', + 'webkitAddKey', + 'webkitAlignContent', + 'webkitAlignItems', + 'webkitAlignSelf', + 'webkitAnimation', + 'webkitAnimationDelay', + 'webkitAnimationDirection', + 'webkitAnimationDuration', + 'webkitAnimationFillMode', + 'webkitAnimationIterationCount', + 'webkitAnimationName', + 'webkitAnimationPlayState', + 'webkitAnimationTimingFunction', + 'webkitAppearance', + 'webkitAudioContext', + 'webkitAudioDecodedByteCount', + 'webkitAudioPannerNode', + 'webkitBackfaceVisibility', + 'webkitBackground', + 'webkitBackgroundAttachment', + 'webkitBackgroundClip', + 'webkitBackgroundColor', + 'webkitBackgroundImage', + 'webkitBackgroundOrigin', + 'webkitBackgroundPosition', + 'webkitBackgroundPositionX', + 'webkitBackgroundPositionY', + 'webkitBackgroundRepeat', + 'webkitBackgroundSize', + 'webkitBackingStorePixelRatio', + 'webkitBorderBottomLeftRadius', + 'webkitBorderBottomRightRadius', + 'webkitBorderImage', + 'webkitBorderImageOutset', + 'webkitBorderImageRepeat', + 'webkitBorderImageSlice', + 'webkitBorderImageSource', + 'webkitBorderImageWidth', + 'webkitBorderRadius', + 'webkitBorderTopLeftRadius', + 'webkitBorderTopRightRadius', + 'webkitBoxAlign', + 'webkitBoxDirection', + 'webkitBoxFlex', + 'webkitBoxOrdinalGroup', + 'webkitBoxOrient', + 'webkitBoxPack', + 'webkitBoxShadow', + 'webkitBoxSizing', + 'webkitCancelAnimationFrame', + 'webkitCancelFullScreen', + 'webkitCancelKeyRequest', + 'webkitCancelRequestAnimationFrame', + 'webkitClearResourceTimings', + 'webkitClosedCaptionsVisible', + 'webkitConvertPointFromNodeToPage', + 'webkitConvertPointFromPageToNode', + 'webkitCreateShadowRoot', + 'webkitCurrentFullScreenElement', + 'webkitCurrentPlaybackTargetIsWireless', + 'webkitDecodedFrameCount', + 'webkitDirectionInvertedFromDevice', + 'webkitDisplayingFullscreen', + 'webkitDroppedFrameCount', + 'webkitEnterFullScreen', + 'webkitEnterFullscreen', + 'webkitEntries', + 'webkitExitFullScreen', + 'webkitExitFullscreen', + 'webkitExitPointerLock', + 'webkitFilter', + 'webkitFlex', + 'webkitFlexBasis', + 'webkitFlexDirection', + 'webkitFlexFlow', + 'webkitFlexGrow', + 'webkitFlexShrink', + 'webkitFlexWrap', + 'webkitFullScreenKeyboardInputAllowed', + 'webkitFullscreenElement', + 'webkitFullscreenEnabled', + 'webkitGenerateKeyRequest', + 'webkitGetAsEntry', + 'webkitGetDatabaseNames', + 'webkitGetEntries', + 'webkitGetEntriesByName', + 'webkitGetEntriesByType', + 'webkitGetFlowByName', + 'webkitGetGamepads', + 'webkitGetImageDataHD', + 'webkitGetNamedFlows', + 'webkitGetRegionFlowRanges', + 'webkitGetUserMedia', + 'webkitHasClosedCaptions', + 'webkitHidden', + 'webkitIDBCursor', + 'webkitIDBDatabase', + 'webkitIDBDatabaseError', + 'webkitIDBDatabaseException', + 'webkitIDBFactory', + 'webkitIDBIndex', + 'webkitIDBKeyRange', + 'webkitIDBObjectStore', + 'webkitIDBRequest', + 'webkitIDBTransaction', + 'webkitImageSmoothingEnabled', + 'webkitIndexedDB', + 'webkitInitMessageEvent', + 'webkitIsFullScreen', + 'webkitJustifyContent', + 'webkitKeys', + 'webkitLineClamp', + 'webkitLineDashOffset', + 'webkitLockOrientation', + 'webkitMask', + 'webkitMaskClip', + 'webkitMaskComposite', + 'webkitMaskImage', + 'webkitMaskOrigin', + 'webkitMaskPosition', + 'webkitMaskPositionX', + 'webkitMaskPositionY', + 'webkitMaskRepeat', + 'webkitMaskSize', + 'webkitMatchesSelector', + 'webkitMediaStream', + 'webkitNotifications', + 'webkitOfflineAudioContext', + 'webkitOrder', + 'webkitOrientation', + 'webkitPeerConnection00', + 'webkitPersistentStorage', + 'webkitPerspective', + 'webkitPerspectiveOrigin', + 'webkitPointerLockElement', + 'webkitPostMessage', + 'webkitPreservesPitch', + 'webkitPutImageDataHD', + 'webkitRTCPeerConnection', + 'webkitRegionOverset', + 'webkitRelativePath', + 'webkitRequestAnimationFrame', + 'webkitRequestFileSystem', + 'webkitRequestFullScreen', + 'webkitRequestFullscreen', + 'webkitRequestPointerLock', + 'webkitResolveLocalFileSystemURL', + 'webkitSetMediaKeys', + 'webkitSetResourceTimingBufferSize', + 'webkitShadowRoot', + 'webkitShowPlaybackTargetPicker', + 'webkitSlice', + 'webkitSpeechGrammar', + 'webkitSpeechGrammarList', + 'webkitSpeechRecognition', + 'webkitSpeechRecognitionError', + 'webkitSpeechRecognitionEvent', + 'webkitStorageInfo', + 'webkitSupportsFullscreen', + 'webkitTemporaryStorage', + 'webkitTextFillColor', + 'webkitTextSizeAdjust', + 'webkitTextStroke', + 'webkitTextStrokeColor', + 'webkitTextStrokeWidth', + 'webkitTransform', + 'webkitTransformOrigin', + 'webkitTransformStyle', + 'webkitTransition', + 'webkitTransitionDelay', + 'webkitTransitionDuration', + 'webkitTransitionProperty', + 'webkitTransitionTimingFunction', + 'webkitURL', + 'webkitUnlockOrientation', + 'webkitUserSelect', + 'webkitVideoDecodedByteCount', + 'webkitVisibilityState', + 'webkitWirelessVideoPlaybackDisabled', + 'webkitdirectory', + 'webkitdropzone', + 'webstore', + 'weight', + 'whatToShow', + 'wheelDelta', + 'wheelDeltaX', + 'wheelDeltaY', + 'whenDefined', + 'which', + 'white-space', + 'whiteSpace', + 'wholeText', + 'widows', + 'width', + 'will-change', + 'willChange', + 'willValidate', + 'window', + 'withCredentials', + 'word-break', + 'word-spacing', + 'word-wrap', + 'wordBreak', + 'wordSpacing', + 'wordWrap', + 'workerStart', + 'wrap', + 'wrapKey', + 'writable', + 'writableAuxiliaries', + 'write', + 'writeText', + 'writeValue', + 'writeWithoutResponse', + 'writeln', + 'writing-mode', + 'writingMode', + 'x', + 'x1', + 'x2', + 'xChannelSelector', + 'xmlEncoding', + 'xmlStandalone', + 'xmlVersion', + 'xmlbase', + 'xmllang', + 'xmlspace', + 'xor', + 'xr', + 'y', + 'y1', + 'y2', + 'yChannelSelector', + 'yandex', + 'z', + 'z-index', + 'zIndex', + 'zoom', + 'zoomAndPan', + 'zoomRectScreen', +]; diff --git a/src/node-transformers/rename-properties-transformers/replacer/RenamePropertiesReplacer.ts b/src/node-transformers/rename-properties-transformers/replacer/RenamePropertiesReplacer.ts index d5aac3cf9..cbf61fc9f 100644 --- a/src/node-transformers/rename-properties-transformers/replacer/RenamePropertiesReplacer.ts +++ b/src/node-transformers/rename-properties-transformers/replacer/RenamePropertiesReplacer.ts @@ -11,8 +11,7 @@ import { IOptions } from '../../../interfaces/options/IOptions'; import { IPropertyIdentifierNamesCacheStorage } from '../../../interfaces/storages/identifier-names-cache/IPropertyIdentifierNamesCacheStorage'; import { IRenamePropertiesReplacer } from '../../../interfaces/node-transformers/rename-properties-transformers/replacer/IRenamePropertiesReplacer'; -// eslint-disable-next-line import/no-internal-modules -import ReservedDomProperties from './ReservedDomProperties.json'; +import { domProperties } from '../../../constants/DomProperties'; import { NodeGuards } from '../../../node/NodeGuards'; import { NodeFactory } from '../../../node/NodeFactory'; @@ -20,14 +19,9 @@ import { NodeFactory } from '../../../node/NodeFactory'; @injectable() export class RenamePropertiesReplacer implements IRenamePropertiesReplacer { /** - * Properties list taken from `UglifyJS` and `terser` - * https://github.com/mishoo/UglifyJS/blob/master/tools/domprops.json - * https://github.com/terser/terser/blob/master/tools/domprops.js - * Copyright 2012-2018 (c) Mihai Bazon - * * @type {Set} */ - private static readonly reservedDomPropertiesList: Set = new Set(ReservedDomProperties); + private static readonly reservedDomPropertiesList: Set = new Set(domProperties); /** * @type {IIdentifierNamesGenerator} diff --git a/src/node-transformers/rename-properties-transformers/replacer/ReservedDomProperties.json b/src/node-transformers/rename-properties-transformers/replacer/ReservedDomProperties.json deleted file mode 100644 index 1a3c53adc..000000000 --- a/src/node-transformers/rename-properties-transformers/replacer/ReservedDomProperties.json +++ /dev/null @@ -1,7771 +0,0 @@ -[ - "$&", - "$'", - "$*", - "$+", - "$1", - "$2", - "$3", - "$4", - "$5", - "$6", - "$7", - "$8", - "$9", - "$_", - "$`", - "$input", - "-moz-animation", - "-moz-animation-delay", - "-moz-animation-direction", - "-moz-animation-duration", - "-moz-animation-fill-mode", - "-moz-animation-iteration-count", - "-moz-animation-name", - "-moz-animation-play-state", - "-moz-animation-timing-function", - "-moz-appearance", - "-moz-backface-visibility", - "-moz-border-end", - "-moz-border-end-color", - "-moz-border-end-style", - "-moz-border-end-width", - "-moz-border-image", - "-moz-border-start", - "-moz-border-start-color", - "-moz-border-start-style", - "-moz-border-start-width", - "-moz-box-align", - "-moz-box-direction", - "-moz-box-flex", - "-moz-box-ordinal-group", - "-moz-box-orient", - "-moz-box-pack", - "-moz-box-sizing", - "-moz-float-edge", - "-moz-font-feature-settings", - "-moz-font-language-override", - "-moz-force-broken-image-icon", - "-moz-hyphens", - "-moz-image-region", - "-moz-margin-end", - "-moz-margin-start", - "-moz-orient", - "-moz-osx-font-smoothing", - "-moz-outline-radius", - "-moz-outline-radius-bottomleft", - "-moz-outline-radius-bottomright", - "-moz-outline-radius-topleft", - "-moz-outline-radius-topright", - "-moz-padding-end", - "-moz-padding-start", - "-moz-perspective", - "-moz-perspective-origin", - "-moz-tab-size", - "-moz-text-size-adjust", - "-moz-transform", - "-moz-transform-origin", - "-moz-transform-style", - "-moz-transition", - "-moz-transition-delay", - "-moz-transition-duration", - "-moz-transition-property", - "-moz-transition-timing-function", - "-moz-user-focus", - "-moz-user-input", - "-moz-user-modify", - "-moz-user-select", - "-moz-window-dragging", - "-webkit-align-content", - "-webkit-align-items", - "-webkit-align-self", - "-webkit-animation", - "-webkit-animation-delay", - "-webkit-animation-direction", - "-webkit-animation-duration", - "-webkit-animation-fill-mode", - "-webkit-animation-iteration-count", - "-webkit-animation-name", - "-webkit-animation-play-state", - "-webkit-animation-timing-function", - "-webkit-appearance", - "-webkit-backface-visibility", - "-webkit-background-clip", - "-webkit-background-origin", - "-webkit-background-size", - "-webkit-border-bottom-left-radius", - "-webkit-border-bottom-right-radius", - "-webkit-border-image", - "-webkit-border-radius", - "-webkit-border-top-left-radius", - "-webkit-border-top-right-radius", - "-webkit-box-align", - "-webkit-box-direction", - "-webkit-box-flex", - "-webkit-box-ordinal-group", - "-webkit-box-orient", - "-webkit-box-pack", - "-webkit-box-shadow", - "-webkit-box-sizing", - "-webkit-filter", - "-webkit-flex", - "-webkit-flex-basis", - "-webkit-flex-direction", - "-webkit-flex-flow", - "-webkit-flex-grow", - "-webkit-flex-shrink", - "-webkit-flex-wrap", - "-webkit-justify-content", - "-webkit-line-clamp", - "-webkit-mask", - "-webkit-mask-clip", - "-webkit-mask-composite", - "-webkit-mask-image", - "-webkit-mask-origin", - "-webkit-mask-position", - "-webkit-mask-position-x", - "-webkit-mask-position-y", - "-webkit-mask-repeat", - "-webkit-mask-size", - "-webkit-order", - "-webkit-perspective", - "-webkit-perspective-origin", - "-webkit-text-fill-color", - "-webkit-text-size-adjust", - "-webkit-text-stroke", - "-webkit-text-stroke-color", - "-webkit-text-stroke-width", - "-webkit-transform", - "-webkit-transform-origin", - "-webkit-transform-style", - "-webkit-transition", - "-webkit-transition-delay", - "-webkit-transition-duration", - "-webkit-transition-property", - "-webkit-transition-timing-function", - "-webkit-user-select", - "0", - "1", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "2", - "20", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "@@iterator", - "ABORT_ERR", - "ACTIVE", - "ACTIVE_ATTRIBUTES", - "ACTIVE_TEXTURE", - "ACTIVE_UNIFORMS", - "ACTIVE_UNIFORM_BLOCKS", - "ADDITION", - "ALIASED_LINE_WIDTH_RANGE", - "ALIASED_POINT_SIZE_RANGE", - "ALLOW_KEYBOARD_INPUT", - "ALLPASS", - "ALPHA", - "ALPHA_BITS", - "ALREADY_SIGNALED", - "ALT_MASK", - "ALWAYS", - "ANY_SAMPLES_PASSED", - "ANY_SAMPLES_PASSED_CONSERVATIVE", - "ANY_TYPE", - "ANY_UNORDERED_NODE_TYPE", - "ARRAY_BUFFER", - "ARRAY_BUFFER_BINDING", - "ATTACHED_SHADERS", - "ATTRIBUTE_NODE", - "AT_TARGET", - "AbortController", - "AbortSignal", - "AbsoluteOrientationSensor", - "AbstractRange", - "Accelerometer", - "AddSearchProvider", - "AggregateError", - "AnalyserNode", - "Animation", - "AnimationEffect", - "AnimationEvent", - "AnimationPlaybackEvent", - "AnimationTimeline", - "AnonXMLHttpRequest", - "Any", - "ApplicationCache", - "ApplicationCacheErrorEvent", - "Array", - "ArrayBuffer", - "ArrayType", - "Atomics", - "Attr", - "Audio", - "AudioBuffer", - "AudioBufferSourceNode", - "AudioContext", - "AudioDestinationNode", - "AudioListener", - "AudioNode", - "AudioParam", - "AudioParamMap", - "AudioProcessingEvent", - "AudioScheduledSourceNode", - "AudioStreamTrack", - "AudioWorklet", - "AudioWorkletNode", - "AuthenticatorAssertionResponse", - "AuthenticatorAttestationResponse", - "AuthenticatorResponse", - "AutocompleteErrorEvent", - "BACK", - "BAD_BOUNDARYPOINTS_ERR", - "BAD_REQUEST", - "BANDPASS", - "BLEND", - "BLEND_COLOR", - "BLEND_DST_ALPHA", - "BLEND_DST_RGB", - "BLEND_EQUATION", - "BLEND_EQUATION_ALPHA", - "BLEND_EQUATION_RGB", - "BLEND_SRC_ALPHA", - "BLEND_SRC_RGB", - "BLUE_BITS", - "BLUR", - "BOOL", - "BOOLEAN_TYPE", - "BOOL_VEC2", - "BOOL_VEC3", - "BOOL_VEC4", - "BOTH", - "BROWSER_DEFAULT_WEBGL", - "BUBBLING_PHASE", - "BUFFER_SIZE", - "BUFFER_USAGE", - "BYTE", - "BYTES_PER_ELEMENT", - "BackgroundFetchManager", - "BackgroundFetchRecord", - "BackgroundFetchRegistration", - "BarProp", - "BarcodeDetector", - "BaseAudioContext", - "BaseHref", - "BatteryManager", - "BeforeInstallPromptEvent", - "BeforeLoadEvent", - "BeforeUnloadEvent", - "BigInt", - "BigInt64Array", - "BigUint64Array", - "BiquadFilterNode", - "Blob", - "BlobEvent", - "Bluetooth", - "BluetoothCharacteristicProperties", - "BluetoothDevice", - "BluetoothRemoteGATTCharacteristic", - "BluetoothRemoteGATTDescriptor", - "BluetoothRemoteGATTServer", - "BluetoothRemoteGATTService", - "BluetoothUUID", - "Boolean", - "BroadcastChannel", - "ByteLengthQueuingStrategy", - "CAPTURING_PHASE", - "CCW", - "CDATASection", - "CDATA_SECTION_NODE", - "CHANGE", - "CHARSET_RULE", - "CHECKING", - "CLAMP_TO_EDGE", - "CLICK", - "CLOSED", - "CLOSING", - "COLOR", - "COLOR_ATTACHMENT0", - "COLOR_ATTACHMENT1", - "COLOR_ATTACHMENT10", - "COLOR_ATTACHMENT11", - "COLOR_ATTACHMENT12", - "COLOR_ATTACHMENT13", - "COLOR_ATTACHMENT14", - "COLOR_ATTACHMENT15", - "COLOR_ATTACHMENT2", - "COLOR_ATTACHMENT3", - "COLOR_ATTACHMENT4", - "COLOR_ATTACHMENT5", - "COLOR_ATTACHMENT6", - "COLOR_ATTACHMENT7", - "COLOR_ATTACHMENT8", - "COLOR_ATTACHMENT9", - "COLOR_BUFFER_BIT", - "COLOR_CLEAR_VALUE", - "COLOR_WRITEMASK", - "COMMENT_NODE", - "COMPARE_REF_TO_TEXTURE", - "COMPILE_STATUS", - "COMPRESSED_RGBA_S3TC_DXT1_EXT", - "COMPRESSED_RGBA_S3TC_DXT3_EXT", - "COMPRESSED_RGBA_S3TC_DXT5_EXT", - "COMPRESSED_RGB_S3TC_DXT1_EXT", - "COMPRESSED_TEXTURE_FORMATS", - "CONDITION_SATISFIED", - "CONFIGURATION_UNSUPPORTED", - "CONNECTING", - "CONSTANT_ALPHA", - "CONSTANT_COLOR", - "CONSTRAINT_ERR", - "CONTEXT_LOST_WEBGL", - "CONTROL_MASK", - "COPY_READ_BUFFER", - "COPY_READ_BUFFER_BINDING", - "COPY_WRITE_BUFFER", - "COPY_WRITE_BUFFER_BINDING", - "COUNTER_STYLE_RULE", - "CSS", - "CSS2Properties", - "CSSAnimation", - "CSSCharsetRule", - "CSSConditionRule", - "CSSCounterStyleRule", - "CSSFontFaceRule", - "CSSFontFeatureValuesRule", - "CSSGroupingRule", - "CSSImageValue", - "CSSImportRule", - "CSSKeyframeRule", - "CSSKeyframesRule", - "CSSKeywordValue", - "CSSMathInvert", - "CSSMathMax", - "CSSMathMin", - "CSSMathNegate", - "CSSMathProduct", - "CSSMathSum", - "CSSMathValue", - "CSSMatrixComponent", - "CSSMediaRule", - "CSSMozDocumentRule", - "CSSNameSpaceRule", - "CSSNamespaceRule", - "CSSNumericArray", - "CSSNumericValue", - "CSSPageRule", - "CSSPerspective", - "CSSPositionValue", - "CSSPrimitiveValue", - "CSSRotate", - "CSSRule", - "CSSRuleList", - "CSSScale", - "CSSSkew", - "CSSSkewX", - "CSSSkewY", - "CSSStyleDeclaration", - "CSSStyleRule", - "CSSStyleSheet", - "CSSStyleValue", - "CSSSupportsRule", - "CSSTransformComponent", - "CSSTransformValue", - "CSSTransition", - "CSSTranslate", - "CSSUnitValue", - "CSSUnknownRule", - "CSSUnparsedValue", - "CSSValue", - "CSSValueList", - "CSSVariableReferenceValue", - "CSSVariablesDeclaration", - "CSSVariablesRule", - "CSSViewportRule", - "CSS_ATTR", - "CSS_CM", - "CSS_COUNTER", - "CSS_CUSTOM", - "CSS_DEG", - "CSS_DIMENSION", - "CSS_EMS", - "CSS_EXS", - "CSS_FILTER_BLUR", - "CSS_FILTER_BRIGHTNESS", - "CSS_FILTER_CONTRAST", - "CSS_FILTER_CUSTOM", - "CSS_FILTER_DROP_SHADOW", - "CSS_FILTER_GRAYSCALE", - "CSS_FILTER_HUE_ROTATE", - "CSS_FILTER_INVERT", - "CSS_FILTER_OPACITY", - "CSS_FILTER_REFERENCE", - "CSS_FILTER_SATURATE", - "CSS_FILTER_SEPIA", - "CSS_GRAD", - "CSS_HZ", - "CSS_IDENT", - "CSS_IN", - "CSS_INHERIT", - "CSS_KHZ", - "CSS_MATRIX", - "CSS_MATRIX3D", - "CSS_MM", - "CSS_MS", - "CSS_NUMBER", - "CSS_PC", - "CSS_PERCENTAGE", - "CSS_PERSPECTIVE", - "CSS_PRIMITIVE_VALUE", - "CSS_PT", - "CSS_PX", - "CSS_RAD", - "CSS_RECT", - "CSS_RGBCOLOR", - "CSS_ROTATE", - "CSS_ROTATE3D", - "CSS_ROTATEX", - "CSS_ROTATEY", - "CSS_ROTATEZ", - "CSS_S", - "CSS_SCALE", - "CSS_SCALE3D", - "CSS_SCALEX", - "CSS_SCALEY", - "CSS_SCALEZ", - "CSS_SKEW", - "CSS_SKEWX", - "CSS_SKEWY", - "CSS_STRING", - "CSS_TRANSLATE", - "CSS_TRANSLATE3D", - "CSS_TRANSLATEX", - "CSS_TRANSLATEY", - "CSS_TRANSLATEZ", - "CSS_UNKNOWN", - "CSS_URI", - "CSS_VALUE_LIST", - "CSS_VH", - "CSS_VMAX", - "CSS_VMIN", - "CSS_VW", - "CULL_FACE", - "CULL_FACE_MODE", - "CURRENT_PROGRAM", - "CURRENT_QUERY", - "CURRENT_VERTEX_ATTRIB", - "CUSTOM", - "CW", - "Cache", - "CacheStorage", - "CanvasCaptureMediaStream", - "CanvasCaptureMediaStreamTrack", - "CanvasGradient", - "CanvasPattern", - "CanvasRenderingContext2D", - "CaretPosition", - "ChannelMergerNode", - "ChannelSplitterNode", - "CharacterData", - "ClientRect", - "ClientRectList", - "Clipboard", - "ClipboardEvent", - "ClipboardItem", - "CloseEvent", - "Collator", - "CommandEvent", - "Comment", - "CompileError", - "CompositionEvent", - "CompressionStream", - "Console", - "ConstantSourceNode", - "Controllers", - "ConvolverNode", - "CountQueuingStrategy", - "Counter", - "Credential", - "CredentialsContainer", - "Crypto", - "CryptoKey", - "CustomElementRegistry", - "CustomEvent", - "DATABASE_ERR", - "DATA_CLONE_ERR", - "DATA_ERR", - "DBLCLICK", - "DECR", - "DECR_WRAP", - "DELETE_STATUS", - "DEPTH", - "DEPTH24_STENCIL8", - "DEPTH32F_STENCIL8", - "DEPTH_ATTACHMENT", - "DEPTH_BITS", - "DEPTH_BUFFER_BIT", - "DEPTH_CLEAR_VALUE", - "DEPTH_COMPONENT", - "DEPTH_COMPONENT16", - "DEPTH_COMPONENT24", - "DEPTH_COMPONENT32F", - "DEPTH_FUNC", - "DEPTH_RANGE", - "DEPTH_STENCIL", - "DEPTH_STENCIL_ATTACHMENT", - "DEPTH_TEST", - "DEPTH_WRITEMASK", - "DEVICE_INELIGIBLE", - "DIRECTION_DOWN", - "DIRECTION_LEFT", - "DIRECTION_RIGHT", - "DIRECTION_UP", - "DISABLED", - "DISPATCH_REQUEST_ERR", - "DITHER", - "DOCUMENT_FRAGMENT_NODE", - "DOCUMENT_NODE", - "DOCUMENT_POSITION_CONTAINED_BY", - "DOCUMENT_POSITION_CONTAINS", - "DOCUMENT_POSITION_DISCONNECTED", - "DOCUMENT_POSITION_FOLLOWING", - "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC", - "DOCUMENT_POSITION_PRECEDING", - "DOCUMENT_TYPE_NODE", - "DOMCursor", - "DOMError", - "DOMException", - "DOMImplementation", - "DOMImplementationLS", - "DOMMatrix", - "DOMMatrixReadOnly", - "DOMParser", - "DOMPoint", - "DOMPointReadOnly", - "DOMQuad", - "DOMRect", - "DOMRectList", - "DOMRectReadOnly", - "DOMRequest", - "DOMSTRING_SIZE_ERR", - "DOMSettableTokenList", - "DOMStringList", - "DOMStringMap", - "DOMTokenList", - "DOMTransactionEvent", - "DOM_DELTA_LINE", - "DOM_DELTA_PAGE", - "DOM_DELTA_PIXEL", - "DOM_INPUT_METHOD_DROP", - "DOM_INPUT_METHOD_HANDWRITING", - "DOM_INPUT_METHOD_IME", - "DOM_INPUT_METHOD_KEYBOARD", - "DOM_INPUT_METHOD_MULTIMODAL", - "DOM_INPUT_METHOD_OPTION", - "DOM_INPUT_METHOD_PASTE", - "DOM_INPUT_METHOD_SCRIPT", - "DOM_INPUT_METHOD_UNKNOWN", - "DOM_INPUT_METHOD_VOICE", - "DOM_KEY_LOCATION_JOYSTICK", - "DOM_KEY_LOCATION_LEFT", - "DOM_KEY_LOCATION_MOBILE", - "DOM_KEY_LOCATION_NUMPAD", - "DOM_KEY_LOCATION_RIGHT", - "DOM_KEY_LOCATION_STANDARD", - "DOM_VK_0", - "DOM_VK_1", - "DOM_VK_2", - "DOM_VK_3", - "DOM_VK_4", - "DOM_VK_5", - "DOM_VK_6", - "DOM_VK_7", - "DOM_VK_8", - "DOM_VK_9", - "DOM_VK_A", - "DOM_VK_ACCEPT", - "DOM_VK_ADD", - "DOM_VK_ALT", - "DOM_VK_ALTGR", - "DOM_VK_AMPERSAND", - "DOM_VK_ASTERISK", - "DOM_VK_AT", - "DOM_VK_ATTN", - "DOM_VK_B", - "DOM_VK_BACKSPACE", - "DOM_VK_BACK_QUOTE", - "DOM_VK_BACK_SLASH", - "DOM_VK_BACK_SPACE", - "DOM_VK_C", - "DOM_VK_CANCEL", - "DOM_VK_CAPS_LOCK", - "DOM_VK_CIRCUMFLEX", - "DOM_VK_CLEAR", - "DOM_VK_CLOSE_BRACKET", - "DOM_VK_CLOSE_CURLY_BRACKET", - "DOM_VK_CLOSE_PAREN", - "DOM_VK_COLON", - "DOM_VK_COMMA", - "DOM_VK_CONTEXT_MENU", - "DOM_VK_CONTROL", - "DOM_VK_CONVERT", - "DOM_VK_CRSEL", - "DOM_VK_CTRL", - "DOM_VK_D", - "DOM_VK_DECIMAL", - "DOM_VK_DELETE", - "DOM_VK_DIVIDE", - "DOM_VK_DOLLAR", - "DOM_VK_DOUBLE_QUOTE", - "DOM_VK_DOWN", - "DOM_VK_E", - "DOM_VK_EISU", - "DOM_VK_END", - "DOM_VK_ENTER", - "DOM_VK_EQUALS", - "DOM_VK_EREOF", - "DOM_VK_ESCAPE", - "DOM_VK_EXCLAMATION", - "DOM_VK_EXECUTE", - "DOM_VK_EXSEL", - "DOM_VK_F", - "DOM_VK_F1", - "DOM_VK_F10", - "DOM_VK_F11", - "DOM_VK_F12", - "DOM_VK_F13", - "DOM_VK_F14", - "DOM_VK_F15", - "DOM_VK_F16", - "DOM_VK_F17", - "DOM_VK_F18", - "DOM_VK_F19", - "DOM_VK_F2", - "DOM_VK_F20", - "DOM_VK_F21", - "DOM_VK_F22", - "DOM_VK_F23", - "DOM_VK_F24", - "DOM_VK_F25", - "DOM_VK_F26", - "DOM_VK_F27", - "DOM_VK_F28", - "DOM_VK_F29", - "DOM_VK_F3", - "DOM_VK_F30", - "DOM_VK_F31", - "DOM_VK_F32", - "DOM_VK_F33", - "DOM_VK_F34", - "DOM_VK_F35", - "DOM_VK_F36", - "DOM_VK_F4", - "DOM_VK_F5", - "DOM_VK_F6", - "DOM_VK_F7", - "DOM_VK_F8", - "DOM_VK_F9", - "DOM_VK_FINAL", - "DOM_VK_FRONT", - "DOM_VK_G", - "DOM_VK_GREATER_THAN", - "DOM_VK_H", - "DOM_VK_HANGUL", - "DOM_VK_HANJA", - "DOM_VK_HASH", - "DOM_VK_HELP", - "DOM_VK_HK_TOGGLE", - "DOM_VK_HOME", - "DOM_VK_HYPHEN_MINUS", - "DOM_VK_I", - "DOM_VK_INSERT", - "DOM_VK_J", - "DOM_VK_JUNJA", - "DOM_VK_K", - "DOM_VK_KANA", - "DOM_VK_KANJI", - "DOM_VK_L", - "DOM_VK_LEFT", - "DOM_VK_LEFT_TAB", - "DOM_VK_LESS_THAN", - "DOM_VK_M", - "DOM_VK_META", - "DOM_VK_MODECHANGE", - "DOM_VK_MULTIPLY", - "DOM_VK_N", - "DOM_VK_NONCONVERT", - "DOM_VK_NUMPAD0", - "DOM_VK_NUMPAD1", - "DOM_VK_NUMPAD2", - "DOM_VK_NUMPAD3", - "DOM_VK_NUMPAD4", - "DOM_VK_NUMPAD5", - "DOM_VK_NUMPAD6", - "DOM_VK_NUMPAD7", - "DOM_VK_NUMPAD8", - "DOM_VK_NUMPAD9", - "DOM_VK_NUM_LOCK", - "DOM_VK_O", - "DOM_VK_OEM_1", - "DOM_VK_OEM_102", - "DOM_VK_OEM_2", - "DOM_VK_OEM_3", - "DOM_VK_OEM_4", - "DOM_VK_OEM_5", - "DOM_VK_OEM_6", - "DOM_VK_OEM_7", - "DOM_VK_OEM_8", - "DOM_VK_OEM_COMMA", - "DOM_VK_OEM_MINUS", - "DOM_VK_OEM_PERIOD", - "DOM_VK_OEM_PLUS", - "DOM_VK_OPEN_BRACKET", - "DOM_VK_OPEN_CURLY_BRACKET", - "DOM_VK_OPEN_PAREN", - "DOM_VK_P", - "DOM_VK_PA1", - "DOM_VK_PAGEDOWN", - "DOM_VK_PAGEUP", - "DOM_VK_PAGE_DOWN", - "DOM_VK_PAGE_UP", - "DOM_VK_PAUSE", - "DOM_VK_PERCENT", - "DOM_VK_PERIOD", - "DOM_VK_PIPE", - "DOM_VK_PLAY", - "DOM_VK_PLUS", - "DOM_VK_PRINT", - "DOM_VK_PRINTSCREEN", - "DOM_VK_PROCESSKEY", - "DOM_VK_PROPERITES", - "DOM_VK_Q", - "DOM_VK_QUESTION_MARK", - "DOM_VK_QUOTE", - "DOM_VK_R", - "DOM_VK_REDO", - "DOM_VK_RETURN", - "DOM_VK_RIGHT", - "DOM_VK_S", - "DOM_VK_SCROLL_LOCK", - "DOM_VK_SELECT", - "DOM_VK_SEMICOLON", - "DOM_VK_SEPARATOR", - "DOM_VK_SHIFT", - "DOM_VK_SLASH", - "DOM_VK_SLEEP", - "DOM_VK_SPACE", - "DOM_VK_SUBTRACT", - "DOM_VK_T", - "DOM_VK_TAB", - "DOM_VK_TILDE", - "DOM_VK_U", - "DOM_VK_UNDERSCORE", - "DOM_VK_UNDO", - "DOM_VK_UNICODE", - "DOM_VK_UP", - "DOM_VK_V", - "DOM_VK_VOLUME_DOWN", - "DOM_VK_VOLUME_MUTE", - "DOM_VK_VOLUME_UP", - "DOM_VK_W", - "DOM_VK_WIN", - "DOM_VK_WINDOW", - "DOM_VK_WIN_ICO_00", - "DOM_VK_WIN_ICO_CLEAR", - "DOM_VK_WIN_ICO_HELP", - "DOM_VK_WIN_OEM_ATTN", - "DOM_VK_WIN_OEM_AUTO", - "DOM_VK_WIN_OEM_BACKTAB", - "DOM_VK_WIN_OEM_CLEAR", - "DOM_VK_WIN_OEM_COPY", - "DOM_VK_WIN_OEM_CUSEL", - "DOM_VK_WIN_OEM_ENLW", - "DOM_VK_WIN_OEM_FINISH", - "DOM_VK_WIN_OEM_FJ_JISHO", - "DOM_VK_WIN_OEM_FJ_LOYA", - "DOM_VK_WIN_OEM_FJ_MASSHOU", - "DOM_VK_WIN_OEM_FJ_ROYA", - "DOM_VK_WIN_OEM_FJ_TOUROKU", - "DOM_VK_WIN_OEM_JUMP", - "DOM_VK_WIN_OEM_PA1", - "DOM_VK_WIN_OEM_PA2", - "DOM_VK_WIN_OEM_PA3", - "DOM_VK_WIN_OEM_RESET", - "DOM_VK_WIN_OEM_WSCTRL", - "DOM_VK_X", - "DOM_VK_XF86XK_ADD_FAVORITE", - "DOM_VK_XF86XK_APPLICATION_LEFT", - "DOM_VK_XF86XK_APPLICATION_RIGHT", - "DOM_VK_XF86XK_AUDIO_CYCLE_TRACK", - "DOM_VK_XF86XK_AUDIO_FORWARD", - "DOM_VK_XF86XK_AUDIO_LOWER_VOLUME", - "DOM_VK_XF86XK_AUDIO_MEDIA", - "DOM_VK_XF86XK_AUDIO_MUTE", - "DOM_VK_XF86XK_AUDIO_NEXT", - "DOM_VK_XF86XK_AUDIO_PAUSE", - "DOM_VK_XF86XK_AUDIO_PLAY", - "DOM_VK_XF86XK_AUDIO_PREV", - "DOM_VK_XF86XK_AUDIO_RAISE_VOLUME", - "DOM_VK_XF86XK_AUDIO_RANDOM_PLAY", - "DOM_VK_XF86XK_AUDIO_RECORD", - "DOM_VK_XF86XK_AUDIO_REPEAT", - "DOM_VK_XF86XK_AUDIO_REWIND", - "DOM_VK_XF86XK_AUDIO_STOP", - "DOM_VK_XF86XK_AWAY", - "DOM_VK_XF86XK_BACK", - "DOM_VK_XF86XK_BACK_FORWARD", - "DOM_VK_XF86XK_BATTERY", - "DOM_VK_XF86XK_BLUE", - "DOM_VK_XF86XK_BLUETOOTH", - "DOM_VK_XF86XK_BOOK", - "DOM_VK_XF86XK_BRIGHTNESS_ADJUST", - "DOM_VK_XF86XK_CALCULATOR", - "DOM_VK_XF86XK_CALENDAR", - "DOM_VK_XF86XK_CD", - "DOM_VK_XF86XK_CLOSE", - "DOM_VK_XF86XK_COMMUNITY", - "DOM_VK_XF86XK_CONTRAST_ADJUST", - "DOM_VK_XF86XK_COPY", - "DOM_VK_XF86XK_CUT", - "DOM_VK_XF86XK_CYCLE_ANGLE", - "DOM_VK_XF86XK_DISPLAY", - "DOM_VK_XF86XK_DOCUMENTS", - "DOM_VK_XF86XK_DOS", - "DOM_VK_XF86XK_EJECT", - "DOM_VK_XF86XK_EXCEL", - "DOM_VK_XF86XK_EXPLORER", - "DOM_VK_XF86XK_FAVORITES", - "DOM_VK_XF86XK_FINANCE", - "DOM_VK_XF86XK_FORWARD", - "DOM_VK_XF86XK_FRAME_BACK", - "DOM_VK_XF86XK_FRAME_FORWARD", - "DOM_VK_XF86XK_GAME", - "DOM_VK_XF86XK_GO", - "DOM_VK_XF86XK_GREEN", - "DOM_VK_XF86XK_HIBERNATE", - "DOM_VK_XF86XK_HISTORY", - "DOM_VK_XF86XK_HOME_PAGE", - "DOM_VK_XF86XK_HOT_LINKS", - "DOM_VK_XF86XK_I_TOUCH", - "DOM_VK_XF86XK_KBD_BRIGHTNESS_DOWN", - "DOM_VK_XF86XK_KBD_BRIGHTNESS_UP", - "DOM_VK_XF86XK_KBD_LIGHT_ON_OFF", - "DOM_VK_XF86XK_LAUNCH0", - "DOM_VK_XF86XK_LAUNCH1", - "DOM_VK_XF86XK_LAUNCH2", - "DOM_VK_XF86XK_LAUNCH3", - "DOM_VK_XF86XK_LAUNCH4", - "DOM_VK_XF86XK_LAUNCH5", - "DOM_VK_XF86XK_LAUNCH6", - "DOM_VK_XF86XK_LAUNCH7", - "DOM_VK_XF86XK_LAUNCH8", - "DOM_VK_XF86XK_LAUNCH9", - "DOM_VK_XF86XK_LAUNCH_A", - "DOM_VK_XF86XK_LAUNCH_B", - "DOM_VK_XF86XK_LAUNCH_C", - "DOM_VK_XF86XK_LAUNCH_D", - "DOM_VK_XF86XK_LAUNCH_E", - "DOM_VK_XF86XK_LAUNCH_F", - "DOM_VK_XF86XK_LIGHT_BULB", - "DOM_VK_XF86XK_LOG_OFF", - "DOM_VK_XF86XK_MAIL", - "DOM_VK_XF86XK_MAIL_FORWARD", - "DOM_VK_XF86XK_MARKET", - "DOM_VK_XF86XK_MEETING", - "DOM_VK_XF86XK_MEMO", - "DOM_VK_XF86XK_MENU_KB", - "DOM_VK_XF86XK_MENU_PB", - "DOM_VK_XF86XK_MESSENGER", - "DOM_VK_XF86XK_MON_BRIGHTNESS_DOWN", - "DOM_VK_XF86XK_MON_BRIGHTNESS_UP", - "DOM_VK_XF86XK_MUSIC", - "DOM_VK_XF86XK_MY_COMPUTER", - "DOM_VK_XF86XK_MY_SITES", - "DOM_VK_XF86XK_NEW", - "DOM_VK_XF86XK_NEWS", - "DOM_VK_XF86XK_OFFICE_HOME", - "DOM_VK_XF86XK_OPEN", - "DOM_VK_XF86XK_OPEN_URL", - "DOM_VK_XF86XK_OPTION", - "DOM_VK_XF86XK_PASTE", - "DOM_VK_XF86XK_PHONE", - "DOM_VK_XF86XK_PICTURES", - "DOM_VK_XF86XK_POWER_DOWN", - "DOM_VK_XF86XK_POWER_OFF", - "DOM_VK_XF86XK_RED", - "DOM_VK_XF86XK_REFRESH", - "DOM_VK_XF86XK_RELOAD", - "DOM_VK_XF86XK_REPLY", - "DOM_VK_XF86XK_ROCKER_DOWN", - "DOM_VK_XF86XK_ROCKER_ENTER", - "DOM_VK_XF86XK_ROCKER_UP", - "DOM_VK_XF86XK_ROTATE_WINDOWS", - "DOM_VK_XF86XK_ROTATION_KB", - "DOM_VK_XF86XK_ROTATION_PB", - "DOM_VK_XF86XK_SAVE", - "DOM_VK_XF86XK_SCREEN_SAVER", - "DOM_VK_XF86XK_SCROLL_CLICK", - "DOM_VK_XF86XK_SCROLL_DOWN", - "DOM_VK_XF86XK_SCROLL_UP", - "DOM_VK_XF86XK_SEARCH", - "DOM_VK_XF86XK_SEND", - "DOM_VK_XF86XK_SHOP", - "DOM_VK_XF86XK_SPELL", - "DOM_VK_XF86XK_SPLIT_SCREEN", - "DOM_VK_XF86XK_STANDBY", - "DOM_VK_XF86XK_START", - "DOM_VK_XF86XK_STOP", - "DOM_VK_XF86XK_SUBTITLE", - "DOM_VK_XF86XK_SUPPORT", - "DOM_VK_XF86XK_SUSPEND", - "DOM_VK_XF86XK_TASK_PANE", - "DOM_VK_XF86XK_TERMINAL", - "DOM_VK_XF86XK_TIME", - "DOM_VK_XF86XK_TOOLS", - "DOM_VK_XF86XK_TOP_MENU", - "DOM_VK_XF86XK_TO_DO_LIST", - "DOM_VK_XF86XK_TRAVEL", - "DOM_VK_XF86XK_USER1KB", - "DOM_VK_XF86XK_USER2KB", - "DOM_VK_XF86XK_USER_PB", - "DOM_VK_XF86XK_UWB", - "DOM_VK_XF86XK_VENDOR_HOME", - "DOM_VK_XF86XK_VIDEO", - "DOM_VK_XF86XK_VIEW", - "DOM_VK_XF86XK_WAKE_UP", - "DOM_VK_XF86XK_WEB_CAM", - "DOM_VK_XF86XK_WHEEL_BUTTON", - "DOM_VK_XF86XK_WLAN", - "DOM_VK_XF86XK_WORD", - "DOM_VK_XF86XK_WWW", - "DOM_VK_XF86XK_XFER", - "DOM_VK_XF86XK_YELLOW", - "DOM_VK_XF86XK_ZOOM_IN", - "DOM_VK_XF86XK_ZOOM_OUT", - "DOM_VK_Y", - "DOM_VK_Z", - "DOM_VK_ZOOM", - "DONE", - "DONT_CARE", - "DOWNLOADING", - "DRAGDROP", - "DRAW_BUFFER0", - "DRAW_BUFFER1", - "DRAW_BUFFER10", - "DRAW_BUFFER11", - "DRAW_BUFFER12", - "DRAW_BUFFER13", - "DRAW_BUFFER14", - "DRAW_BUFFER15", - "DRAW_BUFFER2", - "DRAW_BUFFER3", - "DRAW_BUFFER4", - "DRAW_BUFFER5", - "DRAW_BUFFER6", - "DRAW_BUFFER7", - "DRAW_BUFFER8", - "DRAW_BUFFER9", - "DRAW_FRAMEBUFFER", - "DRAW_FRAMEBUFFER_BINDING", - "DST_ALPHA", - "DST_COLOR", - "DYNAMIC_COPY", - "DYNAMIC_DRAW", - "DYNAMIC_READ", - "DataChannel", - "DataTransfer", - "DataTransferItem", - "DataTransferItemList", - "DataView", - "Date", - "DateTimeFormat", - "DecompressionStream", - "DelayNode", - "DeprecationReportBody", - "DesktopNotification", - "DesktopNotificationCenter", - "DeviceLightEvent", - "DeviceMotionEvent", - "DeviceMotionEventAcceleration", - "DeviceMotionEventRotationRate", - "DeviceOrientationEvent", - "DeviceProximityEvent", - "DeviceStorage", - "DeviceStorageChangeEvent", - "Directory", - "DisplayNames", - "Document", - "DocumentFragment", - "DocumentTimeline", - "DocumentType", - "DragEvent", - "DynamicsCompressorNode", - "E", - "ELEMENT_ARRAY_BUFFER", - "ELEMENT_ARRAY_BUFFER_BINDING", - "ELEMENT_NODE", - "EMPTY", - "ENCODING_ERR", - "ENDED", - "END_TO_END", - "END_TO_START", - "ENTITY_NODE", - "ENTITY_REFERENCE_NODE", - "EPSILON", - "EQUAL", - "EQUALPOWER", - "ERROR", - "EXPONENTIAL_DISTANCE", - "exports", - "Element", - "ElementInternals", - "ElementQuery", - "EnterPictureInPictureEvent", - "Entity", - "EntityReference", - "Error", - "ErrorEvent", - "EvalError", - "Event", - "EventException", - "EventSource", - "EventTarget", - "External", - "FASTEST", - "FIDOSDK", - "FILTER_ACCEPT", - "FILTER_INTERRUPT", - "FILTER_REJECT", - "FILTER_SKIP", - "FINISHED_STATE", - "FIRST_ORDERED_NODE_TYPE", - "FLOAT", - "FLOAT_32_UNSIGNED_INT_24_8_REV", - "FLOAT_MAT2", - "FLOAT_MAT2x3", - "FLOAT_MAT2x4", - "FLOAT_MAT3", - "FLOAT_MAT3x2", - "FLOAT_MAT3x4", - "FLOAT_MAT4", - "FLOAT_MAT4x2", - "FLOAT_MAT4x3", - "FLOAT_VEC2", - "FLOAT_VEC3", - "FLOAT_VEC4", - "FOCUS", - "FONT_FACE_RULE", - "FONT_FEATURE_VALUES_RULE", - "FRAGMENT_SHADER", - "FRAGMENT_SHADER_DERIVATIVE_HINT", - "FRAGMENT_SHADER_DERIVATIVE_HINT_OES", - "FRAMEBUFFER", - "FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE", - "FRAMEBUFFER_ATTACHMENT_BLUE_SIZE", - "FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING", - "FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE", - "FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE", - "FRAMEBUFFER_ATTACHMENT_GREEN_SIZE", - "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME", - "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE", - "FRAMEBUFFER_ATTACHMENT_RED_SIZE", - "FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE", - "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE", - "FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER", - "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL", - "FRAMEBUFFER_BINDING", - "FRAMEBUFFER_COMPLETE", - "FRAMEBUFFER_DEFAULT", - "FRAMEBUFFER_INCOMPLETE_ATTACHMENT", - "FRAMEBUFFER_INCOMPLETE_DIMENSIONS", - "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT", - "FRAMEBUFFER_INCOMPLETE_MULTISAMPLE", - "FRAMEBUFFER_UNSUPPORTED", - "FRONT", - "FRONT_AND_BACK", - "FRONT_FACE", - "FUNC_ADD", - "FUNC_REVERSE_SUBTRACT", - "FUNC_SUBTRACT", - "FeaturePolicy", - "FeaturePolicyViolationReportBody", - "FederatedCredential", - "Feed", - "FeedEntry", - "File", - "FileError", - "FileList", - "FileReader", - "FileSystem", - "FileSystemDirectoryEntry", - "FileSystemDirectoryReader", - "FileSystemEntry", - "FileSystemFileEntry", - "FinalizationRegistry", - "FindInPage", - "Float32Array", - "Float64Array", - "FocusEvent", - "FontFace", - "FontFaceSet", - "FontFaceSetLoadEvent", - "FormData", - "FormDataEvent", - "FragmentDirective", - "Function", - "GENERATE_MIPMAP_HINT", - "GEQUAL", - "GREATER", - "GREEN_BITS", - "GainNode", - "Gamepad", - "GamepadAxisMoveEvent", - "GamepadButton", - "GamepadButtonEvent", - "GamepadEvent", - "GamepadHapticActuator", - "GamepadPose", - "Geolocation", - "GeolocationCoordinates", - "GeolocationPosition", - "GeolocationPositionError", - "GestureEvent", - "Global", - "Gyroscope", - "HALF_FLOAT", - "HAVE_CURRENT_DATA", - "HAVE_ENOUGH_DATA", - "HAVE_FUTURE_DATA", - "HAVE_METADATA", - "HAVE_NOTHING", - "HEADERS_RECEIVED", - "HIDDEN", - "HIERARCHY_REQUEST_ERR", - "HIGHPASS", - "HIGHSHELF", - "HIGH_FLOAT", - "HIGH_INT", - "HORIZONTAL", - "HORIZONTAL_AXIS", - "HRTF", - "HTMLAllCollection", - "HTMLAnchorElement", - "HTMLAppletElement", - "HTMLAreaElement", - "HTMLAudioElement", - "HTMLBRElement", - "HTMLBaseElement", - "HTMLBaseFontElement", - "HTMLBlockquoteElement", - "HTMLBodyElement", - "HTMLButtonElement", - "HTMLCanvasElement", - "HTMLCollection", - "HTMLCommandElement", - "HTMLContentElement", - "HTMLDListElement", - "HTMLDataElement", - "HTMLDataListElement", - "HTMLDetailsElement", - "HTMLDialogElement", - "HTMLDirectoryElement", - "HTMLDivElement", - "HTMLDocument", - "HTMLElement", - "HTMLEmbedElement", - "HTMLFieldSetElement", - "HTMLFontElement", - "HTMLFormControlsCollection", - "HTMLFormElement", - "HTMLFrameElement", - "HTMLFrameSetElement", - "HTMLHRElement", - "HTMLHeadElement", - "HTMLHeadingElement", - "HTMLHtmlElement", - "HTMLIFrameElement", - "HTMLImageElement", - "HTMLInputElement", - "HTMLIsIndexElement", - "HTMLKeygenElement", - "HTMLLIElement", - "HTMLLabelElement", - "HTMLLegendElement", - "HTMLLinkElement", - "HTMLMapElement", - "HTMLMarqueeElement", - "HTMLMediaElement", - "HTMLMenuElement", - "HTMLMenuItemElement", - "HTMLMetaElement", - "HTMLMeterElement", - "HTMLModElement", - "HTMLOListElement", - "HTMLObjectElement", - "HTMLOptGroupElement", - "HTMLOptionElement", - "HTMLOptionsCollection", - "HTMLOutputElement", - "HTMLParagraphElement", - "HTMLParamElement", - "HTMLPictureElement", - "HTMLPreElement", - "HTMLProgressElement", - "HTMLPropertiesCollection", - "HTMLQuoteElement", - "HTMLScriptElement", - "HTMLSelectElement", - "HTMLShadowElement", - "HTMLSlotElement", - "HTMLSourceElement", - "HTMLSpanElement", - "HTMLStyleElement", - "HTMLTableCaptionElement", - "HTMLTableCellElement", - "HTMLTableColElement", - "HTMLTableElement", - "HTMLTableRowElement", - "HTMLTableSectionElement", - "HTMLTemplateElement", - "HTMLTextAreaElement", - "HTMLTimeElement", - "HTMLTitleElement", - "HTMLTrackElement", - "HTMLUListElement", - "HTMLUnknownElement", - "HTMLVideoElement", - "HashChangeEvent", - "Headers", - "History", - "Hz", - "ICE_CHECKING", - "ICE_CLOSED", - "ICE_COMPLETED", - "ICE_CONNECTED", - "ICE_FAILED", - "ICE_GATHERING", - "ICE_WAITING", - "IDBCursor", - "IDBCursorWithValue", - "IDBDatabase", - "IDBDatabaseException", - "IDBFactory", - "IDBFileHandle", - "IDBFileRequest", - "IDBIndex", - "IDBKeyRange", - "IDBMutableFile", - "IDBObjectStore", - "IDBOpenDBRequest", - "IDBRequest", - "IDBTransaction", - "IDBVersionChangeEvent", - "IDLE", - "IIRFilterNode", - "IMPLEMENTATION_COLOR_READ_FORMAT", - "IMPLEMENTATION_COLOR_READ_TYPE", - "IMPORT_RULE", - "INCR", - "INCR_WRAP", - "INDEX_SIZE_ERR", - "INT", - "INTERLEAVED_ATTRIBS", - "INT_2_10_10_10_REV", - "INT_SAMPLER_2D", - "INT_SAMPLER_2D_ARRAY", - "INT_SAMPLER_3D", - "INT_SAMPLER_CUBE", - "INT_VEC2", - "INT_VEC3", - "INT_VEC4", - "INUSE_ATTRIBUTE_ERR", - "INVALID_ACCESS_ERR", - "INVALID_CHARACTER_ERR", - "INVALID_ENUM", - "INVALID_EXPRESSION_ERR", - "INVALID_FRAMEBUFFER_OPERATION", - "INVALID_INDEX", - "INVALID_MODIFICATION_ERR", - "INVALID_NODE_TYPE_ERR", - "INVALID_OPERATION", - "INVALID_STATE_ERR", - "INVALID_VALUE", - "INVERSE_DISTANCE", - "INVERT", - "IceCandidate", - "IdleDeadline", - "Image", - "ImageBitmap", - "ImageBitmapRenderingContext", - "ImageCapture", - "ImageData", - "Infinity", - "InputDeviceCapabilities", - "InputDeviceInfo", - "InputEvent", - "InputMethodContext", - "InstallTrigger", - "InstallTriggerImpl", - "Instance", - "Int16Array", - "Int32Array", - "Int8Array", - "Intent", - "InternalError", - "IntersectionObserver", - "IntersectionObserverEntry", - "Intl", - "IsSearchProviderInstalled", - "Iterator", - "JSON", - "KEEP", - "KEYDOWN", - "KEYFRAMES_RULE", - "KEYFRAME_RULE", - "KEYPRESS", - "KEYUP", - "KeyEvent", - "Keyboard", - "KeyboardEvent", - "KeyboardLayoutMap", - "KeyframeEffect", - "LENGTHADJUST_SPACING", - "LENGTHADJUST_SPACINGANDGLYPHS", - "LENGTHADJUST_UNKNOWN", - "LEQUAL", - "LESS", - "LINEAR", - "LINEAR_DISTANCE", - "LINEAR_MIPMAP_LINEAR", - "LINEAR_MIPMAP_NEAREST", - "LINES", - "LINE_LOOP", - "LINE_STRIP", - "LINE_WIDTH", - "LINK_STATUS", - "LIVE", - "LN10", - "LN2", - "LOADED", - "LOADING", - "LOG10E", - "LOG2E", - "LOWPASS", - "LOWSHELF", - "LOW_FLOAT", - "LOW_INT", - "LSException", - "LSParserFilter", - "LUMINANCE", - "LUMINANCE_ALPHA", - "LargestContentfulPaint", - "LayoutShift", - "LayoutShiftAttribution", - "LinearAccelerationSensor", - "LinkError", - "ListFormat", - "LocalMediaStream", - "Locale", - "Location", - "Lock", - "LockManager", - "MAX", - "MAX_3D_TEXTURE_SIZE", - "MAX_ARRAY_TEXTURE_LAYERS", - "MAX_CLIENT_WAIT_TIMEOUT_WEBGL", - "MAX_COLOR_ATTACHMENTS", - "MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS", - "MAX_COMBINED_TEXTURE_IMAGE_UNITS", - "MAX_COMBINED_UNIFORM_BLOCKS", - "MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS", - "MAX_CUBE_MAP_TEXTURE_SIZE", - "MAX_DRAW_BUFFERS", - "MAX_ELEMENTS_INDICES", - "MAX_ELEMENTS_VERTICES", - "MAX_ELEMENT_INDEX", - "MAX_FRAGMENT_INPUT_COMPONENTS", - "MAX_FRAGMENT_UNIFORM_BLOCKS", - "MAX_FRAGMENT_UNIFORM_COMPONENTS", - "MAX_FRAGMENT_UNIFORM_VECTORS", - "MAX_PROGRAM_TEXEL_OFFSET", - "MAX_RENDERBUFFER_SIZE", - "MAX_SAFE_INTEGER", - "MAX_SAMPLES", - "MAX_SERVER_WAIT_TIMEOUT", - "MAX_TEXTURE_IMAGE_UNITS", - "MAX_TEXTURE_LOD_BIAS", - "MAX_TEXTURE_MAX_ANISOTROPY_EXT", - "MAX_TEXTURE_SIZE", - "MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS", - "MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS", - "MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS", - "MAX_UNIFORM_BLOCK_SIZE", - "MAX_UNIFORM_BUFFER_BINDINGS", - "MAX_VALUE", - "MAX_VARYING_COMPONENTS", - "MAX_VARYING_VECTORS", - "MAX_VERTEX_ATTRIBS", - "MAX_VERTEX_OUTPUT_COMPONENTS", - "MAX_VERTEX_TEXTURE_IMAGE_UNITS", - "MAX_VERTEX_UNIFORM_BLOCKS", - "MAX_VERTEX_UNIFORM_COMPONENTS", - "MAX_VERTEX_UNIFORM_VECTORS", - "MAX_VIEWPORT_DIMS", - "MEDIA_ERR_ABORTED", - "MEDIA_ERR_DECODE", - "MEDIA_ERR_ENCRYPTED", - "MEDIA_ERR_NETWORK", - "MEDIA_ERR_SRC_NOT_SUPPORTED", - "MEDIA_KEYERR_CLIENT", - "MEDIA_KEYERR_DOMAIN", - "MEDIA_KEYERR_HARDWARECHANGE", - "MEDIA_KEYERR_OUTPUT", - "MEDIA_KEYERR_SERVICE", - "MEDIA_KEYERR_UNKNOWN", - "MEDIA_RULE", - "MEDIUM_FLOAT", - "MEDIUM_INT", - "META_MASK", - "MIDIAccess", - "MIDIConnectionEvent", - "MIDIInput", - "MIDIInputMap", - "MIDIMessageEvent", - "MIDIOutput", - "MIDIOutputMap", - "MIDIPort", - "MIN", - "MIN_PROGRAM_TEXEL_OFFSET", - "MIN_SAFE_INTEGER", - "MIN_VALUE", - "MIRRORED_REPEAT", - "MODE_ASYNCHRONOUS", - "MODE_SYNCHRONOUS", - "MODIFICATION", - "MOUSEDOWN", - "MOUSEDRAG", - "MOUSEMOVE", - "MOUSEOUT", - "MOUSEOVER", - "MOUSEUP", - "MOZ_KEYFRAMES_RULE", - "MOZ_KEYFRAME_RULE", - "MOZ_SOURCE_CURSOR", - "MOZ_SOURCE_ERASER", - "MOZ_SOURCE_KEYBOARD", - "MOZ_SOURCE_MOUSE", - "MOZ_SOURCE_PEN", - "MOZ_SOURCE_TOUCH", - "MOZ_SOURCE_UNKNOWN", - "MSGESTURE_FLAG_BEGIN", - "MSGESTURE_FLAG_CANCEL", - "MSGESTURE_FLAG_END", - "MSGESTURE_FLAG_INERTIA", - "MSGESTURE_FLAG_NONE", - "MSPOINTER_TYPE_MOUSE", - "MSPOINTER_TYPE_PEN", - "MSPOINTER_TYPE_TOUCH", - "MS_ASYNC_CALLBACK_STATUS_ASSIGN_DELEGATE", - "MS_ASYNC_CALLBACK_STATUS_CANCEL", - "MS_ASYNC_CALLBACK_STATUS_CHOOSEANY", - "MS_ASYNC_CALLBACK_STATUS_ERROR", - "MS_ASYNC_CALLBACK_STATUS_JOIN", - "MS_ASYNC_OP_STATUS_CANCELED", - "MS_ASYNC_OP_STATUS_ERROR", - "MS_ASYNC_OP_STATUS_SUCCESS", - "MS_MANIPULATION_STATE_ACTIVE", - "MS_MANIPULATION_STATE_CANCELLED", - "MS_MANIPULATION_STATE_COMMITTED", - "MS_MANIPULATION_STATE_DRAGGING", - "MS_MANIPULATION_STATE_INERTIA", - "MS_MANIPULATION_STATE_PRESELECT", - "MS_MANIPULATION_STATE_SELECTING", - "MS_MANIPULATION_STATE_STOPPED", - "MS_MEDIA_ERR_ENCRYPTED", - "MS_MEDIA_KEYERR_CLIENT", - "MS_MEDIA_KEYERR_DOMAIN", - "MS_MEDIA_KEYERR_HARDWARECHANGE", - "MS_MEDIA_KEYERR_OUTPUT", - "MS_MEDIA_KEYERR_SERVICE", - "MS_MEDIA_KEYERR_UNKNOWN", - "Map", - "Math", - "MathMLElement", - "MediaCapabilities", - "MediaCapabilitiesInfo", - "MediaController", - "MediaDeviceInfo", - "MediaDevices", - "MediaElementAudioSourceNode", - "MediaEncryptedEvent", - "MediaError", - "MediaKeyError", - "MediaKeyEvent", - "MediaKeyMessageEvent", - "MediaKeyNeededEvent", - "MediaKeySession", - "MediaKeyStatusMap", - "MediaKeySystemAccess", - "MediaKeys", - "MediaList", - "MediaMetadata", - "MediaQueryList", - "MediaQueryListEvent", - "MediaRecorder", - "MediaRecorderErrorEvent", - "MediaSession", - "MediaSettingsRange", - "MediaSource", - "MediaStream", - "MediaStreamAudioDestinationNode", - "MediaStreamAudioSourceNode", - "MediaStreamEvent", - "MediaStreamTrack", - "MediaStreamTrackAudioSourceNode", - "MediaStreamTrackEvent", - "Memory", - "MessageChannel", - "MessageEvent", - "MessagePort", - "Methods", - "MimeType", - "MimeTypeArray", - "Module", - "MouseEvent", - "MouseScrollEvent", - "MozAnimation", - "MozAnimationDelay", - "MozAnimationDirection", - "MozAnimationDuration", - "MozAnimationFillMode", - "MozAnimationIterationCount", - "MozAnimationName", - "MozAnimationPlayState", - "MozAnimationTimingFunction", - "MozAppearance", - "MozBackfaceVisibility", - "MozBinding", - "MozBorderBottomColors", - "MozBorderEnd", - "MozBorderEndColor", - "MozBorderEndStyle", - "MozBorderEndWidth", - "MozBorderImage", - "MozBorderLeftColors", - "MozBorderRightColors", - "MozBorderStart", - "MozBorderStartColor", - "MozBorderStartStyle", - "MozBorderStartWidth", - "MozBorderTopColors", - "MozBoxAlign", - "MozBoxDirection", - "MozBoxFlex", - "MozBoxOrdinalGroup", - "MozBoxOrient", - "MozBoxPack", - "MozBoxSizing", - "MozCSSKeyframeRule", - "MozCSSKeyframesRule", - "MozColumnCount", - "MozColumnFill", - "MozColumnGap", - "MozColumnRule", - "MozColumnRuleColor", - "MozColumnRuleStyle", - "MozColumnRuleWidth", - "MozColumnWidth", - "MozColumns", - "MozContactChangeEvent", - "MozFloatEdge", - "MozFontFeatureSettings", - "MozFontLanguageOverride", - "MozForceBrokenImageIcon", - "MozHyphens", - "MozImageRegion", - "MozMarginEnd", - "MozMarginStart", - "MozMmsEvent", - "MozMmsMessage", - "MozMobileMessageThread", - "MozOSXFontSmoothing", - "MozOrient", - "MozOsxFontSmoothing", - "MozOutlineRadius", - "MozOutlineRadiusBottomleft", - "MozOutlineRadiusBottomright", - "MozOutlineRadiusTopleft", - "MozOutlineRadiusTopright", - "MozPaddingEnd", - "MozPaddingStart", - "MozPerspective", - "MozPerspectiveOrigin", - "MozPowerManager", - "MozSettingsEvent", - "MozSmsEvent", - "MozSmsMessage", - "MozStackSizing", - "MozTabSize", - "MozTextAlignLast", - "MozTextDecorationColor", - "MozTextDecorationLine", - "MozTextDecorationStyle", - "MozTextSizeAdjust", - "MozTransform", - "MozTransformOrigin", - "MozTransformStyle", - "MozTransition", - "MozTransitionDelay", - "MozTransitionDuration", - "MozTransitionProperty", - "MozTransitionTimingFunction", - "MozUserFocus", - "MozUserInput", - "MozUserModify", - "MozUserSelect", - "MozWindowDragging", - "MozWindowShadow", - "MutationEvent", - "MutationObserver", - "MutationRecord", - "NAMESPACE_ERR", - "NAMESPACE_RULE", - "NEAREST", - "NEAREST_MIPMAP_LINEAR", - "NEAREST_MIPMAP_NEAREST", - "NEGATIVE_INFINITY", - "NETWORK_EMPTY", - "NETWORK_ERR", - "NETWORK_IDLE", - "NETWORK_LOADED", - "NETWORK_LOADING", - "NETWORK_NO_SOURCE", - "NEVER", - "NEW", - "NEXT", - "NEXT_NO_DUPLICATE", - "NICEST", - "NODE_AFTER", - "NODE_BEFORE", - "NODE_BEFORE_AND_AFTER", - "NODE_INSIDE", - "NONE", - "NON_TRANSIENT_ERR", - "NOTATION_NODE", - "NOTCH", - "NOTEQUAL", - "NOT_ALLOWED_ERR", - "NOT_FOUND_ERR", - "NOT_READABLE_ERR", - "NOT_SUPPORTED_ERR", - "NO_DATA_ALLOWED_ERR", - "NO_ERR", - "NO_ERROR", - "NO_MODIFICATION_ALLOWED_ERR", - "NUMBER_TYPE", - "NUM_COMPRESSED_TEXTURE_FORMATS", - "NaN", - "NamedNodeMap", - "NavigationPreloadManager", - "Navigator", - "NearbyLinks", - "NetworkInformation", - "Node", - "NodeFilter", - "NodeIterator", - "NodeList", - "Notation", - "Notification", - "NotifyPaintEvent", - "Number", - "NumberFormat", - "OBJECT_TYPE", - "OBSOLETE", - "OK", - "ONE", - "ONE_MINUS_CONSTANT_ALPHA", - "ONE_MINUS_CONSTANT_COLOR", - "ONE_MINUS_DST_ALPHA", - "ONE_MINUS_DST_COLOR", - "ONE_MINUS_SRC_ALPHA", - "ONE_MINUS_SRC_COLOR", - "OPEN", - "OPENED", - "OPENING", - "ORDERED_NODE_ITERATOR_TYPE", - "ORDERED_NODE_SNAPSHOT_TYPE", - "OTHER_ERROR", - "OUT_OF_MEMORY", - "Object", - "OfflineAudioCompletionEvent", - "OfflineAudioContext", - "OfflineResourceList", - "OffscreenCanvas", - "OffscreenCanvasRenderingContext2D", - "Option", - "OrientationSensor", - "OscillatorNode", - "OverconstrainedError", - "OverflowEvent", - "PACK_ALIGNMENT", - "PACK_ROW_LENGTH", - "PACK_SKIP_PIXELS", - "PACK_SKIP_ROWS", - "PAGE_RULE", - "PARSE_ERR", - "PATHSEG_ARC_ABS", - "PATHSEG_ARC_REL", - "PATHSEG_CLOSEPATH", - "PATHSEG_CURVETO_CUBIC_ABS", - "PATHSEG_CURVETO_CUBIC_REL", - "PATHSEG_CURVETO_CUBIC_SMOOTH_ABS", - "PATHSEG_CURVETO_CUBIC_SMOOTH_REL", - "PATHSEG_CURVETO_QUADRATIC_ABS", - "PATHSEG_CURVETO_QUADRATIC_REL", - "PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS", - "PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL", - "PATHSEG_LINETO_ABS", - "PATHSEG_LINETO_HORIZONTAL_ABS", - "PATHSEG_LINETO_HORIZONTAL_REL", - "PATHSEG_LINETO_REL", - "PATHSEG_LINETO_VERTICAL_ABS", - "PATHSEG_LINETO_VERTICAL_REL", - "PATHSEG_MOVETO_ABS", - "PATHSEG_MOVETO_REL", - "PATHSEG_UNKNOWN", - "PATH_EXISTS_ERR", - "PEAKING", - "PERMISSION_DENIED", - "PERSISTENT", - "PI", - "PIXEL_PACK_BUFFER", - "PIXEL_PACK_BUFFER_BINDING", - "PIXEL_UNPACK_BUFFER", - "PIXEL_UNPACK_BUFFER_BINDING", - "PLAYING_STATE", - "POINTS", - "POLYGON_OFFSET_FACTOR", - "POLYGON_OFFSET_FILL", - "POLYGON_OFFSET_UNITS", - "POSITION_UNAVAILABLE", - "POSITIVE_INFINITY", - "PREV", - "PREV_NO_DUPLICATE", - "PROCESSING_INSTRUCTION_NODE", - "PageChangeEvent", - "PageTransitionEvent", - "PaintRequest", - "PaintRequestList", - "PannerNode", - "PasswordCredential", - "Path2D", - "PaymentAddress", - "PaymentInstruments", - "PaymentManager", - "PaymentMethodChangeEvent", - "PaymentRequest", - "PaymentRequestUpdateEvent", - "PaymentResponse", - "Performance", - "PerformanceElementTiming", - "PerformanceEntry", - "PerformanceEventTiming", - "PerformanceLongTaskTiming", - "PerformanceMark", - "PerformanceMeasure", - "PerformanceNavigation", - "PerformanceNavigationTiming", - "PerformanceObserver", - "PerformanceObserverEntryList", - "PerformancePaintTiming", - "PerformanceResourceTiming", - "PerformanceServerTiming", - "PerformanceTiming", - "PeriodicSyncManager", - "PeriodicWave", - "PermissionStatus", - "Permissions", - "PhotoCapabilities", - "PictureInPictureWindow", - "Plugin", - "PluginArray", - "PluralRules", - "PointerEvent", - "PopStateEvent", - "PopupBlockedEvent", - "Presentation", - "PresentationAvailability", - "PresentationConnection", - "PresentationConnectionAvailableEvent", - "PresentationConnectionCloseEvent", - "PresentationConnectionList", - "PresentationReceiver", - "PresentationRequest", - "ProcessingInstruction", - "ProgressEvent", - "Promise", - "PromiseRejectionEvent", - "PropertyNodeList", - "Proxy", - "PublicKeyCredential", - "PushManager", - "PushSubscription", - "PushSubscriptionOptions", - "Q", - "QUERY_RESULT", - "QUERY_RESULT_AVAILABLE", - "QUOTA_ERR", - "QUOTA_EXCEEDED_ERR", - "QueryInterface", - "R11F_G11F_B10F", - "R16F", - "R16I", - "R16UI", - "R32F", - "R32I", - "R32UI", - "R8", - "R8I", - "R8UI", - "R8_SNORM", - "RASTERIZER_DISCARD", - "READ_BUFFER", - "READ_FRAMEBUFFER", - "READ_FRAMEBUFFER_BINDING", - "READ_ONLY", - "READ_ONLY_ERR", - "READ_WRITE", - "RED", - "RED_BITS", - "RED_INTEGER", - "REMOVAL", - "RENDERBUFFER", - "RENDERBUFFER_ALPHA_SIZE", - "RENDERBUFFER_BINDING", - "RENDERBUFFER_BLUE_SIZE", - "RENDERBUFFER_DEPTH_SIZE", - "RENDERBUFFER_GREEN_SIZE", - "RENDERBUFFER_HEIGHT", - "RENDERBUFFER_INTERNAL_FORMAT", - "RENDERBUFFER_RED_SIZE", - "RENDERBUFFER_SAMPLES", - "RENDERBUFFER_STENCIL_SIZE", - "RENDERBUFFER_WIDTH", - "RENDERER", - "RENDERING_INTENT_ABSOLUTE_COLORIMETRIC", - "RENDERING_INTENT_AUTO", - "RENDERING_INTENT_PERCEPTUAL", - "RENDERING_INTENT_RELATIVE_COLORIMETRIC", - "RENDERING_INTENT_SATURATION", - "RENDERING_INTENT_UNKNOWN", - "REPEAT", - "REPLACE", - "RG", - "RG16F", - "RG16I", - "RG16UI", - "RG32F", - "RG32I", - "RG32UI", - "RG8", - "RG8I", - "RG8UI", - "RG8_SNORM", - "RGB", - "RGB10_A2", - "RGB10_A2UI", - "RGB16F", - "RGB16I", - "RGB16UI", - "RGB32F", - "RGB32I", - "RGB32UI", - "RGB565", - "RGB5_A1", - "RGB8", - "RGB8I", - "RGB8UI", - "RGB8_SNORM", - "RGB9_E5", - "RGBA", - "RGBA16F", - "RGBA16I", - "RGBA16UI", - "RGBA32F", - "RGBA32I", - "RGBA32UI", - "RGBA4", - "RGBA8", - "RGBA8I", - "RGBA8UI", - "RGBA8_SNORM", - "RGBA_INTEGER", - "RGBColor", - "RGB_INTEGER", - "RG_INTEGER", - "ROTATION_CLOCKWISE", - "ROTATION_COUNTERCLOCKWISE", - "RTCCertificate", - "RTCDTMFSender", - "RTCDTMFToneChangeEvent", - "RTCDataChannel", - "RTCDataChannelEvent", - "RTCDtlsTransport", - "RTCError", - "RTCErrorEvent", - "RTCIceCandidate", - "RTCIceTransport", - "RTCPeerConnection", - "RTCPeerConnectionIceErrorEvent", - "RTCPeerConnectionIceEvent", - "RTCRtpReceiver", - "RTCRtpSender", - "RTCRtpTransceiver", - "RTCSctpTransport", - "RTCSessionDescription", - "RTCStatsReport", - "RTCTrackEvent", - "RadioNodeList", - "Range", - "RangeError", - "RangeException", - "ReadableStream", - "ReadableStreamDefaultReader", - "RecordErrorEvent", - "Rect", - "ReferenceError", - "Reflect", - "RegExp", - "RelativeOrientationSensor", - "RelativeTimeFormat", - "RemotePlayback", - "Report", - "ReportBody", - "ReportingObserver", - "Request", - "ResizeObserver", - "ResizeObserverEntry", - "ResizeObserverSize", - "Response", - "RuntimeError", - "SAMPLER_2D", - "SAMPLER_2D_ARRAY", - "SAMPLER_2D_ARRAY_SHADOW", - "SAMPLER_2D_SHADOW", - "SAMPLER_3D", - "SAMPLER_BINDING", - "SAMPLER_CUBE", - "SAMPLER_CUBE_SHADOW", - "SAMPLES", - "SAMPLE_ALPHA_TO_COVERAGE", - "SAMPLE_BUFFERS", - "SAMPLE_COVERAGE", - "SAMPLE_COVERAGE_INVERT", - "SAMPLE_COVERAGE_VALUE", - "SAWTOOTH", - "SCHEDULED_STATE", - "SCISSOR_BOX", - "SCISSOR_TEST", - "SCROLL_PAGE_DOWN", - "SCROLL_PAGE_UP", - "SDP_ANSWER", - "SDP_OFFER", - "SDP_PRANSWER", - "SECURITY_ERR", - "SELECT", - "SEPARATE_ATTRIBS", - "SERIALIZE_ERR", - "SEVERITY_ERROR", - "SEVERITY_FATAL_ERROR", - "SEVERITY_WARNING", - "SHADER_COMPILER", - "SHADER_TYPE", - "SHADING_LANGUAGE_VERSION", - "SHIFT_MASK", - "SHORT", - "SHOWING", - "SHOW_ALL", - "SHOW_ATTRIBUTE", - "SHOW_CDATA_SECTION", - "SHOW_COMMENT", - "SHOW_DOCUMENT", - "SHOW_DOCUMENT_FRAGMENT", - "SHOW_DOCUMENT_TYPE", - "SHOW_ELEMENT", - "SHOW_ENTITY", - "SHOW_ENTITY_REFERENCE", - "SHOW_NOTATION", - "SHOW_PROCESSING_INSTRUCTION", - "SHOW_TEXT", - "SIGNALED", - "SIGNED_NORMALIZED", - "SINE", - "SOUNDFIELD", - "SQLException", - "SQRT1_2", - "SQRT2", - "SQUARE", - "SRC_ALPHA", - "SRC_ALPHA_SATURATE", - "SRC_COLOR", - "SRGB", - "SRGB8", - "SRGB8_ALPHA8", - "START_TO_END", - "START_TO_START", - "STATIC_COPY", - "STATIC_DRAW", - "STATIC_READ", - "STENCIL", - "STENCIL_ATTACHMENT", - "STENCIL_BACK_FAIL", - "STENCIL_BACK_FUNC", - "STENCIL_BACK_PASS_DEPTH_FAIL", - "STENCIL_BACK_PASS_DEPTH_PASS", - "STENCIL_BACK_REF", - "STENCIL_BACK_VALUE_MASK", - "STENCIL_BACK_WRITEMASK", - "STENCIL_BITS", - "STENCIL_BUFFER_BIT", - "STENCIL_CLEAR_VALUE", - "STENCIL_FAIL", - "STENCIL_FUNC", - "STENCIL_INDEX", - "STENCIL_INDEX8", - "STENCIL_PASS_DEPTH_FAIL", - "STENCIL_PASS_DEPTH_PASS", - "STENCIL_REF", - "STENCIL_TEST", - "STENCIL_VALUE_MASK", - "STENCIL_WRITEMASK", - "STREAM_COPY", - "STREAM_DRAW", - "STREAM_READ", - "STRING_TYPE", - "STYLE_RULE", - "SUBPIXEL_BITS", - "SUPPORTS_RULE", - "SVGAElement", - "SVGAltGlyphDefElement", - "SVGAltGlyphElement", - "SVGAltGlyphItemElement", - "SVGAngle", - "SVGAnimateColorElement", - "SVGAnimateElement", - "SVGAnimateMotionElement", - "SVGAnimateTransformElement", - "SVGAnimatedAngle", - "SVGAnimatedBoolean", - "SVGAnimatedEnumeration", - "SVGAnimatedInteger", - "SVGAnimatedLength", - "SVGAnimatedLengthList", - "SVGAnimatedNumber", - "SVGAnimatedNumberList", - "SVGAnimatedPreserveAspectRatio", - "SVGAnimatedRect", - "SVGAnimatedString", - "SVGAnimatedTransformList", - "SVGAnimationElement", - "SVGCircleElement", - "SVGClipPathElement", - "SVGColor", - "SVGComponentTransferFunctionElement", - "SVGCursorElement", - "SVGDefsElement", - "SVGDescElement", - "SVGDiscardElement", - "SVGDocument", - "SVGElement", - "SVGElementInstance", - "SVGElementInstanceList", - "SVGEllipseElement", - "SVGException", - "SVGFEBlendElement", - "SVGFEColorMatrixElement", - "SVGFEComponentTransferElement", - "SVGFECompositeElement", - "SVGFEConvolveMatrixElement", - "SVGFEDiffuseLightingElement", - "SVGFEDisplacementMapElement", - "SVGFEDistantLightElement", - "SVGFEDropShadowElement", - "SVGFEFloodElement", - "SVGFEFuncAElement", - "SVGFEFuncBElement", - "SVGFEFuncGElement", - "SVGFEFuncRElement", - "SVGFEGaussianBlurElement", - "SVGFEImageElement", - "SVGFEMergeElement", - "SVGFEMergeNodeElement", - "SVGFEMorphologyElement", - "SVGFEOffsetElement", - "SVGFEPointLightElement", - "SVGFESpecularLightingElement", - "SVGFESpotLightElement", - "SVGFETileElement", - "SVGFETurbulenceElement", - "SVGFilterElement", - "SVGFontElement", - "SVGFontFaceElement", - "SVGFontFaceFormatElement", - "SVGFontFaceNameElement", - "SVGFontFaceSrcElement", - "SVGFontFaceUriElement", - "SVGForeignObjectElement", - "SVGGElement", - "SVGGeometryElement", - "SVGGlyphElement", - "SVGGlyphRefElement", - "SVGGradientElement", - "SVGGraphicsElement", - "SVGHKernElement", - "SVGImageElement", - "SVGLength", - "SVGLengthList", - "SVGLineElement", - "SVGLinearGradientElement", - "SVGMPathElement", - "SVGMarkerElement", - "SVGMaskElement", - "SVGMatrix", - "SVGMetadataElement", - "SVGMissingGlyphElement", - "SVGNumber", - "SVGNumberList", - "SVGPaint", - "SVGPathElement", - "SVGPathSeg", - "SVGPathSegArcAbs", - "SVGPathSegArcRel", - "SVGPathSegClosePath", - "SVGPathSegCurvetoCubicAbs", - "SVGPathSegCurvetoCubicRel", - "SVGPathSegCurvetoCubicSmoothAbs", - "SVGPathSegCurvetoCubicSmoothRel", - "SVGPathSegCurvetoQuadraticAbs", - "SVGPathSegCurvetoQuadraticRel", - "SVGPathSegCurvetoQuadraticSmoothAbs", - "SVGPathSegCurvetoQuadraticSmoothRel", - "SVGPathSegLinetoAbs", - "SVGPathSegLinetoHorizontalAbs", - "SVGPathSegLinetoHorizontalRel", - "SVGPathSegLinetoRel", - "SVGPathSegLinetoVerticalAbs", - "SVGPathSegLinetoVerticalRel", - "SVGPathSegList", - "SVGPathSegMovetoAbs", - "SVGPathSegMovetoRel", - "SVGPatternElement", - "SVGPoint", - "SVGPointList", - "SVGPolygonElement", - "SVGPolylineElement", - "SVGPreserveAspectRatio", - "SVGRadialGradientElement", - "SVGRect", - "SVGRectElement", - "SVGRenderingIntent", - "SVGSVGElement", - "SVGScriptElement", - "SVGSetElement", - "SVGStopElement", - "SVGStringList", - "SVGStyleElement", - "SVGSwitchElement", - "SVGSymbolElement", - "SVGTRefElement", - "SVGTSpanElement", - "SVGTextContentElement", - "SVGTextElement", - "SVGTextPathElement", - "SVGTextPositioningElement", - "SVGTitleElement", - "SVGTransform", - "SVGTransformList", - "SVGUnitTypes", - "SVGUseElement", - "SVGVKernElement", - "SVGViewElement", - "SVGViewSpec", - "SVGZoomAndPan", - "SVGZoomEvent", - "SVG_ANGLETYPE_DEG", - "SVG_ANGLETYPE_GRAD", - "SVG_ANGLETYPE_RAD", - "SVG_ANGLETYPE_UNKNOWN", - "SVG_ANGLETYPE_UNSPECIFIED", - "SVG_CHANNEL_A", - "SVG_CHANNEL_B", - "SVG_CHANNEL_G", - "SVG_CHANNEL_R", - "SVG_CHANNEL_UNKNOWN", - "SVG_COLORTYPE_CURRENTCOLOR", - "SVG_COLORTYPE_RGBCOLOR", - "SVG_COLORTYPE_RGBCOLOR_ICCCOLOR", - "SVG_COLORTYPE_UNKNOWN", - "SVG_EDGEMODE_DUPLICATE", - "SVG_EDGEMODE_NONE", - "SVG_EDGEMODE_UNKNOWN", - "SVG_EDGEMODE_WRAP", - "SVG_FEBLEND_MODE_COLOR", - "SVG_FEBLEND_MODE_COLOR_BURN", - "SVG_FEBLEND_MODE_COLOR_DODGE", - "SVG_FEBLEND_MODE_DARKEN", - "SVG_FEBLEND_MODE_DIFFERENCE", - "SVG_FEBLEND_MODE_EXCLUSION", - "SVG_FEBLEND_MODE_HARD_LIGHT", - "SVG_FEBLEND_MODE_HUE", - "SVG_FEBLEND_MODE_LIGHTEN", - "SVG_FEBLEND_MODE_LUMINOSITY", - "SVG_FEBLEND_MODE_MULTIPLY", - "SVG_FEBLEND_MODE_NORMAL", - "SVG_FEBLEND_MODE_OVERLAY", - "SVG_FEBLEND_MODE_SATURATION", - "SVG_FEBLEND_MODE_SCREEN", - "SVG_FEBLEND_MODE_SOFT_LIGHT", - "SVG_FEBLEND_MODE_UNKNOWN", - "SVG_FECOLORMATRIX_TYPE_HUEROTATE", - "SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA", - "SVG_FECOLORMATRIX_TYPE_MATRIX", - "SVG_FECOLORMATRIX_TYPE_SATURATE", - "SVG_FECOLORMATRIX_TYPE_UNKNOWN", - "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE", - "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA", - "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY", - "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR", - "SVG_FECOMPONENTTRANSFER_TYPE_TABLE", - "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN", - "SVG_FECOMPOSITE_OPERATOR_ARITHMETIC", - "SVG_FECOMPOSITE_OPERATOR_ATOP", - "SVG_FECOMPOSITE_OPERATOR_IN", - "SVG_FECOMPOSITE_OPERATOR_OUT", - "SVG_FECOMPOSITE_OPERATOR_OVER", - "SVG_FECOMPOSITE_OPERATOR_UNKNOWN", - "SVG_FECOMPOSITE_OPERATOR_XOR", - "SVG_INVALID_VALUE_ERR", - "SVG_LENGTHTYPE_CM", - "SVG_LENGTHTYPE_EMS", - "SVG_LENGTHTYPE_EXS", - "SVG_LENGTHTYPE_IN", - "SVG_LENGTHTYPE_MM", - "SVG_LENGTHTYPE_NUMBER", - "SVG_LENGTHTYPE_PC", - "SVG_LENGTHTYPE_PERCENTAGE", - "SVG_LENGTHTYPE_PT", - "SVG_LENGTHTYPE_PX", - "SVG_LENGTHTYPE_UNKNOWN", - "SVG_MARKERUNITS_STROKEWIDTH", - "SVG_MARKERUNITS_UNKNOWN", - "SVG_MARKERUNITS_USERSPACEONUSE", - "SVG_MARKER_ORIENT_ANGLE", - "SVG_MARKER_ORIENT_AUTO", - "SVG_MARKER_ORIENT_UNKNOWN", - "SVG_MASKTYPE_ALPHA", - "SVG_MASKTYPE_LUMINANCE", - "SVG_MATRIX_NOT_INVERTABLE", - "SVG_MEETORSLICE_MEET", - "SVG_MEETORSLICE_SLICE", - "SVG_MEETORSLICE_UNKNOWN", - "SVG_MORPHOLOGY_OPERATOR_DILATE", - "SVG_MORPHOLOGY_OPERATOR_ERODE", - "SVG_MORPHOLOGY_OPERATOR_UNKNOWN", - "SVG_PAINTTYPE_CURRENTCOLOR", - "SVG_PAINTTYPE_NONE", - "SVG_PAINTTYPE_RGBCOLOR", - "SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR", - "SVG_PAINTTYPE_UNKNOWN", - "SVG_PAINTTYPE_URI", - "SVG_PAINTTYPE_URI_CURRENTCOLOR", - "SVG_PAINTTYPE_URI_NONE", - "SVG_PAINTTYPE_URI_RGBCOLOR", - "SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR", - "SVG_PRESERVEASPECTRATIO_NONE", - "SVG_PRESERVEASPECTRATIO_UNKNOWN", - "SVG_PRESERVEASPECTRATIO_XMAXYMAX", - "SVG_PRESERVEASPECTRATIO_XMAXYMID", - "SVG_PRESERVEASPECTRATIO_XMAXYMIN", - "SVG_PRESERVEASPECTRATIO_XMIDYMAX", - "SVG_PRESERVEASPECTRATIO_XMIDYMID", - "SVG_PRESERVEASPECTRATIO_XMIDYMIN", - "SVG_PRESERVEASPECTRATIO_XMINYMAX", - "SVG_PRESERVEASPECTRATIO_XMINYMID", - "SVG_PRESERVEASPECTRATIO_XMINYMIN", - "SVG_SPREADMETHOD_PAD", - "SVG_SPREADMETHOD_REFLECT", - "SVG_SPREADMETHOD_REPEAT", - "SVG_SPREADMETHOD_UNKNOWN", - "SVG_STITCHTYPE_NOSTITCH", - "SVG_STITCHTYPE_STITCH", - "SVG_STITCHTYPE_UNKNOWN", - "SVG_TRANSFORM_MATRIX", - "SVG_TRANSFORM_ROTATE", - "SVG_TRANSFORM_SCALE", - "SVG_TRANSFORM_SKEWX", - "SVG_TRANSFORM_SKEWY", - "SVG_TRANSFORM_TRANSLATE", - "SVG_TRANSFORM_UNKNOWN", - "SVG_TURBULENCE_TYPE_FRACTALNOISE", - "SVG_TURBULENCE_TYPE_TURBULENCE", - "SVG_TURBULENCE_TYPE_UNKNOWN", - "SVG_UNIT_TYPE_OBJECTBOUNDINGBOX", - "SVG_UNIT_TYPE_UNKNOWN", - "SVG_UNIT_TYPE_USERSPACEONUSE", - "SVG_WRONG_TYPE_ERR", - "SVG_ZOOMANDPAN_DISABLE", - "SVG_ZOOMANDPAN_MAGNIFY", - "SVG_ZOOMANDPAN_UNKNOWN", - "SYNC_CONDITION", - "SYNC_FENCE", - "SYNC_FLAGS", - "SYNC_FLUSH_COMMANDS_BIT", - "SYNC_GPU_COMMANDS_COMPLETE", - "SYNC_STATUS", - "SYNTAX_ERR", - "SavedPages", - "Screen", - "ScreenOrientation", - "Script", - "ScriptProcessorNode", - "ScrollAreaEvent", - "SecurityPolicyViolationEvent", - "Selection", - "Sensor", - "SensorErrorEvent", - "ServiceWorker", - "ServiceWorkerContainer", - "ServiceWorkerRegistration", - "SessionDescription", - "Set", - "ShadowRoot", - "SharedArrayBuffer", - "SharedWorker", - "SimpleGestureEvent", - "SourceBuffer", - "SourceBufferList", - "SpeechSynthesis", - "SpeechSynthesisErrorEvent", - "SpeechSynthesisEvent", - "SpeechSynthesisUtterance", - "SpeechSynthesisVoice", - "StaticRange", - "StereoPannerNode", - "StopIteration", - "Storage", - "StorageEvent", - "StorageManager", - "String", - "StructType", - "StylePropertyMap", - "StylePropertyMapReadOnly", - "StyleSheet", - "StyleSheetList", - "SubmitEvent", - "SubtleCrypto", - "Symbol", - "SyncManager", - "SyntaxError", - "TEMPORARY", - "TEXTPATH_METHODTYPE_ALIGN", - "TEXTPATH_METHODTYPE_STRETCH", - "TEXTPATH_METHODTYPE_UNKNOWN", - "TEXTPATH_SPACINGTYPE_AUTO", - "TEXTPATH_SPACINGTYPE_EXACT", - "TEXTPATH_SPACINGTYPE_UNKNOWN", - "TEXTURE", - "TEXTURE0", - "TEXTURE1", - "TEXTURE10", - "TEXTURE11", - "TEXTURE12", - "TEXTURE13", - "TEXTURE14", - "TEXTURE15", - "TEXTURE16", - "TEXTURE17", - "TEXTURE18", - "TEXTURE19", - "TEXTURE2", - "TEXTURE20", - "TEXTURE21", - "TEXTURE22", - "TEXTURE23", - "TEXTURE24", - "TEXTURE25", - "TEXTURE26", - "TEXTURE27", - "TEXTURE28", - "TEXTURE29", - "TEXTURE3", - "TEXTURE30", - "TEXTURE31", - "TEXTURE4", - "TEXTURE5", - "TEXTURE6", - "TEXTURE7", - "TEXTURE8", - "TEXTURE9", - "TEXTURE_2D", - "TEXTURE_2D_ARRAY", - "TEXTURE_3D", - "TEXTURE_BASE_LEVEL", - "TEXTURE_BINDING_2D", - "TEXTURE_BINDING_2D_ARRAY", - "TEXTURE_BINDING_3D", - "TEXTURE_BINDING_CUBE_MAP", - "TEXTURE_COMPARE_FUNC", - "TEXTURE_COMPARE_MODE", - "TEXTURE_CUBE_MAP", - "TEXTURE_CUBE_MAP_NEGATIVE_X", - "TEXTURE_CUBE_MAP_NEGATIVE_Y", - "TEXTURE_CUBE_MAP_NEGATIVE_Z", - "TEXTURE_CUBE_MAP_POSITIVE_X", - "TEXTURE_CUBE_MAP_POSITIVE_Y", - "TEXTURE_CUBE_MAP_POSITIVE_Z", - "TEXTURE_IMMUTABLE_FORMAT", - "TEXTURE_IMMUTABLE_LEVELS", - "TEXTURE_MAG_FILTER", - "TEXTURE_MAX_ANISOTROPY_EXT", - "TEXTURE_MAX_LEVEL", - "TEXTURE_MAX_LOD", - "TEXTURE_MIN_FILTER", - "TEXTURE_MIN_LOD", - "TEXTURE_WRAP_R", - "TEXTURE_WRAP_S", - "TEXTURE_WRAP_T", - "TEXT_NODE", - "TIMEOUT", - "TIMEOUT_ERR", - "TIMEOUT_EXPIRED", - "TIMEOUT_IGNORED", - "TOO_LARGE_ERR", - "TRANSACTION_INACTIVE_ERR", - "TRANSFORM_FEEDBACK", - "TRANSFORM_FEEDBACK_ACTIVE", - "TRANSFORM_FEEDBACK_BINDING", - "TRANSFORM_FEEDBACK_BUFFER", - "TRANSFORM_FEEDBACK_BUFFER_BINDING", - "TRANSFORM_FEEDBACK_BUFFER_MODE", - "TRANSFORM_FEEDBACK_BUFFER_SIZE", - "TRANSFORM_FEEDBACK_BUFFER_START", - "TRANSFORM_FEEDBACK_PAUSED", - "TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN", - "TRANSFORM_FEEDBACK_VARYINGS", - "TRIANGLE", - "TRIANGLES", - "TRIANGLE_FAN", - "TRIANGLE_STRIP", - "TYPE_BACK_FORWARD", - "TYPE_ERR", - "TYPE_MISMATCH_ERR", - "TYPE_NAVIGATE", - "TYPE_RELOAD", - "TYPE_RESERVED", - "Table", - "TaskAttributionTiming", - "Text", - "TextDecoder", - "TextDecoderStream", - "TextEncoder", - "TextEncoderStream", - "TextEvent", - "TextMetrics", - "TextTrack", - "TextTrackCue", - "TextTrackCueList", - "TextTrackList", - "TimeEvent", - "TimeRanges", - "Touch", - "TouchEvent", - "TouchList", - "TrackEvent", - "TransformStream", - "TransitionEvent", - "TreeWalker", - "TrustedHTML", - "TrustedScript", - "TrustedScriptURL", - "TrustedTypePolicy", - "TrustedTypePolicyFactory", - "TypeError", - "TypedObject", - "U2F", - "UIEvent", - "UNCACHED", - "UNIFORM_ARRAY_STRIDE", - "UNIFORM_BLOCK_ACTIVE_UNIFORMS", - "UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES", - "UNIFORM_BLOCK_BINDING", - "UNIFORM_BLOCK_DATA_SIZE", - "UNIFORM_BLOCK_INDEX", - "UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER", - "UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER", - "UNIFORM_BUFFER", - "UNIFORM_BUFFER_BINDING", - "UNIFORM_BUFFER_OFFSET_ALIGNMENT", - "UNIFORM_BUFFER_SIZE", - "UNIFORM_BUFFER_START", - "UNIFORM_IS_ROW_MAJOR", - "UNIFORM_MATRIX_STRIDE", - "UNIFORM_OFFSET", - "UNIFORM_SIZE", - "UNIFORM_TYPE", - "UNKNOWN_ERR", - "UNKNOWN_RULE", - "UNMASKED_RENDERER_WEBGL", - "UNMASKED_VENDOR_WEBGL", - "UNORDERED_NODE_ITERATOR_TYPE", - "UNORDERED_NODE_SNAPSHOT_TYPE", - "UNPACK_ALIGNMENT", - "UNPACK_COLORSPACE_CONVERSION_WEBGL", - "UNPACK_FLIP_Y_WEBGL", - "UNPACK_IMAGE_HEIGHT", - "UNPACK_PREMULTIPLY_ALPHA_WEBGL", - "UNPACK_ROW_LENGTH", - "UNPACK_SKIP_IMAGES", - "UNPACK_SKIP_PIXELS", - "UNPACK_SKIP_ROWS", - "UNSCHEDULED_STATE", - "UNSENT", - "UNSIGNALED", - "UNSIGNED_BYTE", - "UNSIGNED_INT", - "UNSIGNED_INT_10F_11F_11F_REV", - "UNSIGNED_INT_24_8", - "UNSIGNED_INT_2_10_10_10_REV", - "UNSIGNED_INT_5_9_9_9_REV", - "UNSIGNED_INT_SAMPLER_2D", - "UNSIGNED_INT_SAMPLER_2D_ARRAY", - "UNSIGNED_INT_SAMPLER_3D", - "UNSIGNED_INT_SAMPLER_CUBE", - "UNSIGNED_INT_VEC2", - "UNSIGNED_INT_VEC3", - "UNSIGNED_INT_VEC4", - "UNSIGNED_NORMALIZED", - "UNSIGNED_SHORT", - "UNSIGNED_SHORT_4_4_4_4", - "UNSIGNED_SHORT_5_5_5_1", - "UNSIGNED_SHORT_5_6_5", - "UNSPECIFIED_EVENT_TYPE_ERR", - "UPDATEREADY", - "URIError", - "URL", - "URLSearchParams", - "URLUnencoded", - "URL_MISMATCH_ERR", - "USB", - "USBAlternateInterface", - "USBConfiguration", - "USBConnectionEvent", - "USBDevice", - "USBEndpoint", - "USBInTransferResult", - "USBInterface", - "USBIsochronousInTransferPacket", - "USBIsochronousInTransferResult", - "USBIsochronousOutTransferPacket", - "USBIsochronousOutTransferResult", - "USBOutTransferResult", - "UTC", - "Uint16Array", - "Uint32Array", - "Uint8Array", - "Uint8ClampedArray", - "UserActivation", - "UserMessageHandler", - "UserMessageHandlersNamespace", - "UserProximityEvent", - "VALIDATE_STATUS", - "VALIDATION_ERR", - "VARIABLES_RULE", - "VENDOR", - "VERSION", - "VERSION_CHANGE", - "VERSION_ERR", - "VERTEX_ARRAY_BINDING", - "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING", - "VERTEX_ATTRIB_ARRAY_DIVISOR", - "VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE", - "VERTEX_ATTRIB_ARRAY_ENABLED", - "VERTEX_ATTRIB_ARRAY_INTEGER", - "VERTEX_ATTRIB_ARRAY_NORMALIZED", - "VERTEX_ATTRIB_ARRAY_POINTER", - "VERTEX_ATTRIB_ARRAY_SIZE", - "VERTEX_ATTRIB_ARRAY_STRIDE", - "VERTEX_ATTRIB_ARRAY_TYPE", - "VERTEX_SHADER", - "VERTICAL", - "VERTICAL_AXIS", - "VER_ERR", - "VIEWPORT", - "VIEWPORT_RULE", - "VRDisplay", - "VRDisplayCapabilities", - "VRDisplayEvent", - "VREyeParameters", - "VRFieldOfView", - "VRFrameData", - "VRPose", - "VRStageParameters", - "VTTCue", - "VTTRegion", - "ValidityState", - "VideoPlaybackQuality", - "VideoStreamTrack", - "VisualViewport", - "WAIT_FAILED", - "WEBKIT_FILTER_RULE", - "WEBKIT_KEYFRAMES_RULE", - "WEBKIT_KEYFRAME_RULE", - "WEBKIT_REGION_RULE", - "WRONG_DOCUMENT_ERR", - "WakeLock", - "WakeLockSentinel", - "WasmAnyRef", - "WaveShaperNode", - "WeakMap", - "WeakRef", - "WeakSet", - "WebAssembly", - "WebGL2RenderingContext", - "WebGLActiveInfo", - "WebGLBuffer", - "WebGLContextEvent", - "WebGLFramebuffer", - "WebGLProgram", - "WebGLQuery", - "WebGLRenderbuffer", - "WebGLRenderingContext", - "WebGLSampler", - "WebGLShader", - "WebGLShaderPrecisionFormat", - "WebGLSync", - "WebGLTexture", - "WebGLTransformFeedback", - "WebGLUniformLocation", - "WebGLVertexArray", - "WebGLVertexArrayObject", - "WebKitAnimationEvent", - "WebKitBlobBuilder", - "WebKitCSSFilterRule", - "WebKitCSSFilterValue", - "WebKitCSSKeyframeRule", - "WebKitCSSKeyframesRule", - "WebKitCSSMatrix", - "WebKitCSSRegionRule", - "WebKitCSSTransformValue", - "WebKitDataCue", - "WebKitGamepad", - "WebKitMediaKeyError", - "WebKitMediaKeyMessageEvent", - "WebKitMediaKeySession", - "WebKitMediaKeys", - "WebKitMediaSource", - "WebKitMutationObserver", - "WebKitNamespace", - "WebKitPlaybackTargetAvailabilityEvent", - "WebKitPoint", - "WebKitShadowRoot", - "WebKitSourceBuffer", - "WebKitSourceBufferList", - "WebKitTransitionEvent", - "WebSocket", - "WebkitAlignContent", - "WebkitAlignItems", - "WebkitAlignSelf", - "WebkitAnimation", - "WebkitAnimationDelay", - "WebkitAnimationDirection", - "WebkitAnimationDuration", - "WebkitAnimationFillMode", - "WebkitAnimationIterationCount", - "WebkitAnimationName", - "WebkitAnimationPlayState", - "WebkitAnimationTimingFunction", - "WebkitAppearance", - "WebkitBackfaceVisibility", - "WebkitBackgroundClip", - "WebkitBackgroundOrigin", - "WebkitBackgroundSize", - "WebkitBorderBottomLeftRadius", - "WebkitBorderBottomRightRadius", - "WebkitBorderImage", - "WebkitBorderRadius", - "WebkitBorderTopLeftRadius", - "WebkitBorderTopRightRadius", - "WebkitBoxAlign", - "WebkitBoxDirection", - "WebkitBoxFlex", - "WebkitBoxOrdinalGroup", - "WebkitBoxOrient", - "WebkitBoxPack", - "WebkitBoxShadow", - "WebkitBoxSizing", - "WebkitFilter", - "WebkitFlex", - "WebkitFlexBasis", - "WebkitFlexDirection", - "WebkitFlexFlow", - "WebkitFlexGrow", - "WebkitFlexShrink", - "WebkitFlexWrap", - "WebkitJustifyContent", - "WebkitLineClamp", - "WebkitMask", - "WebkitMaskClip", - "WebkitMaskComposite", - "WebkitMaskImage", - "WebkitMaskOrigin", - "WebkitMaskPosition", - "WebkitMaskPositionX", - "WebkitMaskPositionY", - "WebkitMaskRepeat", - "WebkitMaskSize", - "WebkitOrder", - "WebkitPerspective", - "WebkitPerspectiveOrigin", - "WebkitTextFillColor", - "WebkitTextSizeAdjust", - "WebkitTextStroke", - "WebkitTextStrokeColor", - "WebkitTextStrokeWidth", - "WebkitTransform", - "WebkitTransformOrigin", - "WebkitTransformStyle", - "WebkitTransition", - "WebkitTransitionDelay", - "WebkitTransitionDuration", - "WebkitTransitionProperty", - "WebkitTransitionTimingFunction", - "WebkitUserSelect", - "WheelEvent", - "Window", - "Worker", - "Worklet", - "WritableStream", - "WritableStreamDefaultWriter", - "XMLDocument", - "XMLHttpRequest", - "XMLHttpRequestEventTarget", - "XMLHttpRequestException", - "XMLHttpRequestProgressEvent", - "XMLHttpRequestUpload", - "XMLSerializer", - "XMLStylesheetProcessingInstruction", - "XPathEvaluator", - "XPathException", - "XPathExpression", - "XPathNSResolver", - "XPathResult", - "XRBoundedReferenceSpace", - "XRDOMOverlayState", - "XRFrame", - "XRHitTestResult", - "XRHitTestSource", - "XRInputSource", - "XRInputSourceArray", - "XRInputSourceEvent", - "XRInputSourcesChangeEvent", - "XRLayer", - "XRPose", - "XRRay", - "XRReferenceSpace", - "XRReferenceSpaceEvent", - "XRRenderState", - "XRRigidTransform", - "XRSession", - "XRSessionEvent", - "XRSpace", - "XRSystem", - "XRTransientInputHitTestResult", - "XRTransientInputHitTestSource", - "XRView", - "XRViewerPose", - "XRViewport", - "XRWebGLLayer", - "XSLTProcessor", - "ZERO", - "_XD0M_", - "_YD0M_", - "__defineGetter__", - "__defineSetter__", - "__lookupGetter__", - "__lookupSetter__", - "__opera", - "__proto__", - "_browserjsran", - "a", - "aLink", - "abbr", - "abort", - "aborted", - "abs", - "absolute", - "acceleration", - "accelerationIncludingGravity", - "accelerator", - "accept", - "acceptCharset", - "acceptNode", - "accessKey", - "accessKeyLabel", - "accuracy", - "acos", - "acosh", - "action", - "actionURL", - "actions", - "activated", - "active", - "activeCues", - "activeElement", - "activeSourceBuffers", - "activeSourceCount", - "activeTexture", - "activeVRDisplays", - "actualBoundingBoxAscent", - "actualBoundingBoxDescent", - "actualBoundingBoxLeft", - "actualBoundingBoxRight", - "add", - "addAll", - "addBehavior", - "addCandidate", - "addColorStop", - "addCue", - "addElement", - "addEventListener", - "addFilter", - "addFromString", - "addFromUri", - "addIceCandidate", - "addImport", - "addListener", - "addModule", - "addNamed", - "addPageRule", - "addPath", - "addPointer", - "addRange", - "addRegion", - "addRule", - "addSearchEngine", - "addSourceBuffer", - "addStream", - "addTextTrack", - "addTrack", - "addTransceiver", - "addWakeLockListener", - "added", - "addedNodes", - "additionalName", - "additiveSymbols", - "addons", - "address", - "addressLine", - "adoptNode", - "adoptedStyleSheets", - "adr", - "advance", - "after", - "album", - "alert", - "algorithm", - "align", - "align-content", - "align-items", - "align-self", - "alignContent", - "alignItems", - "alignSelf", - "alignmentBaseline", - "alinkColor", - "all", - "allSettled", - "allow", - "allowFullscreen", - "allowPaymentRequest", - "allowedDirections", - "allowedFeatures", - "allowedToPlay", - "allowsFeature", - "alpha", - "alt", - "altGraphKey", - "altHtml", - "altKey", - "altLeft", - "alternate", - "alternateSetting", - "alternates", - "altitude", - "altitudeAccuracy", - "amplitude", - "ancestorOrigins", - "anchor", - "anchorNode", - "anchorOffset", - "anchors", - "and", - "angle", - "angularAcceleration", - "angularVelocity", - "animVal", - "animate", - "animatedInstanceRoot", - "animatedNormalizedPathSegList", - "animatedPathSegList", - "animatedPoints", - "animation", - "animation-delay", - "animation-direction", - "animation-duration", - "animation-fill-mode", - "animation-iteration-count", - "animation-name", - "animation-play-state", - "animation-timing-function", - "animationDelay", - "animationDirection", - "animationDuration", - "animationFillMode", - "animationIterationCount", - "animationName", - "animationPlayState", - "animationStartTime", - "animationTimingFunction", - "animationsPaused", - "anniversary", - "antialias", - "anticipatedRemoval", - "any", - "app", - "appCodeName", - "appMinorVersion", - "appName", - "appNotifications", - "appVersion", - "appearance", - "append", - "appendBuffer", - "appendChild", - "appendData", - "appendItem", - "appendMedium", - "appendNamed", - "appendRule", - "appendStream", - "appendWindowEnd", - "appendWindowStart", - "applets", - "applicationCache", - "applicationServerKey", - "apply", - "applyConstraints", - "applyElement", - "arc", - "arcTo", - "archive", - "areas", - "arguments", - "ariaAtomic", - "ariaAutoComplete", - "ariaBusy", - "ariaChecked", - "ariaColCount", - "ariaColIndex", - "ariaColSpan", - "ariaCurrent", - "ariaDescription", - "ariaDisabled", - "ariaExpanded", - "ariaHasPopup", - "ariaHidden", - "ariaKeyShortcuts", - "ariaLabel", - "ariaLevel", - "ariaLive", - "ariaModal", - "ariaMultiLine", - "ariaMultiSelectable", - "ariaOrientation", - "ariaPlaceholder", - "ariaPosInSet", - "ariaPressed", - "ariaReadOnly", - "ariaRelevant", - "ariaRequired", - "ariaRoleDescription", - "ariaRowCount", - "ariaRowIndex", - "ariaRowSpan", - "ariaSelected", - "ariaSetSize", - "ariaSort", - "ariaValueMax", - "ariaValueMin", - "ariaValueNow", - "ariaValueText", - "arrayBuffer", - "artist", - "artwork", - "as", - "asIntN", - "asUintN", - "asin", - "asinh", - "assert", - "assign", - "assignedElements", - "assignedNodes", - "assignedSlot", - "async", - "asyncIterator", - "atEnd", - "atan", - "atan2", - "atanh", - "atob", - "attachEvent", - "attachInternals", - "attachShader", - "attachShadow", - "attachments", - "attack", - "attestationObject", - "attrChange", - "attrName", - "attributeFilter", - "attributeName", - "attributeNamespace", - "attributeOldValue", - "attributeStyleMap", - "attributes", - "attribution", - "audioBitsPerSecond", - "audioTracks", - "audioWorklet", - "authenticatedSignedWrites", - "authenticatorData", - "autoIncrement", - "autobuffer", - "autocapitalize", - "autocomplete", - "autocorrect", - "autofocus", - "automationRate", - "autoplay", - "availHeight", - "availLeft", - "availTop", - "availWidth", - "availability", - "available", - "aversion", - "ax", - "axes", - "axis", - "ay", - "azimuth", - "b", - "back", - "backface-visibility", - "backfaceVisibility", - "background", - "background-attachment", - "background-blend-mode", - "background-clip", - "background-color", - "background-image", - "background-origin", - "background-position", - "background-position-x", - "background-position-y", - "background-repeat", - "background-size", - "backgroundAttachment", - "backgroundBlendMode", - "backgroundClip", - "backgroundColor", - "backgroundFetch", - "backgroundImage", - "backgroundOrigin", - "backgroundPosition", - "backgroundPositionX", - "backgroundPositionY", - "backgroundRepeat", - "backgroundSize", - "badInput", - "badge", - "balance", - "baseFrequencyX", - "baseFrequencyY", - "baseLatency", - "baseLayer", - "baseNode", - "baseOffset", - "baseURI", - "baseVal", - "baselineShift", - "battery", - "bday", - "before", - "beginElement", - "beginElementAt", - "beginPath", - "beginQuery", - "beginTransformFeedback", - "behavior", - "behaviorCookie", - "behaviorPart", - "behaviorUrns", - "beta", - "bezierCurveTo", - "bgColor", - "bgProperties", - "bias", - "big", - "bigint64", - "biguint64", - "binaryType", - "bind", - "bindAttribLocation", - "bindBuffer", - "bindBufferBase", - "bindBufferRange", - "bindFramebuffer", - "bindRenderbuffer", - "bindSampler", - "bindTexture", - "bindTransformFeedback", - "bindVertexArray", - "blendColor", - "blendEquation", - "blendEquationSeparate", - "blendFunc", - "blendFuncSeparate", - "blink", - "blitFramebuffer", - "blob", - "block-size", - "blockDirection", - "blockSize", - "blockedURI", - "blue", - "bluetooth", - "blur", - "body", - "bodyUsed", - "bold", - "bookmarks", - "booleanValue", - "border", - "border-block", - "border-block-color", - "border-block-end", - "border-block-end-color", - "border-block-end-style", - "border-block-end-width", - "border-block-start", - "border-block-start-color", - "border-block-start-style", - "border-block-start-width", - "border-block-style", - "border-block-width", - "border-bottom", - "border-bottom-color", - "border-bottom-left-radius", - "border-bottom-right-radius", - "border-bottom-style", - "border-bottom-width", - "border-collapse", - "border-color", - "border-end-end-radius", - "border-end-start-radius", - "border-image", - "border-image-outset", - "border-image-repeat", - "border-image-slice", - "border-image-source", - "border-image-width", - "border-inline", - "border-inline-color", - "border-inline-end", - "border-inline-end-color", - "border-inline-end-style", - "border-inline-end-width", - "border-inline-start", - "border-inline-start-color", - "border-inline-start-style", - "border-inline-start-width", - "border-inline-style", - "border-inline-width", - "border-left", - "border-left-color", - "border-left-style", - "border-left-width", - "border-radius", - "border-right", - "border-right-color", - "border-right-style", - "border-right-width", - "border-spacing", - "border-start-end-radius", - "border-start-start-radius", - "border-style", - "border-top", - "border-top-color", - "border-top-left-radius", - "border-top-right-radius", - "border-top-style", - "border-top-width", - "border-width", - "borderBlock", - "borderBlockColor", - "borderBlockEnd", - "borderBlockEndColor", - "borderBlockEndStyle", - "borderBlockEndWidth", - "borderBlockStart", - "borderBlockStartColor", - "borderBlockStartStyle", - "borderBlockStartWidth", - "borderBlockStyle", - "borderBlockWidth", - "borderBottom", - "borderBottomColor", - "borderBottomLeftRadius", - "borderBottomRightRadius", - "borderBottomStyle", - "borderBottomWidth", - "borderBoxSize", - "borderCollapse", - "borderColor", - "borderColorDark", - "borderColorLight", - "borderEndEndRadius", - "borderEndStartRadius", - "borderImage", - "borderImageOutset", - "borderImageRepeat", - "borderImageSlice", - "borderImageSource", - "borderImageWidth", - "borderInline", - "borderInlineColor", - "borderInlineEnd", - "borderInlineEndColor", - "borderInlineEndStyle", - "borderInlineEndWidth", - "borderInlineStart", - "borderInlineStartColor", - "borderInlineStartStyle", - "borderInlineStartWidth", - "borderInlineStyle", - "borderInlineWidth", - "borderLeft", - "borderLeftColor", - "borderLeftStyle", - "borderLeftWidth", - "borderRadius", - "borderRight", - "borderRightColor", - "borderRightStyle", - "borderRightWidth", - "borderSpacing", - "borderStartEndRadius", - "borderStartStartRadius", - "borderStyle", - "borderTop", - "borderTopColor", - "borderTopLeftRadius", - "borderTopRightRadius", - "borderTopStyle", - "borderTopWidth", - "borderWidth", - "bottom", - "bottomMargin", - "bound", - "boundElements", - "boundingClientRect", - "boundingHeight", - "boundingLeft", - "boundingTop", - "boundingWidth", - "bounds", - "boundsGeometry", - "box-decoration-break", - "box-shadow", - "box-sizing", - "boxDecorationBreak", - "boxShadow", - "boxSizing", - "break-after", - "break-before", - "break-inside", - "breakAfter", - "breakBefore", - "breakInside", - "broadcast", - "browserLanguage", - "btoa", - "bubbles", - "buffer", - "bufferData", - "bufferDepth", - "bufferSize", - "bufferSubData", - "buffered", - "bufferedAmount", - "bufferedAmountLowThreshold", - "buildID", - "buildNumber", - "button", - "buttonID", - "buttons", - "byteLength", - "byteOffset", - "bytesWritten", - "c", - "cache", - "caches", - "call", - "caller", - "canBeFormatted", - "canBeMounted", - "canBeShared", - "canHaveChildren", - "canHaveHTML", - "canInsertDTMF", - "canMakePayment", - "canPlayType", - "canPresent", - "canTrickleIceCandidates", - "cancel", - "cancelAndHoldAtTime", - "cancelAnimationFrame", - "cancelBubble", - "cancelIdleCallback", - "cancelScheduledValues", - "cancelVideoFrameCallback", - "cancelWatchAvailability", - "cancelable", - "candidate", - "canonicalUUID", - "canvas", - "capabilities", - "caption", - "caption-side", - "captionSide", - "capture", - "captureEvents", - "captureStackTrace", - "captureStream", - "caret-color", - "caretBidiLevel", - "caretColor", - "caretPositionFromPoint", - "caretRangeFromPoint", - "cast", - "catch", - "category", - "cbrt", - "cd", - "ceil", - "cellIndex", - "cellPadding", - "cellSpacing", - "cells", - "ch", - "chOff", - "chain", - "challenge", - "changeType", - "changedTouches", - "channel", - "channelCount", - "channelCountMode", - "channelInterpretation", - "char", - "charAt", - "charCode", - "charCodeAt", - "charIndex", - "charLength", - "characterData", - "characterDataOldValue", - "characterSet", - "characteristic", - "charging", - "chargingTime", - "charset", - "check", - "checkEnclosure", - "checkFramebufferStatus", - "checkIntersection", - "checkValidity", - "checked", - "childElementCount", - "childList", - "childNodes", - "children", - "chrome", - "ciphertext", - "cite", - "city", - "claimInterface", - "claimed", - "classList", - "className", - "classid", - "clear", - "clearAppBadge", - "clearAttributes", - "clearBufferfi", - "clearBufferfv", - "clearBufferiv", - "clearBufferuiv", - "clearColor", - "clearData", - "clearDepth", - "clearHalt", - "clearImmediate", - "clearInterval", - "clearLiveSeekableRange", - "clearMarks", - "clearMaxGCPauseAccumulator", - "clearMeasures", - "clearParameters", - "clearRect", - "clearResourceTimings", - "clearShadow", - "clearStencil", - "clearTimeout", - "clearWatch", - "click", - "clickCount", - "clientDataJSON", - "clientHeight", - "clientInformation", - "clientLeft", - "clientRect", - "clientRects", - "clientTop", - "clientWaitSync", - "clientWidth", - "clientX", - "clientY", - "clip", - "clip-path", - "clip-rule", - "clipBottom", - "clipLeft", - "clipPath", - "clipPathUnits", - "clipRight", - "clipRule", - "clipTop", - "clipboard", - "clipboardData", - "clone", - "cloneContents", - "cloneNode", - "cloneRange", - "close", - "closePath", - "closed", - "closest", - "clz", - "clz32", - "cm", - "cmp", - "code", - "codeBase", - "codePointAt", - "codeType", - "colSpan", - "collapse", - "collapseToEnd", - "collapseToStart", - "collapsed", - "collect", - "colno", - "color", - "color-adjust", - "color-interpolation", - "color-interpolation-filters", - "colorAdjust", - "colorDepth", - "colorInterpolation", - "colorInterpolationFilters", - "colorMask", - "colorType", - "cols", - "column-count", - "column-fill", - "column-gap", - "column-rule", - "column-rule-color", - "column-rule-style", - "column-rule-width", - "column-span", - "column-width", - "columnCount", - "columnFill", - "columnGap", - "columnNumber", - "columnRule", - "columnRuleColor", - "columnRuleStyle", - "columnRuleWidth", - "columnSpan", - "columnWidth", - "columns", - "command", - "commit", - "commitPreferences", - "commitStyles", - "commonAncestorContainer", - "compact", - "compareBoundaryPoints", - "compareDocumentPosition", - "compareEndPoints", - "compareExchange", - "compareNode", - "comparePoint", - "compatMode", - "compatible", - "compile", - "compileShader", - "compileStreaming", - "complete", - "component", - "componentFromPoint", - "composed", - "composedPath", - "composite", - "compositionEndOffset", - "compositionStartOffset", - "compressedTexImage2D", - "compressedTexImage3D", - "compressedTexSubImage2D", - "compressedTexSubImage3D", - "computedStyleMap", - "concat", - "conditionText", - "coneInnerAngle", - "coneOuterAngle", - "coneOuterGain", - "configuration", - "configurationName", - "configurationValue", - "configurations", - "confirm", - "confirmComposition", - "confirmSiteSpecificTrackingException", - "confirmWebWideTrackingException", - "connect", - "connectEnd", - "connectShark", - "connectStart", - "connected", - "connection", - "connectionList", - "connectionSpeed", - "connectionState", - "connections", - "console", - "consolidate", - "constraint", - "constrictionActive", - "construct", - "constructor", - "contactID", - "contain", - "containerId", - "containerName", - "containerSrc", - "containerType", - "contains", - "containsNode", - "content", - "contentBoxSize", - "contentDocument", - "contentEditable", - "contentHint", - "contentOverflow", - "contentRect", - "contentScriptType", - "contentStyleType", - "contentType", - "contentWindow", - "context", - "contextMenu", - "contextmenu", - "continue", - "continuePrimaryKey", - "continuous", - "control", - "controlTransferIn", - "controlTransferOut", - "controller", - "controls", - "controlsList", - "convertPointFromNode", - "convertQuadFromNode", - "convertRectFromNode", - "convertToBlob", - "convertToSpecifiedUnits", - "cookie", - "cookieEnabled", - "coords", - "copyBufferSubData", - "copyFromChannel", - "copyTexImage2D", - "copyTexSubImage2D", - "copyTexSubImage3D", - "copyToChannel", - "copyWithin", - "correspondingElement", - "correspondingUseElement", - "corruptedVideoFrames", - "cos", - "cosh", - "count", - "countReset", - "counter-increment", - "counter-reset", - "counter-set", - "counterIncrement", - "counterReset", - "counterSet", - "country", - "cpuClass", - "cpuSleepAllowed", - "create", - "createAnalyser", - "createAnswer", - "createAttribute", - "createAttributeNS", - "createBiquadFilter", - "createBuffer", - "createBufferSource", - "createCDATASection", - "createCSSStyleSheet", - "createCaption", - "createChannelMerger", - "createChannelSplitter", - "createComment", - "createConstantSource", - "createContextualFragment", - "createControlRange", - "createConvolver", - "createDTMFSender", - "createDataChannel", - "createDelay", - "createDelayNode", - "createDocument", - "createDocumentFragment", - "createDocumentType", - "createDynamicsCompressor", - "createElement", - "createElementNS", - "createEntityReference", - "createEvent", - "createEventObject", - "createExpression", - "createFramebuffer", - "createFunction", - "createGain", - "createGainNode", - "createHTML", - "createHTMLDocument", - "createIIRFilter", - "createImageBitmap", - "createImageData", - "createIndex", - "createJavaScriptNode", - "createLinearGradient", - "createMediaElementSource", - "createMediaKeys", - "createMediaStreamDestination", - "createMediaStreamSource", - "createMediaStreamTrackSource", - "createMutableFile", - "createNSResolver", - "createNodeIterator", - "createNotification", - "createObjectStore", - "createObjectURL", - "createOffer", - "createOscillator", - "createPanner", - "createPattern", - "createPeriodicWave", - "createPolicy", - "createPopup", - "createProcessingInstruction", - "createProgram", - "createQuery", - "createRadialGradient", - "createRange", - "createRangeCollection", - "createReader", - "createRenderbuffer", - "createSVGAngle", - "createSVGLength", - "createSVGMatrix", - "createSVGNumber", - "createSVGPathSegArcAbs", - "createSVGPathSegArcRel", - "createSVGPathSegClosePath", - "createSVGPathSegCurvetoCubicAbs", - "createSVGPathSegCurvetoCubicRel", - "createSVGPathSegCurvetoCubicSmoothAbs", - "createSVGPathSegCurvetoCubicSmoothRel", - "createSVGPathSegCurvetoQuadraticAbs", - "createSVGPathSegCurvetoQuadraticRel", - "createSVGPathSegCurvetoQuadraticSmoothAbs", - "createSVGPathSegCurvetoQuadraticSmoothRel", - "createSVGPathSegLinetoAbs", - "createSVGPathSegLinetoHorizontalAbs", - "createSVGPathSegLinetoHorizontalRel", - "createSVGPathSegLinetoRel", - "createSVGPathSegLinetoVerticalAbs", - "createSVGPathSegLinetoVerticalRel", - "createSVGPathSegMovetoAbs", - "createSVGPathSegMovetoRel", - "createSVGPoint", - "createSVGRect", - "createSVGTransform", - "createSVGTransformFromMatrix", - "createSampler", - "createScript", - "createScriptProcessor", - "createScriptURL", - "createSession", - "createShader", - "createShadowRoot", - "createStereoPanner", - "createStyleSheet", - "createTBody", - "createTFoot", - "createTHead", - "createTextNode", - "createTextRange", - "createTexture", - "createTouch", - "createTouchList", - "createTransformFeedback", - "createTreeWalker", - "createVertexArray", - "createWaveShaper", - "creationTime", - "credentials", - "crossOrigin", - "crossOriginIsolated", - "crypto", - "csi", - "csp", - "cssFloat", - "cssRules", - "cssText", - "cssValueType", - "ctrlKey", - "ctrlLeft", - "cues", - "cullFace", - "currentDirection", - "currentLocalDescription", - "currentNode", - "currentPage", - "currentRect", - "currentRemoteDescription", - "currentScale", - "currentScript", - "currentSrc", - "currentState", - "currentStyle", - "currentTarget", - "currentTime", - "currentTranslate", - "currentView", - "cursor", - "curve", - "customElements", - "customError", - "cx", - "cy", - "d", - "data", - "dataFld", - "dataFormatAs", - "dataLoss", - "dataLossMessage", - "dataPageSize", - "dataSrc", - "dataTransfer", - "database", - "databases", - "dataset", - "dateTime", - "db", - "debug", - "debuggerEnabled", - "declare", - "decode", - "decodeAudioData", - "decodeURI", - "decodeURIComponent", - "decodedBodySize", - "decoding", - "decodingInfo", - "decrypt", - "default", - "defaultCharset", - "defaultChecked", - "defaultMuted", - "defaultPlaybackRate", - "defaultPolicy", - "defaultPrevented", - "defaultRequest", - "defaultSelected", - "defaultStatus", - "defaultURL", - "defaultValue", - "defaultView", - "defaultstatus", - "defer", - "define", - "defineMagicFunction", - "defineMagicVariable", - "defineProperties", - "defineProperty", - "deg", - "delay", - "delayTime", - "delegatesFocus", - "delete", - "deleteBuffer", - "deleteCaption", - "deleteCell", - "deleteContents", - "deleteData", - "deleteDatabase", - "deleteFramebuffer", - "deleteFromDocument", - "deleteIndex", - "deleteMedium", - "deleteObjectStore", - "deleteProgram", - "deleteProperty", - "deleteQuery", - "deleteRenderbuffer", - "deleteRow", - "deleteRule", - "deleteSampler", - "deleteShader", - "deleteSync", - "deleteTFoot", - "deleteTHead", - "deleteTexture", - "deleteTransformFeedback", - "deleteVertexArray", - "deliverChangeRecords", - "delivery", - "deliveryInfo", - "deliveryStatus", - "deliveryTimestamp", - "delta", - "deltaMode", - "deltaX", - "deltaY", - "deltaZ", - "dependentLocality", - "depthFar", - "depthFunc", - "depthMask", - "depthNear", - "depthRange", - "deref", - "deriveBits", - "deriveKey", - "description", - "deselectAll", - "designMode", - "desiredSize", - "destination", - "destinationURL", - "detach", - "detachEvent", - "detachShader", - "detail", - "details", - "detect", - "detune", - "device", - "deviceClass", - "deviceId", - "deviceMemory", - "devicePixelContentBoxSize", - "devicePixelRatio", - "deviceProtocol", - "deviceSubclass", - "deviceVersionMajor", - "deviceVersionMinor", - "deviceVersionSubminor", - "deviceXDPI", - "deviceYDPI", - "didTimeout", - "diffuseConstant", - "digest", - "dimensions", - "dir", - "dirName", - "direction", - "dirxml", - "disable", - "disablePictureInPicture", - "disableRemotePlayback", - "disableVertexAttribArray", - "disabled", - "dischargingTime", - "disconnect", - "disconnectShark", - "dispatchEvent", - "display", - "displayId", - "displayName", - "disposition", - "distanceModel", - "div", - "divisor", - "djsapi", - "djsproxy", - "doImport", - "doNotTrack", - "doScroll", - "doctype", - "document", - "documentElement", - "documentMode", - "documentURI", - "dolphin", - "dolphinGameCenter", - "dolphininfo", - "dolphinmeta", - "domComplete", - "domContentLoadedEventEnd", - "domContentLoadedEventStart", - "domInteractive", - "domLoading", - "domOverlayState", - "domain", - "domainLookupEnd", - "domainLookupStart", - "dominant-baseline", - "dominantBaseline", - "done", - "dopplerFactor", - "dotAll", - "downDegrees", - "downlink", - "download", - "downloadTotal", - "downloaded", - "dpcm", - "dpi", - "dppx", - "dragDrop", - "draggable", - "drawArrays", - "drawArraysInstanced", - "drawArraysInstancedANGLE", - "drawBuffers", - "drawCustomFocusRing", - "drawElements", - "drawElementsInstanced", - "drawElementsInstancedANGLE", - "drawFocusIfNeeded", - "drawImage", - "drawImageFromRect", - "drawRangeElements", - "drawSystemFocusRing", - "drawingBufferHeight", - "drawingBufferWidth", - "dropEffect", - "droppedVideoFrames", - "dropzone", - "dtmf", - "dump", - "dumpProfile", - "duplicate", - "durability", - "duration", - "dvname", - "dvnum", - "dx", - "dy", - "dynsrc", - "e", - "edgeMode", - "effect", - "effectAllowed", - "effectiveDirective", - "effectiveType", - "elapsedTime", - "element", - "elementFromPoint", - "elementTiming", - "elements", - "elementsFromPoint", - "elevation", - "ellipse", - "em", - "email", - "embeds", - "emma", - "empty", - "empty-cells", - "emptyCells", - "emptyHTML", - "emptyScript", - "emulatedPosition", - "enable", - "enableBackground", - "enableDelegations", - "enableStyleSheetsForSet", - "enableVertexAttribArray", - "enabled", - "enabledPlugin", - "encode", - "encodeInto", - "encodeURI", - "encodeURIComponent", - "encodedBodySize", - "encoding", - "encodingInfo", - "encrypt", - "enctype", - "end", - "endContainer", - "endElement", - "endElementAt", - "endOfStream", - "endOffset", - "endQuery", - "endTime", - "endTransformFeedback", - "ended", - "endpoint", - "endpointNumber", - "endpoints", - "endsWith", - "enterKeyHint", - "entities", - "entries", - "entryType", - "enumerate", - "enumerateDevices", - "enumerateEditable", - "environmentBlendMode", - "equals", - "error", - "errorCode", - "errorDetail", - "errorText", - "escape", - "estimate", - "eval", - "evaluate", - "event", - "eventPhase", - "every", - "ex", - "exception", - "exchange", - "exec", - "execCommand", - "execCommandShowHelp", - "execScript", - "exitFullscreen", - "exitPictureInPicture", - "exitPointerLock", - "exitPresent", - "exp", - "expand", - "expandEntityReferences", - "expando", - "expansion", - "expiration", - "expirationTime", - "expires", - "expiryDate", - "explicitOriginalTarget", - "expm1", - "exponent", - "exponentialRampToValueAtTime", - "exportKey", - "extend", - "extensions", - "extentNode", - "extentOffset", - "external", - "externalResourcesRequired", - "extractContents", - "extractable", - "eye", - "f", - "face", - "factoryReset", - "failureReason", - "fallback", - "family", - "familyName", - "farthestViewportElement", - "fastSeek", - "fatal", - "featureId", - "featurePolicy", - "featureSettings", - "features", - "fenceSync", - "fetch", - "fetchStart", - "fftSize", - "fgColor", - "fieldOfView", - "file", - "fileCreatedDate", - "fileHandle", - "fileModifiedDate", - "fileName", - "fileSize", - "fileUpdatedDate", - "filename", - "files", - "filesystem", - "fill", - "fill-opacity", - "fill-rule", - "fillLightMode", - "fillOpacity", - "fillRect", - "fillRule", - "fillStyle", - "fillText", - "filter", - "filterResX", - "filterResY", - "filterUnits", - "filters", - "finally", - "find", - "findIndex", - "findRule", - "findText", - "finish", - "finished", - "fireEvent", - "firesTouchEvents", - "firstChild", - "firstElementChild", - "firstPage", - "fixed", - "flags", - "flat", - "flatMap", - "flex", - "flex-basis", - "flex-direction", - "flex-flow", - "flex-grow", - "flex-shrink", - "flex-wrap", - "flexBasis", - "flexDirection", - "flexFlow", - "flexGrow", - "flexShrink", - "flexWrap", - "flipX", - "flipY", - "float", - "float32", - "float64", - "flood-color", - "flood-opacity", - "floodColor", - "floodOpacity", - "floor", - "flush", - "focus", - "focusNode", - "focusOffset", - "font", - "font-family", - "font-feature-settings", - "font-kerning", - "font-language-override", - "font-optical-sizing", - "font-size", - "font-size-adjust", - "font-stretch", - "font-style", - "font-synthesis", - "font-variant", - "font-variant-alternates", - "font-variant-caps", - "font-variant-east-asian", - "font-variant-ligatures", - "font-variant-numeric", - "font-variant-position", - "font-variation-settings", - "font-weight", - "fontFamily", - "fontFeatureSettings", - "fontKerning", - "fontLanguageOverride", - "fontOpticalSizing", - "fontSize", - "fontSizeAdjust", - "fontSmoothingEnabled", - "fontStretch", - "fontStyle", - "fontSynthesis", - "fontVariant", - "fontVariantAlternates", - "fontVariantCaps", - "fontVariantEastAsian", - "fontVariantLigatures", - "fontVariantNumeric", - "fontVariantPosition", - "fontVariationSettings", - "fontWeight", - "fontcolor", - "fontfaces", - "fonts", - "fontsize", - "for", - "forEach", - "force", - "forceRedraw", - "form", - "formAction", - "formData", - "formEnctype", - "formMethod", - "formNoValidate", - "formTarget", - "format", - "formatToParts", - "forms", - "forward", - "forwardX", - "forwardY", - "forwardZ", - "foundation", - "fr", - "fragmentDirective", - "frame", - "frameBorder", - "frameElement", - "frameSpacing", - "framebuffer", - "framebufferHeight", - "framebufferRenderbuffer", - "framebufferTexture2D", - "framebufferTextureLayer", - "framebufferWidth", - "frames", - "freeSpace", - "freeze", - "frequency", - "frequencyBinCount", - "from", - "fromCharCode", - "fromCodePoint", - "fromElement", - "fromEntries", - "fromFloat32Array", - "fromFloat64Array", - "fromMatrix", - "fromPoint", - "fromQuad", - "fromRect", - "frontFace", - "fround", - "fullPath", - "fullScreen", - "fullscreen", - "fullscreenElement", - "fullscreenEnabled", - "fx", - "fy", - "gain", - "gamepad", - "gamma", - "gap", - "gatheringState", - "gatt", - "genderIdentity", - "generateCertificate", - "generateKey", - "generateMipmap", - "generateRequest", - "geolocation", - "gestureObject", - "get", - "getActiveAttrib", - "getActiveUniform", - "getActiveUniformBlockName", - "getActiveUniformBlockParameter", - "getActiveUniforms", - "getAdjacentText", - "getAll", - "getAllKeys", - "getAllResponseHeaders", - "getAllowlistForFeature", - "getAnimations", - "getAsFile", - "getAsString", - "getAttachedShaders", - "getAttribLocation", - "getAttribute", - "getAttributeNS", - "getAttributeNames", - "getAttributeNode", - "getAttributeNodeNS", - "getAttributeType", - "getAudioTracks", - "getAvailability", - "getBBox", - "getBattery", - "getBigInt64", - "getBigUint64", - "getBlob", - "getBookmark", - "getBoundingClientRect", - "getBounds", - "getBoxQuads", - "getBufferParameter", - "getBufferSubData", - "getByteFrequencyData", - "getByteTimeDomainData", - "getCSSCanvasContext", - "getCTM", - "getCandidateWindowClientRect", - "getCanonicalLocales", - "getCapabilities", - "getChannelData", - "getCharNumAtPosition", - "getCharacteristic", - "getCharacteristics", - "getClientExtensionResults", - "getClientRect", - "getClientRects", - "getCoalescedEvents", - "getCompositionAlternatives", - "getComputedStyle", - "getComputedTextLength", - "getComputedTiming", - "getConfiguration", - "getConstraints", - "getContext", - "getContextAttributes", - "getContributingSources", - "getCounterValue", - "getCueAsHTML", - "getCueById", - "getCurrentPosition", - "getCurrentTime", - "getData", - "getDatabaseNames", - "getDate", - "getDay", - "getDefaultComputedStyle", - "getDescriptor", - "getDescriptors", - "getDestinationInsertionPoints", - "getDevices", - "getDirectory", - "getDisplayMedia", - "getDistributedNodes", - "getEditable", - "getElementById", - "getElementsByClassName", - "getElementsByName", - "getElementsByTagName", - "getElementsByTagNameNS", - "getEnclosureList", - "getEndPositionOfChar", - "getEntries", - "getEntriesByName", - "getEntriesByType", - "getError", - "getExtension", - "getExtentOfChar", - "getEyeParameters", - "getFeature", - "getFile", - "getFiles", - "getFilesAndDirectories", - "getFingerprints", - "getFloat32", - "getFloat64", - "getFloatFrequencyData", - "getFloatTimeDomainData", - "getFloatValue", - "getFragDataLocation", - "getFrameData", - "getFramebufferAttachmentParameter", - "getFrequencyResponse", - "getFullYear", - "getGamepads", - "getHitTestResults", - "getHitTestResultsForTransientInput", - "getHours", - "getIdentityAssertion", - "getIds", - "getImageData", - "getIndexedParameter", - "getInstalledRelatedApps", - "getInt16", - "getInt32", - "getInt8", - "getInternalformatParameter", - "getIntersectionList", - "getItem", - "getItems", - "getKey", - "getKeyframes", - "getLayers", - "getLayoutMap", - "getLineDash", - "getLocalCandidates", - "getLocalParameters", - "getLocalStreams", - "getMarks", - "getMatchedCSSRules", - "getMaxGCPauseSinceClear", - "getMeasures", - "getMetadata", - "getMilliseconds", - "getMinutes", - "getModifierState", - "getMonth", - "getNamedItem", - "getNamedItemNS", - "getNativeFramebufferScaleFactor", - "getNotifications", - "getNotifier", - "getNumberOfChars", - "getOffsetReferenceSpace", - "getOutputTimestamp", - "getOverrideHistoryNavigationMode", - "getOverrideStyle", - "getOwnPropertyDescriptor", - "getOwnPropertyDescriptors", - "getOwnPropertyNames", - "getOwnPropertySymbols", - "getParameter", - "getParameters", - "getParent", - "getPathSegAtLength", - "getPhotoCapabilities", - "getPhotoSettings", - "getPointAtLength", - "getPose", - "getPredictedEvents", - "getPreference", - "getPreferenceDefault", - "getPresentationAttribute", - "getPreventDefault", - "getPrimaryService", - "getPrimaryServices", - "getProgramInfoLog", - "getProgramParameter", - "getPropertyCSSValue", - "getPropertyPriority", - "getPropertyShorthand", - "getPropertyType", - "getPropertyValue", - "getPrototypeOf", - "getQuery", - "getQueryParameter", - "getRGBColorValue", - "getRandomValues", - "getRangeAt", - "getReader", - "getReceivers", - "getRectValue", - "getRegistration", - "getRegistrations", - "getRemoteCandidates", - "getRemoteCertificates", - "getRemoteParameters", - "getRemoteStreams", - "getRenderbufferParameter", - "getResponseHeader", - "getRoot", - "getRootNode", - "getRotationOfChar", - "getSVGDocument", - "getSamplerParameter", - "getScreenCTM", - "getSeconds", - "getSelectedCandidatePair", - "getSelection", - "getSenders", - "getService", - "getSettings", - "getShaderInfoLog", - "getShaderParameter", - "getShaderPrecisionFormat", - "getShaderSource", - "getSimpleDuration", - "getSiteIcons", - "getSources", - "getSpeculativeParserUrls", - "getStartPositionOfChar", - "getStartTime", - "getState", - "getStats", - "getStatusForPolicy", - "getStorageUpdates", - "getStreamById", - "getStringValue", - "getSubStringLength", - "getSubscription", - "getSupportedConstraints", - "getSupportedExtensions", - "getSupportedFormats", - "getSyncParameter", - "getSynchronizationSources", - "getTags", - "getTargetRanges", - "getTexParameter", - "getTime", - "getTimezoneOffset", - "getTiming", - "getTotalLength", - "getTrackById", - "getTracks", - "getTransceivers", - "getTransform", - "getTransformFeedbackVarying", - "getTransformToElement", - "getTransports", - "getType", - "getTypeMapping", - "getUTCDate", - "getUTCDay", - "getUTCFullYear", - "getUTCHours", - "getUTCMilliseconds", - "getUTCMinutes", - "getUTCMonth", - "getUTCSeconds", - "getUint16", - "getUint32", - "getUint8", - "getUniform", - "getUniformBlockIndex", - "getUniformIndices", - "getUniformLocation", - "getUserMedia", - "getVRDisplays", - "getValues", - "getVarDate", - "getVariableValue", - "getVertexAttrib", - "getVertexAttribOffset", - "getVideoPlaybackQuality", - "getVideoTracks", - "getViewerPose", - "getViewport", - "getVoices", - "getWakeLockState", - "getWriter", - "getYear", - "givenName", - "global", - "globalAlpha", - "globalCompositeOperation", - "globalThis", - "glyphOrientationHorizontal", - "glyphOrientationVertical", - "glyphRef", - "go", - "grabFrame", - "grad", - "gradientTransform", - "gradientUnits", - "grammars", - "green", - "grid", - "grid-area", - "grid-auto-columns", - "grid-auto-flow", - "grid-auto-rows", - "grid-column", - "grid-column-end", - "grid-column-gap", - "grid-column-start", - "grid-gap", - "grid-row", - "grid-row-end", - "grid-row-gap", - "grid-row-start", - "grid-template", - "grid-template-areas", - "grid-template-columns", - "grid-template-rows", - "gridArea", - "gridAutoColumns", - "gridAutoFlow", - "gridAutoRows", - "gridColumn", - "gridColumnEnd", - "gridColumnGap", - "gridColumnStart", - "gridGap", - "gridRow", - "gridRowEnd", - "gridRowGap", - "gridRowStart", - "gridTemplate", - "gridTemplateAreas", - "gridTemplateColumns", - "gridTemplateRows", - "gripSpace", - "group", - "groupCollapsed", - "groupEnd", - "groupId", - "hadRecentInput", - "hand", - "handedness", - "hapticActuators", - "hardwareConcurrency", - "has", - "hasAttribute", - "hasAttributeNS", - "hasAttributes", - "hasBeenActive", - "hasChildNodes", - "hasComposition", - "hasEnrolledInstrument", - "hasExtension", - "hasExternalDisplay", - "hasFeature", - "hasFocus", - "hasInstance", - "hasLayout", - "hasOrientation", - "hasOwnProperty", - "hasPointerCapture", - "hasPosition", - "hasReading", - "hasStorageAccess", - "hash", - "head", - "headers", - "heading", - "height", - "hidden", - "hide", - "hideFocus", - "high", - "highWaterMark", - "hint", - "history", - "honorificPrefix", - "honorificSuffix", - "horizontalOverflow", - "host", - "hostCandidate", - "hostname", - "href", - "hrefTranslate", - "hreflang", - "hspace", - "html5TagCheckInerface", - "htmlFor", - "htmlText", - "httpEquiv", - "httpRequestStatusCode", - "hwTimestamp", - "hyphens", - "hypot", - "iccId", - "iceConnectionState", - "iceGatheringState", - "iceTransport", - "icon", - "iconURL", - "id", - "identifier", - "identity", - "idpLoginUrl", - "ignoreBOM", - "ignoreCase", - "ignoreDepthValues", - "image-orientation", - "image-rendering", - "imageHeight", - "imageOrientation", - "imageRendering", - "imageSizes", - "imageSmoothingEnabled", - "imageSmoothingQuality", - "imageSrcset", - "imageWidth", - "images", - "ime-mode", - "imeMode", - "implementation", - "importKey", - "importNode", - "importStylesheet", - "imports", - "impp", - "imul", - "in", - "in1", - "in2", - "inBandMetadataTrackDispatchType", - "inRange", - "includes", - "incremental", - "indeterminate", - "index", - "indexNames", - "indexOf", - "indexedDB", - "indicate", - "inertiaDestinationX", - "inertiaDestinationY", - "info", - "init", - "initAnimationEvent", - "initBeforeLoadEvent", - "initClipboardEvent", - "initCloseEvent", - "initCommandEvent", - "initCompositionEvent", - "initCustomEvent", - "initData", - "initDataType", - "initDeviceMotionEvent", - "initDeviceOrientationEvent", - "initDragEvent", - "initErrorEvent", - "initEvent", - "initFocusEvent", - "initGestureEvent", - "initHashChangeEvent", - "initKeyEvent", - "initKeyboardEvent", - "initMSManipulationEvent", - "initMessageEvent", - "initMouseEvent", - "initMouseScrollEvent", - "initMouseWheelEvent", - "initMutationEvent", - "initNSMouseEvent", - "initOverflowEvent", - "initPageEvent", - "initPageTransitionEvent", - "initPointerEvent", - "initPopStateEvent", - "initProgressEvent", - "initScrollAreaEvent", - "initSimpleGestureEvent", - "initStorageEvent", - "initTextEvent", - "initTimeEvent", - "initTouchEvent", - "initTransitionEvent", - "initUIEvent", - "initWebKitAnimationEvent", - "initWebKitTransitionEvent", - "initWebKitWheelEvent", - "initWheelEvent", - "initialTime", - "initialize", - "initiatorType", - "inline-size", - "inlineSize", - "inlineVerticalFieldOfView", - "inner", - "innerHTML", - "innerHeight", - "innerText", - "innerWidth", - "input", - "inputBuffer", - "inputEncoding", - "inputMethod", - "inputMode", - "inputSource", - "inputSources", - "inputType", - "inputs", - "insertAdjacentElement", - "insertAdjacentHTML", - "insertAdjacentText", - "insertBefore", - "insertCell", - "insertDTMF", - "insertData", - "insertItemBefore", - "insertNode", - "insertRow", - "insertRule", - "inset", - "inset-block", - "inset-block-end", - "inset-block-start", - "inset-inline", - "inset-inline-end", - "inset-inline-start", - "insetBlock", - "insetBlockEnd", - "insetBlockStart", - "insetInline", - "insetInlineEnd", - "insetInlineStart", - "installing", - "instanceRoot", - "instantiate", - "instantiateStreaming", - "instruments", - "int16", - "int32", - "int8", - "integrity", - "interactionMode", - "intercept", - "interfaceClass", - "interfaceName", - "interfaceNumber", - "interfaceProtocol", - "interfaceSubclass", - "interfaces", - "interimResults", - "internalSubset", - "interpretation", - "intersectionRatio", - "intersectionRect", - "intersectsNode", - "interval", - "invalidIteratorState", - "invalidateFramebuffer", - "invalidateSubFramebuffer", - "inverse", - "invertSelf", - "is", - "is2D", - "isActive", - "isAlternate", - "isArray", - "isBingCurrentSearchDefault", - "isBuffer", - "isCandidateWindowVisible", - "isChar", - "isCollapsed", - "isComposing", - "isConcatSpreadable", - "isConnected", - "isContentEditable", - "isContentHandlerRegistered", - "isContextLost", - "isDefaultNamespace", - "isDirectory", - "isDisabled", - "isEnabled", - "isEqual", - "isEqualNode", - "isExtensible", - "isExternalCTAP2SecurityKeySupported", - "isFile", - "isFinite", - "isFramebuffer", - "isFrozen", - "isGenerator", - "isHTML", - "isHistoryNavigation", - "isId", - "isIdentity", - "isInjected", - "isInteger", - "isIntersecting", - "isLockFree", - "isMap", - "isMultiLine", - "isNaN", - "isOpen", - "isPointInFill", - "isPointInPath", - "isPointInRange", - "isPointInStroke", - "isPrefAlternate", - "isPresenting", - "isPrimary", - "isProgram", - "isPropertyImplicit", - "isProtocolHandlerRegistered", - "isPrototypeOf", - "isQuery", - "isRenderbuffer", - "isSafeInteger", - "isSameNode", - "isSampler", - "isScript", - "isScriptURL", - "isSealed", - "isSecureContext", - "isSessionSupported", - "isShader", - "isSupported", - "isSync", - "isTextEdit", - "isTexture", - "isTransformFeedback", - "isTrusted", - "isTypeSupported", - "isUserVerifyingPlatformAuthenticatorAvailable", - "isVertexArray", - "isView", - "isVisible", - "isochronousTransferIn", - "isochronousTransferOut", - "isolation", - "italics", - "item", - "itemId", - "itemProp", - "itemRef", - "itemScope", - "itemType", - "itemValue", - "items", - "iterateNext", - "iterationComposite", - "iterator", - "javaEnabled", - "jobTitle", - "join", - "json", - "justify-content", - "justify-items", - "justify-self", - "justifyContent", - "justifyItems", - "justifySelf", - "k1", - "k2", - "k3", - "k4", - "kHz", - "keepalive", - "kernelMatrix", - "kernelUnitLengthX", - "kernelUnitLengthY", - "kerning", - "key", - "keyCode", - "keyFor", - "keyIdentifier", - "keyLightEnabled", - "keyLocation", - "keyPath", - "keyStatuses", - "keySystem", - "keyText", - "keyUsage", - "keyboard", - "keys", - "keytype", - "kind", - "knee", - "label", - "labels", - "lang", - "language", - "languages", - "largeArcFlag", - "lastChild", - "lastElementChild", - "lastEventId", - "lastIndex", - "lastIndexOf", - "lastInputTime", - "lastMatch", - "lastMessageSubject", - "lastMessageType", - "lastModified", - "lastModifiedDate", - "lastPage", - "lastParen", - "lastState", - "lastStyleSheetSet", - "latitude", - "layerX", - "layerY", - "layoutFlow", - "layoutGrid", - "layoutGridChar", - "layoutGridLine", - "layoutGridMode", - "layoutGridType", - "lbound", - "left", - "leftContext", - "leftDegrees", - "leftMargin", - "leftProjectionMatrix", - "leftViewMatrix", - "length", - "lengthAdjust", - "lengthComputable", - "letter-spacing", - "letterSpacing", - "level", - "lighting-color", - "lightingColor", - "limitingConeAngle", - "line", - "line-break", - "line-height", - "lineAlign", - "lineBreak", - "lineCap", - "lineDashOffset", - "lineHeight", - "lineJoin", - "lineNumber", - "lineTo", - "lineWidth", - "linearAcceleration", - "linearRampToValueAtTime", - "linearVelocity", - "lineno", - "lines", - "link", - "linkColor", - "linkProgram", - "links", - "list", - "list-style", - "list-style-image", - "list-style-position", - "list-style-type", - "listStyle", - "listStyleImage", - "listStylePosition", - "listStyleType", - "listener", - "load", - "loadEventEnd", - "loadEventStart", - "loadTime", - "loadTimes", - "loaded", - "loading", - "localDescription", - "localName", - "localService", - "localStorage", - "locale", - "localeCompare", - "location", - "locationbar", - "lock", - "locked", - "lockedFile", - "locks", - "log", - "log10", - "log1p", - "log2", - "logicalXDPI", - "logicalYDPI", - "longDesc", - "longitude", - "lookupNamespaceURI", - "lookupPrefix", - "loop", - "loopEnd", - "loopStart", - "looping", - "low", - "lower", - "lowerBound", - "lowerOpen", - "lowsrc", - "m11", - "m12", - "m13", - "m14", - "m21", - "m22", - "m23", - "m24", - "m31", - "m32", - "m33", - "m34", - "m41", - "m42", - "m43", - "m44", - "makeXRCompatible", - "manifest", - "manufacturer", - "manufacturerName", - "map", - "mapping", - "margin", - "margin-block", - "margin-block-end", - "margin-block-start", - "margin-bottom", - "margin-inline", - "margin-inline-end", - "margin-inline-start", - "margin-left", - "margin-right", - "margin-top", - "marginBlock", - "marginBlockEnd", - "marginBlockStart", - "marginBottom", - "marginHeight", - "marginInline", - "marginInlineEnd", - "marginInlineStart", - "marginLeft", - "marginRight", - "marginTop", - "marginWidth", - "mark", - "marker", - "marker-end", - "marker-mid", - "marker-offset", - "marker-start", - "markerEnd", - "markerHeight", - "markerMid", - "markerOffset", - "markerStart", - "markerUnits", - "markerWidth", - "marks", - "mask", - "mask-clip", - "mask-composite", - "mask-image", - "mask-mode", - "mask-origin", - "mask-position", - "mask-position-x", - "mask-position-y", - "mask-repeat", - "mask-size", - "mask-type", - "maskClip", - "maskComposite", - "maskContentUnits", - "maskImage", - "maskMode", - "maskOrigin", - "maskPosition", - "maskPositionX", - "maskPositionY", - "maskRepeat", - "maskSize", - "maskType", - "maskUnits", - "match", - "matchAll", - "matchMedia", - "matchMedium", - "matches", - "matrix", - "matrixTransform", - "max", - "max-block-size", - "max-height", - "max-inline-size", - "max-width", - "maxActions", - "maxAlternatives", - "maxBlockSize", - "maxChannelCount", - "maxChannels", - "maxConnectionsPerServer", - "maxDecibels", - "maxDistance", - "maxHeight", - "maxInlineSize", - "maxLayers", - "maxLength", - "maxMessageSize", - "maxPacketLifeTime", - "maxRetransmits", - "maxTouchPoints", - "maxValue", - "maxWidth", - "measure", - "measureText", - "media", - "mediaCapabilities", - "mediaDevices", - "mediaElement", - "mediaGroup", - "mediaKeys", - "mediaSession", - "mediaStream", - "mediaText", - "meetOrSlice", - "memory", - "menubar", - "mergeAttributes", - "message", - "messageClass", - "messageHandlers", - "messageType", - "metaKey", - "metadata", - "method", - "methodDetails", - "methodName", - "mid", - "mimeType", - "mimeTypes", - "min", - "min-block-size", - "min-height", - "min-inline-size", - "min-width", - "minBlockSize", - "minDecibels", - "minHeight", - "minInlineSize", - "minLength", - "minValue", - "minWidth", - "miterLimit", - "mix-blend-mode", - "mixBlendMode", - "mm", - "mode", - "modify", - "mount", - "move", - "moveBy", - "moveEnd", - "moveFirst", - "moveFocusDown", - "moveFocusLeft", - "moveFocusRight", - "moveFocusUp", - "moveNext", - "moveRow", - "moveStart", - "moveTo", - "moveToBookmark", - "moveToElementText", - "moveToPoint", - "movementX", - "movementY", - "mozAdd", - "mozAnimationStartTime", - "mozAnon", - "mozApps", - "mozAudioCaptured", - "mozAudioChannelType", - "mozAutoplayEnabled", - "mozCancelAnimationFrame", - "mozCancelFullScreen", - "mozCancelRequestAnimationFrame", - "mozCaptureStream", - "mozCaptureStreamUntilEnded", - "mozClearDataAt", - "mozContact", - "mozContacts", - "mozCreateFileHandle", - "mozCurrentTransform", - "mozCurrentTransformInverse", - "mozCursor", - "mozDash", - "mozDashOffset", - "mozDecodedFrames", - "mozExitPointerLock", - "mozFillRule", - "mozFragmentEnd", - "mozFrameDelay", - "mozFullScreen", - "mozFullScreenElement", - "mozFullScreenEnabled", - "mozGetAll", - "mozGetAllKeys", - "mozGetAsFile", - "mozGetDataAt", - "mozGetMetadata", - "mozGetUserMedia", - "mozHasAudio", - "mozHasItem", - "mozHidden", - "mozImageSmoothingEnabled", - "mozIndexedDB", - "mozInnerScreenX", - "mozInnerScreenY", - "mozInputSource", - "mozIsTextField", - "mozItem", - "mozItemCount", - "mozItems", - "mozLength", - "mozLockOrientation", - "mozMatchesSelector", - "mozMovementX", - "mozMovementY", - "mozOpaque", - "mozOrientation", - "mozPaintCount", - "mozPaintedFrames", - "mozParsedFrames", - "mozPay", - "mozPointerLockElement", - "mozPresentedFrames", - "mozPreservesPitch", - "mozPressure", - "mozPrintCallback", - "mozRTCIceCandidate", - "mozRTCPeerConnection", - "mozRTCSessionDescription", - "mozRemove", - "mozRequestAnimationFrame", - "mozRequestFullScreen", - "mozRequestPointerLock", - "mozSetDataAt", - "mozSetImageElement", - "mozSourceNode", - "mozSrcObject", - "mozSystem", - "mozTCPSocket", - "mozTextStyle", - "mozTypesAt", - "mozUnlockOrientation", - "mozUserCancelled", - "mozVisibilityState", - "ms", - "msAnimation", - "msAnimationDelay", - "msAnimationDirection", - "msAnimationDuration", - "msAnimationFillMode", - "msAnimationIterationCount", - "msAnimationName", - "msAnimationPlayState", - "msAnimationStartTime", - "msAnimationTimingFunction", - "msBackfaceVisibility", - "msBlockProgression", - "msCSSOMElementFloatMetrics", - "msCaching", - "msCachingEnabled", - "msCancelRequestAnimationFrame", - "msCapsLockWarningOff", - "msClearImmediate", - "msClose", - "msContentZoomChaining", - "msContentZoomFactor", - "msContentZoomLimit", - "msContentZoomLimitMax", - "msContentZoomLimitMin", - "msContentZoomSnap", - "msContentZoomSnapPoints", - "msContentZoomSnapType", - "msContentZooming", - "msConvertURL", - "msCrypto", - "msDoNotTrack", - "msElementsFromPoint", - "msElementsFromRect", - "msExitFullscreen", - "msExtendedCode", - "msFillRule", - "msFirstPaint", - "msFlex", - "msFlexAlign", - "msFlexDirection", - "msFlexFlow", - "msFlexItemAlign", - "msFlexLinePack", - "msFlexNegative", - "msFlexOrder", - "msFlexPack", - "msFlexPositive", - "msFlexPreferredSize", - "msFlexWrap", - "msFlowFrom", - "msFlowInto", - "msFontFeatureSettings", - "msFullscreenElement", - "msFullscreenEnabled", - "msGetInputContext", - "msGetRegionContent", - "msGetUntransformedBounds", - "msGraphicsTrustStatus", - "msGridColumn", - "msGridColumnAlign", - "msGridColumnSpan", - "msGridColumns", - "msGridRow", - "msGridRowAlign", - "msGridRowSpan", - "msGridRows", - "msHidden", - "msHighContrastAdjust", - "msHyphenateLimitChars", - "msHyphenateLimitLines", - "msHyphenateLimitZone", - "msHyphens", - "msImageSmoothingEnabled", - "msImeAlign", - "msIndexedDB", - "msInterpolationMode", - "msIsStaticHTML", - "msKeySystem", - "msKeys", - "msLaunchUri", - "msLockOrientation", - "msManipulationViewsEnabled", - "msMatchMedia", - "msMatchesSelector", - "msMaxTouchPoints", - "msOrientation", - "msOverflowStyle", - "msPerspective", - "msPerspectiveOrigin", - "msPlayToDisabled", - "msPlayToPreferredSourceUri", - "msPlayToPrimary", - "msPointerEnabled", - "msRegionOverflow", - "msReleasePointerCapture", - "msRequestAnimationFrame", - "msRequestFullscreen", - "msSaveBlob", - "msSaveOrOpenBlob", - "msScrollChaining", - "msScrollLimit", - "msScrollLimitXMax", - "msScrollLimitXMin", - "msScrollLimitYMax", - "msScrollLimitYMin", - "msScrollRails", - "msScrollSnapPointsX", - "msScrollSnapPointsY", - "msScrollSnapType", - "msScrollSnapX", - "msScrollSnapY", - "msScrollTranslation", - "msSetImmediate", - "msSetMediaKeys", - "msSetPointerCapture", - "msTextCombineHorizontal", - "msTextSizeAdjust", - "msToBlob", - "msTouchAction", - "msTouchSelect", - "msTraceAsyncCallbackCompleted", - "msTraceAsyncCallbackStarting", - "msTraceAsyncOperationCompleted", - "msTraceAsyncOperationStarting", - "msTransform", - "msTransformOrigin", - "msTransformStyle", - "msTransition", - "msTransitionDelay", - "msTransitionDuration", - "msTransitionProperty", - "msTransitionTimingFunction", - "msUnlockOrientation", - "msUpdateAsyncCallbackRelation", - "msUserSelect", - "msVisibilityState", - "msWrapFlow", - "msWrapMargin", - "msWrapThrough", - "msWriteProfilerMark", - "msZoom", - "msZoomTo", - "mt", - "mul", - "multiEntry", - "multiSelectionObj", - "multiline", - "multiple", - "multiply", - "multiplySelf", - "mutableFile", - "muted", - "n", - "name", - "nameProp", - "namedItem", - "namedRecordset", - "names", - "namespaceURI", - "namespaces", - "naturalHeight", - "naturalWidth", - "navigate", - "navigation", - "navigationMode", - "navigationPreload", - "navigationStart", - "navigator", - "near", - "nearestViewportElement", - "negative", - "negotiated", - "netscape", - "networkState", - "newScale", - "newTranslate", - "newURL", - "newValue", - "newValueSpecifiedUnits", - "newVersion", - "newhome", - "next", - "nextElementSibling", - "nextHopProtocol", - "nextNode", - "nextPage", - "nextSibling", - "nickname", - "noHref", - "noModule", - "noResize", - "noShade", - "noValidate", - "noWrap", - "node", - "nodeName", - "nodeType", - "nodeValue", - "nonce", - "normalize", - "normalizedPathSegList", - "notationName", - "notations", - "note", - "noteGrainOn", - "noteOff", - "noteOn", - "notify", - "now", - "numOctaves", - "number", - "numberOfChannels", - "numberOfInputs", - "numberOfItems", - "numberOfOutputs", - "numberValue", - "oMatchesSelector", - "object", - "object-fit", - "object-position", - "objectFit", - "objectPosition", - "objectStore", - "objectStoreNames", - "objectType", - "observe", - "of", - "offscreenBuffering", - "offset", - "offset-anchor", - "offset-distance", - "offset-path", - "offset-rotate", - "offsetAnchor", - "offsetDistance", - "offsetHeight", - "offsetLeft", - "offsetNode", - "offsetParent", - "offsetPath", - "offsetRotate", - "offsetTop", - "offsetWidth", - "offsetX", - "offsetY", - "ok", - "oldURL", - "oldValue", - "oldVersion", - "olderShadowRoot", - "onLine", - "onabort", - "onabsolutedeviceorientation", - "onactivate", - "onactive", - "onaddsourcebuffer", - "onaddstream", - "onaddtrack", - "onafterprint", - "onafterscriptexecute", - "onafterupdate", - "onanimationcancel", - "onanimationend", - "onanimationiteration", - "onanimationstart", - "onappinstalled", - "onaudioend", - "onaudioprocess", - "onaudiostart", - "onautocomplete", - "onautocompleteerror", - "onauxclick", - "onbeforeactivate", - "onbeforecopy", - "onbeforecut", - "onbeforedeactivate", - "onbeforeeditfocus", - "onbeforeinstallprompt", - "onbeforepaste", - "onbeforeprint", - "onbeforescriptexecute", - "onbeforeunload", - "onbeforeupdate", - "onbeforexrselect", - "onbegin", - "onblocked", - "onblur", - "onbounce", - "onboundary", - "onbufferedamountlow", - "oncached", - "oncancel", - "oncandidatewindowhide", - "oncandidatewindowshow", - "oncandidatewindowupdate", - "oncanplay", - "oncanplaythrough", - "once", - "oncellchange", - "onchange", - "oncharacteristicvaluechanged", - "onchargingchange", - "onchargingtimechange", - "onchecking", - "onclick", - "onclose", - "onclosing", - "oncompassneedscalibration", - "oncomplete", - "onconnect", - "onconnecting", - "onconnectionavailable", - "onconnectionstatechange", - "oncontextmenu", - "oncontrollerchange", - "oncontrolselect", - "oncopy", - "oncuechange", - "oncut", - "ondataavailable", - "ondatachannel", - "ondatasetchanged", - "ondatasetcomplete", - "ondblclick", - "ondeactivate", - "ondevicechange", - "ondevicelight", - "ondevicemotion", - "ondeviceorientation", - "ondeviceorientationabsolute", - "ondeviceproximity", - "ondischargingtimechange", - "ondisconnect", - "ondisplay", - "ondownloading", - "ondrag", - "ondragend", - "ondragenter", - "ondragexit", - "ondragleave", - "ondragover", - "ondragstart", - "ondrop", - "ondurationchange", - "onemptied", - "onencrypted", - "onend", - "onended", - "onenter", - "onenterpictureinpicture", - "onerror", - "onerrorupdate", - "onexit", - "onfilterchange", - "onfinish", - "onfocus", - "onfocusin", - "onfocusout", - "onformdata", - "onfreeze", - "onfullscreenchange", - "onfullscreenerror", - "ongatheringstatechange", - "ongattserverdisconnected", - "ongesturechange", - "ongestureend", - "ongesturestart", - "ongotpointercapture", - "onhashchange", - "onhelp", - "onicecandidate", - "onicecandidateerror", - "oniceconnectionstatechange", - "onicegatheringstatechange", - "oninactive", - "oninput", - "oninputsourceschange", - "oninvalid", - "onkeydown", - "onkeypress", - "onkeystatuseschange", - "onkeyup", - "onlanguagechange", - "onlayoutcomplete", - "onleavepictureinpicture", - "onlevelchange", - "onload", - "onloadeddata", - "onloadedmetadata", - "onloadend", - "onloading", - "onloadingdone", - "onloadingerror", - "onloadstart", - "onlosecapture", - "onlostpointercapture", - "only", - "onmark", - "onmessage", - "onmessageerror", - "onmidimessage", - "onmousedown", - "onmouseenter", - "onmouseleave", - "onmousemove", - "onmouseout", - "onmouseover", - "onmouseup", - "onmousewheel", - "onmove", - "onmoveend", - "onmovestart", - "onmozfullscreenchange", - "onmozfullscreenerror", - "onmozorientationchange", - "onmozpointerlockchange", - "onmozpointerlockerror", - "onmscontentzoom", - "onmsfullscreenchange", - "onmsfullscreenerror", - "onmsgesturechange", - "onmsgesturedoubletap", - "onmsgestureend", - "onmsgesturehold", - "onmsgesturestart", - "onmsgesturetap", - "onmsgotpointercapture", - "onmsinertiastart", - "onmslostpointercapture", - "onmsmanipulationstatechanged", - "onmsneedkey", - "onmsorientationchange", - "onmspointercancel", - "onmspointerdown", - "onmspointerenter", - "onmspointerhover", - "onmspointerleave", - "onmspointermove", - "onmspointerout", - "onmspointerover", - "onmspointerup", - "onmssitemodejumplistitemremoved", - "onmsthumbnailclick", - "onmute", - "onnegotiationneeded", - "onnomatch", - "onnoupdate", - "onobsolete", - "onoffline", - "ononline", - "onopen", - "onorientationchange", - "onpagechange", - "onpagehide", - "onpageshow", - "onpaste", - "onpause", - "onpayerdetailchange", - "onpaymentmethodchange", - "onplay", - "onplaying", - "onpluginstreamstart", - "onpointercancel", - "onpointerdown", - "onpointerenter", - "onpointerleave", - "onpointerlockchange", - "onpointerlockerror", - "onpointermove", - "onpointerout", - "onpointerover", - "onpointerrawupdate", - "onpointerup", - "onpopstate", - "onprocessorerror", - "onprogress", - "onpropertychange", - "onratechange", - "onreading", - "onreadystatechange", - "onrejectionhandled", - "onrelease", - "onremove", - "onremovesourcebuffer", - "onremovestream", - "onremovetrack", - "onrepeat", - "onreset", - "onresize", - "onresizeend", - "onresizestart", - "onresourcetimingbufferfull", - "onresult", - "onresume", - "onrowenter", - "onrowexit", - "onrowsdelete", - "onrowsinserted", - "onscroll", - "onsearch", - "onsecuritypolicyviolation", - "onseeked", - "onseeking", - "onselect", - "onselectedcandidatepairchange", - "onselectend", - "onselectionchange", - "onselectstart", - "onshippingaddresschange", - "onshippingoptionchange", - "onshow", - "onsignalingstatechange", - "onsoundend", - "onsoundstart", - "onsourceclose", - "onsourceclosed", - "onsourceended", - "onsourceopen", - "onspeechend", - "onspeechstart", - "onsqueeze", - "onsqueezeend", - "onsqueezestart", - "onstalled", - "onstart", - "onstatechange", - "onstop", - "onstorage", - "onstoragecommit", - "onsubmit", - "onsuccess", - "onsuspend", - "onterminate", - "ontextinput", - "ontimeout", - "ontimeupdate", - "ontoggle", - "ontonechange", - "ontouchcancel", - "ontouchend", - "ontouchmove", - "ontouchstart", - "ontrack", - "ontransitioncancel", - "ontransitionend", - "ontransitionrun", - "ontransitionstart", - "onunhandledrejection", - "onunload", - "onunmute", - "onupdate", - "onupdateend", - "onupdatefound", - "onupdateready", - "onupdatestart", - "onupgradeneeded", - "onuserproximity", - "onversionchange", - "onvisibilitychange", - "onvoiceschanged", - "onvolumechange", - "onvrdisplayactivate", - "onvrdisplayconnect", - "onvrdisplaydeactivate", - "onvrdisplaydisconnect", - "onvrdisplaypresentchange", - "onwaiting", - "onwaitingforkey", - "onwarning", - "onwebkitanimationend", - "onwebkitanimationiteration", - "onwebkitanimationstart", - "onwebkitcurrentplaybacktargetiswirelesschanged", - "onwebkitfullscreenchange", - "onwebkitfullscreenerror", - "onwebkitkeyadded", - "onwebkitkeyerror", - "onwebkitkeymessage", - "onwebkitneedkey", - "onwebkitorientationchange", - "onwebkitplaybacktargetavailabilitychanged", - "onwebkitpointerlockchange", - "onwebkitpointerlockerror", - "onwebkitresourcetimingbufferfull", - "onwebkittransitionend", - "onwheel", - "onzoom", - "opacity", - "open", - "openCursor", - "openDatabase", - "openKeyCursor", - "opened", - "opener", - "opera", - "operationType", - "operator", - "opr", - "optimum", - "options", - "or", - "order", - "orderX", - "orderY", - "ordered", - "org", - "organization", - "orient", - "orientAngle", - "orientType", - "orientation", - "orientationX", - "orientationY", - "orientationZ", - "origin", - "originalPolicy", - "originalTarget", - "orphans", - "oscpu", - "outerHTML", - "outerHeight", - "outerText", - "outerWidth", - "outline", - "outline-color", - "outline-offset", - "outline-style", - "outline-width", - "outlineColor", - "outlineOffset", - "outlineStyle", - "outlineWidth", - "outputBuffer", - "outputLatency", - "outputs", - "overflow", - "overflow-anchor", - "overflow-block", - "overflow-inline", - "overflow-wrap", - "overflow-x", - "overflow-y", - "overflowAnchor", - "overflowBlock", - "overflowInline", - "overflowWrap", - "overflowX", - "overflowY", - "overrideMimeType", - "oversample", - "overscroll-behavior", - "overscroll-behavior-block", - "overscroll-behavior-inline", - "overscroll-behavior-x", - "overscroll-behavior-y", - "overscrollBehavior", - "overscrollBehaviorBlock", - "overscrollBehaviorInline", - "overscrollBehaviorX", - "overscrollBehaviorY", - "ownKeys", - "ownerDocument", - "ownerElement", - "ownerNode", - "ownerRule", - "ownerSVGElement", - "owningElement", - "p1", - "p2", - "p3", - "p4", - "packetSize", - "packets", - "pad", - "padEnd", - "padStart", - "padding", - "padding-block", - "padding-block-end", - "padding-block-start", - "padding-bottom", - "padding-inline", - "padding-inline-end", - "padding-inline-start", - "padding-left", - "padding-right", - "padding-top", - "paddingBlock", - "paddingBlockEnd", - "paddingBlockStart", - "paddingBottom", - "paddingInline", - "paddingInlineEnd", - "paddingInlineStart", - "paddingLeft", - "paddingRight", - "paddingTop", - "page", - "page-break-after", - "page-break-before", - "page-break-inside", - "pageBreakAfter", - "pageBreakBefore", - "pageBreakInside", - "pageCount", - "pageLeft", - "pageTop", - "pageX", - "pageXOffset", - "pageY", - "pageYOffset", - "pages", - "paint-order", - "paintOrder", - "paintRequests", - "paintType", - "paintWorklet", - "palette", - "pan", - "panningModel", - "parameters", - "parent", - "parentElement", - "parentNode", - "parentRule", - "parentStyleSheet", - "parentTextEdit", - "parentWindow", - "parse", - "parseAll", - "parseFloat", - "parseFromString", - "parseInt", - "part", - "participants", - "passive", - "password", - "pasteHTML", - "path", - "pathLength", - "pathSegList", - "pathSegType", - "pathSegTypeAsLetter", - "pathname", - "pattern", - "patternContentUnits", - "patternMismatch", - "patternTransform", - "patternUnits", - "pause", - "pauseAnimations", - "pauseOnExit", - "pauseProfilers", - "pauseTransformFeedback", - "paused", - "payerEmail", - "payerName", - "payerPhone", - "paymentManager", - "pc", - "peerIdentity", - "pending", - "pendingLocalDescription", - "pendingRemoteDescription", - "percent", - "performance", - "periodicSync", - "permission", - "permissionState", - "permissions", - "persist", - "persisted", - "personalbar", - "perspective", - "perspective-origin", - "perspectiveOrigin", - "phone", - "phoneticFamilyName", - "phoneticGivenName", - "photo", - "pictureInPictureElement", - "pictureInPictureEnabled", - "pictureInPictureWindow", - "ping", - "pipeThrough", - "pipeTo", - "pitch", - "pixelBottom", - "pixelDepth", - "pixelHeight", - "pixelLeft", - "pixelRight", - "pixelStorei", - "pixelTop", - "pixelUnitToMillimeterX", - "pixelUnitToMillimeterY", - "pixelWidth", - "place-content", - "place-items", - "place-self", - "placeContent", - "placeItems", - "placeSelf", - "placeholder", - "platform", - "platforms", - "play", - "playEffect", - "playState", - "playbackRate", - "playbackState", - "playbackTime", - "played", - "playoutDelayHint", - "playsInline", - "plugins", - "pluginspage", - "pname", - "pointer-events", - "pointerBeforeReferenceNode", - "pointerEnabled", - "pointerEvents", - "pointerId", - "pointerLockElement", - "pointerType", - "points", - "pointsAtX", - "pointsAtY", - "pointsAtZ", - "polygonOffset", - "pop", - "populateMatrix", - "popupWindowFeatures", - "popupWindowName", - "popupWindowURI", - "port", - "port1", - "port2", - "ports", - "posBottom", - "posHeight", - "posLeft", - "posRight", - "posTop", - "posWidth", - "pose", - "position", - "positionAlign", - "positionX", - "positionY", - "positionZ", - "postError", - "postMessage", - "postalCode", - "poster", - "pow", - "powerEfficient", - "powerOff", - "preMultiplySelf", - "precision", - "preferredStyleSheetSet", - "preferredStylesheetSet", - "prefix", - "preload", - "prepend", - "presentation", - "preserveAlpha", - "preserveAspectRatio", - "preserveAspectRatioString", - "pressed", - "pressure", - "prevValue", - "preventDefault", - "preventExtensions", - "preventSilentAccess", - "previousElementSibling", - "previousNode", - "previousPage", - "previousRect", - "previousScale", - "previousSibling", - "previousTranslate", - "primaryKey", - "primitiveType", - "primitiveUnits", - "principals", - "print", - "priority", - "privateKey", - "probablySupportsContext", - "process", - "processIceMessage", - "processingEnd", - "processingStart", - "product", - "productId", - "productName", - "productSub", - "profile", - "profileEnd", - "profiles", - "projectionMatrix", - "promise", - "prompt", - "properties", - "propertyIsEnumerable", - "propertyName", - "protocol", - "protocolLong", - "prototype", - "provider", - "pseudoClass", - "pseudoElement", - "pt", - "publicId", - "publicKey", - "published", - "pulse", - "push", - "pushManager", - "pushNotification", - "pushState", - "put", - "putImageData", - "px", - "quadraticCurveTo", - "qualifier", - "quaternion", - "query", - "queryCommandEnabled", - "queryCommandIndeterm", - "queryCommandState", - "queryCommandSupported", - "queryCommandText", - "queryCommandValue", - "querySelector", - "querySelectorAll", - "queueMicrotask", - "quote", - "quotes", - "r", - "r1", - "r2", - "race", - "rad", - "radiogroup", - "radiusX", - "radiusY", - "random", - "range", - "rangeCount", - "rangeMax", - "rangeMin", - "rangeOffset", - "rangeOverflow", - "rangeParent", - "rangeUnderflow", - "rate", - "ratio", - "raw", - "rawId", - "read", - "readAsArrayBuffer", - "readAsBinaryString", - "readAsBlob", - "readAsDataURL", - "readAsText", - "readBuffer", - "readEntries", - "readOnly", - "readPixels", - "readReportRequested", - "readText", - "readValue", - "readable", - "ready", - "readyState", - "reason", - "reboot", - "receivedAlert", - "receiver", - "receivers", - "recipient", - "reconnect", - "recordNumber", - "recordsAvailable", - "recordset", - "rect", - "red", - "redEyeReduction", - "redirect", - "redirectCount", - "redirectEnd", - "redirectStart", - "redirected", - "reduce", - "reduceRight", - "reduction", - "refDistance", - "refX", - "refY", - "referenceNode", - "referenceSpace", - "referrer", - "referrerPolicy", - "refresh", - "region", - "regionAnchorX", - "regionAnchorY", - "regionId", - "regions", - "register", - "registerContentHandler", - "registerElement", - "registerProperty", - "registerProtocolHandler", - "reject", - "rel", - "relList", - "relatedAddress", - "relatedNode", - "relatedPort", - "relatedTarget", - "release", - "releaseCapture", - "releaseEvents", - "releaseInterface", - "releaseLock", - "releasePointerCapture", - "releaseShaderCompiler", - "reliable", - "reliableWrite", - "reload", - "rem", - "remainingSpace", - "remote", - "remoteDescription", - "remove", - "removeAllRanges", - "removeAttribute", - "removeAttributeNS", - "removeAttributeNode", - "removeBehavior", - "removeChild", - "removeCue", - "removeEventListener", - "removeFilter", - "removeImport", - "removeItem", - "removeListener", - "removeNamedItem", - "removeNamedItemNS", - "removeNode", - "removeParameter", - "removeProperty", - "removeRange", - "removeRegion", - "removeRule", - "removeSiteSpecificTrackingException", - "removeSourceBuffer", - "removeStream", - "removeTrack", - "removeVariable", - "removeWakeLockListener", - "removeWebWideTrackingException", - "removed", - "removedNodes", - "renderHeight", - "renderState", - "renderTime", - "renderWidth", - "renderbufferStorage", - "renderbufferStorageMultisample", - "renderedBuffer", - "renderingMode", - "renotify", - "repeat", - "replace", - "replaceAdjacentText", - "replaceAll", - "replaceChild", - "replaceChildren", - "replaceData", - "replaceId", - "replaceItem", - "replaceNode", - "replaceState", - "replaceSync", - "replaceTrack", - "replaceWholeText", - "replaceWith", - "reportValidity", - "request", - "requestAnimationFrame", - "requestAutocomplete", - "requestData", - "requestDevice", - "requestFrame", - "requestFullscreen", - "requestHitTestSource", - "requestHitTestSourceForTransientInput", - "requestId", - "requestIdleCallback", - "requestMIDIAccess", - "requestMediaKeySystemAccess", - "requestPermission", - "requestPictureInPicture", - "requestPointerLock", - "requestPresent", - "requestReferenceSpace", - "requestSession", - "requestStart", - "requestStorageAccess", - "requestSubmit", - "requestVideoFrameCallback", - "requestingWindow", - "requireInteraction", - "required", - "requiredExtensions", - "requiredFeatures", - "reset", - "resetPose", - "resetTransform", - "resize", - "resizeBy", - "resizeTo", - "resolve", - "response", - "responseBody", - "responseEnd", - "responseReady", - "responseStart", - "responseText", - "responseType", - "responseURL", - "responseXML", - "restartIce", - "restore", - "result", - "resultIndex", - "resultType", - "results", - "resume", - "resumeProfilers", - "resumeTransformFeedback", - "retry", - "returnValue", - "rev", - "reverse", - "reversed", - "revocable", - "revokeObjectURL", - "rgbColor", - "right", - "rightContext", - "rightDegrees", - "rightMargin", - "rightProjectionMatrix", - "rightViewMatrix", - "role", - "rolloffFactor", - "root", - "rootBounds", - "rootElement", - "rootMargin", - "rotate", - "rotateAxisAngle", - "rotateAxisAngleSelf", - "rotateFromVector", - "rotateFromVectorSelf", - "rotateSelf", - "rotation", - "rotationAngle", - "rotationRate", - "round", - "row-gap", - "rowGap", - "rowIndex", - "rowSpan", - "rows", - "rtcpTransport", - "rtt", - "ruby-align", - "ruby-position", - "rubyAlign", - "rubyOverhang", - "rubyPosition", - "rules", - "runtime", - "runtimeStyle", - "rx", - "ry", - "s", - "safari", - "sample", - "sampleCoverage", - "sampleRate", - "samplerParameterf", - "samplerParameteri", - "sandbox", - "save", - "saveData", - "scale", - "scale3d", - "scale3dSelf", - "scaleNonUniform", - "scaleNonUniformSelf", - "scaleSelf", - "scheme", - "scissor", - "scope", - "scopeName", - "scoped", - "screen", - "screenBrightness", - "screenEnabled", - "screenLeft", - "screenPixelToMillimeterX", - "screenPixelToMillimeterY", - "screenTop", - "screenX", - "screenY", - "scriptURL", - "scripts", - "scroll", - "scroll-behavior", - "scroll-margin", - "scroll-margin-block", - "scroll-margin-block-end", - "scroll-margin-block-start", - "scroll-margin-bottom", - "scroll-margin-inline", - "scroll-margin-inline-end", - "scroll-margin-inline-start", - "scroll-margin-left", - "scroll-margin-right", - "scroll-margin-top", - "scroll-padding", - "scroll-padding-block", - "scroll-padding-block-end", - "scroll-padding-block-start", - "scroll-padding-bottom", - "scroll-padding-inline", - "scroll-padding-inline-end", - "scroll-padding-inline-start", - "scroll-padding-left", - "scroll-padding-right", - "scroll-padding-top", - "scroll-snap-align", - "scroll-snap-type", - "scrollAmount", - "scrollBehavior", - "scrollBy", - "scrollByLines", - "scrollByPages", - "scrollDelay", - "scrollHeight", - "scrollIntoView", - "scrollIntoViewIfNeeded", - "scrollLeft", - "scrollLeftMax", - "scrollMargin", - "scrollMarginBlock", - "scrollMarginBlockEnd", - "scrollMarginBlockStart", - "scrollMarginBottom", - "scrollMarginInline", - "scrollMarginInlineEnd", - "scrollMarginInlineStart", - "scrollMarginLeft", - "scrollMarginRight", - "scrollMarginTop", - "scrollMaxX", - "scrollMaxY", - "scrollPadding", - "scrollPaddingBlock", - "scrollPaddingBlockEnd", - "scrollPaddingBlockStart", - "scrollPaddingBottom", - "scrollPaddingInline", - "scrollPaddingInlineEnd", - "scrollPaddingInlineStart", - "scrollPaddingLeft", - "scrollPaddingRight", - "scrollPaddingTop", - "scrollRestoration", - "scrollSnapAlign", - "scrollSnapType", - "scrollTo", - "scrollTop", - "scrollTopMax", - "scrollWidth", - "scrollX", - "scrollY", - "scrollbar-color", - "scrollbar-width", - "scrollbar3dLightColor", - "scrollbarArrowColor", - "scrollbarBaseColor", - "scrollbarColor", - "scrollbarDarkShadowColor", - "scrollbarFaceColor", - "scrollbarHighlightColor", - "scrollbarShadowColor", - "scrollbarTrackColor", - "scrollbarWidth", - "scrollbars", - "scrolling", - "scrollingElement", - "sctp", - "sctpCauseCode", - "sdp", - "sdpLineNumber", - "sdpMLineIndex", - "sdpMid", - "seal", - "search", - "searchBox", - "searchBoxJavaBridge_", - "searchParams", - "sectionRowIndex", - "secureConnectionStart", - "security", - "seed", - "seekToNextFrame", - "seekable", - "seeking", - "select", - "selectAllChildren", - "selectAlternateInterface", - "selectConfiguration", - "selectNode", - "selectNodeContents", - "selectNodes", - "selectSingleNode", - "selectSubString", - "selected", - "selectedIndex", - "selectedOptions", - "selectedStyleSheetSet", - "selectedStylesheetSet", - "selection", - "selectionDirection", - "selectionEnd", - "selectionStart", - "selector", - "selectorText", - "self", - "send", - "sendAsBinary", - "sendBeacon", - "sender", - "sentAlert", - "sentTimestamp", - "separator", - "serialNumber", - "serializeToString", - "serverTiming", - "service", - "serviceWorker", - "session", - "sessionId", - "sessionStorage", - "set", - "setActionHandler", - "setActive", - "setAlpha", - "setAppBadge", - "setAttribute", - "setAttributeNS", - "setAttributeNode", - "setAttributeNodeNS", - "setBaseAndExtent", - "setBigInt64", - "setBigUint64", - "setBingCurrentSearchDefault", - "setCapture", - "setCodecPreferences", - "setColor", - "setCompositeOperation", - "setConfiguration", - "setCurrentTime", - "setCustomValidity", - "setData", - "setDate", - "setDragImage", - "setEnd", - "setEndAfter", - "setEndBefore", - "setEndPoint", - "setFillColor", - "setFilterRes", - "setFloat32", - "setFloat64", - "setFloatValue", - "setFormValue", - "setFullYear", - "setHeaderValue", - "setHours", - "setIdentityProvider", - "setImmediate", - "setInt16", - "setInt32", - "setInt8", - "setInterval", - "setItem", - "setKeyframes", - "setLineCap", - "setLineDash", - "setLineJoin", - "setLineWidth", - "setLiveSeekableRange", - "setLocalDescription", - "setMatrix", - "setMatrixValue", - "setMediaKeys", - "setMilliseconds", - "setMinutes", - "setMiterLimit", - "setMonth", - "setNamedItem", - "setNamedItemNS", - "setNonUserCodeExceptions", - "setOrientToAngle", - "setOrientToAuto", - "setOrientation", - "setOverrideHistoryNavigationMode", - "setPaint", - "setParameter", - "setParameters", - "setPeriodicWave", - "setPointerCapture", - "setPosition", - "setPositionState", - "setPreference", - "setProperty", - "setPrototypeOf", - "setRGBColor", - "setRGBColorICCColor", - "setRadius", - "setRangeText", - "setRemoteDescription", - "setRequestHeader", - "setResizable", - "setResourceTimingBufferSize", - "setRotate", - "setScale", - "setSeconds", - "setSelectionRange", - "setServerCertificate", - "setShadow", - "setSinkId", - "setSkewX", - "setSkewY", - "setStart", - "setStartAfter", - "setStartBefore", - "setStdDeviation", - "setStreams", - "setStringValue", - "setStrokeColor", - "setSuggestResult", - "setTargetAtTime", - "setTargetValueAtTime", - "setTime", - "setTimeout", - "setTransform", - "setTranslate", - "setUTCDate", - "setUTCFullYear", - "setUTCHours", - "setUTCMilliseconds", - "setUTCMinutes", - "setUTCMonth", - "setUTCSeconds", - "setUint16", - "setUint32", - "setUint8", - "setUri", - "setValidity", - "setValueAtTime", - "setValueCurveAtTime", - "setVariable", - "setVelocity", - "setVersion", - "setYear", - "settingName", - "settingValue", - "sex", - "shaderSource", - "shadowBlur", - "shadowColor", - "shadowOffsetX", - "shadowOffsetY", - "shadowRoot", - "shape", - "shape-image-threshold", - "shape-margin", - "shape-outside", - "shape-rendering", - "shapeImageThreshold", - "shapeMargin", - "shapeOutside", - "shapeRendering", - "sheet", - "shift", - "shiftKey", - "shiftLeft", - "shippingAddress", - "shippingOption", - "shippingType", - "show", - "showHelp", - "showModal", - "showModalDialog", - "showModelessDialog", - "showNotification", - "sidebar", - "sign", - "signal", - "signalingState", - "signature", - "silent", - "sin", - "singleNodeValue", - "sinh", - "sinkId", - "sittingToStandingTransform", - "size", - "sizeToContent", - "sizeX", - "sizeZ", - "sizes", - "skewX", - "skewXSelf", - "skewY", - "skewYSelf", - "slice", - "slope", - "slot", - "small", - "smil", - "smooth", - "smoothingTimeConstant", - "snapToLines", - "snapshotItem", - "snapshotLength", - "some", - "sort", - "sortingCode", - "source", - "sourceBuffer", - "sourceBuffers", - "sourceCapabilities", - "sourceFile", - "sourceIndex", - "sources", - "spacing", - "span", - "speak", - "speakAs", - "speaking", - "species", - "specified", - "specularConstant", - "specularExponent", - "speechSynthesis", - "speed", - "speedOfSound", - "spellcheck", - "splice", - "split", - "splitText", - "spreadMethod", - "sqrt", - "src", - "srcElement", - "srcFilter", - "srcObject", - "srcUrn", - "srcdoc", - "srclang", - "srcset", - "stack", - "stackTraceLimit", - "stacktrace", - "stageParameters", - "standalone", - "standby", - "start", - "startContainer", - "startIce", - "startMessages", - "startNotifications", - "startOffset", - "startProfiling", - "startRendering", - "startShark", - "startTime", - "startsWith", - "state", - "status", - "statusCode", - "statusMessage", - "statusText", - "statusbar", - "stdDeviationX", - "stdDeviationY", - "stencilFunc", - "stencilFuncSeparate", - "stencilMask", - "stencilMaskSeparate", - "stencilOp", - "stencilOpSeparate", - "step", - "stepDown", - "stepMismatch", - "stepUp", - "sticky", - "stitchTiles", - "stop", - "stop-color", - "stop-opacity", - "stopColor", - "stopImmediatePropagation", - "stopNotifications", - "stopOpacity", - "stopProfiling", - "stopPropagation", - "stopShark", - "stopped", - "storage", - "storageArea", - "storageName", - "storageStatus", - "store", - "storeSiteSpecificTrackingException", - "storeWebWideTrackingException", - "stpVersion", - "stream", - "streams", - "stretch", - "strike", - "string", - "stringValue", - "stringify", - "stroke", - "stroke-dasharray", - "stroke-dashoffset", - "stroke-linecap", - "stroke-linejoin", - "stroke-miterlimit", - "stroke-opacity", - "stroke-width", - "strokeDasharray", - "strokeDashoffset", - "strokeLinecap", - "strokeLinejoin", - "strokeMiterlimit", - "strokeOpacity", - "strokeRect", - "strokeStyle", - "strokeText", - "strokeWidth", - "style", - "styleFloat", - "styleMap", - "styleMedia", - "styleSheet", - "styleSheetSets", - "styleSheets", - "sub", - "subarray", - "subject", - "submit", - "submitFrame", - "submitter", - "subscribe", - "substr", - "substring", - "substringData", - "subtle", - "subtree", - "suffix", - "suffixes", - "summary", - "sup", - "supported", - "supportedContentEncodings", - "supportedEntryTypes", - "supports", - "supportsSession", - "surfaceScale", - "surroundContents", - "suspend", - "suspendRedraw", - "swapCache", - "swapNode", - "sweepFlag", - "symbols", - "sync", - "sysexEnabled", - "system", - "systemCode", - "systemId", - "systemLanguage", - "systemXDPI", - "systemYDPI", - "tBodies", - "tFoot", - "tHead", - "tabIndex", - "table", - "table-layout", - "tableLayout", - "tableValues", - "tag", - "tagName", - "tagUrn", - "tags", - "taintEnabled", - "takePhoto", - "takeRecords", - "tan", - "tangentialPressure", - "tanh", - "target", - "targetElement", - "targetRayMode", - "targetRaySpace", - "targetTouches", - "targetX", - "targetY", - "tcpType", - "tee", - "tel", - "terminate", - "test", - "texImage2D", - "texImage3D", - "texParameterf", - "texParameteri", - "texStorage2D", - "texStorage3D", - "texSubImage2D", - "texSubImage3D", - "text", - "text-align", - "text-align-last", - "text-anchor", - "text-combine-upright", - "text-decoration", - "text-decoration-color", - "text-decoration-line", - "text-decoration-skip-ink", - "text-decoration-style", - "text-decoration-thickness", - "text-emphasis", - "text-emphasis-color", - "text-emphasis-position", - "text-emphasis-style", - "text-indent", - "text-justify", - "text-orientation", - "text-overflow", - "text-rendering", - "text-shadow", - "text-transform", - "text-underline-offset", - "text-underline-position", - "textAlign", - "textAlignLast", - "textAnchor", - "textAutospace", - "textBaseline", - "textCombineUpright", - "textContent", - "textDecoration", - "textDecorationBlink", - "textDecorationColor", - "textDecorationLine", - "textDecorationLineThrough", - "textDecorationNone", - "textDecorationOverline", - "textDecorationSkipInk", - "textDecorationStyle", - "textDecorationThickness", - "textDecorationUnderline", - "textEmphasis", - "textEmphasisColor", - "textEmphasisPosition", - "textEmphasisStyle", - "textIndent", - "textJustify", - "textJustifyTrim", - "textKashida", - "textKashidaSpace", - "textLength", - "textOrientation", - "textOverflow", - "textRendering", - "textShadow", - "textTracks", - "textTransform", - "textUnderlineOffset", - "textUnderlinePosition", - "then", - "threadId", - "threshold", - "thresholds", - "tiltX", - "tiltY", - "time", - "timeEnd", - "timeLog", - "timeOrigin", - "timeRemaining", - "timeStamp", - "timecode", - "timeline", - "timelineTime", - "timeout", - "timestamp", - "timestampOffset", - "timing", - "title", - "to", - "toArray", - "toBlob", - "toDataURL", - "toDateString", - "toElement", - "toExponential", - "toFixed", - "toFloat32Array", - "toFloat64Array", - "toGMTString", - "toISOString", - "toJSON", - "toLocaleDateString", - "toLocaleFormat", - "toLocaleLowerCase", - "toLocaleString", - "toLocaleTimeString", - "toLocaleUpperCase", - "toLowerCase", - "toMatrix", - "toMethod", - "toPrecision", - "toPrimitive", - "toSdp", - "toSource", - "toStaticHTML", - "toString", - "toStringTag", - "toSum", - "toTimeString", - "toUTCString", - "toUpperCase", - "toggle", - "toggleAttribute", - "toggleLongPressEnabled", - "tone", - "toneBuffer", - "tooLong", - "tooShort", - "toolbar", - "top", - "topMargin", - "total", - "totalFrameDelay", - "totalVideoFrames", - "touch-action", - "touchAction", - "touched", - "touches", - "trace", - "track", - "trackVisibility", - "transaction", - "transactions", - "transceiver", - "transferControlToOffscreen", - "transferFromImageBitmap", - "transferImageBitmap", - "transferIn", - "transferOut", - "transferSize", - "transferToImageBitmap", - "transform", - "transform-box", - "transform-origin", - "transform-style", - "transformBox", - "transformFeedbackVaryings", - "transformOrigin", - "transformPoint", - "transformString", - "transformStyle", - "transformToDocument", - "transformToFragment", - "transition", - "transition-delay", - "transition-duration", - "transition-property", - "transition-timing-function", - "transitionDelay", - "transitionDuration", - "transitionProperty", - "transitionTimingFunction", - "translate", - "translateSelf", - "translationX", - "translationY", - "transport", - "trim", - "trimEnd", - "trimLeft", - "trimRight", - "trimStart", - "trueSpeed", - "trunc", - "truncate", - "trustedTypes", - "turn", - "twist", - "type", - "typeDetail", - "typeMismatch", - "typeMustMatch", - "types", - "u2f", - "ubound", - "uint16", - "uint32", - "uint8", - "uint8Clamped", - "undefined", - "unescape", - "uneval", - "unicode", - "unicode-bidi", - "unicodeBidi", - "unicodeRange", - "uniform1f", - "uniform1fv", - "uniform1i", - "uniform1iv", - "uniform1ui", - "uniform1uiv", - "uniform2f", - "uniform2fv", - "uniform2i", - "uniform2iv", - "uniform2ui", - "uniform2uiv", - "uniform3f", - "uniform3fv", - "uniform3i", - "uniform3iv", - "uniform3ui", - "uniform3uiv", - "uniform4f", - "uniform4fv", - "uniform4i", - "uniform4iv", - "uniform4ui", - "uniform4uiv", - "uniformBlockBinding", - "uniformMatrix2fv", - "uniformMatrix2x3fv", - "uniformMatrix2x4fv", - "uniformMatrix3fv", - "uniformMatrix3x2fv", - "uniformMatrix3x4fv", - "uniformMatrix4fv", - "uniformMatrix4x2fv", - "uniformMatrix4x3fv", - "unique", - "uniqueID", - "uniqueNumber", - "unit", - "unitType", - "units", - "unloadEventEnd", - "unloadEventStart", - "unlock", - "unmount", - "unobserve", - "unpause", - "unpauseAnimations", - "unreadCount", - "unregister", - "unregisterContentHandler", - "unregisterProtocolHandler", - "unscopables", - "unselectable", - "unshift", - "unsubscribe", - "unsuspendRedraw", - "unsuspendRedrawAll", - "unwatch", - "unwrapKey", - "upDegrees", - "upX", - "upY", - "upZ", - "update", - "updateCommands", - "updateIce", - "updateInterval", - "updatePlaybackRate", - "updateRenderState", - "updateSettings", - "updateTiming", - "updateViaCache", - "updateWith", - "updated", - "updating", - "upgrade", - "upload", - "uploadTotal", - "uploaded", - "upper", - "upperBound", - "upperOpen", - "uri", - "url", - "urn", - "urns", - "usages", - "usb", - "usbVersionMajor", - "usbVersionMinor", - "usbVersionSubminor", - "useCurrentView", - "useMap", - "useProgram", - "usedSpace", - "user-select", - "userActivation", - "userAgent", - "userChoice", - "userHandle", - "userHint", - "userLanguage", - "userSelect", - "userVisibleOnly", - "username", - "usernameFragment", - "utterance", - "uuid", - "v8BreakIterator", - "vAlign", - "vLink", - "valid", - "validate", - "validateProgram", - "validationMessage", - "validity", - "value", - "valueAsDate", - "valueAsNumber", - "valueAsString", - "valueInSpecifiedUnits", - "valueMissing", - "valueOf", - "valueText", - "valueType", - "values", - "variable", - "variant", - "variationSettings", - "vector-effect", - "vectorEffect", - "velocityAngular", - "velocityExpansion", - "velocityX", - "velocityY", - "vendor", - "vendorId", - "vendorSub", - "verify", - "version", - "vertexAttrib1f", - "vertexAttrib1fv", - "vertexAttrib2f", - "vertexAttrib2fv", - "vertexAttrib3f", - "vertexAttrib3fv", - "vertexAttrib4f", - "vertexAttrib4fv", - "vertexAttribDivisor", - "vertexAttribDivisorANGLE", - "vertexAttribI4i", - "vertexAttribI4iv", - "vertexAttribI4ui", - "vertexAttribI4uiv", - "vertexAttribIPointer", - "vertexAttribPointer", - "vertical", - "vertical-align", - "verticalAlign", - "verticalOverflow", - "vh", - "vibrate", - "vibrationActuator", - "videoBitsPerSecond", - "videoHeight", - "videoTracks", - "videoWidth", - "view", - "viewBox", - "viewBoxString", - "viewTarget", - "viewTargetString", - "viewport", - "viewportAnchorX", - "viewportAnchorY", - "viewportElement", - "views", - "violatedDirective", - "visibility", - "visibilityState", - "visible", - "visualViewport", - "vlinkColor", - "vmax", - "vmin", - "voice", - "voiceURI", - "volume", - "vrml", - "vspace", - "vw", - "w", - "wait", - "waitSync", - "waiting", - "wake", - "wakeLock", - "wand", - "warn", - "wasClean", - "wasDiscarded", - "watch", - "watchAvailability", - "watchPosition", - "webdriver", - "webkitAddKey", - "webkitAlignContent", - "webkitAlignItems", - "webkitAlignSelf", - "webkitAnimation", - "webkitAnimationDelay", - "webkitAnimationDirection", - "webkitAnimationDuration", - "webkitAnimationFillMode", - "webkitAnimationIterationCount", - "webkitAnimationName", - "webkitAnimationPlayState", - "webkitAnimationTimingFunction", - "webkitAppearance", - "webkitAudioContext", - "webkitAudioDecodedByteCount", - "webkitAudioPannerNode", - "webkitBackfaceVisibility", - "webkitBackground", - "webkitBackgroundAttachment", - "webkitBackgroundClip", - "webkitBackgroundColor", - "webkitBackgroundImage", - "webkitBackgroundOrigin", - "webkitBackgroundPosition", - "webkitBackgroundPositionX", - "webkitBackgroundPositionY", - "webkitBackgroundRepeat", - "webkitBackgroundSize", - "webkitBackingStorePixelRatio", - "webkitBorderBottomLeftRadius", - "webkitBorderBottomRightRadius", - "webkitBorderImage", - "webkitBorderImageOutset", - "webkitBorderImageRepeat", - "webkitBorderImageSlice", - "webkitBorderImageSource", - "webkitBorderImageWidth", - "webkitBorderRadius", - "webkitBorderTopLeftRadius", - "webkitBorderTopRightRadius", - "webkitBoxAlign", - "webkitBoxDirection", - "webkitBoxFlex", - "webkitBoxOrdinalGroup", - "webkitBoxOrient", - "webkitBoxPack", - "webkitBoxShadow", - "webkitBoxSizing", - "webkitCancelAnimationFrame", - "webkitCancelFullScreen", - "webkitCancelKeyRequest", - "webkitCancelRequestAnimationFrame", - "webkitClearResourceTimings", - "webkitClosedCaptionsVisible", - "webkitConvertPointFromNodeToPage", - "webkitConvertPointFromPageToNode", - "webkitCreateShadowRoot", - "webkitCurrentFullScreenElement", - "webkitCurrentPlaybackTargetIsWireless", - "webkitDecodedFrameCount", - "webkitDirectionInvertedFromDevice", - "webkitDisplayingFullscreen", - "webkitDroppedFrameCount", - "webkitEnterFullScreen", - "webkitEnterFullscreen", - "webkitEntries", - "webkitExitFullScreen", - "webkitExitFullscreen", - "webkitExitPointerLock", - "webkitFilter", - "webkitFlex", - "webkitFlexBasis", - "webkitFlexDirection", - "webkitFlexFlow", - "webkitFlexGrow", - "webkitFlexShrink", - "webkitFlexWrap", - "webkitFullScreenKeyboardInputAllowed", - "webkitFullscreenElement", - "webkitFullscreenEnabled", - "webkitGenerateKeyRequest", - "webkitGetAsEntry", - "webkitGetDatabaseNames", - "webkitGetEntries", - "webkitGetEntriesByName", - "webkitGetEntriesByType", - "webkitGetFlowByName", - "webkitGetGamepads", - "webkitGetImageDataHD", - "webkitGetNamedFlows", - "webkitGetRegionFlowRanges", - "webkitGetUserMedia", - "webkitHasClosedCaptions", - "webkitHidden", - "webkitIDBCursor", - "webkitIDBDatabase", - "webkitIDBDatabaseError", - "webkitIDBDatabaseException", - "webkitIDBFactory", - "webkitIDBIndex", - "webkitIDBKeyRange", - "webkitIDBObjectStore", - "webkitIDBRequest", - "webkitIDBTransaction", - "webkitImageSmoothingEnabled", - "webkitIndexedDB", - "webkitInitMessageEvent", - "webkitIsFullScreen", - "webkitJustifyContent", - "webkitKeys", - "webkitLineClamp", - "webkitLineDashOffset", - "webkitLockOrientation", - "webkitMask", - "webkitMaskClip", - "webkitMaskComposite", - "webkitMaskImage", - "webkitMaskOrigin", - "webkitMaskPosition", - "webkitMaskPositionX", - "webkitMaskPositionY", - "webkitMaskRepeat", - "webkitMaskSize", - "webkitMatchesSelector", - "webkitMediaStream", - "webkitNotifications", - "webkitOfflineAudioContext", - "webkitOrder", - "webkitOrientation", - "webkitPeerConnection00", - "webkitPersistentStorage", - "webkitPerspective", - "webkitPerspectiveOrigin", - "webkitPointerLockElement", - "webkitPostMessage", - "webkitPreservesPitch", - "webkitPutImageDataHD", - "webkitRTCPeerConnection", - "webkitRegionOverset", - "webkitRelativePath", - "webkitRequestAnimationFrame", - "webkitRequestFileSystem", - "webkitRequestFullScreen", - "webkitRequestFullscreen", - "webkitRequestPointerLock", - "webkitResolveLocalFileSystemURL", - "webkitSetMediaKeys", - "webkitSetResourceTimingBufferSize", - "webkitShadowRoot", - "webkitShowPlaybackTargetPicker", - "webkitSlice", - "webkitSpeechGrammar", - "webkitSpeechGrammarList", - "webkitSpeechRecognition", - "webkitSpeechRecognitionError", - "webkitSpeechRecognitionEvent", - "webkitStorageInfo", - "webkitSupportsFullscreen", - "webkitTemporaryStorage", - "webkitTextFillColor", - "webkitTextSizeAdjust", - "webkitTextStroke", - "webkitTextStrokeColor", - "webkitTextStrokeWidth", - "webkitTransform", - "webkitTransformOrigin", - "webkitTransformStyle", - "webkitTransition", - "webkitTransitionDelay", - "webkitTransitionDuration", - "webkitTransitionProperty", - "webkitTransitionTimingFunction", - "webkitURL", - "webkitUnlockOrientation", - "webkitUserSelect", - "webkitVideoDecodedByteCount", - "webkitVisibilityState", - "webkitWirelessVideoPlaybackDisabled", - "webkitdirectory", - "webkitdropzone", - "webstore", - "weight", - "whatToShow", - "wheelDelta", - "wheelDeltaX", - "wheelDeltaY", - "whenDefined", - "which", - "white-space", - "whiteSpace", - "wholeText", - "widows", - "width", - "will-change", - "willChange", - "willValidate", - "window", - "withCredentials", - "word-break", - "word-spacing", - "word-wrap", - "wordBreak", - "wordSpacing", - "wordWrap", - "workerStart", - "wrap", - "wrapKey", - "writable", - "writableAuxiliaries", - "write", - "writeText", - "writeValue", - "writeWithoutResponse", - "writeln", - "writing-mode", - "writingMode", - "x", - "x1", - "x2", - "xChannelSelector", - "xmlEncoding", - "xmlStandalone", - "xmlVersion", - "xmlbase", - "xmllang", - "xmlspace", - "xor", - "xr", - "y", - "y1", - "y2", - "yChannelSelector", - "yandex", - "z", - "z-index", - "zIndex", - "zoom", - "zoomAndPan", - "zoomRectScreen" -] \ No newline at end of file From 43884b8d81452c76313e24eb8020e2178a86a900 Mon Sep 17 00:00:00 2001 From: sanex Date: Thu, 3 Feb 2022 22:43:56 +0300 Subject: [PATCH 09/14] Revert "Moved dom-properties list" This reverts commit f3fc82953653ed867f5159a9451e499803d514b2. --- src/constants/DomProperties.ts | 7778 ----------------- .../replacer/RenamePropertiesReplacer.ts | 10 +- .../replacer/ReservedDomProperties.json | 7771 ++++++++++++++++ 3 files changed, 7779 insertions(+), 7780 deletions(-) delete mode 100644 src/constants/DomProperties.ts create mode 100644 src/node-transformers/rename-properties-transformers/replacer/ReservedDomProperties.json diff --git a/src/constants/DomProperties.ts b/src/constants/DomProperties.ts deleted file mode 100644 index 419529386..000000000 --- a/src/constants/DomProperties.ts +++ /dev/null @@ -1,7778 +0,0 @@ -/* eslint-disable max-lines */ -/** - * Properties list taken from `UglifyJS` and `terser` - * https://github.com/mishoo/UglifyJS/blob/master/tools/domprops.json - * https://github.com/terser/terser/blob/master/tools/domprops.js - * Copyright 2012-2018 (c) Mihai Bazon - */ -export const domProperties = [ - '$&', - '$\'', - '$*', - '$+', - '$1', - '$2', - '$3', - '$4', - '$5', - '$6', - '$7', - '$8', - '$9', - '$_', - '$`', - '$input', - '-moz-animation', - '-moz-animation-delay', - '-moz-animation-direction', - '-moz-animation-duration', - '-moz-animation-fill-mode', - '-moz-animation-iteration-count', - '-moz-animation-name', - '-moz-animation-play-state', - '-moz-animation-timing-function', - '-moz-appearance', - '-moz-backface-visibility', - '-moz-border-end', - '-moz-border-end-color', - '-moz-border-end-style', - '-moz-border-end-width', - '-moz-border-image', - '-moz-border-start', - '-moz-border-start-color', - '-moz-border-start-style', - '-moz-border-start-width', - '-moz-box-align', - '-moz-box-direction', - '-moz-box-flex', - '-moz-box-ordinal-group', - '-moz-box-orient', - '-moz-box-pack', - '-moz-box-sizing', - '-moz-float-edge', - '-moz-font-feature-settings', - '-moz-font-language-override', - '-moz-force-broken-image-icon', - '-moz-hyphens', - '-moz-image-region', - '-moz-margin-end', - '-moz-margin-start', - '-moz-orient', - '-moz-osx-font-smoothing', - '-moz-outline-radius', - '-moz-outline-radius-bottomleft', - '-moz-outline-radius-bottomright', - '-moz-outline-radius-topleft', - '-moz-outline-radius-topright', - '-moz-padding-end', - '-moz-padding-start', - '-moz-perspective', - '-moz-perspective-origin', - '-moz-tab-size', - '-moz-text-size-adjust', - '-moz-transform', - '-moz-transform-origin', - '-moz-transform-style', - '-moz-transition', - '-moz-transition-delay', - '-moz-transition-duration', - '-moz-transition-property', - '-moz-transition-timing-function', - '-moz-user-focus', - '-moz-user-input', - '-moz-user-modify', - '-moz-user-select', - '-moz-window-dragging', - '-webkit-align-content', - '-webkit-align-items', - '-webkit-align-self', - '-webkit-animation', - '-webkit-animation-delay', - '-webkit-animation-direction', - '-webkit-animation-duration', - '-webkit-animation-fill-mode', - '-webkit-animation-iteration-count', - '-webkit-animation-name', - '-webkit-animation-play-state', - '-webkit-animation-timing-function', - '-webkit-appearance', - '-webkit-backface-visibility', - '-webkit-background-clip', - '-webkit-background-origin', - '-webkit-background-size', - '-webkit-border-bottom-left-radius', - '-webkit-border-bottom-right-radius', - '-webkit-border-image', - '-webkit-border-radius', - '-webkit-border-top-left-radius', - '-webkit-border-top-right-radius', - '-webkit-box-align', - '-webkit-box-direction', - '-webkit-box-flex', - '-webkit-box-ordinal-group', - '-webkit-box-orient', - '-webkit-box-pack', - '-webkit-box-shadow', - '-webkit-box-sizing', - '-webkit-filter', - '-webkit-flex', - '-webkit-flex-basis', - '-webkit-flex-direction', - '-webkit-flex-flow', - '-webkit-flex-grow', - '-webkit-flex-shrink', - '-webkit-flex-wrap', - '-webkit-justify-content', - '-webkit-line-clamp', - '-webkit-mask', - '-webkit-mask-clip', - '-webkit-mask-composite', - '-webkit-mask-image', - '-webkit-mask-origin', - '-webkit-mask-position', - '-webkit-mask-position-x', - '-webkit-mask-position-y', - '-webkit-mask-repeat', - '-webkit-mask-size', - '-webkit-order', - '-webkit-perspective', - '-webkit-perspective-origin', - '-webkit-text-fill-color', - '-webkit-text-size-adjust', - '-webkit-text-stroke', - '-webkit-text-stroke-color', - '-webkit-text-stroke-width', - '-webkit-transform', - '-webkit-transform-origin', - '-webkit-transform-style', - '-webkit-transition', - '-webkit-transition-delay', - '-webkit-transition-duration', - '-webkit-transition-property', - '-webkit-transition-timing-function', - '-webkit-user-select', - '0', - '1', - '10', - '11', - '12', - '13', - '14', - '15', - '16', - '17', - '18', - '19', - '2', - '20', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - '@@iterator', - 'ABORT_ERR', - 'ACTIVE', - 'ACTIVE_ATTRIBUTES', - 'ACTIVE_TEXTURE', - 'ACTIVE_UNIFORMS', - 'ACTIVE_UNIFORM_BLOCKS', - 'ADDITION', - 'ALIASED_LINE_WIDTH_RANGE', - 'ALIASED_POINT_SIZE_RANGE', - 'ALLOW_KEYBOARD_INPUT', - 'ALLPASS', - 'ALPHA', - 'ALPHA_BITS', - 'ALREADY_SIGNALED', - 'ALT_MASK', - 'ALWAYS', - 'ANY_SAMPLES_PASSED', - 'ANY_SAMPLES_PASSED_CONSERVATIVE', - 'ANY_TYPE', - 'ANY_UNORDERED_NODE_TYPE', - 'ARRAY_BUFFER', - 'ARRAY_BUFFER_BINDING', - 'ATTACHED_SHADERS', - 'ATTRIBUTE_NODE', - 'AT_TARGET', - 'AbortController', - 'AbortSignal', - 'AbsoluteOrientationSensor', - 'AbstractRange', - 'Accelerometer', - 'AddSearchProvider', - 'AggregateError', - 'AnalyserNode', - 'Animation', - 'AnimationEffect', - 'AnimationEvent', - 'AnimationPlaybackEvent', - 'AnimationTimeline', - 'AnonXMLHttpRequest', - 'Any', - 'ApplicationCache', - 'ApplicationCacheErrorEvent', - 'Array', - 'ArrayBuffer', - 'ArrayType', - 'Atomics', - 'Attr', - 'Audio', - 'AudioBuffer', - 'AudioBufferSourceNode', - 'AudioContext', - 'AudioDestinationNode', - 'AudioListener', - 'AudioNode', - 'AudioParam', - 'AudioParamMap', - 'AudioProcessingEvent', - 'AudioScheduledSourceNode', - 'AudioStreamTrack', - 'AudioWorklet', - 'AudioWorkletNode', - 'AuthenticatorAssertionResponse', - 'AuthenticatorAttestationResponse', - 'AuthenticatorResponse', - 'AutocompleteErrorEvent', - 'BACK', - 'BAD_BOUNDARYPOINTS_ERR', - 'BAD_REQUEST', - 'BANDPASS', - 'BLEND', - 'BLEND_COLOR', - 'BLEND_DST_ALPHA', - 'BLEND_DST_RGB', - 'BLEND_EQUATION', - 'BLEND_EQUATION_ALPHA', - 'BLEND_EQUATION_RGB', - 'BLEND_SRC_ALPHA', - 'BLEND_SRC_RGB', - 'BLUE_BITS', - 'BLUR', - 'BOOL', - 'BOOLEAN_TYPE', - 'BOOL_VEC2', - 'BOOL_VEC3', - 'BOOL_VEC4', - 'BOTH', - 'BROWSER_DEFAULT_WEBGL', - 'BUBBLING_PHASE', - 'BUFFER_SIZE', - 'BUFFER_USAGE', - 'BYTE', - 'BYTES_PER_ELEMENT', - 'BackgroundFetchManager', - 'BackgroundFetchRecord', - 'BackgroundFetchRegistration', - 'BarProp', - 'BarcodeDetector', - 'BaseAudioContext', - 'BaseHref', - 'BatteryManager', - 'BeforeInstallPromptEvent', - 'BeforeLoadEvent', - 'BeforeUnloadEvent', - 'BigInt', - 'BigInt64Array', - 'BigUint64Array', - 'BiquadFilterNode', - 'Blob', - 'BlobEvent', - 'Bluetooth', - 'BluetoothCharacteristicProperties', - 'BluetoothDevice', - 'BluetoothRemoteGATTCharacteristic', - 'BluetoothRemoteGATTDescriptor', - 'BluetoothRemoteGATTServer', - 'BluetoothRemoteGATTService', - 'BluetoothUUID', - 'Boolean', - 'BroadcastChannel', - 'ByteLengthQueuingStrategy', - 'CAPTURING_PHASE', - 'CCW', - 'CDATASection', - 'CDATA_SECTION_NODE', - 'CHANGE', - 'CHARSET_RULE', - 'CHECKING', - 'CLAMP_TO_EDGE', - 'CLICK', - 'CLOSED', - 'CLOSING', - 'COLOR', - 'COLOR_ATTACHMENT0', - 'COLOR_ATTACHMENT1', - 'COLOR_ATTACHMENT10', - 'COLOR_ATTACHMENT11', - 'COLOR_ATTACHMENT12', - 'COLOR_ATTACHMENT13', - 'COLOR_ATTACHMENT14', - 'COLOR_ATTACHMENT15', - 'COLOR_ATTACHMENT2', - 'COLOR_ATTACHMENT3', - 'COLOR_ATTACHMENT4', - 'COLOR_ATTACHMENT5', - 'COLOR_ATTACHMENT6', - 'COLOR_ATTACHMENT7', - 'COLOR_ATTACHMENT8', - 'COLOR_ATTACHMENT9', - 'COLOR_BUFFER_BIT', - 'COLOR_CLEAR_VALUE', - 'COLOR_WRITEMASK', - 'COMMENT_NODE', - 'COMPARE_REF_TO_TEXTURE', - 'COMPILE_STATUS', - 'COMPRESSED_RGBA_S3TC_DXT1_EXT', - 'COMPRESSED_RGBA_S3TC_DXT3_EXT', - 'COMPRESSED_RGBA_S3TC_DXT5_EXT', - 'COMPRESSED_RGB_S3TC_DXT1_EXT', - 'COMPRESSED_TEXTURE_FORMATS', - 'CONDITION_SATISFIED', - 'CONFIGURATION_UNSUPPORTED', - 'CONNECTING', - 'CONSTANT_ALPHA', - 'CONSTANT_COLOR', - 'CONSTRAINT_ERR', - 'CONTEXT_LOST_WEBGL', - 'CONTROL_MASK', - 'COPY_READ_BUFFER', - 'COPY_READ_BUFFER_BINDING', - 'COPY_WRITE_BUFFER', - 'COPY_WRITE_BUFFER_BINDING', - 'COUNTER_STYLE_RULE', - 'CSS', - 'CSS2Properties', - 'CSSAnimation', - 'CSSCharsetRule', - 'CSSConditionRule', - 'CSSCounterStyleRule', - 'CSSFontFaceRule', - 'CSSFontFeatureValuesRule', - 'CSSGroupingRule', - 'CSSImageValue', - 'CSSImportRule', - 'CSSKeyframeRule', - 'CSSKeyframesRule', - 'CSSKeywordValue', - 'CSSMathInvert', - 'CSSMathMax', - 'CSSMathMin', - 'CSSMathNegate', - 'CSSMathProduct', - 'CSSMathSum', - 'CSSMathValue', - 'CSSMatrixComponent', - 'CSSMediaRule', - 'CSSMozDocumentRule', - 'CSSNameSpaceRule', - 'CSSNamespaceRule', - 'CSSNumericArray', - 'CSSNumericValue', - 'CSSPageRule', - 'CSSPerspective', - 'CSSPositionValue', - 'CSSPrimitiveValue', - 'CSSRotate', - 'CSSRule', - 'CSSRuleList', - 'CSSScale', - 'CSSSkew', - 'CSSSkewX', - 'CSSSkewY', - 'CSSStyleDeclaration', - 'CSSStyleRule', - 'CSSStyleSheet', - 'CSSStyleValue', - 'CSSSupportsRule', - 'CSSTransformComponent', - 'CSSTransformValue', - 'CSSTransition', - 'CSSTranslate', - 'CSSUnitValue', - 'CSSUnknownRule', - 'CSSUnparsedValue', - 'CSSValue', - 'CSSValueList', - 'CSSVariableReferenceValue', - 'CSSVariablesDeclaration', - 'CSSVariablesRule', - 'CSSViewportRule', - 'CSS_ATTR', - 'CSS_CM', - 'CSS_COUNTER', - 'CSS_CUSTOM', - 'CSS_DEG', - 'CSS_DIMENSION', - 'CSS_EMS', - 'CSS_EXS', - 'CSS_FILTER_BLUR', - 'CSS_FILTER_BRIGHTNESS', - 'CSS_FILTER_CONTRAST', - 'CSS_FILTER_CUSTOM', - 'CSS_FILTER_DROP_SHADOW', - 'CSS_FILTER_GRAYSCALE', - 'CSS_FILTER_HUE_ROTATE', - 'CSS_FILTER_INVERT', - 'CSS_FILTER_OPACITY', - 'CSS_FILTER_REFERENCE', - 'CSS_FILTER_SATURATE', - 'CSS_FILTER_SEPIA', - 'CSS_GRAD', - 'CSS_HZ', - 'CSS_IDENT', - 'CSS_IN', - 'CSS_INHERIT', - 'CSS_KHZ', - 'CSS_MATRIX', - 'CSS_MATRIX3D', - 'CSS_MM', - 'CSS_MS', - 'CSS_NUMBER', - 'CSS_PC', - 'CSS_PERCENTAGE', - 'CSS_PERSPECTIVE', - 'CSS_PRIMITIVE_VALUE', - 'CSS_PT', - 'CSS_PX', - 'CSS_RAD', - 'CSS_RECT', - 'CSS_RGBCOLOR', - 'CSS_ROTATE', - 'CSS_ROTATE3D', - 'CSS_ROTATEX', - 'CSS_ROTATEY', - 'CSS_ROTATEZ', - 'CSS_S', - 'CSS_SCALE', - 'CSS_SCALE3D', - 'CSS_SCALEX', - 'CSS_SCALEY', - 'CSS_SCALEZ', - 'CSS_SKEW', - 'CSS_SKEWX', - 'CSS_SKEWY', - 'CSS_STRING', - 'CSS_TRANSLATE', - 'CSS_TRANSLATE3D', - 'CSS_TRANSLATEX', - 'CSS_TRANSLATEY', - 'CSS_TRANSLATEZ', - 'CSS_UNKNOWN', - 'CSS_URI', - 'CSS_VALUE_LIST', - 'CSS_VH', - 'CSS_VMAX', - 'CSS_VMIN', - 'CSS_VW', - 'CULL_FACE', - 'CULL_FACE_MODE', - 'CURRENT_PROGRAM', - 'CURRENT_QUERY', - 'CURRENT_VERTEX_ATTRIB', - 'CUSTOM', - 'CW', - 'Cache', - 'CacheStorage', - 'CanvasCaptureMediaStream', - 'CanvasCaptureMediaStreamTrack', - 'CanvasGradient', - 'CanvasPattern', - 'CanvasRenderingContext2D', - 'CaretPosition', - 'ChannelMergerNode', - 'ChannelSplitterNode', - 'CharacterData', - 'ClientRect', - 'ClientRectList', - 'Clipboard', - 'ClipboardEvent', - 'ClipboardItem', - 'CloseEvent', - 'Collator', - 'CommandEvent', - 'Comment', - 'CompileError', - 'CompositionEvent', - 'CompressionStream', - 'Console', - 'ConstantSourceNode', - 'Controllers', - 'ConvolverNode', - 'CountQueuingStrategy', - 'Counter', - 'Credential', - 'CredentialsContainer', - 'Crypto', - 'CryptoKey', - 'CustomElementRegistry', - 'CustomEvent', - 'DATABASE_ERR', - 'DATA_CLONE_ERR', - 'DATA_ERR', - 'DBLCLICK', - 'DECR', - 'DECR_WRAP', - 'DELETE_STATUS', - 'DEPTH', - 'DEPTH24_STENCIL8', - 'DEPTH32F_STENCIL8', - 'DEPTH_ATTACHMENT', - 'DEPTH_BITS', - 'DEPTH_BUFFER_BIT', - 'DEPTH_CLEAR_VALUE', - 'DEPTH_COMPONENT', - 'DEPTH_COMPONENT16', - 'DEPTH_COMPONENT24', - 'DEPTH_COMPONENT32F', - 'DEPTH_FUNC', - 'DEPTH_RANGE', - 'DEPTH_STENCIL', - 'DEPTH_STENCIL_ATTACHMENT', - 'DEPTH_TEST', - 'DEPTH_WRITEMASK', - 'DEVICE_INELIGIBLE', - 'DIRECTION_DOWN', - 'DIRECTION_LEFT', - 'DIRECTION_RIGHT', - 'DIRECTION_UP', - 'DISABLED', - 'DISPATCH_REQUEST_ERR', - 'DITHER', - 'DOCUMENT_FRAGMENT_NODE', - 'DOCUMENT_NODE', - 'DOCUMENT_POSITION_CONTAINED_BY', - 'DOCUMENT_POSITION_CONTAINS', - 'DOCUMENT_POSITION_DISCONNECTED', - 'DOCUMENT_POSITION_FOLLOWING', - 'DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC', - 'DOCUMENT_POSITION_PRECEDING', - 'DOCUMENT_TYPE_NODE', - 'DOMCursor', - 'DOMError', - 'DOMException', - 'DOMImplementation', - 'DOMImplementationLS', - 'DOMMatrix', - 'DOMMatrixReadOnly', - 'DOMParser', - 'DOMPoint', - 'DOMPointReadOnly', - 'DOMQuad', - 'DOMRect', - 'DOMRectList', - 'DOMRectReadOnly', - 'DOMRequest', - 'DOMSTRING_SIZE_ERR', - 'DOMSettableTokenList', - 'DOMStringList', - 'DOMStringMap', - 'DOMTokenList', - 'DOMTransactionEvent', - 'DOM_DELTA_LINE', - 'DOM_DELTA_PAGE', - 'DOM_DELTA_PIXEL', - 'DOM_INPUT_METHOD_DROP', - 'DOM_INPUT_METHOD_HANDWRITING', - 'DOM_INPUT_METHOD_IME', - 'DOM_INPUT_METHOD_KEYBOARD', - 'DOM_INPUT_METHOD_MULTIMODAL', - 'DOM_INPUT_METHOD_OPTION', - 'DOM_INPUT_METHOD_PASTE', - 'DOM_INPUT_METHOD_SCRIPT', - 'DOM_INPUT_METHOD_UNKNOWN', - 'DOM_INPUT_METHOD_VOICE', - 'DOM_KEY_LOCATION_JOYSTICK', - 'DOM_KEY_LOCATION_LEFT', - 'DOM_KEY_LOCATION_MOBILE', - 'DOM_KEY_LOCATION_NUMPAD', - 'DOM_KEY_LOCATION_RIGHT', - 'DOM_KEY_LOCATION_STANDARD', - 'DOM_VK_0', - 'DOM_VK_1', - 'DOM_VK_2', - 'DOM_VK_3', - 'DOM_VK_4', - 'DOM_VK_5', - 'DOM_VK_6', - 'DOM_VK_7', - 'DOM_VK_8', - 'DOM_VK_9', - 'DOM_VK_A', - 'DOM_VK_ACCEPT', - 'DOM_VK_ADD', - 'DOM_VK_ALT', - 'DOM_VK_ALTGR', - 'DOM_VK_AMPERSAND', - 'DOM_VK_ASTERISK', - 'DOM_VK_AT', - 'DOM_VK_ATTN', - 'DOM_VK_B', - 'DOM_VK_BACKSPACE', - 'DOM_VK_BACK_QUOTE', - 'DOM_VK_BACK_SLASH', - 'DOM_VK_BACK_SPACE', - 'DOM_VK_C', - 'DOM_VK_CANCEL', - 'DOM_VK_CAPS_LOCK', - 'DOM_VK_CIRCUMFLEX', - 'DOM_VK_CLEAR', - 'DOM_VK_CLOSE_BRACKET', - 'DOM_VK_CLOSE_CURLY_BRACKET', - 'DOM_VK_CLOSE_PAREN', - 'DOM_VK_COLON', - 'DOM_VK_COMMA', - 'DOM_VK_CONTEXT_MENU', - 'DOM_VK_CONTROL', - 'DOM_VK_CONVERT', - 'DOM_VK_CRSEL', - 'DOM_VK_CTRL', - 'DOM_VK_D', - 'DOM_VK_DECIMAL', - 'DOM_VK_DELETE', - 'DOM_VK_DIVIDE', - 'DOM_VK_DOLLAR', - 'DOM_VK_DOUBLE_QUOTE', - 'DOM_VK_DOWN', - 'DOM_VK_E', - 'DOM_VK_EISU', - 'DOM_VK_END', - 'DOM_VK_ENTER', - 'DOM_VK_EQUALS', - 'DOM_VK_EREOF', - 'DOM_VK_ESCAPE', - 'DOM_VK_EXCLAMATION', - 'DOM_VK_EXECUTE', - 'DOM_VK_EXSEL', - 'DOM_VK_F', - 'DOM_VK_F1', - 'DOM_VK_F10', - 'DOM_VK_F11', - 'DOM_VK_F12', - 'DOM_VK_F13', - 'DOM_VK_F14', - 'DOM_VK_F15', - 'DOM_VK_F16', - 'DOM_VK_F17', - 'DOM_VK_F18', - 'DOM_VK_F19', - 'DOM_VK_F2', - 'DOM_VK_F20', - 'DOM_VK_F21', - 'DOM_VK_F22', - 'DOM_VK_F23', - 'DOM_VK_F24', - 'DOM_VK_F25', - 'DOM_VK_F26', - 'DOM_VK_F27', - 'DOM_VK_F28', - 'DOM_VK_F29', - 'DOM_VK_F3', - 'DOM_VK_F30', - 'DOM_VK_F31', - 'DOM_VK_F32', - 'DOM_VK_F33', - 'DOM_VK_F34', - 'DOM_VK_F35', - 'DOM_VK_F36', - 'DOM_VK_F4', - 'DOM_VK_F5', - 'DOM_VK_F6', - 'DOM_VK_F7', - 'DOM_VK_F8', - 'DOM_VK_F9', - 'DOM_VK_FINAL', - 'DOM_VK_FRONT', - 'DOM_VK_G', - 'DOM_VK_GREATER_THAN', - 'DOM_VK_H', - 'DOM_VK_HANGUL', - 'DOM_VK_HANJA', - 'DOM_VK_HASH', - 'DOM_VK_HELP', - 'DOM_VK_HK_TOGGLE', - 'DOM_VK_HOME', - 'DOM_VK_HYPHEN_MINUS', - 'DOM_VK_I', - 'DOM_VK_INSERT', - 'DOM_VK_J', - 'DOM_VK_JUNJA', - 'DOM_VK_K', - 'DOM_VK_KANA', - 'DOM_VK_KANJI', - 'DOM_VK_L', - 'DOM_VK_LEFT', - 'DOM_VK_LEFT_TAB', - 'DOM_VK_LESS_THAN', - 'DOM_VK_M', - 'DOM_VK_META', - 'DOM_VK_MODECHANGE', - 'DOM_VK_MULTIPLY', - 'DOM_VK_N', - 'DOM_VK_NONCONVERT', - 'DOM_VK_NUMPAD0', - 'DOM_VK_NUMPAD1', - 'DOM_VK_NUMPAD2', - 'DOM_VK_NUMPAD3', - 'DOM_VK_NUMPAD4', - 'DOM_VK_NUMPAD5', - 'DOM_VK_NUMPAD6', - 'DOM_VK_NUMPAD7', - 'DOM_VK_NUMPAD8', - 'DOM_VK_NUMPAD9', - 'DOM_VK_NUM_LOCK', - 'DOM_VK_O', - 'DOM_VK_OEM_1', - 'DOM_VK_OEM_102', - 'DOM_VK_OEM_2', - 'DOM_VK_OEM_3', - 'DOM_VK_OEM_4', - 'DOM_VK_OEM_5', - 'DOM_VK_OEM_6', - 'DOM_VK_OEM_7', - 'DOM_VK_OEM_8', - 'DOM_VK_OEM_COMMA', - 'DOM_VK_OEM_MINUS', - 'DOM_VK_OEM_PERIOD', - 'DOM_VK_OEM_PLUS', - 'DOM_VK_OPEN_BRACKET', - 'DOM_VK_OPEN_CURLY_BRACKET', - 'DOM_VK_OPEN_PAREN', - 'DOM_VK_P', - 'DOM_VK_PA1', - 'DOM_VK_PAGEDOWN', - 'DOM_VK_PAGEUP', - 'DOM_VK_PAGE_DOWN', - 'DOM_VK_PAGE_UP', - 'DOM_VK_PAUSE', - 'DOM_VK_PERCENT', - 'DOM_VK_PERIOD', - 'DOM_VK_PIPE', - 'DOM_VK_PLAY', - 'DOM_VK_PLUS', - 'DOM_VK_PRINT', - 'DOM_VK_PRINTSCREEN', - 'DOM_VK_PROCESSKEY', - 'DOM_VK_PROPERITES', - 'DOM_VK_Q', - 'DOM_VK_QUESTION_MARK', - 'DOM_VK_QUOTE', - 'DOM_VK_R', - 'DOM_VK_REDO', - 'DOM_VK_RETURN', - 'DOM_VK_RIGHT', - 'DOM_VK_S', - 'DOM_VK_SCROLL_LOCK', - 'DOM_VK_SELECT', - 'DOM_VK_SEMICOLON', - 'DOM_VK_SEPARATOR', - 'DOM_VK_SHIFT', - 'DOM_VK_SLASH', - 'DOM_VK_SLEEP', - 'DOM_VK_SPACE', - 'DOM_VK_SUBTRACT', - 'DOM_VK_T', - 'DOM_VK_TAB', - 'DOM_VK_TILDE', - 'DOM_VK_U', - 'DOM_VK_UNDERSCORE', - 'DOM_VK_UNDO', - 'DOM_VK_UNICODE', - 'DOM_VK_UP', - 'DOM_VK_V', - 'DOM_VK_VOLUME_DOWN', - 'DOM_VK_VOLUME_MUTE', - 'DOM_VK_VOLUME_UP', - 'DOM_VK_W', - 'DOM_VK_WIN', - 'DOM_VK_WINDOW', - 'DOM_VK_WIN_ICO_00', - 'DOM_VK_WIN_ICO_CLEAR', - 'DOM_VK_WIN_ICO_HELP', - 'DOM_VK_WIN_OEM_ATTN', - 'DOM_VK_WIN_OEM_AUTO', - 'DOM_VK_WIN_OEM_BACKTAB', - 'DOM_VK_WIN_OEM_CLEAR', - 'DOM_VK_WIN_OEM_COPY', - 'DOM_VK_WIN_OEM_CUSEL', - 'DOM_VK_WIN_OEM_ENLW', - 'DOM_VK_WIN_OEM_FINISH', - 'DOM_VK_WIN_OEM_FJ_JISHO', - 'DOM_VK_WIN_OEM_FJ_LOYA', - 'DOM_VK_WIN_OEM_FJ_MASSHOU', - 'DOM_VK_WIN_OEM_FJ_ROYA', - 'DOM_VK_WIN_OEM_FJ_TOUROKU', - 'DOM_VK_WIN_OEM_JUMP', - 'DOM_VK_WIN_OEM_PA1', - 'DOM_VK_WIN_OEM_PA2', - 'DOM_VK_WIN_OEM_PA3', - 'DOM_VK_WIN_OEM_RESET', - 'DOM_VK_WIN_OEM_WSCTRL', - 'DOM_VK_X', - 'DOM_VK_XF86XK_ADD_FAVORITE', - 'DOM_VK_XF86XK_APPLICATION_LEFT', - 'DOM_VK_XF86XK_APPLICATION_RIGHT', - 'DOM_VK_XF86XK_AUDIO_CYCLE_TRACK', - 'DOM_VK_XF86XK_AUDIO_FORWARD', - 'DOM_VK_XF86XK_AUDIO_LOWER_VOLUME', - 'DOM_VK_XF86XK_AUDIO_MEDIA', - 'DOM_VK_XF86XK_AUDIO_MUTE', - 'DOM_VK_XF86XK_AUDIO_NEXT', - 'DOM_VK_XF86XK_AUDIO_PAUSE', - 'DOM_VK_XF86XK_AUDIO_PLAY', - 'DOM_VK_XF86XK_AUDIO_PREV', - 'DOM_VK_XF86XK_AUDIO_RAISE_VOLUME', - 'DOM_VK_XF86XK_AUDIO_RANDOM_PLAY', - 'DOM_VK_XF86XK_AUDIO_RECORD', - 'DOM_VK_XF86XK_AUDIO_REPEAT', - 'DOM_VK_XF86XK_AUDIO_REWIND', - 'DOM_VK_XF86XK_AUDIO_STOP', - 'DOM_VK_XF86XK_AWAY', - 'DOM_VK_XF86XK_BACK', - 'DOM_VK_XF86XK_BACK_FORWARD', - 'DOM_VK_XF86XK_BATTERY', - 'DOM_VK_XF86XK_BLUE', - 'DOM_VK_XF86XK_BLUETOOTH', - 'DOM_VK_XF86XK_BOOK', - 'DOM_VK_XF86XK_BRIGHTNESS_ADJUST', - 'DOM_VK_XF86XK_CALCULATOR', - 'DOM_VK_XF86XK_CALENDAR', - 'DOM_VK_XF86XK_CD', - 'DOM_VK_XF86XK_CLOSE', - 'DOM_VK_XF86XK_COMMUNITY', - 'DOM_VK_XF86XK_CONTRAST_ADJUST', - 'DOM_VK_XF86XK_COPY', - 'DOM_VK_XF86XK_CUT', - 'DOM_VK_XF86XK_CYCLE_ANGLE', - 'DOM_VK_XF86XK_DISPLAY', - 'DOM_VK_XF86XK_DOCUMENTS', - 'DOM_VK_XF86XK_DOS', - 'DOM_VK_XF86XK_EJECT', - 'DOM_VK_XF86XK_EXCEL', - 'DOM_VK_XF86XK_EXPLORER', - 'DOM_VK_XF86XK_FAVORITES', - 'DOM_VK_XF86XK_FINANCE', - 'DOM_VK_XF86XK_FORWARD', - 'DOM_VK_XF86XK_FRAME_BACK', - 'DOM_VK_XF86XK_FRAME_FORWARD', - 'DOM_VK_XF86XK_GAME', - 'DOM_VK_XF86XK_GO', - 'DOM_VK_XF86XK_GREEN', - 'DOM_VK_XF86XK_HIBERNATE', - 'DOM_VK_XF86XK_HISTORY', - 'DOM_VK_XF86XK_HOME_PAGE', - 'DOM_VK_XF86XK_HOT_LINKS', - 'DOM_VK_XF86XK_I_TOUCH', - 'DOM_VK_XF86XK_KBD_BRIGHTNESS_DOWN', - 'DOM_VK_XF86XK_KBD_BRIGHTNESS_UP', - 'DOM_VK_XF86XK_KBD_LIGHT_ON_OFF', - 'DOM_VK_XF86XK_LAUNCH0', - 'DOM_VK_XF86XK_LAUNCH1', - 'DOM_VK_XF86XK_LAUNCH2', - 'DOM_VK_XF86XK_LAUNCH3', - 'DOM_VK_XF86XK_LAUNCH4', - 'DOM_VK_XF86XK_LAUNCH5', - 'DOM_VK_XF86XK_LAUNCH6', - 'DOM_VK_XF86XK_LAUNCH7', - 'DOM_VK_XF86XK_LAUNCH8', - 'DOM_VK_XF86XK_LAUNCH9', - 'DOM_VK_XF86XK_LAUNCH_A', - 'DOM_VK_XF86XK_LAUNCH_B', - 'DOM_VK_XF86XK_LAUNCH_C', - 'DOM_VK_XF86XK_LAUNCH_D', - 'DOM_VK_XF86XK_LAUNCH_E', - 'DOM_VK_XF86XK_LAUNCH_F', - 'DOM_VK_XF86XK_LIGHT_BULB', - 'DOM_VK_XF86XK_LOG_OFF', - 'DOM_VK_XF86XK_MAIL', - 'DOM_VK_XF86XK_MAIL_FORWARD', - 'DOM_VK_XF86XK_MARKET', - 'DOM_VK_XF86XK_MEETING', - 'DOM_VK_XF86XK_MEMO', - 'DOM_VK_XF86XK_MENU_KB', - 'DOM_VK_XF86XK_MENU_PB', - 'DOM_VK_XF86XK_MESSENGER', - 'DOM_VK_XF86XK_MON_BRIGHTNESS_DOWN', - 'DOM_VK_XF86XK_MON_BRIGHTNESS_UP', - 'DOM_VK_XF86XK_MUSIC', - 'DOM_VK_XF86XK_MY_COMPUTER', - 'DOM_VK_XF86XK_MY_SITES', - 'DOM_VK_XF86XK_NEW', - 'DOM_VK_XF86XK_NEWS', - 'DOM_VK_XF86XK_OFFICE_HOME', - 'DOM_VK_XF86XK_OPEN', - 'DOM_VK_XF86XK_OPEN_URL', - 'DOM_VK_XF86XK_OPTION', - 'DOM_VK_XF86XK_PASTE', - 'DOM_VK_XF86XK_PHONE', - 'DOM_VK_XF86XK_PICTURES', - 'DOM_VK_XF86XK_POWER_DOWN', - 'DOM_VK_XF86XK_POWER_OFF', - 'DOM_VK_XF86XK_RED', - 'DOM_VK_XF86XK_REFRESH', - 'DOM_VK_XF86XK_RELOAD', - 'DOM_VK_XF86XK_REPLY', - 'DOM_VK_XF86XK_ROCKER_DOWN', - 'DOM_VK_XF86XK_ROCKER_ENTER', - 'DOM_VK_XF86XK_ROCKER_UP', - 'DOM_VK_XF86XK_ROTATE_WINDOWS', - 'DOM_VK_XF86XK_ROTATION_KB', - 'DOM_VK_XF86XK_ROTATION_PB', - 'DOM_VK_XF86XK_SAVE', - 'DOM_VK_XF86XK_SCREEN_SAVER', - 'DOM_VK_XF86XK_SCROLL_CLICK', - 'DOM_VK_XF86XK_SCROLL_DOWN', - 'DOM_VK_XF86XK_SCROLL_UP', - 'DOM_VK_XF86XK_SEARCH', - 'DOM_VK_XF86XK_SEND', - 'DOM_VK_XF86XK_SHOP', - 'DOM_VK_XF86XK_SPELL', - 'DOM_VK_XF86XK_SPLIT_SCREEN', - 'DOM_VK_XF86XK_STANDBY', - 'DOM_VK_XF86XK_START', - 'DOM_VK_XF86XK_STOP', - 'DOM_VK_XF86XK_SUBTITLE', - 'DOM_VK_XF86XK_SUPPORT', - 'DOM_VK_XF86XK_SUSPEND', - 'DOM_VK_XF86XK_TASK_PANE', - 'DOM_VK_XF86XK_TERMINAL', - 'DOM_VK_XF86XK_TIME', - 'DOM_VK_XF86XK_TOOLS', - 'DOM_VK_XF86XK_TOP_MENU', - 'DOM_VK_XF86XK_TO_DO_LIST', - 'DOM_VK_XF86XK_TRAVEL', - 'DOM_VK_XF86XK_USER1KB', - 'DOM_VK_XF86XK_USER2KB', - 'DOM_VK_XF86XK_USER_PB', - 'DOM_VK_XF86XK_UWB', - 'DOM_VK_XF86XK_VENDOR_HOME', - 'DOM_VK_XF86XK_VIDEO', - 'DOM_VK_XF86XK_VIEW', - 'DOM_VK_XF86XK_WAKE_UP', - 'DOM_VK_XF86XK_WEB_CAM', - 'DOM_VK_XF86XK_WHEEL_BUTTON', - 'DOM_VK_XF86XK_WLAN', - 'DOM_VK_XF86XK_WORD', - 'DOM_VK_XF86XK_WWW', - 'DOM_VK_XF86XK_XFER', - 'DOM_VK_XF86XK_YELLOW', - 'DOM_VK_XF86XK_ZOOM_IN', - 'DOM_VK_XF86XK_ZOOM_OUT', - 'DOM_VK_Y', - 'DOM_VK_Z', - 'DOM_VK_ZOOM', - 'DONE', - 'DONT_CARE', - 'DOWNLOADING', - 'DRAGDROP', - 'DRAW_BUFFER0', - 'DRAW_BUFFER1', - 'DRAW_BUFFER10', - 'DRAW_BUFFER11', - 'DRAW_BUFFER12', - 'DRAW_BUFFER13', - 'DRAW_BUFFER14', - 'DRAW_BUFFER15', - 'DRAW_BUFFER2', - 'DRAW_BUFFER3', - 'DRAW_BUFFER4', - 'DRAW_BUFFER5', - 'DRAW_BUFFER6', - 'DRAW_BUFFER7', - 'DRAW_BUFFER8', - 'DRAW_BUFFER9', - 'DRAW_FRAMEBUFFER', - 'DRAW_FRAMEBUFFER_BINDING', - 'DST_ALPHA', - 'DST_COLOR', - 'DYNAMIC_COPY', - 'DYNAMIC_DRAW', - 'DYNAMIC_READ', - 'DataChannel', - 'DataTransfer', - 'DataTransferItem', - 'DataTransferItemList', - 'DataView', - 'Date', - 'DateTimeFormat', - 'DecompressionStream', - 'DelayNode', - 'DeprecationReportBody', - 'DesktopNotification', - 'DesktopNotificationCenter', - 'DeviceLightEvent', - 'DeviceMotionEvent', - 'DeviceMotionEventAcceleration', - 'DeviceMotionEventRotationRate', - 'DeviceOrientationEvent', - 'DeviceProximityEvent', - 'DeviceStorage', - 'DeviceStorageChangeEvent', - 'Directory', - 'DisplayNames', - 'Document', - 'DocumentFragment', - 'DocumentTimeline', - 'DocumentType', - 'DragEvent', - 'DynamicsCompressorNode', - 'E', - 'ELEMENT_ARRAY_BUFFER', - 'ELEMENT_ARRAY_BUFFER_BINDING', - 'ELEMENT_NODE', - 'EMPTY', - 'ENCODING_ERR', - 'ENDED', - 'END_TO_END', - 'END_TO_START', - 'ENTITY_NODE', - 'ENTITY_REFERENCE_NODE', - 'EPSILON', - 'EQUAL', - 'EQUALPOWER', - 'ERROR', - 'EXPONENTIAL_DISTANCE', - 'Element', - 'ElementInternals', - 'ElementQuery', - 'EnterPictureInPictureEvent', - 'Entity', - 'EntityReference', - 'Error', - 'ErrorEvent', - 'EvalError', - 'Event', - 'EventException', - 'EventSource', - 'EventTarget', - 'External', - 'FASTEST', - 'FIDOSDK', - 'FILTER_ACCEPT', - 'FILTER_INTERRUPT', - 'FILTER_REJECT', - 'FILTER_SKIP', - 'FINISHED_STATE', - 'FIRST_ORDERED_NODE_TYPE', - 'FLOAT', - 'FLOAT_32_UNSIGNED_INT_24_8_REV', - 'FLOAT_MAT2', - 'FLOAT_MAT2x3', - 'FLOAT_MAT2x4', - 'FLOAT_MAT3', - 'FLOAT_MAT3x2', - 'FLOAT_MAT3x4', - 'FLOAT_MAT4', - 'FLOAT_MAT4x2', - 'FLOAT_MAT4x3', - 'FLOAT_VEC2', - 'FLOAT_VEC3', - 'FLOAT_VEC4', - 'FOCUS', - 'FONT_FACE_RULE', - 'FONT_FEATURE_VALUES_RULE', - 'FRAGMENT_SHADER', - 'FRAGMENT_SHADER_DERIVATIVE_HINT', - 'FRAGMENT_SHADER_DERIVATIVE_HINT_OES', - 'FRAMEBUFFER', - 'FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE', - 'FRAMEBUFFER_ATTACHMENT_BLUE_SIZE', - 'FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING', - 'FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE', - 'FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE', - 'FRAMEBUFFER_ATTACHMENT_GREEN_SIZE', - 'FRAMEBUFFER_ATTACHMENT_OBJECT_NAME', - 'FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE', - 'FRAMEBUFFER_ATTACHMENT_RED_SIZE', - 'FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE', - 'FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE', - 'FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER', - 'FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL', - 'FRAMEBUFFER_BINDING', - 'FRAMEBUFFER_COMPLETE', - 'FRAMEBUFFER_DEFAULT', - 'FRAMEBUFFER_INCOMPLETE_ATTACHMENT', - 'FRAMEBUFFER_INCOMPLETE_DIMENSIONS', - 'FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT', - 'FRAMEBUFFER_INCOMPLETE_MULTISAMPLE', - 'FRAMEBUFFER_UNSUPPORTED', - 'FRONT', - 'FRONT_AND_BACK', - 'FRONT_FACE', - 'FUNC_ADD', - 'FUNC_REVERSE_SUBTRACT', - 'FUNC_SUBTRACT', - 'FeaturePolicy', - 'FeaturePolicyViolationReportBody', - 'FederatedCredential', - 'Feed', - 'FeedEntry', - 'File', - 'FileError', - 'FileList', - 'FileReader', - 'FileSystem', - 'FileSystemDirectoryEntry', - 'FileSystemDirectoryReader', - 'FileSystemEntry', - 'FileSystemFileEntry', - 'FinalizationRegistry', - 'FindInPage', - 'Float32Array', - 'Float64Array', - 'FocusEvent', - 'FontFace', - 'FontFaceSet', - 'FontFaceSetLoadEvent', - 'FormData', - 'FormDataEvent', - 'FragmentDirective', - 'Function', - 'GENERATE_MIPMAP_HINT', - 'GEQUAL', - 'GREATER', - 'GREEN_BITS', - 'GainNode', - 'Gamepad', - 'GamepadAxisMoveEvent', - 'GamepadButton', - 'GamepadButtonEvent', - 'GamepadEvent', - 'GamepadHapticActuator', - 'GamepadPose', - 'Geolocation', - 'GeolocationCoordinates', - 'GeolocationPosition', - 'GeolocationPositionError', - 'GestureEvent', - 'Global', - 'Gyroscope', - 'HALF_FLOAT', - 'HAVE_CURRENT_DATA', - 'HAVE_ENOUGH_DATA', - 'HAVE_FUTURE_DATA', - 'HAVE_METADATA', - 'HAVE_NOTHING', - 'HEADERS_RECEIVED', - 'HIDDEN', - 'HIERARCHY_REQUEST_ERR', - 'HIGHPASS', - 'HIGHSHELF', - 'HIGH_FLOAT', - 'HIGH_INT', - 'HORIZONTAL', - 'HORIZONTAL_AXIS', - 'HRTF', - 'HTMLAllCollection', - 'HTMLAnchorElement', - 'HTMLAppletElement', - 'HTMLAreaElement', - 'HTMLAudioElement', - 'HTMLBRElement', - 'HTMLBaseElement', - 'HTMLBaseFontElement', - 'HTMLBlockquoteElement', - 'HTMLBodyElement', - 'HTMLButtonElement', - 'HTMLCanvasElement', - 'HTMLCollection', - 'HTMLCommandElement', - 'HTMLContentElement', - 'HTMLDListElement', - 'HTMLDataElement', - 'HTMLDataListElement', - 'HTMLDetailsElement', - 'HTMLDialogElement', - 'HTMLDirectoryElement', - 'HTMLDivElement', - 'HTMLDocument', - 'HTMLElement', - 'HTMLEmbedElement', - 'HTMLFieldSetElement', - 'HTMLFontElement', - 'HTMLFormControlsCollection', - 'HTMLFormElement', - 'HTMLFrameElement', - 'HTMLFrameSetElement', - 'HTMLHRElement', - 'HTMLHeadElement', - 'HTMLHeadingElement', - 'HTMLHtmlElement', - 'HTMLIFrameElement', - 'HTMLImageElement', - 'HTMLInputElement', - 'HTMLIsIndexElement', - 'HTMLKeygenElement', - 'HTMLLIElement', - 'HTMLLabelElement', - 'HTMLLegendElement', - 'HTMLLinkElement', - 'HTMLMapElement', - 'HTMLMarqueeElement', - 'HTMLMediaElement', - 'HTMLMenuElement', - 'HTMLMenuItemElement', - 'HTMLMetaElement', - 'HTMLMeterElement', - 'HTMLModElement', - 'HTMLOListElement', - 'HTMLObjectElement', - 'HTMLOptGroupElement', - 'HTMLOptionElement', - 'HTMLOptionsCollection', - 'HTMLOutputElement', - 'HTMLParagraphElement', - 'HTMLParamElement', - 'HTMLPictureElement', - 'HTMLPreElement', - 'HTMLProgressElement', - 'HTMLPropertiesCollection', - 'HTMLQuoteElement', - 'HTMLScriptElement', - 'HTMLSelectElement', - 'HTMLShadowElement', - 'HTMLSlotElement', - 'HTMLSourceElement', - 'HTMLSpanElement', - 'HTMLStyleElement', - 'HTMLTableCaptionElement', - 'HTMLTableCellElement', - 'HTMLTableColElement', - 'HTMLTableElement', - 'HTMLTableRowElement', - 'HTMLTableSectionElement', - 'HTMLTemplateElement', - 'HTMLTextAreaElement', - 'HTMLTimeElement', - 'HTMLTitleElement', - 'HTMLTrackElement', - 'HTMLUListElement', - 'HTMLUnknownElement', - 'HTMLVideoElement', - 'HashChangeEvent', - 'Headers', - 'History', - 'Hz', - 'ICE_CHECKING', - 'ICE_CLOSED', - 'ICE_COMPLETED', - 'ICE_CONNECTED', - 'ICE_FAILED', - 'ICE_GATHERING', - 'ICE_WAITING', - 'IDBCursor', - 'IDBCursorWithValue', - 'IDBDatabase', - 'IDBDatabaseException', - 'IDBFactory', - 'IDBFileHandle', - 'IDBFileRequest', - 'IDBIndex', - 'IDBKeyRange', - 'IDBMutableFile', - 'IDBObjectStore', - 'IDBOpenDBRequest', - 'IDBRequest', - 'IDBTransaction', - 'IDBVersionChangeEvent', - 'IDLE', - 'IIRFilterNode', - 'IMPLEMENTATION_COLOR_READ_FORMAT', - 'IMPLEMENTATION_COLOR_READ_TYPE', - 'IMPORT_RULE', - 'INCR', - 'INCR_WRAP', - 'INDEX_SIZE_ERR', - 'INT', - 'INTERLEAVED_ATTRIBS', - 'INT_2_10_10_10_REV', - 'INT_SAMPLER_2D', - 'INT_SAMPLER_2D_ARRAY', - 'INT_SAMPLER_3D', - 'INT_SAMPLER_CUBE', - 'INT_VEC2', - 'INT_VEC3', - 'INT_VEC4', - 'INUSE_ATTRIBUTE_ERR', - 'INVALID_ACCESS_ERR', - 'INVALID_CHARACTER_ERR', - 'INVALID_ENUM', - 'INVALID_EXPRESSION_ERR', - 'INVALID_FRAMEBUFFER_OPERATION', - 'INVALID_INDEX', - 'INVALID_MODIFICATION_ERR', - 'INVALID_NODE_TYPE_ERR', - 'INVALID_OPERATION', - 'INVALID_STATE_ERR', - 'INVALID_VALUE', - 'INVERSE_DISTANCE', - 'INVERT', - 'IceCandidate', - 'IdleDeadline', - 'Image', - 'ImageBitmap', - 'ImageBitmapRenderingContext', - 'ImageCapture', - 'ImageData', - 'Infinity', - 'InputDeviceCapabilities', - 'InputDeviceInfo', - 'InputEvent', - 'InputMethodContext', - 'InstallTrigger', - 'InstallTriggerImpl', - 'Instance', - 'Int16Array', - 'Int32Array', - 'Int8Array', - 'Intent', - 'InternalError', - 'IntersectionObserver', - 'IntersectionObserverEntry', - 'Intl', - 'IsSearchProviderInstalled', - 'Iterator', - 'JSON', - 'KEEP', - 'KEYDOWN', - 'KEYFRAMES_RULE', - 'KEYFRAME_RULE', - 'KEYPRESS', - 'KEYUP', - 'KeyEvent', - 'Keyboard', - 'KeyboardEvent', - 'KeyboardLayoutMap', - 'KeyframeEffect', - 'LENGTHADJUST_SPACING', - 'LENGTHADJUST_SPACINGANDGLYPHS', - 'LENGTHADJUST_UNKNOWN', - 'LEQUAL', - 'LESS', - 'LINEAR', - 'LINEAR_DISTANCE', - 'LINEAR_MIPMAP_LINEAR', - 'LINEAR_MIPMAP_NEAREST', - 'LINES', - 'LINE_LOOP', - 'LINE_STRIP', - 'LINE_WIDTH', - 'LINK_STATUS', - 'LIVE', - 'LN10', - 'LN2', - 'LOADED', - 'LOADING', - 'LOG10E', - 'LOG2E', - 'LOWPASS', - 'LOWSHELF', - 'LOW_FLOAT', - 'LOW_INT', - 'LSException', - 'LSParserFilter', - 'LUMINANCE', - 'LUMINANCE_ALPHA', - 'LargestContentfulPaint', - 'LayoutShift', - 'LayoutShiftAttribution', - 'LinearAccelerationSensor', - 'LinkError', - 'ListFormat', - 'LocalMediaStream', - 'Locale', - 'Location', - 'Lock', - 'LockManager', - 'MAX', - 'MAX_3D_TEXTURE_SIZE', - 'MAX_ARRAY_TEXTURE_LAYERS', - 'MAX_CLIENT_WAIT_TIMEOUT_WEBGL', - 'MAX_COLOR_ATTACHMENTS', - 'MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS', - 'MAX_COMBINED_TEXTURE_IMAGE_UNITS', - 'MAX_COMBINED_UNIFORM_BLOCKS', - 'MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS', - 'MAX_CUBE_MAP_TEXTURE_SIZE', - 'MAX_DRAW_BUFFERS', - 'MAX_ELEMENTS_INDICES', - 'MAX_ELEMENTS_VERTICES', - 'MAX_ELEMENT_INDEX', - 'MAX_FRAGMENT_INPUT_COMPONENTS', - 'MAX_FRAGMENT_UNIFORM_BLOCKS', - 'MAX_FRAGMENT_UNIFORM_COMPONENTS', - 'MAX_FRAGMENT_UNIFORM_VECTORS', - 'MAX_PROGRAM_TEXEL_OFFSET', - 'MAX_RENDERBUFFER_SIZE', - 'MAX_SAFE_INTEGER', - 'MAX_SAMPLES', - 'MAX_SERVER_WAIT_TIMEOUT', - 'MAX_TEXTURE_IMAGE_UNITS', - 'MAX_TEXTURE_LOD_BIAS', - 'MAX_TEXTURE_MAX_ANISOTROPY_EXT', - 'MAX_TEXTURE_SIZE', - 'MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS', - 'MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS', - 'MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS', - 'MAX_UNIFORM_BLOCK_SIZE', - 'MAX_UNIFORM_BUFFER_BINDINGS', - 'MAX_VALUE', - 'MAX_VARYING_COMPONENTS', - 'MAX_VARYING_VECTORS', - 'MAX_VERTEX_ATTRIBS', - 'MAX_VERTEX_OUTPUT_COMPONENTS', - 'MAX_VERTEX_TEXTURE_IMAGE_UNITS', - 'MAX_VERTEX_UNIFORM_BLOCKS', - 'MAX_VERTEX_UNIFORM_COMPONENTS', - 'MAX_VERTEX_UNIFORM_VECTORS', - 'MAX_VIEWPORT_DIMS', - 'MEDIA_ERR_ABORTED', - 'MEDIA_ERR_DECODE', - 'MEDIA_ERR_ENCRYPTED', - 'MEDIA_ERR_NETWORK', - 'MEDIA_ERR_SRC_NOT_SUPPORTED', - 'MEDIA_KEYERR_CLIENT', - 'MEDIA_KEYERR_DOMAIN', - 'MEDIA_KEYERR_HARDWARECHANGE', - 'MEDIA_KEYERR_OUTPUT', - 'MEDIA_KEYERR_SERVICE', - 'MEDIA_KEYERR_UNKNOWN', - 'MEDIA_RULE', - 'MEDIUM_FLOAT', - 'MEDIUM_INT', - 'META_MASK', - 'MIDIAccess', - 'MIDIConnectionEvent', - 'MIDIInput', - 'MIDIInputMap', - 'MIDIMessageEvent', - 'MIDIOutput', - 'MIDIOutputMap', - 'MIDIPort', - 'MIN', - 'MIN_PROGRAM_TEXEL_OFFSET', - 'MIN_SAFE_INTEGER', - 'MIN_VALUE', - 'MIRRORED_REPEAT', - 'MODE_ASYNCHRONOUS', - 'MODE_SYNCHRONOUS', - 'MODIFICATION', - 'MOUSEDOWN', - 'MOUSEDRAG', - 'MOUSEMOVE', - 'MOUSEOUT', - 'MOUSEOVER', - 'MOUSEUP', - 'MOZ_KEYFRAMES_RULE', - 'MOZ_KEYFRAME_RULE', - 'MOZ_SOURCE_CURSOR', - 'MOZ_SOURCE_ERASER', - 'MOZ_SOURCE_KEYBOARD', - 'MOZ_SOURCE_MOUSE', - 'MOZ_SOURCE_PEN', - 'MOZ_SOURCE_TOUCH', - 'MOZ_SOURCE_UNKNOWN', - 'MSGESTURE_FLAG_BEGIN', - 'MSGESTURE_FLAG_CANCEL', - 'MSGESTURE_FLAG_END', - 'MSGESTURE_FLAG_INERTIA', - 'MSGESTURE_FLAG_NONE', - 'MSPOINTER_TYPE_MOUSE', - 'MSPOINTER_TYPE_PEN', - 'MSPOINTER_TYPE_TOUCH', - 'MS_ASYNC_CALLBACK_STATUS_ASSIGN_DELEGATE', - 'MS_ASYNC_CALLBACK_STATUS_CANCEL', - 'MS_ASYNC_CALLBACK_STATUS_CHOOSEANY', - 'MS_ASYNC_CALLBACK_STATUS_ERROR', - 'MS_ASYNC_CALLBACK_STATUS_JOIN', - 'MS_ASYNC_OP_STATUS_CANCELED', - 'MS_ASYNC_OP_STATUS_ERROR', - 'MS_ASYNC_OP_STATUS_SUCCESS', - 'MS_MANIPULATION_STATE_ACTIVE', - 'MS_MANIPULATION_STATE_CANCELLED', - 'MS_MANIPULATION_STATE_COMMITTED', - 'MS_MANIPULATION_STATE_DRAGGING', - 'MS_MANIPULATION_STATE_INERTIA', - 'MS_MANIPULATION_STATE_PRESELECT', - 'MS_MANIPULATION_STATE_SELECTING', - 'MS_MANIPULATION_STATE_STOPPED', - 'MS_MEDIA_ERR_ENCRYPTED', - 'MS_MEDIA_KEYERR_CLIENT', - 'MS_MEDIA_KEYERR_DOMAIN', - 'MS_MEDIA_KEYERR_HARDWARECHANGE', - 'MS_MEDIA_KEYERR_OUTPUT', - 'MS_MEDIA_KEYERR_SERVICE', - 'MS_MEDIA_KEYERR_UNKNOWN', - 'Map', - 'Math', - 'MathMLElement', - 'MediaCapabilities', - 'MediaCapabilitiesInfo', - 'MediaController', - 'MediaDeviceInfo', - 'MediaDevices', - 'MediaElementAudioSourceNode', - 'MediaEncryptedEvent', - 'MediaError', - 'MediaKeyError', - 'MediaKeyEvent', - 'MediaKeyMessageEvent', - 'MediaKeyNeededEvent', - 'MediaKeySession', - 'MediaKeyStatusMap', - 'MediaKeySystemAccess', - 'MediaKeys', - 'MediaList', - 'MediaMetadata', - 'MediaQueryList', - 'MediaQueryListEvent', - 'MediaRecorder', - 'MediaRecorderErrorEvent', - 'MediaSession', - 'MediaSettingsRange', - 'MediaSource', - 'MediaStream', - 'MediaStreamAudioDestinationNode', - 'MediaStreamAudioSourceNode', - 'MediaStreamEvent', - 'MediaStreamTrack', - 'MediaStreamTrackAudioSourceNode', - 'MediaStreamTrackEvent', - 'Memory', - 'MessageChannel', - 'MessageEvent', - 'MessagePort', - 'Methods', - 'MimeType', - 'MimeTypeArray', - 'Module', - 'MouseEvent', - 'MouseScrollEvent', - 'MozAnimation', - 'MozAnimationDelay', - 'MozAnimationDirection', - 'MozAnimationDuration', - 'MozAnimationFillMode', - 'MozAnimationIterationCount', - 'MozAnimationName', - 'MozAnimationPlayState', - 'MozAnimationTimingFunction', - 'MozAppearance', - 'MozBackfaceVisibility', - 'MozBinding', - 'MozBorderBottomColors', - 'MozBorderEnd', - 'MozBorderEndColor', - 'MozBorderEndStyle', - 'MozBorderEndWidth', - 'MozBorderImage', - 'MozBorderLeftColors', - 'MozBorderRightColors', - 'MozBorderStart', - 'MozBorderStartColor', - 'MozBorderStartStyle', - 'MozBorderStartWidth', - 'MozBorderTopColors', - 'MozBoxAlign', - 'MozBoxDirection', - 'MozBoxFlex', - 'MozBoxOrdinalGroup', - 'MozBoxOrient', - 'MozBoxPack', - 'MozBoxSizing', - 'MozCSSKeyframeRule', - 'MozCSSKeyframesRule', - 'MozColumnCount', - 'MozColumnFill', - 'MozColumnGap', - 'MozColumnRule', - 'MozColumnRuleColor', - 'MozColumnRuleStyle', - 'MozColumnRuleWidth', - 'MozColumnWidth', - 'MozColumns', - 'MozContactChangeEvent', - 'MozFloatEdge', - 'MozFontFeatureSettings', - 'MozFontLanguageOverride', - 'MozForceBrokenImageIcon', - 'MozHyphens', - 'MozImageRegion', - 'MozMarginEnd', - 'MozMarginStart', - 'MozMmsEvent', - 'MozMmsMessage', - 'MozMobileMessageThread', - 'MozOSXFontSmoothing', - 'MozOrient', - 'MozOsxFontSmoothing', - 'MozOutlineRadius', - 'MozOutlineRadiusBottomleft', - 'MozOutlineRadiusBottomright', - 'MozOutlineRadiusTopleft', - 'MozOutlineRadiusTopright', - 'MozPaddingEnd', - 'MozPaddingStart', - 'MozPerspective', - 'MozPerspectiveOrigin', - 'MozPowerManager', - 'MozSettingsEvent', - 'MozSmsEvent', - 'MozSmsMessage', - 'MozStackSizing', - 'MozTabSize', - 'MozTextAlignLast', - 'MozTextDecorationColor', - 'MozTextDecorationLine', - 'MozTextDecorationStyle', - 'MozTextSizeAdjust', - 'MozTransform', - 'MozTransformOrigin', - 'MozTransformStyle', - 'MozTransition', - 'MozTransitionDelay', - 'MozTransitionDuration', - 'MozTransitionProperty', - 'MozTransitionTimingFunction', - 'MozUserFocus', - 'MozUserInput', - 'MozUserModify', - 'MozUserSelect', - 'MozWindowDragging', - 'MozWindowShadow', - 'MutationEvent', - 'MutationObserver', - 'MutationRecord', - 'NAMESPACE_ERR', - 'NAMESPACE_RULE', - 'NEAREST', - 'NEAREST_MIPMAP_LINEAR', - 'NEAREST_MIPMAP_NEAREST', - 'NEGATIVE_INFINITY', - 'NETWORK_EMPTY', - 'NETWORK_ERR', - 'NETWORK_IDLE', - 'NETWORK_LOADED', - 'NETWORK_LOADING', - 'NETWORK_NO_SOURCE', - 'NEVER', - 'NEW', - 'NEXT', - 'NEXT_NO_DUPLICATE', - 'NICEST', - 'NODE_AFTER', - 'NODE_BEFORE', - 'NODE_BEFORE_AND_AFTER', - 'NODE_INSIDE', - 'NONE', - 'NON_TRANSIENT_ERR', - 'NOTATION_NODE', - 'NOTCH', - 'NOTEQUAL', - 'NOT_ALLOWED_ERR', - 'NOT_FOUND_ERR', - 'NOT_READABLE_ERR', - 'NOT_SUPPORTED_ERR', - 'NO_DATA_ALLOWED_ERR', - 'NO_ERR', - 'NO_ERROR', - 'NO_MODIFICATION_ALLOWED_ERR', - 'NUMBER_TYPE', - 'NUM_COMPRESSED_TEXTURE_FORMATS', - 'NaN', - 'NamedNodeMap', - 'NavigationPreloadManager', - 'Navigator', - 'NearbyLinks', - 'NetworkInformation', - 'Node', - 'NodeFilter', - 'NodeIterator', - 'NodeList', - 'Notation', - 'Notification', - 'NotifyPaintEvent', - 'Number', - 'NumberFormat', - 'OBJECT_TYPE', - 'OBSOLETE', - 'OK', - 'ONE', - 'ONE_MINUS_CONSTANT_ALPHA', - 'ONE_MINUS_CONSTANT_COLOR', - 'ONE_MINUS_DST_ALPHA', - 'ONE_MINUS_DST_COLOR', - 'ONE_MINUS_SRC_ALPHA', - 'ONE_MINUS_SRC_COLOR', - 'OPEN', - 'OPENED', - 'OPENING', - 'ORDERED_NODE_ITERATOR_TYPE', - 'ORDERED_NODE_SNAPSHOT_TYPE', - 'OTHER_ERROR', - 'OUT_OF_MEMORY', - 'Object', - 'OfflineAudioCompletionEvent', - 'OfflineAudioContext', - 'OfflineResourceList', - 'OffscreenCanvas', - 'OffscreenCanvasRenderingContext2D', - 'Option', - 'OrientationSensor', - 'OscillatorNode', - 'OverconstrainedError', - 'OverflowEvent', - 'PACK_ALIGNMENT', - 'PACK_ROW_LENGTH', - 'PACK_SKIP_PIXELS', - 'PACK_SKIP_ROWS', - 'PAGE_RULE', - 'PARSE_ERR', - 'PATHSEG_ARC_ABS', - 'PATHSEG_ARC_REL', - 'PATHSEG_CLOSEPATH', - 'PATHSEG_CURVETO_CUBIC_ABS', - 'PATHSEG_CURVETO_CUBIC_REL', - 'PATHSEG_CURVETO_CUBIC_SMOOTH_ABS', - 'PATHSEG_CURVETO_CUBIC_SMOOTH_REL', - 'PATHSEG_CURVETO_QUADRATIC_ABS', - 'PATHSEG_CURVETO_QUADRATIC_REL', - 'PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS', - 'PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL', - 'PATHSEG_LINETO_ABS', - 'PATHSEG_LINETO_HORIZONTAL_ABS', - 'PATHSEG_LINETO_HORIZONTAL_REL', - 'PATHSEG_LINETO_REL', - 'PATHSEG_LINETO_VERTICAL_ABS', - 'PATHSEG_LINETO_VERTICAL_REL', - 'PATHSEG_MOVETO_ABS', - 'PATHSEG_MOVETO_REL', - 'PATHSEG_UNKNOWN', - 'PATH_EXISTS_ERR', - 'PEAKING', - 'PERMISSION_DENIED', - 'PERSISTENT', - 'PI', - 'PIXEL_PACK_BUFFER', - 'PIXEL_PACK_BUFFER_BINDING', - 'PIXEL_UNPACK_BUFFER', - 'PIXEL_UNPACK_BUFFER_BINDING', - 'PLAYING_STATE', - 'POINTS', - 'POLYGON_OFFSET_FACTOR', - 'POLYGON_OFFSET_FILL', - 'POLYGON_OFFSET_UNITS', - 'POSITION_UNAVAILABLE', - 'POSITIVE_INFINITY', - 'PREV', - 'PREV_NO_DUPLICATE', - 'PROCESSING_INSTRUCTION_NODE', - 'PageChangeEvent', - 'PageTransitionEvent', - 'PaintRequest', - 'PaintRequestList', - 'PannerNode', - 'PasswordCredential', - 'Path2D', - 'PaymentAddress', - 'PaymentInstruments', - 'PaymentManager', - 'PaymentMethodChangeEvent', - 'PaymentRequest', - 'PaymentRequestUpdateEvent', - 'PaymentResponse', - 'Performance', - 'PerformanceElementTiming', - 'PerformanceEntry', - 'PerformanceEventTiming', - 'PerformanceLongTaskTiming', - 'PerformanceMark', - 'PerformanceMeasure', - 'PerformanceNavigation', - 'PerformanceNavigationTiming', - 'PerformanceObserver', - 'PerformanceObserverEntryList', - 'PerformancePaintTiming', - 'PerformanceResourceTiming', - 'PerformanceServerTiming', - 'PerformanceTiming', - 'PeriodicSyncManager', - 'PeriodicWave', - 'PermissionStatus', - 'Permissions', - 'PhotoCapabilities', - 'PictureInPictureWindow', - 'Plugin', - 'PluginArray', - 'PluralRules', - 'PointerEvent', - 'PopStateEvent', - 'PopupBlockedEvent', - 'Presentation', - 'PresentationAvailability', - 'PresentationConnection', - 'PresentationConnectionAvailableEvent', - 'PresentationConnectionCloseEvent', - 'PresentationConnectionList', - 'PresentationReceiver', - 'PresentationRequest', - 'ProcessingInstruction', - 'ProgressEvent', - 'Promise', - 'PromiseRejectionEvent', - 'PropertyNodeList', - 'Proxy', - 'PublicKeyCredential', - 'PushManager', - 'PushSubscription', - 'PushSubscriptionOptions', - 'Q', - 'QUERY_RESULT', - 'QUERY_RESULT_AVAILABLE', - 'QUOTA_ERR', - 'QUOTA_EXCEEDED_ERR', - 'QueryInterface', - 'R11F_G11F_B10F', - 'R16F', - 'R16I', - 'R16UI', - 'R32F', - 'R32I', - 'R32UI', - 'R8', - 'R8I', - 'R8UI', - 'R8_SNORM', - 'RASTERIZER_DISCARD', - 'READ_BUFFER', - 'READ_FRAMEBUFFER', - 'READ_FRAMEBUFFER_BINDING', - 'READ_ONLY', - 'READ_ONLY_ERR', - 'READ_WRITE', - 'RED', - 'RED_BITS', - 'RED_INTEGER', - 'REMOVAL', - 'RENDERBUFFER', - 'RENDERBUFFER_ALPHA_SIZE', - 'RENDERBUFFER_BINDING', - 'RENDERBUFFER_BLUE_SIZE', - 'RENDERBUFFER_DEPTH_SIZE', - 'RENDERBUFFER_GREEN_SIZE', - 'RENDERBUFFER_HEIGHT', - 'RENDERBUFFER_INTERNAL_FORMAT', - 'RENDERBUFFER_RED_SIZE', - 'RENDERBUFFER_SAMPLES', - 'RENDERBUFFER_STENCIL_SIZE', - 'RENDERBUFFER_WIDTH', - 'RENDERER', - 'RENDERING_INTENT_ABSOLUTE_COLORIMETRIC', - 'RENDERING_INTENT_AUTO', - 'RENDERING_INTENT_PERCEPTUAL', - 'RENDERING_INTENT_RELATIVE_COLORIMETRIC', - 'RENDERING_INTENT_SATURATION', - 'RENDERING_INTENT_UNKNOWN', - 'REPEAT', - 'REPLACE', - 'RG', - 'RG16F', - 'RG16I', - 'RG16UI', - 'RG32F', - 'RG32I', - 'RG32UI', - 'RG8', - 'RG8I', - 'RG8UI', - 'RG8_SNORM', - 'RGB', - 'RGB10_A2', - 'RGB10_A2UI', - 'RGB16F', - 'RGB16I', - 'RGB16UI', - 'RGB32F', - 'RGB32I', - 'RGB32UI', - 'RGB565', - 'RGB5_A1', - 'RGB8', - 'RGB8I', - 'RGB8UI', - 'RGB8_SNORM', - 'RGB9_E5', - 'RGBA', - 'RGBA16F', - 'RGBA16I', - 'RGBA16UI', - 'RGBA32F', - 'RGBA32I', - 'RGBA32UI', - 'RGBA4', - 'RGBA8', - 'RGBA8I', - 'RGBA8UI', - 'RGBA8_SNORM', - 'RGBA_INTEGER', - 'RGBColor', - 'RGB_INTEGER', - 'RG_INTEGER', - 'ROTATION_CLOCKWISE', - 'ROTATION_COUNTERCLOCKWISE', - 'RTCCertificate', - 'RTCDTMFSender', - 'RTCDTMFToneChangeEvent', - 'RTCDataChannel', - 'RTCDataChannelEvent', - 'RTCDtlsTransport', - 'RTCError', - 'RTCErrorEvent', - 'RTCIceCandidate', - 'RTCIceTransport', - 'RTCPeerConnection', - 'RTCPeerConnectionIceErrorEvent', - 'RTCPeerConnectionIceEvent', - 'RTCRtpReceiver', - 'RTCRtpSender', - 'RTCRtpTransceiver', - 'RTCSctpTransport', - 'RTCSessionDescription', - 'RTCStatsReport', - 'RTCTrackEvent', - 'RadioNodeList', - 'Range', - 'RangeError', - 'RangeException', - 'ReadableStream', - 'ReadableStreamDefaultReader', - 'RecordErrorEvent', - 'Rect', - 'ReferenceError', - 'Reflect', - 'RegExp', - 'RelativeOrientationSensor', - 'RelativeTimeFormat', - 'RemotePlayback', - 'Report', - 'ReportBody', - 'ReportingObserver', - 'Request', - 'ResizeObserver', - 'ResizeObserverEntry', - 'ResizeObserverSize', - 'Response', - 'RuntimeError', - 'SAMPLER_2D', - 'SAMPLER_2D_ARRAY', - 'SAMPLER_2D_ARRAY_SHADOW', - 'SAMPLER_2D_SHADOW', - 'SAMPLER_3D', - 'SAMPLER_BINDING', - 'SAMPLER_CUBE', - 'SAMPLER_CUBE_SHADOW', - 'SAMPLES', - 'SAMPLE_ALPHA_TO_COVERAGE', - 'SAMPLE_BUFFERS', - 'SAMPLE_COVERAGE', - 'SAMPLE_COVERAGE_INVERT', - 'SAMPLE_COVERAGE_VALUE', - 'SAWTOOTH', - 'SCHEDULED_STATE', - 'SCISSOR_BOX', - 'SCISSOR_TEST', - 'SCROLL_PAGE_DOWN', - 'SCROLL_PAGE_UP', - 'SDP_ANSWER', - 'SDP_OFFER', - 'SDP_PRANSWER', - 'SECURITY_ERR', - 'SELECT', - 'SEPARATE_ATTRIBS', - 'SERIALIZE_ERR', - 'SEVERITY_ERROR', - 'SEVERITY_FATAL_ERROR', - 'SEVERITY_WARNING', - 'SHADER_COMPILER', - 'SHADER_TYPE', - 'SHADING_LANGUAGE_VERSION', - 'SHIFT_MASK', - 'SHORT', - 'SHOWING', - 'SHOW_ALL', - 'SHOW_ATTRIBUTE', - 'SHOW_CDATA_SECTION', - 'SHOW_COMMENT', - 'SHOW_DOCUMENT', - 'SHOW_DOCUMENT_FRAGMENT', - 'SHOW_DOCUMENT_TYPE', - 'SHOW_ELEMENT', - 'SHOW_ENTITY', - 'SHOW_ENTITY_REFERENCE', - 'SHOW_NOTATION', - 'SHOW_PROCESSING_INSTRUCTION', - 'SHOW_TEXT', - 'SIGNALED', - 'SIGNED_NORMALIZED', - 'SINE', - 'SOUNDFIELD', - 'SQLException', - 'SQRT1_2', - 'SQRT2', - 'SQUARE', - 'SRC_ALPHA', - 'SRC_ALPHA_SATURATE', - 'SRC_COLOR', - 'SRGB', - 'SRGB8', - 'SRGB8_ALPHA8', - 'START_TO_END', - 'START_TO_START', - 'STATIC_COPY', - 'STATIC_DRAW', - 'STATIC_READ', - 'STENCIL', - 'STENCIL_ATTACHMENT', - 'STENCIL_BACK_FAIL', - 'STENCIL_BACK_FUNC', - 'STENCIL_BACK_PASS_DEPTH_FAIL', - 'STENCIL_BACK_PASS_DEPTH_PASS', - 'STENCIL_BACK_REF', - 'STENCIL_BACK_VALUE_MASK', - 'STENCIL_BACK_WRITEMASK', - 'STENCIL_BITS', - 'STENCIL_BUFFER_BIT', - 'STENCIL_CLEAR_VALUE', - 'STENCIL_FAIL', - 'STENCIL_FUNC', - 'STENCIL_INDEX', - 'STENCIL_INDEX8', - 'STENCIL_PASS_DEPTH_FAIL', - 'STENCIL_PASS_DEPTH_PASS', - 'STENCIL_REF', - 'STENCIL_TEST', - 'STENCIL_VALUE_MASK', - 'STENCIL_WRITEMASK', - 'STREAM_COPY', - 'STREAM_DRAW', - 'STREAM_READ', - 'STRING_TYPE', - 'STYLE_RULE', - 'SUBPIXEL_BITS', - 'SUPPORTS_RULE', - 'SVGAElement', - 'SVGAltGlyphDefElement', - 'SVGAltGlyphElement', - 'SVGAltGlyphItemElement', - 'SVGAngle', - 'SVGAnimateColorElement', - 'SVGAnimateElement', - 'SVGAnimateMotionElement', - 'SVGAnimateTransformElement', - 'SVGAnimatedAngle', - 'SVGAnimatedBoolean', - 'SVGAnimatedEnumeration', - 'SVGAnimatedInteger', - 'SVGAnimatedLength', - 'SVGAnimatedLengthList', - 'SVGAnimatedNumber', - 'SVGAnimatedNumberList', - 'SVGAnimatedPreserveAspectRatio', - 'SVGAnimatedRect', - 'SVGAnimatedString', - 'SVGAnimatedTransformList', - 'SVGAnimationElement', - 'SVGCircleElement', - 'SVGClipPathElement', - 'SVGColor', - 'SVGComponentTransferFunctionElement', - 'SVGCursorElement', - 'SVGDefsElement', - 'SVGDescElement', - 'SVGDiscardElement', - 'SVGDocument', - 'SVGElement', - 'SVGElementInstance', - 'SVGElementInstanceList', - 'SVGEllipseElement', - 'SVGException', - 'SVGFEBlendElement', - 'SVGFEColorMatrixElement', - 'SVGFEComponentTransferElement', - 'SVGFECompositeElement', - 'SVGFEConvolveMatrixElement', - 'SVGFEDiffuseLightingElement', - 'SVGFEDisplacementMapElement', - 'SVGFEDistantLightElement', - 'SVGFEDropShadowElement', - 'SVGFEFloodElement', - 'SVGFEFuncAElement', - 'SVGFEFuncBElement', - 'SVGFEFuncGElement', - 'SVGFEFuncRElement', - 'SVGFEGaussianBlurElement', - 'SVGFEImageElement', - 'SVGFEMergeElement', - 'SVGFEMergeNodeElement', - 'SVGFEMorphologyElement', - 'SVGFEOffsetElement', - 'SVGFEPointLightElement', - 'SVGFESpecularLightingElement', - 'SVGFESpotLightElement', - 'SVGFETileElement', - 'SVGFETurbulenceElement', - 'SVGFilterElement', - 'SVGFontElement', - 'SVGFontFaceElement', - 'SVGFontFaceFormatElement', - 'SVGFontFaceNameElement', - 'SVGFontFaceSrcElement', - 'SVGFontFaceUriElement', - 'SVGForeignObjectElement', - 'SVGGElement', - 'SVGGeometryElement', - 'SVGGlyphElement', - 'SVGGlyphRefElement', - 'SVGGradientElement', - 'SVGGraphicsElement', - 'SVGHKernElement', - 'SVGImageElement', - 'SVGLength', - 'SVGLengthList', - 'SVGLineElement', - 'SVGLinearGradientElement', - 'SVGMPathElement', - 'SVGMarkerElement', - 'SVGMaskElement', - 'SVGMatrix', - 'SVGMetadataElement', - 'SVGMissingGlyphElement', - 'SVGNumber', - 'SVGNumberList', - 'SVGPaint', - 'SVGPathElement', - 'SVGPathSeg', - 'SVGPathSegArcAbs', - 'SVGPathSegArcRel', - 'SVGPathSegClosePath', - 'SVGPathSegCurvetoCubicAbs', - 'SVGPathSegCurvetoCubicRel', - 'SVGPathSegCurvetoCubicSmoothAbs', - 'SVGPathSegCurvetoCubicSmoothRel', - 'SVGPathSegCurvetoQuadraticAbs', - 'SVGPathSegCurvetoQuadraticRel', - 'SVGPathSegCurvetoQuadraticSmoothAbs', - 'SVGPathSegCurvetoQuadraticSmoothRel', - 'SVGPathSegLinetoAbs', - 'SVGPathSegLinetoHorizontalAbs', - 'SVGPathSegLinetoHorizontalRel', - 'SVGPathSegLinetoRel', - 'SVGPathSegLinetoVerticalAbs', - 'SVGPathSegLinetoVerticalRel', - 'SVGPathSegList', - 'SVGPathSegMovetoAbs', - 'SVGPathSegMovetoRel', - 'SVGPatternElement', - 'SVGPoint', - 'SVGPointList', - 'SVGPolygonElement', - 'SVGPolylineElement', - 'SVGPreserveAspectRatio', - 'SVGRadialGradientElement', - 'SVGRect', - 'SVGRectElement', - 'SVGRenderingIntent', - 'SVGSVGElement', - 'SVGScriptElement', - 'SVGSetElement', - 'SVGStopElement', - 'SVGStringList', - 'SVGStyleElement', - 'SVGSwitchElement', - 'SVGSymbolElement', - 'SVGTRefElement', - 'SVGTSpanElement', - 'SVGTextContentElement', - 'SVGTextElement', - 'SVGTextPathElement', - 'SVGTextPositioningElement', - 'SVGTitleElement', - 'SVGTransform', - 'SVGTransformList', - 'SVGUnitTypes', - 'SVGUseElement', - 'SVGVKernElement', - 'SVGViewElement', - 'SVGViewSpec', - 'SVGZoomAndPan', - 'SVGZoomEvent', - 'SVG_ANGLETYPE_DEG', - 'SVG_ANGLETYPE_GRAD', - 'SVG_ANGLETYPE_RAD', - 'SVG_ANGLETYPE_UNKNOWN', - 'SVG_ANGLETYPE_UNSPECIFIED', - 'SVG_CHANNEL_A', - 'SVG_CHANNEL_B', - 'SVG_CHANNEL_G', - 'SVG_CHANNEL_R', - 'SVG_CHANNEL_UNKNOWN', - 'SVG_COLORTYPE_CURRENTCOLOR', - 'SVG_COLORTYPE_RGBCOLOR', - 'SVG_COLORTYPE_RGBCOLOR_ICCCOLOR', - 'SVG_COLORTYPE_UNKNOWN', - 'SVG_EDGEMODE_DUPLICATE', - 'SVG_EDGEMODE_NONE', - 'SVG_EDGEMODE_UNKNOWN', - 'SVG_EDGEMODE_WRAP', - 'SVG_FEBLEND_MODE_COLOR', - 'SVG_FEBLEND_MODE_COLOR_BURN', - 'SVG_FEBLEND_MODE_COLOR_DODGE', - 'SVG_FEBLEND_MODE_DARKEN', - 'SVG_FEBLEND_MODE_DIFFERENCE', - 'SVG_FEBLEND_MODE_EXCLUSION', - 'SVG_FEBLEND_MODE_HARD_LIGHT', - 'SVG_FEBLEND_MODE_HUE', - 'SVG_FEBLEND_MODE_LIGHTEN', - 'SVG_FEBLEND_MODE_LUMINOSITY', - 'SVG_FEBLEND_MODE_MULTIPLY', - 'SVG_FEBLEND_MODE_NORMAL', - 'SVG_FEBLEND_MODE_OVERLAY', - 'SVG_FEBLEND_MODE_SATURATION', - 'SVG_FEBLEND_MODE_SCREEN', - 'SVG_FEBLEND_MODE_SOFT_LIGHT', - 'SVG_FEBLEND_MODE_UNKNOWN', - 'SVG_FECOLORMATRIX_TYPE_HUEROTATE', - 'SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA', - 'SVG_FECOLORMATRIX_TYPE_MATRIX', - 'SVG_FECOLORMATRIX_TYPE_SATURATE', - 'SVG_FECOLORMATRIX_TYPE_UNKNOWN', - 'SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE', - 'SVG_FECOMPONENTTRANSFER_TYPE_GAMMA', - 'SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY', - 'SVG_FECOMPONENTTRANSFER_TYPE_LINEAR', - 'SVG_FECOMPONENTTRANSFER_TYPE_TABLE', - 'SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN', - 'SVG_FECOMPOSITE_OPERATOR_ARITHMETIC', - 'SVG_FECOMPOSITE_OPERATOR_ATOP', - 'SVG_FECOMPOSITE_OPERATOR_IN', - 'SVG_FECOMPOSITE_OPERATOR_OUT', - 'SVG_FECOMPOSITE_OPERATOR_OVER', - 'SVG_FECOMPOSITE_OPERATOR_UNKNOWN', - 'SVG_FECOMPOSITE_OPERATOR_XOR', - 'SVG_INVALID_VALUE_ERR', - 'SVG_LENGTHTYPE_CM', - 'SVG_LENGTHTYPE_EMS', - 'SVG_LENGTHTYPE_EXS', - 'SVG_LENGTHTYPE_IN', - 'SVG_LENGTHTYPE_MM', - 'SVG_LENGTHTYPE_NUMBER', - 'SVG_LENGTHTYPE_PC', - 'SVG_LENGTHTYPE_PERCENTAGE', - 'SVG_LENGTHTYPE_PT', - 'SVG_LENGTHTYPE_PX', - 'SVG_LENGTHTYPE_UNKNOWN', - 'SVG_MARKERUNITS_STROKEWIDTH', - 'SVG_MARKERUNITS_UNKNOWN', - 'SVG_MARKERUNITS_USERSPACEONUSE', - 'SVG_MARKER_ORIENT_ANGLE', - 'SVG_MARKER_ORIENT_AUTO', - 'SVG_MARKER_ORIENT_UNKNOWN', - 'SVG_MASKTYPE_ALPHA', - 'SVG_MASKTYPE_LUMINANCE', - 'SVG_MATRIX_NOT_INVERTABLE', - 'SVG_MEETORSLICE_MEET', - 'SVG_MEETORSLICE_SLICE', - 'SVG_MEETORSLICE_UNKNOWN', - 'SVG_MORPHOLOGY_OPERATOR_DILATE', - 'SVG_MORPHOLOGY_OPERATOR_ERODE', - 'SVG_MORPHOLOGY_OPERATOR_UNKNOWN', - 'SVG_PAINTTYPE_CURRENTCOLOR', - 'SVG_PAINTTYPE_NONE', - 'SVG_PAINTTYPE_RGBCOLOR', - 'SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR', - 'SVG_PAINTTYPE_UNKNOWN', - 'SVG_PAINTTYPE_URI', - 'SVG_PAINTTYPE_URI_CURRENTCOLOR', - 'SVG_PAINTTYPE_URI_NONE', - 'SVG_PAINTTYPE_URI_RGBCOLOR', - 'SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR', - 'SVG_PRESERVEASPECTRATIO_NONE', - 'SVG_PRESERVEASPECTRATIO_UNKNOWN', - 'SVG_PRESERVEASPECTRATIO_XMAXYMAX', - 'SVG_PRESERVEASPECTRATIO_XMAXYMID', - 'SVG_PRESERVEASPECTRATIO_XMAXYMIN', - 'SVG_PRESERVEASPECTRATIO_XMIDYMAX', - 'SVG_PRESERVEASPECTRATIO_XMIDYMID', - 'SVG_PRESERVEASPECTRATIO_XMIDYMIN', - 'SVG_PRESERVEASPECTRATIO_XMINYMAX', - 'SVG_PRESERVEASPECTRATIO_XMINYMID', - 'SVG_PRESERVEASPECTRATIO_XMINYMIN', - 'SVG_SPREADMETHOD_PAD', - 'SVG_SPREADMETHOD_REFLECT', - 'SVG_SPREADMETHOD_REPEAT', - 'SVG_SPREADMETHOD_UNKNOWN', - 'SVG_STITCHTYPE_NOSTITCH', - 'SVG_STITCHTYPE_STITCH', - 'SVG_STITCHTYPE_UNKNOWN', - 'SVG_TRANSFORM_MATRIX', - 'SVG_TRANSFORM_ROTATE', - 'SVG_TRANSFORM_SCALE', - 'SVG_TRANSFORM_SKEWX', - 'SVG_TRANSFORM_SKEWY', - 'SVG_TRANSFORM_TRANSLATE', - 'SVG_TRANSFORM_UNKNOWN', - 'SVG_TURBULENCE_TYPE_FRACTALNOISE', - 'SVG_TURBULENCE_TYPE_TURBULENCE', - 'SVG_TURBULENCE_TYPE_UNKNOWN', - 'SVG_UNIT_TYPE_OBJECTBOUNDINGBOX', - 'SVG_UNIT_TYPE_UNKNOWN', - 'SVG_UNIT_TYPE_USERSPACEONUSE', - 'SVG_WRONG_TYPE_ERR', - 'SVG_ZOOMANDPAN_DISABLE', - 'SVG_ZOOMANDPAN_MAGNIFY', - 'SVG_ZOOMANDPAN_UNKNOWN', - 'SYNC_CONDITION', - 'SYNC_FENCE', - 'SYNC_FLAGS', - 'SYNC_FLUSH_COMMANDS_BIT', - 'SYNC_GPU_COMMANDS_COMPLETE', - 'SYNC_STATUS', - 'SYNTAX_ERR', - 'SavedPages', - 'Screen', - 'ScreenOrientation', - 'Script', - 'ScriptProcessorNode', - 'ScrollAreaEvent', - 'SecurityPolicyViolationEvent', - 'Selection', - 'Sensor', - 'SensorErrorEvent', - 'ServiceWorker', - 'ServiceWorkerContainer', - 'ServiceWorkerRegistration', - 'SessionDescription', - 'Set', - 'ShadowRoot', - 'SharedArrayBuffer', - 'SharedWorker', - 'SimpleGestureEvent', - 'SourceBuffer', - 'SourceBufferList', - 'SpeechSynthesis', - 'SpeechSynthesisErrorEvent', - 'SpeechSynthesisEvent', - 'SpeechSynthesisUtterance', - 'SpeechSynthesisVoice', - 'StaticRange', - 'StereoPannerNode', - 'StopIteration', - 'Storage', - 'StorageEvent', - 'StorageManager', - 'String', - 'StructType', - 'StylePropertyMap', - 'StylePropertyMapReadOnly', - 'StyleSheet', - 'StyleSheetList', - 'SubmitEvent', - 'SubtleCrypto', - 'Symbol', - 'SyncManager', - 'SyntaxError', - 'TEMPORARY', - 'TEXTPATH_METHODTYPE_ALIGN', - 'TEXTPATH_METHODTYPE_STRETCH', - 'TEXTPATH_METHODTYPE_UNKNOWN', - 'TEXTPATH_SPACINGTYPE_AUTO', - 'TEXTPATH_SPACINGTYPE_EXACT', - 'TEXTPATH_SPACINGTYPE_UNKNOWN', - 'TEXTURE', - 'TEXTURE0', - 'TEXTURE1', - 'TEXTURE10', - 'TEXTURE11', - 'TEXTURE12', - 'TEXTURE13', - 'TEXTURE14', - 'TEXTURE15', - 'TEXTURE16', - 'TEXTURE17', - 'TEXTURE18', - 'TEXTURE19', - 'TEXTURE2', - 'TEXTURE20', - 'TEXTURE21', - 'TEXTURE22', - 'TEXTURE23', - 'TEXTURE24', - 'TEXTURE25', - 'TEXTURE26', - 'TEXTURE27', - 'TEXTURE28', - 'TEXTURE29', - 'TEXTURE3', - 'TEXTURE30', - 'TEXTURE31', - 'TEXTURE4', - 'TEXTURE5', - 'TEXTURE6', - 'TEXTURE7', - 'TEXTURE8', - 'TEXTURE9', - 'TEXTURE_2D', - 'TEXTURE_2D_ARRAY', - 'TEXTURE_3D', - 'TEXTURE_BASE_LEVEL', - 'TEXTURE_BINDING_2D', - 'TEXTURE_BINDING_2D_ARRAY', - 'TEXTURE_BINDING_3D', - 'TEXTURE_BINDING_CUBE_MAP', - 'TEXTURE_COMPARE_FUNC', - 'TEXTURE_COMPARE_MODE', - 'TEXTURE_CUBE_MAP', - 'TEXTURE_CUBE_MAP_NEGATIVE_X', - 'TEXTURE_CUBE_MAP_NEGATIVE_Y', - 'TEXTURE_CUBE_MAP_NEGATIVE_Z', - 'TEXTURE_CUBE_MAP_POSITIVE_X', - 'TEXTURE_CUBE_MAP_POSITIVE_Y', - 'TEXTURE_CUBE_MAP_POSITIVE_Z', - 'TEXTURE_IMMUTABLE_FORMAT', - 'TEXTURE_IMMUTABLE_LEVELS', - 'TEXTURE_MAG_FILTER', - 'TEXTURE_MAX_ANISOTROPY_EXT', - 'TEXTURE_MAX_LEVEL', - 'TEXTURE_MAX_LOD', - 'TEXTURE_MIN_FILTER', - 'TEXTURE_MIN_LOD', - 'TEXTURE_WRAP_R', - 'TEXTURE_WRAP_S', - 'TEXTURE_WRAP_T', - 'TEXT_NODE', - 'TIMEOUT', - 'TIMEOUT_ERR', - 'TIMEOUT_EXPIRED', - 'TIMEOUT_IGNORED', - 'TOO_LARGE_ERR', - 'TRANSACTION_INACTIVE_ERR', - 'TRANSFORM_FEEDBACK', - 'TRANSFORM_FEEDBACK_ACTIVE', - 'TRANSFORM_FEEDBACK_BINDING', - 'TRANSFORM_FEEDBACK_BUFFER', - 'TRANSFORM_FEEDBACK_BUFFER_BINDING', - 'TRANSFORM_FEEDBACK_BUFFER_MODE', - 'TRANSFORM_FEEDBACK_BUFFER_SIZE', - 'TRANSFORM_FEEDBACK_BUFFER_START', - 'TRANSFORM_FEEDBACK_PAUSED', - 'TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN', - 'TRANSFORM_FEEDBACK_VARYINGS', - 'TRIANGLE', - 'TRIANGLES', - 'TRIANGLE_FAN', - 'TRIANGLE_STRIP', - 'TYPE_BACK_FORWARD', - 'TYPE_ERR', - 'TYPE_MISMATCH_ERR', - 'TYPE_NAVIGATE', - 'TYPE_RELOAD', - 'TYPE_RESERVED', - 'Table', - 'TaskAttributionTiming', - 'Text', - 'TextDecoder', - 'TextDecoderStream', - 'TextEncoder', - 'TextEncoderStream', - 'TextEvent', - 'TextMetrics', - 'TextTrack', - 'TextTrackCue', - 'TextTrackCueList', - 'TextTrackList', - 'TimeEvent', - 'TimeRanges', - 'Touch', - 'TouchEvent', - 'TouchList', - 'TrackEvent', - 'TransformStream', - 'TransitionEvent', - 'TreeWalker', - 'TrustedHTML', - 'TrustedScript', - 'TrustedScriptURL', - 'TrustedTypePolicy', - 'TrustedTypePolicyFactory', - 'TypeError', - 'TypedObject', - 'U2F', - 'UIEvent', - 'UNCACHED', - 'UNIFORM_ARRAY_STRIDE', - 'UNIFORM_BLOCK_ACTIVE_UNIFORMS', - 'UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES', - 'UNIFORM_BLOCK_BINDING', - 'UNIFORM_BLOCK_DATA_SIZE', - 'UNIFORM_BLOCK_INDEX', - 'UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER', - 'UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER', - 'UNIFORM_BUFFER', - 'UNIFORM_BUFFER_BINDING', - 'UNIFORM_BUFFER_OFFSET_ALIGNMENT', - 'UNIFORM_BUFFER_SIZE', - 'UNIFORM_BUFFER_START', - 'UNIFORM_IS_ROW_MAJOR', - 'UNIFORM_MATRIX_STRIDE', - 'UNIFORM_OFFSET', - 'UNIFORM_SIZE', - 'UNIFORM_TYPE', - 'UNKNOWN_ERR', - 'UNKNOWN_RULE', - 'UNMASKED_RENDERER_WEBGL', - 'UNMASKED_VENDOR_WEBGL', - 'UNORDERED_NODE_ITERATOR_TYPE', - 'UNORDERED_NODE_SNAPSHOT_TYPE', - 'UNPACK_ALIGNMENT', - 'UNPACK_COLORSPACE_CONVERSION_WEBGL', - 'UNPACK_FLIP_Y_WEBGL', - 'UNPACK_IMAGE_HEIGHT', - 'UNPACK_PREMULTIPLY_ALPHA_WEBGL', - 'UNPACK_ROW_LENGTH', - 'UNPACK_SKIP_IMAGES', - 'UNPACK_SKIP_PIXELS', - 'UNPACK_SKIP_ROWS', - 'UNSCHEDULED_STATE', - 'UNSENT', - 'UNSIGNALED', - 'UNSIGNED_BYTE', - 'UNSIGNED_INT', - 'UNSIGNED_INT_10F_11F_11F_REV', - 'UNSIGNED_INT_24_8', - 'UNSIGNED_INT_2_10_10_10_REV', - 'UNSIGNED_INT_5_9_9_9_REV', - 'UNSIGNED_INT_SAMPLER_2D', - 'UNSIGNED_INT_SAMPLER_2D_ARRAY', - 'UNSIGNED_INT_SAMPLER_3D', - 'UNSIGNED_INT_SAMPLER_CUBE', - 'UNSIGNED_INT_VEC2', - 'UNSIGNED_INT_VEC3', - 'UNSIGNED_INT_VEC4', - 'UNSIGNED_NORMALIZED', - 'UNSIGNED_SHORT', - 'UNSIGNED_SHORT_4_4_4_4', - 'UNSIGNED_SHORT_5_5_5_1', - 'UNSIGNED_SHORT_5_6_5', - 'UNSPECIFIED_EVENT_TYPE_ERR', - 'UPDATEREADY', - 'URIError', - 'URL', - 'URLSearchParams', - 'URLUnencoded', - 'URL_MISMATCH_ERR', - 'USB', - 'USBAlternateInterface', - 'USBConfiguration', - 'USBConnectionEvent', - 'USBDevice', - 'USBEndpoint', - 'USBInTransferResult', - 'USBInterface', - 'USBIsochronousInTransferPacket', - 'USBIsochronousInTransferResult', - 'USBIsochronousOutTransferPacket', - 'USBIsochronousOutTransferResult', - 'USBOutTransferResult', - 'UTC', - 'Uint16Array', - 'Uint32Array', - 'Uint8Array', - 'Uint8ClampedArray', - 'UserActivation', - 'UserMessageHandler', - 'UserMessageHandlersNamespace', - 'UserProximityEvent', - 'VALIDATE_STATUS', - 'VALIDATION_ERR', - 'VARIABLES_RULE', - 'VENDOR', - 'VERSION', - 'VERSION_CHANGE', - 'VERSION_ERR', - 'VERTEX_ARRAY_BINDING', - 'VERTEX_ATTRIB_ARRAY_BUFFER_BINDING', - 'VERTEX_ATTRIB_ARRAY_DIVISOR', - 'VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE', - 'VERTEX_ATTRIB_ARRAY_ENABLED', - 'VERTEX_ATTRIB_ARRAY_INTEGER', - 'VERTEX_ATTRIB_ARRAY_NORMALIZED', - 'VERTEX_ATTRIB_ARRAY_POINTER', - 'VERTEX_ATTRIB_ARRAY_SIZE', - 'VERTEX_ATTRIB_ARRAY_STRIDE', - 'VERTEX_ATTRIB_ARRAY_TYPE', - 'VERTEX_SHADER', - 'VERTICAL', - 'VERTICAL_AXIS', - 'VER_ERR', - 'VIEWPORT', - 'VIEWPORT_RULE', - 'VRDisplay', - 'VRDisplayCapabilities', - 'VRDisplayEvent', - 'VREyeParameters', - 'VRFieldOfView', - 'VRFrameData', - 'VRPose', - 'VRStageParameters', - 'VTTCue', - 'VTTRegion', - 'ValidityState', - 'VideoPlaybackQuality', - 'VideoStreamTrack', - 'VisualViewport', - 'WAIT_FAILED', - 'WEBKIT_FILTER_RULE', - 'WEBKIT_KEYFRAMES_RULE', - 'WEBKIT_KEYFRAME_RULE', - 'WEBKIT_REGION_RULE', - 'WRONG_DOCUMENT_ERR', - 'WakeLock', - 'WakeLockSentinel', - 'WasmAnyRef', - 'WaveShaperNode', - 'WeakMap', - 'WeakRef', - 'WeakSet', - 'WebAssembly', - 'WebGL2RenderingContext', - 'WebGLActiveInfo', - 'WebGLBuffer', - 'WebGLContextEvent', - 'WebGLFramebuffer', - 'WebGLProgram', - 'WebGLQuery', - 'WebGLRenderbuffer', - 'WebGLRenderingContext', - 'WebGLSampler', - 'WebGLShader', - 'WebGLShaderPrecisionFormat', - 'WebGLSync', - 'WebGLTexture', - 'WebGLTransformFeedback', - 'WebGLUniformLocation', - 'WebGLVertexArray', - 'WebGLVertexArrayObject', - 'WebKitAnimationEvent', - 'WebKitBlobBuilder', - 'WebKitCSSFilterRule', - 'WebKitCSSFilterValue', - 'WebKitCSSKeyframeRule', - 'WebKitCSSKeyframesRule', - 'WebKitCSSMatrix', - 'WebKitCSSRegionRule', - 'WebKitCSSTransformValue', - 'WebKitDataCue', - 'WebKitGamepad', - 'WebKitMediaKeyError', - 'WebKitMediaKeyMessageEvent', - 'WebKitMediaKeySession', - 'WebKitMediaKeys', - 'WebKitMediaSource', - 'WebKitMutationObserver', - 'WebKitNamespace', - 'WebKitPlaybackTargetAvailabilityEvent', - 'WebKitPoint', - 'WebKitShadowRoot', - 'WebKitSourceBuffer', - 'WebKitSourceBufferList', - 'WebKitTransitionEvent', - 'WebSocket', - 'WebkitAlignContent', - 'WebkitAlignItems', - 'WebkitAlignSelf', - 'WebkitAnimation', - 'WebkitAnimationDelay', - 'WebkitAnimationDirection', - 'WebkitAnimationDuration', - 'WebkitAnimationFillMode', - 'WebkitAnimationIterationCount', - 'WebkitAnimationName', - 'WebkitAnimationPlayState', - 'WebkitAnimationTimingFunction', - 'WebkitAppearance', - 'WebkitBackfaceVisibility', - 'WebkitBackgroundClip', - 'WebkitBackgroundOrigin', - 'WebkitBackgroundSize', - 'WebkitBorderBottomLeftRadius', - 'WebkitBorderBottomRightRadius', - 'WebkitBorderImage', - 'WebkitBorderRadius', - 'WebkitBorderTopLeftRadius', - 'WebkitBorderTopRightRadius', - 'WebkitBoxAlign', - 'WebkitBoxDirection', - 'WebkitBoxFlex', - 'WebkitBoxOrdinalGroup', - 'WebkitBoxOrient', - 'WebkitBoxPack', - 'WebkitBoxShadow', - 'WebkitBoxSizing', - 'WebkitFilter', - 'WebkitFlex', - 'WebkitFlexBasis', - 'WebkitFlexDirection', - 'WebkitFlexFlow', - 'WebkitFlexGrow', - 'WebkitFlexShrink', - 'WebkitFlexWrap', - 'WebkitJustifyContent', - 'WebkitLineClamp', - 'WebkitMask', - 'WebkitMaskClip', - 'WebkitMaskComposite', - 'WebkitMaskImage', - 'WebkitMaskOrigin', - 'WebkitMaskPosition', - 'WebkitMaskPositionX', - 'WebkitMaskPositionY', - 'WebkitMaskRepeat', - 'WebkitMaskSize', - 'WebkitOrder', - 'WebkitPerspective', - 'WebkitPerspectiveOrigin', - 'WebkitTextFillColor', - 'WebkitTextSizeAdjust', - 'WebkitTextStroke', - 'WebkitTextStrokeColor', - 'WebkitTextStrokeWidth', - 'WebkitTransform', - 'WebkitTransformOrigin', - 'WebkitTransformStyle', - 'WebkitTransition', - 'WebkitTransitionDelay', - 'WebkitTransitionDuration', - 'WebkitTransitionProperty', - 'WebkitTransitionTimingFunction', - 'WebkitUserSelect', - 'WheelEvent', - 'Window', - 'Worker', - 'Worklet', - 'WritableStream', - 'WritableStreamDefaultWriter', - 'XMLDocument', - 'XMLHttpRequest', - 'XMLHttpRequestEventTarget', - 'XMLHttpRequestException', - 'XMLHttpRequestProgressEvent', - 'XMLHttpRequestUpload', - 'XMLSerializer', - 'XMLStylesheetProcessingInstruction', - 'XPathEvaluator', - 'XPathException', - 'XPathExpression', - 'XPathNSResolver', - 'XPathResult', - 'XRBoundedReferenceSpace', - 'XRDOMOverlayState', - 'XRFrame', - 'XRHitTestResult', - 'XRHitTestSource', - 'XRInputSource', - 'XRInputSourceArray', - 'XRInputSourceEvent', - 'XRInputSourcesChangeEvent', - 'XRLayer', - 'XRPose', - 'XRRay', - 'XRReferenceSpace', - 'XRReferenceSpaceEvent', - 'XRRenderState', - 'XRRigidTransform', - 'XRSession', - 'XRSessionEvent', - 'XRSpace', - 'XRSystem', - 'XRTransientInputHitTestResult', - 'XRTransientInputHitTestSource', - 'XRView', - 'XRViewerPose', - 'XRViewport', - 'XRWebGLLayer', - 'XSLTProcessor', - 'ZERO', - '_XD0M_', - '_YD0M_', - '__defineGetter__', - '__defineSetter__', - '__lookupGetter__', - '__lookupSetter__', - '__opera', - '__proto__', - '_browserjsran', - 'a', - 'aLink', - 'abbr', - 'abort', - 'aborted', - 'abs', - 'absolute', - 'acceleration', - 'accelerationIncludingGravity', - 'accelerator', - 'accept', - 'acceptCharset', - 'acceptNode', - 'accessKey', - 'accessKeyLabel', - 'accuracy', - 'acos', - 'acosh', - 'action', - 'actionURL', - 'actions', - 'activated', - 'active', - 'activeCues', - 'activeElement', - 'activeSourceBuffers', - 'activeSourceCount', - 'activeTexture', - 'activeVRDisplays', - 'actualBoundingBoxAscent', - 'actualBoundingBoxDescent', - 'actualBoundingBoxLeft', - 'actualBoundingBoxRight', - 'add', - 'addAll', - 'addBehavior', - 'addCandidate', - 'addColorStop', - 'addCue', - 'addElement', - 'addEventListener', - 'addFilter', - 'addFromString', - 'addFromUri', - 'addIceCandidate', - 'addImport', - 'addListener', - 'addModule', - 'addNamed', - 'addPageRule', - 'addPath', - 'addPointer', - 'addRange', - 'addRegion', - 'addRule', - 'addSearchEngine', - 'addSourceBuffer', - 'addStream', - 'addTextTrack', - 'addTrack', - 'addTransceiver', - 'addWakeLockListener', - 'added', - 'addedNodes', - 'additionalName', - 'additiveSymbols', - 'addons', - 'address', - 'addressLine', - 'adoptNode', - 'adoptedStyleSheets', - 'adr', - 'advance', - 'after', - 'album', - 'alert', - 'algorithm', - 'align', - 'align-content', - 'align-items', - 'align-self', - 'alignContent', - 'alignItems', - 'alignSelf', - 'alignmentBaseline', - 'alinkColor', - 'all', - 'allSettled', - 'allow', - 'allowFullscreen', - 'allowPaymentRequest', - 'allowedDirections', - 'allowedFeatures', - 'allowedToPlay', - 'allowsFeature', - 'alpha', - 'alt', - 'altGraphKey', - 'altHtml', - 'altKey', - 'altLeft', - 'alternate', - 'alternateSetting', - 'alternates', - 'altitude', - 'altitudeAccuracy', - 'amplitude', - 'ancestorOrigins', - 'anchor', - 'anchorNode', - 'anchorOffset', - 'anchors', - 'and', - 'angle', - 'angularAcceleration', - 'angularVelocity', - 'animVal', - 'animate', - 'animatedInstanceRoot', - 'animatedNormalizedPathSegList', - 'animatedPathSegList', - 'animatedPoints', - 'animation', - 'animation-delay', - 'animation-direction', - 'animation-duration', - 'animation-fill-mode', - 'animation-iteration-count', - 'animation-name', - 'animation-play-state', - 'animation-timing-function', - 'animationDelay', - 'animationDirection', - 'animationDuration', - 'animationFillMode', - 'animationIterationCount', - 'animationName', - 'animationPlayState', - 'animationStartTime', - 'animationTimingFunction', - 'animationsPaused', - 'anniversary', - 'antialias', - 'anticipatedRemoval', - 'any', - 'app', - 'appCodeName', - 'appMinorVersion', - 'appName', - 'appNotifications', - 'appVersion', - 'appearance', - 'append', - 'appendBuffer', - 'appendChild', - 'appendData', - 'appendItem', - 'appendMedium', - 'appendNamed', - 'appendRule', - 'appendStream', - 'appendWindowEnd', - 'appendWindowStart', - 'applets', - 'applicationCache', - 'applicationServerKey', - 'apply', - 'applyConstraints', - 'applyElement', - 'arc', - 'arcTo', - 'archive', - 'areas', - 'arguments', - 'ariaAtomic', - 'ariaAutoComplete', - 'ariaBusy', - 'ariaChecked', - 'ariaColCount', - 'ariaColIndex', - 'ariaColSpan', - 'ariaCurrent', - 'ariaDescription', - 'ariaDisabled', - 'ariaExpanded', - 'ariaHasPopup', - 'ariaHidden', - 'ariaKeyShortcuts', - 'ariaLabel', - 'ariaLevel', - 'ariaLive', - 'ariaModal', - 'ariaMultiLine', - 'ariaMultiSelectable', - 'ariaOrientation', - 'ariaPlaceholder', - 'ariaPosInSet', - 'ariaPressed', - 'ariaReadOnly', - 'ariaRelevant', - 'ariaRequired', - 'ariaRoleDescription', - 'ariaRowCount', - 'ariaRowIndex', - 'ariaRowSpan', - 'ariaSelected', - 'ariaSetSize', - 'ariaSort', - 'ariaValueMax', - 'ariaValueMin', - 'ariaValueNow', - 'ariaValueText', - 'arrayBuffer', - 'artist', - 'artwork', - 'as', - 'asIntN', - 'asUintN', - 'asin', - 'asinh', - 'assert', - 'assign', - 'assignedElements', - 'assignedNodes', - 'assignedSlot', - 'async', - 'asyncIterator', - 'atEnd', - 'atan', - 'atan2', - 'atanh', - 'atob', - 'attachEvent', - 'attachInternals', - 'attachShader', - 'attachShadow', - 'attachments', - 'attack', - 'attestationObject', - 'attrChange', - 'attrName', - 'attributeFilter', - 'attributeName', - 'attributeNamespace', - 'attributeOldValue', - 'attributeStyleMap', - 'attributes', - 'attribution', - 'audioBitsPerSecond', - 'audioTracks', - 'audioWorklet', - 'authenticatedSignedWrites', - 'authenticatorData', - 'autoIncrement', - 'autobuffer', - 'autocapitalize', - 'autocomplete', - 'autocorrect', - 'autofocus', - 'automationRate', - 'autoplay', - 'availHeight', - 'availLeft', - 'availTop', - 'availWidth', - 'availability', - 'available', - 'aversion', - 'ax', - 'axes', - 'axis', - 'ay', - 'azimuth', - 'b', - 'back', - 'backface-visibility', - 'backfaceVisibility', - 'background', - 'background-attachment', - 'background-blend-mode', - 'background-clip', - 'background-color', - 'background-image', - 'background-origin', - 'background-position', - 'background-position-x', - 'background-position-y', - 'background-repeat', - 'background-size', - 'backgroundAttachment', - 'backgroundBlendMode', - 'backgroundClip', - 'backgroundColor', - 'backgroundFetch', - 'backgroundImage', - 'backgroundOrigin', - 'backgroundPosition', - 'backgroundPositionX', - 'backgroundPositionY', - 'backgroundRepeat', - 'backgroundSize', - 'badInput', - 'badge', - 'balance', - 'baseFrequencyX', - 'baseFrequencyY', - 'baseLatency', - 'baseLayer', - 'baseNode', - 'baseOffset', - 'baseURI', - 'baseVal', - 'baselineShift', - 'battery', - 'bday', - 'before', - 'beginElement', - 'beginElementAt', - 'beginPath', - 'beginQuery', - 'beginTransformFeedback', - 'behavior', - 'behaviorCookie', - 'behaviorPart', - 'behaviorUrns', - 'beta', - 'bezierCurveTo', - 'bgColor', - 'bgProperties', - 'bias', - 'big', - 'bigint64', - 'biguint64', - 'binaryType', - 'bind', - 'bindAttribLocation', - 'bindBuffer', - 'bindBufferBase', - 'bindBufferRange', - 'bindFramebuffer', - 'bindRenderbuffer', - 'bindSampler', - 'bindTexture', - 'bindTransformFeedback', - 'bindVertexArray', - 'blendColor', - 'blendEquation', - 'blendEquationSeparate', - 'blendFunc', - 'blendFuncSeparate', - 'blink', - 'blitFramebuffer', - 'blob', - 'block-size', - 'blockDirection', - 'blockSize', - 'blockedURI', - 'blue', - 'bluetooth', - 'blur', - 'body', - 'bodyUsed', - 'bold', - 'bookmarks', - 'booleanValue', - 'border', - 'border-block', - 'border-block-color', - 'border-block-end', - 'border-block-end-color', - 'border-block-end-style', - 'border-block-end-width', - 'border-block-start', - 'border-block-start-color', - 'border-block-start-style', - 'border-block-start-width', - 'border-block-style', - 'border-block-width', - 'border-bottom', - 'border-bottom-color', - 'border-bottom-left-radius', - 'border-bottom-right-radius', - 'border-bottom-style', - 'border-bottom-width', - 'border-collapse', - 'border-color', - 'border-end-end-radius', - 'border-end-start-radius', - 'border-image', - 'border-image-outset', - 'border-image-repeat', - 'border-image-slice', - 'border-image-source', - 'border-image-width', - 'border-inline', - 'border-inline-color', - 'border-inline-end', - 'border-inline-end-color', - 'border-inline-end-style', - 'border-inline-end-width', - 'border-inline-start', - 'border-inline-start-color', - 'border-inline-start-style', - 'border-inline-start-width', - 'border-inline-style', - 'border-inline-width', - 'border-left', - 'border-left-color', - 'border-left-style', - 'border-left-width', - 'border-radius', - 'border-right', - 'border-right-color', - 'border-right-style', - 'border-right-width', - 'border-spacing', - 'border-start-end-radius', - 'border-start-start-radius', - 'border-style', - 'border-top', - 'border-top-color', - 'border-top-left-radius', - 'border-top-right-radius', - 'border-top-style', - 'border-top-width', - 'border-width', - 'borderBlock', - 'borderBlockColor', - 'borderBlockEnd', - 'borderBlockEndColor', - 'borderBlockEndStyle', - 'borderBlockEndWidth', - 'borderBlockStart', - 'borderBlockStartColor', - 'borderBlockStartStyle', - 'borderBlockStartWidth', - 'borderBlockStyle', - 'borderBlockWidth', - 'borderBottom', - 'borderBottomColor', - 'borderBottomLeftRadius', - 'borderBottomRightRadius', - 'borderBottomStyle', - 'borderBottomWidth', - 'borderBoxSize', - 'borderCollapse', - 'borderColor', - 'borderColorDark', - 'borderColorLight', - 'borderEndEndRadius', - 'borderEndStartRadius', - 'borderImage', - 'borderImageOutset', - 'borderImageRepeat', - 'borderImageSlice', - 'borderImageSource', - 'borderImageWidth', - 'borderInline', - 'borderInlineColor', - 'borderInlineEnd', - 'borderInlineEndColor', - 'borderInlineEndStyle', - 'borderInlineEndWidth', - 'borderInlineStart', - 'borderInlineStartColor', - 'borderInlineStartStyle', - 'borderInlineStartWidth', - 'borderInlineStyle', - 'borderInlineWidth', - 'borderLeft', - 'borderLeftColor', - 'borderLeftStyle', - 'borderLeftWidth', - 'borderRadius', - 'borderRight', - 'borderRightColor', - 'borderRightStyle', - 'borderRightWidth', - 'borderSpacing', - 'borderStartEndRadius', - 'borderStartStartRadius', - 'borderStyle', - 'borderTop', - 'borderTopColor', - 'borderTopLeftRadius', - 'borderTopRightRadius', - 'borderTopStyle', - 'borderTopWidth', - 'borderWidth', - 'bottom', - 'bottomMargin', - 'bound', - 'boundElements', - 'boundingClientRect', - 'boundingHeight', - 'boundingLeft', - 'boundingTop', - 'boundingWidth', - 'bounds', - 'boundsGeometry', - 'box-decoration-break', - 'box-shadow', - 'box-sizing', - 'boxDecorationBreak', - 'boxShadow', - 'boxSizing', - 'break-after', - 'break-before', - 'break-inside', - 'breakAfter', - 'breakBefore', - 'breakInside', - 'broadcast', - 'browserLanguage', - 'btoa', - 'bubbles', - 'buffer', - 'bufferData', - 'bufferDepth', - 'bufferSize', - 'bufferSubData', - 'buffered', - 'bufferedAmount', - 'bufferedAmountLowThreshold', - 'buildID', - 'buildNumber', - 'button', - 'buttonID', - 'buttons', - 'byteLength', - 'byteOffset', - 'bytesWritten', - 'c', - 'cache', - 'caches', - 'call', - 'caller', - 'canBeFormatted', - 'canBeMounted', - 'canBeShared', - 'canHaveChildren', - 'canHaveHTML', - 'canInsertDTMF', - 'canMakePayment', - 'canPlayType', - 'canPresent', - 'canTrickleIceCandidates', - 'cancel', - 'cancelAndHoldAtTime', - 'cancelAnimationFrame', - 'cancelBubble', - 'cancelIdleCallback', - 'cancelScheduledValues', - 'cancelVideoFrameCallback', - 'cancelWatchAvailability', - 'cancelable', - 'candidate', - 'canonicalUUID', - 'canvas', - 'capabilities', - 'caption', - 'caption-side', - 'captionSide', - 'capture', - 'captureEvents', - 'captureStackTrace', - 'captureStream', - 'caret-color', - 'caretBidiLevel', - 'caretColor', - 'caretPositionFromPoint', - 'caretRangeFromPoint', - 'cast', - 'catch', - 'category', - 'cbrt', - 'cd', - 'ceil', - 'cellIndex', - 'cellPadding', - 'cellSpacing', - 'cells', - 'ch', - 'chOff', - 'chain', - 'challenge', - 'changeType', - 'changedTouches', - 'channel', - 'channelCount', - 'channelCountMode', - 'channelInterpretation', - 'char', - 'charAt', - 'charCode', - 'charCodeAt', - 'charIndex', - 'charLength', - 'characterData', - 'characterDataOldValue', - 'characterSet', - 'characteristic', - 'charging', - 'chargingTime', - 'charset', - 'check', - 'checkEnclosure', - 'checkFramebufferStatus', - 'checkIntersection', - 'checkValidity', - 'checked', - 'childElementCount', - 'childList', - 'childNodes', - 'children', - 'chrome', - 'ciphertext', - 'cite', - 'city', - 'claimInterface', - 'claimed', - 'classList', - 'className', - 'classid', - 'clear', - 'clearAppBadge', - 'clearAttributes', - 'clearBufferfi', - 'clearBufferfv', - 'clearBufferiv', - 'clearBufferuiv', - 'clearColor', - 'clearData', - 'clearDepth', - 'clearHalt', - 'clearImmediate', - 'clearInterval', - 'clearLiveSeekableRange', - 'clearMarks', - 'clearMaxGCPauseAccumulator', - 'clearMeasures', - 'clearParameters', - 'clearRect', - 'clearResourceTimings', - 'clearShadow', - 'clearStencil', - 'clearTimeout', - 'clearWatch', - 'click', - 'clickCount', - 'clientDataJSON', - 'clientHeight', - 'clientInformation', - 'clientLeft', - 'clientRect', - 'clientRects', - 'clientTop', - 'clientWaitSync', - 'clientWidth', - 'clientX', - 'clientY', - 'clip', - 'clip-path', - 'clip-rule', - 'clipBottom', - 'clipLeft', - 'clipPath', - 'clipPathUnits', - 'clipRight', - 'clipRule', - 'clipTop', - 'clipboard', - 'clipboardData', - 'clone', - 'cloneContents', - 'cloneNode', - 'cloneRange', - 'close', - 'closePath', - 'closed', - 'closest', - 'clz', - 'clz32', - 'cm', - 'cmp', - 'code', - 'codeBase', - 'codePointAt', - 'codeType', - 'colSpan', - 'collapse', - 'collapseToEnd', - 'collapseToStart', - 'collapsed', - 'collect', - 'colno', - 'color', - 'color-adjust', - 'color-interpolation', - 'color-interpolation-filters', - 'colorAdjust', - 'colorDepth', - 'colorInterpolation', - 'colorInterpolationFilters', - 'colorMask', - 'colorType', - 'cols', - 'column-count', - 'column-fill', - 'column-gap', - 'column-rule', - 'column-rule-color', - 'column-rule-style', - 'column-rule-width', - 'column-span', - 'column-width', - 'columnCount', - 'columnFill', - 'columnGap', - 'columnNumber', - 'columnRule', - 'columnRuleColor', - 'columnRuleStyle', - 'columnRuleWidth', - 'columnSpan', - 'columnWidth', - 'columns', - 'command', - 'commit', - 'commitPreferences', - 'commitStyles', - 'commonAncestorContainer', - 'compact', - 'compareBoundaryPoints', - 'compareDocumentPosition', - 'compareEndPoints', - 'compareExchange', - 'compareNode', - 'comparePoint', - 'compatMode', - 'compatible', - 'compile', - 'compileShader', - 'compileStreaming', - 'complete', - 'component', - 'componentFromPoint', - 'composed', - 'composedPath', - 'composite', - 'compositionEndOffset', - 'compositionStartOffset', - 'compressedTexImage2D', - 'compressedTexImage3D', - 'compressedTexSubImage2D', - 'compressedTexSubImage3D', - 'computedStyleMap', - 'concat', - 'conditionText', - 'coneInnerAngle', - 'coneOuterAngle', - 'coneOuterGain', - 'configuration', - 'configurationName', - 'configurationValue', - 'configurations', - 'confirm', - 'confirmComposition', - 'confirmSiteSpecificTrackingException', - 'confirmWebWideTrackingException', - 'connect', - 'connectEnd', - 'connectShark', - 'connectStart', - 'connected', - 'connection', - 'connectionList', - 'connectionSpeed', - 'connectionState', - 'connections', - 'console', - 'consolidate', - 'constraint', - 'constrictionActive', - 'construct', - 'constructor', - 'contactID', - 'contain', - 'containerId', - 'containerName', - 'containerSrc', - 'containerType', - 'contains', - 'containsNode', - 'content', - 'contentBoxSize', - 'contentDocument', - 'contentEditable', - 'contentHint', - 'contentOverflow', - 'contentRect', - 'contentScriptType', - 'contentStyleType', - 'contentType', - 'contentWindow', - 'context', - 'contextMenu', - 'contextmenu', - 'continue', - 'continuePrimaryKey', - 'continuous', - 'control', - 'controlTransferIn', - 'controlTransferOut', - 'controller', - 'controls', - 'controlsList', - 'convertPointFromNode', - 'convertQuadFromNode', - 'convertRectFromNode', - 'convertToBlob', - 'convertToSpecifiedUnits', - 'cookie', - 'cookieEnabled', - 'coords', - 'copyBufferSubData', - 'copyFromChannel', - 'copyTexImage2D', - 'copyTexSubImage2D', - 'copyTexSubImage3D', - 'copyToChannel', - 'copyWithin', - 'correspondingElement', - 'correspondingUseElement', - 'corruptedVideoFrames', - 'cos', - 'cosh', - 'count', - 'countReset', - 'counter-increment', - 'counter-reset', - 'counter-set', - 'counterIncrement', - 'counterReset', - 'counterSet', - 'country', - 'cpuClass', - 'cpuSleepAllowed', - 'create', - 'createAnalyser', - 'createAnswer', - 'createAttribute', - 'createAttributeNS', - 'createBiquadFilter', - 'createBuffer', - 'createBufferSource', - 'createCDATASection', - 'createCSSStyleSheet', - 'createCaption', - 'createChannelMerger', - 'createChannelSplitter', - 'createComment', - 'createConstantSource', - 'createContextualFragment', - 'createControlRange', - 'createConvolver', - 'createDTMFSender', - 'createDataChannel', - 'createDelay', - 'createDelayNode', - 'createDocument', - 'createDocumentFragment', - 'createDocumentType', - 'createDynamicsCompressor', - 'createElement', - 'createElementNS', - 'createEntityReference', - 'createEvent', - 'createEventObject', - 'createExpression', - 'createFramebuffer', - 'createFunction', - 'createGain', - 'createGainNode', - 'createHTML', - 'createHTMLDocument', - 'createIIRFilter', - 'createImageBitmap', - 'createImageData', - 'createIndex', - 'createJavaScriptNode', - 'createLinearGradient', - 'createMediaElementSource', - 'createMediaKeys', - 'createMediaStreamDestination', - 'createMediaStreamSource', - 'createMediaStreamTrackSource', - 'createMutableFile', - 'createNSResolver', - 'createNodeIterator', - 'createNotification', - 'createObjectStore', - 'createObjectURL', - 'createOffer', - 'createOscillator', - 'createPanner', - 'createPattern', - 'createPeriodicWave', - 'createPolicy', - 'createPopup', - 'createProcessingInstruction', - 'createProgram', - 'createQuery', - 'createRadialGradient', - 'createRange', - 'createRangeCollection', - 'createReader', - 'createRenderbuffer', - 'createSVGAngle', - 'createSVGLength', - 'createSVGMatrix', - 'createSVGNumber', - 'createSVGPathSegArcAbs', - 'createSVGPathSegArcRel', - 'createSVGPathSegClosePath', - 'createSVGPathSegCurvetoCubicAbs', - 'createSVGPathSegCurvetoCubicRel', - 'createSVGPathSegCurvetoCubicSmoothAbs', - 'createSVGPathSegCurvetoCubicSmoothRel', - 'createSVGPathSegCurvetoQuadraticAbs', - 'createSVGPathSegCurvetoQuadraticRel', - 'createSVGPathSegCurvetoQuadraticSmoothAbs', - 'createSVGPathSegCurvetoQuadraticSmoothRel', - 'createSVGPathSegLinetoAbs', - 'createSVGPathSegLinetoHorizontalAbs', - 'createSVGPathSegLinetoHorizontalRel', - 'createSVGPathSegLinetoRel', - 'createSVGPathSegLinetoVerticalAbs', - 'createSVGPathSegLinetoVerticalRel', - 'createSVGPathSegMovetoAbs', - 'createSVGPathSegMovetoRel', - 'createSVGPoint', - 'createSVGRect', - 'createSVGTransform', - 'createSVGTransformFromMatrix', - 'createSampler', - 'createScript', - 'createScriptProcessor', - 'createScriptURL', - 'createSession', - 'createShader', - 'createShadowRoot', - 'createStereoPanner', - 'createStyleSheet', - 'createTBody', - 'createTFoot', - 'createTHead', - 'createTextNode', - 'createTextRange', - 'createTexture', - 'createTouch', - 'createTouchList', - 'createTransformFeedback', - 'createTreeWalker', - 'createVertexArray', - 'createWaveShaper', - 'creationTime', - 'credentials', - 'crossOrigin', - 'crossOriginIsolated', - 'crypto', - 'csi', - 'csp', - 'cssFloat', - 'cssRules', - 'cssText', - 'cssValueType', - 'ctrlKey', - 'ctrlLeft', - 'cues', - 'cullFace', - 'currentDirection', - 'currentLocalDescription', - 'currentNode', - 'currentPage', - 'currentRect', - 'currentRemoteDescription', - 'currentScale', - 'currentScript', - 'currentSrc', - 'currentState', - 'currentStyle', - 'currentTarget', - 'currentTime', - 'currentTranslate', - 'currentView', - 'cursor', - 'curve', - 'customElements', - 'customError', - 'cx', - 'cy', - 'd', - 'data', - 'dataFld', - 'dataFormatAs', - 'dataLoss', - 'dataLossMessage', - 'dataPageSize', - 'dataSrc', - 'dataTransfer', - 'database', - 'databases', - 'dataset', - 'dateTime', - 'db', - 'debug', - 'debuggerEnabled', - 'declare', - 'decode', - 'decodeAudioData', - 'decodeURI', - 'decodeURIComponent', - 'decodedBodySize', - 'decoding', - 'decodingInfo', - 'decrypt', - 'default', - 'defaultCharset', - 'defaultChecked', - 'defaultMuted', - 'defaultPlaybackRate', - 'defaultPolicy', - 'defaultPrevented', - 'defaultRequest', - 'defaultSelected', - 'defaultStatus', - 'defaultURL', - 'defaultValue', - 'defaultView', - 'defaultstatus', - 'defer', - 'define', - 'defineMagicFunction', - 'defineMagicVariable', - 'defineProperties', - 'defineProperty', - 'deg', - 'delay', - 'delayTime', - 'delegatesFocus', - 'delete', - 'deleteBuffer', - 'deleteCaption', - 'deleteCell', - 'deleteContents', - 'deleteData', - 'deleteDatabase', - 'deleteFramebuffer', - 'deleteFromDocument', - 'deleteIndex', - 'deleteMedium', - 'deleteObjectStore', - 'deleteProgram', - 'deleteProperty', - 'deleteQuery', - 'deleteRenderbuffer', - 'deleteRow', - 'deleteRule', - 'deleteSampler', - 'deleteShader', - 'deleteSync', - 'deleteTFoot', - 'deleteTHead', - 'deleteTexture', - 'deleteTransformFeedback', - 'deleteVertexArray', - 'deliverChangeRecords', - 'delivery', - 'deliveryInfo', - 'deliveryStatus', - 'deliveryTimestamp', - 'delta', - 'deltaMode', - 'deltaX', - 'deltaY', - 'deltaZ', - 'dependentLocality', - 'depthFar', - 'depthFunc', - 'depthMask', - 'depthNear', - 'depthRange', - 'deref', - 'deriveBits', - 'deriveKey', - 'description', - 'deselectAll', - 'designMode', - 'desiredSize', - 'destination', - 'destinationURL', - 'detach', - 'detachEvent', - 'detachShader', - 'detail', - 'details', - 'detect', - 'detune', - 'device', - 'deviceClass', - 'deviceId', - 'deviceMemory', - 'devicePixelContentBoxSize', - 'devicePixelRatio', - 'deviceProtocol', - 'deviceSubclass', - 'deviceVersionMajor', - 'deviceVersionMinor', - 'deviceVersionSubminor', - 'deviceXDPI', - 'deviceYDPI', - 'didTimeout', - 'diffuseConstant', - 'digest', - 'dimensions', - 'dir', - 'dirName', - 'direction', - 'dirxml', - 'disable', - 'disablePictureInPicture', - 'disableRemotePlayback', - 'disableVertexAttribArray', - 'disabled', - 'dischargingTime', - 'disconnect', - 'disconnectShark', - 'dispatchEvent', - 'display', - 'displayId', - 'displayName', - 'disposition', - 'distanceModel', - 'div', - 'divisor', - 'djsapi', - 'djsproxy', - 'doImport', - 'doNotTrack', - 'doScroll', - 'doctype', - 'document', - 'documentElement', - 'documentMode', - 'documentURI', - 'dolphin', - 'dolphinGameCenter', - 'dolphininfo', - 'dolphinmeta', - 'domComplete', - 'domContentLoadedEventEnd', - 'domContentLoadedEventStart', - 'domInteractive', - 'domLoading', - 'domOverlayState', - 'domain', - 'domainLookupEnd', - 'domainLookupStart', - 'dominant-baseline', - 'dominantBaseline', - 'done', - 'dopplerFactor', - 'dotAll', - 'downDegrees', - 'downlink', - 'download', - 'downloadTotal', - 'downloaded', - 'dpcm', - 'dpi', - 'dppx', - 'dragDrop', - 'draggable', - 'drawArrays', - 'drawArraysInstanced', - 'drawArraysInstancedANGLE', - 'drawBuffers', - 'drawCustomFocusRing', - 'drawElements', - 'drawElementsInstanced', - 'drawElementsInstancedANGLE', - 'drawFocusIfNeeded', - 'drawImage', - 'drawImageFromRect', - 'drawRangeElements', - 'drawSystemFocusRing', - 'drawingBufferHeight', - 'drawingBufferWidth', - 'dropEffect', - 'droppedVideoFrames', - 'dropzone', - 'dtmf', - 'dump', - 'dumpProfile', - 'duplicate', - 'durability', - 'duration', - 'dvname', - 'dvnum', - 'dx', - 'dy', - 'dynsrc', - 'e', - 'edgeMode', - 'effect', - 'effectAllowed', - 'effectiveDirective', - 'effectiveType', - 'elapsedTime', - 'element', - 'elementFromPoint', - 'elementTiming', - 'elements', - 'elementsFromPoint', - 'elevation', - 'ellipse', - 'em', - 'email', - 'embeds', - 'emma', - 'empty', - 'empty-cells', - 'emptyCells', - 'emptyHTML', - 'emptyScript', - 'emulatedPosition', - 'enable', - 'enableBackground', - 'enableDelegations', - 'enableStyleSheetsForSet', - 'enableVertexAttribArray', - 'enabled', - 'enabledPlugin', - 'encode', - 'encodeInto', - 'encodeURI', - 'encodeURIComponent', - 'encodedBodySize', - 'encoding', - 'encodingInfo', - 'encrypt', - 'enctype', - 'end', - 'endContainer', - 'endElement', - 'endElementAt', - 'endOfStream', - 'endOffset', - 'endQuery', - 'endTime', - 'endTransformFeedback', - 'ended', - 'endpoint', - 'endpointNumber', - 'endpoints', - 'endsWith', - 'enterKeyHint', - 'entities', - 'entries', - 'entryType', - 'enumerate', - 'enumerateDevices', - 'enumerateEditable', - 'environmentBlendMode', - 'equals', - 'error', - 'errorCode', - 'errorDetail', - 'errorText', - 'escape', - 'estimate', - 'eval', - 'evaluate', - 'event', - 'eventPhase', - 'every', - 'ex', - 'exception', - 'exchange', - 'exec', - 'execCommand', - 'execCommandShowHelp', - 'execScript', - 'exitFullscreen', - 'exitPictureInPicture', - 'exitPointerLock', - 'exitPresent', - 'exp', - 'expand', - 'expandEntityReferences', - 'expando', - 'expansion', - 'expiration', - 'expirationTime', - 'expires', - 'expiryDate', - 'explicitOriginalTarget', - 'expm1', - 'exponent', - 'exponentialRampToValueAtTime', - 'exportKey', - 'exports', - 'extend', - 'extensions', - 'extentNode', - 'extentOffset', - 'external', - 'externalResourcesRequired', - 'extractContents', - 'extractable', - 'eye', - 'f', - 'face', - 'factoryReset', - 'failureReason', - 'fallback', - 'family', - 'familyName', - 'farthestViewportElement', - 'fastSeek', - 'fatal', - 'featureId', - 'featurePolicy', - 'featureSettings', - 'features', - 'fenceSync', - 'fetch', - 'fetchStart', - 'fftSize', - 'fgColor', - 'fieldOfView', - 'file', - 'fileCreatedDate', - 'fileHandle', - 'fileModifiedDate', - 'fileName', - 'fileSize', - 'fileUpdatedDate', - 'filename', - 'files', - 'filesystem', - 'fill', - 'fill-opacity', - 'fill-rule', - 'fillLightMode', - 'fillOpacity', - 'fillRect', - 'fillRule', - 'fillStyle', - 'fillText', - 'filter', - 'filterResX', - 'filterResY', - 'filterUnits', - 'filters', - 'finally', - 'find', - 'findIndex', - 'findRule', - 'findText', - 'finish', - 'finished', - 'fireEvent', - 'firesTouchEvents', - 'firstChild', - 'firstElementChild', - 'firstPage', - 'fixed', - 'flags', - 'flat', - 'flatMap', - 'flex', - 'flex-basis', - 'flex-direction', - 'flex-flow', - 'flex-grow', - 'flex-shrink', - 'flex-wrap', - 'flexBasis', - 'flexDirection', - 'flexFlow', - 'flexGrow', - 'flexShrink', - 'flexWrap', - 'flipX', - 'flipY', - 'float', - 'float32', - 'float64', - 'flood-color', - 'flood-opacity', - 'floodColor', - 'floodOpacity', - 'floor', - 'flush', - 'focus', - 'focusNode', - 'focusOffset', - 'font', - 'font-family', - 'font-feature-settings', - 'font-kerning', - 'font-language-override', - 'font-optical-sizing', - 'font-size', - 'font-size-adjust', - 'font-stretch', - 'font-style', - 'font-synthesis', - 'font-variant', - 'font-variant-alternates', - 'font-variant-caps', - 'font-variant-east-asian', - 'font-variant-ligatures', - 'font-variant-numeric', - 'font-variant-position', - 'font-variation-settings', - 'font-weight', - 'fontFamily', - 'fontFeatureSettings', - 'fontKerning', - 'fontLanguageOverride', - 'fontOpticalSizing', - 'fontSize', - 'fontSizeAdjust', - 'fontSmoothingEnabled', - 'fontStretch', - 'fontStyle', - 'fontSynthesis', - 'fontVariant', - 'fontVariantAlternates', - 'fontVariantCaps', - 'fontVariantEastAsian', - 'fontVariantLigatures', - 'fontVariantNumeric', - 'fontVariantPosition', - 'fontVariationSettings', - 'fontWeight', - 'fontcolor', - 'fontfaces', - 'fonts', - 'fontsize', - 'for', - 'forEach', - 'force', - 'forceRedraw', - 'form', - 'formAction', - 'formData', - 'formEnctype', - 'formMethod', - 'formNoValidate', - 'formTarget', - 'format', - 'formatToParts', - 'forms', - 'forward', - 'forwardX', - 'forwardY', - 'forwardZ', - 'foundation', - 'fr', - 'fragmentDirective', - 'frame', - 'frameBorder', - 'frameElement', - 'frameSpacing', - 'framebuffer', - 'framebufferHeight', - 'framebufferRenderbuffer', - 'framebufferTexture2D', - 'framebufferTextureLayer', - 'framebufferWidth', - 'frames', - 'freeSpace', - 'freeze', - 'frequency', - 'frequencyBinCount', - 'from', - 'fromCharCode', - 'fromCodePoint', - 'fromElement', - 'fromEntries', - 'fromFloat32Array', - 'fromFloat64Array', - 'fromMatrix', - 'fromPoint', - 'fromQuad', - 'fromRect', - 'frontFace', - 'fround', - 'fullPath', - 'fullScreen', - 'fullscreen', - 'fullscreenElement', - 'fullscreenEnabled', - 'fx', - 'fy', - 'gain', - 'gamepad', - 'gamma', - 'gap', - 'gatheringState', - 'gatt', - 'genderIdentity', - 'generateCertificate', - 'generateKey', - 'generateMipmap', - 'generateRequest', - 'geolocation', - 'gestureObject', - 'get', - 'getActiveAttrib', - 'getActiveUniform', - 'getActiveUniformBlockName', - 'getActiveUniformBlockParameter', - 'getActiveUniforms', - 'getAdjacentText', - 'getAll', - 'getAllKeys', - 'getAllResponseHeaders', - 'getAllowlistForFeature', - 'getAnimations', - 'getAsFile', - 'getAsString', - 'getAttachedShaders', - 'getAttribLocation', - 'getAttribute', - 'getAttributeNS', - 'getAttributeNames', - 'getAttributeNode', - 'getAttributeNodeNS', - 'getAttributeType', - 'getAudioTracks', - 'getAvailability', - 'getBBox', - 'getBattery', - 'getBigInt64', - 'getBigUint64', - 'getBlob', - 'getBookmark', - 'getBoundingClientRect', - 'getBounds', - 'getBoxQuads', - 'getBufferParameter', - 'getBufferSubData', - 'getByteFrequencyData', - 'getByteTimeDomainData', - 'getCSSCanvasContext', - 'getCTM', - 'getCandidateWindowClientRect', - 'getCanonicalLocales', - 'getCapabilities', - 'getChannelData', - 'getCharNumAtPosition', - 'getCharacteristic', - 'getCharacteristics', - 'getClientExtensionResults', - 'getClientRect', - 'getClientRects', - 'getCoalescedEvents', - 'getCompositionAlternatives', - 'getComputedStyle', - 'getComputedTextLength', - 'getComputedTiming', - 'getConfiguration', - 'getConstraints', - 'getContext', - 'getContextAttributes', - 'getContributingSources', - 'getCounterValue', - 'getCueAsHTML', - 'getCueById', - 'getCurrentPosition', - 'getCurrentTime', - 'getData', - 'getDatabaseNames', - 'getDate', - 'getDay', - 'getDefaultComputedStyle', - 'getDescriptor', - 'getDescriptors', - 'getDestinationInsertionPoints', - 'getDevices', - 'getDirectory', - 'getDisplayMedia', - 'getDistributedNodes', - 'getEditable', - 'getElementById', - 'getElementsByClassName', - 'getElementsByName', - 'getElementsByTagName', - 'getElementsByTagNameNS', - 'getEnclosureList', - 'getEndPositionOfChar', - 'getEntries', - 'getEntriesByName', - 'getEntriesByType', - 'getError', - 'getExtension', - 'getExtentOfChar', - 'getEyeParameters', - 'getFeature', - 'getFile', - 'getFiles', - 'getFilesAndDirectories', - 'getFingerprints', - 'getFloat32', - 'getFloat64', - 'getFloatFrequencyData', - 'getFloatTimeDomainData', - 'getFloatValue', - 'getFragDataLocation', - 'getFrameData', - 'getFramebufferAttachmentParameter', - 'getFrequencyResponse', - 'getFullYear', - 'getGamepads', - 'getHitTestResults', - 'getHitTestResultsForTransientInput', - 'getHours', - 'getIdentityAssertion', - 'getIds', - 'getImageData', - 'getIndexedParameter', - 'getInstalledRelatedApps', - 'getInt16', - 'getInt32', - 'getInt8', - 'getInternalformatParameter', - 'getIntersectionList', - 'getItem', - 'getItems', - 'getKey', - 'getKeyframes', - 'getLayers', - 'getLayoutMap', - 'getLineDash', - 'getLocalCandidates', - 'getLocalParameters', - 'getLocalStreams', - 'getMarks', - 'getMatchedCSSRules', - 'getMaxGCPauseSinceClear', - 'getMeasures', - 'getMetadata', - 'getMilliseconds', - 'getMinutes', - 'getModifierState', - 'getMonth', - 'getNamedItem', - 'getNamedItemNS', - 'getNativeFramebufferScaleFactor', - 'getNotifications', - 'getNotifier', - 'getNumberOfChars', - 'getOffsetReferenceSpace', - 'getOutputTimestamp', - 'getOverrideHistoryNavigationMode', - 'getOverrideStyle', - 'getOwnPropertyDescriptor', - 'getOwnPropertyDescriptors', - 'getOwnPropertyNames', - 'getOwnPropertySymbols', - 'getParameter', - 'getParameters', - 'getParent', - 'getPathSegAtLength', - 'getPhotoCapabilities', - 'getPhotoSettings', - 'getPointAtLength', - 'getPose', - 'getPredictedEvents', - 'getPreference', - 'getPreferenceDefault', - 'getPresentationAttribute', - 'getPreventDefault', - 'getPrimaryService', - 'getPrimaryServices', - 'getProgramInfoLog', - 'getProgramParameter', - 'getPropertyCSSValue', - 'getPropertyPriority', - 'getPropertyShorthand', - 'getPropertyType', - 'getPropertyValue', - 'getPrototypeOf', - 'getQuery', - 'getQueryParameter', - 'getRGBColorValue', - 'getRandomValues', - 'getRangeAt', - 'getReader', - 'getReceivers', - 'getRectValue', - 'getRegistration', - 'getRegistrations', - 'getRemoteCandidates', - 'getRemoteCertificates', - 'getRemoteParameters', - 'getRemoteStreams', - 'getRenderbufferParameter', - 'getResponseHeader', - 'getRoot', - 'getRootNode', - 'getRotationOfChar', - 'getSVGDocument', - 'getSamplerParameter', - 'getScreenCTM', - 'getSeconds', - 'getSelectedCandidatePair', - 'getSelection', - 'getSenders', - 'getService', - 'getSettings', - 'getShaderInfoLog', - 'getShaderParameter', - 'getShaderPrecisionFormat', - 'getShaderSource', - 'getSimpleDuration', - 'getSiteIcons', - 'getSources', - 'getSpeculativeParserUrls', - 'getStartPositionOfChar', - 'getStartTime', - 'getState', - 'getStats', - 'getStatusForPolicy', - 'getStorageUpdates', - 'getStreamById', - 'getStringValue', - 'getSubStringLength', - 'getSubscription', - 'getSupportedConstraints', - 'getSupportedExtensions', - 'getSupportedFormats', - 'getSyncParameter', - 'getSynchronizationSources', - 'getTags', - 'getTargetRanges', - 'getTexParameter', - 'getTime', - 'getTimezoneOffset', - 'getTiming', - 'getTotalLength', - 'getTrackById', - 'getTracks', - 'getTransceivers', - 'getTransform', - 'getTransformFeedbackVarying', - 'getTransformToElement', - 'getTransports', - 'getType', - 'getTypeMapping', - 'getUTCDate', - 'getUTCDay', - 'getUTCFullYear', - 'getUTCHours', - 'getUTCMilliseconds', - 'getUTCMinutes', - 'getUTCMonth', - 'getUTCSeconds', - 'getUint16', - 'getUint32', - 'getUint8', - 'getUniform', - 'getUniformBlockIndex', - 'getUniformIndices', - 'getUniformLocation', - 'getUserMedia', - 'getVRDisplays', - 'getValues', - 'getVarDate', - 'getVariableValue', - 'getVertexAttrib', - 'getVertexAttribOffset', - 'getVideoPlaybackQuality', - 'getVideoTracks', - 'getViewerPose', - 'getViewport', - 'getVoices', - 'getWakeLockState', - 'getWriter', - 'getYear', - 'givenName', - 'global', - 'globalAlpha', - 'globalCompositeOperation', - 'globalThis', - 'glyphOrientationHorizontal', - 'glyphOrientationVertical', - 'glyphRef', - 'go', - 'grabFrame', - 'grad', - 'gradientTransform', - 'gradientUnits', - 'grammars', - 'green', - 'grid', - 'grid-area', - 'grid-auto-columns', - 'grid-auto-flow', - 'grid-auto-rows', - 'grid-column', - 'grid-column-end', - 'grid-column-gap', - 'grid-column-start', - 'grid-gap', - 'grid-row', - 'grid-row-end', - 'grid-row-gap', - 'grid-row-start', - 'grid-template', - 'grid-template-areas', - 'grid-template-columns', - 'grid-template-rows', - 'gridArea', - 'gridAutoColumns', - 'gridAutoFlow', - 'gridAutoRows', - 'gridColumn', - 'gridColumnEnd', - 'gridColumnGap', - 'gridColumnStart', - 'gridGap', - 'gridRow', - 'gridRowEnd', - 'gridRowGap', - 'gridRowStart', - 'gridTemplate', - 'gridTemplateAreas', - 'gridTemplateColumns', - 'gridTemplateRows', - 'gripSpace', - 'group', - 'groupCollapsed', - 'groupEnd', - 'groupId', - 'hadRecentInput', - 'hand', - 'handedness', - 'hapticActuators', - 'hardwareConcurrency', - 'has', - 'hasAttribute', - 'hasAttributeNS', - 'hasAttributes', - 'hasBeenActive', - 'hasChildNodes', - 'hasComposition', - 'hasEnrolledInstrument', - 'hasExtension', - 'hasExternalDisplay', - 'hasFeature', - 'hasFocus', - 'hasInstance', - 'hasLayout', - 'hasOrientation', - 'hasOwnProperty', - 'hasPointerCapture', - 'hasPosition', - 'hasReading', - 'hasStorageAccess', - 'hash', - 'head', - 'headers', - 'heading', - 'height', - 'hidden', - 'hide', - 'hideFocus', - 'high', - 'highWaterMark', - 'hint', - 'history', - 'honorificPrefix', - 'honorificSuffix', - 'horizontalOverflow', - 'host', - 'hostCandidate', - 'hostname', - 'href', - 'hrefTranslate', - 'hreflang', - 'hspace', - 'html5TagCheckInerface', - 'htmlFor', - 'htmlText', - 'httpEquiv', - 'httpRequestStatusCode', - 'hwTimestamp', - 'hyphens', - 'hypot', - 'iccId', - 'iceConnectionState', - 'iceGatheringState', - 'iceTransport', - 'icon', - 'iconURL', - 'id', - 'identifier', - 'identity', - 'idpLoginUrl', - 'ignoreBOM', - 'ignoreCase', - 'ignoreDepthValues', - 'image-orientation', - 'image-rendering', - 'imageHeight', - 'imageOrientation', - 'imageRendering', - 'imageSizes', - 'imageSmoothingEnabled', - 'imageSmoothingQuality', - 'imageSrcset', - 'imageWidth', - 'images', - 'ime-mode', - 'imeMode', - 'implementation', - 'importKey', - 'importNode', - 'importStylesheet', - 'imports', - 'impp', - 'imul', - 'in', - 'in1', - 'in2', - 'inBandMetadataTrackDispatchType', - 'inRange', - 'includes', - 'incremental', - 'indeterminate', - 'index', - 'indexNames', - 'indexOf', - 'indexedDB', - 'indicate', - 'inertiaDestinationX', - 'inertiaDestinationY', - 'info', - 'init', - 'initAnimationEvent', - 'initBeforeLoadEvent', - 'initClipboardEvent', - 'initCloseEvent', - 'initCommandEvent', - 'initCompositionEvent', - 'initCustomEvent', - 'initData', - 'initDataType', - 'initDeviceMotionEvent', - 'initDeviceOrientationEvent', - 'initDragEvent', - 'initErrorEvent', - 'initEvent', - 'initFocusEvent', - 'initGestureEvent', - 'initHashChangeEvent', - 'initKeyEvent', - 'initKeyboardEvent', - 'initMSManipulationEvent', - 'initMessageEvent', - 'initMouseEvent', - 'initMouseScrollEvent', - 'initMouseWheelEvent', - 'initMutationEvent', - 'initNSMouseEvent', - 'initOverflowEvent', - 'initPageEvent', - 'initPageTransitionEvent', - 'initPointerEvent', - 'initPopStateEvent', - 'initProgressEvent', - 'initScrollAreaEvent', - 'initSimpleGestureEvent', - 'initStorageEvent', - 'initTextEvent', - 'initTimeEvent', - 'initTouchEvent', - 'initTransitionEvent', - 'initUIEvent', - 'initWebKitAnimationEvent', - 'initWebKitTransitionEvent', - 'initWebKitWheelEvent', - 'initWheelEvent', - 'initialTime', - 'initialize', - 'initiatorType', - 'inline-size', - 'inlineSize', - 'inlineVerticalFieldOfView', - 'inner', - 'innerHTML', - 'innerHeight', - 'innerText', - 'innerWidth', - 'input', - 'inputBuffer', - 'inputEncoding', - 'inputMethod', - 'inputMode', - 'inputSource', - 'inputSources', - 'inputType', - 'inputs', - 'insertAdjacentElement', - 'insertAdjacentHTML', - 'insertAdjacentText', - 'insertBefore', - 'insertCell', - 'insertDTMF', - 'insertData', - 'insertItemBefore', - 'insertNode', - 'insertRow', - 'insertRule', - 'inset', - 'inset-block', - 'inset-block-end', - 'inset-block-start', - 'inset-inline', - 'inset-inline-end', - 'inset-inline-start', - 'insetBlock', - 'insetBlockEnd', - 'insetBlockStart', - 'insetInline', - 'insetInlineEnd', - 'insetInlineStart', - 'installing', - 'instanceRoot', - 'instantiate', - 'instantiateStreaming', - 'instruments', - 'int16', - 'int32', - 'int8', - 'integrity', - 'interactionMode', - 'intercept', - 'interfaceClass', - 'interfaceName', - 'interfaceNumber', - 'interfaceProtocol', - 'interfaceSubclass', - 'interfaces', - 'interimResults', - 'internalSubset', - 'interpretation', - 'intersectionRatio', - 'intersectionRect', - 'intersectsNode', - 'interval', - 'invalidIteratorState', - 'invalidateFramebuffer', - 'invalidateSubFramebuffer', - 'inverse', - 'invertSelf', - 'is', - 'is2D', - 'isActive', - 'isAlternate', - 'isArray', - 'isBingCurrentSearchDefault', - 'isBuffer', - 'isCandidateWindowVisible', - 'isChar', - 'isCollapsed', - 'isComposing', - 'isConcatSpreadable', - 'isConnected', - 'isContentEditable', - 'isContentHandlerRegistered', - 'isContextLost', - 'isDefaultNamespace', - 'isDirectory', - 'isDisabled', - 'isEnabled', - 'isEqual', - 'isEqualNode', - 'isExtensible', - 'isExternalCTAP2SecurityKeySupported', - 'isFile', - 'isFinite', - 'isFramebuffer', - 'isFrozen', - 'isGenerator', - 'isHTML', - 'isHistoryNavigation', - 'isId', - 'isIdentity', - 'isInjected', - 'isInteger', - 'isIntersecting', - 'isLockFree', - 'isMap', - 'isMultiLine', - 'isNaN', - 'isOpen', - 'isPointInFill', - 'isPointInPath', - 'isPointInRange', - 'isPointInStroke', - 'isPrefAlternate', - 'isPresenting', - 'isPrimary', - 'isProgram', - 'isPropertyImplicit', - 'isProtocolHandlerRegistered', - 'isPrototypeOf', - 'isQuery', - 'isRenderbuffer', - 'isSafeInteger', - 'isSameNode', - 'isSampler', - 'isScript', - 'isScriptURL', - 'isSealed', - 'isSecureContext', - 'isSessionSupported', - 'isShader', - 'isSupported', - 'isSync', - 'isTextEdit', - 'isTexture', - 'isTransformFeedback', - 'isTrusted', - 'isTypeSupported', - 'isUserVerifyingPlatformAuthenticatorAvailable', - 'isVertexArray', - 'isView', - 'isVisible', - 'isochronousTransferIn', - 'isochronousTransferOut', - 'isolation', - 'italics', - 'item', - 'itemId', - 'itemProp', - 'itemRef', - 'itemScope', - 'itemType', - 'itemValue', - 'items', - 'iterateNext', - 'iterationComposite', - 'iterator', - 'javaEnabled', - 'jobTitle', - 'join', - 'json', - 'justify-content', - 'justify-items', - 'justify-self', - 'justifyContent', - 'justifyItems', - 'justifySelf', - 'k1', - 'k2', - 'k3', - 'k4', - 'kHz', - 'keepalive', - 'kernelMatrix', - 'kernelUnitLengthX', - 'kernelUnitLengthY', - 'kerning', - 'key', - 'keyCode', - 'keyFor', - 'keyIdentifier', - 'keyLightEnabled', - 'keyLocation', - 'keyPath', - 'keyStatuses', - 'keySystem', - 'keyText', - 'keyUsage', - 'keyboard', - 'keys', - 'keytype', - 'kind', - 'knee', - 'label', - 'labels', - 'lang', - 'language', - 'languages', - 'largeArcFlag', - 'lastChild', - 'lastElementChild', - 'lastEventId', - 'lastIndex', - 'lastIndexOf', - 'lastInputTime', - 'lastMatch', - 'lastMessageSubject', - 'lastMessageType', - 'lastModified', - 'lastModifiedDate', - 'lastPage', - 'lastParen', - 'lastState', - 'lastStyleSheetSet', - 'latitude', - 'layerX', - 'layerY', - 'layoutFlow', - 'layoutGrid', - 'layoutGridChar', - 'layoutGridLine', - 'layoutGridMode', - 'layoutGridType', - 'lbound', - 'left', - 'leftContext', - 'leftDegrees', - 'leftMargin', - 'leftProjectionMatrix', - 'leftViewMatrix', - 'length', - 'lengthAdjust', - 'lengthComputable', - 'letter-spacing', - 'letterSpacing', - 'level', - 'lighting-color', - 'lightingColor', - 'limitingConeAngle', - 'line', - 'line-break', - 'line-height', - 'lineAlign', - 'lineBreak', - 'lineCap', - 'lineDashOffset', - 'lineHeight', - 'lineJoin', - 'lineNumber', - 'lineTo', - 'lineWidth', - 'linearAcceleration', - 'linearRampToValueAtTime', - 'linearVelocity', - 'lineno', - 'lines', - 'link', - 'linkColor', - 'linkProgram', - 'links', - 'list', - 'list-style', - 'list-style-image', - 'list-style-position', - 'list-style-type', - 'listStyle', - 'listStyleImage', - 'listStylePosition', - 'listStyleType', - 'listener', - 'load', - 'loadEventEnd', - 'loadEventStart', - 'loadTime', - 'loadTimes', - 'loaded', - 'loading', - 'localDescription', - 'localName', - 'localService', - 'localStorage', - 'locale', - 'localeCompare', - 'location', - 'locationbar', - 'lock', - 'locked', - 'lockedFile', - 'locks', - 'log', - 'log10', - 'log1p', - 'log2', - 'logicalXDPI', - 'logicalYDPI', - 'longDesc', - 'longitude', - 'lookupNamespaceURI', - 'lookupPrefix', - 'loop', - 'loopEnd', - 'loopStart', - 'looping', - 'low', - 'lower', - 'lowerBound', - 'lowerOpen', - 'lowsrc', - 'm11', - 'm12', - 'm13', - 'm14', - 'm21', - 'm22', - 'm23', - 'm24', - 'm31', - 'm32', - 'm33', - 'm34', - 'm41', - 'm42', - 'm43', - 'm44', - 'makeXRCompatible', - 'manifest', - 'manufacturer', - 'manufacturerName', - 'map', - 'mapping', - 'margin', - 'margin-block', - 'margin-block-end', - 'margin-block-start', - 'margin-bottom', - 'margin-inline', - 'margin-inline-end', - 'margin-inline-start', - 'margin-left', - 'margin-right', - 'margin-top', - 'marginBlock', - 'marginBlockEnd', - 'marginBlockStart', - 'marginBottom', - 'marginHeight', - 'marginInline', - 'marginInlineEnd', - 'marginInlineStart', - 'marginLeft', - 'marginRight', - 'marginTop', - 'marginWidth', - 'mark', - 'marker', - 'marker-end', - 'marker-mid', - 'marker-offset', - 'marker-start', - 'markerEnd', - 'markerHeight', - 'markerMid', - 'markerOffset', - 'markerStart', - 'markerUnits', - 'markerWidth', - 'marks', - 'mask', - 'mask-clip', - 'mask-composite', - 'mask-image', - 'mask-mode', - 'mask-origin', - 'mask-position', - 'mask-position-x', - 'mask-position-y', - 'mask-repeat', - 'mask-size', - 'mask-type', - 'maskClip', - 'maskComposite', - 'maskContentUnits', - 'maskImage', - 'maskMode', - 'maskOrigin', - 'maskPosition', - 'maskPositionX', - 'maskPositionY', - 'maskRepeat', - 'maskSize', - 'maskType', - 'maskUnits', - 'match', - 'matchAll', - 'matchMedia', - 'matchMedium', - 'matches', - 'matrix', - 'matrixTransform', - 'max', - 'max-block-size', - 'max-height', - 'max-inline-size', - 'max-width', - 'maxActions', - 'maxAlternatives', - 'maxBlockSize', - 'maxChannelCount', - 'maxChannels', - 'maxConnectionsPerServer', - 'maxDecibels', - 'maxDistance', - 'maxHeight', - 'maxInlineSize', - 'maxLayers', - 'maxLength', - 'maxMessageSize', - 'maxPacketLifeTime', - 'maxRetransmits', - 'maxTouchPoints', - 'maxValue', - 'maxWidth', - 'measure', - 'measureText', - 'media', - 'mediaCapabilities', - 'mediaDevices', - 'mediaElement', - 'mediaGroup', - 'mediaKeys', - 'mediaSession', - 'mediaStream', - 'mediaText', - 'meetOrSlice', - 'memory', - 'menubar', - 'mergeAttributes', - 'message', - 'messageClass', - 'messageHandlers', - 'messageType', - 'metaKey', - 'metadata', - 'method', - 'methodDetails', - 'methodName', - 'mid', - 'mimeType', - 'mimeTypes', - 'min', - 'min-block-size', - 'min-height', - 'min-inline-size', - 'min-width', - 'minBlockSize', - 'minDecibels', - 'minHeight', - 'minInlineSize', - 'minLength', - 'minValue', - 'minWidth', - 'miterLimit', - 'mix-blend-mode', - 'mixBlendMode', - 'mm', - 'mode', - 'modify', - 'mount', - 'move', - 'moveBy', - 'moveEnd', - 'moveFirst', - 'moveFocusDown', - 'moveFocusLeft', - 'moveFocusRight', - 'moveFocusUp', - 'moveNext', - 'moveRow', - 'moveStart', - 'moveTo', - 'moveToBookmark', - 'moveToElementText', - 'moveToPoint', - 'movementX', - 'movementY', - 'mozAdd', - 'mozAnimationStartTime', - 'mozAnon', - 'mozApps', - 'mozAudioCaptured', - 'mozAudioChannelType', - 'mozAutoplayEnabled', - 'mozCancelAnimationFrame', - 'mozCancelFullScreen', - 'mozCancelRequestAnimationFrame', - 'mozCaptureStream', - 'mozCaptureStreamUntilEnded', - 'mozClearDataAt', - 'mozContact', - 'mozContacts', - 'mozCreateFileHandle', - 'mozCurrentTransform', - 'mozCurrentTransformInverse', - 'mozCursor', - 'mozDash', - 'mozDashOffset', - 'mozDecodedFrames', - 'mozExitPointerLock', - 'mozFillRule', - 'mozFragmentEnd', - 'mozFrameDelay', - 'mozFullScreen', - 'mozFullScreenElement', - 'mozFullScreenEnabled', - 'mozGetAll', - 'mozGetAllKeys', - 'mozGetAsFile', - 'mozGetDataAt', - 'mozGetMetadata', - 'mozGetUserMedia', - 'mozHasAudio', - 'mozHasItem', - 'mozHidden', - 'mozImageSmoothingEnabled', - 'mozIndexedDB', - 'mozInnerScreenX', - 'mozInnerScreenY', - 'mozInputSource', - 'mozIsTextField', - 'mozItem', - 'mozItemCount', - 'mozItems', - 'mozLength', - 'mozLockOrientation', - 'mozMatchesSelector', - 'mozMovementX', - 'mozMovementY', - 'mozOpaque', - 'mozOrientation', - 'mozPaintCount', - 'mozPaintedFrames', - 'mozParsedFrames', - 'mozPay', - 'mozPointerLockElement', - 'mozPresentedFrames', - 'mozPreservesPitch', - 'mozPressure', - 'mozPrintCallback', - 'mozRTCIceCandidate', - 'mozRTCPeerConnection', - 'mozRTCSessionDescription', - 'mozRemove', - 'mozRequestAnimationFrame', - 'mozRequestFullScreen', - 'mozRequestPointerLock', - 'mozSetDataAt', - 'mozSetImageElement', - 'mozSourceNode', - 'mozSrcObject', - 'mozSystem', - 'mozTCPSocket', - 'mozTextStyle', - 'mozTypesAt', - 'mozUnlockOrientation', - 'mozUserCancelled', - 'mozVisibilityState', - 'ms', - 'msAnimation', - 'msAnimationDelay', - 'msAnimationDirection', - 'msAnimationDuration', - 'msAnimationFillMode', - 'msAnimationIterationCount', - 'msAnimationName', - 'msAnimationPlayState', - 'msAnimationStartTime', - 'msAnimationTimingFunction', - 'msBackfaceVisibility', - 'msBlockProgression', - 'msCSSOMElementFloatMetrics', - 'msCaching', - 'msCachingEnabled', - 'msCancelRequestAnimationFrame', - 'msCapsLockWarningOff', - 'msClearImmediate', - 'msClose', - 'msContentZoomChaining', - 'msContentZoomFactor', - 'msContentZoomLimit', - 'msContentZoomLimitMax', - 'msContentZoomLimitMin', - 'msContentZoomSnap', - 'msContentZoomSnapPoints', - 'msContentZoomSnapType', - 'msContentZooming', - 'msConvertURL', - 'msCrypto', - 'msDoNotTrack', - 'msElementsFromPoint', - 'msElementsFromRect', - 'msExitFullscreen', - 'msExtendedCode', - 'msFillRule', - 'msFirstPaint', - 'msFlex', - 'msFlexAlign', - 'msFlexDirection', - 'msFlexFlow', - 'msFlexItemAlign', - 'msFlexLinePack', - 'msFlexNegative', - 'msFlexOrder', - 'msFlexPack', - 'msFlexPositive', - 'msFlexPreferredSize', - 'msFlexWrap', - 'msFlowFrom', - 'msFlowInto', - 'msFontFeatureSettings', - 'msFullscreenElement', - 'msFullscreenEnabled', - 'msGetInputContext', - 'msGetRegionContent', - 'msGetUntransformedBounds', - 'msGraphicsTrustStatus', - 'msGridColumn', - 'msGridColumnAlign', - 'msGridColumnSpan', - 'msGridColumns', - 'msGridRow', - 'msGridRowAlign', - 'msGridRowSpan', - 'msGridRows', - 'msHidden', - 'msHighContrastAdjust', - 'msHyphenateLimitChars', - 'msHyphenateLimitLines', - 'msHyphenateLimitZone', - 'msHyphens', - 'msImageSmoothingEnabled', - 'msImeAlign', - 'msIndexedDB', - 'msInterpolationMode', - 'msIsStaticHTML', - 'msKeySystem', - 'msKeys', - 'msLaunchUri', - 'msLockOrientation', - 'msManipulationViewsEnabled', - 'msMatchMedia', - 'msMatchesSelector', - 'msMaxTouchPoints', - 'msOrientation', - 'msOverflowStyle', - 'msPerspective', - 'msPerspectiveOrigin', - 'msPlayToDisabled', - 'msPlayToPreferredSourceUri', - 'msPlayToPrimary', - 'msPointerEnabled', - 'msRegionOverflow', - 'msReleasePointerCapture', - 'msRequestAnimationFrame', - 'msRequestFullscreen', - 'msSaveBlob', - 'msSaveOrOpenBlob', - 'msScrollChaining', - 'msScrollLimit', - 'msScrollLimitXMax', - 'msScrollLimitXMin', - 'msScrollLimitYMax', - 'msScrollLimitYMin', - 'msScrollRails', - 'msScrollSnapPointsX', - 'msScrollSnapPointsY', - 'msScrollSnapType', - 'msScrollSnapX', - 'msScrollSnapY', - 'msScrollTranslation', - 'msSetImmediate', - 'msSetMediaKeys', - 'msSetPointerCapture', - 'msTextCombineHorizontal', - 'msTextSizeAdjust', - 'msToBlob', - 'msTouchAction', - 'msTouchSelect', - 'msTraceAsyncCallbackCompleted', - 'msTraceAsyncCallbackStarting', - 'msTraceAsyncOperationCompleted', - 'msTraceAsyncOperationStarting', - 'msTransform', - 'msTransformOrigin', - 'msTransformStyle', - 'msTransition', - 'msTransitionDelay', - 'msTransitionDuration', - 'msTransitionProperty', - 'msTransitionTimingFunction', - 'msUnlockOrientation', - 'msUpdateAsyncCallbackRelation', - 'msUserSelect', - 'msVisibilityState', - 'msWrapFlow', - 'msWrapMargin', - 'msWrapThrough', - 'msWriteProfilerMark', - 'msZoom', - 'msZoomTo', - 'mt', - 'mul', - 'multiEntry', - 'multiSelectionObj', - 'multiline', - 'multiple', - 'multiply', - 'multiplySelf', - 'mutableFile', - 'muted', - 'n', - 'name', - 'nameProp', - 'namedItem', - 'namedRecordset', - 'names', - 'namespaceURI', - 'namespaces', - 'naturalHeight', - 'naturalWidth', - 'navigate', - 'navigation', - 'navigationMode', - 'navigationPreload', - 'navigationStart', - 'navigator', - 'near', - 'nearestViewportElement', - 'negative', - 'negotiated', - 'netscape', - 'networkState', - 'newScale', - 'newTranslate', - 'newURL', - 'newValue', - 'newValueSpecifiedUnits', - 'newVersion', - 'newhome', - 'next', - 'nextElementSibling', - 'nextHopProtocol', - 'nextNode', - 'nextPage', - 'nextSibling', - 'nickname', - 'noHref', - 'noModule', - 'noResize', - 'noShade', - 'noValidate', - 'noWrap', - 'node', - 'nodeName', - 'nodeType', - 'nodeValue', - 'nonce', - 'normalize', - 'normalizedPathSegList', - 'notationName', - 'notations', - 'note', - 'noteGrainOn', - 'noteOff', - 'noteOn', - 'notify', - 'now', - 'numOctaves', - 'number', - 'numberOfChannels', - 'numberOfInputs', - 'numberOfItems', - 'numberOfOutputs', - 'numberValue', - 'oMatchesSelector', - 'object', - 'object-fit', - 'object-position', - 'objectFit', - 'objectPosition', - 'objectStore', - 'objectStoreNames', - 'objectType', - 'observe', - 'of', - 'offscreenBuffering', - 'offset', - 'offset-anchor', - 'offset-distance', - 'offset-path', - 'offset-rotate', - 'offsetAnchor', - 'offsetDistance', - 'offsetHeight', - 'offsetLeft', - 'offsetNode', - 'offsetParent', - 'offsetPath', - 'offsetRotate', - 'offsetTop', - 'offsetWidth', - 'offsetX', - 'offsetY', - 'ok', - 'oldURL', - 'oldValue', - 'oldVersion', - 'olderShadowRoot', - 'onLine', - 'onabort', - 'onabsolutedeviceorientation', - 'onactivate', - 'onactive', - 'onaddsourcebuffer', - 'onaddstream', - 'onaddtrack', - 'onafterprint', - 'onafterscriptexecute', - 'onafterupdate', - 'onanimationcancel', - 'onanimationend', - 'onanimationiteration', - 'onanimationstart', - 'onappinstalled', - 'onaudioend', - 'onaudioprocess', - 'onaudiostart', - 'onautocomplete', - 'onautocompleteerror', - 'onauxclick', - 'onbeforeactivate', - 'onbeforecopy', - 'onbeforecut', - 'onbeforedeactivate', - 'onbeforeeditfocus', - 'onbeforeinstallprompt', - 'onbeforepaste', - 'onbeforeprint', - 'onbeforescriptexecute', - 'onbeforeunload', - 'onbeforeupdate', - 'onbeforexrselect', - 'onbegin', - 'onblocked', - 'onblur', - 'onbounce', - 'onboundary', - 'onbufferedamountlow', - 'oncached', - 'oncancel', - 'oncandidatewindowhide', - 'oncandidatewindowshow', - 'oncandidatewindowupdate', - 'oncanplay', - 'oncanplaythrough', - 'once', - 'oncellchange', - 'onchange', - 'oncharacteristicvaluechanged', - 'onchargingchange', - 'onchargingtimechange', - 'onchecking', - 'onclick', - 'onclose', - 'onclosing', - 'oncompassneedscalibration', - 'oncomplete', - 'onconnect', - 'onconnecting', - 'onconnectionavailable', - 'onconnectionstatechange', - 'oncontextmenu', - 'oncontrollerchange', - 'oncontrolselect', - 'oncopy', - 'oncuechange', - 'oncut', - 'ondataavailable', - 'ondatachannel', - 'ondatasetchanged', - 'ondatasetcomplete', - 'ondblclick', - 'ondeactivate', - 'ondevicechange', - 'ondevicelight', - 'ondevicemotion', - 'ondeviceorientation', - 'ondeviceorientationabsolute', - 'ondeviceproximity', - 'ondischargingtimechange', - 'ondisconnect', - 'ondisplay', - 'ondownloading', - 'ondrag', - 'ondragend', - 'ondragenter', - 'ondragexit', - 'ondragleave', - 'ondragover', - 'ondragstart', - 'ondrop', - 'ondurationchange', - 'onemptied', - 'onencrypted', - 'onend', - 'onended', - 'onenter', - 'onenterpictureinpicture', - 'onerror', - 'onerrorupdate', - 'onexit', - 'onfilterchange', - 'onfinish', - 'onfocus', - 'onfocusin', - 'onfocusout', - 'onformdata', - 'onfreeze', - 'onfullscreenchange', - 'onfullscreenerror', - 'ongatheringstatechange', - 'ongattserverdisconnected', - 'ongesturechange', - 'ongestureend', - 'ongesturestart', - 'ongotpointercapture', - 'onhashchange', - 'onhelp', - 'onicecandidate', - 'onicecandidateerror', - 'oniceconnectionstatechange', - 'onicegatheringstatechange', - 'oninactive', - 'oninput', - 'oninputsourceschange', - 'oninvalid', - 'onkeydown', - 'onkeypress', - 'onkeystatuseschange', - 'onkeyup', - 'onlanguagechange', - 'onlayoutcomplete', - 'onleavepictureinpicture', - 'onlevelchange', - 'onload', - 'onloadeddata', - 'onloadedmetadata', - 'onloadend', - 'onloading', - 'onloadingdone', - 'onloadingerror', - 'onloadstart', - 'onlosecapture', - 'onlostpointercapture', - 'only', - 'onmark', - 'onmessage', - 'onmessageerror', - 'onmidimessage', - 'onmousedown', - 'onmouseenter', - 'onmouseleave', - 'onmousemove', - 'onmouseout', - 'onmouseover', - 'onmouseup', - 'onmousewheel', - 'onmove', - 'onmoveend', - 'onmovestart', - 'onmozfullscreenchange', - 'onmozfullscreenerror', - 'onmozorientationchange', - 'onmozpointerlockchange', - 'onmozpointerlockerror', - 'onmscontentzoom', - 'onmsfullscreenchange', - 'onmsfullscreenerror', - 'onmsgesturechange', - 'onmsgesturedoubletap', - 'onmsgestureend', - 'onmsgesturehold', - 'onmsgesturestart', - 'onmsgesturetap', - 'onmsgotpointercapture', - 'onmsinertiastart', - 'onmslostpointercapture', - 'onmsmanipulationstatechanged', - 'onmsneedkey', - 'onmsorientationchange', - 'onmspointercancel', - 'onmspointerdown', - 'onmspointerenter', - 'onmspointerhover', - 'onmspointerleave', - 'onmspointermove', - 'onmspointerout', - 'onmspointerover', - 'onmspointerup', - 'onmssitemodejumplistitemremoved', - 'onmsthumbnailclick', - 'onmute', - 'onnegotiationneeded', - 'onnomatch', - 'onnoupdate', - 'onobsolete', - 'onoffline', - 'ononline', - 'onopen', - 'onorientationchange', - 'onpagechange', - 'onpagehide', - 'onpageshow', - 'onpaste', - 'onpause', - 'onpayerdetailchange', - 'onpaymentmethodchange', - 'onplay', - 'onplaying', - 'onpluginstreamstart', - 'onpointercancel', - 'onpointerdown', - 'onpointerenter', - 'onpointerleave', - 'onpointerlockchange', - 'onpointerlockerror', - 'onpointermove', - 'onpointerout', - 'onpointerover', - 'onpointerrawupdate', - 'onpointerup', - 'onpopstate', - 'onprocessorerror', - 'onprogress', - 'onpropertychange', - 'onratechange', - 'onreading', - 'onreadystatechange', - 'onrejectionhandled', - 'onrelease', - 'onremove', - 'onremovesourcebuffer', - 'onremovestream', - 'onremovetrack', - 'onrepeat', - 'onreset', - 'onresize', - 'onresizeend', - 'onresizestart', - 'onresourcetimingbufferfull', - 'onresult', - 'onresume', - 'onrowenter', - 'onrowexit', - 'onrowsdelete', - 'onrowsinserted', - 'onscroll', - 'onsearch', - 'onsecuritypolicyviolation', - 'onseeked', - 'onseeking', - 'onselect', - 'onselectedcandidatepairchange', - 'onselectend', - 'onselectionchange', - 'onselectstart', - 'onshippingaddresschange', - 'onshippingoptionchange', - 'onshow', - 'onsignalingstatechange', - 'onsoundend', - 'onsoundstart', - 'onsourceclose', - 'onsourceclosed', - 'onsourceended', - 'onsourceopen', - 'onspeechend', - 'onspeechstart', - 'onsqueeze', - 'onsqueezeend', - 'onsqueezestart', - 'onstalled', - 'onstart', - 'onstatechange', - 'onstop', - 'onstorage', - 'onstoragecommit', - 'onsubmit', - 'onsuccess', - 'onsuspend', - 'onterminate', - 'ontextinput', - 'ontimeout', - 'ontimeupdate', - 'ontoggle', - 'ontonechange', - 'ontouchcancel', - 'ontouchend', - 'ontouchmove', - 'ontouchstart', - 'ontrack', - 'ontransitioncancel', - 'ontransitionend', - 'ontransitionrun', - 'ontransitionstart', - 'onunhandledrejection', - 'onunload', - 'onunmute', - 'onupdate', - 'onupdateend', - 'onupdatefound', - 'onupdateready', - 'onupdatestart', - 'onupgradeneeded', - 'onuserproximity', - 'onversionchange', - 'onvisibilitychange', - 'onvoiceschanged', - 'onvolumechange', - 'onvrdisplayactivate', - 'onvrdisplayconnect', - 'onvrdisplaydeactivate', - 'onvrdisplaydisconnect', - 'onvrdisplaypresentchange', - 'onwaiting', - 'onwaitingforkey', - 'onwarning', - 'onwebkitanimationend', - 'onwebkitanimationiteration', - 'onwebkitanimationstart', - 'onwebkitcurrentplaybacktargetiswirelesschanged', - 'onwebkitfullscreenchange', - 'onwebkitfullscreenerror', - 'onwebkitkeyadded', - 'onwebkitkeyerror', - 'onwebkitkeymessage', - 'onwebkitneedkey', - 'onwebkitorientationchange', - 'onwebkitplaybacktargetavailabilitychanged', - 'onwebkitpointerlockchange', - 'onwebkitpointerlockerror', - 'onwebkitresourcetimingbufferfull', - 'onwebkittransitionend', - 'onwheel', - 'onzoom', - 'opacity', - 'open', - 'openCursor', - 'openDatabase', - 'openKeyCursor', - 'opened', - 'opener', - 'opera', - 'operationType', - 'operator', - 'opr', - 'optimum', - 'options', - 'or', - 'order', - 'orderX', - 'orderY', - 'ordered', - 'org', - 'organization', - 'orient', - 'orientAngle', - 'orientType', - 'orientation', - 'orientationX', - 'orientationY', - 'orientationZ', - 'origin', - 'originalPolicy', - 'originalTarget', - 'orphans', - 'oscpu', - 'outerHTML', - 'outerHeight', - 'outerText', - 'outerWidth', - 'outline', - 'outline-color', - 'outline-offset', - 'outline-style', - 'outline-width', - 'outlineColor', - 'outlineOffset', - 'outlineStyle', - 'outlineWidth', - 'outputBuffer', - 'outputLatency', - 'outputs', - 'overflow', - 'overflow-anchor', - 'overflow-block', - 'overflow-inline', - 'overflow-wrap', - 'overflow-x', - 'overflow-y', - 'overflowAnchor', - 'overflowBlock', - 'overflowInline', - 'overflowWrap', - 'overflowX', - 'overflowY', - 'overrideMimeType', - 'oversample', - 'overscroll-behavior', - 'overscroll-behavior-block', - 'overscroll-behavior-inline', - 'overscroll-behavior-x', - 'overscroll-behavior-y', - 'overscrollBehavior', - 'overscrollBehaviorBlock', - 'overscrollBehaviorInline', - 'overscrollBehaviorX', - 'overscrollBehaviorY', - 'ownKeys', - 'ownerDocument', - 'ownerElement', - 'ownerNode', - 'ownerRule', - 'ownerSVGElement', - 'owningElement', - 'p1', - 'p2', - 'p3', - 'p4', - 'packetSize', - 'packets', - 'pad', - 'padEnd', - 'padStart', - 'padding', - 'padding-block', - 'padding-block-end', - 'padding-block-start', - 'padding-bottom', - 'padding-inline', - 'padding-inline-end', - 'padding-inline-start', - 'padding-left', - 'padding-right', - 'padding-top', - 'paddingBlock', - 'paddingBlockEnd', - 'paddingBlockStart', - 'paddingBottom', - 'paddingInline', - 'paddingInlineEnd', - 'paddingInlineStart', - 'paddingLeft', - 'paddingRight', - 'paddingTop', - 'page', - 'page-break-after', - 'page-break-before', - 'page-break-inside', - 'pageBreakAfter', - 'pageBreakBefore', - 'pageBreakInside', - 'pageCount', - 'pageLeft', - 'pageTop', - 'pageX', - 'pageXOffset', - 'pageY', - 'pageYOffset', - 'pages', - 'paint-order', - 'paintOrder', - 'paintRequests', - 'paintType', - 'paintWorklet', - 'palette', - 'pan', - 'panningModel', - 'parameters', - 'parent', - 'parentElement', - 'parentNode', - 'parentRule', - 'parentStyleSheet', - 'parentTextEdit', - 'parentWindow', - 'parse', - 'parseAll', - 'parseFloat', - 'parseFromString', - 'parseInt', - 'part', - 'participants', - 'passive', - 'password', - 'pasteHTML', - 'path', - 'pathLength', - 'pathSegList', - 'pathSegType', - 'pathSegTypeAsLetter', - 'pathname', - 'pattern', - 'patternContentUnits', - 'patternMismatch', - 'patternTransform', - 'patternUnits', - 'pause', - 'pauseAnimations', - 'pauseOnExit', - 'pauseProfilers', - 'pauseTransformFeedback', - 'paused', - 'payerEmail', - 'payerName', - 'payerPhone', - 'paymentManager', - 'pc', - 'peerIdentity', - 'pending', - 'pendingLocalDescription', - 'pendingRemoteDescription', - 'percent', - 'performance', - 'periodicSync', - 'permission', - 'permissionState', - 'permissions', - 'persist', - 'persisted', - 'personalbar', - 'perspective', - 'perspective-origin', - 'perspectiveOrigin', - 'phone', - 'phoneticFamilyName', - 'phoneticGivenName', - 'photo', - 'pictureInPictureElement', - 'pictureInPictureEnabled', - 'pictureInPictureWindow', - 'ping', - 'pipeThrough', - 'pipeTo', - 'pitch', - 'pixelBottom', - 'pixelDepth', - 'pixelHeight', - 'pixelLeft', - 'pixelRight', - 'pixelStorei', - 'pixelTop', - 'pixelUnitToMillimeterX', - 'pixelUnitToMillimeterY', - 'pixelWidth', - 'place-content', - 'place-items', - 'place-self', - 'placeContent', - 'placeItems', - 'placeSelf', - 'placeholder', - 'platform', - 'platforms', - 'play', - 'playEffect', - 'playState', - 'playbackRate', - 'playbackState', - 'playbackTime', - 'played', - 'playoutDelayHint', - 'playsInline', - 'plugins', - 'pluginspage', - 'pname', - 'pointer-events', - 'pointerBeforeReferenceNode', - 'pointerEnabled', - 'pointerEvents', - 'pointerId', - 'pointerLockElement', - 'pointerType', - 'points', - 'pointsAtX', - 'pointsAtY', - 'pointsAtZ', - 'polygonOffset', - 'pop', - 'populateMatrix', - 'popupWindowFeatures', - 'popupWindowName', - 'popupWindowURI', - 'port', - 'port1', - 'port2', - 'ports', - 'posBottom', - 'posHeight', - 'posLeft', - 'posRight', - 'posTop', - 'posWidth', - 'pose', - 'position', - 'positionAlign', - 'positionX', - 'positionY', - 'positionZ', - 'postError', - 'postMessage', - 'postalCode', - 'poster', - 'pow', - 'powerEfficient', - 'powerOff', - 'preMultiplySelf', - 'precision', - 'preferredStyleSheetSet', - 'preferredStylesheetSet', - 'prefix', - 'preload', - 'prepend', - 'presentation', - 'preserveAlpha', - 'preserveAspectRatio', - 'preserveAspectRatioString', - 'pressed', - 'pressure', - 'prevValue', - 'preventDefault', - 'preventExtensions', - 'preventSilentAccess', - 'previousElementSibling', - 'previousNode', - 'previousPage', - 'previousRect', - 'previousScale', - 'previousSibling', - 'previousTranslate', - 'primaryKey', - 'primitiveType', - 'primitiveUnits', - 'principals', - 'print', - 'priority', - 'privateKey', - 'probablySupportsContext', - 'process', - 'processIceMessage', - 'processingEnd', - 'processingStart', - 'product', - 'productId', - 'productName', - 'productSub', - 'profile', - 'profileEnd', - 'profiles', - 'projectionMatrix', - 'promise', - 'prompt', - 'properties', - 'propertyIsEnumerable', - 'propertyName', - 'protocol', - 'protocolLong', - 'prototype', - 'provider', - 'pseudoClass', - 'pseudoElement', - 'pt', - 'publicId', - 'publicKey', - 'published', - 'pulse', - 'push', - 'pushManager', - 'pushNotification', - 'pushState', - 'put', - 'putImageData', - 'px', - 'quadraticCurveTo', - 'qualifier', - 'quaternion', - 'query', - 'queryCommandEnabled', - 'queryCommandIndeterm', - 'queryCommandState', - 'queryCommandSupported', - 'queryCommandText', - 'queryCommandValue', - 'querySelector', - 'querySelectorAll', - 'queueMicrotask', - 'quote', - 'quotes', - 'r', - 'r1', - 'r2', - 'race', - 'rad', - 'radiogroup', - 'radiusX', - 'radiusY', - 'random', - 'range', - 'rangeCount', - 'rangeMax', - 'rangeMin', - 'rangeOffset', - 'rangeOverflow', - 'rangeParent', - 'rangeUnderflow', - 'rate', - 'ratio', - 'raw', - 'rawId', - 'read', - 'readAsArrayBuffer', - 'readAsBinaryString', - 'readAsBlob', - 'readAsDataURL', - 'readAsText', - 'readBuffer', - 'readEntries', - 'readOnly', - 'readPixels', - 'readReportRequested', - 'readText', - 'readValue', - 'readable', - 'ready', - 'readyState', - 'reason', - 'reboot', - 'receivedAlert', - 'receiver', - 'receivers', - 'recipient', - 'reconnect', - 'recordNumber', - 'recordsAvailable', - 'recordset', - 'rect', - 'red', - 'redEyeReduction', - 'redirect', - 'redirectCount', - 'redirectEnd', - 'redirectStart', - 'redirected', - 'reduce', - 'reduceRight', - 'reduction', - 'refDistance', - 'refX', - 'refY', - 'referenceNode', - 'referenceSpace', - 'referrer', - 'referrerPolicy', - 'refresh', - 'region', - 'regionAnchorX', - 'regionAnchorY', - 'regionId', - 'regions', - 'register', - 'registerContentHandler', - 'registerElement', - 'registerProperty', - 'registerProtocolHandler', - 'reject', - 'rel', - 'relList', - 'relatedAddress', - 'relatedNode', - 'relatedPort', - 'relatedTarget', - 'release', - 'releaseCapture', - 'releaseEvents', - 'releaseInterface', - 'releaseLock', - 'releasePointerCapture', - 'releaseShaderCompiler', - 'reliable', - 'reliableWrite', - 'reload', - 'rem', - 'remainingSpace', - 'remote', - 'remoteDescription', - 'remove', - 'removeAllRanges', - 'removeAttribute', - 'removeAttributeNS', - 'removeAttributeNode', - 'removeBehavior', - 'removeChild', - 'removeCue', - 'removeEventListener', - 'removeFilter', - 'removeImport', - 'removeItem', - 'removeListener', - 'removeNamedItem', - 'removeNamedItemNS', - 'removeNode', - 'removeParameter', - 'removeProperty', - 'removeRange', - 'removeRegion', - 'removeRule', - 'removeSiteSpecificTrackingException', - 'removeSourceBuffer', - 'removeStream', - 'removeTrack', - 'removeVariable', - 'removeWakeLockListener', - 'removeWebWideTrackingException', - 'removed', - 'removedNodes', - 'renderHeight', - 'renderState', - 'renderTime', - 'renderWidth', - 'renderbufferStorage', - 'renderbufferStorageMultisample', - 'renderedBuffer', - 'renderingMode', - 'renotify', - 'repeat', - 'replace', - 'replaceAdjacentText', - 'replaceAll', - 'replaceChild', - 'replaceChildren', - 'replaceData', - 'replaceId', - 'replaceItem', - 'replaceNode', - 'replaceState', - 'replaceSync', - 'replaceTrack', - 'replaceWholeText', - 'replaceWith', - 'reportValidity', - 'request', - 'requestAnimationFrame', - 'requestAutocomplete', - 'requestData', - 'requestDevice', - 'requestFrame', - 'requestFullscreen', - 'requestHitTestSource', - 'requestHitTestSourceForTransientInput', - 'requestId', - 'requestIdleCallback', - 'requestMIDIAccess', - 'requestMediaKeySystemAccess', - 'requestPermission', - 'requestPictureInPicture', - 'requestPointerLock', - 'requestPresent', - 'requestReferenceSpace', - 'requestSession', - 'requestStart', - 'requestStorageAccess', - 'requestSubmit', - 'requestVideoFrameCallback', - 'requestingWindow', - 'requireInteraction', - 'required', - 'requiredExtensions', - 'requiredFeatures', - 'reset', - 'resetPose', - 'resetTransform', - 'resize', - 'resizeBy', - 'resizeTo', - 'resolve', - 'response', - 'responseBody', - 'responseEnd', - 'responseReady', - 'responseStart', - 'responseText', - 'responseType', - 'responseURL', - 'responseXML', - 'restartIce', - 'restore', - 'result', - 'resultIndex', - 'resultType', - 'results', - 'resume', - 'resumeProfilers', - 'resumeTransformFeedback', - 'retry', - 'returnValue', - 'rev', - 'reverse', - 'reversed', - 'revocable', - 'revokeObjectURL', - 'rgbColor', - 'right', - 'rightContext', - 'rightDegrees', - 'rightMargin', - 'rightProjectionMatrix', - 'rightViewMatrix', - 'role', - 'rolloffFactor', - 'root', - 'rootBounds', - 'rootElement', - 'rootMargin', - 'rotate', - 'rotateAxisAngle', - 'rotateAxisAngleSelf', - 'rotateFromVector', - 'rotateFromVectorSelf', - 'rotateSelf', - 'rotation', - 'rotationAngle', - 'rotationRate', - 'round', - 'row-gap', - 'rowGap', - 'rowIndex', - 'rowSpan', - 'rows', - 'rtcpTransport', - 'rtt', - 'ruby-align', - 'ruby-position', - 'rubyAlign', - 'rubyOverhang', - 'rubyPosition', - 'rules', - 'runtime', - 'runtimeStyle', - 'rx', - 'ry', - 's', - 'safari', - 'sample', - 'sampleCoverage', - 'sampleRate', - 'samplerParameterf', - 'samplerParameteri', - 'sandbox', - 'save', - 'saveData', - 'scale', - 'scale3d', - 'scale3dSelf', - 'scaleNonUniform', - 'scaleNonUniformSelf', - 'scaleSelf', - 'scheme', - 'scissor', - 'scope', - 'scopeName', - 'scoped', - 'screen', - 'screenBrightness', - 'screenEnabled', - 'screenLeft', - 'screenPixelToMillimeterX', - 'screenPixelToMillimeterY', - 'screenTop', - 'screenX', - 'screenY', - 'scriptURL', - 'scripts', - 'scroll', - 'scroll-behavior', - 'scroll-margin', - 'scroll-margin-block', - 'scroll-margin-block-end', - 'scroll-margin-block-start', - 'scroll-margin-bottom', - 'scroll-margin-inline', - 'scroll-margin-inline-end', - 'scroll-margin-inline-start', - 'scroll-margin-left', - 'scroll-margin-right', - 'scroll-margin-top', - 'scroll-padding', - 'scroll-padding-block', - 'scroll-padding-block-end', - 'scroll-padding-block-start', - 'scroll-padding-bottom', - 'scroll-padding-inline', - 'scroll-padding-inline-end', - 'scroll-padding-inline-start', - 'scroll-padding-left', - 'scroll-padding-right', - 'scroll-padding-top', - 'scroll-snap-align', - 'scroll-snap-type', - 'scrollAmount', - 'scrollBehavior', - 'scrollBy', - 'scrollByLines', - 'scrollByPages', - 'scrollDelay', - 'scrollHeight', - 'scrollIntoView', - 'scrollIntoViewIfNeeded', - 'scrollLeft', - 'scrollLeftMax', - 'scrollMargin', - 'scrollMarginBlock', - 'scrollMarginBlockEnd', - 'scrollMarginBlockStart', - 'scrollMarginBottom', - 'scrollMarginInline', - 'scrollMarginInlineEnd', - 'scrollMarginInlineStart', - 'scrollMarginLeft', - 'scrollMarginRight', - 'scrollMarginTop', - 'scrollMaxX', - 'scrollMaxY', - 'scrollPadding', - 'scrollPaddingBlock', - 'scrollPaddingBlockEnd', - 'scrollPaddingBlockStart', - 'scrollPaddingBottom', - 'scrollPaddingInline', - 'scrollPaddingInlineEnd', - 'scrollPaddingInlineStart', - 'scrollPaddingLeft', - 'scrollPaddingRight', - 'scrollPaddingTop', - 'scrollRestoration', - 'scrollSnapAlign', - 'scrollSnapType', - 'scrollTo', - 'scrollTop', - 'scrollTopMax', - 'scrollWidth', - 'scrollX', - 'scrollY', - 'scrollbar-color', - 'scrollbar-width', - 'scrollbar3dLightColor', - 'scrollbarArrowColor', - 'scrollbarBaseColor', - 'scrollbarColor', - 'scrollbarDarkShadowColor', - 'scrollbarFaceColor', - 'scrollbarHighlightColor', - 'scrollbarShadowColor', - 'scrollbarTrackColor', - 'scrollbarWidth', - 'scrollbars', - 'scrolling', - 'scrollingElement', - 'sctp', - 'sctpCauseCode', - 'sdp', - 'sdpLineNumber', - 'sdpMLineIndex', - 'sdpMid', - 'seal', - 'search', - 'searchBox', - 'searchBoxJavaBridge_', - 'searchParams', - 'sectionRowIndex', - 'secureConnectionStart', - 'security', - 'seed', - 'seekToNextFrame', - 'seekable', - 'seeking', - 'select', - 'selectAllChildren', - 'selectAlternateInterface', - 'selectConfiguration', - 'selectNode', - 'selectNodeContents', - 'selectNodes', - 'selectSingleNode', - 'selectSubString', - 'selected', - 'selectedIndex', - 'selectedOptions', - 'selectedStyleSheetSet', - 'selectedStylesheetSet', - 'selection', - 'selectionDirection', - 'selectionEnd', - 'selectionStart', - 'selector', - 'selectorText', - 'self', - 'send', - 'sendAsBinary', - 'sendBeacon', - 'sender', - 'sentAlert', - 'sentTimestamp', - 'separator', - 'serialNumber', - 'serializeToString', - 'serverTiming', - 'service', - 'serviceWorker', - 'session', - 'sessionId', - 'sessionStorage', - 'set', - 'setActionHandler', - 'setActive', - 'setAlpha', - 'setAppBadge', - 'setAttribute', - 'setAttributeNS', - 'setAttributeNode', - 'setAttributeNodeNS', - 'setBaseAndExtent', - 'setBigInt64', - 'setBigUint64', - 'setBingCurrentSearchDefault', - 'setCapture', - 'setCodecPreferences', - 'setColor', - 'setCompositeOperation', - 'setConfiguration', - 'setCurrentTime', - 'setCustomValidity', - 'setData', - 'setDate', - 'setDragImage', - 'setEnd', - 'setEndAfter', - 'setEndBefore', - 'setEndPoint', - 'setFillColor', - 'setFilterRes', - 'setFloat32', - 'setFloat64', - 'setFloatValue', - 'setFormValue', - 'setFullYear', - 'setHeaderValue', - 'setHours', - 'setIdentityProvider', - 'setImmediate', - 'setInt16', - 'setInt32', - 'setInt8', - 'setInterval', - 'setItem', - 'setKeyframes', - 'setLineCap', - 'setLineDash', - 'setLineJoin', - 'setLineWidth', - 'setLiveSeekableRange', - 'setLocalDescription', - 'setMatrix', - 'setMatrixValue', - 'setMediaKeys', - 'setMilliseconds', - 'setMinutes', - 'setMiterLimit', - 'setMonth', - 'setNamedItem', - 'setNamedItemNS', - 'setNonUserCodeExceptions', - 'setOrientToAngle', - 'setOrientToAuto', - 'setOrientation', - 'setOverrideHistoryNavigationMode', - 'setPaint', - 'setParameter', - 'setParameters', - 'setPeriodicWave', - 'setPointerCapture', - 'setPosition', - 'setPositionState', - 'setPreference', - 'setProperty', - 'setPrototypeOf', - 'setRGBColor', - 'setRGBColorICCColor', - 'setRadius', - 'setRangeText', - 'setRemoteDescription', - 'setRequestHeader', - 'setResizable', - 'setResourceTimingBufferSize', - 'setRotate', - 'setScale', - 'setSeconds', - 'setSelectionRange', - 'setServerCertificate', - 'setShadow', - 'setSinkId', - 'setSkewX', - 'setSkewY', - 'setStart', - 'setStartAfter', - 'setStartBefore', - 'setStdDeviation', - 'setStreams', - 'setStringValue', - 'setStrokeColor', - 'setSuggestResult', - 'setTargetAtTime', - 'setTargetValueAtTime', - 'setTime', - 'setTimeout', - 'setTransform', - 'setTranslate', - 'setUTCDate', - 'setUTCFullYear', - 'setUTCHours', - 'setUTCMilliseconds', - 'setUTCMinutes', - 'setUTCMonth', - 'setUTCSeconds', - 'setUint16', - 'setUint32', - 'setUint8', - 'setUri', - 'setValidity', - 'setValueAtTime', - 'setValueCurveAtTime', - 'setVariable', - 'setVelocity', - 'setVersion', - 'setYear', - 'settingName', - 'settingValue', - 'sex', - 'shaderSource', - 'shadowBlur', - 'shadowColor', - 'shadowOffsetX', - 'shadowOffsetY', - 'shadowRoot', - 'shape', - 'shape-image-threshold', - 'shape-margin', - 'shape-outside', - 'shape-rendering', - 'shapeImageThreshold', - 'shapeMargin', - 'shapeOutside', - 'shapeRendering', - 'sheet', - 'shift', - 'shiftKey', - 'shiftLeft', - 'shippingAddress', - 'shippingOption', - 'shippingType', - 'show', - 'showHelp', - 'showModal', - 'showModalDialog', - 'showModelessDialog', - 'showNotification', - 'sidebar', - 'sign', - 'signal', - 'signalingState', - 'signature', - 'silent', - 'sin', - 'singleNodeValue', - 'sinh', - 'sinkId', - 'sittingToStandingTransform', - 'size', - 'sizeToContent', - 'sizeX', - 'sizeZ', - 'sizes', - 'skewX', - 'skewXSelf', - 'skewY', - 'skewYSelf', - 'slice', - 'slope', - 'slot', - 'small', - 'smil', - 'smooth', - 'smoothingTimeConstant', - 'snapToLines', - 'snapshotItem', - 'snapshotLength', - 'some', - 'sort', - 'sortingCode', - 'source', - 'sourceBuffer', - 'sourceBuffers', - 'sourceCapabilities', - 'sourceFile', - 'sourceIndex', - 'sources', - 'spacing', - 'span', - 'speak', - 'speakAs', - 'speaking', - 'species', - 'specified', - 'specularConstant', - 'specularExponent', - 'speechSynthesis', - 'speed', - 'speedOfSound', - 'spellcheck', - 'splice', - 'split', - 'splitText', - 'spreadMethod', - 'sqrt', - 'src', - 'srcElement', - 'srcFilter', - 'srcObject', - 'srcUrn', - 'srcdoc', - 'srclang', - 'srcset', - 'stack', - 'stackTraceLimit', - 'stacktrace', - 'stageParameters', - 'standalone', - 'standby', - 'start', - 'startContainer', - 'startIce', - 'startMessages', - 'startNotifications', - 'startOffset', - 'startProfiling', - 'startRendering', - 'startShark', - 'startTime', - 'startsWith', - 'state', - 'status', - 'statusCode', - 'statusMessage', - 'statusText', - 'statusbar', - 'stdDeviationX', - 'stdDeviationY', - 'stencilFunc', - 'stencilFuncSeparate', - 'stencilMask', - 'stencilMaskSeparate', - 'stencilOp', - 'stencilOpSeparate', - 'step', - 'stepDown', - 'stepMismatch', - 'stepUp', - 'sticky', - 'stitchTiles', - 'stop', - 'stop-color', - 'stop-opacity', - 'stopColor', - 'stopImmediatePropagation', - 'stopNotifications', - 'stopOpacity', - 'stopProfiling', - 'stopPropagation', - 'stopShark', - 'stopped', - 'storage', - 'storageArea', - 'storageName', - 'storageStatus', - 'store', - 'storeSiteSpecificTrackingException', - 'storeWebWideTrackingException', - 'stpVersion', - 'stream', - 'streams', - 'stretch', - 'strike', - 'string', - 'stringValue', - 'stringify', - 'stroke', - 'stroke-dasharray', - 'stroke-dashoffset', - 'stroke-linecap', - 'stroke-linejoin', - 'stroke-miterlimit', - 'stroke-opacity', - 'stroke-width', - 'strokeDasharray', - 'strokeDashoffset', - 'strokeLinecap', - 'strokeLinejoin', - 'strokeMiterlimit', - 'strokeOpacity', - 'strokeRect', - 'strokeStyle', - 'strokeText', - 'strokeWidth', - 'style', - 'styleFloat', - 'styleMap', - 'styleMedia', - 'styleSheet', - 'styleSheetSets', - 'styleSheets', - 'sub', - 'subarray', - 'subject', - 'submit', - 'submitFrame', - 'submitter', - 'subscribe', - 'substr', - 'substring', - 'substringData', - 'subtle', - 'subtree', - 'suffix', - 'suffixes', - 'summary', - 'sup', - 'supported', - 'supportedContentEncodings', - 'supportedEntryTypes', - 'supports', - 'supportsSession', - 'surfaceScale', - 'surroundContents', - 'suspend', - 'suspendRedraw', - 'swapCache', - 'swapNode', - 'sweepFlag', - 'symbols', - 'sync', - 'sysexEnabled', - 'system', - 'systemCode', - 'systemId', - 'systemLanguage', - 'systemXDPI', - 'systemYDPI', - 'tBodies', - 'tFoot', - 'tHead', - 'tabIndex', - 'table', - 'table-layout', - 'tableLayout', - 'tableValues', - 'tag', - 'tagName', - 'tagUrn', - 'tags', - 'taintEnabled', - 'takePhoto', - 'takeRecords', - 'tan', - 'tangentialPressure', - 'tanh', - 'target', - 'targetElement', - 'targetRayMode', - 'targetRaySpace', - 'targetTouches', - 'targetX', - 'targetY', - 'tcpType', - 'tee', - 'tel', - 'terminate', - 'test', - 'texImage2D', - 'texImage3D', - 'texParameterf', - 'texParameteri', - 'texStorage2D', - 'texStorage3D', - 'texSubImage2D', - 'texSubImage3D', - 'text', - 'text-align', - 'text-align-last', - 'text-anchor', - 'text-combine-upright', - 'text-decoration', - 'text-decoration-color', - 'text-decoration-line', - 'text-decoration-skip-ink', - 'text-decoration-style', - 'text-decoration-thickness', - 'text-emphasis', - 'text-emphasis-color', - 'text-emphasis-position', - 'text-emphasis-style', - 'text-indent', - 'text-justify', - 'text-orientation', - 'text-overflow', - 'text-rendering', - 'text-shadow', - 'text-transform', - 'text-underline-offset', - 'text-underline-position', - 'textAlign', - 'textAlignLast', - 'textAnchor', - 'textAutospace', - 'textBaseline', - 'textCombineUpright', - 'textContent', - 'textDecoration', - 'textDecorationBlink', - 'textDecorationColor', - 'textDecorationLine', - 'textDecorationLineThrough', - 'textDecorationNone', - 'textDecorationOverline', - 'textDecorationSkipInk', - 'textDecorationStyle', - 'textDecorationThickness', - 'textDecorationUnderline', - 'textEmphasis', - 'textEmphasisColor', - 'textEmphasisPosition', - 'textEmphasisStyle', - 'textIndent', - 'textJustify', - 'textJustifyTrim', - 'textKashida', - 'textKashidaSpace', - 'textLength', - 'textOrientation', - 'textOverflow', - 'textRendering', - 'textShadow', - 'textTracks', - 'textTransform', - 'textUnderlineOffset', - 'textUnderlinePosition', - 'then', - 'threadId', - 'threshold', - 'thresholds', - 'tiltX', - 'tiltY', - 'time', - 'timeEnd', - 'timeLog', - 'timeOrigin', - 'timeRemaining', - 'timeStamp', - 'timecode', - 'timeline', - 'timelineTime', - 'timeout', - 'timestamp', - 'timestampOffset', - 'timing', - 'title', - 'to', - 'toArray', - 'toBlob', - 'toDataURL', - 'toDateString', - 'toElement', - 'toExponential', - 'toFixed', - 'toFloat32Array', - 'toFloat64Array', - 'toGMTString', - 'toISOString', - 'toJSON', - 'toLocaleDateString', - 'toLocaleFormat', - 'toLocaleLowerCase', - 'toLocaleString', - 'toLocaleTimeString', - 'toLocaleUpperCase', - 'toLowerCase', - 'toMatrix', - 'toMethod', - 'toPrecision', - 'toPrimitive', - 'toSdp', - 'toSource', - 'toStaticHTML', - 'toString', - 'toStringTag', - 'toSum', - 'toTimeString', - 'toUTCString', - 'toUpperCase', - 'toggle', - 'toggleAttribute', - 'toggleLongPressEnabled', - 'tone', - 'toneBuffer', - 'tooLong', - 'tooShort', - 'toolbar', - 'top', - 'topMargin', - 'total', - 'totalFrameDelay', - 'totalVideoFrames', - 'touch-action', - 'touchAction', - 'touched', - 'touches', - 'trace', - 'track', - 'trackVisibility', - 'transaction', - 'transactions', - 'transceiver', - 'transferControlToOffscreen', - 'transferFromImageBitmap', - 'transferImageBitmap', - 'transferIn', - 'transferOut', - 'transferSize', - 'transferToImageBitmap', - 'transform', - 'transform-box', - 'transform-origin', - 'transform-style', - 'transformBox', - 'transformFeedbackVaryings', - 'transformOrigin', - 'transformPoint', - 'transformString', - 'transformStyle', - 'transformToDocument', - 'transformToFragment', - 'transition', - 'transition-delay', - 'transition-duration', - 'transition-property', - 'transition-timing-function', - 'transitionDelay', - 'transitionDuration', - 'transitionProperty', - 'transitionTimingFunction', - 'translate', - 'translateSelf', - 'translationX', - 'translationY', - 'transport', - 'trim', - 'trimEnd', - 'trimLeft', - 'trimRight', - 'trimStart', - 'trueSpeed', - 'trunc', - 'truncate', - 'trustedTypes', - 'turn', - 'twist', - 'type', - 'typeDetail', - 'typeMismatch', - 'typeMustMatch', - 'types', - 'u2f', - 'ubound', - 'uint16', - 'uint32', - 'uint8', - 'uint8Clamped', - 'undefined', - 'unescape', - 'uneval', - 'unicode', - 'unicode-bidi', - 'unicodeBidi', - 'unicodeRange', - 'uniform1f', - 'uniform1fv', - 'uniform1i', - 'uniform1iv', - 'uniform1ui', - 'uniform1uiv', - 'uniform2f', - 'uniform2fv', - 'uniform2i', - 'uniform2iv', - 'uniform2ui', - 'uniform2uiv', - 'uniform3f', - 'uniform3fv', - 'uniform3i', - 'uniform3iv', - 'uniform3ui', - 'uniform3uiv', - 'uniform4f', - 'uniform4fv', - 'uniform4i', - 'uniform4iv', - 'uniform4ui', - 'uniform4uiv', - 'uniformBlockBinding', - 'uniformMatrix2fv', - 'uniformMatrix2x3fv', - 'uniformMatrix2x4fv', - 'uniformMatrix3fv', - 'uniformMatrix3x2fv', - 'uniformMatrix3x4fv', - 'uniformMatrix4fv', - 'uniformMatrix4x2fv', - 'uniformMatrix4x3fv', - 'unique', - 'uniqueID', - 'uniqueNumber', - 'unit', - 'unitType', - 'units', - 'unloadEventEnd', - 'unloadEventStart', - 'unlock', - 'unmount', - 'unobserve', - 'unpause', - 'unpauseAnimations', - 'unreadCount', - 'unregister', - 'unregisterContentHandler', - 'unregisterProtocolHandler', - 'unscopables', - 'unselectable', - 'unshift', - 'unsubscribe', - 'unsuspendRedraw', - 'unsuspendRedrawAll', - 'unwatch', - 'unwrapKey', - 'upDegrees', - 'upX', - 'upY', - 'upZ', - 'update', - 'updateCommands', - 'updateIce', - 'updateInterval', - 'updatePlaybackRate', - 'updateRenderState', - 'updateSettings', - 'updateTiming', - 'updateViaCache', - 'updateWith', - 'updated', - 'updating', - 'upgrade', - 'upload', - 'uploadTotal', - 'uploaded', - 'upper', - 'upperBound', - 'upperOpen', - 'uri', - 'url', - 'urn', - 'urns', - 'usages', - 'usb', - 'usbVersionMajor', - 'usbVersionMinor', - 'usbVersionSubminor', - 'useCurrentView', - 'useMap', - 'useProgram', - 'usedSpace', - 'user-select', - 'userActivation', - 'userAgent', - 'userChoice', - 'userHandle', - 'userHint', - 'userLanguage', - 'userSelect', - 'userVisibleOnly', - 'username', - 'usernameFragment', - 'utterance', - 'uuid', - 'v8BreakIterator', - 'vAlign', - 'vLink', - 'valid', - 'validate', - 'validateProgram', - 'validationMessage', - 'validity', - 'value', - 'valueAsDate', - 'valueAsNumber', - 'valueAsString', - 'valueInSpecifiedUnits', - 'valueMissing', - 'valueOf', - 'valueText', - 'valueType', - 'values', - 'variable', - 'variant', - 'variationSettings', - 'vector-effect', - 'vectorEffect', - 'velocityAngular', - 'velocityExpansion', - 'velocityX', - 'velocityY', - 'vendor', - 'vendorId', - 'vendorSub', - 'verify', - 'version', - 'vertexAttrib1f', - 'vertexAttrib1fv', - 'vertexAttrib2f', - 'vertexAttrib2fv', - 'vertexAttrib3f', - 'vertexAttrib3fv', - 'vertexAttrib4f', - 'vertexAttrib4fv', - 'vertexAttribDivisor', - 'vertexAttribDivisorANGLE', - 'vertexAttribI4i', - 'vertexAttribI4iv', - 'vertexAttribI4ui', - 'vertexAttribI4uiv', - 'vertexAttribIPointer', - 'vertexAttribPointer', - 'vertical', - 'vertical-align', - 'verticalAlign', - 'verticalOverflow', - 'vh', - 'vibrate', - 'vibrationActuator', - 'videoBitsPerSecond', - 'videoHeight', - 'videoTracks', - 'videoWidth', - 'view', - 'viewBox', - 'viewBoxString', - 'viewTarget', - 'viewTargetString', - 'viewport', - 'viewportAnchorX', - 'viewportAnchorY', - 'viewportElement', - 'views', - 'violatedDirective', - 'visibility', - 'visibilityState', - 'visible', - 'visualViewport', - 'vlinkColor', - 'vmax', - 'vmin', - 'voice', - 'voiceURI', - 'volume', - 'vrml', - 'vspace', - 'vw', - 'w', - 'wait', - 'waitSync', - 'waiting', - 'wake', - 'wakeLock', - 'wand', - 'warn', - 'wasClean', - 'wasDiscarded', - 'watch', - 'watchAvailability', - 'watchPosition', - 'webdriver', - 'webkitAddKey', - 'webkitAlignContent', - 'webkitAlignItems', - 'webkitAlignSelf', - 'webkitAnimation', - 'webkitAnimationDelay', - 'webkitAnimationDirection', - 'webkitAnimationDuration', - 'webkitAnimationFillMode', - 'webkitAnimationIterationCount', - 'webkitAnimationName', - 'webkitAnimationPlayState', - 'webkitAnimationTimingFunction', - 'webkitAppearance', - 'webkitAudioContext', - 'webkitAudioDecodedByteCount', - 'webkitAudioPannerNode', - 'webkitBackfaceVisibility', - 'webkitBackground', - 'webkitBackgroundAttachment', - 'webkitBackgroundClip', - 'webkitBackgroundColor', - 'webkitBackgroundImage', - 'webkitBackgroundOrigin', - 'webkitBackgroundPosition', - 'webkitBackgroundPositionX', - 'webkitBackgroundPositionY', - 'webkitBackgroundRepeat', - 'webkitBackgroundSize', - 'webkitBackingStorePixelRatio', - 'webkitBorderBottomLeftRadius', - 'webkitBorderBottomRightRadius', - 'webkitBorderImage', - 'webkitBorderImageOutset', - 'webkitBorderImageRepeat', - 'webkitBorderImageSlice', - 'webkitBorderImageSource', - 'webkitBorderImageWidth', - 'webkitBorderRadius', - 'webkitBorderTopLeftRadius', - 'webkitBorderTopRightRadius', - 'webkitBoxAlign', - 'webkitBoxDirection', - 'webkitBoxFlex', - 'webkitBoxOrdinalGroup', - 'webkitBoxOrient', - 'webkitBoxPack', - 'webkitBoxShadow', - 'webkitBoxSizing', - 'webkitCancelAnimationFrame', - 'webkitCancelFullScreen', - 'webkitCancelKeyRequest', - 'webkitCancelRequestAnimationFrame', - 'webkitClearResourceTimings', - 'webkitClosedCaptionsVisible', - 'webkitConvertPointFromNodeToPage', - 'webkitConvertPointFromPageToNode', - 'webkitCreateShadowRoot', - 'webkitCurrentFullScreenElement', - 'webkitCurrentPlaybackTargetIsWireless', - 'webkitDecodedFrameCount', - 'webkitDirectionInvertedFromDevice', - 'webkitDisplayingFullscreen', - 'webkitDroppedFrameCount', - 'webkitEnterFullScreen', - 'webkitEnterFullscreen', - 'webkitEntries', - 'webkitExitFullScreen', - 'webkitExitFullscreen', - 'webkitExitPointerLock', - 'webkitFilter', - 'webkitFlex', - 'webkitFlexBasis', - 'webkitFlexDirection', - 'webkitFlexFlow', - 'webkitFlexGrow', - 'webkitFlexShrink', - 'webkitFlexWrap', - 'webkitFullScreenKeyboardInputAllowed', - 'webkitFullscreenElement', - 'webkitFullscreenEnabled', - 'webkitGenerateKeyRequest', - 'webkitGetAsEntry', - 'webkitGetDatabaseNames', - 'webkitGetEntries', - 'webkitGetEntriesByName', - 'webkitGetEntriesByType', - 'webkitGetFlowByName', - 'webkitGetGamepads', - 'webkitGetImageDataHD', - 'webkitGetNamedFlows', - 'webkitGetRegionFlowRanges', - 'webkitGetUserMedia', - 'webkitHasClosedCaptions', - 'webkitHidden', - 'webkitIDBCursor', - 'webkitIDBDatabase', - 'webkitIDBDatabaseError', - 'webkitIDBDatabaseException', - 'webkitIDBFactory', - 'webkitIDBIndex', - 'webkitIDBKeyRange', - 'webkitIDBObjectStore', - 'webkitIDBRequest', - 'webkitIDBTransaction', - 'webkitImageSmoothingEnabled', - 'webkitIndexedDB', - 'webkitInitMessageEvent', - 'webkitIsFullScreen', - 'webkitJustifyContent', - 'webkitKeys', - 'webkitLineClamp', - 'webkitLineDashOffset', - 'webkitLockOrientation', - 'webkitMask', - 'webkitMaskClip', - 'webkitMaskComposite', - 'webkitMaskImage', - 'webkitMaskOrigin', - 'webkitMaskPosition', - 'webkitMaskPositionX', - 'webkitMaskPositionY', - 'webkitMaskRepeat', - 'webkitMaskSize', - 'webkitMatchesSelector', - 'webkitMediaStream', - 'webkitNotifications', - 'webkitOfflineAudioContext', - 'webkitOrder', - 'webkitOrientation', - 'webkitPeerConnection00', - 'webkitPersistentStorage', - 'webkitPerspective', - 'webkitPerspectiveOrigin', - 'webkitPointerLockElement', - 'webkitPostMessage', - 'webkitPreservesPitch', - 'webkitPutImageDataHD', - 'webkitRTCPeerConnection', - 'webkitRegionOverset', - 'webkitRelativePath', - 'webkitRequestAnimationFrame', - 'webkitRequestFileSystem', - 'webkitRequestFullScreen', - 'webkitRequestFullscreen', - 'webkitRequestPointerLock', - 'webkitResolveLocalFileSystemURL', - 'webkitSetMediaKeys', - 'webkitSetResourceTimingBufferSize', - 'webkitShadowRoot', - 'webkitShowPlaybackTargetPicker', - 'webkitSlice', - 'webkitSpeechGrammar', - 'webkitSpeechGrammarList', - 'webkitSpeechRecognition', - 'webkitSpeechRecognitionError', - 'webkitSpeechRecognitionEvent', - 'webkitStorageInfo', - 'webkitSupportsFullscreen', - 'webkitTemporaryStorage', - 'webkitTextFillColor', - 'webkitTextSizeAdjust', - 'webkitTextStroke', - 'webkitTextStrokeColor', - 'webkitTextStrokeWidth', - 'webkitTransform', - 'webkitTransformOrigin', - 'webkitTransformStyle', - 'webkitTransition', - 'webkitTransitionDelay', - 'webkitTransitionDuration', - 'webkitTransitionProperty', - 'webkitTransitionTimingFunction', - 'webkitURL', - 'webkitUnlockOrientation', - 'webkitUserSelect', - 'webkitVideoDecodedByteCount', - 'webkitVisibilityState', - 'webkitWirelessVideoPlaybackDisabled', - 'webkitdirectory', - 'webkitdropzone', - 'webstore', - 'weight', - 'whatToShow', - 'wheelDelta', - 'wheelDeltaX', - 'wheelDeltaY', - 'whenDefined', - 'which', - 'white-space', - 'whiteSpace', - 'wholeText', - 'widows', - 'width', - 'will-change', - 'willChange', - 'willValidate', - 'window', - 'withCredentials', - 'word-break', - 'word-spacing', - 'word-wrap', - 'wordBreak', - 'wordSpacing', - 'wordWrap', - 'workerStart', - 'wrap', - 'wrapKey', - 'writable', - 'writableAuxiliaries', - 'write', - 'writeText', - 'writeValue', - 'writeWithoutResponse', - 'writeln', - 'writing-mode', - 'writingMode', - 'x', - 'x1', - 'x2', - 'xChannelSelector', - 'xmlEncoding', - 'xmlStandalone', - 'xmlVersion', - 'xmlbase', - 'xmllang', - 'xmlspace', - 'xor', - 'xr', - 'y', - 'y1', - 'y2', - 'yChannelSelector', - 'yandex', - 'z', - 'z-index', - 'zIndex', - 'zoom', - 'zoomAndPan', - 'zoomRectScreen', -]; diff --git a/src/node-transformers/rename-properties-transformers/replacer/RenamePropertiesReplacer.ts b/src/node-transformers/rename-properties-transformers/replacer/RenamePropertiesReplacer.ts index cbf61fc9f..d5aac3cf9 100644 --- a/src/node-transformers/rename-properties-transformers/replacer/RenamePropertiesReplacer.ts +++ b/src/node-transformers/rename-properties-transformers/replacer/RenamePropertiesReplacer.ts @@ -11,7 +11,8 @@ import { IOptions } from '../../../interfaces/options/IOptions'; import { IPropertyIdentifierNamesCacheStorage } from '../../../interfaces/storages/identifier-names-cache/IPropertyIdentifierNamesCacheStorage'; import { IRenamePropertiesReplacer } from '../../../interfaces/node-transformers/rename-properties-transformers/replacer/IRenamePropertiesReplacer'; -import { domProperties } from '../../../constants/DomProperties'; +// eslint-disable-next-line import/no-internal-modules +import ReservedDomProperties from './ReservedDomProperties.json'; import { NodeGuards } from '../../../node/NodeGuards'; import { NodeFactory } from '../../../node/NodeFactory'; @@ -19,9 +20,14 @@ import { NodeFactory } from '../../../node/NodeFactory'; @injectable() export class RenamePropertiesReplacer implements IRenamePropertiesReplacer { /** + * Properties list taken from `UglifyJS` and `terser` + * https://github.com/mishoo/UglifyJS/blob/master/tools/domprops.json + * https://github.com/terser/terser/blob/master/tools/domprops.js + * Copyright 2012-2018 (c) Mihai Bazon + * * @type {Set} */ - private static readonly reservedDomPropertiesList: Set = new Set(domProperties); + private static readonly reservedDomPropertiesList: Set = new Set(ReservedDomProperties); /** * @type {IIdentifierNamesGenerator} diff --git a/src/node-transformers/rename-properties-transformers/replacer/ReservedDomProperties.json b/src/node-transformers/rename-properties-transformers/replacer/ReservedDomProperties.json new file mode 100644 index 000000000..1a3c53adc --- /dev/null +++ b/src/node-transformers/rename-properties-transformers/replacer/ReservedDomProperties.json @@ -0,0 +1,7771 @@ +[ + "$&", + "$'", + "$*", + "$+", + "$1", + "$2", + "$3", + "$4", + "$5", + "$6", + "$7", + "$8", + "$9", + "$_", + "$`", + "$input", + "-moz-animation", + "-moz-animation-delay", + "-moz-animation-direction", + "-moz-animation-duration", + "-moz-animation-fill-mode", + "-moz-animation-iteration-count", + "-moz-animation-name", + "-moz-animation-play-state", + "-moz-animation-timing-function", + "-moz-appearance", + "-moz-backface-visibility", + "-moz-border-end", + "-moz-border-end-color", + "-moz-border-end-style", + "-moz-border-end-width", + "-moz-border-image", + "-moz-border-start", + "-moz-border-start-color", + "-moz-border-start-style", + "-moz-border-start-width", + "-moz-box-align", + "-moz-box-direction", + "-moz-box-flex", + "-moz-box-ordinal-group", + "-moz-box-orient", + "-moz-box-pack", + "-moz-box-sizing", + "-moz-float-edge", + "-moz-font-feature-settings", + "-moz-font-language-override", + "-moz-force-broken-image-icon", + "-moz-hyphens", + "-moz-image-region", + "-moz-margin-end", + "-moz-margin-start", + "-moz-orient", + "-moz-osx-font-smoothing", + "-moz-outline-radius", + "-moz-outline-radius-bottomleft", + "-moz-outline-radius-bottomright", + "-moz-outline-radius-topleft", + "-moz-outline-radius-topright", + "-moz-padding-end", + "-moz-padding-start", + "-moz-perspective", + "-moz-perspective-origin", + "-moz-tab-size", + "-moz-text-size-adjust", + "-moz-transform", + "-moz-transform-origin", + "-moz-transform-style", + "-moz-transition", + "-moz-transition-delay", + "-moz-transition-duration", + "-moz-transition-property", + "-moz-transition-timing-function", + "-moz-user-focus", + "-moz-user-input", + "-moz-user-modify", + "-moz-user-select", + "-moz-window-dragging", + "-webkit-align-content", + "-webkit-align-items", + "-webkit-align-self", + "-webkit-animation", + "-webkit-animation-delay", + "-webkit-animation-direction", + "-webkit-animation-duration", + "-webkit-animation-fill-mode", + "-webkit-animation-iteration-count", + "-webkit-animation-name", + "-webkit-animation-play-state", + "-webkit-animation-timing-function", + "-webkit-appearance", + "-webkit-backface-visibility", + "-webkit-background-clip", + "-webkit-background-origin", + "-webkit-background-size", + "-webkit-border-bottom-left-radius", + "-webkit-border-bottom-right-radius", + "-webkit-border-image", + "-webkit-border-radius", + "-webkit-border-top-left-radius", + "-webkit-border-top-right-radius", + "-webkit-box-align", + "-webkit-box-direction", + "-webkit-box-flex", + "-webkit-box-ordinal-group", + "-webkit-box-orient", + "-webkit-box-pack", + "-webkit-box-shadow", + "-webkit-box-sizing", + "-webkit-filter", + "-webkit-flex", + "-webkit-flex-basis", + "-webkit-flex-direction", + "-webkit-flex-flow", + "-webkit-flex-grow", + "-webkit-flex-shrink", + "-webkit-flex-wrap", + "-webkit-justify-content", + "-webkit-line-clamp", + "-webkit-mask", + "-webkit-mask-clip", + "-webkit-mask-composite", + "-webkit-mask-image", + "-webkit-mask-origin", + "-webkit-mask-position", + "-webkit-mask-position-x", + "-webkit-mask-position-y", + "-webkit-mask-repeat", + "-webkit-mask-size", + "-webkit-order", + "-webkit-perspective", + "-webkit-perspective-origin", + "-webkit-text-fill-color", + "-webkit-text-size-adjust", + "-webkit-text-stroke", + "-webkit-text-stroke-color", + "-webkit-text-stroke-width", + "-webkit-transform", + "-webkit-transform-origin", + "-webkit-transform-style", + "-webkit-transition", + "-webkit-transition-delay", + "-webkit-transition-duration", + "-webkit-transition-property", + "-webkit-transition-timing-function", + "-webkit-user-select", + "0", + "1", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "2", + "20", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "@@iterator", + "ABORT_ERR", + "ACTIVE", + "ACTIVE_ATTRIBUTES", + "ACTIVE_TEXTURE", + "ACTIVE_UNIFORMS", + "ACTIVE_UNIFORM_BLOCKS", + "ADDITION", + "ALIASED_LINE_WIDTH_RANGE", + "ALIASED_POINT_SIZE_RANGE", + "ALLOW_KEYBOARD_INPUT", + "ALLPASS", + "ALPHA", + "ALPHA_BITS", + "ALREADY_SIGNALED", + "ALT_MASK", + "ALWAYS", + "ANY_SAMPLES_PASSED", + "ANY_SAMPLES_PASSED_CONSERVATIVE", + "ANY_TYPE", + "ANY_UNORDERED_NODE_TYPE", + "ARRAY_BUFFER", + "ARRAY_BUFFER_BINDING", + "ATTACHED_SHADERS", + "ATTRIBUTE_NODE", + "AT_TARGET", + "AbortController", + "AbortSignal", + "AbsoluteOrientationSensor", + "AbstractRange", + "Accelerometer", + "AddSearchProvider", + "AggregateError", + "AnalyserNode", + "Animation", + "AnimationEffect", + "AnimationEvent", + "AnimationPlaybackEvent", + "AnimationTimeline", + "AnonXMLHttpRequest", + "Any", + "ApplicationCache", + "ApplicationCacheErrorEvent", + "Array", + "ArrayBuffer", + "ArrayType", + "Atomics", + "Attr", + "Audio", + "AudioBuffer", + "AudioBufferSourceNode", + "AudioContext", + "AudioDestinationNode", + "AudioListener", + "AudioNode", + "AudioParam", + "AudioParamMap", + "AudioProcessingEvent", + "AudioScheduledSourceNode", + "AudioStreamTrack", + "AudioWorklet", + "AudioWorkletNode", + "AuthenticatorAssertionResponse", + "AuthenticatorAttestationResponse", + "AuthenticatorResponse", + "AutocompleteErrorEvent", + "BACK", + "BAD_BOUNDARYPOINTS_ERR", + "BAD_REQUEST", + "BANDPASS", + "BLEND", + "BLEND_COLOR", + "BLEND_DST_ALPHA", + "BLEND_DST_RGB", + "BLEND_EQUATION", + "BLEND_EQUATION_ALPHA", + "BLEND_EQUATION_RGB", + "BLEND_SRC_ALPHA", + "BLEND_SRC_RGB", + "BLUE_BITS", + "BLUR", + "BOOL", + "BOOLEAN_TYPE", + "BOOL_VEC2", + "BOOL_VEC3", + "BOOL_VEC4", + "BOTH", + "BROWSER_DEFAULT_WEBGL", + "BUBBLING_PHASE", + "BUFFER_SIZE", + "BUFFER_USAGE", + "BYTE", + "BYTES_PER_ELEMENT", + "BackgroundFetchManager", + "BackgroundFetchRecord", + "BackgroundFetchRegistration", + "BarProp", + "BarcodeDetector", + "BaseAudioContext", + "BaseHref", + "BatteryManager", + "BeforeInstallPromptEvent", + "BeforeLoadEvent", + "BeforeUnloadEvent", + "BigInt", + "BigInt64Array", + "BigUint64Array", + "BiquadFilterNode", + "Blob", + "BlobEvent", + "Bluetooth", + "BluetoothCharacteristicProperties", + "BluetoothDevice", + "BluetoothRemoteGATTCharacteristic", + "BluetoothRemoteGATTDescriptor", + "BluetoothRemoteGATTServer", + "BluetoothRemoteGATTService", + "BluetoothUUID", + "Boolean", + "BroadcastChannel", + "ByteLengthQueuingStrategy", + "CAPTURING_PHASE", + "CCW", + "CDATASection", + "CDATA_SECTION_NODE", + "CHANGE", + "CHARSET_RULE", + "CHECKING", + "CLAMP_TO_EDGE", + "CLICK", + "CLOSED", + "CLOSING", + "COLOR", + "COLOR_ATTACHMENT0", + "COLOR_ATTACHMENT1", + "COLOR_ATTACHMENT10", + "COLOR_ATTACHMENT11", + "COLOR_ATTACHMENT12", + "COLOR_ATTACHMENT13", + "COLOR_ATTACHMENT14", + "COLOR_ATTACHMENT15", + "COLOR_ATTACHMENT2", + "COLOR_ATTACHMENT3", + "COLOR_ATTACHMENT4", + "COLOR_ATTACHMENT5", + "COLOR_ATTACHMENT6", + "COLOR_ATTACHMENT7", + "COLOR_ATTACHMENT8", + "COLOR_ATTACHMENT9", + "COLOR_BUFFER_BIT", + "COLOR_CLEAR_VALUE", + "COLOR_WRITEMASK", + "COMMENT_NODE", + "COMPARE_REF_TO_TEXTURE", + "COMPILE_STATUS", + "COMPRESSED_RGBA_S3TC_DXT1_EXT", + "COMPRESSED_RGBA_S3TC_DXT3_EXT", + "COMPRESSED_RGBA_S3TC_DXT5_EXT", + "COMPRESSED_RGB_S3TC_DXT1_EXT", + "COMPRESSED_TEXTURE_FORMATS", + "CONDITION_SATISFIED", + "CONFIGURATION_UNSUPPORTED", + "CONNECTING", + "CONSTANT_ALPHA", + "CONSTANT_COLOR", + "CONSTRAINT_ERR", + "CONTEXT_LOST_WEBGL", + "CONTROL_MASK", + "COPY_READ_BUFFER", + "COPY_READ_BUFFER_BINDING", + "COPY_WRITE_BUFFER", + "COPY_WRITE_BUFFER_BINDING", + "COUNTER_STYLE_RULE", + "CSS", + "CSS2Properties", + "CSSAnimation", + "CSSCharsetRule", + "CSSConditionRule", + "CSSCounterStyleRule", + "CSSFontFaceRule", + "CSSFontFeatureValuesRule", + "CSSGroupingRule", + "CSSImageValue", + "CSSImportRule", + "CSSKeyframeRule", + "CSSKeyframesRule", + "CSSKeywordValue", + "CSSMathInvert", + "CSSMathMax", + "CSSMathMin", + "CSSMathNegate", + "CSSMathProduct", + "CSSMathSum", + "CSSMathValue", + "CSSMatrixComponent", + "CSSMediaRule", + "CSSMozDocumentRule", + "CSSNameSpaceRule", + "CSSNamespaceRule", + "CSSNumericArray", + "CSSNumericValue", + "CSSPageRule", + "CSSPerspective", + "CSSPositionValue", + "CSSPrimitiveValue", + "CSSRotate", + "CSSRule", + "CSSRuleList", + "CSSScale", + "CSSSkew", + "CSSSkewX", + "CSSSkewY", + "CSSStyleDeclaration", + "CSSStyleRule", + "CSSStyleSheet", + "CSSStyleValue", + "CSSSupportsRule", + "CSSTransformComponent", + "CSSTransformValue", + "CSSTransition", + "CSSTranslate", + "CSSUnitValue", + "CSSUnknownRule", + "CSSUnparsedValue", + "CSSValue", + "CSSValueList", + "CSSVariableReferenceValue", + "CSSVariablesDeclaration", + "CSSVariablesRule", + "CSSViewportRule", + "CSS_ATTR", + "CSS_CM", + "CSS_COUNTER", + "CSS_CUSTOM", + "CSS_DEG", + "CSS_DIMENSION", + "CSS_EMS", + "CSS_EXS", + "CSS_FILTER_BLUR", + "CSS_FILTER_BRIGHTNESS", + "CSS_FILTER_CONTRAST", + "CSS_FILTER_CUSTOM", + "CSS_FILTER_DROP_SHADOW", + "CSS_FILTER_GRAYSCALE", + "CSS_FILTER_HUE_ROTATE", + "CSS_FILTER_INVERT", + "CSS_FILTER_OPACITY", + "CSS_FILTER_REFERENCE", + "CSS_FILTER_SATURATE", + "CSS_FILTER_SEPIA", + "CSS_GRAD", + "CSS_HZ", + "CSS_IDENT", + "CSS_IN", + "CSS_INHERIT", + "CSS_KHZ", + "CSS_MATRIX", + "CSS_MATRIX3D", + "CSS_MM", + "CSS_MS", + "CSS_NUMBER", + "CSS_PC", + "CSS_PERCENTAGE", + "CSS_PERSPECTIVE", + "CSS_PRIMITIVE_VALUE", + "CSS_PT", + "CSS_PX", + "CSS_RAD", + "CSS_RECT", + "CSS_RGBCOLOR", + "CSS_ROTATE", + "CSS_ROTATE3D", + "CSS_ROTATEX", + "CSS_ROTATEY", + "CSS_ROTATEZ", + "CSS_S", + "CSS_SCALE", + "CSS_SCALE3D", + "CSS_SCALEX", + "CSS_SCALEY", + "CSS_SCALEZ", + "CSS_SKEW", + "CSS_SKEWX", + "CSS_SKEWY", + "CSS_STRING", + "CSS_TRANSLATE", + "CSS_TRANSLATE3D", + "CSS_TRANSLATEX", + "CSS_TRANSLATEY", + "CSS_TRANSLATEZ", + "CSS_UNKNOWN", + "CSS_URI", + "CSS_VALUE_LIST", + "CSS_VH", + "CSS_VMAX", + "CSS_VMIN", + "CSS_VW", + "CULL_FACE", + "CULL_FACE_MODE", + "CURRENT_PROGRAM", + "CURRENT_QUERY", + "CURRENT_VERTEX_ATTRIB", + "CUSTOM", + "CW", + "Cache", + "CacheStorage", + "CanvasCaptureMediaStream", + "CanvasCaptureMediaStreamTrack", + "CanvasGradient", + "CanvasPattern", + "CanvasRenderingContext2D", + "CaretPosition", + "ChannelMergerNode", + "ChannelSplitterNode", + "CharacterData", + "ClientRect", + "ClientRectList", + "Clipboard", + "ClipboardEvent", + "ClipboardItem", + "CloseEvent", + "Collator", + "CommandEvent", + "Comment", + "CompileError", + "CompositionEvent", + "CompressionStream", + "Console", + "ConstantSourceNode", + "Controllers", + "ConvolverNode", + "CountQueuingStrategy", + "Counter", + "Credential", + "CredentialsContainer", + "Crypto", + "CryptoKey", + "CustomElementRegistry", + "CustomEvent", + "DATABASE_ERR", + "DATA_CLONE_ERR", + "DATA_ERR", + "DBLCLICK", + "DECR", + "DECR_WRAP", + "DELETE_STATUS", + "DEPTH", + "DEPTH24_STENCIL8", + "DEPTH32F_STENCIL8", + "DEPTH_ATTACHMENT", + "DEPTH_BITS", + "DEPTH_BUFFER_BIT", + "DEPTH_CLEAR_VALUE", + "DEPTH_COMPONENT", + "DEPTH_COMPONENT16", + "DEPTH_COMPONENT24", + "DEPTH_COMPONENT32F", + "DEPTH_FUNC", + "DEPTH_RANGE", + "DEPTH_STENCIL", + "DEPTH_STENCIL_ATTACHMENT", + "DEPTH_TEST", + "DEPTH_WRITEMASK", + "DEVICE_INELIGIBLE", + "DIRECTION_DOWN", + "DIRECTION_LEFT", + "DIRECTION_RIGHT", + "DIRECTION_UP", + "DISABLED", + "DISPATCH_REQUEST_ERR", + "DITHER", + "DOCUMENT_FRAGMENT_NODE", + "DOCUMENT_NODE", + "DOCUMENT_POSITION_CONTAINED_BY", + "DOCUMENT_POSITION_CONTAINS", + "DOCUMENT_POSITION_DISCONNECTED", + "DOCUMENT_POSITION_FOLLOWING", + "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC", + "DOCUMENT_POSITION_PRECEDING", + "DOCUMENT_TYPE_NODE", + "DOMCursor", + "DOMError", + "DOMException", + "DOMImplementation", + "DOMImplementationLS", + "DOMMatrix", + "DOMMatrixReadOnly", + "DOMParser", + "DOMPoint", + "DOMPointReadOnly", + "DOMQuad", + "DOMRect", + "DOMRectList", + "DOMRectReadOnly", + "DOMRequest", + "DOMSTRING_SIZE_ERR", + "DOMSettableTokenList", + "DOMStringList", + "DOMStringMap", + "DOMTokenList", + "DOMTransactionEvent", + "DOM_DELTA_LINE", + "DOM_DELTA_PAGE", + "DOM_DELTA_PIXEL", + "DOM_INPUT_METHOD_DROP", + "DOM_INPUT_METHOD_HANDWRITING", + "DOM_INPUT_METHOD_IME", + "DOM_INPUT_METHOD_KEYBOARD", + "DOM_INPUT_METHOD_MULTIMODAL", + "DOM_INPUT_METHOD_OPTION", + "DOM_INPUT_METHOD_PASTE", + "DOM_INPUT_METHOD_SCRIPT", + "DOM_INPUT_METHOD_UNKNOWN", + "DOM_INPUT_METHOD_VOICE", + "DOM_KEY_LOCATION_JOYSTICK", + "DOM_KEY_LOCATION_LEFT", + "DOM_KEY_LOCATION_MOBILE", + "DOM_KEY_LOCATION_NUMPAD", + "DOM_KEY_LOCATION_RIGHT", + "DOM_KEY_LOCATION_STANDARD", + "DOM_VK_0", + "DOM_VK_1", + "DOM_VK_2", + "DOM_VK_3", + "DOM_VK_4", + "DOM_VK_5", + "DOM_VK_6", + "DOM_VK_7", + "DOM_VK_8", + "DOM_VK_9", + "DOM_VK_A", + "DOM_VK_ACCEPT", + "DOM_VK_ADD", + "DOM_VK_ALT", + "DOM_VK_ALTGR", + "DOM_VK_AMPERSAND", + "DOM_VK_ASTERISK", + "DOM_VK_AT", + "DOM_VK_ATTN", + "DOM_VK_B", + "DOM_VK_BACKSPACE", + "DOM_VK_BACK_QUOTE", + "DOM_VK_BACK_SLASH", + "DOM_VK_BACK_SPACE", + "DOM_VK_C", + "DOM_VK_CANCEL", + "DOM_VK_CAPS_LOCK", + "DOM_VK_CIRCUMFLEX", + "DOM_VK_CLEAR", + "DOM_VK_CLOSE_BRACKET", + "DOM_VK_CLOSE_CURLY_BRACKET", + "DOM_VK_CLOSE_PAREN", + "DOM_VK_COLON", + "DOM_VK_COMMA", + "DOM_VK_CONTEXT_MENU", + "DOM_VK_CONTROL", + "DOM_VK_CONVERT", + "DOM_VK_CRSEL", + "DOM_VK_CTRL", + "DOM_VK_D", + "DOM_VK_DECIMAL", + "DOM_VK_DELETE", + "DOM_VK_DIVIDE", + "DOM_VK_DOLLAR", + "DOM_VK_DOUBLE_QUOTE", + "DOM_VK_DOWN", + "DOM_VK_E", + "DOM_VK_EISU", + "DOM_VK_END", + "DOM_VK_ENTER", + "DOM_VK_EQUALS", + "DOM_VK_EREOF", + "DOM_VK_ESCAPE", + "DOM_VK_EXCLAMATION", + "DOM_VK_EXECUTE", + "DOM_VK_EXSEL", + "DOM_VK_F", + "DOM_VK_F1", + "DOM_VK_F10", + "DOM_VK_F11", + "DOM_VK_F12", + "DOM_VK_F13", + "DOM_VK_F14", + "DOM_VK_F15", + "DOM_VK_F16", + "DOM_VK_F17", + "DOM_VK_F18", + "DOM_VK_F19", + "DOM_VK_F2", + "DOM_VK_F20", + "DOM_VK_F21", + "DOM_VK_F22", + "DOM_VK_F23", + "DOM_VK_F24", + "DOM_VK_F25", + "DOM_VK_F26", + "DOM_VK_F27", + "DOM_VK_F28", + "DOM_VK_F29", + "DOM_VK_F3", + "DOM_VK_F30", + "DOM_VK_F31", + "DOM_VK_F32", + "DOM_VK_F33", + "DOM_VK_F34", + "DOM_VK_F35", + "DOM_VK_F36", + "DOM_VK_F4", + "DOM_VK_F5", + "DOM_VK_F6", + "DOM_VK_F7", + "DOM_VK_F8", + "DOM_VK_F9", + "DOM_VK_FINAL", + "DOM_VK_FRONT", + "DOM_VK_G", + "DOM_VK_GREATER_THAN", + "DOM_VK_H", + "DOM_VK_HANGUL", + "DOM_VK_HANJA", + "DOM_VK_HASH", + "DOM_VK_HELP", + "DOM_VK_HK_TOGGLE", + "DOM_VK_HOME", + "DOM_VK_HYPHEN_MINUS", + "DOM_VK_I", + "DOM_VK_INSERT", + "DOM_VK_J", + "DOM_VK_JUNJA", + "DOM_VK_K", + "DOM_VK_KANA", + "DOM_VK_KANJI", + "DOM_VK_L", + "DOM_VK_LEFT", + "DOM_VK_LEFT_TAB", + "DOM_VK_LESS_THAN", + "DOM_VK_M", + "DOM_VK_META", + "DOM_VK_MODECHANGE", + "DOM_VK_MULTIPLY", + "DOM_VK_N", + "DOM_VK_NONCONVERT", + "DOM_VK_NUMPAD0", + "DOM_VK_NUMPAD1", + "DOM_VK_NUMPAD2", + "DOM_VK_NUMPAD3", + "DOM_VK_NUMPAD4", + "DOM_VK_NUMPAD5", + "DOM_VK_NUMPAD6", + "DOM_VK_NUMPAD7", + "DOM_VK_NUMPAD8", + "DOM_VK_NUMPAD9", + "DOM_VK_NUM_LOCK", + "DOM_VK_O", + "DOM_VK_OEM_1", + "DOM_VK_OEM_102", + "DOM_VK_OEM_2", + "DOM_VK_OEM_3", + "DOM_VK_OEM_4", + "DOM_VK_OEM_5", + "DOM_VK_OEM_6", + "DOM_VK_OEM_7", + "DOM_VK_OEM_8", + "DOM_VK_OEM_COMMA", + "DOM_VK_OEM_MINUS", + "DOM_VK_OEM_PERIOD", + "DOM_VK_OEM_PLUS", + "DOM_VK_OPEN_BRACKET", + "DOM_VK_OPEN_CURLY_BRACKET", + "DOM_VK_OPEN_PAREN", + "DOM_VK_P", + "DOM_VK_PA1", + "DOM_VK_PAGEDOWN", + "DOM_VK_PAGEUP", + "DOM_VK_PAGE_DOWN", + "DOM_VK_PAGE_UP", + "DOM_VK_PAUSE", + "DOM_VK_PERCENT", + "DOM_VK_PERIOD", + "DOM_VK_PIPE", + "DOM_VK_PLAY", + "DOM_VK_PLUS", + "DOM_VK_PRINT", + "DOM_VK_PRINTSCREEN", + "DOM_VK_PROCESSKEY", + "DOM_VK_PROPERITES", + "DOM_VK_Q", + "DOM_VK_QUESTION_MARK", + "DOM_VK_QUOTE", + "DOM_VK_R", + "DOM_VK_REDO", + "DOM_VK_RETURN", + "DOM_VK_RIGHT", + "DOM_VK_S", + "DOM_VK_SCROLL_LOCK", + "DOM_VK_SELECT", + "DOM_VK_SEMICOLON", + "DOM_VK_SEPARATOR", + "DOM_VK_SHIFT", + "DOM_VK_SLASH", + "DOM_VK_SLEEP", + "DOM_VK_SPACE", + "DOM_VK_SUBTRACT", + "DOM_VK_T", + "DOM_VK_TAB", + "DOM_VK_TILDE", + "DOM_VK_U", + "DOM_VK_UNDERSCORE", + "DOM_VK_UNDO", + "DOM_VK_UNICODE", + "DOM_VK_UP", + "DOM_VK_V", + "DOM_VK_VOLUME_DOWN", + "DOM_VK_VOLUME_MUTE", + "DOM_VK_VOLUME_UP", + "DOM_VK_W", + "DOM_VK_WIN", + "DOM_VK_WINDOW", + "DOM_VK_WIN_ICO_00", + "DOM_VK_WIN_ICO_CLEAR", + "DOM_VK_WIN_ICO_HELP", + "DOM_VK_WIN_OEM_ATTN", + "DOM_VK_WIN_OEM_AUTO", + "DOM_VK_WIN_OEM_BACKTAB", + "DOM_VK_WIN_OEM_CLEAR", + "DOM_VK_WIN_OEM_COPY", + "DOM_VK_WIN_OEM_CUSEL", + "DOM_VK_WIN_OEM_ENLW", + "DOM_VK_WIN_OEM_FINISH", + "DOM_VK_WIN_OEM_FJ_JISHO", + "DOM_VK_WIN_OEM_FJ_LOYA", + "DOM_VK_WIN_OEM_FJ_MASSHOU", + "DOM_VK_WIN_OEM_FJ_ROYA", + "DOM_VK_WIN_OEM_FJ_TOUROKU", + "DOM_VK_WIN_OEM_JUMP", + "DOM_VK_WIN_OEM_PA1", + "DOM_VK_WIN_OEM_PA2", + "DOM_VK_WIN_OEM_PA3", + "DOM_VK_WIN_OEM_RESET", + "DOM_VK_WIN_OEM_WSCTRL", + "DOM_VK_X", + "DOM_VK_XF86XK_ADD_FAVORITE", + "DOM_VK_XF86XK_APPLICATION_LEFT", + "DOM_VK_XF86XK_APPLICATION_RIGHT", + "DOM_VK_XF86XK_AUDIO_CYCLE_TRACK", + "DOM_VK_XF86XK_AUDIO_FORWARD", + "DOM_VK_XF86XK_AUDIO_LOWER_VOLUME", + "DOM_VK_XF86XK_AUDIO_MEDIA", + "DOM_VK_XF86XK_AUDIO_MUTE", + "DOM_VK_XF86XK_AUDIO_NEXT", + "DOM_VK_XF86XK_AUDIO_PAUSE", + "DOM_VK_XF86XK_AUDIO_PLAY", + "DOM_VK_XF86XK_AUDIO_PREV", + "DOM_VK_XF86XK_AUDIO_RAISE_VOLUME", + "DOM_VK_XF86XK_AUDIO_RANDOM_PLAY", + "DOM_VK_XF86XK_AUDIO_RECORD", + "DOM_VK_XF86XK_AUDIO_REPEAT", + "DOM_VK_XF86XK_AUDIO_REWIND", + "DOM_VK_XF86XK_AUDIO_STOP", + "DOM_VK_XF86XK_AWAY", + "DOM_VK_XF86XK_BACK", + "DOM_VK_XF86XK_BACK_FORWARD", + "DOM_VK_XF86XK_BATTERY", + "DOM_VK_XF86XK_BLUE", + "DOM_VK_XF86XK_BLUETOOTH", + "DOM_VK_XF86XK_BOOK", + "DOM_VK_XF86XK_BRIGHTNESS_ADJUST", + "DOM_VK_XF86XK_CALCULATOR", + "DOM_VK_XF86XK_CALENDAR", + "DOM_VK_XF86XK_CD", + "DOM_VK_XF86XK_CLOSE", + "DOM_VK_XF86XK_COMMUNITY", + "DOM_VK_XF86XK_CONTRAST_ADJUST", + "DOM_VK_XF86XK_COPY", + "DOM_VK_XF86XK_CUT", + "DOM_VK_XF86XK_CYCLE_ANGLE", + "DOM_VK_XF86XK_DISPLAY", + "DOM_VK_XF86XK_DOCUMENTS", + "DOM_VK_XF86XK_DOS", + "DOM_VK_XF86XK_EJECT", + "DOM_VK_XF86XK_EXCEL", + "DOM_VK_XF86XK_EXPLORER", + "DOM_VK_XF86XK_FAVORITES", + "DOM_VK_XF86XK_FINANCE", + "DOM_VK_XF86XK_FORWARD", + "DOM_VK_XF86XK_FRAME_BACK", + "DOM_VK_XF86XK_FRAME_FORWARD", + "DOM_VK_XF86XK_GAME", + "DOM_VK_XF86XK_GO", + "DOM_VK_XF86XK_GREEN", + "DOM_VK_XF86XK_HIBERNATE", + "DOM_VK_XF86XK_HISTORY", + "DOM_VK_XF86XK_HOME_PAGE", + "DOM_VK_XF86XK_HOT_LINKS", + "DOM_VK_XF86XK_I_TOUCH", + "DOM_VK_XF86XK_KBD_BRIGHTNESS_DOWN", + "DOM_VK_XF86XK_KBD_BRIGHTNESS_UP", + "DOM_VK_XF86XK_KBD_LIGHT_ON_OFF", + "DOM_VK_XF86XK_LAUNCH0", + "DOM_VK_XF86XK_LAUNCH1", + "DOM_VK_XF86XK_LAUNCH2", + "DOM_VK_XF86XK_LAUNCH3", + "DOM_VK_XF86XK_LAUNCH4", + "DOM_VK_XF86XK_LAUNCH5", + "DOM_VK_XF86XK_LAUNCH6", + "DOM_VK_XF86XK_LAUNCH7", + "DOM_VK_XF86XK_LAUNCH8", + "DOM_VK_XF86XK_LAUNCH9", + "DOM_VK_XF86XK_LAUNCH_A", + "DOM_VK_XF86XK_LAUNCH_B", + "DOM_VK_XF86XK_LAUNCH_C", + "DOM_VK_XF86XK_LAUNCH_D", + "DOM_VK_XF86XK_LAUNCH_E", + "DOM_VK_XF86XK_LAUNCH_F", + "DOM_VK_XF86XK_LIGHT_BULB", + "DOM_VK_XF86XK_LOG_OFF", + "DOM_VK_XF86XK_MAIL", + "DOM_VK_XF86XK_MAIL_FORWARD", + "DOM_VK_XF86XK_MARKET", + "DOM_VK_XF86XK_MEETING", + "DOM_VK_XF86XK_MEMO", + "DOM_VK_XF86XK_MENU_KB", + "DOM_VK_XF86XK_MENU_PB", + "DOM_VK_XF86XK_MESSENGER", + "DOM_VK_XF86XK_MON_BRIGHTNESS_DOWN", + "DOM_VK_XF86XK_MON_BRIGHTNESS_UP", + "DOM_VK_XF86XK_MUSIC", + "DOM_VK_XF86XK_MY_COMPUTER", + "DOM_VK_XF86XK_MY_SITES", + "DOM_VK_XF86XK_NEW", + "DOM_VK_XF86XK_NEWS", + "DOM_VK_XF86XK_OFFICE_HOME", + "DOM_VK_XF86XK_OPEN", + "DOM_VK_XF86XK_OPEN_URL", + "DOM_VK_XF86XK_OPTION", + "DOM_VK_XF86XK_PASTE", + "DOM_VK_XF86XK_PHONE", + "DOM_VK_XF86XK_PICTURES", + "DOM_VK_XF86XK_POWER_DOWN", + "DOM_VK_XF86XK_POWER_OFF", + "DOM_VK_XF86XK_RED", + "DOM_VK_XF86XK_REFRESH", + "DOM_VK_XF86XK_RELOAD", + "DOM_VK_XF86XK_REPLY", + "DOM_VK_XF86XK_ROCKER_DOWN", + "DOM_VK_XF86XK_ROCKER_ENTER", + "DOM_VK_XF86XK_ROCKER_UP", + "DOM_VK_XF86XK_ROTATE_WINDOWS", + "DOM_VK_XF86XK_ROTATION_KB", + "DOM_VK_XF86XK_ROTATION_PB", + "DOM_VK_XF86XK_SAVE", + "DOM_VK_XF86XK_SCREEN_SAVER", + "DOM_VK_XF86XK_SCROLL_CLICK", + "DOM_VK_XF86XK_SCROLL_DOWN", + "DOM_VK_XF86XK_SCROLL_UP", + "DOM_VK_XF86XK_SEARCH", + "DOM_VK_XF86XK_SEND", + "DOM_VK_XF86XK_SHOP", + "DOM_VK_XF86XK_SPELL", + "DOM_VK_XF86XK_SPLIT_SCREEN", + "DOM_VK_XF86XK_STANDBY", + "DOM_VK_XF86XK_START", + "DOM_VK_XF86XK_STOP", + "DOM_VK_XF86XK_SUBTITLE", + "DOM_VK_XF86XK_SUPPORT", + "DOM_VK_XF86XK_SUSPEND", + "DOM_VK_XF86XK_TASK_PANE", + "DOM_VK_XF86XK_TERMINAL", + "DOM_VK_XF86XK_TIME", + "DOM_VK_XF86XK_TOOLS", + "DOM_VK_XF86XK_TOP_MENU", + "DOM_VK_XF86XK_TO_DO_LIST", + "DOM_VK_XF86XK_TRAVEL", + "DOM_VK_XF86XK_USER1KB", + "DOM_VK_XF86XK_USER2KB", + "DOM_VK_XF86XK_USER_PB", + "DOM_VK_XF86XK_UWB", + "DOM_VK_XF86XK_VENDOR_HOME", + "DOM_VK_XF86XK_VIDEO", + "DOM_VK_XF86XK_VIEW", + "DOM_VK_XF86XK_WAKE_UP", + "DOM_VK_XF86XK_WEB_CAM", + "DOM_VK_XF86XK_WHEEL_BUTTON", + "DOM_VK_XF86XK_WLAN", + "DOM_VK_XF86XK_WORD", + "DOM_VK_XF86XK_WWW", + "DOM_VK_XF86XK_XFER", + "DOM_VK_XF86XK_YELLOW", + "DOM_VK_XF86XK_ZOOM_IN", + "DOM_VK_XF86XK_ZOOM_OUT", + "DOM_VK_Y", + "DOM_VK_Z", + "DOM_VK_ZOOM", + "DONE", + "DONT_CARE", + "DOWNLOADING", + "DRAGDROP", + "DRAW_BUFFER0", + "DRAW_BUFFER1", + "DRAW_BUFFER10", + "DRAW_BUFFER11", + "DRAW_BUFFER12", + "DRAW_BUFFER13", + "DRAW_BUFFER14", + "DRAW_BUFFER15", + "DRAW_BUFFER2", + "DRAW_BUFFER3", + "DRAW_BUFFER4", + "DRAW_BUFFER5", + "DRAW_BUFFER6", + "DRAW_BUFFER7", + "DRAW_BUFFER8", + "DRAW_BUFFER9", + "DRAW_FRAMEBUFFER", + "DRAW_FRAMEBUFFER_BINDING", + "DST_ALPHA", + "DST_COLOR", + "DYNAMIC_COPY", + "DYNAMIC_DRAW", + "DYNAMIC_READ", + "DataChannel", + "DataTransfer", + "DataTransferItem", + "DataTransferItemList", + "DataView", + "Date", + "DateTimeFormat", + "DecompressionStream", + "DelayNode", + "DeprecationReportBody", + "DesktopNotification", + "DesktopNotificationCenter", + "DeviceLightEvent", + "DeviceMotionEvent", + "DeviceMotionEventAcceleration", + "DeviceMotionEventRotationRate", + "DeviceOrientationEvent", + "DeviceProximityEvent", + "DeviceStorage", + "DeviceStorageChangeEvent", + "Directory", + "DisplayNames", + "Document", + "DocumentFragment", + "DocumentTimeline", + "DocumentType", + "DragEvent", + "DynamicsCompressorNode", + "E", + "ELEMENT_ARRAY_BUFFER", + "ELEMENT_ARRAY_BUFFER_BINDING", + "ELEMENT_NODE", + "EMPTY", + "ENCODING_ERR", + "ENDED", + "END_TO_END", + "END_TO_START", + "ENTITY_NODE", + "ENTITY_REFERENCE_NODE", + "EPSILON", + "EQUAL", + "EQUALPOWER", + "ERROR", + "EXPONENTIAL_DISTANCE", + "exports", + "Element", + "ElementInternals", + "ElementQuery", + "EnterPictureInPictureEvent", + "Entity", + "EntityReference", + "Error", + "ErrorEvent", + "EvalError", + "Event", + "EventException", + "EventSource", + "EventTarget", + "External", + "FASTEST", + "FIDOSDK", + "FILTER_ACCEPT", + "FILTER_INTERRUPT", + "FILTER_REJECT", + "FILTER_SKIP", + "FINISHED_STATE", + "FIRST_ORDERED_NODE_TYPE", + "FLOAT", + "FLOAT_32_UNSIGNED_INT_24_8_REV", + "FLOAT_MAT2", + "FLOAT_MAT2x3", + "FLOAT_MAT2x4", + "FLOAT_MAT3", + "FLOAT_MAT3x2", + "FLOAT_MAT3x4", + "FLOAT_MAT4", + "FLOAT_MAT4x2", + "FLOAT_MAT4x3", + "FLOAT_VEC2", + "FLOAT_VEC3", + "FLOAT_VEC4", + "FOCUS", + "FONT_FACE_RULE", + "FONT_FEATURE_VALUES_RULE", + "FRAGMENT_SHADER", + "FRAGMENT_SHADER_DERIVATIVE_HINT", + "FRAGMENT_SHADER_DERIVATIVE_HINT_OES", + "FRAMEBUFFER", + "FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE", + "FRAMEBUFFER_ATTACHMENT_BLUE_SIZE", + "FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING", + "FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE", + "FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE", + "FRAMEBUFFER_ATTACHMENT_GREEN_SIZE", + "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME", + "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE", + "FRAMEBUFFER_ATTACHMENT_RED_SIZE", + "FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE", + "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE", + "FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER", + "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL", + "FRAMEBUFFER_BINDING", + "FRAMEBUFFER_COMPLETE", + "FRAMEBUFFER_DEFAULT", + "FRAMEBUFFER_INCOMPLETE_ATTACHMENT", + "FRAMEBUFFER_INCOMPLETE_DIMENSIONS", + "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT", + "FRAMEBUFFER_INCOMPLETE_MULTISAMPLE", + "FRAMEBUFFER_UNSUPPORTED", + "FRONT", + "FRONT_AND_BACK", + "FRONT_FACE", + "FUNC_ADD", + "FUNC_REVERSE_SUBTRACT", + "FUNC_SUBTRACT", + "FeaturePolicy", + "FeaturePolicyViolationReportBody", + "FederatedCredential", + "Feed", + "FeedEntry", + "File", + "FileError", + "FileList", + "FileReader", + "FileSystem", + "FileSystemDirectoryEntry", + "FileSystemDirectoryReader", + "FileSystemEntry", + "FileSystemFileEntry", + "FinalizationRegistry", + "FindInPage", + "Float32Array", + "Float64Array", + "FocusEvent", + "FontFace", + "FontFaceSet", + "FontFaceSetLoadEvent", + "FormData", + "FormDataEvent", + "FragmentDirective", + "Function", + "GENERATE_MIPMAP_HINT", + "GEQUAL", + "GREATER", + "GREEN_BITS", + "GainNode", + "Gamepad", + "GamepadAxisMoveEvent", + "GamepadButton", + "GamepadButtonEvent", + "GamepadEvent", + "GamepadHapticActuator", + "GamepadPose", + "Geolocation", + "GeolocationCoordinates", + "GeolocationPosition", + "GeolocationPositionError", + "GestureEvent", + "Global", + "Gyroscope", + "HALF_FLOAT", + "HAVE_CURRENT_DATA", + "HAVE_ENOUGH_DATA", + "HAVE_FUTURE_DATA", + "HAVE_METADATA", + "HAVE_NOTHING", + "HEADERS_RECEIVED", + "HIDDEN", + "HIERARCHY_REQUEST_ERR", + "HIGHPASS", + "HIGHSHELF", + "HIGH_FLOAT", + "HIGH_INT", + "HORIZONTAL", + "HORIZONTAL_AXIS", + "HRTF", + "HTMLAllCollection", + "HTMLAnchorElement", + "HTMLAppletElement", + "HTMLAreaElement", + "HTMLAudioElement", + "HTMLBRElement", + "HTMLBaseElement", + "HTMLBaseFontElement", + "HTMLBlockquoteElement", + "HTMLBodyElement", + "HTMLButtonElement", + "HTMLCanvasElement", + "HTMLCollection", + "HTMLCommandElement", + "HTMLContentElement", + "HTMLDListElement", + "HTMLDataElement", + "HTMLDataListElement", + "HTMLDetailsElement", + "HTMLDialogElement", + "HTMLDirectoryElement", + "HTMLDivElement", + "HTMLDocument", + "HTMLElement", + "HTMLEmbedElement", + "HTMLFieldSetElement", + "HTMLFontElement", + "HTMLFormControlsCollection", + "HTMLFormElement", + "HTMLFrameElement", + "HTMLFrameSetElement", + "HTMLHRElement", + "HTMLHeadElement", + "HTMLHeadingElement", + "HTMLHtmlElement", + "HTMLIFrameElement", + "HTMLImageElement", + "HTMLInputElement", + "HTMLIsIndexElement", + "HTMLKeygenElement", + "HTMLLIElement", + "HTMLLabelElement", + "HTMLLegendElement", + "HTMLLinkElement", + "HTMLMapElement", + "HTMLMarqueeElement", + "HTMLMediaElement", + "HTMLMenuElement", + "HTMLMenuItemElement", + "HTMLMetaElement", + "HTMLMeterElement", + "HTMLModElement", + "HTMLOListElement", + "HTMLObjectElement", + "HTMLOptGroupElement", + "HTMLOptionElement", + "HTMLOptionsCollection", + "HTMLOutputElement", + "HTMLParagraphElement", + "HTMLParamElement", + "HTMLPictureElement", + "HTMLPreElement", + "HTMLProgressElement", + "HTMLPropertiesCollection", + "HTMLQuoteElement", + "HTMLScriptElement", + "HTMLSelectElement", + "HTMLShadowElement", + "HTMLSlotElement", + "HTMLSourceElement", + "HTMLSpanElement", + "HTMLStyleElement", + "HTMLTableCaptionElement", + "HTMLTableCellElement", + "HTMLTableColElement", + "HTMLTableElement", + "HTMLTableRowElement", + "HTMLTableSectionElement", + "HTMLTemplateElement", + "HTMLTextAreaElement", + "HTMLTimeElement", + "HTMLTitleElement", + "HTMLTrackElement", + "HTMLUListElement", + "HTMLUnknownElement", + "HTMLVideoElement", + "HashChangeEvent", + "Headers", + "History", + "Hz", + "ICE_CHECKING", + "ICE_CLOSED", + "ICE_COMPLETED", + "ICE_CONNECTED", + "ICE_FAILED", + "ICE_GATHERING", + "ICE_WAITING", + "IDBCursor", + "IDBCursorWithValue", + "IDBDatabase", + "IDBDatabaseException", + "IDBFactory", + "IDBFileHandle", + "IDBFileRequest", + "IDBIndex", + "IDBKeyRange", + "IDBMutableFile", + "IDBObjectStore", + "IDBOpenDBRequest", + "IDBRequest", + "IDBTransaction", + "IDBVersionChangeEvent", + "IDLE", + "IIRFilterNode", + "IMPLEMENTATION_COLOR_READ_FORMAT", + "IMPLEMENTATION_COLOR_READ_TYPE", + "IMPORT_RULE", + "INCR", + "INCR_WRAP", + "INDEX_SIZE_ERR", + "INT", + "INTERLEAVED_ATTRIBS", + "INT_2_10_10_10_REV", + "INT_SAMPLER_2D", + "INT_SAMPLER_2D_ARRAY", + "INT_SAMPLER_3D", + "INT_SAMPLER_CUBE", + "INT_VEC2", + "INT_VEC3", + "INT_VEC4", + "INUSE_ATTRIBUTE_ERR", + "INVALID_ACCESS_ERR", + "INVALID_CHARACTER_ERR", + "INVALID_ENUM", + "INVALID_EXPRESSION_ERR", + "INVALID_FRAMEBUFFER_OPERATION", + "INVALID_INDEX", + "INVALID_MODIFICATION_ERR", + "INVALID_NODE_TYPE_ERR", + "INVALID_OPERATION", + "INVALID_STATE_ERR", + "INVALID_VALUE", + "INVERSE_DISTANCE", + "INVERT", + "IceCandidate", + "IdleDeadline", + "Image", + "ImageBitmap", + "ImageBitmapRenderingContext", + "ImageCapture", + "ImageData", + "Infinity", + "InputDeviceCapabilities", + "InputDeviceInfo", + "InputEvent", + "InputMethodContext", + "InstallTrigger", + "InstallTriggerImpl", + "Instance", + "Int16Array", + "Int32Array", + "Int8Array", + "Intent", + "InternalError", + "IntersectionObserver", + "IntersectionObserverEntry", + "Intl", + "IsSearchProviderInstalled", + "Iterator", + "JSON", + "KEEP", + "KEYDOWN", + "KEYFRAMES_RULE", + "KEYFRAME_RULE", + "KEYPRESS", + "KEYUP", + "KeyEvent", + "Keyboard", + "KeyboardEvent", + "KeyboardLayoutMap", + "KeyframeEffect", + "LENGTHADJUST_SPACING", + "LENGTHADJUST_SPACINGANDGLYPHS", + "LENGTHADJUST_UNKNOWN", + "LEQUAL", + "LESS", + "LINEAR", + "LINEAR_DISTANCE", + "LINEAR_MIPMAP_LINEAR", + "LINEAR_MIPMAP_NEAREST", + "LINES", + "LINE_LOOP", + "LINE_STRIP", + "LINE_WIDTH", + "LINK_STATUS", + "LIVE", + "LN10", + "LN2", + "LOADED", + "LOADING", + "LOG10E", + "LOG2E", + "LOWPASS", + "LOWSHELF", + "LOW_FLOAT", + "LOW_INT", + "LSException", + "LSParserFilter", + "LUMINANCE", + "LUMINANCE_ALPHA", + "LargestContentfulPaint", + "LayoutShift", + "LayoutShiftAttribution", + "LinearAccelerationSensor", + "LinkError", + "ListFormat", + "LocalMediaStream", + "Locale", + "Location", + "Lock", + "LockManager", + "MAX", + "MAX_3D_TEXTURE_SIZE", + "MAX_ARRAY_TEXTURE_LAYERS", + "MAX_CLIENT_WAIT_TIMEOUT_WEBGL", + "MAX_COLOR_ATTACHMENTS", + "MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS", + "MAX_COMBINED_TEXTURE_IMAGE_UNITS", + "MAX_COMBINED_UNIFORM_BLOCKS", + "MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS", + "MAX_CUBE_MAP_TEXTURE_SIZE", + "MAX_DRAW_BUFFERS", + "MAX_ELEMENTS_INDICES", + "MAX_ELEMENTS_VERTICES", + "MAX_ELEMENT_INDEX", + "MAX_FRAGMENT_INPUT_COMPONENTS", + "MAX_FRAGMENT_UNIFORM_BLOCKS", + "MAX_FRAGMENT_UNIFORM_COMPONENTS", + "MAX_FRAGMENT_UNIFORM_VECTORS", + "MAX_PROGRAM_TEXEL_OFFSET", + "MAX_RENDERBUFFER_SIZE", + "MAX_SAFE_INTEGER", + "MAX_SAMPLES", + "MAX_SERVER_WAIT_TIMEOUT", + "MAX_TEXTURE_IMAGE_UNITS", + "MAX_TEXTURE_LOD_BIAS", + "MAX_TEXTURE_MAX_ANISOTROPY_EXT", + "MAX_TEXTURE_SIZE", + "MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS", + "MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS", + "MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS", + "MAX_UNIFORM_BLOCK_SIZE", + "MAX_UNIFORM_BUFFER_BINDINGS", + "MAX_VALUE", + "MAX_VARYING_COMPONENTS", + "MAX_VARYING_VECTORS", + "MAX_VERTEX_ATTRIBS", + "MAX_VERTEX_OUTPUT_COMPONENTS", + "MAX_VERTEX_TEXTURE_IMAGE_UNITS", + "MAX_VERTEX_UNIFORM_BLOCKS", + "MAX_VERTEX_UNIFORM_COMPONENTS", + "MAX_VERTEX_UNIFORM_VECTORS", + "MAX_VIEWPORT_DIMS", + "MEDIA_ERR_ABORTED", + "MEDIA_ERR_DECODE", + "MEDIA_ERR_ENCRYPTED", + "MEDIA_ERR_NETWORK", + "MEDIA_ERR_SRC_NOT_SUPPORTED", + "MEDIA_KEYERR_CLIENT", + "MEDIA_KEYERR_DOMAIN", + "MEDIA_KEYERR_HARDWARECHANGE", + "MEDIA_KEYERR_OUTPUT", + "MEDIA_KEYERR_SERVICE", + "MEDIA_KEYERR_UNKNOWN", + "MEDIA_RULE", + "MEDIUM_FLOAT", + "MEDIUM_INT", + "META_MASK", + "MIDIAccess", + "MIDIConnectionEvent", + "MIDIInput", + "MIDIInputMap", + "MIDIMessageEvent", + "MIDIOutput", + "MIDIOutputMap", + "MIDIPort", + "MIN", + "MIN_PROGRAM_TEXEL_OFFSET", + "MIN_SAFE_INTEGER", + "MIN_VALUE", + "MIRRORED_REPEAT", + "MODE_ASYNCHRONOUS", + "MODE_SYNCHRONOUS", + "MODIFICATION", + "MOUSEDOWN", + "MOUSEDRAG", + "MOUSEMOVE", + "MOUSEOUT", + "MOUSEOVER", + "MOUSEUP", + "MOZ_KEYFRAMES_RULE", + "MOZ_KEYFRAME_RULE", + "MOZ_SOURCE_CURSOR", + "MOZ_SOURCE_ERASER", + "MOZ_SOURCE_KEYBOARD", + "MOZ_SOURCE_MOUSE", + "MOZ_SOURCE_PEN", + "MOZ_SOURCE_TOUCH", + "MOZ_SOURCE_UNKNOWN", + "MSGESTURE_FLAG_BEGIN", + "MSGESTURE_FLAG_CANCEL", + "MSGESTURE_FLAG_END", + "MSGESTURE_FLAG_INERTIA", + "MSGESTURE_FLAG_NONE", + "MSPOINTER_TYPE_MOUSE", + "MSPOINTER_TYPE_PEN", + "MSPOINTER_TYPE_TOUCH", + "MS_ASYNC_CALLBACK_STATUS_ASSIGN_DELEGATE", + "MS_ASYNC_CALLBACK_STATUS_CANCEL", + "MS_ASYNC_CALLBACK_STATUS_CHOOSEANY", + "MS_ASYNC_CALLBACK_STATUS_ERROR", + "MS_ASYNC_CALLBACK_STATUS_JOIN", + "MS_ASYNC_OP_STATUS_CANCELED", + "MS_ASYNC_OP_STATUS_ERROR", + "MS_ASYNC_OP_STATUS_SUCCESS", + "MS_MANIPULATION_STATE_ACTIVE", + "MS_MANIPULATION_STATE_CANCELLED", + "MS_MANIPULATION_STATE_COMMITTED", + "MS_MANIPULATION_STATE_DRAGGING", + "MS_MANIPULATION_STATE_INERTIA", + "MS_MANIPULATION_STATE_PRESELECT", + "MS_MANIPULATION_STATE_SELECTING", + "MS_MANIPULATION_STATE_STOPPED", + "MS_MEDIA_ERR_ENCRYPTED", + "MS_MEDIA_KEYERR_CLIENT", + "MS_MEDIA_KEYERR_DOMAIN", + "MS_MEDIA_KEYERR_HARDWARECHANGE", + "MS_MEDIA_KEYERR_OUTPUT", + "MS_MEDIA_KEYERR_SERVICE", + "MS_MEDIA_KEYERR_UNKNOWN", + "Map", + "Math", + "MathMLElement", + "MediaCapabilities", + "MediaCapabilitiesInfo", + "MediaController", + "MediaDeviceInfo", + "MediaDevices", + "MediaElementAudioSourceNode", + "MediaEncryptedEvent", + "MediaError", + "MediaKeyError", + "MediaKeyEvent", + "MediaKeyMessageEvent", + "MediaKeyNeededEvent", + "MediaKeySession", + "MediaKeyStatusMap", + "MediaKeySystemAccess", + "MediaKeys", + "MediaList", + "MediaMetadata", + "MediaQueryList", + "MediaQueryListEvent", + "MediaRecorder", + "MediaRecorderErrorEvent", + "MediaSession", + "MediaSettingsRange", + "MediaSource", + "MediaStream", + "MediaStreamAudioDestinationNode", + "MediaStreamAudioSourceNode", + "MediaStreamEvent", + "MediaStreamTrack", + "MediaStreamTrackAudioSourceNode", + "MediaStreamTrackEvent", + "Memory", + "MessageChannel", + "MessageEvent", + "MessagePort", + "Methods", + "MimeType", + "MimeTypeArray", + "Module", + "MouseEvent", + "MouseScrollEvent", + "MozAnimation", + "MozAnimationDelay", + "MozAnimationDirection", + "MozAnimationDuration", + "MozAnimationFillMode", + "MozAnimationIterationCount", + "MozAnimationName", + "MozAnimationPlayState", + "MozAnimationTimingFunction", + "MozAppearance", + "MozBackfaceVisibility", + "MozBinding", + "MozBorderBottomColors", + "MozBorderEnd", + "MozBorderEndColor", + "MozBorderEndStyle", + "MozBorderEndWidth", + "MozBorderImage", + "MozBorderLeftColors", + "MozBorderRightColors", + "MozBorderStart", + "MozBorderStartColor", + "MozBorderStartStyle", + "MozBorderStartWidth", + "MozBorderTopColors", + "MozBoxAlign", + "MozBoxDirection", + "MozBoxFlex", + "MozBoxOrdinalGroup", + "MozBoxOrient", + "MozBoxPack", + "MozBoxSizing", + "MozCSSKeyframeRule", + "MozCSSKeyframesRule", + "MozColumnCount", + "MozColumnFill", + "MozColumnGap", + "MozColumnRule", + "MozColumnRuleColor", + "MozColumnRuleStyle", + "MozColumnRuleWidth", + "MozColumnWidth", + "MozColumns", + "MozContactChangeEvent", + "MozFloatEdge", + "MozFontFeatureSettings", + "MozFontLanguageOverride", + "MozForceBrokenImageIcon", + "MozHyphens", + "MozImageRegion", + "MozMarginEnd", + "MozMarginStart", + "MozMmsEvent", + "MozMmsMessage", + "MozMobileMessageThread", + "MozOSXFontSmoothing", + "MozOrient", + "MozOsxFontSmoothing", + "MozOutlineRadius", + "MozOutlineRadiusBottomleft", + "MozOutlineRadiusBottomright", + "MozOutlineRadiusTopleft", + "MozOutlineRadiusTopright", + "MozPaddingEnd", + "MozPaddingStart", + "MozPerspective", + "MozPerspectiveOrigin", + "MozPowerManager", + "MozSettingsEvent", + "MozSmsEvent", + "MozSmsMessage", + "MozStackSizing", + "MozTabSize", + "MozTextAlignLast", + "MozTextDecorationColor", + "MozTextDecorationLine", + "MozTextDecorationStyle", + "MozTextSizeAdjust", + "MozTransform", + "MozTransformOrigin", + "MozTransformStyle", + "MozTransition", + "MozTransitionDelay", + "MozTransitionDuration", + "MozTransitionProperty", + "MozTransitionTimingFunction", + "MozUserFocus", + "MozUserInput", + "MozUserModify", + "MozUserSelect", + "MozWindowDragging", + "MozWindowShadow", + "MutationEvent", + "MutationObserver", + "MutationRecord", + "NAMESPACE_ERR", + "NAMESPACE_RULE", + "NEAREST", + "NEAREST_MIPMAP_LINEAR", + "NEAREST_MIPMAP_NEAREST", + "NEGATIVE_INFINITY", + "NETWORK_EMPTY", + "NETWORK_ERR", + "NETWORK_IDLE", + "NETWORK_LOADED", + "NETWORK_LOADING", + "NETWORK_NO_SOURCE", + "NEVER", + "NEW", + "NEXT", + "NEXT_NO_DUPLICATE", + "NICEST", + "NODE_AFTER", + "NODE_BEFORE", + "NODE_BEFORE_AND_AFTER", + "NODE_INSIDE", + "NONE", + "NON_TRANSIENT_ERR", + "NOTATION_NODE", + "NOTCH", + "NOTEQUAL", + "NOT_ALLOWED_ERR", + "NOT_FOUND_ERR", + "NOT_READABLE_ERR", + "NOT_SUPPORTED_ERR", + "NO_DATA_ALLOWED_ERR", + "NO_ERR", + "NO_ERROR", + "NO_MODIFICATION_ALLOWED_ERR", + "NUMBER_TYPE", + "NUM_COMPRESSED_TEXTURE_FORMATS", + "NaN", + "NamedNodeMap", + "NavigationPreloadManager", + "Navigator", + "NearbyLinks", + "NetworkInformation", + "Node", + "NodeFilter", + "NodeIterator", + "NodeList", + "Notation", + "Notification", + "NotifyPaintEvent", + "Number", + "NumberFormat", + "OBJECT_TYPE", + "OBSOLETE", + "OK", + "ONE", + "ONE_MINUS_CONSTANT_ALPHA", + "ONE_MINUS_CONSTANT_COLOR", + "ONE_MINUS_DST_ALPHA", + "ONE_MINUS_DST_COLOR", + "ONE_MINUS_SRC_ALPHA", + "ONE_MINUS_SRC_COLOR", + "OPEN", + "OPENED", + "OPENING", + "ORDERED_NODE_ITERATOR_TYPE", + "ORDERED_NODE_SNAPSHOT_TYPE", + "OTHER_ERROR", + "OUT_OF_MEMORY", + "Object", + "OfflineAudioCompletionEvent", + "OfflineAudioContext", + "OfflineResourceList", + "OffscreenCanvas", + "OffscreenCanvasRenderingContext2D", + "Option", + "OrientationSensor", + "OscillatorNode", + "OverconstrainedError", + "OverflowEvent", + "PACK_ALIGNMENT", + "PACK_ROW_LENGTH", + "PACK_SKIP_PIXELS", + "PACK_SKIP_ROWS", + "PAGE_RULE", + "PARSE_ERR", + "PATHSEG_ARC_ABS", + "PATHSEG_ARC_REL", + "PATHSEG_CLOSEPATH", + "PATHSEG_CURVETO_CUBIC_ABS", + "PATHSEG_CURVETO_CUBIC_REL", + "PATHSEG_CURVETO_CUBIC_SMOOTH_ABS", + "PATHSEG_CURVETO_CUBIC_SMOOTH_REL", + "PATHSEG_CURVETO_QUADRATIC_ABS", + "PATHSEG_CURVETO_QUADRATIC_REL", + "PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS", + "PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL", + "PATHSEG_LINETO_ABS", + "PATHSEG_LINETO_HORIZONTAL_ABS", + "PATHSEG_LINETO_HORIZONTAL_REL", + "PATHSEG_LINETO_REL", + "PATHSEG_LINETO_VERTICAL_ABS", + "PATHSEG_LINETO_VERTICAL_REL", + "PATHSEG_MOVETO_ABS", + "PATHSEG_MOVETO_REL", + "PATHSEG_UNKNOWN", + "PATH_EXISTS_ERR", + "PEAKING", + "PERMISSION_DENIED", + "PERSISTENT", + "PI", + "PIXEL_PACK_BUFFER", + "PIXEL_PACK_BUFFER_BINDING", + "PIXEL_UNPACK_BUFFER", + "PIXEL_UNPACK_BUFFER_BINDING", + "PLAYING_STATE", + "POINTS", + "POLYGON_OFFSET_FACTOR", + "POLYGON_OFFSET_FILL", + "POLYGON_OFFSET_UNITS", + "POSITION_UNAVAILABLE", + "POSITIVE_INFINITY", + "PREV", + "PREV_NO_DUPLICATE", + "PROCESSING_INSTRUCTION_NODE", + "PageChangeEvent", + "PageTransitionEvent", + "PaintRequest", + "PaintRequestList", + "PannerNode", + "PasswordCredential", + "Path2D", + "PaymentAddress", + "PaymentInstruments", + "PaymentManager", + "PaymentMethodChangeEvent", + "PaymentRequest", + "PaymentRequestUpdateEvent", + "PaymentResponse", + "Performance", + "PerformanceElementTiming", + "PerformanceEntry", + "PerformanceEventTiming", + "PerformanceLongTaskTiming", + "PerformanceMark", + "PerformanceMeasure", + "PerformanceNavigation", + "PerformanceNavigationTiming", + "PerformanceObserver", + "PerformanceObserverEntryList", + "PerformancePaintTiming", + "PerformanceResourceTiming", + "PerformanceServerTiming", + "PerformanceTiming", + "PeriodicSyncManager", + "PeriodicWave", + "PermissionStatus", + "Permissions", + "PhotoCapabilities", + "PictureInPictureWindow", + "Plugin", + "PluginArray", + "PluralRules", + "PointerEvent", + "PopStateEvent", + "PopupBlockedEvent", + "Presentation", + "PresentationAvailability", + "PresentationConnection", + "PresentationConnectionAvailableEvent", + "PresentationConnectionCloseEvent", + "PresentationConnectionList", + "PresentationReceiver", + "PresentationRequest", + "ProcessingInstruction", + "ProgressEvent", + "Promise", + "PromiseRejectionEvent", + "PropertyNodeList", + "Proxy", + "PublicKeyCredential", + "PushManager", + "PushSubscription", + "PushSubscriptionOptions", + "Q", + "QUERY_RESULT", + "QUERY_RESULT_AVAILABLE", + "QUOTA_ERR", + "QUOTA_EXCEEDED_ERR", + "QueryInterface", + "R11F_G11F_B10F", + "R16F", + "R16I", + "R16UI", + "R32F", + "R32I", + "R32UI", + "R8", + "R8I", + "R8UI", + "R8_SNORM", + "RASTERIZER_DISCARD", + "READ_BUFFER", + "READ_FRAMEBUFFER", + "READ_FRAMEBUFFER_BINDING", + "READ_ONLY", + "READ_ONLY_ERR", + "READ_WRITE", + "RED", + "RED_BITS", + "RED_INTEGER", + "REMOVAL", + "RENDERBUFFER", + "RENDERBUFFER_ALPHA_SIZE", + "RENDERBUFFER_BINDING", + "RENDERBUFFER_BLUE_SIZE", + "RENDERBUFFER_DEPTH_SIZE", + "RENDERBUFFER_GREEN_SIZE", + "RENDERBUFFER_HEIGHT", + "RENDERBUFFER_INTERNAL_FORMAT", + "RENDERBUFFER_RED_SIZE", + "RENDERBUFFER_SAMPLES", + "RENDERBUFFER_STENCIL_SIZE", + "RENDERBUFFER_WIDTH", + "RENDERER", + "RENDERING_INTENT_ABSOLUTE_COLORIMETRIC", + "RENDERING_INTENT_AUTO", + "RENDERING_INTENT_PERCEPTUAL", + "RENDERING_INTENT_RELATIVE_COLORIMETRIC", + "RENDERING_INTENT_SATURATION", + "RENDERING_INTENT_UNKNOWN", + "REPEAT", + "REPLACE", + "RG", + "RG16F", + "RG16I", + "RG16UI", + "RG32F", + "RG32I", + "RG32UI", + "RG8", + "RG8I", + "RG8UI", + "RG8_SNORM", + "RGB", + "RGB10_A2", + "RGB10_A2UI", + "RGB16F", + "RGB16I", + "RGB16UI", + "RGB32F", + "RGB32I", + "RGB32UI", + "RGB565", + "RGB5_A1", + "RGB8", + "RGB8I", + "RGB8UI", + "RGB8_SNORM", + "RGB9_E5", + "RGBA", + "RGBA16F", + "RGBA16I", + "RGBA16UI", + "RGBA32F", + "RGBA32I", + "RGBA32UI", + "RGBA4", + "RGBA8", + "RGBA8I", + "RGBA8UI", + "RGBA8_SNORM", + "RGBA_INTEGER", + "RGBColor", + "RGB_INTEGER", + "RG_INTEGER", + "ROTATION_CLOCKWISE", + "ROTATION_COUNTERCLOCKWISE", + "RTCCertificate", + "RTCDTMFSender", + "RTCDTMFToneChangeEvent", + "RTCDataChannel", + "RTCDataChannelEvent", + "RTCDtlsTransport", + "RTCError", + "RTCErrorEvent", + "RTCIceCandidate", + "RTCIceTransport", + "RTCPeerConnection", + "RTCPeerConnectionIceErrorEvent", + "RTCPeerConnectionIceEvent", + "RTCRtpReceiver", + "RTCRtpSender", + "RTCRtpTransceiver", + "RTCSctpTransport", + "RTCSessionDescription", + "RTCStatsReport", + "RTCTrackEvent", + "RadioNodeList", + "Range", + "RangeError", + "RangeException", + "ReadableStream", + "ReadableStreamDefaultReader", + "RecordErrorEvent", + "Rect", + "ReferenceError", + "Reflect", + "RegExp", + "RelativeOrientationSensor", + "RelativeTimeFormat", + "RemotePlayback", + "Report", + "ReportBody", + "ReportingObserver", + "Request", + "ResizeObserver", + "ResizeObserverEntry", + "ResizeObserverSize", + "Response", + "RuntimeError", + "SAMPLER_2D", + "SAMPLER_2D_ARRAY", + "SAMPLER_2D_ARRAY_SHADOW", + "SAMPLER_2D_SHADOW", + "SAMPLER_3D", + "SAMPLER_BINDING", + "SAMPLER_CUBE", + "SAMPLER_CUBE_SHADOW", + "SAMPLES", + "SAMPLE_ALPHA_TO_COVERAGE", + "SAMPLE_BUFFERS", + "SAMPLE_COVERAGE", + "SAMPLE_COVERAGE_INVERT", + "SAMPLE_COVERAGE_VALUE", + "SAWTOOTH", + "SCHEDULED_STATE", + "SCISSOR_BOX", + "SCISSOR_TEST", + "SCROLL_PAGE_DOWN", + "SCROLL_PAGE_UP", + "SDP_ANSWER", + "SDP_OFFER", + "SDP_PRANSWER", + "SECURITY_ERR", + "SELECT", + "SEPARATE_ATTRIBS", + "SERIALIZE_ERR", + "SEVERITY_ERROR", + "SEVERITY_FATAL_ERROR", + "SEVERITY_WARNING", + "SHADER_COMPILER", + "SHADER_TYPE", + "SHADING_LANGUAGE_VERSION", + "SHIFT_MASK", + "SHORT", + "SHOWING", + "SHOW_ALL", + "SHOW_ATTRIBUTE", + "SHOW_CDATA_SECTION", + "SHOW_COMMENT", + "SHOW_DOCUMENT", + "SHOW_DOCUMENT_FRAGMENT", + "SHOW_DOCUMENT_TYPE", + "SHOW_ELEMENT", + "SHOW_ENTITY", + "SHOW_ENTITY_REFERENCE", + "SHOW_NOTATION", + "SHOW_PROCESSING_INSTRUCTION", + "SHOW_TEXT", + "SIGNALED", + "SIGNED_NORMALIZED", + "SINE", + "SOUNDFIELD", + "SQLException", + "SQRT1_2", + "SQRT2", + "SQUARE", + "SRC_ALPHA", + "SRC_ALPHA_SATURATE", + "SRC_COLOR", + "SRGB", + "SRGB8", + "SRGB8_ALPHA8", + "START_TO_END", + "START_TO_START", + "STATIC_COPY", + "STATIC_DRAW", + "STATIC_READ", + "STENCIL", + "STENCIL_ATTACHMENT", + "STENCIL_BACK_FAIL", + "STENCIL_BACK_FUNC", + "STENCIL_BACK_PASS_DEPTH_FAIL", + "STENCIL_BACK_PASS_DEPTH_PASS", + "STENCIL_BACK_REF", + "STENCIL_BACK_VALUE_MASK", + "STENCIL_BACK_WRITEMASK", + "STENCIL_BITS", + "STENCIL_BUFFER_BIT", + "STENCIL_CLEAR_VALUE", + "STENCIL_FAIL", + "STENCIL_FUNC", + "STENCIL_INDEX", + "STENCIL_INDEX8", + "STENCIL_PASS_DEPTH_FAIL", + "STENCIL_PASS_DEPTH_PASS", + "STENCIL_REF", + "STENCIL_TEST", + "STENCIL_VALUE_MASK", + "STENCIL_WRITEMASK", + "STREAM_COPY", + "STREAM_DRAW", + "STREAM_READ", + "STRING_TYPE", + "STYLE_RULE", + "SUBPIXEL_BITS", + "SUPPORTS_RULE", + "SVGAElement", + "SVGAltGlyphDefElement", + "SVGAltGlyphElement", + "SVGAltGlyphItemElement", + "SVGAngle", + "SVGAnimateColorElement", + "SVGAnimateElement", + "SVGAnimateMotionElement", + "SVGAnimateTransformElement", + "SVGAnimatedAngle", + "SVGAnimatedBoolean", + "SVGAnimatedEnumeration", + "SVGAnimatedInteger", + "SVGAnimatedLength", + "SVGAnimatedLengthList", + "SVGAnimatedNumber", + "SVGAnimatedNumberList", + "SVGAnimatedPreserveAspectRatio", + "SVGAnimatedRect", + "SVGAnimatedString", + "SVGAnimatedTransformList", + "SVGAnimationElement", + "SVGCircleElement", + "SVGClipPathElement", + "SVGColor", + "SVGComponentTransferFunctionElement", + "SVGCursorElement", + "SVGDefsElement", + "SVGDescElement", + "SVGDiscardElement", + "SVGDocument", + "SVGElement", + "SVGElementInstance", + "SVGElementInstanceList", + "SVGEllipseElement", + "SVGException", + "SVGFEBlendElement", + "SVGFEColorMatrixElement", + "SVGFEComponentTransferElement", + "SVGFECompositeElement", + "SVGFEConvolveMatrixElement", + "SVGFEDiffuseLightingElement", + "SVGFEDisplacementMapElement", + "SVGFEDistantLightElement", + "SVGFEDropShadowElement", + "SVGFEFloodElement", + "SVGFEFuncAElement", + "SVGFEFuncBElement", + "SVGFEFuncGElement", + "SVGFEFuncRElement", + "SVGFEGaussianBlurElement", + "SVGFEImageElement", + "SVGFEMergeElement", + "SVGFEMergeNodeElement", + "SVGFEMorphologyElement", + "SVGFEOffsetElement", + "SVGFEPointLightElement", + "SVGFESpecularLightingElement", + "SVGFESpotLightElement", + "SVGFETileElement", + "SVGFETurbulenceElement", + "SVGFilterElement", + "SVGFontElement", + "SVGFontFaceElement", + "SVGFontFaceFormatElement", + "SVGFontFaceNameElement", + "SVGFontFaceSrcElement", + "SVGFontFaceUriElement", + "SVGForeignObjectElement", + "SVGGElement", + "SVGGeometryElement", + "SVGGlyphElement", + "SVGGlyphRefElement", + "SVGGradientElement", + "SVGGraphicsElement", + "SVGHKernElement", + "SVGImageElement", + "SVGLength", + "SVGLengthList", + "SVGLineElement", + "SVGLinearGradientElement", + "SVGMPathElement", + "SVGMarkerElement", + "SVGMaskElement", + "SVGMatrix", + "SVGMetadataElement", + "SVGMissingGlyphElement", + "SVGNumber", + "SVGNumberList", + "SVGPaint", + "SVGPathElement", + "SVGPathSeg", + "SVGPathSegArcAbs", + "SVGPathSegArcRel", + "SVGPathSegClosePath", + "SVGPathSegCurvetoCubicAbs", + "SVGPathSegCurvetoCubicRel", + "SVGPathSegCurvetoCubicSmoothAbs", + "SVGPathSegCurvetoCubicSmoothRel", + "SVGPathSegCurvetoQuadraticAbs", + "SVGPathSegCurvetoQuadraticRel", + "SVGPathSegCurvetoQuadraticSmoothAbs", + "SVGPathSegCurvetoQuadraticSmoothRel", + "SVGPathSegLinetoAbs", + "SVGPathSegLinetoHorizontalAbs", + "SVGPathSegLinetoHorizontalRel", + "SVGPathSegLinetoRel", + "SVGPathSegLinetoVerticalAbs", + "SVGPathSegLinetoVerticalRel", + "SVGPathSegList", + "SVGPathSegMovetoAbs", + "SVGPathSegMovetoRel", + "SVGPatternElement", + "SVGPoint", + "SVGPointList", + "SVGPolygonElement", + "SVGPolylineElement", + "SVGPreserveAspectRatio", + "SVGRadialGradientElement", + "SVGRect", + "SVGRectElement", + "SVGRenderingIntent", + "SVGSVGElement", + "SVGScriptElement", + "SVGSetElement", + "SVGStopElement", + "SVGStringList", + "SVGStyleElement", + "SVGSwitchElement", + "SVGSymbolElement", + "SVGTRefElement", + "SVGTSpanElement", + "SVGTextContentElement", + "SVGTextElement", + "SVGTextPathElement", + "SVGTextPositioningElement", + "SVGTitleElement", + "SVGTransform", + "SVGTransformList", + "SVGUnitTypes", + "SVGUseElement", + "SVGVKernElement", + "SVGViewElement", + "SVGViewSpec", + "SVGZoomAndPan", + "SVGZoomEvent", + "SVG_ANGLETYPE_DEG", + "SVG_ANGLETYPE_GRAD", + "SVG_ANGLETYPE_RAD", + "SVG_ANGLETYPE_UNKNOWN", + "SVG_ANGLETYPE_UNSPECIFIED", + "SVG_CHANNEL_A", + "SVG_CHANNEL_B", + "SVG_CHANNEL_G", + "SVG_CHANNEL_R", + "SVG_CHANNEL_UNKNOWN", + "SVG_COLORTYPE_CURRENTCOLOR", + "SVG_COLORTYPE_RGBCOLOR", + "SVG_COLORTYPE_RGBCOLOR_ICCCOLOR", + "SVG_COLORTYPE_UNKNOWN", + "SVG_EDGEMODE_DUPLICATE", + "SVG_EDGEMODE_NONE", + "SVG_EDGEMODE_UNKNOWN", + "SVG_EDGEMODE_WRAP", + "SVG_FEBLEND_MODE_COLOR", + "SVG_FEBLEND_MODE_COLOR_BURN", + "SVG_FEBLEND_MODE_COLOR_DODGE", + "SVG_FEBLEND_MODE_DARKEN", + "SVG_FEBLEND_MODE_DIFFERENCE", + "SVG_FEBLEND_MODE_EXCLUSION", + "SVG_FEBLEND_MODE_HARD_LIGHT", + "SVG_FEBLEND_MODE_HUE", + "SVG_FEBLEND_MODE_LIGHTEN", + "SVG_FEBLEND_MODE_LUMINOSITY", + "SVG_FEBLEND_MODE_MULTIPLY", + "SVG_FEBLEND_MODE_NORMAL", + "SVG_FEBLEND_MODE_OVERLAY", + "SVG_FEBLEND_MODE_SATURATION", + "SVG_FEBLEND_MODE_SCREEN", + "SVG_FEBLEND_MODE_SOFT_LIGHT", + "SVG_FEBLEND_MODE_UNKNOWN", + "SVG_FECOLORMATRIX_TYPE_HUEROTATE", + "SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA", + "SVG_FECOLORMATRIX_TYPE_MATRIX", + "SVG_FECOLORMATRIX_TYPE_SATURATE", + "SVG_FECOLORMATRIX_TYPE_UNKNOWN", + "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE", + "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA", + "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY", + "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR", + "SVG_FECOMPONENTTRANSFER_TYPE_TABLE", + "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN", + "SVG_FECOMPOSITE_OPERATOR_ARITHMETIC", + "SVG_FECOMPOSITE_OPERATOR_ATOP", + "SVG_FECOMPOSITE_OPERATOR_IN", + "SVG_FECOMPOSITE_OPERATOR_OUT", + "SVG_FECOMPOSITE_OPERATOR_OVER", + "SVG_FECOMPOSITE_OPERATOR_UNKNOWN", + "SVG_FECOMPOSITE_OPERATOR_XOR", + "SVG_INVALID_VALUE_ERR", + "SVG_LENGTHTYPE_CM", + "SVG_LENGTHTYPE_EMS", + "SVG_LENGTHTYPE_EXS", + "SVG_LENGTHTYPE_IN", + "SVG_LENGTHTYPE_MM", + "SVG_LENGTHTYPE_NUMBER", + "SVG_LENGTHTYPE_PC", + "SVG_LENGTHTYPE_PERCENTAGE", + "SVG_LENGTHTYPE_PT", + "SVG_LENGTHTYPE_PX", + "SVG_LENGTHTYPE_UNKNOWN", + "SVG_MARKERUNITS_STROKEWIDTH", + "SVG_MARKERUNITS_UNKNOWN", + "SVG_MARKERUNITS_USERSPACEONUSE", + "SVG_MARKER_ORIENT_ANGLE", + "SVG_MARKER_ORIENT_AUTO", + "SVG_MARKER_ORIENT_UNKNOWN", + "SVG_MASKTYPE_ALPHA", + "SVG_MASKTYPE_LUMINANCE", + "SVG_MATRIX_NOT_INVERTABLE", + "SVG_MEETORSLICE_MEET", + "SVG_MEETORSLICE_SLICE", + "SVG_MEETORSLICE_UNKNOWN", + "SVG_MORPHOLOGY_OPERATOR_DILATE", + "SVG_MORPHOLOGY_OPERATOR_ERODE", + "SVG_MORPHOLOGY_OPERATOR_UNKNOWN", + "SVG_PAINTTYPE_CURRENTCOLOR", + "SVG_PAINTTYPE_NONE", + "SVG_PAINTTYPE_RGBCOLOR", + "SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR", + "SVG_PAINTTYPE_UNKNOWN", + "SVG_PAINTTYPE_URI", + "SVG_PAINTTYPE_URI_CURRENTCOLOR", + "SVG_PAINTTYPE_URI_NONE", + "SVG_PAINTTYPE_URI_RGBCOLOR", + "SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR", + "SVG_PRESERVEASPECTRATIO_NONE", + "SVG_PRESERVEASPECTRATIO_UNKNOWN", + "SVG_PRESERVEASPECTRATIO_XMAXYMAX", + "SVG_PRESERVEASPECTRATIO_XMAXYMID", + "SVG_PRESERVEASPECTRATIO_XMAXYMIN", + "SVG_PRESERVEASPECTRATIO_XMIDYMAX", + "SVG_PRESERVEASPECTRATIO_XMIDYMID", + "SVG_PRESERVEASPECTRATIO_XMIDYMIN", + "SVG_PRESERVEASPECTRATIO_XMINYMAX", + "SVG_PRESERVEASPECTRATIO_XMINYMID", + "SVG_PRESERVEASPECTRATIO_XMINYMIN", + "SVG_SPREADMETHOD_PAD", + "SVG_SPREADMETHOD_REFLECT", + "SVG_SPREADMETHOD_REPEAT", + "SVG_SPREADMETHOD_UNKNOWN", + "SVG_STITCHTYPE_NOSTITCH", + "SVG_STITCHTYPE_STITCH", + "SVG_STITCHTYPE_UNKNOWN", + "SVG_TRANSFORM_MATRIX", + "SVG_TRANSFORM_ROTATE", + "SVG_TRANSFORM_SCALE", + "SVG_TRANSFORM_SKEWX", + "SVG_TRANSFORM_SKEWY", + "SVG_TRANSFORM_TRANSLATE", + "SVG_TRANSFORM_UNKNOWN", + "SVG_TURBULENCE_TYPE_FRACTALNOISE", + "SVG_TURBULENCE_TYPE_TURBULENCE", + "SVG_TURBULENCE_TYPE_UNKNOWN", + "SVG_UNIT_TYPE_OBJECTBOUNDINGBOX", + "SVG_UNIT_TYPE_UNKNOWN", + "SVG_UNIT_TYPE_USERSPACEONUSE", + "SVG_WRONG_TYPE_ERR", + "SVG_ZOOMANDPAN_DISABLE", + "SVG_ZOOMANDPAN_MAGNIFY", + "SVG_ZOOMANDPAN_UNKNOWN", + "SYNC_CONDITION", + "SYNC_FENCE", + "SYNC_FLAGS", + "SYNC_FLUSH_COMMANDS_BIT", + "SYNC_GPU_COMMANDS_COMPLETE", + "SYNC_STATUS", + "SYNTAX_ERR", + "SavedPages", + "Screen", + "ScreenOrientation", + "Script", + "ScriptProcessorNode", + "ScrollAreaEvent", + "SecurityPolicyViolationEvent", + "Selection", + "Sensor", + "SensorErrorEvent", + "ServiceWorker", + "ServiceWorkerContainer", + "ServiceWorkerRegistration", + "SessionDescription", + "Set", + "ShadowRoot", + "SharedArrayBuffer", + "SharedWorker", + "SimpleGestureEvent", + "SourceBuffer", + "SourceBufferList", + "SpeechSynthesis", + "SpeechSynthesisErrorEvent", + "SpeechSynthesisEvent", + "SpeechSynthesisUtterance", + "SpeechSynthesisVoice", + "StaticRange", + "StereoPannerNode", + "StopIteration", + "Storage", + "StorageEvent", + "StorageManager", + "String", + "StructType", + "StylePropertyMap", + "StylePropertyMapReadOnly", + "StyleSheet", + "StyleSheetList", + "SubmitEvent", + "SubtleCrypto", + "Symbol", + "SyncManager", + "SyntaxError", + "TEMPORARY", + "TEXTPATH_METHODTYPE_ALIGN", + "TEXTPATH_METHODTYPE_STRETCH", + "TEXTPATH_METHODTYPE_UNKNOWN", + "TEXTPATH_SPACINGTYPE_AUTO", + "TEXTPATH_SPACINGTYPE_EXACT", + "TEXTPATH_SPACINGTYPE_UNKNOWN", + "TEXTURE", + "TEXTURE0", + "TEXTURE1", + "TEXTURE10", + "TEXTURE11", + "TEXTURE12", + "TEXTURE13", + "TEXTURE14", + "TEXTURE15", + "TEXTURE16", + "TEXTURE17", + "TEXTURE18", + "TEXTURE19", + "TEXTURE2", + "TEXTURE20", + "TEXTURE21", + "TEXTURE22", + "TEXTURE23", + "TEXTURE24", + "TEXTURE25", + "TEXTURE26", + "TEXTURE27", + "TEXTURE28", + "TEXTURE29", + "TEXTURE3", + "TEXTURE30", + "TEXTURE31", + "TEXTURE4", + "TEXTURE5", + "TEXTURE6", + "TEXTURE7", + "TEXTURE8", + "TEXTURE9", + "TEXTURE_2D", + "TEXTURE_2D_ARRAY", + "TEXTURE_3D", + "TEXTURE_BASE_LEVEL", + "TEXTURE_BINDING_2D", + "TEXTURE_BINDING_2D_ARRAY", + "TEXTURE_BINDING_3D", + "TEXTURE_BINDING_CUBE_MAP", + "TEXTURE_COMPARE_FUNC", + "TEXTURE_COMPARE_MODE", + "TEXTURE_CUBE_MAP", + "TEXTURE_CUBE_MAP_NEGATIVE_X", + "TEXTURE_CUBE_MAP_NEGATIVE_Y", + "TEXTURE_CUBE_MAP_NEGATIVE_Z", + "TEXTURE_CUBE_MAP_POSITIVE_X", + "TEXTURE_CUBE_MAP_POSITIVE_Y", + "TEXTURE_CUBE_MAP_POSITIVE_Z", + "TEXTURE_IMMUTABLE_FORMAT", + "TEXTURE_IMMUTABLE_LEVELS", + "TEXTURE_MAG_FILTER", + "TEXTURE_MAX_ANISOTROPY_EXT", + "TEXTURE_MAX_LEVEL", + "TEXTURE_MAX_LOD", + "TEXTURE_MIN_FILTER", + "TEXTURE_MIN_LOD", + "TEXTURE_WRAP_R", + "TEXTURE_WRAP_S", + "TEXTURE_WRAP_T", + "TEXT_NODE", + "TIMEOUT", + "TIMEOUT_ERR", + "TIMEOUT_EXPIRED", + "TIMEOUT_IGNORED", + "TOO_LARGE_ERR", + "TRANSACTION_INACTIVE_ERR", + "TRANSFORM_FEEDBACK", + "TRANSFORM_FEEDBACK_ACTIVE", + "TRANSFORM_FEEDBACK_BINDING", + "TRANSFORM_FEEDBACK_BUFFER", + "TRANSFORM_FEEDBACK_BUFFER_BINDING", + "TRANSFORM_FEEDBACK_BUFFER_MODE", + "TRANSFORM_FEEDBACK_BUFFER_SIZE", + "TRANSFORM_FEEDBACK_BUFFER_START", + "TRANSFORM_FEEDBACK_PAUSED", + "TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN", + "TRANSFORM_FEEDBACK_VARYINGS", + "TRIANGLE", + "TRIANGLES", + "TRIANGLE_FAN", + "TRIANGLE_STRIP", + "TYPE_BACK_FORWARD", + "TYPE_ERR", + "TYPE_MISMATCH_ERR", + "TYPE_NAVIGATE", + "TYPE_RELOAD", + "TYPE_RESERVED", + "Table", + "TaskAttributionTiming", + "Text", + "TextDecoder", + "TextDecoderStream", + "TextEncoder", + "TextEncoderStream", + "TextEvent", + "TextMetrics", + "TextTrack", + "TextTrackCue", + "TextTrackCueList", + "TextTrackList", + "TimeEvent", + "TimeRanges", + "Touch", + "TouchEvent", + "TouchList", + "TrackEvent", + "TransformStream", + "TransitionEvent", + "TreeWalker", + "TrustedHTML", + "TrustedScript", + "TrustedScriptURL", + "TrustedTypePolicy", + "TrustedTypePolicyFactory", + "TypeError", + "TypedObject", + "U2F", + "UIEvent", + "UNCACHED", + "UNIFORM_ARRAY_STRIDE", + "UNIFORM_BLOCK_ACTIVE_UNIFORMS", + "UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES", + "UNIFORM_BLOCK_BINDING", + "UNIFORM_BLOCK_DATA_SIZE", + "UNIFORM_BLOCK_INDEX", + "UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER", + "UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER", + "UNIFORM_BUFFER", + "UNIFORM_BUFFER_BINDING", + "UNIFORM_BUFFER_OFFSET_ALIGNMENT", + "UNIFORM_BUFFER_SIZE", + "UNIFORM_BUFFER_START", + "UNIFORM_IS_ROW_MAJOR", + "UNIFORM_MATRIX_STRIDE", + "UNIFORM_OFFSET", + "UNIFORM_SIZE", + "UNIFORM_TYPE", + "UNKNOWN_ERR", + "UNKNOWN_RULE", + "UNMASKED_RENDERER_WEBGL", + "UNMASKED_VENDOR_WEBGL", + "UNORDERED_NODE_ITERATOR_TYPE", + "UNORDERED_NODE_SNAPSHOT_TYPE", + "UNPACK_ALIGNMENT", + "UNPACK_COLORSPACE_CONVERSION_WEBGL", + "UNPACK_FLIP_Y_WEBGL", + "UNPACK_IMAGE_HEIGHT", + "UNPACK_PREMULTIPLY_ALPHA_WEBGL", + "UNPACK_ROW_LENGTH", + "UNPACK_SKIP_IMAGES", + "UNPACK_SKIP_PIXELS", + "UNPACK_SKIP_ROWS", + "UNSCHEDULED_STATE", + "UNSENT", + "UNSIGNALED", + "UNSIGNED_BYTE", + "UNSIGNED_INT", + "UNSIGNED_INT_10F_11F_11F_REV", + "UNSIGNED_INT_24_8", + "UNSIGNED_INT_2_10_10_10_REV", + "UNSIGNED_INT_5_9_9_9_REV", + "UNSIGNED_INT_SAMPLER_2D", + "UNSIGNED_INT_SAMPLER_2D_ARRAY", + "UNSIGNED_INT_SAMPLER_3D", + "UNSIGNED_INT_SAMPLER_CUBE", + "UNSIGNED_INT_VEC2", + "UNSIGNED_INT_VEC3", + "UNSIGNED_INT_VEC4", + "UNSIGNED_NORMALIZED", + "UNSIGNED_SHORT", + "UNSIGNED_SHORT_4_4_4_4", + "UNSIGNED_SHORT_5_5_5_1", + "UNSIGNED_SHORT_5_6_5", + "UNSPECIFIED_EVENT_TYPE_ERR", + "UPDATEREADY", + "URIError", + "URL", + "URLSearchParams", + "URLUnencoded", + "URL_MISMATCH_ERR", + "USB", + "USBAlternateInterface", + "USBConfiguration", + "USBConnectionEvent", + "USBDevice", + "USBEndpoint", + "USBInTransferResult", + "USBInterface", + "USBIsochronousInTransferPacket", + "USBIsochronousInTransferResult", + "USBIsochronousOutTransferPacket", + "USBIsochronousOutTransferResult", + "USBOutTransferResult", + "UTC", + "Uint16Array", + "Uint32Array", + "Uint8Array", + "Uint8ClampedArray", + "UserActivation", + "UserMessageHandler", + "UserMessageHandlersNamespace", + "UserProximityEvent", + "VALIDATE_STATUS", + "VALIDATION_ERR", + "VARIABLES_RULE", + "VENDOR", + "VERSION", + "VERSION_CHANGE", + "VERSION_ERR", + "VERTEX_ARRAY_BINDING", + "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING", + "VERTEX_ATTRIB_ARRAY_DIVISOR", + "VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE", + "VERTEX_ATTRIB_ARRAY_ENABLED", + "VERTEX_ATTRIB_ARRAY_INTEGER", + "VERTEX_ATTRIB_ARRAY_NORMALIZED", + "VERTEX_ATTRIB_ARRAY_POINTER", + "VERTEX_ATTRIB_ARRAY_SIZE", + "VERTEX_ATTRIB_ARRAY_STRIDE", + "VERTEX_ATTRIB_ARRAY_TYPE", + "VERTEX_SHADER", + "VERTICAL", + "VERTICAL_AXIS", + "VER_ERR", + "VIEWPORT", + "VIEWPORT_RULE", + "VRDisplay", + "VRDisplayCapabilities", + "VRDisplayEvent", + "VREyeParameters", + "VRFieldOfView", + "VRFrameData", + "VRPose", + "VRStageParameters", + "VTTCue", + "VTTRegion", + "ValidityState", + "VideoPlaybackQuality", + "VideoStreamTrack", + "VisualViewport", + "WAIT_FAILED", + "WEBKIT_FILTER_RULE", + "WEBKIT_KEYFRAMES_RULE", + "WEBKIT_KEYFRAME_RULE", + "WEBKIT_REGION_RULE", + "WRONG_DOCUMENT_ERR", + "WakeLock", + "WakeLockSentinel", + "WasmAnyRef", + "WaveShaperNode", + "WeakMap", + "WeakRef", + "WeakSet", + "WebAssembly", + "WebGL2RenderingContext", + "WebGLActiveInfo", + "WebGLBuffer", + "WebGLContextEvent", + "WebGLFramebuffer", + "WebGLProgram", + "WebGLQuery", + "WebGLRenderbuffer", + "WebGLRenderingContext", + "WebGLSampler", + "WebGLShader", + "WebGLShaderPrecisionFormat", + "WebGLSync", + "WebGLTexture", + "WebGLTransformFeedback", + "WebGLUniformLocation", + "WebGLVertexArray", + "WebGLVertexArrayObject", + "WebKitAnimationEvent", + "WebKitBlobBuilder", + "WebKitCSSFilterRule", + "WebKitCSSFilterValue", + "WebKitCSSKeyframeRule", + "WebKitCSSKeyframesRule", + "WebKitCSSMatrix", + "WebKitCSSRegionRule", + "WebKitCSSTransformValue", + "WebKitDataCue", + "WebKitGamepad", + "WebKitMediaKeyError", + "WebKitMediaKeyMessageEvent", + "WebKitMediaKeySession", + "WebKitMediaKeys", + "WebKitMediaSource", + "WebKitMutationObserver", + "WebKitNamespace", + "WebKitPlaybackTargetAvailabilityEvent", + "WebKitPoint", + "WebKitShadowRoot", + "WebKitSourceBuffer", + "WebKitSourceBufferList", + "WebKitTransitionEvent", + "WebSocket", + "WebkitAlignContent", + "WebkitAlignItems", + "WebkitAlignSelf", + "WebkitAnimation", + "WebkitAnimationDelay", + "WebkitAnimationDirection", + "WebkitAnimationDuration", + "WebkitAnimationFillMode", + "WebkitAnimationIterationCount", + "WebkitAnimationName", + "WebkitAnimationPlayState", + "WebkitAnimationTimingFunction", + "WebkitAppearance", + "WebkitBackfaceVisibility", + "WebkitBackgroundClip", + "WebkitBackgroundOrigin", + "WebkitBackgroundSize", + "WebkitBorderBottomLeftRadius", + "WebkitBorderBottomRightRadius", + "WebkitBorderImage", + "WebkitBorderRadius", + "WebkitBorderTopLeftRadius", + "WebkitBorderTopRightRadius", + "WebkitBoxAlign", + "WebkitBoxDirection", + "WebkitBoxFlex", + "WebkitBoxOrdinalGroup", + "WebkitBoxOrient", + "WebkitBoxPack", + "WebkitBoxShadow", + "WebkitBoxSizing", + "WebkitFilter", + "WebkitFlex", + "WebkitFlexBasis", + "WebkitFlexDirection", + "WebkitFlexFlow", + "WebkitFlexGrow", + "WebkitFlexShrink", + "WebkitFlexWrap", + "WebkitJustifyContent", + "WebkitLineClamp", + "WebkitMask", + "WebkitMaskClip", + "WebkitMaskComposite", + "WebkitMaskImage", + "WebkitMaskOrigin", + "WebkitMaskPosition", + "WebkitMaskPositionX", + "WebkitMaskPositionY", + "WebkitMaskRepeat", + "WebkitMaskSize", + "WebkitOrder", + "WebkitPerspective", + "WebkitPerspectiveOrigin", + "WebkitTextFillColor", + "WebkitTextSizeAdjust", + "WebkitTextStroke", + "WebkitTextStrokeColor", + "WebkitTextStrokeWidth", + "WebkitTransform", + "WebkitTransformOrigin", + "WebkitTransformStyle", + "WebkitTransition", + "WebkitTransitionDelay", + "WebkitTransitionDuration", + "WebkitTransitionProperty", + "WebkitTransitionTimingFunction", + "WebkitUserSelect", + "WheelEvent", + "Window", + "Worker", + "Worklet", + "WritableStream", + "WritableStreamDefaultWriter", + "XMLDocument", + "XMLHttpRequest", + "XMLHttpRequestEventTarget", + "XMLHttpRequestException", + "XMLHttpRequestProgressEvent", + "XMLHttpRequestUpload", + "XMLSerializer", + "XMLStylesheetProcessingInstruction", + "XPathEvaluator", + "XPathException", + "XPathExpression", + "XPathNSResolver", + "XPathResult", + "XRBoundedReferenceSpace", + "XRDOMOverlayState", + "XRFrame", + "XRHitTestResult", + "XRHitTestSource", + "XRInputSource", + "XRInputSourceArray", + "XRInputSourceEvent", + "XRInputSourcesChangeEvent", + "XRLayer", + "XRPose", + "XRRay", + "XRReferenceSpace", + "XRReferenceSpaceEvent", + "XRRenderState", + "XRRigidTransform", + "XRSession", + "XRSessionEvent", + "XRSpace", + "XRSystem", + "XRTransientInputHitTestResult", + "XRTransientInputHitTestSource", + "XRView", + "XRViewerPose", + "XRViewport", + "XRWebGLLayer", + "XSLTProcessor", + "ZERO", + "_XD0M_", + "_YD0M_", + "__defineGetter__", + "__defineSetter__", + "__lookupGetter__", + "__lookupSetter__", + "__opera", + "__proto__", + "_browserjsran", + "a", + "aLink", + "abbr", + "abort", + "aborted", + "abs", + "absolute", + "acceleration", + "accelerationIncludingGravity", + "accelerator", + "accept", + "acceptCharset", + "acceptNode", + "accessKey", + "accessKeyLabel", + "accuracy", + "acos", + "acosh", + "action", + "actionURL", + "actions", + "activated", + "active", + "activeCues", + "activeElement", + "activeSourceBuffers", + "activeSourceCount", + "activeTexture", + "activeVRDisplays", + "actualBoundingBoxAscent", + "actualBoundingBoxDescent", + "actualBoundingBoxLeft", + "actualBoundingBoxRight", + "add", + "addAll", + "addBehavior", + "addCandidate", + "addColorStop", + "addCue", + "addElement", + "addEventListener", + "addFilter", + "addFromString", + "addFromUri", + "addIceCandidate", + "addImport", + "addListener", + "addModule", + "addNamed", + "addPageRule", + "addPath", + "addPointer", + "addRange", + "addRegion", + "addRule", + "addSearchEngine", + "addSourceBuffer", + "addStream", + "addTextTrack", + "addTrack", + "addTransceiver", + "addWakeLockListener", + "added", + "addedNodes", + "additionalName", + "additiveSymbols", + "addons", + "address", + "addressLine", + "adoptNode", + "adoptedStyleSheets", + "adr", + "advance", + "after", + "album", + "alert", + "algorithm", + "align", + "align-content", + "align-items", + "align-self", + "alignContent", + "alignItems", + "alignSelf", + "alignmentBaseline", + "alinkColor", + "all", + "allSettled", + "allow", + "allowFullscreen", + "allowPaymentRequest", + "allowedDirections", + "allowedFeatures", + "allowedToPlay", + "allowsFeature", + "alpha", + "alt", + "altGraphKey", + "altHtml", + "altKey", + "altLeft", + "alternate", + "alternateSetting", + "alternates", + "altitude", + "altitudeAccuracy", + "amplitude", + "ancestorOrigins", + "anchor", + "anchorNode", + "anchorOffset", + "anchors", + "and", + "angle", + "angularAcceleration", + "angularVelocity", + "animVal", + "animate", + "animatedInstanceRoot", + "animatedNormalizedPathSegList", + "animatedPathSegList", + "animatedPoints", + "animation", + "animation-delay", + "animation-direction", + "animation-duration", + "animation-fill-mode", + "animation-iteration-count", + "animation-name", + "animation-play-state", + "animation-timing-function", + "animationDelay", + "animationDirection", + "animationDuration", + "animationFillMode", + "animationIterationCount", + "animationName", + "animationPlayState", + "animationStartTime", + "animationTimingFunction", + "animationsPaused", + "anniversary", + "antialias", + "anticipatedRemoval", + "any", + "app", + "appCodeName", + "appMinorVersion", + "appName", + "appNotifications", + "appVersion", + "appearance", + "append", + "appendBuffer", + "appendChild", + "appendData", + "appendItem", + "appendMedium", + "appendNamed", + "appendRule", + "appendStream", + "appendWindowEnd", + "appendWindowStart", + "applets", + "applicationCache", + "applicationServerKey", + "apply", + "applyConstraints", + "applyElement", + "arc", + "arcTo", + "archive", + "areas", + "arguments", + "ariaAtomic", + "ariaAutoComplete", + "ariaBusy", + "ariaChecked", + "ariaColCount", + "ariaColIndex", + "ariaColSpan", + "ariaCurrent", + "ariaDescription", + "ariaDisabled", + "ariaExpanded", + "ariaHasPopup", + "ariaHidden", + "ariaKeyShortcuts", + "ariaLabel", + "ariaLevel", + "ariaLive", + "ariaModal", + "ariaMultiLine", + "ariaMultiSelectable", + "ariaOrientation", + "ariaPlaceholder", + "ariaPosInSet", + "ariaPressed", + "ariaReadOnly", + "ariaRelevant", + "ariaRequired", + "ariaRoleDescription", + "ariaRowCount", + "ariaRowIndex", + "ariaRowSpan", + "ariaSelected", + "ariaSetSize", + "ariaSort", + "ariaValueMax", + "ariaValueMin", + "ariaValueNow", + "ariaValueText", + "arrayBuffer", + "artist", + "artwork", + "as", + "asIntN", + "asUintN", + "asin", + "asinh", + "assert", + "assign", + "assignedElements", + "assignedNodes", + "assignedSlot", + "async", + "asyncIterator", + "atEnd", + "atan", + "atan2", + "atanh", + "atob", + "attachEvent", + "attachInternals", + "attachShader", + "attachShadow", + "attachments", + "attack", + "attestationObject", + "attrChange", + "attrName", + "attributeFilter", + "attributeName", + "attributeNamespace", + "attributeOldValue", + "attributeStyleMap", + "attributes", + "attribution", + "audioBitsPerSecond", + "audioTracks", + "audioWorklet", + "authenticatedSignedWrites", + "authenticatorData", + "autoIncrement", + "autobuffer", + "autocapitalize", + "autocomplete", + "autocorrect", + "autofocus", + "automationRate", + "autoplay", + "availHeight", + "availLeft", + "availTop", + "availWidth", + "availability", + "available", + "aversion", + "ax", + "axes", + "axis", + "ay", + "azimuth", + "b", + "back", + "backface-visibility", + "backfaceVisibility", + "background", + "background-attachment", + "background-blend-mode", + "background-clip", + "background-color", + "background-image", + "background-origin", + "background-position", + "background-position-x", + "background-position-y", + "background-repeat", + "background-size", + "backgroundAttachment", + "backgroundBlendMode", + "backgroundClip", + "backgroundColor", + "backgroundFetch", + "backgroundImage", + "backgroundOrigin", + "backgroundPosition", + "backgroundPositionX", + "backgroundPositionY", + "backgroundRepeat", + "backgroundSize", + "badInput", + "badge", + "balance", + "baseFrequencyX", + "baseFrequencyY", + "baseLatency", + "baseLayer", + "baseNode", + "baseOffset", + "baseURI", + "baseVal", + "baselineShift", + "battery", + "bday", + "before", + "beginElement", + "beginElementAt", + "beginPath", + "beginQuery", + "beginTransformFeedback", + "behavior", + "behaviorCookie", + "behaviorPart", + "behaviorUrns", + "beta", + "bezierCurveTo", + "bgColor", + "bgProperties", + "bias", + "big", + "bigint64", + "biguint64", + "binaryType", + "bind", + "bindAttribLocation", + "bindBuffer", + "bindBufferBase", + "bindBufferRange", + "bindFramebuffer", + "bindRenderbuffer", + "bindSampler", + "bindTexture", + "bindTransformFeedback", + "bindVertexArray", + "blendColor", + "blendEquation", + "blendEquationSeparate", + "blendFunc", + "blendFuncSeparate", + "blink", + "blitFramebuffer", + "blob", + "block-size", + "blockDirection", + "blockSize", + "blockedURI", + "blue", + "bluetooth", + "blur", + "body", + "bodyUsed", + "bold", + "bookmarks", + "booleanValue", + "border", + "border-block", + "border-block-color", + "border-block-end", + "border-block-end-color", + "border-block-end-style", + "border-block-end-width", + "border-block-start", + "border-block-start-color", + "border-block-start-style", + "border-block-start-width", + "border-block-style", + "border-block-width", + "border-bottom", + "border-bottom-color", + "border-bottom-left-radius", + "border-bottom-right-radius", + "border-bottom-style", + "border-bottom-width", + "border-collapse", + "border-color", + "border-end-end-radius", + "border-end-start-radius", + "border-image", + "border-image-outset", + "border-image-repeat", + "border-image-slice", + "border-image-source", + "border-image-width", + "border-inline", + "border-inline-color", + "border-inline-end", + "border-inline-end-color", + "border-inline-end-style", + "border-inline-end-width", + "border-inline-start", + "border-inline-start-color", + "border-inline-start-style", + "border-inline-start-width", + "border-inline-style", + "border-inline-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-spacing", + "border-start-end-radius", + "border-start-start-radius", + "border-style", + "border-top", + "border-top-color", + "border-top-left-radius", + "border-top-right-radius", + "border-top-style", + "border-top-width", + "border-width", + "borderBlock", + "borderBlockColor", + "borderBlockEnd", + "borderBlockEndColor", + "borderBlockEndStyle", + "borderBlockEndWidth", + "borderBlockStart", + "borderBlockStartColor", + "borderBlockStartStyle", + "borderBlockStartWidth", + "borderBlockStyle", + "borderBlockWidth", + "borderBottom", + "borderBottomColor", + "borderBottomLeftRadius", + "borderBottomRightRadius", + "borderBottomStyle", + "borderBottomWidth", + "borderBoxSize", + "borderCollapse", + "borderColor", + "borderColorDark", + "borderColorLight", + "borderEndEndRadius", + "borderEndStartRadius", + "borderImage", + "borderImageOutset", + "borderImageRepeat", + "borderImageSlice", + "borderImageSource", + "borderImageWidth", + "borderInline", + "borderInlineColor", + "borderInlineEnd", + "borderInlineEndColor", + "borderInlineEndStyle", + "borderInlineEndWidth", + "borderInlineStart", + "borderInlineStartColor", + "borderInlineStartStyle", + "borderInlineStartWidth", + "borderInlineStyle", + "borderInlineWidth", + "borderLeft", + "borderLeftColor", + "borderLeftStyle", + "borderLeftWidth", + "borderRadius", + "borderRight", + "borderRightColor", + "borderRightStyle", + "borderRightWidth", + "borderSpacing", + "borderStartEndRadius", + "borderStartStartRadius", + "borderStyle", + "borderTop", + "borderTopColor", + "borderTopLeftRadius", + "borderTopRightRadius", + "borderTopStyle", + "borderTopWidth", + "borderWidth", + "bottom", + "bottomMargin", + "bound", + "boundElements", + "boundingClientRect", + "boundingHeight", + "boundingLeft", + "boundingTop", + "boundingWidth", + "bounds", + "boundsGeometry", + "box-decoration-break", + "box-shadow", + "box-sizing", + "boxDecorationBreak", + "boxShadow", + "boxSizing", + "break-after", + "break-before", + "break-inside", + "breakAfter", + "breakBefore", + "breakInside", + "broadcast", + "browserLanguage", + "btoa", + "bubbles", + "buffer", + "bufferData", + "bufferDepth", + "bufferSize", + "bufferSubData", + "buffered", + "bufferedAmount", + "bufferedAmountLowThreshold", + "buildID", + "buildNumber", + "button", + "buttonID", + "buttons", + "byteLength", + "byteOffset", + "bytesWritten", + "c", + "cache", + "caches", + "call", + "caller", + "canBeFormatted", + "canBeMounted", + "canBeShared", + "canHaveChildren", + "canHaveHTML", + "canInsertDTMF", + "canMakePayment", + "canPlayType", + "canPresent", + "canTrickleIceCandidates", + "cancel", + "cancelAndHoldAtTime", + "cancelAnimationFrame", + "cancelBubble", + "cancelIdleCallback", + "cancelScheduledValues", + "cancelVideoFrameCallback", + "cancelWatchAvailability", + "cancelable", + "candidate", + "canonicalUUID", + "canvas", + "capabilities", + "caption", + "caption-side", + "captionSide", + "capture", + "captureEvents", + "captureStackTrace", + "captureStream", + "caret-color", + "caretBidiLevel", + "caretColor", + "caretPositionFromPoint", + "caretRangeFromPoint", + "cast", + "catch", + "category", + "cbrt", + "cd", + "ceil", + "cellIndex", + "cellPadding", + "cellSpacing", + "cells", + "ch", + "chOff", + "chain", + "challenge", + "changeType", + "changedTouches", + "channel", + "channelCount", + "channelCountMode", + "channelInterpretation", + "char", + "charAt", + "charCode", + "charCodeAt", + "charIndex", + "charLength", + "characterData", + "characterDataOldValue", + "characterSet", + "characteristic", + "charging", + "chargingTime", + "charset", + "check", + "checkEnclosure", + "checkFramebufferStatus", + "checkIntersection", + "checkValidity", + "checked", + "childElementCount", + "childList", + "childNodes", + "children", + "chrome", + "ciphertext", + "cite", + "city", + "claimInterface", + "claimed", + "classList", + "className", + "classid", + "clear", + "clearAppBadge", + "clearAttributes", + "clearBufferfi", + "clearBufferfv", + "clearBufferiv", + "clearBufferuiv", + "clearColor", + "clearData", + "clearDepth", + "clearHalt", + "clearImmediate", + "clearInterval", + "clearLiveSeekableRange", + "clearMarks", + "clearMaxGCPauseAccumulator", + "clearMeasures", + "clearParameters", + "clearRect", + "clearResourceTimings", + "clearShadow", + "clearStencil", + "clearTimeout", + "clearWatch", + "click", + "clickCount", + "clientDataJSON", + "clientHeight", + "clientInformation", + "clientLeft", + "clientRect", + "clientRects", + "clientTop", + "clientWaitSync", + "clientWidth", + "clientX", + "clientY", + "clip", + "clip-path", + "clip-rule", + "clipBottom", + "clipLeft", + "clipPath", + "clipPathUnits", + "clipRight", + "clipRule", + "clipTop", + "clipboard", + "clipboardData", + "clone", + "cloneContents", + "cloneNode", + "cloneRange", + "close", + "closePath", + "closed", + "closest", + "clz", + "clz32", + "cm", + "cmp", + "code", + "codeBase", + "codePointAt", + "codeType", + "colSpan", + "collapse", + "collapseToEnd", + "collapseToStart", + "collapsed", + "collect", + "colno", + "color", + "color-adjust", + "color-interpolation", + "color-interpolation-filters", + "colorAdjust", + "colorDepth", + "colorInterpolation", + "colorInterpolationFilters", + "colorMask", + "colorType", + "cols", + "column-count", + "column-fill", + "column-gap", + "column-rule", + "column-rule-color", + "column-rule-style", + "column-rule-width", + "column-span", + "column-width", + "columnCount", + "columnFill", + "columnGap", + "columnNumber", + "columnRule", + "columnRuleColor", + "columnRuleStyle", + "columnRuleWidth", + "columnSpan", + "columnWidth", + "columns", + "command", + "commit", + "commitPreferences", + "commitStyles", + "commonAncestorContainer", + "compact", + "compareBoundaryPoints", + "compareDocumentPosition", + "compareEndPoints", + "compareExchange", + "compareNode", + "comparePoint", + "compatMode", + "compatible", + "compile", + "compileShader", + "compileStreaming", + "complete", + "component", + "componentFromPoint", + "composed", + "composedPath", + "composite", + "compositionEndOffset", + "compositionStartOffset", + "compressedTexImage2D", + "compressedTexImage3D", + "compressedTexSubImage2D", + "compressedTexSubImage3D", + "computedStyleMap", + "concat", + "conditionText", + "coneInnerAngle", + "coneOuterAngle", + "coneOuterGain", + "configuration", + "configurationName", + "configurationValue", + "configurations", + "confirm", + "confirmComposition", + "confirmSiteSpecificTrackingException", + "confirmWebWideTrackingException", + "connect", + "connectEnd", + "connectShark", + "connectStart", + "connected", + "connection", + "connectionList", + "connectionSpeed", + "connectionState", + "connections", + "console", + "consolidate", + "constraint", + "constrictionActive", + "construct", + "constructor", + "contactID", + "contain", + "containerId", + "containerName", + "containerSrc", + "containerType", + "contains", + "containsNode", + "content", + "contentBoxSize", + "contentDocument", + "contentEditable", + "contentHint", + "contentOverflow", + "contentRect", + "contentScriptType", + "contentStyleType", + "contentType", + "contentWindow", + "context", + "contextMenu", + "contextmenu", + "continue", + "continuePrimaryKey", + "continuous", + "control", + "controlTransferIn", + "controlTransferOut", + "controller", + "controls", + "controlsList", + "convertPointFromNode", + "convertQuadFromNode", + "convertRectFromNode", + "convertToBlob", + "convertToSpecifiedUnits", + "cookie", + "cookieEnabled", + "coords", + "copyBufferSubData", + "copyFromChannel", + "copyTexImage2D", + "copyTexSubImage2D", + "copyTexSubImage3D", + "copyToChannel", + "copyWithin", + "correspondingElement", + "correspondingUseElement", + "corruptedVideoFrames", + "cos", + "cosh", + "count", + "countReset", + "counter-increment", + "counter-reset", + "counter-set", + "counterIncrement", + "counterReset", + "counterSet", + "country", + "cpuClass", + "cpuSleepAllowed", + "create", + "createAnalyser", + "createAnswer", + "createAttribute", + "createAttributeNS", + "createBiquadFilter", + "createBuffer", + "createBufferSource", + "createCDATASection", + "createCSSStyleSheet", + "createCaption", + "createChannelMerger", + "createChannelSplitter", + "createComment", + "createConstantSource", + "createContextualFragment", + "createControlRange", + "createConvolver", + "createDTMFSender", + "createDataChannel", + "createDelay", + "createDelayNode", + "createDocument", + "createDocumentFragment", + "createDocumentType", + "createDynamicsCompressor", + "createElement", + "createElementNS", + "createEntityReference", + "createEvent", + "createEventObject", + "createExpression", + "createFramebuffer", + "createFunction", + "createGain", + "createGainNode", + "createHTML", + "createHTMLDocument", + "createIIRFilter", + "createImageBitmap", + "createImageData", + "createIndex", + "createJavaScriptNode", + "createLinearGradient", + "createMediaElementSource", + "createMediaKeys", + "createMediaStreamDestination", + "createMediaStreamSource", + "createMediaStreamTrackSource", + "createMutableFile", + "createNSResolver", + "createNodeIterator", + "createNotification", + "createObjectStore", + "createObjectURL", + "createOffer", + "createOscillator", + "createPanner", + "createPattern", + "createPeriodicWave", + "createPolicy", + "createPopup", + "createProcessingInstruction", + "createProgram", + "createQuery", + "createRadialGradient", + "createRange", + "createRangeCollection", + "createReader", + "createRenderbuffer", + "createSVGAngle", + "createSVGLength", + "createSVGMatrix", + "createSVGNumber", + "createSVGPathSegArcAbs", + "createSVGPathSegArcRel", + "createSVGPathSegClosePath", + "createSVGPathSegCurvetoCubicAbs", + "createSVGPathSegCurvetoCubicRel", + "createSVGPathSegCurvetoCubicSmoothAbs", + "createSVGPathSegCurvetoCubicSmoothRel", + "createSVGPathSegCurvetoQuadraticAbs", + "createSVGPathSegCurvetoQuadraticRel", + "createSVGPathSegCurvetoQuadraticSmoothAbs", + "createSVGPathSegCurvetoQuadraticSmoothRel", + "createSVGPathSegLinetoAbs", + "createSVGPathSegLinetoHorizontalAbs", + "createSVGPathSegLinetoHorizontalRel", + "createSVGPathSegLinetoRel", + "createSVGPathSegLinetoVerticalAbs", + "createSVGPathSegLinetoVerticalRel", + "createSVGPathSegMovetoAbs", + "createSVGPathSegMovetoRel", + "createSVGPoint", + "createSVGRect", + "createSVGTransform", + "createSVGTransformFromMatrix", + "createSampler", + "createScript", + "createScriptProcessor", + "createScriptURL", + "createSession", + "createShader", + "createShadowRoot", + "createStereoPanner", + "createStyleSheet", + "createTBody", + "createTFoot", + "createTHead", + "createTextNode", + "createTextRange", + "createTexture", + "createTouch", + "createTouchList", + "createTransformFeedback", + "createTreeWalker", + "createVertexArray", + "createWaveShaper", + "creationTime", + "credentials", + "crossOrigin", + "crossOriginIsolated", + "crypto", + "csi", + "csp", + "cssFloat", + "cssRules", + "cssText", + "cssValueType", + "ctrlKey", + "ctrlLeft", + "cues", + "cullFace", + "currentDirection", + "currentLocalDescription", + "currentNode", + "currentPage", + "currentRect", + "currentRemoteDescription", + "currentScale", + "currentScript", + "currentSrc", + "currentState", + "currentStyle", + "currentTarget", + "currentTime", + "currentTranslate", + "currentView", + "cursor", + "curve", + "customElements", + "customError", + "cx", + "cy", + "d", + "data", + "dataFld", + "dataFormatAs", + "dataLoss", + "dataLossMessage", + "dataPageSize", + "dataSrc", + "dataTransfer", + "database", + "databases", + "dataset", + "dateTime", + "db", + "debug", + "debuggerEnabled", + "declare", + "decode", + "decodeAudioData", + "decodeURI", + "decodeURIComponent", + "decodedBodySize", + "decoding", + "decodingInfo", + "decrypt", + "default", + "defaultCharset", + "defaultChecked", + "defaultMuted", + "defaultPlaybackRate", + "defaultPolicy", + "defaultPrevented", + "defaultRequest", + "defaultSelected", + "defaultStatus", + "defaultURL", + "defaultValue", + "defaultView", + "defaultstatus", + "defer", + "define", + "defineMagicFunction", + "defineMagicVariable", + "defineProperties", + "defineProperty", + "deg", + "delay", + "delayTime", + "delegatesFocus", + "delete", + "deleteBuffer", + "deleteCaption", + "deleteCell", + "deleteContents", + "deleteData", + "deleteDatabase", + "deleteFramebuffer", + "deleteFromDocument", + "deleteIndex", + "deleteMedium", + "deleteObjectStore", + "deleteProgram", + "deleteProperty", + "deleteQuery", + "deleteRenderbuffer", + "deleteRow", + "deleteRule", + "deleteSampler", + "deleteShader", + "deleteSync", + "deleteTFoot", + "deleteTHead", + "deleteTexture", + "deleteTransformFeedback", + "deleteVertexArray", + "deliverChangeRecords", + "delivery", + "deliveryInfo", + "deliveryStatus", + "deliveryTimestamp", + "delta", + "deltaMode", + "deltaX", + "deltaY", + "deltaZ", + "dependentLocality", + "depthFar", + "depthFunc", + "depthMask", + "depthNear", + "depthRange", + "deref", + "deriveBits", + "deriveKey", + "description", + "deselectAll", + "designMode", + "desiredSize", + "destination", + "destinationURL", + "detach", + "detachEvent", + "detachShader", + "detail", + "details", + "detect", + "detune", + "device", + "deviceClass", + "deviceId", + "deviceMemory", + "devicePixelContentBoxSize", + "devicePixelRatio", + "deviceProtocol", + "deviceSubclass", + "deviceVersionMajor", + "deviceVersionMinor", + "deviceVersionSubminor", + "deviceXDPI", + "deviceYDPI", + "didTimeout", + "diffuseConstant", + "digest", + "dimensions", + "dir", + "dirName", + "direction", + "dirxml", + "disable", + "disablePictureInPicture", + "disableRemotePlayback", + "disableVertexAttribArray", + "disabled", + "dischargingTime", + "disconnect", + "disconnectShark", + "dispatchEvent", + "display", + "displayId", + "displayName", + "disposition", + "distanceModel", + "div", + "divisor", + "djsapi", + "djsproxy", + "doImport", + "doNotTrack", + "doScroll", + "doctype", + "document", + "documentElement", + "documentMode", + "documentURI", + "dolphin", + "dolphinGameCenter", + "dolphininfo", + "dolphinmeta", + "domComplete", + "domContentLoadedEventEnd", + "domContentLoadedEventStart", + "domInteractive", + "domLoading", + "domOverlayState", + "domain", + "domainLookupEnd", + "domainLookupStart", + "dominant-baseline", + "dominantBaseline", + "done", + "dopplerFactor", + "dotAll", + "downDegrees", + "downlink", + "download", + "downloadTotal", + "downloaded", + "dpcm", + "dpi", + "dppx", + "dragDrop", + "draggable", + "drawArrays", + "drawArraysInstanced", + "drawArraysInstancedANGLE", + "drawBuffers", + "drawCustomFocusRing", + "drawElements", + "drawElementsInstanced", + "drawElementsInstancedANGLE", + "drawFocusIfNeeded", + "drawImage", + "drawImageFromRect", + "drawRangeElements", + "drawSystemFocusRing", + "drawingBufferHeight", + "drawingBufferWidth", + "dropEffect", + "droppedVideoFrames", + "dropzone", + "dtmf", + "dump", + "dumpProfile", + "duplicate", + "durability", + "duration", + "dvname", + "dvnum", + "dx", + "dy", + "dynsrc", + "e", + "edgeMode", + "effect", + "effectAllowed", + "effectiveDirective", + "effectiveType", + "elapsedTime", + "element", + "elementFromPoint", + "elementTiming", + "elements", + "elementsFromPoint", + "elevation", + "ellipse", + "em", + "email", + "embeds", + "emma", + "empty", + "empty-cells", + "emptyCells", + "emptyHTML", + "emptyScript", + "emulatedPosition", + "enable", + "enableBackground", + "enableDelegations", + "enableStyleSheetsForSet", + "enableVertexAttribArray", + "enabled", + "enabledPlugin", + "encode", + "encodeInto", + "encodeURI", + "encodeURIComponent", + "encodedBodySize", + "encoding", + "encodingInfo", + "encrypt", + "enctype", + "end", + "endContainer", + "endElement", + "endElementAt", + "endOfStream", + "endOffset", + "endQuery", + "endTime", + "endTransformFeedback", + "ended", + "endpoint", + "endpointNumber", + "endpoints", + "endsWith", + "enterKeyHint", + "entities", + "entries", + "entryType", + "enumerate", + "enumerateDevices", + "enumerateEditable", + "environmentBlendMode", + "equals", + "error", + "errorCode", + "errorDetail", + "errorText", + "escape", + "estimate", + "eval", + "evaluate", + "event", + "eventPhase", + "every", + "ex", + "exception", + "exchange", + "exec", + "execCommand", + "execCommandShowHelp", + "execScript", + "exitFullscreen", + "exitPictureInPicture", + "exitPointerLock", + "exitPresent", + "exp", + "expand", + "expandEntityReferences", + "expando", + "expansion", + "expiration", + "expirationTime", + "expires", + "expiryDate", + "explicitOriginalTarget", + "expm1", + "exponent", + "exponentialRampToValueAtTime", + "exportKey", + "extend", + "extensions", + "extentNode", + "extentOffset", + "external", + "externalResourcesRequired", + "extractContents", + "extractable", + "eye", + "f", + "face", + "factoryReset", + "failureReason", + "fallback", + "family", + "familyName", + "farthestViewportElement", + "fastSeek", + "fatal", + "featureId", + "featurePolicy", + "featureSettings", + "features", + "fenceSync", + "fetch", + "fetchStart", + "fftSize", + "fgColor", + "fieldOfView", + "file", + "fileCreatedDate", + "fileHandle", + "fileModifiedDate", + "fileName", + "fileSize", + "fileUpdatedDate", + "filename", + "files", + "filesystem", + "fill", + "fill-opacity", + "fill-rule", + "fillLightMode", + "fillOpacity", + "fillRect", + "fillRule", + "fillStyle", + "fillText", + "filter", + "filterResX", + "filterResY", + "filterUnits", + "filters", + "finally", + "find", + "findIndex", + "findRule", + "findText", + "finish", + "finished", + "fireEvent", + "firesTouchEvents", + "firstChild", + "firstElementChild", + "firstPage", + "fixed", + "flags", + "flat", + "flatMap", + "flex", + "flex-basis", + "flex-direction", + "flex-flow", + "flex-grow", + "flex-shrink", + "flex-wrap", + "flexBasis", + "flexDirection", + "flexFlow", + "flexGrow", + "flexShrink", + "flexWrap", + "flipX", + "flipY", + "float", + "float32", + "float64", + "flood-color", + "flood-opacity", + "floodColor", + "floodOpacity", + "floor", + "flush", + "focus", + "focusNode", + "focusOffset", + "font", + "font-family", + "font-feature-settings", + "font-kerning", + "font-language-override", + "font-optical-sizing", + "font-size", + "font-size-adjust", + "font-stretch", + "font-style", + "font-synthesis", + "font-variant", + "font-variant-alternates", + "font-variant-caps", + "font-variant-east-asian", + "font-variant-ligatures", + "font-variant-numeric", + "font-variant-position", + "font-variation-settings", + "font-weight", + "fontFamily", + "fontFeatureSettings", + "fontKerning", + "fontLanguageOverride", + "fontOpticalSizing", + "fontSize", + "fontSizeAdjust", + "fontSmoothingEnabled", + "fontStretch", + "fontStyle", + "fontSynthesis", + "fontVariant", + "fontVariantAlternates", + "fontVariantCaps", + "fontVariantEastAsian", + "fontVariantLigatures", + "fontVariantNumeric", + "fontVariantPosition", + "fontVariationSettings", + "fontWeight", + "fontcolor", + "fontfaces", + "fonts", + "fontsize", + "for", + "forEach", + "force", + "forceRedraw", + "form", + "formAction", + "formData", + "formEnctype", + "formMethod", + "formNoValidate", + "formTarget", + "format", + "formatToParts", + "forms", + "forward", + "forwardX", + "forwardY", + "forwardZ", + "foundation", + "fr", + "fragmentDirective", + "frame", + "frameBorder", + "frameElement", + "frameSpacing", + "framebuffer", + "framebufferHeight", + "framebufferRenderbuffer", + "framebufferTexture2D", + "framebufferTextureLayer", + "framebufferWidth", + "frames", + "freeSpace", + "freeze", + "frequency", + "frequencyBinCount", + "from", + "fromCharCode", + "fromCodePoint", + "fromElement", + "fromEntries", + "fromFloat32Array", + "fromFloat64Array", + "fromMatrix", + "fromPoint", + "fromQuad", + "fromRect", + "frontFace", + "fround", + "fullPath", + "fullScreen", + "fullscreen", + "fullscreenElement", + "fullscreenEnabled", + "fx", + "fy", + "gain", + "gamepad", + "gamma", + "gap", + "gatheringState", + "gatt", + "genderIdentity", + "generateCertificate", + "generateKey", + "generateMipmap", + "generateRequest", + "geolocation", + "gestureObject", + "get", + "getActiveAttrib", + "getActiveUniform", + "getActiveUniformBlockName", + "getActiveUniformBlockParameter", + "getActiveUniforms", + "getAdjacentText", + "getAll", + "getAllKeys", + "getAllResponseHeaders", + "getAllowlistForFeature", + "getAnimations", + "getAsFile", + "getAsString", + "getAttachedShaders", + "getAttribLocation", + "getAttribute", + "getAttributeNS", + "getAttributeNames", + "getAttributeNode", + "getAttributeNodeNS", + "getAttributeType", + "getAudioTracks", + "getAvailability", + "getBBox", + "getBattery", + "getBigInt64", + "getBigUint64", + "getBlob", + "getBookmark", + "getBoundingClientRect", + "getBounds", + "getBoxQuads", + "getBufferParameter", + "getBufferSubData", + "getByteFrequencyData", + "getByteTimeDomainData", + "getCSSCanvasContext", + "getCTM", + "getCandidateWindowClientRect", + "getCanonicalLocales", + "getCapabilities", + "getChannelData", + "getCharNumAtPosition", + "getCharacteristic", + "getCharacteristics", + "getClientExtensionResults", + "getClientRect", + "getClientRects", + "getCoalescedEvents", + "getCompositionAlternatives", + "getComputedStyle", + "getComputedTextLength", + "getComputedTiming", + "getConfiguration", + "getConstraints", + "getContext", + "getContextAttributes", + "getContributingSources", + "getCounterValue", + "getCueAsHTML", + "getCueById", + "getCurrentPosition", + "getCurrentTime", + "getData", + "getDatabaseNames", + "getDate", + "getDay", + "getDefaultComputedStyle", + "getDescriptor", + "getDescriptors", + "getDestinationInsertionPoints", + "getDevices", + "getDirectory", + "getDisplayMedia", + "getDistributedNodes", + "getEditable", + "getElementById", + "getElementsByClassName", + "getElementsByName", + "getElementsByTagName", + "getElementsByTagNameNS", + "getEnclosureList", + "getEndPositionOfChar", + "getEntries", + "getEntriesByName", + "getEntriesByType", + "getError", + "getExtension", + "getExtentOfChar", + "getEyeParameters", + "getFeature", + "getFile", + "getFiles", + "getFilesAndDirectories", + "getFingerprints", + "getFloat32", + "getFloat64", + "getFloatFrequencyData", + "getFloatTimeDomainData", + "getFloatValue", + "getFragDataLocation", + "getFrameData", + "getFramebufferAttachmentParameter", + "getFrequencyResponse", + "getFullYear", + "getGamepads", + "getHitTestResults", + "getHitTestResultsForTransientInput", + "getHours", + "getIdentityAssertion", + "getIds", + "getImageData", + "getIndexedParameter", + "getInstalledRelatedApps", + "getInt16", + "getInt32", + "getInt8", + "getInternalformatParameter", + "getIntersectionList", + "getItem", + "getItems", + "getKey", + "getKeyframes", + "getLayers", + "getLayoutMap", + "getLineDash", + "getLocalCandidates", + "getLocalParameters", + "getLocalStreams", + "getMarks", + "getMatchedCSSRules", + "getMaxGCPauseSinceClear", + "getMeasures", + "getMetadata", + "getMilliseconds", + "getMinutes", + "getModifierState", + "getMonth", + "getNamedItem", + "getNamedItemNS", + "getNativeFramebufferScaleFactor", + "getNotifications", + "getNotifier", + "getNumberOfChars", + "getOffsetReferenceSpace", + "getOutputTimestamp", + "getOverrideHistoryNavigationMode", + "getOverrideStyle", + "getOwnPropertyDescriptor", + "getOwnPropertyDescriptors", + "getOwnPropertyNames", + "getOwnPropertySymbols", + "getParameter", + "getParameters", + "getParent", + "getPathSegAtLength", + "getPhotoCapabilities", + "getPhotoSettings", + "getPointAtLength", + "getPose", + "getPredictedEvents", + "getPreference", + "getPreferenceDefault", + "getPresentationAttribute", + "getPreventDefault", + "getPrimaryService", + "getPrimaryServices", + "getProgramInfoLog", + "getProgramParameter", + "getPropertyCSSValue", + "getPropertyPriority", + "getPropertyShorthand", + "getPropertyType", + "getPropertyValue", + "getPrototypeOf", + "getQuery", + "getQueryParameter", + "getRGBColorValue", + "getRandomValues", + "getRangeAt", + "getReader", + "getReceivers", + "getRectValue", + "getRegistration", + "getRegistrations", + "getRemoteCandidates", + "getRemoteCertificates", + "getRemoteParameters", + "getRemoteStreams", + "getRenderbufferParameter", + "getResponseHeader", + "getRoot", + "getRootNode", + "getRotationOfChar", + "getSVGDocument", + "getSamplerParameter", + "getScreenCTM", + "getSeconds", + "getSelectedCandidatePair", + "getSelection", + "getSenders", + "getService", + "getSettings", + "getShaderInfoLog", + "getShaderParameter", + "getShaderPrecisionFormat", + "getShaderSource", + "getSimpleDuration", + "getSiteIcons", + "getSources", + "getSpeculativeParserUrls", + "getStartPositionOfChar", + "getStartTime", + "getState", + "getStats", + "getStatusForPolicy", + "getStorageUpdates", + "getStreamById", + "getStringValue", + "getSubStringLength", + "getSubscription", + "getSupportedConstraints", + "getSupportedExtensions", + "getSupportedFormats", + "getSyncParameter", + "getSynchronizationSources", + "getTags", + "getTargetRanges", + "getTexParameter", + "getTime", + "getTimezoneOffset", + "getTiming", + "getTotalLength", + "getTrackById", + "getTracks", + "getTransceivers", + "getTransform", + "getTransformFeedbackVarying", + "getTransformToElement", + "getTransports", + "getType", + "getTypeMapping", + "getUTCDate", + "getUTCDay", + "getUTCFullYear", + "getUTCHours", + "getUTCMilliseconds", + "getUTCMinutes", + "getUTCMonth", + "getUTCSeconds", + "getUint16", + "getUint32", + "getUint8", + "getUniform", + "getUniformBlockIndex", + "getUniformIndices", + "getUniformLocation", + "getUserMedia", + "getVRDisplays", + "getValues", + "getVarDate", + "getVariableValue", + "getVertexAttrib", + "getVertexAttribOffset", + "getVideoPlaybackQuality", + "getVideoTracks", + "getViewerPose", + "getViewport", + "getVoices", + "getWakeLockState", + "getWriter", + "getYear", + "givenName", + "global", + "globalAlpha", + "globalCompositeOperation", + "globalThis", + "glyphOrientationHorizontal", + "glyphOrientationVertical", + "glyphRef", + "go", + "grabFrame", + "grad", + "gradientTransform", + "gradientUnits", + "grammars", + "green", + "grid", + "grid-area", + "grid-auto-columns", + "grid-auto-flow", + "grid-auto-rows", + "grid-column", + "grid-column-end", + "grid-column-gap", + "grid-column-start", + "grid-gap", + "grid-row", + "grid-row-end", + "grid-row-gap", + "grid-row-start", + "grid-template", + "grid-template-areas", + "grid-template-columns", + "grid-template-rows", + "gridArea", + "gridAutoColumns", + "gridAutoFlow", + "gridAutoRows", + "gridColumn", + "gridColumnEnd", + "gridColumnGap", + "gridColumnStart", + "gridGap", + "gridRow", + "gridRowEnd", + "gridRowGap", + "gridRowStart", + "gridTemplate", + "gridTemplateAreas", + "gridTemplateColumns", + "gridTemplateRows", + "gripSpace", + "group", + "groupCollapsed", + "groupEnd", + "groupId", + "hadRecentInput", + "hand", + "handedness", + "hapticActuators", + "hardwareConcurrency", + "has", + "hasAttribute", + "hasAttributeNS", + "hasAttributes", + "hasBeenActive", + "hasChildNodes", + "hasComposition", + "hasEnrolledInstrument", + "hasExtension", + "hasExternalDisplay", + "hasFeature", + "hasFocus", + "hasInstance", + "hasLayout", + "hasOrientation", + "hasOwnProperty", + "hasPointerCapture", + "hasPosition", + "hasReading", + "hasStorageAccess", + "hash", + "head", + "headers", + "heading", + "height", + "hidden", + "hide", + "hideFocus", + "high", + "highWaterMark", + "hint", + "history", + "honorificPrefix", + "honorificSuffix", + "horizontalOverflow", + "host", + "hostCandidate", + "hostname", + "href", + "hrefTranslate", + "hreflang", + "hspace", + "html5TagCheckInerface", + "htmlFor", + "htmlText", + "httpEquiv", + "httpRequestStatusCode", + "hwTimestamp", + "hyphens", + "hypot", + "iccId", + "iceConnectionState", + "iceGatheringState", + "iceTransport", + "icon", + "iconURL", + "id", + "identifier", + "identity", + "idpLoginUrl", + "ignoreBOM", + "ignoreCase", + "ignoreDepthValues", + "image-orientation", + "image-rendering", + "imageHeight", + "imageOrientation", + "imageRendering", + "imageSizes", + "imageSmoothingEnabled", + "imageSmoothingQuality", + "imageSrcset", + "imageWidth", + "images", + "ime-mode", + "imeMode", + "implementation", + "importKey", + "importNode", + "importStylesheet", + "imports", + "impp", + "imul", + "in", + "in1", + "in2", + "inBandMetadataTrackDispatchType", + "inRange", + "includes", + "incremental", + "indeterminate", + "index", + "indexNames", + "indexOf", + "indexedDB", + "indicate", + "inertiaDestinationX", + "inertiaDestinationY", + "info", + "init", + "initAnimationEvent", + "initBeforeLoadEvent", + "initClipboardEvent", + "initCloseEvent", + "initCommandEvent", + "initCompositionEvent", + "initCustomEvent", + "initData", + "initDataType", + "initDeviceMotionEvent", + "initDeviceOrientationEvent", + "initDragEvent", + "initErrorEvent", + "initEvent", + "initFocusEvent", + "initGestureEvent", + "initHashChangeEvent", + "initKeyEvent", + "initKeyboardEvent", + "initMSManipulationEvent", + "initMessageEvent", + "initMouseEvent", + "initMouseScrollEvent", + "initMouseWheelEvent", + "initMutationEvent", + "initNSMouseEvent", + "initOverflowEvent", + "initPageEvent", + "initPageTransitionEvent", + "initPointerEvent", + "initPopStateEvent", + "initProgressEvent", + "initScrollAreaEvent", + "initSimpleGestureEvent", + "initStorageEvent", + "initTextEvent", + "initTimeEvent", + "initTouchEvent", + "initTransitionEvent", + "initUIEvent", + "initWebKitAnimationEvent", + "initWebKitTransitionEvent", + "initWebKitWheelEvent", + "initWheelEvent", + "initialTime", + "initialize", + "initiatorType", + "inline-size", + "inlineSize", + "inlineVerticalFieldOfView", + "inner", + "innerHTML", + "innerHeight", + "innerText", + "innerWidth", + "input", + "inputBuffer", + "inputEncoding", + "inputMethod", + "inputMode", + "inputSource", + "inputSources", + "inputType", + "inputs", + "insertAdjacentElement", + "insertAdjacentHTML", + "insertAdjacentText", + "insertBefore", + "insertCell", + "insertDTMF", + "insertData", + "insertItemBefore", + "insertNode", + "insertRow", + "insertRule", + "inset", + "inset-block", + "inset-block-end", + "inset-block-start", + "inset-inline", + "inset-inline-end", + "inset-inline-start", + "insetBlock", + "insetBlockEnd", + "insetBlockStart", + "insetInline", + "insetInlineEnd", + "insetInlineStart", + "installing", + "instanceRoot", + "instantiate", + "instantiateStreaming", + "instruments", + "int16", + "int32", + "int8", + "integrity", + "interactionMode", + "intercept", + "interfaceClass", + "interfaceName", + "interfaceNumber", + "interfaceProtocol", + "interfaceSubclass", + "interfaces", + "interimResults", + "internalSubset", + "interpretation", + "intersectionRatio", + "intersectionRect", + "intersectsNode", + "interval", + "invalidIteratorState", + "invalidateFramebuffer", + "invalidateSubFramebuffer", + "inverse", + "invertSelf", + "is", + "is2D", + "isActive", + "isAlternate", + "isArray", + "isBingCurrentSearchDefault", + "isBuffer", + "isCandidateWindowVisible", + "isChar", + "isCollapsed", + "isComposing", + "isConcatSpreadable", + "isConnected", + "isContentEditable", + "isContentHandlerRegistered", + "isContextLost", + "isDefaultNamespace", + "isDirectory", + "isDisabled", + "isEnabled", + "isEqual", + "isEqualNode", + "isExtensible", + "isExternalCTAP2SecurityKeySupported", + "isFile", + "isFinite", + "isFramebuffer", + "isFrozen", + "isGenerator", + "isHTML", + "isHistoryNavigation", + "isId", + "isIdentity", + "isInjected", + "isInteger", + "isIntersecting", + "isLockFree", + "isMap", + "isMultiLine", + "isNaN", + "isOpen", + "isPointInFill", + "isPointInPath", + "isPointInRange", + "isPointInStroke", + "isPrefAlternate", + "isPresenting", + "isPrimary", + "isProgram", + "isPropertyImplicit", + "isProtocolHandlerRegistered", + "isPrototypeOf", + "isQuery", + "isRenderbuffer", + "isSafeInteger", + "isSameNode", + "isSampler", + "isScript", + "isScriptURL", + "isSealed", + "isSecureContext", + "isSessionSupported", + "isShader", + "isSupported", + "isSync", + "isTextEdit", + "isTexture", + "isTransformFeedback", + "isTrusted", + "isTypeSupported", + "isUserVerifyingPlatformAuthenticatorAvailable", + "isVertexArray", + "isView", + "isVisible", + "isochronousTransferIn", + "isochronousTransferOut", + "isolation", + "italics", + "item", + "itemId", + "itemProp", + "itemRef", + "itemScope", + "itemType", + "itemValue", + "items", + "iterateNext", + "iterationComposite", + "iterator", + "javaEnabled", + "jobTitle", + "join", + "json", + "justify-content", + "justify-items", + "justify-self", + "justifyContent", + "justifyItems", + "justifySelf", + "k1", + "k2", + "k3", + "k4", + "kHz", + "keepalive", + "kernelMatrix", + "kernelUnitLengthX", + "kernelUnitLengthY", + "kerning", + "key", + "keyCode", + "keyFor", + "keyIdentifier", + "keyLightEnabled", + "keyLocation", + "keyPath", + "keyStatuses", + "keySystem", + "keyText", + "keyUsage", + "keyboard", + "keys", + "keytype", + "kind", + "knee", + "label", + "labels", + "lang", + "language", + "languages", + "largeArcFlag", + "lastChild", + "lastElementChild", + "lastEventId", + "lastIndex", + "lastIndexOf", + "lastInputTime", + "lastMatch", + "lastMessageSubject", + "lastMessageType", + "lastModified", + "lastModifiedDate", + "lastPage", + "lastParen", + "lastState", + "lastStyleSheetSet", + "latitude", + "layerX", + "layerY", + "layoutFlow", + "layoutGrid", + "layoutGridChar", + "layoutGridLine", + "layoutGridMode", + "layoutGridType", + "lbound", + "left", + "leftContext", + "leftDegrees", + "leftMargin", + "leftProjectionMatrix", + "leftViewMatrix", + "length", + "lengthAdjust", + "lengthComputable", + "letter-spacing", + "letterSpacing", + "level", + "lighting-color", + "lightingColor", + "limitingConeAngle", + "line", + "line-break", + "line-height", + "lineAlign", + "lineBreak", + "lineCap", + "lineDashOffset", + "lineHeight", + "lineJoin", + "lineNumber", + "lineTo", + "lineWidth", + "linearAcceleration", + "linearRampToValueAtTime", + "linearVelocity", + "lineno", + "lines", + "link", + "linkColor", + "linkProgram", + "links", + "list", + "list-style", + "list-style-image", + "list-style-position", + "list-style-type", + "listStyle", + "listStyleImage", + "listStylePosition", + "listStyleType", + "listener", + "load", + "loadEventEnd", + "loadEventStart", + "loadTime", + "loadTimes", + "loaded", + "loading", + "localDescription", + "localName", + "localService", + "localStorage", + "locale", + "localeCompare", + "location", + "locationbar", + "lock", + "locked", + "lockedFile", + "locks", + "log", + "log10", + "log1p", + "log2", + "logicalXDPI", + "logicalYDPI", + "longDesc", + "longitude", + "lookupNamespaceURI", + "lookupPrefix", + "loop", + "loopEnd", + "loopStart", + "looping", + "low", + "lower", + "lowerBound", + "lowerOpen", + "lowsrc", + "m11", + "m12", + "m13", + "m14", + "m21", + "m22", + "m23", + "m24", + "m31", + "m32", + "m33", + "m34", + "m41", + "m42", + "m43", + "m44", + "makeXRCompatible", + "manifest", + "manufacturer", + "manufacturerName", + "map", + "mapping", + "margin", + "margin-block", + "margin-block-end", + "margin-block-start", + "margin-bottom", + "margin-inline", + "margin-inline-end", + "margin-inline-start", + "margin-left", + "margin-right", + "margin-top", + "marginBlock", + "marginBlockEnd", + "marginBlockStart", + "marginBottom", + "marginHeight", + "marginInline", + "marginInlineEnd", + "marginInlineStart", + "marginLeft", + "marginRight", + "marginTop", + "marginWidth", + "mark", + "marker", + "marker-end", + "marker-mid", + "marker-offset", + "marker-start", + "markerEnd", + "markerHeight", + "markerMid", + "markerOffset", + "markerStart", + "markerUnits", + "markerWidth", + "marks", + "mask", + "mask-clip", + "mask-composite", + "mask-image", + "mask-mode", + "mask-origin", + "mask-position", + "mask-position-x", + "mask-position-y", + "mask-repeat", + "mask-size", + "mask-type", + "maskClip", + "maskComposite", + "maskContentUnits", + "maskImage", + "maskMode", + "maskOrigin", + "maskPosition", + "maskPositionX", + "maskPositionY", + "maskRepeat", + "maskSize", + "maskType", + "maskUnits", + "match", + "matchAll", + "matchMedia", + "matchMedium", + "matches", + "matrix", + "matrixTransform", + "max", + "max-block-size", + "max-height", + "max-inline-size", + "max-width", + "maxActions", + "maxAlternatives", + "maxBlockSize", + "maxChannelCount", + "maxChannels", + "maxConnectionsPerServer", + "maxDecibels", + "maxDistance", + "maxHeight", + "maxInlineSize", + "maxLayers", + "maxLength", + "maxMessageSize", + "maxPacketLifeTime", + "maxRetransmits", + "maxTouchPoints", + "maxValue", + "maxWidth", + "measure", + "measureText", + "media", + "mediaCapabilities", + "mediaDevices", + "mediaElement", + "mediaGroup", + "mediaKeys", + "mediaSession", + "mediaStream", + "mediaText", + "meetOrSlice", + "memory", + "menubar", + "mergeAttributes", + "message", + "messageClass", + "messageHandlers", + "messageType", + "metaKey", + "metadata", + "method", + "methodDetails", + "methodName", + "mid", + "mimeType", + "mimeTypes", + "min", + "min-block-size", + "min-height", + "min-inline-size", + "min-width", + "minBlockSize", + "minDecibels", + "minHeight", + "minInlineSize", + "minLength", + "minValue", + "minWidth", + "miterLimit", + "mix-blend-mode", + "mixBlendMode", + "mm", + "mode", + "modify", + "mount", + "move", + "moveBy", + "moveEnd", + "moveFirst", + "moveFocusDown", + "moveFocusLeft", + "moveFocusRight", + "moveFocusUp", + "moveNext", + "moveRow", + "moveStart", + "moveTo", + "moveToBookmark", + "moveToElementText", + "moveToPoint", + "movementX", + "movementY", + "mozAdd", + "mozAnimationStartTime", + "mozAnon", + "mozApps", + "mozAudioCaptured", + "mozAudioChannelType", + "mozAutoplayEnabled", + "mozCancelAnimationFrame", + "mozCancelFullScreen", + "mozCancelRequestAnimationFrame", + "mozCaptureStream", + "mozCaptureStreamUntilEnded", + "mozClearDataAt", + "mozContact", + "mozContacts", + "mozCreateFileHandle", + "mozCurrentTransform", + "mozCurrentTransformInverse", + "mozCursor", + "mozDash", + "mozDashOffset", + "mozDecodedFrames", + "mozExitPointerLock", + "mozFillRule", + "mozFragmentEnd", + "mozFrameDelay", + "mozFullScreen", + "mozFullScreenElement", + "mozFullScreenEnabled", + "mozGetAll", + "mozGetAllKeys", + "mozGetAsFile", + "mozGetDataAt", + "mozGetMetadata", + "mozGetUserMedia", + "mozHasAudio", + "mozHasItem", + "mozHidden", + "mozImageSmoothingEnabled", + "mozIndexedDB", + "mozInnerScreenX", + "mozInnerScreenY", + "mozInputSource", + "mozIsTextField", + "mozItem", + "mozItemCount", + "mozItems", + "mozLength", + "mozLockOrientation", + "mozMatchesSelector", + "mozMovementX", + "mozMovementY", + "mozOpaque", + "mozOrientation", + "mozPaintCount", + "mozPaintedFrames", + "mozParsedFrames", + "mozPay", + "mozPointerLockElement", + "mozPresentedFrames", + "mozPreservesPitch", + "mozPressure", + "mozPrintCallback", + "mozRTCIceCandidate", + "mozRTCPeerConnection", + "mozRTCSessionDescription", + "mozRemove", + "mozRequestAnimationFrame", + "mozRequestFullScreen", + "mozRequestPointerLock", + "mozSetDataAt", + "mozSetImageElement", + "mozSourceNode", + "mozSrcObject", + "mozSystem", + "mozTCPSocket", + "mozTextStyle", + "mozTypesAt", + "mozUnlockOrientation", + "mozUserCancelled", + "mozVisibilityState", + "ms", + "msAnimation", + "msAnimationDelay", + "msAnimationDirection", + "msAnimationDuration", + "msAnimationFillMode", + "msAnimationIterationCount", + "msAnimationName", + "msAnimationPlayState", + "msAnimationStartTime", + "msAnimationTimingFunction", + "msBackfaceVisibility", + "msBlockProgression", + "msCSSOMElementFloatMetrics", + "msCaching", + "msCachingEnabled", + "msCancelRequestAnimationFrame", + "msCapsLockWarningOff", + "msClearImmediate", + "msClose", + "msContentZoomChaining", + "msContentZoomFactor", + "msContentZoomLimit", + "msContentZoomLimitMax", + "msContentZoomLimitMin", + "msContentZoomSnap", + "msContentZoomSnapPoints", + "msContentZoomSnapType", + "msContentZooming", + "msConvertURL", + "msCrypto", + "msDoNotTrack", + "msElementsFromPoint", + "msElementsFromRect", + "msExitFullscreen", + "msExtendedCode", + "msFillRule", + "msFirstPaint", + "msFlex", + "msFlexAlign", + "msFlexDirection", + "msFlexFlow", + "msFlexItemAlign", + "msFlexLinePack", + "msFlexNegative", + "msFlexOrder", + "msFlexPack", + "msFlexPositive", + "msFlexPreferredSize", + "msFlexWrap", + "msFlowFrom", + "msFlowInto", + "msFontFeatureSettings", + "msFullscreenElement", + "msFullscreenEnabled", + "msGetInputContext", + "msGetRegionContent", + "msGetUntransformedBounds", + "msGraphicsTrustStatus", + "msGridColumn", + "msGridColumnAlign", + "msGridColumnSpan", + "msGridColumns", + "msGridRow", + "msGridRowAlign", + "msGridRowSpan", + "msGridRows", + "msHidden", + "msHighContrastAdjust", + "msHyphenateLimitChars", + "msHyphenateLimitLines", + "msHyphenateLimitZone", + "msHyphens", + "msImageSmoothingEnabled", + "msImeAlign", + "msIndexedDB", + "msInterpolationMode", + "msIsStaticHTML", + "msKeySystem", + "msKeys", + "msLaunchUri", + "msLockOrientation", + "msManipulationViewsEnabled", + "msMatchMedia", + "msMatchesSelector", + "msMaxTouchPoints", + "msOrientation", + "msOverflowStyle", + "msPerspective", + "msPerspectiveOrigin", + "msPlayToDisabled", + "msPlayToPreferredSourceUri", + "msPlayToPrimary", + "msPointerEnabled", + "msRegionOverflow", + "msReleasePointerCapture", + "msRequestAnimationFrame", + "msRequestFullscreen", + "msSaveBlob", + "msSaveOrOpenBlob", + "msScrollChaining", + "msScrollLimit", + "msScrollLimitXMax", + "msScrollLimitXMin", + "msScrollLimitYMax", + "msScrollLimitYMin", + "msScrollRails", + "msScrollSnapPointsX", + "msScrollSnapPointsY", + "msScrollSnapType", + "msScrollSnapX", + "msScrollSnapY", + "msScrollTranslation", + "msSetImmediate", + "msSetMediaKeys", + "msSetPointerCapture", + "msTextCombineHorizontal", + "msTextSizeAdjust", + "msToBlob", + "msTouchAction", + "msTouchSelect", + "msTraceAsyncCallbackCompleted", + "msTraceAsyncCallbackStarting", + "msTraceAsyncOperationCompleted", + "msTraceAsyncOperationStarting", + "msTransform", + "msTransformOrigin", + "msTransformStyle", + "msTransition", + "msTransitionDelay", + "msTransitionDuration", + "msTransitionProperty", + "msTransitionTimingFunction", + "msUnlockOrientation", + "msUpdateAsyncCallbackRelation", + "msUserSelect", + "msVisibilityState", + "msWrapFlow", + "msWrapMargin", + "msWrapThrough", + "msWriteProfilerMark", + "msZoom", + "msZoomTo", + "mt", + "mul", + "multiEntry", + "multiSelectionObj", + "multiline", + "multiple", + "multiply", + "multiplySelf", + "mutableFile", + "muted", + "n", + "name", + "nameProp", + "namedItem", + "namedRecordset", + "names", + "namespaceURI", + "namespaces", + "naturalHeight", + "naturalWidth", + "navigate", + "navigation", + "navigationMode", + "navigationPreload", + "navigationStart", + "navigator", + "near", + "nearestViewportElement", + "negative", + "negotiated", + "netscape", + "networkState", + "newScale", + "newTranslate", + "newURL", + "newValue", + "newValueSpecifiedUnits", + "newVersion", + "newhome", + "next", + "nextElementSibling", + "nextHopProtocol", + "nextNode", + "nextPage", + "nextSibling", + "nickname", + "noHref", + "noModule", + "noResize", + "noShade", + "noValidate", + "noWrap", + "node", + "nodeName", + "nodeType", + "nodeValue", + "nonce", + "normalize", + "normalizedPathSegList", + "notationName", + "notations", + "note", + "noteGrainOn", + "noteOff", + "noteOn", + "notify", + "now", + "numOctaves", + "number", + "numberOfChannels", + "numberOfInputs", + "numberOfItems", + "numberOfOutputs", + "numberValue", + "oMatchesSelector", + "object", + "object-fit", + "object-position", + "objectFit", + "objectPosition", + "objectStore", + "objectStoreNames", + "objectType", + "observe", + "of", + "offscreenBuffering", + "offset", + "offset-anchor", + "offset-distance", + "offset-path", + "offset-rotate", + "offsetAnchor", + "offsetDistance", + "offsetHeight", + "offsetLeft", + "offsetNode", + "offsetParent", + "offsetPath", + "offsetRotate", + "offsetTop", + "offsetWidth", + "offsetX", + "offsetY", + "ok", + "oldURL", + "oldValue", + "oldVersion", + "olderShadowRoot", + "onLine", + "onabort", + "onabsolutedeviceorientation", + "onactivate", + "onactive", + "onaddsourcebuffer", + "onaddstream", + "onaddtrack", + "onafterprint", + "onafterscriptexecute", + "onafterupdate", + "onanimationcancel", + "onanimationend", + "onanimationiteration", + "onanimationstart", + "onappinstalled", + "onaudioend", + "onaudioprocess", + "onaudiostart", + "onautocomplete", + "onautocompleteerror", + "onauxclick", + "onbeforeactivate", + "onbeforecopy", + "onbeforecut", + "onbeforedeactivate", + "onbeforeeditfocus", + "onbeforeinstallprompt", + "onbeforepaste", + "onbeforeprint", + "onbeforescriptexecute", + "onbeforeunload", + "onbeforeupdate", + "onbeforexrselect", + "onbegin", + "onblocked", + "onblur", + "onbounce", + "onboundary", + "onbufferedamountlow", + "oncached", + "oncancel", + "oncandidatewindowhide", + "oncandidatewindowshow", + "oncandidatewindowupdate", + "oncanplay", + "oncanplaythrough", + "once", + "oncellchange", + "onchange", + "oncharacteristicvaluechanged", + "onchargingchange", + "onchargingtimechange", + "onchecking", + "onclick", + "onclose", + "onclosing", + "oncompassneedscalibration", + "oncomplete", + "onconnect", + "onconnecting", + "onconnectionavailable", + "onconnectionstatechange", + "oncontextmenu", + "oncontrollerchange", + "oncontrolselect", + "oncopy", + "oncuechange", + "oncut", + "ondataavailable", + "ondatachannel", + "ondatasetchanged", + "ondatasetcomplete", + "ondblclick", + "ondeactivate", + "ondevicechange", + "ondevicelight", + "ondevicemotion", + "ondeviceorientation", + "ondeviceorientationabsolute", + "ondeviceproximity", + "ondischargingtimechange", + "ondisconnect", + "ondisplay", + "ondownloading", + "ondrag", + "ondragend", + "ondragenter", + "ondragexit", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onencrypted", + "onend", + "onended", + "onenter", + "onenterpictureinpicture", + "onerror", + "onerrorupdate", + "onexit", + "onfilterchange", + "onfinish", + "onfocus", + "onfocusin", + "onfocusout", + "onformdata", + "onfreeze", + "onfullscreenchange", + "onfullscreenerror", + "ongatheringstatechange", + "ongattserverdisconnected", + "ongesturechange", + "ongestureend", + "ongesturestart", + "ongotpointercapture", + "onhashchange", + "onhelp", + "onicecandidate", + "onicecandidateerror", + "oniceconnectionstatechange", + "onicegatheringstatechange", + "oninactive", + "oninput", + "oninputsourceschange", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeystatuseschange", + "onkeyup", + "onlanguagechange", + "onlayoutcomplete", + "onleavepictureinpicture", + "onlevelchange", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadend", + "onloading", + "onloadingdone", + "onloadingerror", + "onloadstart", + "onlosecapture", + "onlostpointercapture", + "only", + "onmark", + "onmessage", + "onmessageerror", + "onmidimessage", + "onmousedown", + "onmouseenter", + "onmouseleave", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onmove", + "onmoveend", + "onmovestart", + "onmozfullscreenchange", + "onmozfullscreenerror", + "onmozorientationchange", + "onmozpointerlockchange", + "onmozpointerlockerror", + "onmscontentzoom", + "onmsfullscreenchange", + "onmsfullscreenerror", + "onmsgesturechange", + "onmsgesturedoubletap", + "onmsgestureend", + "onmsgesturehold", + "onmsgesturestart", + "onmsgesturetap", + "onmsgotpointercapture", + "onmsinertiastart", + "onmslostpointercapture", + "onmsmanipulationstatechanged", + "onmsneedkey", + "onmsorientationchange", + "onmspointercancel", + "onmspointerdown", + "onmspointerenter", + "onmspointerhover", + "onmspointerleave", + "onmspointermove", + "onmspointerout", + "onmspointerover", + "onmspointerup", + "onmssitemodejumplistitemremoved", + "onmsthumbnailclick", + "onmute", + "onnegotiationneeded", + "onnomatch", + "onnoupdate", + "onobsolete", + "onoffline", + "ononline", + "onopen", + "onorientationchange", + "onpagechange", + "onpagehide", + "onpageshow", + "onpaste", + "onpause", + "onpayerdetailchange", + "onpaymentmethodchange", + "onplay", + "onplaying", + "onpluginstreamstart", + "onpointercancel", + "onpointerdown", + "onpointerenter", + "onpointerleave", + "onpointerlockchange", + "onpointerlockerror", + "onpointermove", + "onpointerout", + "onpointerover", + "onpointerrawupdate", + "onpointerup", + "onpopstate", + "onprocessorerror", + "onprogress", + "onpropertychange", + "onratechange", + "onreading", + "onreadystatechange", + "onrejectionhandled", + "onrelease", + "onremove", + "onremovesourcebuffer", + "onremovestream", + "onremovetrack", + "onrepeat", + "onreset", + "onresize", + "onresizeend", + "onresizestart", + "onresourcetimingbufferfull", + "onresult", + "onresume", + "onrowenter", + "onrowexit", + "onrowsdelete", + "onrowsinserted", + "onscroll", + "onsearch", + "onsecuritypolicyviolation", + "onseeked", + "onseeking", + "onselect", + "onselectedcandidatepairchange", + "onselectend", + "onselectionchange", + "onselectstart", + "onshippingaddresschange", + "onshippingoptionchange", + "onshow", + "onsignalingstatechange", + "onsoundend", + "onsoundstart", + "onsourceclose", + "onsourceclosed", + "onsourceended", + "onsourceopen", + "onspeechend", + "onspeechstart", + "onsqueeze", + "onsqueezeend", + "onsqueezestart", + "onstalled", + "onstart", + "onstatechange", + "onstop", + "onstorage", + "onstoragecommit", + "onsubmit", + "onsuccess", + "onsuspend", + "onterminate", + "ontextinput", + "ontimeout", + "ontimeupdate", + "ontoggle", + "ontonechange", + "ontouchcancel", + "ontouchend", + "ontouchmove", + "ontouchstart", + "ontrack", + "ontransitioncancel", + "ontransitionend", + "ontransitionrun", + "ontransitionstart", + "onunhandledrejection", + "onunload", + "onunmute", + "onupdate", + "onupdateend", + "onupdatefound", + "onupdateready", + "onupdatestart", + "onupgradeneeded", + "onuserproximity", + "onversionchange", + "onvisibilitychange", + "onvoiceschanged", + "onvolumechange", + "onvrdisplayactivate", + "onvrdisplayconnect", + "onvrdisplaydeactivate", + "onvrdisplaydisconnect", + "onvrdisplaypresentchange", + "onwaiting", + "onwaitingforkey", + "onwarning", + "onwebkitanimationend", + "onwebkitanimationiteration", + "onwebkitanimationstart", + "onwebkitcurrentplaybacktargetiswirelesschanged", + "onwebkitfullscreenchange", + "onwebkitfullscreenerror", + "onwebkitkeyadded", + "onwebkitkeyerror", + "onwebkitkeymessage", + "onwebkitneedkey", + "onwebkitorientationchange", + "onwebkitplaybacktargetavailabilitychanged", + "onwebkitpointerlockchange", + "onwebkitpointerlockerror", + "onwebkitresourcetimingbufferfull", + "onwebkittransitionend", + "onwheel", + "onzoom", + "opacity", + "open", + "openCursor", + "openDatabase", + "openKeyCursor", + "opened", + "opener", + "opera", + "operationType", + "operator", + "opr", + "optimum", + "options", + "or", + "order", + "orderX", + "orderY", + "ordered", + "org", + "organization", + "orient", + "orientAngle", + "orientType", + "orientation", + "orientationX", + "orientationY", + "orientationZ", + "origin", + "originalPolicy", + "originalTarget", + "orphans", + "oscpu", + "outerHTML", + "outerHeight", + "outerText", + "outerWidth", + "outline", + "outline-color", + "outline-offset", + "outline-style", + "outline-width", + "outlineColor", + "outlineOffset", + "outlineStyle", + "outlineWidth", + "outputBuffer", + "outputLatency", + "outputs", + "overflow", + "overflow-anchor", + "overflow-block", + "overflow-inline", + "overflow-wrap", + "overflow-x", + "overflow-y", + "overflowAnchor", + "overflowBlock", + "overflowInline", + "overflowWrap", + "overflowX", + "overflowY", + "overrideMimeType", + "oversample", + "overscroll-behavior", + "overscroll-behavior-block", + "overscroll-behavior-inline", + "overscroll-behavior-x", + "overscroll-behavior-y", + "overscrollBehavior", + "overscrollBehaviorBlock", + "overscrollBehaviorInline", + "overscrollBehaviorX", + "overscrollBehaviorY", + "ownKeys", + "ownerDocument", + "ownerElement", + "ownerNode", + "ownerRule", + "ownerSVGElement", + "owningElement", + "p1", + "p2", + "p3", + "p4", + "packetSize", + "packets", + "pad", + "padEnd", + "padStart", + "padding", + "padding-block", + "padding-block-end", + "padding-block-start", + "padding-bottom", + "padding-inline", + "padding-inline-end", + "padding-inline-start", + "padding-left", + "padding-right", + "padding-top", + "paddingBlock", + "paddingBlockEnd", + "paddingBlockStart", + "paddingBottom", + "paddingInline", + "paddingInlineEnd", + "paddingInlineStart", + "paddingLeft", + "paddingRight", + "paddingTop", + "page", + "page-break-after", + "page-break-before", + "page-break-inside", + "pageBreakAfter", + "pageBreakBefore", + "pageBreakInside", + "pageCount", + "pageLeft", + "pageTop", + "pageX", + "pageXOffset", + "pageY", + "pageYOffset", + "pages", + "paint-order", + "paintOrder", + "paintRequests", + "paintType", + "paintWorklet", + "palette", + "pan", + "panningModel", + "parameters", + "parent", + "parentElement", + "parentNode", + "parentRule", + "parentStyleSheet", + "parentTextEdit", + "parentWindow", + "parse", + "parseAll", + "parseFloat", + "parseFromString", + "parseInt", + "part", + "participants", + "passive", + "password", + "pasteHTML", + "path", + "pathLength", + "pathSegList", + "pathSegType", + "pathSegTypeAsLetter", + "pathname", + "pattern", + "patternContentUnits", + "patternMismatch", + "patternTransform", + "patternUnits", + "pause", + "pauseAnimations", + "pauseOnExit", + "pauseProfilers", + "pauseTransformFeedback", + "paused", + "payerEmail", + "payerName", + "payerPhone", + "paymentManager", + "pc", + "peerIdentity", + "pending", + "pendingLocalDescription", + "pendingRemoteDescription", + "percent", + "performance", + "periodicSync", + "permission", + "permissionState", + "permissions", + "persist", + "persisted", + "personalbar", + "perspective", + "perspective-origin", + "perspectiveOrigin", + "phone", + "phoneticFamilyName", + "phoneticGivenName", + "photo", + "pictureInPictureElement", + "pictureInPictureEnabled", + "pictureInPictureWindow", + "ping", + "pipeThrough", + "pipeTo", + "pitch", + "pixelBottom", + "pixelDepth", + "pixelHeight", + "pixelLeft", + "pixelRight", + "pixelStorei", + "pixelTop", + "pixelUnitToMillimeterX", + "pixelUnitToMillimeterY", + "pixelWidth", + "place-content", + "place-items", + "place-self", + "placeContent", + "placeItems", + "placeSelf", + "placeholder", + "platform", + "platforms", + "play", + "playEffect", + "playState", + "playbackRate", + "playbackState", + "playbackTime", + "played", + "playoutDelayHint", + "playsInline", + "plugins", + "pluginspage", + "pname", + "pointer-events", + "pointerBeforeReferenceNode", + "pointerEnabled", + "pointerEvents", + "pointerId", + "pointerLockElement", + "pointerType", + "points", + "pointsAtX", + "pointsAtY", + "pointsAtZ", + "polygonOffset", + "pop", + "populateMatrix", + "popupWindowFeatures", + "popupWindowName", + "popupWindowURI", + "port", + "port1", + "port2", + "ports", + "posBottom", + "posHeight", + "posLeft", + "posRight", + "posTop", + "posWidth", + "pose", + "position", + "positionAlign", + "positionX", + "positionY", + "positionZ", + "postError", + "postMessage", + "postalCode", + "poster", + "pow", + "powerEfficient", + "powerOff", + "preMultiplySelf", + "precision", + "preferredStyleSheetSet", + "preferredStylesheetSet", + "prefix", + "preload", + "prepend", + "presentation", + "preserveAlpha", + "preserveAspectRatio", + "preserveAspectRatioString", + "pressed", + "pressure", + "prevValue", + "preventDefault", + "preventExtensions", + "preventSilentAccess", + "previousElementSibling", + "previousNode", + "previousPage", + "previousRect", + "previousScale", + "previousSibling", + "previousTranslate", + "primaryKey", + "primitiveType", + "primitiveUnits", + "principals", + "print", + "priority", + "privateKey", + "probablySupportsContext", + "process", + "processIceMessage", + "processingEnd", + "processingStart", + "product", + "productId", + "productName", + "productSub", + "profile", + "profileEnd", + "profiles", + "projectionMatrix", + "promise", + "prompt", + "properties", + "propertyIsEnumerable", + "propertyName", + "protocol", + "protocolLong", + "prototype", + "provider", + "pseudoClass", + "pseudoElement", + "pt", + "publicId", + "publicKey", + "published", + "pulse", + "push", + "pushManager", + "pushNotification", + "pushState", + "put", + "putImageData", + "px", + "quadraticCurveTo", + "qualifier", + "quaternion", + "query", + "queryCommandEnabled", + "queryCommandIndeterm", + "queryCommandState", + "queryCommandSupported", + "queryCommandText", + "queryCommandValue", + "querySelector", + "querySelectorAll", + "queueMicrotask", + "quote", + "quotes", + "r", + "r1", + "r2", + "race", + "rad", + "radiogroup", + "radiusX", + "radiusY", + "random", + "range", + "rangeCount", + "rangeMax", + "rangeMin", + "rangeOffset", + "rangeOverflow", + "rangeParent", + "rangeUnderflow", + "rate", + "ratio", + "raw", + "rawId", + "read", + "readAsArrayBuffer", + "readAsBinaryString", + "readAsBlob", + "readAsDataURL", + "readAsText", + "readBuffer", + "readEntries", + "readOnly", + "readPixels", + "readReportRequested", + "readText", + "readValue", + "readable", + "ready", + "readyState", + "reason", + "reboot", + "receivedAlert", + "receiver", + "receivers", + "recipient", + "reconnect", + "recordNumber", + "recordsAvailable", + "recordset", + "rect", + "red", + "redEyeReduction", + "redirect", + "redirectCount", + "redirectEnd", + "redirectStart", + "redirected", + "reduce", + "reduceRight", + "reduction", + "refDistance", + "refX", + "refY", + "referenceNode", + "referenceSpace", + "referrer", + "referrerPolicy", + "refresh", + "region", + "regionAnchorX", + "regionAnchorY", + "regionId", + "regions", + "register", + "registerContentHandler", + "registerElement", + "registerProperty", + "registerProtocolHandler", + "reject", + "rel", + "relList", + "relatedAddress", + "relatedNode", + "relatedPort", + "relatedTarget", + "release", + "releaseCapture", + "releaseEvents", + "releaseInterface", + "releaseLock", + "releasePointerCapture", + "releaseShaderCompiler", + "reliable", + "reliableWrite", + "reload", + "rem", + "remainingSpace", + "remote", + "remoteDescription", + "remove", + "removeAllRanges", + "removeAttribute", + "removeAttributeNS", + "removeAttributeNode", + "removeBehavior", + "removeChild", + "removeCue", + "removeEventListener", + "removeFilter", + "removeImport", + "removeItem", + "removeListener", + "removeNamedItem", + "removeNamedItemNS", + "removeNode", + "removeParameter", + "removeProperty", + "removeRange", + "removeRegion", + "removeRule", + "removeSiteSpecificTrackingException", + "removeSourceBuffer", + "removeStream", + "removeTrack", + "removeVariable", + "removeWakeLockListener", + "removeWebWideTrackingException", + "removed", + "removedNodes", + "renderHeight", + "renderState", + "renderTime", + "renderWidth", + "renderbufferStorage", + "renderbufferStorageMultisample", + "renderedBuffer", + "renderingMode", + "renotify", + "repeat", + "replace", + "replaceAdjacentText", + "replaceAll", + "replaceChild", + "replaceChildren", + "replaceData", + "replaceId", + "replaceItem", + "replaceNode", + "replaceState", + "replaceSync", + "replaceTrack", + "replaceWholeText", + "replaceWith", + "reportValidity", + "request", + "requestAnimationFrame", + "requestAutocomplete", + "requestData", + "requestDevice", + "requestFrame", + "requestFullscreen", + "requestHitTestSource", + "requestHitTestSourceForTransientInput", + "requestId", + "requestIdleCallback", + "requestMIDIAccess", + "requestMediaKeySystemAccess", + "requestPermission", + "requestPictureInPicture", + "requestPointerLock", + "requestPresent", + "requestReferenceSpace", + "requestSession", + "requestStart", + "requestStorageAccess", + "requestSubmit", + "requestVideoFrameCallback", + "requestingWindow", + "requireInteraction", + "required", + "requiredExtensions", + "requiredFeatures", + "reset", + "resetPose", + "resetTransform", + "resize", + "resizeBy", + "resizeTo", + "resolve", + "response", + "responseBody", + "responseEnd", + "responseReady", + "responseStart", + "responseText", + "responseType", + "responseURL", + "responseXML", + "restartIce", + "restore", + "result", + "resultIndex", + "resultType", + "results", + "resume", + "resumeProfilers", + "resumeTransformFeedback", + "retry", + "returnValue", + "rev", + "reverse", + "reversed", + "revocable", + "revokeObjectURL", + "rgbColor", + "right", + "rightContext", + "rightDegrees", + "rightMargin", + "rightProjectionMatrix", + "rightViewMatrix", + "role", + "rolloffFactor", + "root", + "rootBounds", + "rootElement", + "rootMargin", + "rotate", + "rotateAxisAngle", + "rotateAxisAngleSelf", + "rotateFromVector", + "rotateFromVectorSelf", + "rotateSelf", + "rotation", + "rotationAngle", + "rotationRate", + "round", + "row-gap", + "rowGap", + "rowIndex", + "rowSpan", + "rows", + "rtcpTransport", + "rtt", + "ruby-align", + "ruby-position", + "rubyAlign", + "rubyOverhang", + "rubyPosition", + "rules", + "runtime", + "runtimeStyle", + "rx", + "ry", + "s", + "safari", + "sample", + "sampleCoverage", + "sampleRate", + "samplerParameterf", + "samplerParameteri", + "sandbox", + "save", + "saveData", + "scale", + "scale3d", + "scale3dSelf", + "scaleNonUniform", + "scaleNonUniformSelf", + "scaleSelf", + "scheme", + "scissor", + "scope", + "scopeName", + "scoped", + "screen", + "screenBrightness", + "screenEnabled", + "screenLeft", + "screenPixelToMillimeterX", + "screenPixelToMillimeterY", + "screenTop", + "screenX", + "screenY", + "scriptURL", + "scripts", + "scroll", + "scroll-behavior", + "scroll-margin", + "scroll-margin-block", + "scroll-margin-block-end", + "scroll-margin-block-start", + "scroll-margin-bottom", + "scroll-margin-inline", + "scroll-margin-inline-end", + "scroll-margin-inline-start", + "scroll-margin-left", + "scroll-margin-right", + "scroll-margin-top", + "scroll-padding", + "scroll-padding-block", + "scroll-padding-block-end", + "scroll-padding-block-start", + "scroll-padding-bottom", + "scroll-padding-inline", + "scroll-padding-inline-end", + "scroll-padding-inline-start", + "scroll-padding-left", + "scroll-padding-right", + "scroll-padding-top", + "scroll-snap-align", + "scroll-snap-type", + "scrollAmount", + "scrollBehavior", + "scrollBy", + "scrollByLines", + "scrollByPages", + "scrollDelay", + "scrollHeight", + "scrollIntoView", + "scrollIntoViewIfNeeded", + "scrollLeft", + "scrollLeftMax", + "scrollMargin", + "scrollMarginBlock", + "scrollMarginBlockEnd", + "scrollMarginBlockStart", + "scrollMarginBottom", + "scrollMarginInline", + "scrollMarginInlineEnd", + "scrollMarginInlineStart", + "scrollMarginLeft", + "scrollMarginRight", + "scrollMarginTop", + "scrollMaxX", + "scrollMaxY", + "scrollPadding", + "scrollPaddingBlock", + "scrollPaddingBlockEnd", + "scrollPaddingBlockStart", + "scrollPaddingBottom", + "scrollPaddingInline", + "scrollPaddingInlineEnd", + "scrollPaddingInlineStart", + "scrollPaddingLeft", + "scrollPaddingRight", + "scrollPaddingTop", + "scrollRestoration", + "scrollSnapAlign", + "scrollSnapType", + "scrollTo", + "scrollTop", + "scrollTopMax", + "scrollWidth", + "scrollX", + "scrollY", + "scrollbar-color", + "scrollbar-width", + "scrollbar3dLightColor", + "scrollbarArrowColor", + "scrollbarBaseColor", + "scrollbarColor", + "scrollbarDarkShadowColor", + "scrollbarFaceColor", + "scrollbarHighlightColor", + "scrollbarShadowColor", + "scrollbarTrackColor", + "scrollbarWidth", + "scrollbars", + "scrolling", + "scrollingElement", + "sctp", + "sctpCauseCode", + "sdp", + "sdpLineNumber", + "sdpMLineIndex", + "sdpMid", + "seal", + "search", + "searchBox", + "searchBoxJavaBridge_", + "searchParams", + "sectionRowIndex", + "secureConnectionStart", + "security", + "seed", + "seekToNextFrame", + "seekable", + "seeking", + "select", + "selectAllChildren", + "selectAlternateInterface", + "selectConfiguration", + "selectNode", + "selectNodeContents", + "selectNodes", + "selectSingleNode", + "selectSubString", + "selected", + "selectedIndex", + "selectedOptions", + "selectedStyleSheetSet", + "selectedStylesheetSet", + "selection", + "selectionDirection", + "selectionEnd", + "selectionStart", + "selector", + "selectorText", + "self", + "send", + "sendAsBinary", + "sendBeacon", + "sender", + "sentAlert", + "sentTimestamp", + "separator", + "serialNumber", + "serializeToString", + "serverTiming", + "service", + "serviceWorker", + "session", + "sessionId", + "sessionStorage", + "set", + "setActionHandler", + "setActive", + "setAlpha", + "setAppBadge", + "setAttribute", + "setAttributeNS", + "setAttributeNode", + "setAttributeNodeNS", + "setBaseAndExtent", + "setBigInt64", + "setBigUint64", + "setBingCurrentSearchDefault", + "setCapture", + "setCodecPreferences", + "setColor", + "setCompositeOperation", + "setConfiguration", + "setCurrentTime", + "setCustomValidity", + "setData", + "setDate", + "setDragImage", + "setEnd", + "setEndAfter", + "setEndBefore", + "setEndPoint", + "setFillColor", + "setFilterRes", + "setFloat32", + "setFloat64", + "setFloatValue", + "setFormValue", + "setFullYear", + "setHeaderValue", + "setHours", + "setIdentityProvider", + "setImmediate", + "setInt16", + "setInt32", + "setInt8", + "setInterval", + "setItem", + "setKeyframes", + "setLineCap", + "setLineDash", + "setLineJoin", + "setLineWidth", + "setLiveSeekableRange", + "setLocalDescription", + "setMatrix", + "setMatrixValue", + "setMediaKeys", + "setMilliseconds", + "setMinutes", + "setMiterLimit", + "setMonth", + "setNamedItem", + "setNamedItemNS", + "setNonUserCodeExceptions", + "setOrientToAngle", + "setOrientToAuto", + "setOrientation", + "setOverrideHistoryNavigationMode", + "setPaint", + "setParameter", + "setParameters", + "setPeriodicWave", + "setPointerCapture", + "setPosition", + "setPositionState", + "setPreference", + "setProperty", + "setPrototypeOf", + "setRGBColor", + "setRGBColorICCColor", + "setRadius", + "setRangeText", + "setRemoteDescription", + "setRequestHeader", + "setResizable", + "setResourceTimingBufferSize", + "setRotate", + "setScale", + "setSeconds", + "setSelectionRange", + "setServerCertificate", + "setShadow", + "setSinkId", + "setSkewX", + "setSkewY", + "setStart", + "setStartAfter", + "setStartBefore", + "setStdDeviation", + "setStreams", + "setStringValue", + "setStrokeColor", + "setSuggestResult", + "setTargetAtTime", + "setTargetValueAtTime", + "setTime", + "setTimeout", + "setTransform", + "setTranslate", + "setUTCDate", + "setUTCFullYear", + "setUTCHours", + "setUTCMilliseconds", + "setUTCMinutes", + "setUTCMonth", + "setUTCSeconds", + "setUint16", + "setUint32", + "setUint8", + "setUri", + "setValidity", + "setValueAtTime", + "setValueCurveAtTime", + "setVariable", + "setVelocity", + "setVersion", + "setYear", + "settingName", + "settingValue", + "sex", + "shaderSource", + "shadowBlur", + "shadowColor", + "shadowOffsetX", + "shadowOffsetY", + "shadowRoot", + "shape", + "shape-image-threshold", + "shape-margin", + "shape-outside", + "shape-rendering", + "shapeImageThreshold", + "shapeMargin", + "shapeOutside", + "shapeRendering", + "sheet", + "shift", + "shiftKey", + "shiftLeft", + "shippingAddress", + "shippingOption", + "shippingType", + "show", + "showHelp", + "showModal", + "showModalDialog", + "showModelessDialog", + "showNotification", + "sidebar", + "sign", + "signal", + "signalingState", + "signature", + "silent", + "sin", + "singleNodeValue", + "sinh", + "sinkId", + "sittingToStandingTransform", + "size", + "sizeToContent", + "sizeX", + "sizeZ", + "sizes", + "skewX", + "skewXSelf", + "skewY", + "skewYSelf", + "slice", + "slope", + "slot", + "small", + "smil", + "smooth", + "smoothingTimeConstant", + "snapToLines", + "snapshotItem", + "snapshotLength", + "some", + "sort", + "sortingCode", + "source", + "sourceBuffer", + "sourceBuffers", + "sourceCapabilities", + "sourceFile", + "sourceIndex", + "sources", + "spacing", + "span", + "speak", + "speakAs", + "speaking", + "species", + "specified", + "specularConstant", + "specularExponent", + "speechSynthesis", + "speed", + "speedOfSound", + "spellcheck", + "splice", + "split", + "splitText", + "spreadMethod", + "sqrt", + "src", + "srcElement", + "srcFilter", + "srcObject", + "srcUrn", + "srcdoc", + "srclang", + "srcset", + "stack", + "stackTraceLimit", + "stacktrace", + "stageParameters", + "standalone", + "standby", + "start", + "startContainer", + "startIce", + "startMessages", + "startNotifications", + "startOffset", + "startProfiling", + "startRendering", + "startShark", + "startTime", + "startsWith", + "state", + "status", + "statusCode", + "statusMessage", + "statusText", + "statusbar", + "stdDeviationX", + "stdDeviationY", + "stencilFunc", + "stencilFuncSeparate", + "stencilMask", + "stencilMaskSeparate", + "stencilOp", + "stencilOpSeparate", + "step", + "stepDown", + "stepMismatch", + "stepUp", + "sticky", + "stitchTiles", + "stop", + "stop-color", + "stop-opacity", + "stopColor", + "stopImmediatePropagation", + "stopNotifications", + "stopOpacity", + "stopProfiling", + "stopPropagation", + "stopShark", + "stopped", + "storage", + "storageArea", + "storageName", + "storageStatus", + "store", + "storeSiteSpecificTrackingException", + "storeWebWideTrackingException", + "stpVersion", + "stream", + "streams", + "stretch", + "strike", + "string", + "stringValue", + "stringify", + "stroke", + "stroke-dasharray", + "stroke-dashoffset", + "stroke-linecap", + "stroke-linejoin", + "stroke-miterlimit", + "stroke-opacity", + "stroke-width", + "strokeDasharray", + "strokeDashoffset", + "strokeLinecap", + "strokeLinejoin", + "strokeMiterlimit", + "strokeOpacity", + "strokeRect", + "strokeStyle", + "strokeText", + "strokeWidth", + "style", + "styleFloat", + "styleMap", + "styleMedia", + "styleSheet", + "styleSheetSets", + "styleSheets", + "sub", + "subarray", + "subject", + "submit", + "submitFrame", + "submitter", + "subscribe", + "substr", + "substring", + "substringData", + "subtle", + "subtree", + "suffix", + "suffixes", + "summary", + "sup", + "supported", + "supportedContentEncodings", + "supportedEntryTypes", + "supports", + "supportsSession", + "surfaceScale", + "surroundContents", + "suspend", + "suspendRedraw", + "swapCache", + "swapNode", + "sweepFlag", + "symbols", + "sync", + "sysexEnabled", + "system", + "systemCode", + "systemId", + "systemLanguage", + "systemXDPI", + "systemYDPI", + "tBodies", + "tFoot", + "tHead", + "tabIndex", + "table", + "table-layout", + "tableLayout", + "tableValues", + "tag", + "tagName", + "tagUrn", + "tags", + "taintEnabled", + "takePhoto", + "takeRecords", + "tan", + "tangentialPressure", + "tanh", + "target", + "targetElement", + "targetRayMode", + "targetRaySpace", + "targetTouches", + "targetX", + "targetY", + "tcpType", + "tee", + "tel", + "terminate", + "test", + "texImage2D", + "texImage3D", + "texParameterf", + "texParameteri", + "texStorage2D", + "texStorage3D", + "texSubImage2D", + "texSubImage3D", + "text", + "text-align", + "text-align-last", + "text-anchor", + "text-combine-upright", + "text-decoration", + "text-decoration-color", + "text-decoration-line", + "text-decoration-skip-ink", + "text-decoration-style", + "text-decoration-thickness", + "text-emphasis", + "text-emphasis-color", + "text-emphasis-position", + "text-emphasis-style", + "text-indent", + "text-justify", + "text-orientation", + "text-overflow", + "text-rendering", + "text-shadow", + "text-transform", + "text-underline-offset", + "text-underline-position", + "textAlign", + "textAlignLast", + "textAnchor", + "textAutospace", + "textBaseline", + "textCombineUpright", + "textContent", + "textDecoration", + "textDecorationBlink", + "textDecorationColor", + "textDecorationLine", + "textDecorationLineThrough", + "textDecorationNone", + "textDecorationOverline", + "textDecorationSkipInk", + "textDecorationStyle", + "textDecorationThickness", + "textDecorationUnderline", + "textEmphasis", + "textEmphasisColor", + "textEmphasisPosition", + "textEmphasisStyle", + "textIndent", + "textJustify", + "textJustifyTrim", + "textKashida", + "textKashidaSpace", + "textLength", + "textOrientation", + "textOverflow", + "textRendering", + "textShadow", + "textTracks", + "textTransform", + "textUnderlineOffset", + "textUnderlinePosition", + "then", + "threadId", + "threshold", + "thresholds", + "tiltX", + "tiltY", + "time", + "timeEnd", + "timeLog", + "timeOrigin", + "timeRemaining", + "timeStamp", + "timecode", + "timeline", + "timelineTime", + "timeout", + "timestamp", + "timestampOffset", + "timing", + "title", + "to", + "toArray", + "toBlob", + "toDataURL", + "toDateString", + "toElement", + "toExponential", + "toFixed", + "toFloat32Array", + "toFloat64Array", + "toGMTString", + "toISOString", + "toJSON", + "toLocaleDateString", + "toLocaleFormat", + "toLocaleLowerCase", + "toLocaleString", + "toLocaleTimeString", + "toLocaleUpperCase", + "toLowerCase", + "toMatrix", + "toMethod", + "toPrecision", + "toPrimitive", + "toSdp", + "toSource", + "toStaticHTML", + "toString", + "toStringTag", + "toSum", + "toTimeString", + "toUTCString", + "toUpperCase", + "toggle", + "toggleAttribute", + "toggleLongPressEnabled", + "tone", + "toneBuffer", + "tooLong", + "tooShort", + "toolbar", + "top", + "topMargin", + "total", + "totalFrameDelay", + "totalVideoFrames", + "touch-action", + "touchAction", + "touched", + "touches", + "trace", + "track", + "trackVisibility", + "transaction", + "transactions", + "transceiver", + "transferControlToOffscreen", + "transferFromImageBitmap", + "transferImageBitmap", + "transferIn", + "transferOut", + "transferSize", + "transferToImageBitmap", + "transform", + "transform-box", + "transform-origin", + "transform-style", + "transformBox", + "transformFeedbackVaryings", + "transformOrigin", + "transformPoint", + "transformString", + "transformStyle", + "transformToDocument", + "transformToFragment", + "transition", + "transition-delay", + "transition-duration", + "transition-property", + "transition-timing-function", + "transitionDelay", + "transitionDuration", + "transitionProperty", + "transitionTimingFunction", + "translate", + "translateSelf", + "translationX", + "translationY", + "transport", + "trim", + "trimEnd", + "trimLeft", + "trimRight", + "trimStart", + "trueSpeed", + "trunc", + "truncate", + "trustedTypes", + "turn", + "twist", + "type", + "typeDetail", + "typeMismatch", + "typeMustMatch", + "types", + "u2f", + "ubound", + "uint16", + "uint32", + "uint8", + "uint8Clamped", + "undefined", + "unescape", + "uneval", + "unicode", + "unicode-bidi", + "unicodeBidi", + "unicodeRange", + "uniform1f", + "uniform1fv", + "uniform1i", + "uniform1iv", + "uniform1ui", + "uniform1uiv", + "uniform2f", + "uniform2fv", + "uniform2i", + "uniform2iv", + "uniform2ui", + "uniform2uiv", + "uniform3f", + "uniform3fv", + "uniform3i", + "uniform3iv", + "uniform3ui", + "uniform3uiv", + "uniform4f", + "uniform4fv", + "uniform4i", + "uniform4iv", + "uniform4ui", + "uniform4uiv", + "uniformBlockBinding", + "uniformMatrix2fv", + "uniformMatrix2x3fv", + "uniformMatrix2x4fv", + "uniformMatrix3fv", + "uniformMatrix3x2fv", + "uniformMatrix3x4fv", + "uniformMatrix4fv", + "uniformMatrix4x2fv", + "uniformMatrix4x3fv", + "unique", + "uniqueID", + "uniqueNumber", + "unit", + "unitType", + "units", + "unloadEventEnd", + "unloadEventStart", + "unlock", + "unmount", + "unobserve", + "unpause", + "unpauseAnimations", + "unreadCount", + "unregister", + "unregisterContentHandler", + "unregisterProtocolHandler", + "unscopables", + "unselectable", + "unshift", + "unsubscribe", + "unsuspendRedraw", + "unsuspendRedrawAll", + "unwatch", + "unwrapKey", + "upDegrees", + "upX", + "upY", + "upZ", + "update", + "updateCommands", + "updateIce", + "updateInterval", + "updatePlaybackRate", + "updateRenderState", + "updateSettings", + "updateTiming", + "updateViaCache", + "updateWith", + "updated", + "updating", + "upgrade", + "upload", + "uploadTotal", + "uploaded", + "upper", + "upperBound", + "upperOpen", + "uri", + "url", + "urn", + "urns", + "usages", + "usb", + "usbVersionMajor", + "usbVersionMinor", + "usbVersionSubminor", + "useCurrentView", + "useMap", + "useProgram", + "usedSpace", + "user-select", + "userActivation", + "userAgent", + "userChoice", + "userHandle", + "userHint", + "userLanguage", + "userSelect", + "userVisibleOnly", + "username", + "usernameFragment", + "utterance", + "uuid", + "v8BreakIterator", + "vAlign", + "vLink", + "valid", + "validate", + "validateProgram", + "validationMessage", + "validity", + "value", + "valueAsDate", + "valueAsNumber", + "valueAsString", + "valueInSpecifiedUnits", + "valueMissing", + "valueOf", + "valueText", + "valueType", + "values", + "variable", + "variant", + "variationSettings", + "vector-effect", + "vectorEffect", + "velocityAngular", + "velocityExpansion", + "velocityX", + "velocityY", + "vendor", + "vendorId", + "vendorSub", + "verify", + "version", + "vertexAttrib1f", + "vertexAttrib1fv", + "vertexAttrib2f", + "vertexAttrib2fv", + "vertexAttrib3f", + "vertexAttrib3fv", + "vertexAttrib4f", + "vertexAttrib4fv", + "vertexAttribDivisor", + "vertexAttribDivisorANGLE", + "vertexAttribI4i", + "vertexAttribI4iv", + "vertexAttribI4ui", + "vertexAttribI4uiv", + "vertexAttribIPointer", + "vertexAttribPointer", + "vertical", + "vertical-align", + "verticalAlign", + "verticalOverflow", + "vh", + "vibrate", + "vibrationActuator", + "videoBitsPerSecond", + "videoHeight", + "videoTracks", + "videoWidth", + "view", + "viewBox", + "viewBoxString", + "viewTarget", + "viewTargetString", + "viewport", + "viewportAnchorX", + "viewportAnchorY", + "viewportElement", + "views", + "violatedDirective", + "visibility", + "visibilityState", + "visible", + "visualViewport", + "vlinkColor", + "vmax", + "vmin", + "voice", + "voiceURI", + "volume", + "vrml", + "vspace", + "vw", + "w", + "wait", + "waitSync", + "waiting", + "wake", + "wakeLock", + "wand", + "warn", + "wasClean", + "wasDiscarded", + "watch", + "watchAvailability", + "watchPosition", + "webdriver", + "webkitAddKey", + "webkitAlignContent", + "webkitAlignItems", + "webkitAlignSelf", + "webkitAnimation", + "webkitAnimationDelay", + "webkitAnimationDirection", + "webkitAnimationDuration", + "webkitAnimationFillMode", + "webkitAnimationIterationCount", + "webkitAnimationName", + "webkitAnimationPlayState", + "webkitAnimationTimingFunction", + "webkitAppearance", + "webkitAudioContext", + "webkitAudioDecodedByteCount", + "webkitAudioPannerNode", + "webkitBackfaceVisibility", + "webkitBackground", + "webkitBackgroundAttachment", + "webkitBackgroundClip", + "webkitBackgroundColor", + "webkitBackgroundImage", + "webkitBackgroundOrigin", + "webkitBackgroundPosition", + "webkitBackgroundPositionX", + "webkitBackgroundPositionY", + "webkitBackgroundRepeat", + "webkitBackgroundSize", + "webkitBackingStorePixelRatio", + "webkitBorderBottomLeftRadius", + "webkitBorderBottomRightRadius", + "webkitBorderImage", + "webkitBorderImageOutset", + "webkitBorderImageRepeat", + "webkitBorderImageSlice", + "webkitBorderImageSource", + "webkitBorderImageWidth", + "webkitBorderRadius", + "webkitBorderTopLeftRadius", + "webkitBorderTopRightRadius", + "webkitBoxAlign", + "webkitBoxDirection", + "webkitBoxFlex", + "webkitBoxOrdinalGroup", + "webkitBoxOrient", + "webkitBoxPack", + "webkitBoxShadow", + "webkitBoxSizing", + "webkitCancelAnimationFrame", + "webkitCancelFullScreen", + "webkitCancelKeyRequest", + "webkitCancelRequestAnimationFrame", + "webkitClearResourceTimings", + "webkitClosedCaptionsVisible", + "webkitConvertPointFromNodeToPage", + "webkitConvertPointFromPageToNode", + "webkitCreateShadowRoot", + "webkitCurrentFullScreenElement", + "webkitCurrentPlaybackTargetIsWireless", + "webkitDecodedFrameCount", + "webkitDirectionInvertedFromDevice", + "webkitDisplayingFullscreen", + "webkitDroppedFrameCount", + "webkitEnterFullScreen", + "webkitEnterFullscreen", + "webkitEntries", + "webkitExitFullScreen", + "webkitExitFullscreen", + "webkitExitPointerLock", + "webkitFilter", + "webkitFlex", + "webkitFlexBasis", + "webkitFlexDirection", + "webkitFlexFlow", + "webkitFlexGrow", + "webkitFlexShrink", + "webkitFlexWrap", + "webkitFullScreenKeyboardInputAllowed", + "webkitFullscreenElement", + "webkitFullscreenEnabled", + "webkitGenerateKeyRequest", + "webkitGetAsEntry", + "webkitGetDatabaseNames", + "webkitGetEntries", + "webkitGetEntriesByName", + "webkitGetEntriesByType", + "webkitGetFlowByName", + "webkitGetGamepads", + "webkitGetImageDataHD", + "webkitGetNamedFlows", + "webkitGetRegionFlowRanges", + "webkitGetUserMedia", + "webkitHasClosedCaptions", + "webkitHidden", + "webkitIDBCursor", + "webkitIDBDatabase", + "webkitIDBDatabaseError", + "webkitIDBDatabaseException", + "webkitIDBFactory", + "webkitIDBIndex", + "webkitIDBKeyRange", + "webkitIDBObjectStore", + "webkitIDBRequest", + "webkitIDBTransaction", + "webkitImageSmoothingEnabled", + "webkitIndexedDB", + "webkitInitMessageEvent", + "webkitIsFullScreen", + "webkitJustifyContent", + "webkitKeys", + "webkitLineClamp", + "webkitLineDashOffset", + "webkitLockOrientation", + "webkitMask", + "webkitMaskClip", + "webkitMaskComposite", + "webkitMaskImage", + "webkitMaskOrigin", + "webkitMaskPosition", + "webkitMaskPositionX", + "webkitMaskPositionY", + "webkitMaskRepeat", + "webkitMaskSize", + "webkitMatchesSelector", + "webkitMediaStream", + "webkitNotifications", + "webkitOfflineAudioContext", + "webkitOrder", + "webkitOrientation", + "webkitPeerConnection00", + "webkitPersistentStorage", + "webkitPerspective", + "webkitPerspectiveOrigin", + "webkitPointerLockElement", + "webkitPostMessage", + "webkitPreservesPitch", + "webkitPutImageDataHD", + "webkitRTCPeerConnection", + "webkitRegionOverset", + "webkitRelativePath", + "webkitRequestAnimationFrame", + "webkitRequestFileSystem", + "webkitRequestFullScreen", + "webkitRequestFullscreen", + "webkitRequestPointerLock", + "webkitResolveLocalFileSystemURL", + "webkitSetMediaKeys", + "webkitSetResourceTimingBufferSize", + "webkitShadowRoot", + "webkitShowPlaybackTargetPicker", + "webkitSlice", + "webkitSpeechGrammar", + "webkitSpeechGrammarList", + "webkitSpeechRecognition", + "webkitSpeechRecognitionError", + "webkitSpeechRecognitionEvent", + "webkitStorageInfo", + "webkitSupportsFullscreen", + "webkitTemporaryStorage", + "webkitTextFillColor", + "webkitTextSizeAdjust", + "webkitTextStroke", + "webkitTextStrokeColor", + "webkitTextStrokeWidth", + "webkitTransform", + "webkitTransformOrigin", + "webkitTransformStyle", + "webkitTransition", + "webkitTransitionDelay", + "webkitTransitionDuration", + "webkitTransitionProperty", + "webkitTransitionTimingFunction", + "webkitURL", + "webkitUnlockOrientation", + "webkitUserSelect", + "webkitVideoDecodedByteCount", + "webkitVisibilityState", + "webkitWirelessVideoPlaybackDisabled", + "webkitdirectory", + "webkitdropzone", + "webstore", + "weight", + "whatToShow", + "wheelDelta", + "wheelDeltaX", + "wheelDeltaY", + "whenDefined", + "which", + "white-space", + "whiteSpace", + "wholeText", + "widows", + "width", + "will-change", + "willChange", + "willValidate", + "window", + "withCredentials", + "word-break", + "word-spacing", + "word-wrap", + "wordBreak", + "wordSpacing", + "wordWrap", + "workerStart", + "wrap", + "wrapKey", + "writable", + "writableAuxiliaries", + "write", + "writeText", + "writeValue", + "writeWithoutResponse", + "writeln", + "writing-mode", + "writingMode", + "x", + "x1", + "x2", + "xChannelSelector", + "xmlEncoding", + "xmlStandalone", + "xmlVersion", + "xmlbase", + "xmllang", + "xmlspace", + "xor", + "xr", + "y", + "y1", + "y2", + "yChannelSelector", + "yandex", + "z", + "z-index", + "zIndex", + "zoom", + "zoomAndPan", + "zoomRectScreen" +] \ No newline at end of file From cce18f54c153604b02a7dcca9afb66a87321a840 Mon Sep 17 00:00:00 2001 From: sanex Date: Thu, 3 Feb 2022 23:29:22 +0300 Subject: [PATCH 10/14] Restored test options --- test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts b/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts index 0c2e58dfb..f2af0051c 100644 --- a/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts +++ b/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts @@ -25,7 +25,7 @@ describe('JavaScriptObfuscator runtime eval', function () { controlFlowFlatteningThreshold: 1, deadCodeInjection: true, deadCodeInjectionThreshold: 1, - debugProtection: false, + debugProtection: true, disableConsoleOutput: true, domainLock: ['obfuscator.io'], log: true, @@ -260,17 +260,17 @@ describe('JavaScriptObfuscator runtime eval', function () { stringArray: false }, { - debugProtection: false, + debugProtection: true, selfDefending: false, stringArray: false }, { - debugProtection: false, + debugProtection: true, selfDefending: true, stringArray: false }, { - debugProtection: false, + debugProtection: true, selfDefending: true, stringArray: true } From ab614e596fa66bebfb07b55b8d1ce054a17d6df4 Mon Sep 17 00:00:00 2001 From: sanex Date: Fri, 4 Feb 2022 22:32:14 +0300 Subject: [PATCH 11/14] Some refactoring --- .../FunctionControlFlowTransformer.ts | 8 +++-- .../StringArrayControlFlowTransformer.ts | 4 +-- .../StringArrayCallControlFlowReplacer.ts | 36 ++++++++++++++++--- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts b/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts index 489dc0706..1e656219b 100644 --- a/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts +++ b/src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts @@ -252,11 +252,13 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { * @returns {TControlFlowStorage} */ protected getControlFlowStorage (hostNode: TNodeWithStatements): IControlFlowStorage { - const controlFlowStorage: IControlFlowStorage = this.controlFlowStorageFactory(); + let controlFlowStorage: IControlFlowStorage; const hostControlFlowStorage: IControlFlowStorage | null = this.controlFlowData.get(hostNode) ?? null; - if (hostControlFlowStorage) { + if (!hostControlFlowStorage) { + controlFlowStorage = this.controlFlowStorageFactory(); + } else { const existingControlFlowStorageNode: ESTree.VariableDeclaration | null = this.hostNodesWithControlFlowNode.get(hostNode) ?? null; @@ -264,7 +266,7 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { NodeAppender.remove(hostNode, existingControlFlowStorageNode); } - controlFlowStorage.mergeWith(hostControlFlowStorage, true); + controlFlowStorage = hostControlFlowStorage; } this.controlFlowData.set(hostNode, controlFlowStorage); diff --git a/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts b/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts index 643c5eed9..974380381 100644 --- a/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts +++ b/src/node-transformers/control-flow-transformers/StringArrayControlFlowTransformer.ts @@ -116,10 +116,10 @@ export class StringArrayControlFlowTransformer extends FunctionControlFlowTransf functionNode: ESTree.Function, controlFlowStorage: IControlFlowStorage ): estraverse.VisitorOption | ESTree.Node { - const shouldBreakTraverse = NodeGuards.isVariableDeclarationNode(node) + const isControlFlowStorageNode = NodeGuards.isVariableDeclarationNode(node) && this.controlFlowStorageNodes.has(node); - if (shouldBreakTraverse) { + if (isControlFlowStorageNode) { return estraverse.VisitorOption.Break; } diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts index b25fac7f3..867084bee 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts @@ -6,6 +6,7 @@ import * as ESTree from 'estree'; import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory'; import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TInitialData } from '../../../types/TInitialData'; +import { TStatement } from '../../../types/node/TStatement'; import { IControlFlowStorage } from '../../../interfaces/storages/control-flow-transformers/IControlFlowStorage'; import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode'; @@ -14,17 +15,21 @@ import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator'; import { ControlFlowCustomNode } from '../../../enums/custom-nodes/ControlFlowCustomNode'; +import { AbstractControlFlowReplacer } from './AbstractControlFlowReplacer'; +import { NodeGuards } from '../../../node/NodeGuards'; +import { NodeLiteralUtils } from '../../../node/NodeLiteralUtils'; import { NodeMetadata } from '../../../node/NodeMetadata'; -import { StringLiteralControlFlowReplacer } from './StringLiteralControlFlowReplacer'; +import { + StringLiteralControlFlowStorageCallNode +} from '../../../custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/StringLiteralControlFlowStorageCallNode'; import { StringLiteralNode } from '../../../custom-nodes/control-flow-flattening-nodes/StringLiteralNode'; -import { NodeLiteralUtils } from '../../../node/NodeLiteralUtils'; @injectable() -export class StringArrayCallControlFlowReplacer extends StringLiteralControlFlowReplacer { +export class StringArrayCallControlFlowReplacer extends AbstractControlFlowReplacer { /** * @type {number} */ - protected static override readonly usingExistingIdentifierChance: number = 0.5; + private static readonly usingExistingIdentifierChance: number = 0.5; /** * @param {TControlFlowCustomNodeFactory} controlFlowCustomNodeFactory @@ -101,4 +106,27 @@ export class StringArrayCallControlFlowReplacer extends StringLiteralControlFlow return key; } + + /** + * @param {string} controlFlowStorageId + * @param {string} storageKey + * @returns {NodeGuards} + */ + protected getControlFlowStorageCallNode ( + controlFlowStorageId: string, + storageKey: string + ): ESTree.Node { + const controlFlowStorageCallCustomNode: ICustomNode> = + this.controlFlowCustomNodeFactory(ControlFlowCustomNode.StringLiteralControlFlowStorageCallNode); + + controlFlowStorageCallCustomNode.initialize(controlFlowStorageId, storageKey); + + const statementNode: TStatement = controlFlowStorageCallCustomNode.getNode()[0]; + + if (!statementNode || !NodeGuards.isExpressionStatementNode(statementNode)) { + throw new Error('`controlFlowStorageCallCustomNode.getNode()[0]` should returns array with `ExpressionStatement` node'); + } + + return statementNode.expression; + } } From aa49f9ccea0cbfa8223ffa60736ceca5db833085 Mon Sep 17 00:00:00 2001 From: sanex Date: Sat, 5 Feb 2022 18:06:36 +0300 Subject: [PATCH 12/14] Added tests --- .../modules/custom-nodes/CustomNodesModule.ts | 10 +- .../{StringLiteralNode.ts => LiteralNode.ts} | 18 +- .../custom-nodes/ControlFlowCustomNode.ts | 4 +- .../StringArrayCallControlFlowReplacer.ts | 10 +- .../StringLiteralControlFlowReplacer.ts | 10 +- .../StringArrayControlFlowTransformer.spec.ts | 427 ++++++++++++++++++ .../fixtures/input-1.js | 3 + .../fixtures/input-2.js | 7 + .../fixtures/multiple-items.js | 4 + .../fixtures/multiple-storages.js | 7 + .../prevailing-kind-of-variables-const.js | 3 + .../prevailing-kind-of-variables-let.js | 3 + .../prevailing-kind-of-variables-var.js | 3 + .../fixtures/root-block-scope-1.js | 1 + test/index.spec.ts | 1 + 15 files changed, 485 insertions(+), 26 deletions(-) rename src/custom-nodes/control-flow-flattening-nodes/{StringLiteralNode.ts => LiteralNode.ts} (84%) create mode 100644 test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/StringArrayControlFlowTransformer.spec.ts create mode 100644 test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/input-1.js create mode 100644 test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/input-2.js create mode 100644 test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/multiple-items.js create mode 100644 test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/multiple-storages.js create mode 100644 test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/prevailing-kind-of-variables-const.js create mode 100644 test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/prevailing-kind-of-variables-let.js create mode 100644 test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/prevailing-kind-of-variables-var.js create mode 100644 test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/root-block-scope-1.js diff --git a/src/container/modules/custom-nodes/CustomNodesModule.ts b/src/container/modules/custom-nodes/CustomNodesModule.ts index 1e0586948..b73aa8b8f 100644 --- a/src/container/modules/custom-nodes/CustomNodesModule.ts +++ b/src/container/modules/custom-nodes/CustomNodesModule.ts @@ -26,7 +26,7 @@ import { StringArrayIndexNode } from '../../../enums/custom-nodes/string-array-i import { StringArrayScopeCallsWrapperFunctionNode } from '../../../custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperFunctionNode'; import { StringArrayScopeCallsWrapperVariableNode } from '../../../custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperVariableNode'; import { StringLiteralControlFlowStorageCallNode } from '../../../custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/StringLiteralControlFlowStorageCallNode'; -import { StringLiteralNode } from '../../../custom-nodes/control-flow-flattening-nodes/StringLiteralNode'; +import { LiteralNode } from '../../../custom-nodes/control-flow-flattening-nodes/LiteralNode'; export const customNodesModule: interfaces.ContainerModule = new ContainerModule((bind: interfaces.Bind) => { // control flow custom nodes @@ -55,12 +55,12 @@ export const customNodesModule: interfaces.ContainerModule = new ContainerModule .whenTargetNamed(ControlFlowCustomNode.ExpressionWithOperatorControlFlowStorageCallNode); bind>(ServiceIdentifiers.Newable__ICustomNode) - .toConstructor(LogicalExpressionFunctionNode) - .whenTargetNamed(ControlFlowCustomNode.LogicalExpressionFunctionNode); + .toConstructor(LiteralNode) + .whenTargetNamed(ControlFlowCustomNode.LiteralNode); bind>(ServiceIdentifiers.Newable__ICustomNode) - .toConstructor(StringLiteralNode) - .whenTargetNamed(ControlFlowCustomNode.StringLiteralNode); + .toConstructor(LogicalExpressionFunctionNode) + .whenTargetNamed(ControlFlowCustomNode.LogicalExpressionFunctionNode); bind>(ServiceIdentifiers.Newable__ICustomNode) .toConstructor(StringLiteralControlFlowStorageCallNode) diff --git a/src/custom-nodes/control-flow-flattening-nodes/StringLiteralNode.ts b/src/custom-nodes/control-flow-flattening-nodes/LiteralNode.ts similarity index 84% rename from src/custom-nodes/control-flow-flattening-nodes/StringLiteralNode.ts rename to src/custom-nodes/control-flow-flattening-nodes/LiteralNode.ts index 6099fa2a6..1e418d112 100644 --- a/src/custom-nodes/control-flow-flattening-nodes/StringLiteralNode.ts +++ b/src/custom-nodes/control-flow-flattening-nodes/LiteralNode.ts @@ -1,6 +1,8 @@ import { inject, injectable, } from 'inversify'; import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; +import type * as ESTree from 'estree'; + import { TIdentifierNamesGeneratorFactory } from '../../types/container/generators/TIdentifierNamesGeneratorFactory'; import { TStatement } from '../../types/node/TStatement'; @@ -14,12 +16,12 @@ import { AbstractCustomNode } from '../AbstractCustomNode'; import { NodeFactory } from '../../node/NodeFactory'; @injectable() -export class StringLiteralNode extends AbstractCustomNode { +export class LiteralNode extends AbstractCustomNode { /** - * @type {string} + * @type {ESTree.Literal} */ @initializable() - private literalValue!: string | number; + private literalNode!: ESTree.Literal; /** * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory @@ -43,19 +45,17 @@ export class StringLiteralNode extends AbstractCustomNode { } /** - * @param {string} literalValue + * @param {ESTree.Literal} literalNode */ - public initialize (literalValue: string | number): void { - this.literalValue = literalValue; + public initialize (literalNode: ESTree.Literal): void { + this.literalNode = literalNode; } /** * @returns {TStatement[]} */ protected getNodeStructure (): TStatement[] { - const structure: TStatement = NodeFactory.expressionStatementNode( - NodeFactory.literalNode(this.literalValue) - ); + const structure: TStatement = NodeFactory.expressionStatementNode(this.literalNode); return [structure]; } diff --git a/src/enums/custom-nodes/ControlFlowCustomNode.ts b/src/enums/custom-nodes/ControlFlowCustomNode.ts index ae4310b9a..5ed6068ea 100644 --- a/src/enums/custom-nodes/ControlFlowCustomNode.ts +++ b/src/enums/custom-nodes/ControlFlowCustomNode.ts @@ -5,7 +5,7 @@ export enum ControlFlowCustomNode { CallExpressionFunctionNode = 'CallExpressionFunctionNode', ControlFlowStorageNode = 'ControlFlowStorageNode', ExpressionWithOperatorControlFlowStorageCallNode = 'ExpressionWithOperatorControlFlowStorageCallNode', + LiteralNode = 'LiteralNode', LogicalExpressionFunctionNode = 'LogicalExpressionFunctionNode', - StringLiteralControlFlowStorageCallNode = 'StringLiteralControlFlowStorageCallNode', - StringLiteralNode = 'StringLiteralNode' + StringLiteralControlFlowStorageCallNode = 'StringLiteralControlFlowStorageCallNode' } diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts index 867084bee..cbe64f5e8 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringArrayCallControlFlowReplacer.ts @@ -22,7 +22,7 @@ import { NodeMetadata } from '../../../node/NodeMetadata'; import { StringLiteralControlFlowStorageCallNode } from '../../../custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/StringLiteralControlFlowStorageCallNode'; -import { StringLiteralNode } from '../../../custom-nodes/control-flow-flattening-nodes/StringLiteralNode'; +import { LiteralNode } from '../../../custom-nodes/control-flow-flattening-nodes/LiteralNode'; @injectable() export class StringArrayCallControlFlowReplacer extends AbstractControlFlowReplacer { @@ -75,13 +75,13 @@ export class StringArrayCallControlFlowReplacer extends AbstractControlFlowRepla } const replacerId: string = String(literalNode.value); - const literalFunctionCustomNode: ICustomNode> = - this.controlFlowCustomNodeFactory(ControlFlowCustomNode.StringLiteralNode); + const literalCustomNode: ICustomNode> = + this.controlFlowCustomNodeFactory(ControlFlowCustomNode.LiteralNode); - literalFunctionCustomNode.initialize(literalNode.value); + literalCustomNode.initialize(literalNode); const storageKey: string = this.insertCustomNodeToControlFlowStorage( - literalFunctionCustomNode, + literalCustomNode, controlFlowStorage, replacerId, StringArrayCallControlFlowReplacer.usingExistingIdentifierChance diff --git a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts index 11e650425..5aa05ff65 100644 --- a/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts +++ b/src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts @@ -19,7 +19,7 @@ import { AbstractControlFlowReplacer } from './AbstractControlFlowReplacer'; import { NodeGuards } from '../../../node/NodeGuards'; import { NodeLiteralUtils } from '../../../node/NodeLiteralUtils'; import { StringLiteralControlFlowStorageCallNode } from '../../../custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/StringLiteralControlFlowStorageCallNode'; -import { StringLiteralNode } from '../../../custom-nodes/control-flow-flattening-nodes/StringLiteralNode'; +import { LiteralNode } from '../../../custom-nodes/control-flow-flattening-nodes/LiteralNode'; @injectable() export class StringLiteralControlFlowReplacer extends AbstractControlFlowReplacer { @@ -70,13 +70,13 @@ export class StringLiteralControlFlowReplacer extends AbstractControlFlowReplace } const replacerId: string = String(literalNode.value); - const literalFunctionCustomNode: ICustomNode> = - this.controlFlowCustomNodeFactory(ControlFlowCustomNode.StringLiteralNode); + const literalCustomNode: ICustomNode> = + this.controlFlowCustomNodeFactory(ControlFlowCustomNode.LiteralNode); - literalFunctionCustomNode.initialize(literalNode.value); + literalCustomNode.initialize(literalNode); const storageKey: string = this.insertCustomNodeToControlFlowStorage( - literalFunctionCustomNode, + literalCustomNode, controlFlowStorage, replacerId, StringLiteralControlFlowReplacer.usingExistingIdentifierChance diff --git a/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/StringArrayControlFlowTransformer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/StringArrayControlFlowTransformer.spec.ts new file mode 100644 index 000000000..ab90c25e3 --- /dev/null +++ b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/StringArrayControlFlowTransformer.spec.ts @@ -0,0 +1,427 @@ +import { assert } from 'chai'; + +import { + IdentifierNamesGenerator +} from '../../../../../src/enums/generators/identifier-names-generators/IdentifierNamesGenerator'; +import { + StringArrayIndexesType +} from '../../../../../src/enums/node-transformers/string-array-transformers/StringArrayIndexesType'; + +import { NO_ADDITIONAL_NODES_PRESET } from '../../../../../src/options/presets/NoCustomNodes'; + +import { readFileAsString } from '../../../../helpers/readFileAsString'; + +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; + +describe('StringArrayControlFlowTransformer', function () { + this.timeout(100000); + + const hexadecimalVariableMatch: string = '_0x([a-f0-9]){4,6}'; + + describe('transformNode', () => { + describe('Variant #1 - hexadecimal number generator', () => { + const stringArrayVariableMatch: string = '_0x([a-f0-9]){4}'; + + const controlFlowStorageMatch: string = `var ${hexadecimalVariableMatch} *= *\\{` + + `${hexadecimalVariableMatch} *: *0x0, *` + + `${hexadecimalVariableMatch} *: *0x1 *` + + `\\};`; + const controlFlowStorageCallMatch: string = `${stringArrayVariableMatch}\\(${hexadecimalVariableMatch}.${hexadecimalVariableMatch}\\)`; + + describe('Variant #1 - positive cases', () => { + describe('Variant #1 - hexadecimal number items', () => { + const controlFlowStorageRegExp: RegExp = new RegExp(controlFlowStorageMatch); + + const controlFlowStorageCallRegExp: RegExp = new RegExp( + `var ${hexadecimalVariableMatch} *= *${controlFlowStorageCallMatch} *\\+ *${controlFlowStorageCallMatch};` + ); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/input-1.js'); + + obfuscatedCode = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + stringArray: true, + stringArrayThreshold: 1, + stringArrayIndexesType: [StringArrayIndexesType.HexadecimalNumber], + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 1 + } + ).getObfuscatedCode(); + }); + + it('should add `control flow storage` node to the obfuscated code', () => { + assert.match(obfuscatedCode, controlFlowStorageRegExp); + }); + + it('should add calls to `control flow storage` node to the obfuscated code', () => { + assert.match(obfuscatedCode, controlFlowStorageCallRegExp); + }); + }); + + describe('Variant #2 - hexadecimal numeric string items', () => { + const controlFlowStorageRegExp: RegExp = new RegExp( + `var ${hexadecimalVariableMatch} *= *\\{` + + `${hexadecimalVariableMatch} *: *'0x0', *` + + `${hexadecimalVariableMatch} *: *'0x1' *` + + `\\};` + ); + + const controlFlowStorageCallRegExp: RegExp = new RegExp( + `var ${hexadecimalVariableMatch} *= *${controlFlowStorageCallMatch} *\\+ *${controlFlowStorageCallMatch};` + ); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/input-1.js'); + + obfuscatedCode = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + stringArray: true, + stringArrayThreshold: 1, + stringArrayIndexesType: [StringArrayIndexesType.HexadecimalNumericString], + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 1 + } + ).getObfuscatedCode(); + }); + + it('should add `control flow storage` node to the obfuscated code', () => { + assert.match(obfuscatedCode, controlFlowStorageRegExp); + }); + + it('should add calls to `control flow storage` node to the obfuscated code', () => { + assert.match(obfuscatedCode, controlFlowStorageCallRegExp); + }); + }); + + describe('Variant #3 - two scopes for `control flow storage` node', () => { + const expectedAppendToScopeThreshold: number = 0.5; + + const samplesCount: number = 1000; + const delta: number = 0.1; + + const regExp1: RegExp = new RegExp( + `\\(function\\(\\) *\\{ *${controlFlowStorageMatch}`, + ); + const regExp2: RegExp = new RegExp( + `function *${hexadecimalVariableMatch} *\\(${hexadecimalVariableMatch}\\) *\\{ *${controlFlowStorageMatch}`, + ); + + let appendToScopeThreshold1: number = 0; + let appendToScopeThreshold2: number = 0; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/input-2.js'); + + let obfuscatedCode: string, + totalValue1: number = 0, + totalValue2: number = 0; + + for (let i = 0; i < samplesCount; i++) { + obfuscatedCode = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + stringArray: true, + stringArrayThreshold: 1, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 1 + } + ).getObfuscatedCode(); + + if (!regExp1.test(obfuscatedCode) && !regExp2.test(obfuscatedCode)) { + console.log(obfuscatedCode); + } + + if (regExp1.test(obfuscatedCode)) { + totalValue1++; + } + + if (regExp2.test(obfuscatedCode)) { + totalValue2++; + } + } + + appendToScopeThreshold1 = totalValue1 / samplesCount; + appendToScopeThreshold2 = totalValue2 / samplesCount; + }); + + it('should add `control flow storage` node to the obfuscated code in one of the scopes', () => { + assert.closeTo(appendToScopeThreshold1, expectedAppendToScopeThreshold, delta); + assert.closeTo(appendToScopeThreshold2, expectedAppendToScopeThreshold, delta); + }); + }); + + describe('Variant #4 - single `control flow storage` node with four items', () => { + const regexp: RegExp = new RegExp( + `var ${hexadecimalVariableMatch} *= *\\{` + + `${hexadecimalVariableMatch} *: *0x0, *` + + `${hexadecimalVariableMatch} *: *0x1, *` + + `${hexadecimalVariableMatch} *: *0x2, *` + + `${hexadecimalVariableMatch} *: *0x3 *` + + `\\};` + ); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/multiple-items.js'); + + obfuscatedCode = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + stringArray: true, + stringArrayThreshold: 1, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 1 + } + ).getObfuscatedCode(); + }); + + it('should add `control flow storage` node with multiple items to the obfuscated code', () => { + assert.match(obfuscatedCode, regexp); + }); + }); + }); + + describe('Variant #2 - negative cases', function () { + describe('Variant #1 - string array call in the root block scope', () => { + const stringArrayCallsRegExp: RegExp = new RegExp( + `var test *= *${stringArrayVariableMatch}\\(0x0\\) *\\+ *${stringArrayVariableMatch}\\(0x1\\);` + ); + const controlFlowStorageRegExp: RegExp = new RegExp(controlFlowStorageMatch); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/root-block-scope-1.js'); + + obfuscatedCode = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + stringArray: true, + stringArrayThreshold: 1, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 1 + } + ).getObfuscatedCode(); + console.log(obfuscatedCode); + }); + + it('shouldn\'t add control flow storage node', () => { + assert.notMatch(obfuscatedCode, controlFlowStorageRegExp); + assert.match(obfuscatedCode, stringArrayCallsRegExp); + }); + }); + + describe('Variant #2 - threshold is `0`', () => { + const stringArrayCallsRegExp: RegExp = new RegExp( + `var ${hexadecimalVariableMatch} *= *${stringArrayVariableMatch}\\(0x0\\) *\\+ *${stringArrayVariableMatch}\\(0x1\\);` + ); + const controlFlowStorageRegExp: RegExp = new RegExp(controlFlowStorageMatch); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/input-1.js'); + + obfuscatedCode = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + stringArray: true, + stringArrayThreshold: 1, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 0 + } + ).getObfuscatedCode(); + + console.log(obfuscatedCode); + }); + + it('shouldn\'t add control flow storage node', () => { + assert.notMatch(obfuscatedCode, controlFlowStorageRegExp); + assert.match(obfuscatedCode, stringArrayCallsRegExp); + }); + }); + }); + }); + + describe('Variant #2 - mangled number generator', () => { + describe('Variant #1 - single control flow storage', () => { + const controlFlowStorageRegExp: RegExp = new RegExp( + `var d *= *\\{` + + `c *: *0x0, *` + + `e *: *0x1 *` + + `\\};` + ); + const controlFlowStorageCallRegExp: RegExp = new RegExp( + `var c *= *b\\(d.c\\) *\\+ *b\\(d.e\\);` + ); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/input-1.js'); + + obfuscatedCode = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + identifierNamesGenerator: IdentifierNamesGenerator.MangledIdentifierNamesGenerator, + stringArray: true, + stringArrayThreshold: 1, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 1 + } + ).getObfuscatedCode(); + }); + + it('should add `control flow storage` node to the obfuscated code', () => { + assert.match(obfuscatedCode, controlFlowStorageRegExp); + }); + + it('should add calls to `control flow storage` node to the obfuscated code', () => { + assert.match(obfuscatedCode, controlFlowStorageCallRegExp); + }); + }); + + describe('Variant #2 - multiple control flow storages', () => { + const controlFlowStorageRegExp1: RegExp = new RegExp( + `var d *= *\\{` + + `c *: *0x0, *` + + `e *: *0x1 *` + + `\\};` + ); + const controlFlowStorageCallRegExp1: RegExp = new RegExp( + `var c *= *b\\(d.c\\) *\\+ *b\\(d.e\\);` + ); + + const controlFlowStorageRegExp2: RegExp = new RegExp( + `var e *= *\\{` + + `c *: *0x0, *` + + `f *: *0x1 *` + + `\\};` + ); + const controlFlowStorageCallRegExp2: RegExp = new RegExp( + `var c *= *b\\(e.c\\) *\\+ *b\\(e.f\\);` + ); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/multiple-storages.js'); + + obfuscatedCode = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + identifierNamesGenerator: IdentifierNamesGenerator.MangledIdentifierNamesGenerator, + stringArray: true, + stringArrayThreshold: 1, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 1 + } + ).getObfuscatedCode(); + }); + + it('Match #1: should add `control flow storage` №1 and its calls to the obfuscated code', () => { + assert.match(obfuscatedCode, controlFlowStorageRegExp1); + assert.match(obfuscatedCode, controlFlowStorageCallRegExp1); + }); + + it('Match #2: should add `control flow storage` №2 and its calls to the obfuscated code', () => { + assert.match(obfuscatedCode, controlFlowStorageRegExp2); + assert.match(obfuscatedCode, controlFlowStorageCallRegExp2); + }); + }); + }); + + describe('Variant #3 - prevailing kind of variables', () => { + describe('Variant #1 - `var` kind', () => { + const regexp: RegExp = new RegExp(`var ${hexadecimalVariableMatch} *= *\\{`); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/prevailing-kind-of-variables-var.js'); + + obfuscatedCode = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + stringArray: true, + stringArrayThreshold: 1, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 1 + } + ).getObfuscatedCode(); + }); + + it('should use correct kind of variables for `control flow storage`', () => { + assert.match(obfuscatedCode, regexp); + }); + }); + + describe('Variant #2 - `const` kind', () => { + const regexp: RegExp = new RegExp(`const ${hexadecimalVariableMatch} *= *\\{`); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/prevailing-kind-of-variables-const.js'); + + obfuscatedCode = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + stringArray: true, + stringArrayThreshold: 1, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 1 + } + ).getObfuscatedCode(); + }); + + it('should use correct kind of variables for `control flow storage`', () => { + assert.match(obfuscatedCode, regexp); + }); + }); + + describe('Variant #3 - `let` kind', () => { + const regexp: RegExp = new RegExp(`const ${hexadecimalVariableMatch} *= *\\{`); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/prevailing-kind-of-variables-let.js'); + + obfuscatedCode = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + stringArray: true, + stringArrayThreshold: 1, + stringArrayCallsTransform: true, + stringArrayCallsTransformThreshold: 1 + } + ).getObfuscatedCode(); + }); + + it('should use correct kind of variables for `control flow storage`', () => { + assert.match(obfuscatedCode, regexp); + }); + }); + }); + }); +}); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/input-1.js b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/input-1.js new file mode 100644 index 000000000..adce632d6 --- /dev/null +++ b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/input-1.js @@ -0,0 +1,3 @@ +(function () { + var variable = 'foo' + 'bar'; +})(); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/input-2.js b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/input-2.js new file mode 100644 index 000000000..71a3a03bc --- /dev/null +++ b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/input-2.js @@ -0,0 +1,7 @@ +(function () { + function foo (arg) { + function bar () { + var variable = 'foo' + 'bar'; + } + } +})(); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/multiple-items.js b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/multiple-items.js new file mode 100644 index 000000000..439183550 --- /dev/null +++ b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/multiple-items.js @@ -0,0 +1,4 @@ +(function () { + var test1 = 'foo' + 'bar'; + var test2 = 'baz' + 'bark'; +})(); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/multiple-storages.js b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/multiple-storages.js new file mode 100644 index 000000000..713a388f2 --- /dev/null +++ b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/multiple-storages.js @@ -0,0 +1,7 @@ +(function () { + var variable1 = 'foo' + 'bar'; +})(); + +(function () { + var variable2 = 'foo' + 'bar'; +})(); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/prevailing-kind-of-variables-const.js b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/prevailing-kind-of-variables-const.js new file mode 100644 index 000000000..1af340196 --- /dev/null +++ b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/prevailing-kind-of-variables-const.js @@ -0,0 +1,3 @@ +(function () { + const variable = 'foo' + 'bar'; +})(); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/prevailing-kind-of-variables-let.js b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/prevailing-kind-of-variables-let.js new file mode 100644 index 000000000..380b978d6 --- /dev/null +++ b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/prevailing-kind-of-variables-let.js @@ -0,0 +1,3 @@ +(function () { + let variable = 'foo' + 'bar'; +})(); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/prevailing-kind-of-variables-var.js b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/prevailing-kind-of-variables-var.js new file mode 100644 index 000000000..adce632d6 --- /dev/null +++ b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/prevailing-kind-of-variables-var.js @@ -0,0 +1,3 @@ +(function () { + var variable = 'foo' + 'bar'; +})(); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/root-block-scope-1.js b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/root-block-scope-1.js new file mode 100644 index 000000000..eb90b5ea6 --- /dev/null +++ b/test/functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/fixtures/root-block-scope-1.js @@ -0,0 +1 @@ +var test = 'foo' + 'bar'; diff --git a/test/index.spec.ts b/test/index.spec.ts index dd44ae672..b10694e20 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -90,6 +90,7 @@ import './functional-tests/node-transformers/control-flow-transformers/control-f import './functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec'; import './functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec'; import './functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec'; +import './functional-tests/node-transformers/control-flow-transformers/string-array-control-flow-transformer/StringArrayControlFlowTransformer.spec'; import './functional-tests/node-transformers/converting-transformers/boolean-literal-transformer/BooleanLiteralTransformer.spec'; import './functional-tests/node-transformers/converting-transformers/class-field-transformer/ClassFieldTransformer.spec'; import './functional-tests/node-transformers/converting-transformers/export-specifier-transformer/ExportSpecifierTransformer.spec'; From 927ba47a082d195b9339a1b0ba6d720fd10aef8c Mon Sep 17 00:00:00 2001 From: sanex Date: Sat, 5 Feb 2022 18:43:19 +0300 Subject: [PATCH 13/14] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60731504c..3cf19ced1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log v3.2.0 --- * **New options**: `stringArrayCallsTransform` and `stringArrayCallsTransformThreshold` +* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/pull/1046 v3.1.0 --- From 7f9999fb444d643b43834385cd9aea5d13b5ad6e Mon Sep 17 00:00:00 2001 From: sanex Date: Sat, 5 Feb 2022 19:23:40 +0300 Subject: [PATCH 14/14] Increase memory for tests --- .github/workflows/ci.yml | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5d5ffe5d5..af8517796 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,8 +22,8 @@ jobs: node-version: 14.x - os: ubuntu-latest, node-version: 16.x - - os: windows-latest, - node-version: 14.x + - os: ubuntu-latest, + node-version: 17.x - os: windows-latest, node-version: 16.x diff --git a/package.json b/package.json index f4e31e45c..5c861e733 100644 --- a/package.json +++ b/package.json @@ -111,7 +111,7 @@ "test:devRuntimePerformance": "ts-node test/dev/dev-runtime-performance.ts", "test:full": "yarn run test:dev && yarn run test:mocha-coverage && yarn run test:mocha-memory-performance", "test:mocha": "mocha --require ts-node/register --require source-map-support/register test/index.spec.ts --exit", - "test:mocha-coverage": "nyc --reporter text-summary --no-clean yarn run test:mocha", + "test:mocha-coverage": "NODE_OPTIONS=--max-old-space-size=4096 nyc --reporter text-summary --no-clean yarn run test:mocha", "test:mocha-coverage:report": "nyc report --reporter=lcov", "test:mocha-memory-performance": "cross-env NODE_OPTIONS=--max-old-space-size=230 mocha --require ts-node/register test/performance-tests/JavaScriptObfuscatorMemory.spec.ts", "test": "yarn run test:full",