Best JavaScript code snippet using playwright-internal
parse-css.js
Source:parse-css.js
...211 else if(code == 0x3b) return new SemicolonToken;212 else if(code == 0x3c) {213 if(next(1) == 0x21 && next(2) == 0x2d && next(3) == 0x2d) {214 consume(3);215 return new CDOToken();216 } else {217 return new DelimToken(code);218 }219 }220 else if(code == 0x40) {221 if(wouldStartAnIdentifier(next(1), next(2), next(3))) {222 return new AtKeywordToken(consumeAName());223 } else {224 return new DelimToken(code);225 }226 }227 else if(code == 0x5b) return new OpenSquareToken();228 else if(code == 0x5c) {229 if(startsWithAValidEscape()) {230 reconsume();231 return consumeAnIdentlikeToken();232 } else {233 parseerror();234 return new DelimToken(code);235 }236 }237 else if(code == 0x5d) return new CloseSquareToken();238 else if(code == 0x5e) {239 if(next() == 0x3d) {240 consume();241 return new PrefixMatchToken();242 } else {243 return new DelimToken(code);244 }245 }246 else if(code == 0x7b) return new OpenCurlyToken();247 else if(code == 0x7c) {248 if(next() == 0x3d) {249 consume();250 return new DashMatchToken();251 // } else if(next() == 0x7c) {252 // consume();253 // return new ColumnToken();254 } else {255 return new DelimToken(code);256 }257 }258 else if(code == 0x7d) return new CloseCurlyToken();259 else if(code == 0x7e) {260 if(next() == 0x3d) {261 consume();262 return new IncludeMatchToken();263 } else {264 return new DelimToken(code);265 }266 }267 else if(digit(code)) {268 reconsume();269 return consumeANumericToken();270 }271 else if(namestartchar(code)) {272 reconsume();273 return consumeAnIdentlikeToken();274 }275 else if(eof()) return new EOFToken();276 else return new DelimToken(code);277 };278 var consumeAComment = function() {279 consume();280 var comment = "";281 while(true) {282 consume();283 if(code == 0x2a && next() == 0x2f) {284 consume();285 break;286 } else if(eof()) {287 break;288 }289 comment += stringFromCode(code);290 }291 return new CommentToken(comment);292 };293 var consumeANumericToken = function() {294 var num = consumeANumber();295 var token;296 if(wouldStartAnIdentifier(next(1), next(2), next(3))) {297 token = new DimensionToken();298 token.value = num.value;299 token.repr = num.repr;300 token.type = num.type;301 token.unit = consumeAName();302 token.text = token.unit;303 } else if(next() == 0x25) {304 consume();305 token = new PercentageToken();306 token.value = num.value;307 token.repr = num.repr;308 } else {309 var token = new NumberToken();310 token.value = num.value;311 token.repr = num.repr;312 token.type = num.type;313 }314 token.number = token.value;315 token.isInteger = token.type === "integer";316 // FIXME hasSign317 return token;318 };319 var consumeAnIdentlikeToken = function() {320 var str = consumeAName();321 if(str.toLowerCase() == "url" && next() == 0x28) {322 consume();323 while(whitespace(next(1)) && whitespace(next(2)))324 consume();325 if((next() == 0x22 || next() == 0x27) ||326 (whitespace(next()) && (next(2) == 0x22 || next(2) == 0x27))) {327 while(whitespace(next()))328 consume();329 consume();330 let str = consumeAStringToken();331 while(whitespace(next()))332 consume();333 // The closing paren.334 consume();335 return new URLToken(str.text);336 } else {337 return consumeAURLToken();338 }339 } else if(next() == 0x28) {340 consume();341 return new FunctionToken(str);342 } else {343 return new IdentToken(str);344 }345 };346 var consumeAStringToken = function(endingCodePoint) {347 if(endingCodePoint === undefined) endingCodePoint = code;348 var string = "";349 while(consume()) {350 if(code == endingCodePoint || eof()) {351 return new StringToken(string);352 } else if(newline(code)) {353 reconsume();354 return new BadStringToken(string);355 } else if(code == 0x5c) {356 if(eof(next())) {357 donothing();358 } else if(newline(next())) {359 consume();360 } else {361 string += stringFromCode(consumeEscape());362 }363 } else {364 string += stringFromCode(code);365 }366 }367 };368 var consumeAURLToken = function() {369 var token = new URLToken("");370 while(whitespace(next())) consume();371 if(eof(next())) return token;372 while(consume()) {373 if(code == 0x29 || eof()) {374 break;375 } else if(whitespace(code)) {376 while(whitespace(next()))377 consume();378 if(next() == 0x29 || eof(next())) {379 consume();380 break;381 } else {382 consumeTheRemnantsOfABadURL();383 return new BadURLToken();384 }385 } else if(code == 0x22 || code == 0x27 || code == 0x28 || nonprintable(code)) {386 parseerror();387 consumeTheRemnantsOfABadURL();388 return new BadURLToken();389 } else if(code == 0x5c) {390 if(startsWithAValidEscape()) {391 token.value += stringFromCode(consumeEscape());392 } else {393 parseerror();394 consumeTheRemnantsOfABadURL();395 return new BadURLToken();396 }397 } else {398 token.value += stringFromCode(code);399 }400 }401 token.text = token.value;402 return token;403 };404 var consumeEscape = function() {405 // Assume the the current character is the \406 // and the next code point is not a newline.407 consume();408 if(hexdigit(code)) {409 // Consume 1-6 hex digits410 var digits = [code];411 for(var total = 0; total < 5; total++) {412 if(hexdigit(next())) {413 consume();414 digits.push(code);415 } else {416 break;417 }418 }419 if(whitespace(next())) consume();420 var value = parseInt(digits.map(function(x){return String.fromCharCode(x);}).join(''), 16);421 if( value > maximumallowedcodepoint ) value = 0xfffd;422 return value;423 } else if(eof()) {424 return 0xfffd;425 } else {426 return code;427 }428 };429 var areAValidEscape = function(c1, c2) {430 if(c1 != 0x5c) return false;431 if(newline(c2)) return false;432 return true;433 };434 var startsWithAValidEscape = function() {435 return areAValidEscape(code, next());436 };437 var wouldStartAnIdentifier = function(c1, c2, c3) {438 if(c1 == 0x2d) {439 return namestartchar(c2) || c2 == 0x2d || areAValidEscape(c2, c3);440 } else if(namestartchar(c1)) {441 return true;442 } else if(c1 == 0x5c) {443 return areAValidEscape(c1, c2);444 } else {445 return false;446 }447 };448 var startsWithAnIdentifier = function() {449 return wouldStartAnIdentifier(code, next(1), next(2));450 };451 var wouldStartANumber = function(c1, c2, c3) {452 if(c1 == 0x2b || c1 == 0x2d) {453 if(digit(c2)) return true;454 if(c2 == 0x2e && digit(c3)) return true;455 return false;456 } else if(c1 == 0x2e) {457 if(digit(c2)) return true;458 return false;459 } else if(digit(c1)) {460 return true;461 } else {462 return false;463 }464 };465 var startsWithANumber = function() {466 return wouldStartANumber(code, next(1), next(2));467 };468 var consumeAName = function() {469 var result = "";470 while(consume()) {471 if(namechar(code)) {472 result += stringFromCode(code);473 } else if(startsWithAValidEscape()) {474 result += stringFromCode(consumeEscape());475 } else {476 reconsume();477 return result;478 }479 }480 };481 var consumeANumber = function() {482 var repr = [];483 var type = "integer";484 if(next() == 0x2b || next() == 0x2d) {485 consume();486 repr += stringFromCode(code);487 }488 while(digit(next())) {489 consume();490 repr += stringFromCode(code);491 }492 if(next(1) == 0x2e && digit(next(2))) {493 consume();494 repr += stringFromCode(code);495 consume();496 repr += stringFromCode(code);497 type = "number";498 while(digit(next())) {499 consume();500 repr += stringFromCode(code);501 }502 }503 var c1 = next(1), c2 = next(2), c3 = next(3);504 if((c1 == 0x45 || c1 == 0x65) && digit(c2)) {505 consume();506 repr += stringFromCode(code);507 consume();508 repr += stringFromCode(code);509 type = "number";510 while(digit(next())) {511 consume();512 repr += stringFromCode(code);513 }514 } else if((c1 == 0x45 || c1 == 0x65) && (c2 == 0x2b || c2 == 0x2d) && digit(c3)) {515 consume();516 repr += stringFromCode(code);517 consume();518 repr += stringFromCode(code);519 consume();520 repr += stringFromCode(code);521 type = "number";522 while(digit(next())) {523 consume();524 repr += stringFromCode(code);525 }526 }527 var value = convertAStringToANumber(repr);528 return {type:type, value:value, repr:repr};529 };530 var convertAStringToANumber = function(string) {531 // CSS's number rules are identical to JS, afaik.532 return +string;533 };534 var consumeTheRemnantsOfABadURL = function() {535 while(consume()) {536 if(code == 0x2d || eof()) {537 return;538 } else if(startsWithAValidEscape()) {539 consumeEscape();540 donothing();541 } else {542 donothing();543 }544 }545 };546 var iterationCount = 0;547 while(!eof(next())) {548 var token = consumeAToken();549 if (options.loc) {550 token.loc = {};551 token.loc.start = {line:locStart.line, column:locStart.column};552 token.loc.end = {line:line, column:column};553 }554 if (options.offsets) {555 token.startOffset = offsetStart;556 token.endOffset = i + 1;557 }558 yield token;559 iterationCount++;560 if(iterationCount > str.length*2) return "I'm infinite-looping!";561 }562}563function CSSParserToken() { throw "Abstract Base Class"; }564CSSParserToken.prototype.toJSON = function() {565 return {token: this.tokenType};566};567CSSParserToken.prototype.toString = function() { return this.tokenType; };568CSSParserToken.prototype.toSource = function() { return ''+this; };569function BadStringToken(text) {570 this.text = text;571 return this;572}573BadStringToken.prototype = Object.create(CSSParserToken.prototype);574BadStringToken.prototype.tokenType = "bad_string";575function BadURLToken() { return this; }576BadURLToken.prototype = Object.create(CSSParserToken.prototype);577BadURLToken.prototype.tokenType = "bad_url";578function WhitespaceToken() { return this; }579WhitespaceToken.prototype = Object.create(CSSParserToken.prototype);580WhitespaceToken.prototype.tokenType = "whitespace";581WhitespaceToken.prototype.toString = function() { return "WS"; };582WhitespaceToken.prototype.toSource = function() { return " "; };583function CDOToken() { return this; }584CDOToken.prototype = Object.create(CSSParserToken.prototype);585CDOToken.prototype.tokenType = "htmlcomment";586CDOToken.prototype.toSource = function() { return "<!--"; };587function CDCToken() { return this; }588CDCToken.prototype = Object.create(CSSParserToken.prototype);589CDCToken.prototype.tokenType = "htmlcomment";590CDCToken.prototype.toSource = function() { return "-->"; };591function ColonToken() { return this; }592ColonToken.prototype = Object.create(CSSParserToken.prototype);593ColonToken.prototype.tokenType = "symbol";594ColonToken.prototype.text = ":";595function SemicolonToken() { return this; }596SemicolonToken.prototype = Object.create(CSSParserToken.prototype);597SemicolonToken.prototype.tokenType = "symbol";...
css-syntax.js
Source:css-syntax.js
...209 else if(code == 0x3b) return new SemicolonToken;210 else if(code == 0x3c) {211 if(next(1) == 0x21 && next(2) == 0x2d && next(3) == 0x2d) {212 consume(3);213 return new CDOToken();214 } else {215 return new DelimToken(code);216 }217 }218 else if(code == 0x40) {219 if(wouldStartAnIdentifier(next(1), next(2), next(3))) {220 return new AtKeywordToken(consumeAName());221 } else {222 return new DelimToken(code);223 }224 }225 else if(code == 0x5b) return new OpenSquareToken();226 else if(code == 0x5c) {227 if(startsWithAValidEscape()) {228 reconsume();229 return consumeAnIdentlikeToken();230 } else {231 tokenizeerror();232 return new DelimToken(code);233 }234 }235 else if(code == 0x5d) return new CloseSquareToken();236 else if(code == 0x5e) {237 if(next() == 0x3d) {238 consume();239 return new PrefixMatchToken();240 } else {241 return new DelimToken(code);242 }243 }244 else if(code == 0x7b) return new OpenCurlyToken();245 else if(code == 0x7c) {246 if(next() == 0x3d) {247 consume();248 return new DashMatchToken();249 } else if(next() == 0x7c) {250 consume();251 return new ColumnToken();252 } else {253 return new DelimToken(code);254 }255 }256 else if(code == 0x7d) return new CloseCurlyToken();257 else if(code == 0x7e) {258 if(next() == 0x3d) {259 consume();260 return new IncludeMatchToken();261 } else {262 return new DelimToken(code);263 }264 }265 else if(digit(code)) {266 reconsume();267 return consumeANumericToken();268 }269 else if(namestartchar(code)) {270 reconsume();271 return consumeAnIdentlikeToken();272 }273 else if(eof()) return new EOFToken();274 else return new DelimToken(code);275 };276 var consumeComments = function() {277 while(next(1) == 0x2f && next(2) == 0x2a) {278 consume(2);279 while(true) {280 consume();281 if(code == 0x2a && next() == 0x2f) {282 consume();283 break;284 } else if(eof()) {285 tokenizeerror();286 return;287 }288 }289 }290 };291 var consumeANumericToken = function() {292 var num = consumeANumber();293 if(wouldStartAnIdentifier(next(1), next(2), next(3))) {294 var token = new DimensionToken();295 token.value = num.value;296 token.repr = num.repr;297 token.type = num.type;298 token.unit = consumeAName();299 return token;300 } else if(next() == 0x25) {301 consume();302 var token = new PercentageToken();303 token.value = num.value;304 token.repr = num.repr;305 return token;306 } else {307 var token = new NumberToken();308 token.value = num.value;309 token.repr = num.repr;310 token.type = num.type;311 return token;312 }313 };314 var consumeAnIdentlikeToken = function() {315 var str = consumeAName();316 if(str.toLowerCase() == "url" && next() == 0x28) {317 consume();318 while(whitespace(next(1)) && whitespace(next(2))) consume();319 if(next() == 0x22 || next() == 0x27) {320 return new FunctionToken(str);321 } else if(whitespace(next()) && (next(2) == 0x22 || next(2) == 0x27)) {322 return new FunctionToken(str);323 } else {324 return consumeAURLToken();325 }326 } else if(next() == 0x28) {327 consume();328 return new FunctionToken(str);329 } else {330 return new IdentifierToken(str);331 }332 };333 var consumeAStringToken = function(endingCodePoint) {334 if(endingCodePoint === undefined) endingCodePoint = code;335 var string = "";336 while(consume()) {337 if(code == endingCodePoint || eof()) {338 return new StringToken(string);339 } else if(newline(code)) {340 tokenizeerror();341 reconsume();342 return new BadStringToken();343 } else if(code == 0x5c) {344 if(eof(next())) {345 donothing();346 } else if(newline(next())) {347 consume();348 } else {349 string += stringFromCode(consumeEscape())350 }351 } else {352 string += stringFromCode(code);353 }354 }355 };356 var consumeAURLToken = function() {357 var token = new URLToken("");358 while(whitespace(next())) consume();359 if(eof(next())) return token;360 while(consume()) {361 if(code == 0x29 || eof()) {362 return token;363 } else if(whitespace(code)) {364 while(whitespace(next())) consume();365 if(next() == 0x29 || eof(next())) {366 consume();367 return token;368 } else {369 consumeTheRemnantsOfABadURL();370 return new BadURLToken();371 }372 } else if(code == 0x22 || code == 0x27 || code == 0x28 || nonprintable(code)) {373 tokenizeerror();374 consumeTheRemnantsOfABadURL();375 return new BadURLToken();376 } else if(code == 0x5c) {377 if(startsWithAValidEscape()) {378 token.value += stringFromCode(consumeEscape());379 } else {380 tokenizeerror();381 consumeTheRemnantsOfABadURL();382 return new BadURLToken();383 }384 } else {385 token.value += stringFromCode(code);386 }387 }388 };389 var consumeEscape = function() {390 // Assume the the current character is the \391 // and the next code point is not a newline.392 consume();393 if(hexdigit(code)) {394 // Consume 1-6 hex digits395 var digits = [code];396 for(var total = 0; total < 5; total++) {397 if(hexdigit(next())) {398 consume();399 digits.push(code);400 } else {401 break;402 }403 }404 if(whitespace(next())) consume();405 var value = parseInt(digits.map(function(x){return String.fromCharCode(x);}).join(''), 16);406 if( value > maximumallowedcodepoint ) value = 0xfffd;407 return value;408 } else if(eof()) {409 return 0xfffd;410 } else {411 return code;412 }413 };414 var areAValidEscape = function(c1, c2) {415 if(c1 != 0x5c) return false;416 if(newline(c2)) return false;417 return true;418 };419 var startsWithAValidEscape = function() {420 return areAValidEscape(code, next());421 };422 var wouldStartAnIdentifier = function(c1, c2, c3) {423 if(c1 == 0x2d) {424 return namestartchar(c2) || c2 == 0x2d || areAValidEscape(c2, c3);425 } else if(namestartchar(c1)) {426 return true;427 } else if(c1 == 0x5c) {428 return areAValidEscape(c1, c2);429 } else {430 return false;431 }432 };433 var startsWithAnIdentifier = function() {434 return wouldStartAnIdentifier(code, next(1), next(2));435 };436 var wouldStartANumber = function(c1, c2, c3) {437 if(c1 == 0x2b || c1 == 0x2d) {438 if(digit(c2)) return true;439 if(c2 == 0x2e && digit(c3)) return true;440 return false;441 } else if(c1 == 0x2e) {442 if(digit(c2)) return true;443 return false;444 } else if(digit(c1)) {445 return true;446 } else {447 return false;448 }449 };450 var startsWithANumber = function() {451 return wouldStartANumber(code, next(1), next(2));452 };453 var consumeAName = function() {454 var result = "";455 while(consume()) {456 if(namechar(code)) {457 result += stringFromCode(code);458 } else if(startsWithAValidEscape()) {459 result += stringFromCode(consumeEscape());460 } else {461 reconsume();462 return result;463 }464 }465 };466 var consumeANumber = function() {467 var repr = '';468 var type = "integer";469 if(next() == 0x2b || next() == 0x2d) {470 consume();471 repr += stringFromCode(code);472 }473 while(digit(next())) {474 consume();475 repr += stringFromCode(code);476 }477 if(next(1) == 0x2e && digit(next(2))) {478 consume();479 repr += stringFromCode(code);480 consume();481 repr += stringFromCode(code);482 type = "number";483 while(digit(next())) {484 consume();485 repr += stringFromCode(code);486 }487 }488 var c1 = next(1), c2 = next(2), c3 = next(3);489 if((c1 == 0x45 || c1 == 0x65) && digit(c2)) {490 consume();491 repr += stringFromCode(code);492 consume();493 repr += stringFromCode(code);494 type = "number";495 while(digit(next())) {496 consume();497 repr += stringFromCode(code);498 }499 } else if((c1 == 0x45 || c1 == 0x65) && (c2 == 0x2b || c2 == 0x2d) && digit(c3)) {500 consume();501 repr += stringFromCode(code);502 consume();503 repr += stringFromCode(code);504 consume();505 repr += stringFromCode(code);506 type = "number";507 while(digit(next())) {508 consume();509 repr += stringFromCode(code);510 }511 }512 var value = convertAStringToANumber(repr);513 return {type:type, value:value, repr:repr};514 };515 var convertAStringToANumber = function(string) {516 // CSS's number rules are identical to JS, afaik.517 return +string;518 };519 var consumeTheRemnantsOfABadURL = function() {520 while(consume()) {521 if(code == 0x2d || eof()) {522 return;523 } else if(startsWithAValidEscape()) {524 consumeEscape();525 donothing();526 } else {527 donothing();528 }529 }530 };531 var iterationCount = 0;532 while(!eof(next())) {533 tokens.push(consumeAToken());534 if(iterationCount++ > str.length*2) throw new Error("The CSS Tokenizer is infinite-looping");535 }536 return tokens;537}538function CSSParserToken() { return this; }539CSSParserToken.prototype.toJSON = function() {540 return {token: this.tokenType};541}542CSSParserToken.prototype.toString = function() { return this.tokenType; }543CSSParserToken.prototype.toCSSString = function() { return ''+this; }544function BadStringToken() { return this; }545BadStringToken.prototype = new CSSParserToken;546BadStringToken.prototype.tokenType = "BADSTRING";547BadStringToken.prototype.toCSSString = function() { return "'"; }548function BadURLToken() { return this; }549BadURLToken.prototype = new CSSParserToken;550BadURLToken.prototype.tokenType = "BADURL";551BadURLToken.prototype.toCSSString = function() { return "url("; }552function WhitespaceToken() { return this; }553WhitespaceToken.prototype = new CSSParserToken;554WhitespaceToken.prototype.tokenType = "WHITESPACE";555WhitespaceToken.prototype.toString = function() { return "WS"; }556WhitespaceToken.prototype.toCSSString = function() { return " "; }557function CDOToken() { return this; }558CDOToken.prototype = new CSSParserToken;559CDOToken.prototype.tokenType = "CDO";560CDOToken.prototype.toCSSString = function() { return "<!--"; }561function CDCToken() { return this; }562CDCToken.prototype = new CSSParserToken;563CDCToken.prototype.tokenType = "CDC";564CDCToken.prototype.toCSSString = function() { return "-->"; }565function ColonToken() { return this; }566ColonToken.prototype = new CSSParserToken;567ColonToken.prototype.tokenType = ":";568function SemicolonToken() { return this; }569SemicolonToken.prototype = new CSSParserToken;570SemicolonToken.prototype.tokenType = ";";571function CommaToken() { return this; }...
cssTokenizer.js
Source:cssTokenizer.js
...209 else if(code == 0x3b) return new SemicolonToken;210 else if(code == 0x3c) {211 if(next(1) == 0x21 && next(2) == 0x2d && next(3) == 0x2d) {212 consume(3);213 return new CDOToken();214 } else {215 return new DelimToken(code);216 }217 }218 else if(code == 0x40) {219 if(wouldStartAnIdentifier(next(1), next(2), next(3))) {220 return new AtKeywordToken(consumeAName());221 } else {222 return new DelimToken(code);223 }224 }225 else if(code == 0x5b) return new OpenSquareToken();226 else if(code == 0x5c) {227 if(startsWithAValidEscape()) {228 reconsume();229 return consumeAnIdentlikeToken();230 } else {231 parseerror();232 return new DelimToken(code);233 }234 }235 else if(code == 0x5d) return new CloseSquareToken();236 else if(code == 0x5e) {237 if(next() == 0x3d) {238 consume();239 return new PrefixMatchToken();240 } else {241 return new DelimToken(code);242 }243 }244 else if(code == 0x7b) return new OpenCurlyToken();245 else if(code == 0x7c) {246 if(next() == 0x3d) {247 consume();248 return new DashMatchToken();249 } else if(next() == 0x7c) {250 consume();251 return new ColumnToken();252 } else {253 return new DelimToken(code);254 }255 }256 else if(code == 0x7d) return new CloseCurlyToken();257 else if(code == 0x7e) {258 if(next() == 0x3d) {259 consume();260 return new IncludeMatchToken();261 } else {262 return new DelimToken(code);263 }264 }265 else if(digit(code)) {266 reconsume();267 return consumeANumericToken();268 }269 else if(namestartchar(code)) {270 reconsume();271 return consumeAnIdentlikeToken();272 }273 else if(eof()) return new EOFToken();274 else return new DelimToken(code);275 };276 var consumeComments = function() {277 while(next(1) == 0x2f && next(2) == 0x2a) {278 consume(2);279 while(true) {280 consume();281 if(code == 0x2a && next() == 0x2f) {282 consume();283 break;284 } else if(eof()) {285 parseerror();286 return;287 }288 }289 }290 };291 var consumeANumericToken = function() {292 var num = consumeANumber();293 if(wouldStartAnIdentifier(next(1), next(2), next(3))) {294 var token = new DimensionToken();295 token.value = num.value;296 token.repr = num.repr;297 token.type = num.type;298 token.unit = consumeAName();299 return token;300 } else if(next() == 0x25) {301 consume();302 var token = new PercentageToken();303 token.value = num.value;304 token.repr = num.repr;305 return token;306 } else {307 var token = new NumberToken();308 token.value = num.value;309 token.repr = num.repr;310 token.type = num.type;311 return token;312 }313 };314 var consumeAnIdentlikeToken = function() {315 var str = consumeAName();316 if(str.toLowerCase() == "url" && next() == 0x28) {317 consume();318 while(whitespace(next(1)) && whitespace(next(2))) consume();319 if(next() == 0x22 || next() == 0x27) {320 return new FunctionToken(str);321 } else if(whitespace(next()) && (next(2) == 0x22 || next(2) == 0x27)) {322 return new FunctionToken(str);323 } else {324 return consumeAURLToken();325 }326 } else if(next() == 0x28) {327 consume();328 return new FunctionToken(str);329 } else {330 return new IdentToken(str);331 }332 };333 var consumeAStringToken = function(endingCodePoint) {334 if(endingCodePoint === undefined) endingCodePoint = code;335 var string = "";336 while(consume()) {337 if(code == endingCodePoint || eof()) {338 return new StringToken(string);339 } else if(newline(code)) {340 parseerror();341 reconsume();342 return new BadStringToken();343 } else if(code == 0x5c) {344 if(eof(next())) {345 donothing();346 } else if(newline(next())) {347 consume();348 } else {349 string += stringFromCode(consumeEscape())350 }351 } else {352 string += stringFromCode(code);353 }354 }355 };356 var consumeAURLToken = function() {357 var token = new URLToken("");358 while(whitespace(next())) consume();359 if(eof(next())) return token;360 while(consume()) {361 if(code == 0x29 || eof()) {362 return token;363 } else if(whitespace(code)) {364 while(whitespace(next())) consume();365 if(next() == 0x29 || eof(next())) {366 consume();367 return token;368 } else {369 consumeTheRemnantsOfABadURL();370 return new BadURLToken();371 }372 } else if(code == 0x22 || code == 0x27 || code == 0x28 || nonprintable(code)) {373 parseerror();374 consumeTheRemnantsOfABadURL();375 return new BadURLToken();376 } else if(code == 0x5c) {377 if(startsWithAValidEscape()) {378 token.value += stringFromCode(consumeEscape());379 } else {380 parseerror();381 consumeTheRemnantsOfABadURL();382 return new BadURLToken();383 }384 } else {385 token.value += stringFromCode(code);386 }387 }388 };389 var consumeEscape = function() {390 // Assume the the current character is the \391 // and the next code point is not a newline.392 consume();393 if(hexdigit(code)) {394 // Consume 1-6 hex digits395 var digits = [code];396 for(var total = 0; total < 5; total++) {397 if(hexdigit(next())) {398 consume();399 digits.push(code);400 } else {401 break;402 }403 }404 if(whitespace(next())) consume();405 var value = parseInt(digits.map(function(x){return String.fromCharCode(x);}).join(''), 16);406 if( value > maximumallowedcodepoint ) value = 0xfffd;407 return value;408 } else if(eof()) {409 return 0xfffd;410 } else {411 return code;412 }413 };414 var areAValidEscape = function(c1, c2) {415 if(c1 != 0x5c) return false;416 if(newline(c2)) return false;417 return true;418 };419 var startsWithAValidEscape = function() {420 return areAValidEscape(code, next());421 };422 var wouldStartAnIdentifier = function(c1, c2, c3) {423 if(c1 == 0x2d) {424 return namestartchar(c2) || c2 == 0x2d || areAValidEscape(c2, c3);425 } else if(namestartchar(c1)) {426 return true;427 } else if(c1 == 0x5c) {428 return areAValidEscape(c1, c2);429 } else {430 return false;431 }432 };433 var startsWithAnIdentifier = function() {434 return wouldStartAnIdentifier(code, next(1), next(2));435 };436 var wouldStartANumber = function(c1, c2, c3) {437 if(c1 == 0x2b || c1 == 0x2d) {438 if(digit(c2)) return true;439 if(c2 == 0x2e && digit(c3)) return true;440 return false;441 } else if(c1 == 0x2e) {442 if(digit(c2)) return true;443 return false;444 } else if(digit(c1)) {445 return true;446 } else {447 return false;448 }449 };450 var startsWithANumber = function() {451 return wouldStartANumber(code, next(1), next(2));452 };453 var consumeAName = function() {454 var result = "";455 while(consume()) {456 if(namechar(code)) {457 result += stringFromCode(code);458 } else if(startsWithAValidEscape()) {459 result += stringFromCode(consumeEscape());460 } else {461 reconsume();462 return result;463 }464 }465 };466 var consumeANumber = function() {467 var repr = [];468 var type = "integer";469 if(next() == 0x2b || next() == 0x2d) {470 consume();471 repr += stringFromCode(code);472 }473 while(digit(next())) {474 consume();475 repr += stringFromCode(code);476 }477 if(next(1) == 0x2e && digit(next(2))) {478 consume();479 repr += stringFromCode(code);480 consume();481 repr += stringFromCode(code);482 type = "number";483 while(digit(next())) {484 consume();485 repr += stringFromCode(code);486 }487 }488 var c1 = next(1), c2 = next(2), c3 = next(3);489 if((c1 == 0x45 || c1 == 0x65) && digit(c2)) {490 consume();491 repr += stringFromCode(code);492 consume();493 repr += stringFromCode(code);494 type = "number";495 while(digit(next())) {496 consume();497 repr += stringFromCode(code);498 }499 } else if((c1 == 0x45 || c1 == 0x65) && (c2 == 0x2b || c2 == 0x2d) && digit(c3)) {500 consume();501 repr += stringFromCode(code);502 consume();503 repr += stringFromCode(code);504 consume();505 repr += stringFromCode(code);506 type = "number";507 while(digit(next())) {508 consume();509 repr += stringFromCode(code);510 }511 }512 var value = convertAStringToANumber(repr);513 return {type:type, value:value, repr:repr};514 };515 var convertAStringToANumber = function(string) {516 // CSS's number rules are identical to JS, afaik.517 return +string;518 };519 var consumeTheRemnantsOfABadURL = function() {520 while(consume()) {521 if(code == 0x29 || eof()) {522 return;523 } else if(startsWithAValidEscape()) {524 consumeEscape();525 donothing();526 } else {527 donothing();528 }529 }530 };531 var iterationCount = 0;532 while(!eof(next())) {533 tokens.push(consumeAToken());534 iterationCount++;535 if(iterationCount > str.length*2) return "I'm infinite-looping!";536 }537 return tokens;538}539function CSSParserToken() { throw "Abstract Base Class"; }540CSSParserToken.prototype.toJSON = function() {541 return {token: this.tokenType};542}543CSSParserToken.prototype.toString = function() { return this.tokenType; }544CSSParserToken.prototype.toSource = function() { return ''+this; }545function BadStringToken() { return this; }546BadStringToken.prototype = Object.create(CSSParserToken.prototype);547BadStringToken.prototype.tokenType = "BADSTRING";548function BadURLToken() { return this; }549BadURLToken.prototype = Object.create(CSSParserToken.prototype);550BadURLToken.prototype.tokenType = "BADURL";551function WhitespaceToken() { return this; }552WhitespaceToken.prototype = Object.create(CSSParserToken.prototype);553WhitespaceToken.prototype.tokenType = "WHITESPACE";554WhitespaceToken.prototype.toString = function() { return "WS"; }555WhitespaceToken.prototype.toSource = function() { return " "; }556function CDOToken() { return this; }557CDOToken.prototype = Object.create(CSSParserToken.prototype);558CDOToken.prototype.tokenType = "CDO";559CDOToken.prototype.toSource = function() { return "<!--"; }560function CDCToken() { return this; }561CDCToken.prototype = Object.create(CSSParserToken.prototype);562CDCToken.prototype.tokenType = "CDC";563CDCToken.prototype.toSource = function() { return "-->"; }564function ColonToken() { return this; }565ColonToken.prototype = Object.create(CSSParserToken.prototype);566ColonToken.prototype.tokenType = ":";567function SemicolonToken() { return this; }568SemicolonToken.prototype = Object.create(CSSParserToken.prototype);569SemicolonToken.prototype.tokenType = ";";570function CommaToken() { return this; }...
script_api.js
Source:script_api.js
1var QuickDataTool = (function () {2 var quickDataTool = {};3 quickDataTool.ViewModel = function() {4 var self = this,5 now = new Date();6 now.setDate(now.getDate()-15);7 /* public fields */8 // App status / messages9 self.errorMessages = ko.observableArray([]);10 self.loading = ko.observable(false);11 self.firstLoad = ko.observable(true);12 self.settingsOpen = ko.observable(false);13 self.infowindowOpen = ko.observable(false);14 self.datepickerOpen = ko.observable(false);15 // Available datasets16 //todo: flush out idea of multiple datasets17 // * Have datatypes array18 // * Ex: [{id:'TMIN', unit:'TEMP'}, ...]19 // * Available Units array20 // * Ex: [{id:'TEMP', options:['C', 'F']}, ...]21 // * SelectedUnitId observable for each avaibale unit22 // * Ex: self['selected'+unit.id]()23 // * ScaleValue function (datatype, value)24 self.availableDatasets = [{id:'GHCND', product:'GHCND_DAILY_FORM'}];25 self.availableDatatypes = ['PRCP','SNOW','TMAX','TMIN','TAVG'];26 self.availableUnits = [{id:'TEMP', options:['C','F']}, {id:'PRCP', options:['mm','in']}];27 // Selected values28 self.selectedInfowindow = ko.observable();29 self.selectedStation = ko.observable();30 self.selectedMarker = ko.observable();31 self.selectedData = ko.observableArray([]);32 self.selectedDate = ko.observable(now.toISOString().substring(0,10));33 self.selectedDataset = ko.observable(self.availableDatasets[0]);34 self.selectedTEMP = ko.observable('C');35 self.selectedPRCP = ko.observable('mm');36 // Map variables37 self.results = ko.observableArray([]);38 self.markers = ko.observableArray([]);39 self.extent = ko.observable();40 // Misc config41 self.resultsLimit = ko.observable(25);42 self.resultsOffset = ko.observable(1);43 self.dataSet = ko.observable('GHCND');44 self.maxDate = ko.observable();45 // Date-at-a-glance computables46 self.getYear = ko.pureComputed(function() {47 var year;48 if (self.selectedDate()) {49 year = self.selectedDate().substring(0,4);50 } else {51 year = now.getFullYear();52 }53 return year;54 });55 self.getMonth = ko.pureComputed(function() {56 var month;57 if (self.selectedDate()) {58 month = Number(self.selectedDate().substring(5,7));59 } else {60 month = now.getMonth() + 1;61 }62 return monthNames[month-1];63 });64 self.getDay = ko.pureComputed(function() {65 var day;66 if (self.selectedDate()) {67 day = Number(self.selectedDate().substring(8,10));68 } else {69 day = now.getDate() - 5;70 }71 return day;72 });73 /* private fields */74 var monthNames = ["JAN","FEB","MAR","APR","MAY","JUN","JLY","AUG","SEP","OCT","NOV","DEC"],75 datepicker = $('#datepicker').datepicker({76 dateFormat: 'yy-mm-dd',77 altField: "#selectedDate",78 changeMonth: true,79 changeYear: true,80 showButtonPanel: true,81 onSelect: function(dateText) {82 self.selectedDate(dateText);83 self.datepickerOpen(false);84 }85 }).datepicker( "setDate", self.selectedDate() ),86 map,87 autocomplete,88 cdoToken = 'IdNEXjwZWEjvmkHMrRgJLNfxijCdyzFC',89 cdoApi = {90 base: 'http://www.ncdc.noaa.gov/cdo-web/api/v2',91 stations: '/stations',92 datasets: '/datasets',93 data: '/data'94 },95 cdoRequest;96 /* public methods */97 self.setSelectedTEMP = function(value) {98 self.selectedTEMP(value);99 };100 self.setSelectedPRCP = function(value) {101 self.selectedPRCP(value);102 };103 self.showDatepicker = function() {104 self.datepickerOpen(true);105 };106 self.toggleDatepicker = function(data, event) {107 // If click came from datepicker, do not toggle108 // TODO: This is a poor solution, find a better one109 if (event.target.className.indexOf('datepicker') == -1110 && event.target.className.indexOf('ui-icon-circle-triangle') == -1) {111 self.datepickerOpen(!self.datepickerOpen());112 }113 };114 self.toggleSettings = function() {115 self.settingsOpen(!self.settingsOpen());116 };117 self.composeQuickDataUrl = function(station) {118 // "/cdo-web/quickdatapdf/GHCND:USC00168941_2005-8-1.pdf?datasetId=GHCND&productId=GHCN_DAILY_FORM&stationId=GHCND:USC00168941&year=2005&month=8&day=1"119 var base = "http://www.ncdc.noaa.gov/cdo-web/quickdatapdf/",120 pdfname = station.id + "_" + self.selectedDate() + '.pdf',121 dataset = "datasetId=" + self.dataSet(),122 product = "productId=GHCN_DAILY_FORM",123 station = "stationId=" + station.id,124 year = "year=" + self.selectedDate().substring(0,4),125 month = "month=" + self.selectedDate().substring(5,7),126 day = "day=" + self.selectedDate().substring(8,10);127 return base + pdfname + '?' + [dataset, product, station, year, month, day].join('&');128 };129 /* private methods */130 var scaleValue = function(result) {131 var datum = {132 name: result.datatype,133 value: Number(result.value)134 };135 //TEMP value136 if (['TMAX','TMIN','TAVG'].indexOf(datum.name) != -1) {137 //scale value, set unit138 datum.value = datum.value/10;139 datum.units = "(C)";140 if (self.selectedTEMP() == 'F') {141 //Convert from c to f142 datum.value = datum.value * (9/5) + 32;143 datum.units = "(F)";144 }145 datum.value = Math.round(datum.value * 100) / 100146 return datum;147 } else {148 datum.units = "(mm)";149 //scale prcp value, leave snow alone150 if (datum.name == 'PRCP') {151 datum.value = datum.value/10;152 }153 if (self.selectedPRCP() == 'in') {154 datum.value = datum.value * 0.039370;155 datum.units = "(in)";156 }157 datum.value = Math.round(datum.value * 100) / 100158 return datum;159 }160 };161 var composeStationsUrl = function() {162 var url = cdoApi.base + cdoApi.stations,163 parameters = [164 'datasetid=' + self.dataSet(),165 'extent=' + self.extent(),166 'startdate=' + self.selectedDate() + 'T00:00:00',167 'enddate=' + self.selectedDate() + 'T23:59:59',168 'sortfield=name',169 'limit=' + self.resultsLimit(),170 'offset=' + self.resultsOffset(),171 'includemetadata=false'172 ];173 return url + '?' + parameters.join("&");174 }175 var composeDataUrl = function(station) {176 var url = cdoApi.base + cdoApi.data,177 parameters = [178 'datasetid=' + self.dataSet(),179 'stationid=' + station.id,180 'startdate=' + self.selectedDate() + 'T00:00:00',181 'enddate=' + self.selectedDate() + 'T23:59:59',182 'datatypeid=PRCP',183 'datatypeid=SNOW',184 'datatypeid=TMAX',185 'datatypeid=TMIN',186 'datatypeid=TAVG',187 'includemetadata=false'188 ];189 return url + '?' + parameters.join("&");190 };191 var clearMarkers = function() {192 if (self.markers()) {193 self.markers().forEach(function(marker) {194 if (marker.setMap) {195 marker.setMap(null);196 } else {197 console.log("this marker is broken " + typeof marker);198 console.log(marker);199 }200 });201 }202 };203 var safelyCloseInfowindow = function(node) {204 //http://stackoverflow.com/a/25274909205 //google maps will destroy this node and knockout will stop updating it206 //add it back to the body so knockout will take care of it207 $("body").append(node);208 self.infowindowOpen(false);209 if (self.selectedMarker()) {210 self.markers.push(self.selectedMarker());211 self.selectedMarker(false);212 }213 self.selectedInfowindow().close();214 };215 var getStations = function() {216 if (!self.firstLoad()) {217 self.loading(true);218 clearMarkers();219 self.extent(map.getBounds().toUrlValue());220 if (cdoRequest) {cdoRequest.abort();}221 cdoRequest = $.ajax({222 url:composeStationsUrl(),223 headers: {224 token: cdoToken225 }226 }).done(function(response) {227 self.results(response.results);228 }).fail(function() {229 console.log("stations failed!");230 }).always(function() {231 self.loading(false);232 });233 } else {234 self.firstLoad(false);235 }236 };237 var getData = function(station) {238 self.loading(true);239 $.ajax({240 url:composeDataUrl(station),241 headers: {242 token: cdoToken243 }244 }).done(function(response) {245 var data = [];246 if (Object.getOwnPropertyNames(response).length > 0) {247 response.results.forEach(function(result) {248 data.push(scaleValue(result));249 });250 } else {251 data.push({name:'Sorry,', value:' no data', units:' :('});252 }253 self.selectedData(data);254 }).fail(function() {255 console.log("data failed!");256 }).always(function() {257 self.loading(false);258 });259 };260 var handleMarkerClick = function(marker, result) {261 // Close current info window if any262 if (self.selectedInfowindow()) {263 self.selectedInfowindow().setContent($("#infowindow-closing").html());264 }265 // Remove marker so that when we clear markers, this one stays266 self.selectedMarker(self.markers.remove(marker)[0]);267 self.selectedStation(result);268 var $node = $('#infowindow');269 var infowindow = new google.maps.InfoWindow({270 content: $node[0]271 });272 // Clear data and get new data273 self.selectedData([]);274 getData(result);275 infowindow.open(map,marker);276 self.infowindowOpen(true);277 self.selectedInfowindow(infowindow);278 google.maps.event.addListener(infowindow, "closeclick", function () {279 safelyCloseInfowindow($node);280 });281 google.maps.event.addListener(infowindow, "content_changed", function () {282 // Because there is no closed event for info window, I'm setting the283 // content and hooking into that event here.284 safelyCloseInfowindow($node);285 });286 };287 var fetchMaxDate = function() {288 var url = cdoApi.base + cdoApi.datasets + "/" + self.dataSet();289 $.ajax({290 'url':url,291 headers: {292 token: cdoToken293 }294 }).done(function(response) {295 var currentdate = self.selectedDate().split('-').join(''),296 maxdate = response.maxdate.substring(0,10).split('-').join('');297 self.maxDate(response.maxdate.substring(0,10));298 datepicker.datepicker( "option", "maxDate", response.maxdate );299 /* if (currentdate > maxdate) {300 currentdate = new Date(Date.UTC(self.maxDate()));301 currentdate.setUTCDate(currentdate.getUTCDate() -5);302 datepicker.datepicker( "setDate", currentdate );303 self.selectedDate(currentdate.toISOString().substring(0,10));304 } */305 }).fail(function(response) {306 console.log("fetchMaxDate has failed");307 }).always(function() {308 });309 }310 /* initialize */311 // Clear geolocator input312 $("#google_geolocator").val("");313 // Get maxdate of datset and set datepicker maxdate314 fetchMaxDate();315 // Init the map316 var mapOptions = {317 center: { lat: 39.10102067020093, lng: -101.07749658203123 },318 zoom: 4,319 disableDefaultUI: true,320 zoomControl: true,321 zoomControlOptions: {322 position: google.maps.ControlPosition.LEFT_CENTER323 }324 };325 map = new google.maps.Map(document.getElementById('gmap'), mapOptions);326 // Set map idle event. This is when we look up stations327 google.maps.event.addListener(map, 'idle', function() {328 getStations();329 });330 // Init autocomplete331 autocomplete = new google.maps.places.Autocomplete(document.getElementById('google_geolocator'));332 autocomplete.setTypes(['geocode']);333 // Set up place changed event334 google.maps.event.addListener(autocomplete, 'place_changed', function() {335 var place = autocomplete.getPlace();336 if (place.geometry.viewport) {337 map.fitBounds(place.geometry.viewport);338 } else {339 map.setCenter(place.geometry.location);340 }341 });342 /* events */343 self.results.subscribe(function() {344 // Create a marker for each result345 if (self.results() && self.results().length > 0) {346 self.results().forEach(function(result) {347 var marker = new google.maps.Marker({348 position:{lat: result.latitude, lng: result.longitude},349 map: map,350 title: result.id351 });352 self.markers.push(marker);353 // Create a click event for each marker354 google.maps.event.addListener(marker, 'click', function() {355 handleMarkerClick(marker, result);356 });357 });358 }359 });360 self.selectedDate.subscribe(function() {361 getStations();362 if (self.infowindowOpen()) {363 safelyCloseInfowindow();364 }365 });366 self.selectedTEMP.subscribe(function() {367 if (self.infowindowOpen()) {368 safelyCloseInfowindow();369 }370 });371 self.selectedPRCP.subscribe(function() {372 if (self.infowindowOpen()) {373 safelyCloseInfowindow();374 }375 });376 };377 return quickDataTool;...
Using AI Code Generation
1const { CDOToken } = require('playwright-internal');2const { chromium } = require('playwright-internal');3(async () => {4 const browser = await chromium.launch();5 const page = await browser.newPage();6 const token = await CDOToken.generate(page);7 console.log(token);8 await browser.close();9})();10const { chromium } = require('playwright');11(async () => {12 const browser = await chromium.launch();13 const page = await browser.newPage();14 const token = await page.CDOToken.generate();15 console.log(token);16 await browser.close();17})();
Using AI Code Generation
1const { CDOToken } = require('playwright');2const { chromium } = require('playwright');3const { firefox } = require('playwright');4const { webkit } = require('playwright');5(async () => {6 const browser = await chromium.launch();7 const page = await browser.newPage();8 await page.click('text=Sign in');9 await page.fill('input[name="identifier"]', 'seleniumhq');10 await page.click('text=Next');11 await page.fill('input[name="password"]', 'seleniumhq');12 await page.click('text=Next');13 await page.waitForNavigation();14 await page.click('text=Search');15 await page.fill('input[name="q"]', 'playwright');16 await page.click('text=Search');17 await page.click('text=Playwright');18 await page.waitForNavigation();19 await page.click('text=Docs');20 await page.waitForNavigation();21 await page.click('text=API');22 await page.waitForNavigation();23 await page.click('text=class: CDOToken');24 await page.waitForNavigation();25 await page.click('text=Examples');26 await page.waitForNavigation();27 await page.click('text=Usage');28 await page.waitForNavigation();29 await page.waitForNavigation();30 await page.waitForNavigation();31 await page.click('text=const { CDOToken } = require('playwright');');32 await page.waitForNavigation();33 await page.click('text=const { chromium } = require('playwright');');34 await page.waitForNavigation();35 await page.click('text=const { firefox } = require('playwright');');36 await page.waitForNavigation();37 await page.click('text=const { webkit } = require('playwright');');38 await page.waitForNavigation();39 await page.click('text=(async () => {');40 await page.waitForNavigation();41 await page.click('text=const browser = await chromium.launch();');42 await page.waitForNavigation();43 await page.click('text=const page = await browser.newPage();');44 await page.waitForNavigation();
Using AI Code Generation
1const { CDOToken } = require('playwright');2(async () => {3 console.log(token);4})();5const { CDOToken } = require('playwright');6(async () => {7 console.log(token);8})();9const { CDOToken } = require('playwright');10(async () => {11 console.log(token);12})();13const { CDOToken } = require('playwright');14(async () => {15 console.log(token);16})();17const { CDOToken } = require('playwright');18(async () => {19 console.log(token);20})();21const { CDOToken } = require('playwright');22(async () => {23 console.log(token);24})();25const { CDOToken } = require('playwright');26(async () => {27 console.log(token);28})();29const { CDOToken } = require('playwright');30(async () => {31 console.log(token);32})();33const { CDOToken } = require('playwright');34(async () => {35 console.log(token);36})();37const { CDOToken } = require('playwright');38(async () => {39 console.log(token);40})();41const { CDOToken } = require('playwright');42(async () => {43 console.log(token);44})();45const { CDOToken } = require('playwright');
Using AI Code Generation
1const { CDOToken } = require('playwright/lib/server/cdoBrowser');2(async () => {3 const token = await CDOToken.getToken();4 console.log(token);5})();6const { CDOToken } = require('playwright/lib/server/cdoBrowser');7(async () => {8 const token = await CDOToken.getToken();9 console.log(token);10})();11const { CDOToken } = require('playwright/lib/server/cdoBrowser');12(async () => {13 const token = await CDOToken.getToken();14 console.log(token);15})();16const { CDOToken } = require('playwright/lib/server/cdoBrowser');17(async () => {18 const token = await CDOToken.getToken();19 console.log(token);20})();21const { CDOToken } = require('playwright/lib/server/cdoBrowser');22(async () => {23 const token = await CDOToken.getToken();24 console.log(token);25})();26const { CDOToken } = require('playwright/lib/server/cdoBrowser');27(async () => {28 const token = await CDOToken.getToken();29 console.log(token);30})();31const { CDOToken } = require('playwright/lib/server/cdoBrowser');32(async () => {33 const token = await CDOToken.getToken();34 console.log(token);35})();36const { CDOToken } = require('playwright/lib/server/cdoBrowser');37(async () => {38 const token = await CDOToken.getToken();39 console.log(token);40})();
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!