var scratchLN = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // identity function for calling harmony imports with the correct context /******/ __webpack_require__.i = function(value) { return value; }; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 83); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* Utils using lodash style API. (not necessarily 100% compliant) for functional and other utils. These utils should replace usage of lodash in the production code base. not because they are any better... but for the purpose of being a dependency free library. The hotspots in the code are already written in imperative style for performance reasons. so writing several dozen utils which may be slower than the original lodash, does not matter as much considering they will not be invoked in hotspots... */ function isEmpty(arr) { return arr && arr.length === 0; } exports.isEmpty = isEmpty; function keys(obj) { if (obj === undefined || obj === null) { return []; } return Object.keys(obj); } exports.keys = keys; function values(obj) { var vals = []; var keys = Object.keys(obj); for (var i = 0; i < keys.length; i++) { vals.push(obj[keys[i]]); } return vals; } exports.values = values; function mapValues(obj, callback) { var result = []; var objKeys = keys(obj); for (var idx = 0; idx < objKeys.length; idx++) { var currKey = objKeys[idx]; result.push(callback.call(null, obj[currKey], currKey)); } return result; } exports.mapValues = mapValues; function map(arr, callback) { var result = []; for (var idx = 0; idx < arr.length; idx++) { result.push(callback.call(null, arr[idx], idx)); } return result; } exports.map = map; function flatten(arr) { var result = []; for (var idx = 0; idx < arr.length; idx++) { var currItem = arr[idx]; if (Array.isArray(currItem)) { result = result.concat(flatten(currItem)); } else { result.push(currItem); } } return result; } exports.flatten = flatten; function first(arr) { return isEmpty(arr) ? undefined : arr[0]; } exports.first = first; function last(arr) { var len = arr && arr.length; return len ? arr[len - 1] : undefined; } exports.last = last; function forEach(collection, iteratorCallback) { /* istanbul ignore else */ if (Array.isArray(collection)) { for (var i = 0; i < collection.length; i++) { iteratorCallback.call(null, collection[i], i); } } else if (isObject(collection)) { var colKeys = keys(collection); for (var i = 0; i < colKeys.length; i++) { var key = colKeys[i]; var value = collection[key]; iteratorCallback.call(null, value, key); } } else { throw Error("non exhaustive match"); } } exports.forEach = forEach; function isString(item) { return typeof item === "string"; } exports.isString = isString; function isUndefined(item) { return item === undefined; } exports.isUndefined = isUndefined; function isFunction(item) { return item instanceof Function; } exports.isFunction = isFunction; function drop(arr, howMuch) { if (howMuch === void 0) { howMuch = 1; } return arr.slice(howMuch, arr.length); } exports.drop = drop; function dropRight(arr, howMuch) { if (howMuch === void 0) { howMuch = 1; } return arr.slice(0, arr.length - howMuch); } exports.dropRight = dropRight; function filter(arr, predicate) { var result = []; if (Array.isArray(arr)) { for (var i = 0; i < arr.length; i++) { var item = arr[i]; if (predicate.call(null, item)) { result.push(item); } } } return result; } exports.filter = filter; function reject(arr, predicate) { return filter(arr, function (item) { return !predicate(item); }); } exports.reject = reject; function pick(obj, predicate) { var keys = Object.keys(obj); var result = {}; for (var i = 0; i < keys.length; i++) { var currKey = keys[i]; var currItem = obj[currKey]; if (predicate(currItem)) { result[currKey] = currItem; } } return result; } exports.pick = pick; function has(obj, prop) { if (isObject(obj)) { return obj.hasOwnProperty(prop); } return false; } exports.has = has; function contains(arr, item) { return find(arr, function (currItem) { return currItem === item; }) !== undefined ? true : false; } exports.contains = contains; /** * shallow clone */ function cloneArr(arr) { var newArr = []; for (var i = 0; i < arr.length; i++) { newArr.push(arr[i]); } return newArr; } exports.cloneArr = cloneArr; /** * shallow clone */ function cloneObj(obj) { var clonedObj = {}; for (var key in obj) { /* istanbul ignore else */ if (Object.prototype.hasOwnProperty.call(obj, key)) { clonedObj[key] = obj[key]; } } return clonedObj; } exports.cloneObj = cloneObj; function find(arr, predicate) { for (var i = 0; i < arr.length; i++) { var item = arr[i]; if (predicate.call(null, item)) { return item; } } return undefined; } exports.find = find; function findAll(arr, predicate) { var found = []; for (var i = 0; i < arr.length; i++) { var item = arr[i]; if (predicate.call(null, item)) { found.push(item); } } return found; } exports.findAll = findAll; function reduce(arrOrObj, iterator, initial) { var isArr = Array.isArray(arrOrObj); var vals = isArr ? arrOrObj : values(arrOrObj); var objKeys = isArr ? [] : keys(arrOrObj); var accumulator = initial; for (var i = 0; i < vals.length; i++) { accumulator = iterator.call(null, accumulator, vals[i], isArr ? i : objKeys[i]); } return accumulator; } exports.reduce = reduce; function compact(arr) { return reject(arr, function (item) { return item === null || item === undefined; }); } exports.compact = compact; function uniq(arr, identity) { if (identity === void 0) { identity = function (item) { return item; }; } var identities = []; return reduce(arr, function (result, currItem) { var currIdentity = identity(currItem); if (contains(identities, currIdentity)) { return result; } else { identities.push(currIdentity); return result.concat(currItem); } }, []); } exports.uniq = uniq; function partial(func) { var restArgs = []; for (var _i = 1; _i < arguments.length; _i++) { restArgs[_i - 1] = arguments[_i]; } var firstArg = [null]; var allArgs = firstArg.concat(restArgs); return Function.bind.apply(func, allArgs); } exports.partial = partial; function isArray(obj) { return Array.isArray(obj); } exports.isArray = isArray; function isRegExp(obj) { return obj instanceof RegExp; } exports.isRegExp = isRegExp; function isObject(obj) { return obj instanceof Object; } exports.isObject = isObject; function every(arr, predicate) { for (var i = 0; i < arr.length; i++) { if (!predicate(arr[i], i)) { return false; } } return true; } exports.every = every; function difference(arr, values) { return reject(arr, function (item) { return contains(values, item); }); } exports.difference = difference; function some(arr, predicate) { for (var i = 0; i < arr.length; i++) { if (predicate(arr[i])) { return true; } } return false; } exports.some = some; function indexOf(arr, value) { for (var i = 0; i < arr.length; i++) { if (arr[i] === value) { return i; } } return -1; } exports.indexOf = indexOf; function sortBy(arr, orderFunc) { var result = cloneArr(arr); result.sort(function (a, b) { return orderFunc(a) - orderFunc(b); }); return result; } exports.sortBy = sortBy; function zipObject(keys, values) { if (keys.length !== values.length) { throw Error("can't zipObject with different number of keys and values!"); } var result = {}; for (var i = 0; i < keys.length; i++) { result[keys[i]] = values[i]; } return result; } exports.zipObject = zipObject; /** * mutates! (and returns) target */ function assign(target) { var sources = []; for (var _i = 1; _i < arguments.length; _i++) { sources[_i - 1] = arguments[_i]; } for (var i = 0; i < sources.length; i++) { var curSource = sources[i]; var currSourceKeys = keys(curSource); for (var j = 0; j < currSourceKeys.length; j++) { var currKey = currSourceKeys[j]; target[currKey] = curSource[currKey]; } } return target; } exports.assign = assign; /** * mutates! (and returns) target */ function assignNoOverwrite(target) { var sources = []; for (var _i = 1; _i < arguments.length; _i++) { sources[_i - 1] = arguments[_i]; } for (var i = 0; i < sources.length; i++) { var curSource = sources[i]; if (isUndefined(curSource)) { continue; } var currSourceKeys = keys(curSource); for (var j = 0; j < currSourceKeys.length; j++) { var currKey = currSourceKeys[j]; if (!has(target, currKey)) { target[currKey] = curSource[currKey]; } } } return target; } exports.assignNoOverwrite = assignNoOverwrite; function defaults() { var sources = []; for (var _i = 0; _i < arguments.length; _i++) { sources[_i] = arguments[_i]; } return assignNoOverwrite.apply(null, [{}].concat(sources)); } exports.defaults = defaults; function groupBy(arr, groupKeyFunc) { var result = {}; forEach(arr, function (item) { var currGroupKey = groupKeyFunc(item); var currGroupArr = result[currGroupKey]; if (currGroupArr) { currGroupArr.push(item); } else { result[currGroupKey] = [item]; } }); return result; } exports.groupBy = groupBy; /** * Merge obj2 into obj1. * Will overwrite existing properties with the same name */ function merge(obj1, obj2) { var result = cloneObj(obj1); var keys2 = keys(obj2); for (var i = 0; i < keys2.length; i++) { var key = keys2[i]; var value = obj2[key]; result[key] = value; } return result; } exports.merge = merge; function NOOP() { } exports.NOOP = NOOP; function IDENTITY(item) { return item; } exports.IDENTITY = IDENTITY; /** * Will return a new packed array with same values. */ function packArray(holeyArr) { var result = []; for (var i = 0; i < holeyArr.length; i++) { var orgValue = holeyArr[i]; result.push(orgValue !== undefined ? orgValue : undefined); } return result; } exports.packArray = packArray; function PRINT_ERROR(msg) { /* istanbul ignore else - can't override global.console in node.js */ if (console && console.error) { console.error("Error: " + msg); } } exports.PRINT_ERROR = PRINT_ERROR; function PRINT_WARNING(msg) { /* istanbul ignore else - can't override global.console in node.js*/ if (console && console.warn) { // TODO: modify docs accordingly console.warn("Warning: " + msg); } } exports.PRINT_WARNING = PRINT_WARNING; //# sourceMappingURL=utils.js.map /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = __webpack_require__(0); var tokens_public_1 = __webpack_require__(3); var AbstractProduction = /** @class */ (function () { function AbstractProduction(definition) { this.definition = definition; } AbstractProduction.prototype.accept = function (visitor) { visitor.visit(this); utils_1.forEach(this.definition, function (prod) { prod.accept(visitor); }); }; return AbstractProduction; }()); exports.AbstractProduction = AbstractProduction; var NonTerminal = /** @class */ (function (_super) { __extends(NonTerminal, _super); function NonTerminal(options) { var _this = _super.call(this, []) || this; _this.idx = 1; utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; })); return _this; } Object.defineProperty(NonTerminal.prototype, "definition", { get: function () { if (this.referencedRule !== undefined) { return this.referencedRule.definition; } return []; }, set: function (definition) { // immutable }, enumerable: true, configurable: true }); NonTerminal.prototype.accept = function (visitor) { visitor.visit(this); // don't visit children of a reference, we will get cyclic infinite loops if we do so }; return NonTerminal; }(AbstractProduction)); exports.NonTerminal = NonTerminal; var Rule = /** @class */ (function (_super) { __extends(Rule, _super); function Rule(options) { var _this = _super.call(this, options.definition) || this; _this.orgText = ""; utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; })); return _this; } return Rule; }(AbstractProduction)); exports.Rule = Rule; var Flat = /** @class */ (function (_super) { __extends(Flat, _super); // A named Flat production is used to indicate a Nested Rule in an alternation function Flat(options) { var _this = _super.call(this, options.definition) || this; utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; })); return _this; } return Flat; }(AbstractProduction)); exports.Flat = Flat; var Option = /** @class */ (function (_super) { __extends(Option, _super); function Option(options) { var _this = _super.call(this, options.definition) || this; _this.idx = 1; utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; })); return _this; } return Option; }(AbstractProduction)); exports.Option = Option; var RepetitionMandatory = /** @class */ (function (_super) { __extends(RepetitionMandatory, _super); function RepetitionMandatory(options) { var _this = _super.call(this, options.definition) || this; _this.idx = 1; utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; })); return _this; } return RepetitionMandatory; }(AbstractProduction)); exports.RepetitionMandatory = RepetitionMandatory; var RepetitionMandatoryWithSeparator = /** @class */ (function (_super) { __extends(RepetitionMandatoryWithSeparator, _super); function RepetitionMandatoryWithSeparator(options) { var _this = _super.call(this, options.definition) || this; _this.idx = 1; utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; })); return _this; } return RepetitionMandatoryWithSeparator; }(AbstractProduction)); exports.RepetitionMandatoryWithSeparator = RepetitionMandatoryWithSeparator; var Repetition = /** @class */ (function (_super) { __extends(Repetition, _super); function Repetition(options) { var _this = _super.call(this, options.definition) || this; _this.idx = 1; utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; })); return _this; } return Repetition; }(AbstractProduction)); exports.Repetition = Repetition; var RepetitionWithSeparator = /** @class */ (function (_super) { __extends(RepetitionWithSeparator, _super); function RepetitionWithSeparator(options) { var _this = _super.call(this, options.definition) || this; _this.idx = 1; utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; })); return _this; } return RepetitionWithSeparator; }(AbstractProduction)); exports.RepetitionWithSeparator = RepetitionWithSeparator; var Alternation = /** @class */ (function (_super) { __extends(Alternation, _super); function Alternation(options) { var _this = _super.call(this, options.definition) || this; _this.idx = 1; utils_1.assign(_this, utils_1.pick(options, function (v) { return v !== undefined; })); return _this; } return Alternation; }(AbstractProduction)); exports.Alternation = Alternation; var Terminal = /** @class */ (function () { function Terminal(options) { this.idx = 1; utils_1.assign(this, utils_1.pick(options, function (v) { return v !== undefined; })); } Terminal.prototype.accept = function (visitor) { visitor.visit(this); }; return Terminal; }()); exports.Terminal = Terminal; function serializeGrammar(topRules) { return utils_1.map(topRules, serializeProduction); } exports.serializeGrammar = serializeGrammar; function serializeProduction(node) { function convertDefinition(definition) { return utils_1.map(definition, serializeProduction); } /* istanbul ignore else */ if (node instanceof NonTerminal) { return { type: "NonTerminal", name: node.nonTerminalName, idx: node.idx }; } else if (node instanceof Flat) { return { type: "Flat", definition: convertDefinition(node.definition) }; } else if (node instanceof Option) { return { type: "Option", idx: node.idx, definition: convertDefinition(node.definition) }; } else if (node instanceof RepetitionMandatory) { return { type: "RepetitionMandatory", name: node.name, idx: node.idx, definition: convertDefinition(node.definition) }; } else if (node instanceof RepetitionMandatoryWithSeparator) { return { type: "RepetitionMandatoryWithSeparator", name: node.name, idx: node.idx, separator: (serializeProduction(new Terminal({ terminalType: node.separator }))), definition: convertDefinition(node.definition) }; } else if (node instanceof RepetitionWithSeparator) { return { type: "RepetitionWithSeparator", name: node.name, idx: node.idx, separator: (serializeProduction(new Terminal({ terminalType: node.separator }))), definition: convertDefinition(node.definition) }; } else if (node instanceof Repetition) { return { type: "Repetition", name: node.name, idx: node.idx, definition: convertDefinition(node.definition) }; } else if (node instanceof Alternation) { return { type: "Alternation", name: node.name, idx: node.idx, definition: convertDefinition(node.definition) }; } else if (node instanceof Terminal) { var serializedTerminal = { type: "Terminal", name: tokens_public_1.tokenName(node.terminalType), label: tokens_public_1.tokenLabel(node.terminalType), idx: node.idx }; var pattern = node.terminalType.PATTERN; if (node.terminalType.PATTERN) { serializedTerminal.pattern = utils_1.isRegExp(pattern) ? pattern.source : pattern; } return serializedTerminal; } else if (node instanceof Rule) { return { type: "Rule", name: node.name, orgText: node.orgText, definition: convertDefinition(node.definition) }; } else { throw Error("non exhaustive match"); } } exports.serializeProduction = serializeProduction; //# sourceMappingURL=gast_public.js.map /***/ }), /* 2 */ /***/ (function(module, exports, __webpack_require__) { // Generated by CoffeeScript 1.12.7 (function() { var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLProcessingInstruction, XMLRaw, XMLText, isEmpty, isFunction, isObject, ref, hasProp = {}.hasOwnProperty; ref = __webpack_require__(4), isObject = ref.isObject, isFunction = ref.isFunction, isEmpty = ref.isEmpty; XMLElement = null; XMLCData = null; XMLComment = null; XMLDeclaration = null; XMLDocType = null; XMLRaw = null; XMLText = null; XMLProcessingInstruction = null; module.exports = XMLNode = (function() { function XMLNode(parent) { this.parent = parent; if (this.parent) { this.options = this.parent.options; this.stringify = this.parent.stringify; } this.children = []; if (!XMLElement) { XMLElement = __webpack_require__(20); XMLCData = __webpack_require__(12); XMLComment = __webpack_require__(13); XMLDeclaration = __webpack_require__(18); XMLDocType = __webpack_require__(19); XMLRaw = __webpack_require__(22); XMLText = __webpack_require__(23); XMLProcessingInstruction = __webpack_require__(21); } } XMLNode.prototype.element = function(name, attributes, text) { var childNode, item, j, k, key, lastChild, len, len1, ref1, val; lastChild = null; if (attributes == null) { attributes = {}; } attributes = attributes.valueOf(); if (!isObject(attributes)) { ref1 = [attributes, text], text = ref1[0], attributes = ref1[1]; } if (name != null) { name = name.valueOf(); } if (Array.isArray(name)) { for (j = 0, len = name.length; j < len; j++) { item = name[j]; lastChild = this.element(item); } } else if (isFunction(name)) { lastChild = this.element(name.apply()); } else if (isObject(name)) { for (key in name) { if (!hasProp.call(name, key)) continue; val = name[key]; if (isFunction(val)) { val = val.apply(); } if ((isObject(val)) && (isEmpty(val))) { val = null; } if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) { lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val); } else if (!this.options.separateArrayItems && Array.isArray(val)) { for (k = 0, len1 = val.length; k < len1; k++) { item = val[k]; childNode = {}; childNode[key] = item; lastChild = this.element(childNode); } } else if (isObject(val)) { lastChild = this.element(key); lastChild.element(val); } else { lastChild = this.element(key, val); } } } else { if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) { lastChild = this.text(text); } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) { lastChild = this.cdata(text); } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) { lastChild = this.comment(text); } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) { lastChild = this.raw(text); } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) { lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text); } else { lastChild = this.node(name, attributes, text); } } if (lastChild == null) { throw new Error("Could not create any elements with: " + name); } return lastChild; }; XMLNode.prototype.insertBefore = function(name, attributes, text) { var child, i, removed; if (this.isRoot) { throw new Error("Cannot insert elements at root level"); } i = this.parent.children.indexOf(this); removed = this.parent.children.splice(i); child = this.parent.element(name, attributes, text); Array.prototype.push.apply(this.parent.children, removed); return child; }; XMLNode.prototype.insertAfter = function(name, attributes, text) { var child, i, removed; if (this.isRoot) { throw new Error("Cannot insert elements at root level"); } i = this.parent.children.indexOf(this); removed = this.parent.children.splice(i + 1); child = this.parent.element(name, attributes, text); Array.prototype.push.apply(this.parent.children, removed); return child; }; XMLNode.prototype.remove = function() { var i, ref1; if (this.isRoot) { throw new Error("Cannot remove the root element"); } i = this.parent.children.indexOf(this); [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref1 = [])), ref1; return this.parent; }; XMLNode.prototype.node = function(name, attributes, text) { var child, ref1; if (name != null) { name = name.valueOf(); } attributes || (attributes = {}); attributes = attributes.valueOf(); if (!isObject(attributes)) { ref1 = [attributes, text], text = ref1[0], attributes = ref1[1]; } child = new XMLElement(this, name, attributes); if (text != null) { child.text(text); } this.children.push(child); return child; }; XMLNode.prototype.text = function(value) { var child; child = new XMLText(this, value); this.children.push(child); return this; }; XMLNode.prototype.cdata = function(value) { var child; child = new XMLCData(this, value); this.children.push(child); return this; }; XMLNode.prototype.comment = function(value) { var child; child = new XMLComment(this, value); this.children.push(child); return this; }; XMLNode.prototype.commentBefore = function(value) { var child, i, removed; i = this.parent.children.indexOf(this); removed = this.parent.children.splice(i); child = this.parent.comment(value); Array.prototype.push.apply(this.parent.children, removed); return this; }; XMLNode.prototype.commentAfter = function(value) { var child, i, removed; i = this.parent.children.indexOf(this); removed = this.parent.children.splice(i + 1); child = this.parent.comment(value); Array.prototype.push.apply(this.parent.children, removed); return this; }; XMLNode.prototype.raw = function(value) { var child; child = new XMLRaw(this, value); this.children.push(child); return this; }; XMLNode.prototype.instruction = function(target, value) { var insTarget, insValue, instruction, j, len; if (target != null) { target = target.valueOf(); } if (value != null) { value = value.valueOf(); } if (Array.isArray(target)) { for (j = 0, len = target.length; j < len; j++) { insTarget = target[j]; this.instruction(insTarget); } } else if (isObject(target)) { for (insTarget in target) { if (!hasProp.call(target, insTarget)) continue; insValue = target[insTarget]; this.instruction(insTarget, insValue); } } else { if (isFunction(value)) { value = value.apply(); } instruction = new XMLProcessingInstruction(this, target, value); this.children.push(instruction); } return this; }; XMLNode.prototype.instructionBefore = function(target, value) { var child, i, removed; i = this.parent.children.indexOf(this); removed = this.parent.children.splice(i); child = this.parent.instruction(target, value); Array.prototype.push.apply(this.parent.children, removed); return this; }; XMLNode.prototype.instructionAfter = function(target, value) { var child, i, removed; i = this.parent.children.indexOf(this); removed = this.parent.children.splice(i + 1); child = this.parent.instruction(target, value); Array.prototype.push.apply(this.parent.children, removed); return this; }; XMLNode.prototype.declaration = function(version, encoding, standalone) { var doc, xmldec; doc = this.document(); xmldec = new XMLDeclaration(doc, version, encoding, standalone); if (doc.children[0] instanceof XMLDeclaration) { doc.children[0] = xmldec; } else { doc.children.unshift(xmldec); } return doc.root() || doc; }; XMLNode.prototype.doctype = function(pubID, sysID) { var child, doc, doctype, i, j, k, len, len1, ref1, ref2; doc = this.document(); doctype = new XMLDocType(doc, pubID, sysID); ref1 = doc.children; for (i = j = 0, len = ref1.length; j < len; i = ++j) { child = ref1[i]; if (child instanceof XMLDocType) { doc.children[i] = doctype; return doctype; } } ref2 = doc.children; for (i = k = 0, len1 = ref2.length; k < len1; i = ++k) { child = ref2[i]; if (child.isRoot) { doc.children.splice(i, 0, doctype); return doctype; } } doc.children.push(doctype); return doctype; }; XMLNode.prototype.up = function() { if (this.isRoot) { throw new Error("The root node has no parent. Use doc() if you need to get the document object."); } return this.parent; }; XMLNode.prototype.root = function() { var node; node = this; while (node) { if (node.isDocument) { return node.rootObject; } else if (node.isRoot) { return node; } else { node = node.parent; } } }; XMLNode.prototype.document = function() { var node; node = this; while (node) { if (node.isDocument) { return node; } else { node = node.parent; } } }; XMLNode.prototype.end = function(options) { return this.document().end(options); }; XMLNode.prototype.prev = function() { var i; i = this.parent.children.indexOf(this); if (i < 1) { throw new Error("Already at the first node"); } return this.parent.children[i - 1]; }; XMLNode.prototype.next = function() { var i; i = this.parent.children.indexOf(this); if (i === -1 || i === this.parent.children.length - 1) { throw new Error("Already at the last node"); } return this.parent.children[i + 1]; }; XMLNode.prototype.importDocument = function(doc) { var clonedRoot; clonedRoot = doc.root().clone(); clonedRoot.parent = this; clonedRoot.isRoot = false; this.children.push(clonedRoot); return this; }; XMLNode.prototype.ele = function(name, attributes, text) { return this.element(name, attributes, text); }; XMLNode.prototype.nod = function(name, attributes, text) { return this.node(name, attributes, text); }; XMLNode.prototype.txt = function(value) { return this.text(value); }; XMLNode.prototype.dat = function(value) { return this.cdata(value); }; XMLNode.prototype.com = function(value) { return this.comment(value); }; XMLNode.prototype.ins = function(target, value) { return this.instruction(target, value); }; XMLNode.prototype.doc = function() { return this.document(); }; XMLNode.prototype.dec = function(version, encoding, standalone) { return this.declaration(version, encoding, standalone); }; XMLNode.prototype.dtd = function(pubID, sysID) { return this.doctype(pubID, sysID); }; XMLNode.prototype.e = function(name, attributes, text) { return this.element(name, attributes, text); }; XMLNode.prototype.n = function(name, attributes, text) { return this.node(name, attributes, text); }; XMLNode.prototype.t = function(value) { return this.text(value); }; XMLNode.prototype.d = function(value) { return this.cdata(value); }; XMLNode.prototype.c = function(value) { return this.comment(value); }; XMLNode.prototype.r = function(value) { return this.raw(value); }; XMLNode.prototype.i = function(target, value) { return this.instruction(target, value); }; XMLNode.prototype.u = function() { return this.up(); }; XMLNode.prototype.importXMLBuilder = function(doc) { return this.importDocument(doc); }; return XMLNode; })(); }).call(this); /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = __webpack_require__(0); var lang_extensions_1 = __webpack_require__(5); var lexer_public_1 = __webpack_require__(28); var tokens_1 = __webpack_require__(11); function tokenLabel(clazz) { if (hasTokenLabel(clazz)) { return clazz.LABEL; } else { return tokenName(clazz); } } exports.tokenLabel = tokenLabel; function hasTokenLabel(obj) { return utils_1.isString(obj.LABEL) && obj.LABEL !== ""; } exports.hasTokenLabel = hasTokenLabel; function tokenName(obj) { // The tokenName property is needed under some old versions of node.js (0.10/0.12) // where the Function.prototype.name property is not defined as a 'configurable' property // enable producing readable error messages. /* istanbul ignore if -> will only run in old versions of node.js */ if (utils_1.isObject(obj) && obj.hasOwnProperty("tokenName") && utils_1.isString(obj.tokenName)) { return obj.tokenName; } else { return lang_extensions_1.functionName(obj); } } exports.tokenName = tokenName; var PARENT = "parent"; var CATEGORIES = "categories"; var LABEL = "label"; var GROUP = "group"; var PUSH_MODE = "push_mode"; var POP_MODE = "pop_mode"; var LONGER_ALT = "longer_alt"; var LINE_BREAKS = "line_breaks"; var START_CHARS_HINT = "start_chars_hint"; function createToken(config) { return createTokenInternal(config); } exports.createToken = createToken; function createTokenInternal(config) { var tokenName = config.name; var pattern = config.pattern; var tokenType = {}; // can be overwritten according to: // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/ // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname /* istanbul ignore if -> will only run in old versions of node.js */ if (!lang_extensions_1.defineNameProp(tokenType, tokenName)) { // hack to save the tokenName in situations where the constructor's name property cannot be reconfigured tokenType.tokenName = tokenName; } if (!utils_1.isUndefined(pattern)) { tokenType.PATTERN = pattern; } if (utils_1.has(config, PARENT)) { throw "The parent property is no longer supported.\n" + "See: https://github.com/SAP/chevrotain/issues/564#issuecomment-349062346 for details."; } if (utils_1.has(config, CATEGORIES)) { tokenType.CATEGORIES = config[CATEGORIES]; } tokens_1.augmentTokenTypes([tokenType]); if (utils_1.has(config, LABEL)) { tokenType.LABEL = config[LABEL]; } if (utils_1.has(config, GROUP)) { tokenType.GROUP = config[GROUP]; } if (utils_1.has(config, POP_MODE)) { tokenType.POP_MODE = config[POP_MODE]; } if (utils_1.has(config, PUSH_MODE)) { tokenType.PUSH_MODE = config[PUSH_MODE]; } if (utils_1.has(config, LONGER_ALT)) { tokenType.LONGER_ALT = config[LONGER_ALT]; } if (utils_1.has(config, LINE_BREAKS)) { tokenType.LINE_BREAKS = config[LINE_BREAKS]; } if (utils_1.has(config, START_CHARS_HINT)) { tokenType.START_CHARS_HINT = config[START_CHARS_HINT]; } return tokenType; } exports.EOF = createToken({ name: "EOF", pattern: lexer_public_1.Lexer.NA }); tokens_1.augmentTokenTypes([exports.EOF]); function createTokenInstance(tokType, image, startOffset, endOffset, startLine, endLine, startColumn, endColumn) { return { image: image, startOffset: startOffset, endOffset: endOffset, startLine: startLine, endLine: endLine, startColumn: startColumn, endColumn: endColumn, tokenTypeIdx: tokType.tokenTypeIdx, tokenType: tokType }; } exports.createTokenInstance = createTokenInstance; function tokenMatcher(token, tokType) { return tokens_1.tokenStructuredMatcher(token, tokType); } exports.tokenMatcher = tokenMatcher; //# sourceMappingURL=tokens_public.js.map /***/ }), /* 4 */ /***/ (function(module, exports) { // Generated by CoffeeScript 1.12.7 (function() { var assign, isArray, isEmpty, isFunction, isObject, isPlainObject, slice = [].slice, hasProp = {}.hasOwnProperty; assign = function() { var i, key, len, source, sources, target; target = arguments[0], sources = 2 <= arguments.length ? slice.call(arguments, 1) : []; if (isFunction(Object.assign)) { Object.assign.apply(null, arguments); } else { for (i = 0, len = sources.length; i < len; i++) { source = sources[i]; if (source != null) { for (key in source) { if (!hasProp.call(source, key)) continue; target[key] = source[key]; } } } } return target; }; isFunction = function(val) { return !!val && Object.prototype.toString.call(val) === '[object Function]'; }; isObject = function(val) { var ref; return !!val && ((ref = typeof val) === 'function' || ref === 'object'); }; isArray = function(val) { if (isFunction(Array.isArray)) { return Array.isArray(val); } else { return Object.prototype.toString.call(val) === '[object Array]'; } }; isEmpty = function(val) { var key; if (isArray(val)) { return !val.length; } else { for (key in val) { if (!hasProp.call(val, key)) continue; return false; } return true; } }; isPlainObject = function(val) { var ctor, proto; return isObject(val) && (proto = Object.getPrototypeOf(val)) && (ctor = proto.constructor) && (typeof ctor === 'function') && (ctor instanceof ctor) && (Function.prototype.toString.call(ctor) === Function.prototype.toString.call(Object)); }; module.exports.assign = assign; module.exports.isFunction = isFunction; module.exports.isObject = isObject; module.exports.isArray = isArray; module.exports.isEmpty = isEmpty; module.exports.isPlainObject = isPlainObject; }).call(this); /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = __webpack_require__(0); function classNameFromInstance(instance) { return functionName(instance.constructor); } exports.classNameFromInstance = classNameFromInstance; var FUNC_NAME_REGEXP = /^\s*function\s*(\S*)\s*\(/; var NAME = "name"; /* istanbul ignore next too many hacks for IE/old versions of node.js here*/ function functionName(func) { // Engines that support Function.prototype.name OR the nth (n>1) time after // the name has been computed in the following else block. var existingNameProp = func.name; if (existingNameProp) { return existingNameProp; } // hack for IE and engines that do not support Object.defineProperty on function.name (Node.js 0.10 && 0.12) var computedName = func.toString().match(FUNC_NAME_REGEXP)[1]; return computedName; } exports.functionName = functionName; /** * @returns {boolean} - has the property been successfully defined */ function defineNameProp(obj, nameValue) { var namePropDescriptor = Object.getOwnPropertyDescriptor(obj, NAME); /* istanbul ignore else -> will only run in old versions of node.js */ if (utils_1.isUndefined(namePropDescriptor) || namePropDescriptor.configurable) { Object.defineProperty(obj, NAME, { enumerable: false, configurable: true, writable: false, value: nameValue }); return true; } /* istanbul ignore next -> will only run in old versions of node.js */ return false; } exports.defineNameProp = defineNameProp; /** * simple Hashtable between a string and some generic value * this should be removed once typescript supports ES6 style Hashtable */ var HashTable = /** @class */ (function () { function HashTable() { this._state = {}; } HashTable.prototype.keys = function () { return utils_1.keys(this._state); }; HashTable.prototype.values = function () { return utils_1.values(this._state); }; HashTable.prototype.put = function (key, value) { this._state[key] = value; }; HashTable.prototype.putAll = function (other) { this._state = utils_1.assign(this._state, other._state); }; HashTable.prototype.get = function (key) { // To avoid edge case with a key called "hasOwnProperty" we need to perform the commented out check below // -> if (Object.prototype.hasOwnProperty.call(this._state, key)) { ... } <- // however this costs nearly 25% of the parser's runtime. // if someone decides to name their Parser class "hasOwnProperty" they deserve what they will get :) return this._state[key]; }; HashTable.prototype.containsKey = function (key) { return utils_1.has(this._state, key); }; HashTable.prototype.clear = function () { this._state = {}; }; return HashTable; }()); exports.HashTable = HashTable; //# sourceMappingURL=lang_extensions.js.map /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var gast_public_1 = __webpack_require__(1); var GAstVisitor = /** @class */ (function () { function GAstVisitor() { } GAstVisitor.prototype.visit = function (node) { /* istanbul ignore next */ if (node instanceof gast_public_1.NonTerminal) { return this.visitNonTerminal(node); } else if (node instanceof gast_public_1.Flat) { return this.visitFlat(node); } else if (node instanceof gast_public_1.Option) { return this.visitOption(node); } else if (node instanceof gast_public_1.RepetitionMandatory) { return this.visitRepetitionMandatory(node); } else if (node instanceof gast_public_1.RepetitionMandatoryWithSeparator) { return this.visitRepetitionMandatoryWithSeparator(node); } else if (node instanceof gast_public_1.RepetitionWithSeparator) { return this.visitRepetitionWithSeparator(node); } else if (node instanceof gast_public_1.Repetition) { return this.visitRepetition(node); } else if (node instanceof gast_public_1.Alternation) { return this.visitAlternation(node); } else if (node instanceof gast_public_1.Terminal) { return this.visitTerminal(node); } else if (node instanceof gast_public_1.Rule) { return this.visitRule(node); } else { throw Error("non exhaustive match"); } }; GAstVisitor.prototype.visitNonTerminal = function (node) { }; GAstVisitor.prototype.visitFlat = function (node) { }; GAstVisitor.prototype.visitOption = function (node) { }; GAstVisitor.prototype.visitRepetition = function (node) { }; GAstVisitor.prototype.visitRepetitionMandatory = function (node) { }; GAstVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) { }; GAstVisitor.prototype.visitRepetitionWithSeparator = function (node) { }; GAstVisitor.prototype.visitAlternation = function (node) { }; GAstVisitor.prototype.visitTerminal = function (node) { }; GAstVisitor.prototype.visitRule = function (node) { }; return GAstVisitor; }()); exports.GAstVisitor = GAstVisitor; //# sourceMappingURL=gast_visitor_public.js.map /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var parser_public_1 = __webpack_require__(27); var lexer_public_1 = __webpack_require__(28); var tokens_public_1 = __webpack_require__(3); var exceptions_public_1 = __webpack_require__(37); var version_1 = __webpack_require__(29); var errors_public_1 = __webpack_require__(24); var render_public_1 = __webpack_require__(56); var gast_visitor_public_1 = __webpack_require__(6); var gast_public_1 = __webpack_require__(1); var gast_resolver_public_1 = __webpack_require__(39); var generate_public_1 = __webpack_require__(58); /** * defines the public API of * changes here may require major version change. (semVer) */ var API = {}; // semantic version API.VERSION = version_1.VERSION; // runtime API API.Parser = parser_public_1.Parser; API.ParserDefinitionErrorType = parser_public_1.ParserDefinitionErrorType; API.Lexer = lexer_public_1.Lexer; API.LexerDefinitionErrorType = lexer_public_1.LexerDefinitionErrorType; API.EOF = tokens_public_1.EOF; // Tokens utilities API.tokenName = tokens_public_1.tokenName; API.tokenLabel = tokens_public_1.tokenLabel; API.tokenMatcher = tokens_public_1.tokenMatcher; API.createToken = tokens_public_1.createToken; API.createTokenInstance = tokens_public_1.createTokenInstance; // // // Other Utilities API.EMPTY_ALT = parser_public_1.EMPTY_ALT; API.defaultParserErrorProvider = errors_public_1.defaultParserErrorProvider; API.isRecognitionException = exceptions_public_1.isRecognitionException; API.EarlyExitException = exceptions_public_1.EarlyExitException; API.MismatchedTokenException = exceptions_public_1.MismatchedTokenException; API.NotAllInputParsedException = exceptions_public_1.NotAllInputParsedException; API.NoViableAltException = exceptions_public_1.NoViableAltException; // // // grammar reflection API API.Flat = gast_public_1.Flat; API.Repetition = gast_public_1.Repetition; API.RepetitionWithSeparator = gast_public_1.RepetitionWithSeparator; API.RepetitionMandatory = gast_public_1.RepetitionMandatory; API.RepetitionMandatoryWithSeparator = gast_public_1.RepetitionMandatoryWithSeparator; API.Option = gast_public_1.Option; API.Alternation = gast_public_1.Alternation; API.NonTerminal = gast_public_1.NonTerminal; API.Terminal = gast_public_1.Terminal; API.Rule = gast_public_1.Rule; // // GAST Utilities API.GAstVisitor = gast_visitor_public_1.GAstVisitor; API.serializeGrammar = gast_public_1.serializeGrammar; API.serializeProduction = gast_public_1.serializeProduction; API.resolveGrammar = gast_resolver_public_1.resolveGrammar; API.defaultGrammarResolverErrorProvider = errors_public_1.defaultGrammarResolverErrorProvider; API.validateGrammar = gast_resolver_public_1.validateGrammar; API.defaultGrammarValidatorErrorProvider = errors_public_1.defaultGrammarValidatorErrorProvider; API.assignOccurrenceIndices = gast_resolver_public_1.assignOccurrenceIndices; /* istanbul ignore next */ API.clearCache = function () { console.warn("The clearCache function was 'soft' removed from the Chevrotain API." + "\n\t It performs no action other than printing this message." + "\n\t Please avoid using it as it will be completely removed in the future"); }; API.createSyntaxDiagramsCode = render_public_1.createSyntaxDiagramsCode; API.generateParserFactory = generate_public_1.generateParserFactory; API.generateParserModule = generate_public_1.generateParserModule; module.exports = API; //# sourceMappingURL=api.js.map /***/ }), /* 8 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /** * Summary. * * Description. * * @file This files defines the MyClass class. * @author Ellen Vanhove. */ //related to the parser const MODUS = { NONE: 0, STACK: 1, REPORTER: 2, BOOLEAN: 3, }; /* harmony export (immutable) */ __webpack_exports__["a"] = MODUS; //input types in Scratch 3.0 const INPUTTYPE = { NONE: 0, BOOLEAN: 1, //boolean check TEXT: 2, //text and numbers NUMBER: 3, //math_number(no specs) ANGLE: 4,// math_angle(nice view) INTEGER: 5,// math_integer(-1,0,1) POSITIVE_NUMBER: 6, //math_positive_number(0,0.1,1) WHOLE_NUMBER: 7,// math_whole_number(0,1,2) COLOR: 8, //colour_picker DROPDOWN: 9, // does not map to one specific type }; /* harmony export (immutable) */ __webpack_exports__["b"] = INPUTTYPE; //block types in scratch const BLOCKTYPE = { NONE: 0, STATEMENT: 1, REPORTER: 2, BOOLEAN: 3, HATBLOCK: 4, CAPBLOCK: 5 }; /* unused harmony export BLOCKTYPE */ //categories of the blocks const CATEGORY = { NONE: 0, VARIABLES: 1, MYBLOCK: 2, //todo add others }; /* harmony export (immutable) */ __webpack_exports__["c"] = CATEGORY; /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var utils = __webpack_require__(0); var utils_1 = __webpack_require__(0); var parser_public_1 = __webpack_require__(27); var gast_1 = __webpack_require__(10); var tokens_public_1 = __webpack_require__(3); var lookahead_1 = __webpack_require__(41); var cst_1 = __webpack_require__(36); var interpreter_1 = __webpack_require__(25); var gast_public_1 = __webpack_require__(1); var gast_visitor_public_1 = __webpack_require__(6); function validateGrammar(topLevels, maxLookahead, tokenTypes, ignoredIssues, errMsgProvider, grammarName) { var duplicateErrors = utils.map(topLevels, function (currTopLevel) { return validateDuplicateProductions(currTopLevel, errMsgProvider); }); var leftRecursionErrors = utils.map(topLevels, function (currTopRule) { return validateNoLeftRecursion(currTopRule, currTopRule, errMsgProvider); }); var emptyAltErrors = []; var ambiguousAltsErrors = []; // left recursion could cause infinite loops in the following validations. // It is safest to first have the user fix the left recursion errors first and only then examine Further issues. if (utils_1.every(leftRecursionErrors, utils_1.isEmpty)) { emptyAltErrors = utils_1.map(topLevels, function (currTopRule) { return validateEmptyOrAlternative(currTopRule, errMsgProvider); }); ambiguousAltsErrors = utils_1.map(topLevels, function (currTopRule) { return validateAmbiguousAlternationAlternatives(currTopRule, maxLookahead, ignoredIssues, errMsgProvider); }); } var termsNamespaceConflictErrors = checkTerminalAndNoneTerminalsNameSpace(topLevels, tokenTypes, errMsgProvider); var tokenNameErrors = utils.map(tokenTypes, function (currTokType) { return validateTokenName(currTokType, errMsgProvider); }); var nestedRulesNameErrors = validateNestedRulesNames(topLevels, errMsgProvider); var nestedRulesDuplicateErrors = validateDuplicateNestedRules(topLevels, errMsgProvider); var emptyRepetitionErrors = validateSomeNonEmptyLookaheadPath(topLevels, maxLookahead, errMsgProvider); var tooManyAltsErrors = utils_1.map(topLevels, function (curRule) { return validateTooManyAlts(curRule, errMsgProvider); }); var ruleNameErrors = utils_1.map(topLevels, function (curRule) { return validateRuleName(curRule, errMsgProvider); }); var duplicateRulesError = utils_1.map(topLevels, function (curRule) { return validateRuleDoesNotAlreadyExist(curRule, topLevels, grammarName, errMsgProvider); }); return (utils.flatten(duplicateErrors.concat(tokenNameErrors, nestedRulesNameErrors, nestedRulesDuplicateErrors, emptyRepetitionErrors, leftRecursionErrors, emptyAltErrors, ambiguousAltsErrors, termsNamespaceConflictErrors, tooManyAltsErrors, ruleNameErrors, duplicateRulesError))); } exports.validateGrammar = validateGrammar; function validateNestedRulesNames(topLevels, errMsgProvider) { var result = []; utils_1.forEach(topLevels, function (curTopLevel) { var namedCollectorVisitor = new cst_1.NamedDSLMethodsCollectorVisitor(""); curTopLevel.accept(namedCollectorVisitor); var nestedProds = utils_1.map(namedCollectorVisitor.result, function (currItem) { return currItem.orgProd; }); result.push(utils_1.map(nestedProds, function (currNestedProd) { return validateNestedRuleName(curTopLevel, currNestedProd, errMsgProvider); })); }); return utils_1.flatten(result); } function validateDuplicateProductions(topLevelRule, errMsgProvider) { var collectorVisitor = new OccurrenceValidationCollector(); topLevelRule.accept(collectorVisitor); var allRuleProductions = collectorVisitor.allProductions; var productionGroups = utils.groupBy(allRuleProductions, identifyProductionForDuplicates); var duplicates = utils.pick(productionGroups, function (currGroup) { return currGroup.length > 1; }); var errors = utils.map(utils.values(duplicates), function (currDuplicates) { var firstProd = utils.first(currDuplicates); var msg = errMsgProvider.buildDuplicateFoundError(topLevelRule, currDuplicates); var dslName = gast_1.getProductionDslName(firstProd); var defError = { message: msg, type: parser_public_1.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS, ruleName: topLevelRule.name, dslName: dslName, occurrence: firstProd.idx }; var param = getExtraProductionArgument(firstProd); if (param) { defError.parameter = param; } return defError; }); return errors; } function identifyProductionForDuplicates(prod) { return gast_1.getProductionDslName(prod) + "_#_" + prod.idx + "_#_" + getExtraProductionArgument(prod); } exports.identifyProductionForDuplicates = identifyProductionForDuplicates; function getExtraProductionArgument(prod) { if (prod instanceof gast_public_1.Terminal) { return tokens_public_1.tokenName(prod.terminalType); } else if (prod instanceof gast_public_1.NonTerminal) { return prod.nonTerminalName; } else { return ""; } } var OccurrenceValidationCollector = /** @class */ (function (_super) { __extends(OccurrenceValidationCollector, _super); function OccurrenceValidationCollector() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.allProductions = []; return _this; } OccurrenceValidationCollector.prototype.visitNonTerminal = function (subrule) { this.allProductions.push(subrule); }; OccurrenceValidationCollector.prototype.visitOption = function (option) { this.allProductions.push(option); }; OccurrenceValidationCollector.prototype.visitRepetitionWithSeparator = function (manySep) { this.allProductions.push(manySep); }; OccurrenceValidationCollector.prototype.visitRepetitionMandatory = function (atLeastOne) { this.allProductions.push(atLeastOne); }; OccurrenceValidationCollector.prototype.visitRepetitionMandatoryWithSeparator = function (atLeastOneSep) { this.allProductions.push(atLeastOneSep); }; OccurrenceValidationCollector.prototype.visitRepetition = function (many) { this.allProductions.push(many); }; OccurrenceValidationCollector.prototype.visitAlternation = function (or) { this.allProductions.push(or); }; OccurrenceValidationCollector.prototype.visitTerminal = function (terminal) { this.allProductions.push(terminal); }; return OccurrenceValidationCollector; }(gast_visitor_public_1.GAstVisitor)); exports.OccurrenceValidationCollector = OccurrenceValidationCollector; exports.validTermsPattern = /^[a-zA-Z_]\w*$/; exports.validNestedRuleName = new RegExp(exports.validTermsPattern.source.replace("^", "^\\$")); function validateRuleName(rule, errMsgProvider) { var errors = []; var ruleName = rule.name; if (!ruleName.match(exports.validTermsPattern)) { errors.push({ message: errMsgProvider.buildInvalidRuleNameError({ topLevelRule: rule, expectedPattern: exports.validTermsPattern }), type: parser_public_1.ParserDefinitionErrorType.INVALID_RULE_NAME, ruleName: ruleName }); } return errors; } exports.validateRuleName = validateRuleName; function validateNestedRuleName(topLevel, nestedProd, errMsgProvider) { var errors = []; var errMsg; if (!nestedProd.name.match(exports.validNestedRuleName)) { errMsg = errMsgProvider.buildInvalidNestedRuleNameError(topLevel, nestedProd); errors.push({ message: errMsg, type: parser_public_1.ParserDefinitionErrorType.INVALID_NESTED_RULE_NAME, ruleName: topLevel.name }); } return errors; } exports.validateNestedRuleName = validateNestedRuleName; function validateTokenName(tokenType, errMsgProvider) { var errors = []; var tokTypeName = tokens_public_1.tokenName(tokenType); if (!tokTypeName.match(exports.validTermsPattern)) { errors.push({ message: errMsgProvider.buildTokenNameError({ tokenType: tokenType, expectedPattern: exports.validTermsPattern }), type: parser_public_1.ParserDefinitionErrorType.INVALID_TOKEN_NAME }); } return errors; } exports.validateTokenName = validateTokenName; function validateRuleDoesNotAlreadyExist(rule, allRules, className, errMsgProvider) { var errors = []; var occurrences = utils_1.reduce(allRules, function (result, curRule) { if (curRule.name === rule.name) { return result + 1; } return result; }, 0); if (occurrences > 1) { var errMsg = errMsgProvider.buildDuplicateRuleNameError({ topLevelRule: rule, grammarName: className }); errors.push({ message: errMsg, type: parser_public_1.ParserDefinitionErrorType.DUPLICATE_RULE_NAME, ruleName: rule.name }); } return errors; } exports.validateRuleDoesNotAlreadyExist = validateRuleDoesNotAlreadyExist; // TODO: is there anyway to get only the rule names of rules inherited from the super grammars? // This is not part of the IGrammarErrorProvider because the validation cannot be performed on // The grammar structure, only at runtime. function validateRuleIsOverridden(ruleName, definedRulesNames, className) { var errors = []; var errMsg; if (!utils.contains(definedRulesNames, ruleName)) { errMsg = "Invalid rule override, rule: ->" + ruleName + "<- cannot be overridden in the grammar: ->" + className + "<-" + "as it is not defined in any of the super grammars "; errors.push({ message: errMsg, type: parser_public_1.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE, ruleName: ruleName }); } return errors; } exports.validateRuleIsOverridden = validateRuleIsOverridden; function validateNoLeftRecursion(topRule, currRule, errMsgProvider, path) { if (path === void 0) { path = []; } var errors = []; var nextNonTerminals = getFirstNoneTerminal(currRule.definition); if (utils.isEmpty(nextNonTerminals)) { return []; } else { var ruleName = topRule.name; var foundLeftRecursion = utils.contains(nextNonTerminals, topRule); if (foundLeftRecursion) { errors.push({ message: errMsgProvider.buildLeftRecursionError({ topLevelRule: topRule, leftRecursionPath: path }), type: parser_public_1.ParserDefinitionErrorType.LEFT_RECURSION, ruleName: ruleName }); } // we are only looking for cyclic paths leading back to the specific topRule // other cyclic paths are ignored, we still need this difference to avoid infinite loops... var validNextSteps = utils.difference(nextNonTerminals, path.concat([topRule])); var errorsFromNextSteps = utils.map(validNextSteps, function (currRefRule) { var newPath = utils.cloneArr(path); newPath.push(currRefRule); return validateNoLeftRecursion(topRule, currRefRule, errMsgProvider, newPath); }); return errors.concat(utils.flatten(errorsFromNextSteps)); } } exports.validateNoLeftRecursion = validateNoLeftRecursion; function getFirstNoneTerminal(definition) { var result = []; if (utils.isEmpty(definition)) { return result; } var firstProd = utils.first(definition); /* istanbul ignore else */ if (firstProd instanceof gast_public_1.NonTerminal) { result.push(firstProd.referencedRule); } else if (firstProd instanceof gast_public_1.Flat || firstProd instanceof gast_public_1.Option || firstProd instanceof gast_public_1.RepetitionMandatory || firstProd instanceof gast_public_1.RepetitionMandatoryWithSeparator || firstProd instanceof gast_public_1.RepetitionWithSeparator || firstProd instanceof gast_public_1.Repetition) { result = result.concat(getFirstNoneTerminal(firstProd.definition)); } else if (firstProd instanceof gast_public_1.Alternation) { // each sub definition in alternation is a FLAT result = utils.flatten(utils.map(firstProd.definition, function (currSubDef) { return getFirstNoneTerminal(currSubDef.definition); })); } else if (firstProd instanceof gast_public_1.Terminal) { // nothing to see, move along } else { throw Error("non exhaustive match"); } var isFirstOptional = gast_1.isOptionalProd(firstProd); var hasMore = definition.length > 1; if (isFirstOptional && hasMore) { var rest = utils.drop(definition); return result.concat(getFirstNoneTerminal(rest)); } else { return result; } } exports.getFirstNoneTerminal = getFirstNoneTerminal; var OrCollector = /** @class */ (function (_super) { __extends(OrCollector, _super); function OrCollector() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.alternations = []; return _this; } OrCollector.prototype.visitAlternation = function (node) { this.alternations.push(node); }; return OrCollector; }(gast_visitor_public_1.GAstVisitor)); function validateEmptyOrAlternative(topLevelRule, errMsgProvider) { var orCollector = new OrCollector(); topLevelRule.accept(orCollector); var ors = orCollector.alternations; var errors = utils.reduce(ors, function (errors, currOr) { var exceptLast = utils.dropRight(currOr.definition); var currErrors = utils.map(exceptLast, function (currAlternative, currAltIdx) { var possibleFirstInAlt = interpreter_1.nextPossibleTokensAfter([currAlternative], [], null, 1); if (utils.isEmpty(possibleFirstInAlt)) { return { message: errMsgProvider.buildEmptyAlternationError({ topLevelRule: topLevelRule, alternation: currOr, emptyChoiceIdx: currAltIdx }), type: parser_public_1.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT, ruleName: topLevelRule.name, occurrence: currOr.idx, alternative: currAltIdx + 1 }; } else { return null; } }); return errors.concat(utils.compact(currErrors)); }, []); return errors; } exports.validateEmptyOrAlternative = validateEmptyOrAlternative; function validateAmbiguousAlternationAlternatives(topLevelRule, maxLookahead, ignoredIssues, errMsgProvider) { var orCollector = new OrCollector(); topLevelRule.accept(orCollector); var ors = orCollector.alternations; var ignoredIssuesForCurrentRule = ignoredIssues[topLevelRule.name]; if (ignoredIssuesForCurrentRule) { ors = utils_1.reject(ors, function (currOr) { return ignoredIssuesForCurrentRule[gast_1.getProductionDslName(currOr) + (currOr.idx === 0 ? "" : currOr.idx)]; }); } var errors = utils.reduce(ors, function (result, currOr) { var currOccurrence = currOr.idx; var alternatives = lookahead_1.getLookaheadPathsForOr(currOccurrence, topLevelRule, maxLookahead); var altsAmbiguityErrors = checkAlternativesAmbiguities(alternatives, currOr, topLevelRule, errMsgProvider); var altsPrefixAmbiguityErrors = checkPrefixAlternativesAmbiguities(alternatives, currOr, topLevelRule, errMsgProvider); return result.concat(altsAmbiguityErrors, altsPrefixAmbiguityErrors); }, []); return errors; } exports.validateAmbiguousAlternationAlternatives = validateAmbiguousAlternationAlternatives; var RepetionCollector = /** @class */ (function (_super) { __extends(RepetionCollector, _super); function RepetionCollector() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.allProductions = []; return _this; } RepetionCollector.prototype.visitRepetitionWithSeparator = function (manySep) { this.allProductions.push(manySep); }; RepetionCollector.prototype.visitRepetitionMandatory = function (atLeastOne) { this.allProductions.push(atLeastOne); }; RepetionCollector.prototype.visitRepetitionMandatoryWithSeparator = function (atLeastOneSep) { this.allProductions.push(atLeastOneSep); }; RepetionCollector.prototype.visitRepetition = function (many) { this.allProductions.push(many); }; return RepetionCollector; }(gast_visitor_public_1.GAstVisitor)); exports.RepetionCollector = RepetionCollector; function validateTooManyAlts(topLevelRule, errMsgProvider) { var orCollector = new OrCollector(); topLevelRule.accept(orCollector); var ors = orCollector.alternations; var errors = utils.reduce(ors, function (errors, currOr) { if (currOr.definition.length > 255) { errors.push({ message: errMsgProvider.buildTooManyAlternativesError({ topLevelRule: topLevelRule, alternation: currOr }), type: parser_public_1.ParserDefinitionErrorType.TOO_MANY_ALTS, ruleName: topLevelRule.name, occurrence: currOr.idx }); } return errors; }, []); return errors; } exports.validateTooManyAlts = validateTooManyAlts; function validateSomeNonEmptyLookaheadPath(topLevelRules, maxLookahead, errMsgProvider) { var errors = []; utils_1.forEach(topLevelRules, function (currTopRule) { var collectorVisitor = new RepetionCollector(); currTopRule.accept(collectorVisitor); var allRuleProductions = collectorVisitor.allProductions; utils_1.forEach(allRuleProductions, function (currProd) { var prodType = lookahead_1.getProdType(currProd); var currOccurrence = currProd.idx; var paths = lookahead_1.getLookaheadPathsForOptionalProd(currOccurrence, currTopRule, prodType, maxLookahead); var pathsInsideProduction = paths[0]; if (utils_1.isEmpty(utils_1.flatten(pathsInsideProduction))) { var errMsg = errMsgProvider.buildEmptyRepetitionError({ topLevelRule: currTopRule, repetition: currProd }); errors.push({ message: errMsg, type: parser_public_1.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD, ruleName: currTopRule.name }); } }); }); return errors; } exports.validateSomeNonEmptyLookaheadPath = validateSomeNonEmptyLookaheadPath; function checkAlternativesAmbiguities(alternatives, alternation, rule, errMsgProvider) { var foundAmbiguousPaths = []; var identicalAmbiguities = utils_1.reduce(alternatives, function (result, currAlt, currAltIdx) { utils_1.forEach(currAlt, function (currPath) { var altsCurrPathAppearsIn = [currAltIdx]; utils_1.forEach(alternatives, function (currOtherAlt, currOtherAltIdx) { if (currAltIdx !== currOtherAltIdx && lookahead_1.containsPath(currOtherAlt, currPath)) { altsCurrPathAppearsIn.push(currOtherAltIdx); } }); if (altsCurrPathAppearsIn.length > 1 && !lookahead_1.containsPath(foundAmbiguousPaths, currPath)) { foundAmbiguousPaths.push(currPath); result.push({ alts: altsCurrPathAppearsIn, path: currPath }); } }); return result; }, []); var currErrors = utils.map(identicalAmbiguities, function (currAmbDescriptor) { var ambgIndices = utils_1.map(currAmbDescriptor.alts, function (currAltIdx) { return currAltIdx + 1; }); var currMessage = errMsgProvider.buildAlternationAmbiguityError({ topLevelRule: rule, alternation: alternation, ambiguityIndices: ambgIndices, prefixPath: currAmbDescriptor.path }); return { message: currMessage, type: parser_public_1.ParserDefinitionErrorType.AMBIGUOUS_ALTS, ruleName: rule.name, occurrence: alternation.idx, alternatives: [currAmbDescriptor.alts] }; }); return currErrors; } function checkPrefixAlternativesAmbiguities(alternatives, alternation, rule, errMsgProvider) { var errors = []; // flatten var pathsAndIndices = utils_1.reduce(alternatives, function (result, currAlt, idx) { var currPathsAndIdx = utils_1.map(currAlt, function (currPath) { return { idx: idx, path: currPath }; }); return result.concat(currPathsAndIdx); }, []); utils_1.forEach(pathsAndIndices, function (currPathAndIdx) { var targetIdx = currPathAndIdx.idx; var targetPath = currPathAndIdx.path; var prefixAmbiguitiesPathsAndIndices = utils_1.findAll(pathsAndIndices, function (searchPathAndIdx) { // prefix ambiguity can only be created from lower idx (higher priority) path return (searchPathAndIdx.idx < targetIdx && // checking for strict prefix because identical lookaheads // will be be detected using a different validation. lookahead_1.isStrictPrefixOfPath(searchPathAndIdx.path, targetPath)); }); var currPathPrefixErrors = utils_1.map(prefixAmbiguitiesPathsAndIndices, function (currAmbPathAndIdx) { var ambgIndices = [currAmbPathAndIdx.idx + 1, targetIdx + 1]; var occurrence = alternation.idx === 0 ? "" : alternation.idx; var message = errMsgProvider.buildAlternationPrefixAmbiguityError({ topLevelRule: rule, alternation: alternation, ambiguityIndices: ambgIndices, prefixPath: currAmbPathAndIdx.path }); return { message: message, type: parser_public_1.ParserDefinitionErrorType.AMBIGUOUS_PREFIX_ALTS, ruleName: rule.name, occurrence: occurrence, alternatives: ambgIndices }; }); errors = errors.concat(currPathPrefixErrors); }); return errors; } function checkTerminalAndNoneTerminalsNameSpace(topLevels, tokenTypes, errMsgProvider) { var errors = []; var tokenNames = utils_1.map(tokenTypes, function (currToken) { return tokens_public_1.tokenName(currToken); }); utils_1.forEach(topLevels, function (currRule) { var currRuleName = currRule.name; if (utils_1.contains(tokenNames, currRuleName)) { var errMsg = errMsgProvider.buildNamespaceConflictError(currRule); errors.push({ message: errMsg, type: parser_public_1.ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE, ruleName: currRuleName }); } }); return errors; } function validateDuplicateNestedRules(topLevelRules, errMsgProvider) { var errors = []; utils_1.forEach(topLevelRules, function (currTopRule) { var namedCollectorVisitor = new cst_1.NamedDSLMethodsCollectorVisitor(""); currTopRule.accept(namedCollectorVisitor); var prodsByGroup = utils_1.groupBy(namedCollectorVisitor.result, function (item) { return item.name; }); var duplicates = utils_1.pick(prodsByGroup, function (currGroup) { return currGroup.length > 1; }); utils_1.forEach(utils_1.values(duplicates), function (currDupGroup) { var currDupProds = utils_1.map(currDupGroup, function (dupGroup) { return dupGroup.orgProd; }); var errMsg = errMsgProvider.buildDuplicateNestedRuleNameError(currTopRule, currDupProds); errors.push({ message: errMsg, type: parser_public_1.ParserDefinitionErrorType.DUPLICATE_NESTED_NAME, ruleName: currTopRule.name }); }); }); return errors; } //# sourceMappingURL=checks.js.map /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = __webpack_require__(0); var gast_public_1 = __webpack_require__(1); var gast_visitor_public_1 = __webpack_require__(6); var tokens_public_1 = __webpack_require__(3); function isSequenceProd(prod) { return (prod instanceof gast_public_1.Flat || prod instanceof gast_public_1.Option || prod instanceof gast_public_1.Repetition || prod instanceof gast_public_1.RepetitionMandatory || prod instanceof gast_public_1.RepetitionMandatoryWithSeparator || prod instanceof gast_public_1.RepetitionWithSeparator || prod instanceof gast_public_1.Terminal || prod instanceof gast_public_1.Rule); } exports.isSequenceProd = isSequenceProd; function isOptionalProd(prod, alreadyVisited) { if (alreadyVisited === void 0) { alreadyVisited = []; } var isDirectlyOptional = prod instanceof gast_public_1.Option || prod instanceof gast_public_1.Repetition || prod instanceof gast_public_1.RepetitionWithSeparator; if (isDirectlyOptional) { return true; } // note that this can cause infinite loop if one optional empty TOP production has a cyclic dependency with another // empty optional top rule // may be indirectly optional ((A?B?C?) | (D?E?F?)) if (prod instanceof gast_public_1.Alternation) { // for OR its enough for just one of the alternatives to be optional return utils_1.some(prod.definition, function (subProd) { return isOptionalProd(subProd, alreadyVisited); }); } else if (prod instanceof gast_public_1.NonTerminal && utils_1.contains(alreadyVisited, prod)) { // avoiding stack overflow due to infinite recursion return false; } else if (prod instanceof gast_public_1.AbstractProduction) { if (prod instanceof gast_public_1.NonTerminal) { alreadyVisited.push(prod); } return utils_1.every(prod.definition, function (subProd) { return isOptionalProd(subProd, alreadyVisited); }); } else { return false; } } exports.isOptionalProd = isOptionalProd; function isBranchingProd(prod) { return prod instanceof gast_public_1.Alternation; } exports.isBranchingProd = isBranchingProd; function getProductionDslName(prod) { /* istanbul ignore else */ if (prod instanceof gast_public_1.NonTerminal) { return "SUBRULE"; } else if (prod instanceof gast_public_1.Option) { return "OPTION"; } else if (prod instanceof gast_public_1.Alternation) { return "OR"; } else if (prod instanceof gast_public_1.RepetitionMandatory) { return "AT_LEAST_ONE"; } else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) { return "AT_LEAST_ONE_SEP"; } else if (prod instanceof gast_public_1.RepetitionWithSeparator) { return "MANY_SEP"; } else if (prod instanceof gast_public_1.Repetition) { return "MANY"; } else if (prod instanceof gast_public_1.Terminal) { return "CONSUME"; } else { throw Error("non exhaustive match"); } } exports.getProductionDslName = getProductionDslName; var DslMethodsCollectorVisitor = /** @class */ (function (_super) { __extends(DslMethodsCollectorVisitor, _super); function DslMethodsCollectorVisitor() { var _this = _super !== null && _super.apply(this, arguments) || this; // A minus is never valid in an identifier name _this.separator = "-"; _this.dslMethods = { option: [], alternation: [], repetition: [], repetitionWithSeparator: [], repetitionMandatory: [], repetitionMandatoryWithSeparator: [] }; return _this; } DslMethodsCollectorVisitor.prototype.visitTerminal = function (terminal) { var key = tokens_public_1.tokenName(terminal.terminalType) + this.separator + "Terminal"; if (!utils_1.has(this.dslMethods, key)) { this.dslMethods[key] = []; } this.dslMethods[key].push(terminal); }; DslMethodsCollectorVisitor.prototype.visitNonTerminal = function (subrule) { var key = subrule.nonTerminalName + this.separator + "Terminal"; if (!utils_1.has(this.dslMethods, key)) { this.dslMethods[key] = []; } this.dslMethods[key].push(subrule); }; DslMethodsCollectorVisitor.prototype.visitOption = function (option) { this.dslMethods.option.push(option); }; DslMethodsCollectorVisitor.prototype.visitRepetitionWithSeparator = function (manySep) { this.dslMethods.repetitionWithSeparator.push(manySep); }; DslMethodsCollectorVisitor.prototype.visitRepetitionMandatory = function (atLeastOne) { this.dslMethods.repetitionMandatory.push(atLeastOne); }; DslMethodsCollectorVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (atLeastOneSep) { this.dslMethods.repetitionMandatoryWithSeparator.push(atLeastOneSep); }; DslMethodsCollectorVisitor.prototype.visitRepetition = function (many) { this.dslMethods.repetition.push(many); }; DslMethodsCollectorVisitor.prototype.visitAlternation = function (or) { this.dslMethods.alternation.push(or); }; return DslMethodsCollectorVisitor; }(gast_visitor_public_1.GAstVisitor)); exports.DslMethodsCollectorVisitor = DslMethodsCollectorVisitor; //# sourceMappingURL=gast.js.map /***/ }), /* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = __webpack_require__(0); var lang_extensions_1 = __webpack_require__(5); var tokens_public_1 = __webpack_require__(3); function tokenStructuredMatcher(tokInstance, tokConstructor) { var instanceType = tokInstance.tokenTypeIdx; if (instanceType === tokConstructor.tokenTypeIdx) { return true; } else { return (tokConstructor.isParent === true && tokConstructor.categoryMatchesMap[instanceType] === true); } } exports.tokenStructuredMatcher = tokenStructuredMatcher; // Optimized tokenMatcher in case our grammar does not use token categories // Being so tiny it is much more likely to be in-lined and this avoid the function call overhead function tokenStructuredMatcherNoCategories(token, tokType) { return token.tokenTypeIdx === tokType.tokenTypeIdx; } exports.tokenStructuredMatcherNoCategories = tokenStructuredMatcherNoCategories; exports.tokenShortNameIdx = 1; exports.tokenIdxToClass = new lang_extensions_1.HashTable(); function augmentTokenTypes(tokenTypes) { // collect the parent Token Types as well. var tokenTypesAndParents = expandCategories(tokenTypes); // add required tokenType and categoryMatches properties assignTokenDefaultProps(tokenTypesAndParents); // fill up the categoryMatches assignCategoriesMapProp(tokenTypesAndParents); assignCategoriesTokensProp(tokenTypesAndParents); utils_1.forEach(tokenTypesAndParents, function (tokType) { tokType.isParent = tokType.categoryMatches.length > 0; }); } exports.augmentTokenTypes = augmentTokenTypes; function expandCategories(tokenTypes) { var result = utils_1.cloneArr(tokenTypes); var categories = tokenTypes; var searching = true; while (searching) { categories = utils_1.compact(utils_1.flatten(utils_1.map(categories, function (currTokType) { return currTokType.CATEGORIES; }))); var newCategories = utils_1.difference(categories, result); result = result.concat(newCategories); if (utils_1.isEmpty(newCategories)) { searching = false; } else { categories = newCategories; } } return result; } exports.expandCategories = expandCategories; function assignTokenDefaultProps(tokenTypes) { utils_1.forEach(tokenTypes, function (currTokType) { if (!hasShortKeyProperty(currTokType)) { exports.tokenIdxToClass.put(exports.tokenShortNameIdx, currTokType); currTokType.tokenTypeIdx = exports.tokenShortNameIdx++; } // CATEGORIES? : TokenType | TokenType[] if (hasCategoriesProperty(currTokType) && !utils_1.isArray(currTokType.CATEGORIES) // && // !isUndefined(currTokType.CATEGORIES.PATTERN) ) { currTokType.CATEGORIES = [currTokType.CATEGORIES]; } if (!hasCategoriesProperty(currTokType)) { currTokType.CATEGORIES = []; } if (!hasExtendingTokensTypesProperty(currTokType)) { currTokType.categoryMatches = []; } if (!hasExtendingTokensTypesMapProperty(currTokType)) { currTokType.categoryMatchesMap = {}; } if (!hasTokenNameProperty(currTokType)) { // saved for fast access during CST building. currTokType.tokenName = tokens_public_1.tokenName(currTokType); } }); } exports.assignTokenDefaultProps = assignTokenDefaultProps; function assignCategoriesTokensProp(tokenTypes) { utils_1.forEach(tokenTypes, function (currTokType) { // avoid duplications currTokType.categoryMatches = []; utils_1.forEach(currTokType.categoryMatchesMap, function (val, key) { currTokType.categoryMatches.push(exports.tokenIdxToClass.get(key).tokenTypeIdx); }); }); } exports.assignCategoriesTokensProp = assignCategoriesTokensProp; function assignCategoriesMapProp(tokenTypes) { utils_1.forEach(tokenTypes, function (currTokType) { singleAssignCategoriesToksMap([], currTokType); }); } exports.assignCategoriesMapProp = assignCategoriesMapProp; function singleAssignCategoriesToksMap(path, nextNode) { utils_1.forEach(path, function (pathNode) { nextNode.categoryMatchesMap[pathNode.tokenTypeIdx] = true; }); utils_1.forEach(nextNode.CATEGORIES, function (nextCategory) { var newPath = path.concat(nextNode); // avoids infinite loops due to cyclic categories. if (!utils_1.contains(newPath, nextCategory)) { singleAssignCategoriesToksMap(newPath, nextCategory); } }); } exports.singleAssignCategoriesToksMap = singleAssignCategoriesToksMap; function hasShortKeyProperty(tokType) { return utils_1.has(tokType, "tokenTypeIdx"); } exports.hasShortKeyProperty = hasShortKeyProperty; function hasCategoriesProperty(tokType) { return utils_1.has(tokType, "CATEGORIES"); } exports.hasCategoriesProperty = hasCategoriesProperty; function hasExtendingTokensTypesProperty(tokType) { return utils_1.has(tokType, "categoryMatches"); } exports.hasExtendingTokensTypesProperty = hasExtendingTokensTypesProperty; function hasExtendingTokensTypesMapProperty(tokType) { return utils_1.has(tokType, "categoryMatchesMap"); } exports.hasExtendingTokensTypesMapProperty = hasExtendingTokensTypesMapProperty; function hasTokenNameProperty(tokType) { return utils_1.has(tokType, "tokenName"); } exports.hasTokenNameProperty = hasTokenNameProperty; function isTokenType(tokType) { return utils_1.has(tokType, "tokenTypeIdx"); } exports.isTokenType = isTokenType; //# sourceMappingURL=tokens.js.map /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { // Generated by CoffeeScript 1.12.7 (function() { var XMLCData, XMLNode, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; XMLNode = __webpack_require__(2); module.exports = XMLCData = (function(superClass) { extend(XMLCData, superClass); function XMLCData(parent, text) { XMLCData.__super__.constructor.call(this, parent); if (text == null) { throw new Error("Missing CDATA text"); } this.text = this.stringify.cdata(text); } XMLCData.prototype.clone = function() { return Object.create(this); }; XMLCData.prototype.toString = function(options) { return this.options.writer.set(options).cdata(this); }; return XMLCData; })(XMLNode); }).call(this); /***/ }), /* 13 */ /***/ (function(module, exports, __webpack_require__) { // Generated by CoffeeScript 1.12.7 (function() { var XMLComment, XMLNode, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; XMLNode = __webpack_require__(2); module.exports = XMLComment = (function(superClass) { extend(XMLComment, superClass); function XMLComment(parent, text) { XMLComment.__super__.constructor.call(this, parent); if (text == null) { throw new Error("Missing comment text"); } this.text = this.stringify.comment(text); } XMLComment.prototype.clone = function() { return Object.create(this); }; XMLComment.prototype.toString = function(options) { return this.options.writer.set(options).comment(this); }; return XMLComment; })(XMLNode); }).call(this); /***/ }), /* 14 */ /***/ (function(module, exports, __webpack_require__) { // Generated by CoffeeScript 1.12.7 (function() { var XMLDTDAttList, XMLNode, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; XMLNode = __webpack_require__(2); module.exports = XMLDTDAttList = (function(superClass) { extend(XMLDTDAttList, superClass); function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) { XMLDTDAttList.__super__.constructor.call(this, parent); if (elementName == null) { throw new Error("Missing DTD element name"); } if (attributeName == null) { throw new Error("Missing DTD attribute name"); } if (!attributeType) { throw new Error("Missing DTD attribute type"); } if (!defaultValueType) { throw new Error("Missing DTD attribute default"); } if (defaultValueType.indexOf('#') !== 0) { defaultValueType = '#' + defaultValueType; } if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) { throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT"); } if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) { throw new Error("Default value only applies to #FIXED or #DEFAULT"); } this.elementName = this.stringify.eleName(elementName); this.attributeName = this.stringify.attName(attributeName); this.attributeType = this.stringify.dtdAttType(attributeType); this.defaultValue = this.stringify.dtdAttDefault(defaultValue); this.defaultValueType = defaultValueType; } XMLDTDAttList.prototype.toString = function(options) { return this.options.writer.set(options).dtdAttList(this); }; return XMLDTDAttList; })(XMLNode); }).call(this); /***/ }), /* 15 */ /***/ (function(module, exports, __webpack_require__) { // Generated by CoffeeScript 1.12.7 (function() { var XMLDTDElement, XMLNode, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; XMLNode = __webpack_require__(2); module.exports = XMLDTDElement = (function(superClass) { extend(XMLDTDElement, superClass); function XMLDTDElement(parent, name, value) { XMLDTDElement.__super__.constructor.call(this, parent); if (name == null) { throw new Error("Missing DTD element name"); } if (!value) { value = '(#PCDATA)'; } if (Array.isArray(value)) { value = '(' + value.join(',') + ')'; } this.name = this.stringify.eleName(name); this.value = this.stringify.dtdElementValue(value); } XMLDTDElement.prototype.toString = function(options) { return this.options.writer.set(options).dtdElement(this); }; return XMLDTDElement; })(XMLNode); }).call(this); /***/ }), /* 16 */ /***/ (function(module, exports, __webpack_require__) { // Generated by CoffeeScript 1.12.7 (function() { var XMLDTDEntity, XMLNode, isObject, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; isObject = __webpack_require__(4).isObject; XMLNode = __webpack_require__(2); module.exports = XMLDTDEntity = (function(superClass) { extend(XMLDTDEntity, superClass); function XMLDTDEntity(parent, pe, name, value) { XMLDTDEntity.__super__.constructor.call(this, parent); if (name == null) { throw new Error("Missing entity name"); } if (value == null) { throw new Error("Missing entity value"); } this.pe = !!pe; this.name = this.stringify.eleName(name); if (!isObject(value)) { this.value = this.stringify.dtdEntityValue(value); } else { if (!value.pubID && !value.sysID) { throw new Error("Public and/or system identifiers are required for an external entity"); } if (value.pubID && !value.sysID) { throw new Error("System identifier is required for a public external entity"); } if (value.pubID != null) { this.pubID = this.stringify.dtdPubID(value.pubID); } if (value.sysID != null) { this.sysID = this.stringify.dtdSysID(value.sysID); } if (value.nData != null) { this.nData = this.stringify.dtdNData(value.nData); } if (this.pe && this.nData) { throw new Error("Notation declaration is not allowed in a parameter entity"); } } } XMLDTDEntity.prototype.toString = function(options) { return this.options.writer.set(options).dtdEntity(this); }; return XMLDTDEntity; })(XMLNode); }).call(this); /***/ }), /* 17 */ /***/ (function(module, exports, __webpack_require__) { // Generated by CoffeeScript 1.12.7 (function() { var XMLDTDNotation, XMLNode, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; XMLNode = __webpack_require__(2); module.exports = XMLDTDNotation = (function(superClass) { extend(XMLDTDNotation, superClass); function XMLDTDNotation(parent, name, value) { XMLDTDNotation.__super__.constructor.call(this, parent); if (name == null) { throw new Error("Missing notation name"); } if (!value.pubID && !value.sysID) { throw new Error("Public or system identifiers are required for an external entity"); } this.name = this.stringify.eleName(name); if (value.pubID != null) { this.pubID = this.stringify.dtdPubID(value.pubID); } if (value.sysID != null) { this.sysID = this.stringify.dtdSysID(value.sysID); } } XMLDTDNotation.prototype.toString = function(options) { return this.options.writer.set(options).dtdNotation(this); }; return XMLDTDNotation; })(XMLNode); }).call(this); /***/ }), /* 18 */ /***/ (function(module, exports, __webpack_require__) { // Generated by CoffeeScript 1.12.7 (function() { var XMLDeclaration, XMLNode, isObject, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; isObject = __webpack_require__(4).isObject; XMLNode = __webpack_require__(2); module.exports = XMLDeclaration = (function(superClass) { extend(XMLDeclaration, superClass); function XMLDeclaration(parent, version, encoding, standalone) { var ref; XMLDeclaration.__super__.constructor.call(this, parent); if (isObject(version)) { ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone; } if (!version) { version = '1.0'; } this.version = this.stringify.xmlVersion(version); if (encoding != null) { this.encoding = this.stringify.xmlEncoding(encoding); } if (standalone != null) { this.standalone = this.stringify.xmlStandalone(standalone); } } XMLDeclaration.prototype.toString = function(options) { return this.options.writer.set(options).declaration(this); }; return XMLDeclaration; })(XMLNode); }).call(this); /***/ }), /* 19 */ /***/ (function(module, exports, __webpack_require__) { // Generated by CoffeeScript 1.12.7 (function() { var XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLNode, isObject, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; isObject = __webpack_require__(4).isObject; XMLNode = __webpack_require__(2); XMLDTDAttList = __webpack_require__(14); XMLDTDEntity = __webpack_require__(16); XMLDTDElement = __webpack_require__(15); XMLDTDNotation = __webpack_require__(17); module.exports = XMLDocType = (function(superClass) { extend(XMLDocType, superClass); function XMLDocType(parent, pubID, sysID) { var ref, ref1; XMLDocType.__super__.constructor.call(this, parent); this.documentObject = parent; if (isObject(pubID)) { ref = pubID, pubID = ref.pubID, sysID = ref.sysID; } if (sysID == null) { ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1]; } if (pubID != null) { this.pubID = this.stringify.dtdPubID(pubID); } if (sysID != null) { this.sysID = this.stringify.dtdSysID(sysID); } } XMLDocType.prototype.element = function(name, value) { var child; child = new XMLDTDElement(this, name, value); this.children.push(child); return this; }; XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { var child; child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue); this.children.push(child); return this; }; XMLDocType.prototype.entity = function(name, value) { var child; child = new XMLDTDEntity(this, false, name, value); this.children.push(child); return this; }; XMLDocType.prototype.pEntity = function(name, value) { var child; child = new XMLDTDEntity(this, true, name, value); this.children.push(child); return this; }; XMLDocType.prototype.notation = function(name, value) { var child; child = new XMLDTDNotation(this, name, value); this.children.push(child); return this; }; XMLDocType.prototype.toString = function(options) { return this.options.writer.set(options).docType(this); }; XMLDocType.prototype.ele = function(name, value) { return this.element(name, value); }; XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue); }; XMLDocType.prototype.ent = function(name, value) { return this.entity(name, value); }; XMLDocType.prototype.pent = function(name, value) { return this.pEntity(name, value); }; XMLDocType.prototype.not = function(name, value) { return this.notation(name, value); }; XMLDocType.prototype.up = function() { return this.root() || this.documentObject; }; return XMLDocType; })(XMLNode); }).call(this); /***/ }), /* 20 */ /***/ (function(module, exports, __webpack_require__) { // Generated by CoffeeScript 1.12.7 (function() { var XMLAttribute, XMLElement, XMLNode, isFunction, isObject, ref, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; ref = __webpack_require__(4), isObject = ref.isObject, isFunction = ref.isFunction; XMLNode = __webpack_require__(2); XMLAttribute = __webpack_require__(44); module.exports = XMLElement = (function(superClass) { extend(XMLElement, superClass); function XMLElement(parent, name, attributes) { XMLElement.__super__.constructor.call(this, parent); if (name == null) { throw new Error("Missing element name"); } this.name = this.stringify.eleName(name); this.attributes = {}; if (attributes != null) { this.attribute(attributes); } if (parent.isDocument) { this.isRoot = true; this.documentObject = parent; parent.rootObject = this; } } XMLElement.prototype.clone = function() { var att, attName, clonedSelf, ref1; clonedSelf = Object.create(this); if (clonedSelf.isRoot) { clonedSelf.documentObject = null; } clonedSelf.attributes = {}; ref1 = this.attributes; for (attName in ref1) { if (!hasProp.call(ref1, attName)) continue; att = ref1[attName]; clonedSelf.attributes[attName] = att.clone(); } clonedSelf.children = []; this.children.forEach(function(child) { var clonedChild; clonedChild = child.clone(); clonedChild.parent = clonedSelf; return clonedSelf.children.push(clonedChild); }); return clonedSelf; }; XMLElement.prototype.attribute = function(name, value) { var attName, attValue; if (name != null) { name = name.valueOf(); } if (isObject(name)) { for (attName in name) { if (!hasProp.call(name, attName)) continue; attValue = name[attName]; this.attribute(attName, attValue); } } else { if (isFunction(value)) { value = value.apply(); } if (!this.options.skipNullAttributes || (value != null)) { this.attributes[name] = new XMLAttribute(this, name, value); } } return this; }; XMLElement.prototype.removeAttribute = function(name) { var attName, i, len; if (name == null) { throw new Error("Missing attribute name"); } name = name.valueOf(); if (Array.isArray(name)) { for (i = 0, len = name.length; i < len; i++) { attName = name[i]; delete this.attributes[attName]; } } else { delete this.attributes[name]; } return this; }; XMLElement.prototype.toString = function(options) { return this.options.writer.set(options).element(this); }; XMLElement.prototype.att = function(name, value) { return this.attribute(name, value); }; XMLElement.prototype.a = function(name, value) { return this.attribute(name, value); }; return XMLElement; })(XMLNode); }).call(this); /***/ }), /* 21 */ /***/ (function(module, exports, __webpack_require__) { // Generated by CoffeeScript 1.12.7 (function() { var XMLNode, XMLProcessingInstruction, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; XMLNode = __webpack_require__(2); module.exports = XMLProcessingInstruction = (function(superClass) { extend(XMLProcessingInstruction, superClass); function XMLProcessingInstruction(parent, target, value) { XMLProcessingInstruction.__super__.constructor.call(this, parent); if (target == null) { throw new Error("Missing instruction target"); } this.target = this.stringify.insTarget(target); if (value) { this.value = this.stringify.insValue(value); } } XMLProcessingInstruction.prototype.clone = function() { return Object.create(this); }; XMLProcessingInstruction.prototype.toString = function(options) { return this.options.writer.set(options).processingInstruction(this); }; return XMLProcessingInstruction; })(XMLNode); }).call(this); /***/ }), /* 22 */ /***/ (function(module, exports, __webpack_require__) { // Generated by CoffeeScript 1.12.7 (function() { var XMLNode, XMLRaw, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; XMLNode = __webpack_require__(2); module.exports = XMLRaw = (function(superClass) { extend(XMLRaw, superClass); function XMLRaw(parent, text) { XMLRaw.__super__.constructor.call(this, parent); if (text == null) { throw new Error("Missing raw text"); } this.value = this.stringify.raw(text); } XMLRaw.prototype.clone = function() { return Object.create(this); }; XMLRaw.prototype.toString = function(options) { return this.options.writer.set(options).raw(this); }; return XMLRaw; })(XMLNode); }).call(this); /***/ }), /* 23 */ /***/ (function(module, exports, __webpack_require__) { // Generated by CoffeeScript 1.12.7 (function() { var XMLNode, XMLText, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; XMLNode = __webpack_require__(2); module.exports = XMLText = (function(superClass) { extend(XMLText, superClass); function XMLText(parent, text) { XMLText.__super__.constructor.call(this, parent); if (text == null) { throw new Error("Missing element text"); } this.value = this.stringify.eleText(text); } XMLText.prototype.clone = function() { return Object.create(this); }; XMLText.prototype.toString = function(options) { return this.options.writer.set(options).text(this); }; return XMLText; })(XMLNode); }).call(this); /***/ }), /* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tokens_public_1 = __webpack_require__(3); var utils = __webpack_require__(0); var utils_1 = __webpack_require__(0); var gast_public_1 = __webpack_require__(1); var gast_1 = __webpack_require__(10); var checks_1 = __webpack_require__(9); var version_1 = __webpack_require__(29); exports.defaultParserErrorProvider = { buildMismatchTokenMessage: function (_a) { var expected = _a.expected, actual = _a.actual, previous = _a.previous, ruleName = _a.ruleName; var hasLabel = tokens_public_1.hasTokenLabel(expected); var expectedMsg = hasLabel ? "--> " + tokens_public_1.tokenLabel(expected) + " <--" : "token of type --> " + tokens_public_1.tokenName(expected) + " <--"; var msg = "Expecting " + expectedMsg + " but found --> '" + actual.image + "' <--"; return msg; }, buildNotAllInputParsedMessage: function (_a) { var firstRedundant = _a.firstRedundant, ruleName = _a.ruleName; return ("Redundant input, expecting EOF but found: " + firstRedundant.image); }, buildNoViableAltMessage: function (_a) { var expectedPathsPerAlt = _a.expectedPathsPerAlt, actual = _a.actual, previous = _a.previous, customUserDescription = _a.customUserDescription, ruleName = _a.ruleName; var errPrefix = "Expecting: "; // TODO: issue: No Viable Alternative Error may have incomplete details. #502 var actualText = utils_1.first(actual).image; var errSuffix = "\nbut found: '" + actualText + "'"; if (customUserDescription) { return errPrefix + customUserDescription + errSuffix; } else { var allLookAheadPaths = utils_1.reduce(expectedPathsPerAlt, function (result, currAltPaths) { return result.concat(currAltPaths); }, []); var nextValidTokenSequences = utils_1.map(allLookAheadPaths, function (currPath) { return "[" + utils_1.map(currPath, function (currTokenType) { return tokens_public_1.tokenLabel(currTokenType); }).join(", ") + "]"; }); var nextValidSequenceItems = utils_1.map(nextValidTokenSequences, function (itemMsg, idx) { return " " + (idx + 1) + ". " + itemMsg; }); var calculatedDescription = "one of these possible Token sequences:\n" + nextValidSequenceItems.join("\n"); return errPrefix + calculatedDescription + errSuffix; } }, buildEarlyExitMessage: function (_a) { var expectedIterationPaths = _a.expectedIterationPaths, actual = _a.actual, customUserDescription = _a.customUserDescription, ruleName = _a.ruleName; var errPrefix = "Expecting: "; // TODO: issue: No Viable Alternative Error may have incomplete details. #502 var actualText = utils_1.first(actual).image; var errSuffix = "\nbut found: '" + actualText + "'"; if (customUserDescription) { return errPrefix + customUserDescription + errSuffix; } else { var nextValidTokenSequences = utils_1.map(expectedIterationPaths, function (currPath) { return "[" + utils_1.map(currPath, function (currTokenType) { return tokens_public_1.tokenLabel(currTokenType); }).join(",") + "]"; }); var calculatedDescription = "expecting at least one iteration which starts with one of these possible Token sequences::\n " + ("<" + nextValidTokenSequences.join(" ,") + ">"); return errPrefix + calculatedDescription + errSuffix; } } }; Object.freeze(exports.defaultParserErrorProvider); exports.defaultGrammarResolverErrorProvider = { buildRuleNotFoundError: function (topLevelRule, undefinedRule) { var msg = "Invalid grammar, reference to a rule which is not defined: ->" + undefinedRule.nonTerminalName + "<-\n" + "inside top level rule: ->" + topLevelRule.name + "<-"; return msg; } }; exports.defaultGrammarValidatorErrorProvider = { buildDuplicateFoundError: function (topLevelRule, duplicateProds) { function getExtraProductionArgument(prod) { if (prod instanceof gast_public_1.Terminal) { return tokens_public_1.tokenName(prod.terminalType); } else if (prod instanceof gast_public_1.NonTerminal) { return prod.nonTerminalName; } else { return ""; } } var topLevelName = topLevelRule.name; var duplicateProd = utils_1.first(duplicateProds); var index = duplicateProd.idx; var dslName = gast_1.getProductionDslName(duplicateProd); var extraArgument = getExtraProductionArgument(duplicateProd); var msg = "->" + dslName + "<- with numerical suffix: ->" + index + "<-\n " + (extraArgument ? "and argument: ->" + extraArgument + "<-" : "") + "\n appears more than once (" + duplicateProds.length + " times) in the top level rule: ->" + topLevelName + "<-.\n " + (index === 0 ? "Also note that numerical suffix 0 means " + dslName + " without any suffix." : "") + "\n To fix this make sure each usage of " + dslName + " " + (extraArgument ? "with the argument: ->" + extraArgument + "<-" : "") + "\n in the rule ->" + topLevelName + "<- has a different occurrence index (0-5), as that combination acts as a unique\n position key in the grammar, which is needed by the parsing engine.\n \n For further details see: https://sap.github.io/chevrotain/docs/FAQ.html#NUMERICAL_SUFFIXES \n "; // white space trimming time! better to trim afterwards as it allows to use WELL formatted multi line template strings... msg = msg.replace(/[ \t]+/g, " "); msg = msg.replace(/\s\s+/g, "\n"); return msg; }, buildInvalidNestedRuleNameError: function (topLevelRule, nestedProd) { var msg = "Invalid nested rule name: ->" + nestedProd.name + "<- inside rule: ->" + topLevelRule.name + "<-\n" + ("it must match the pattern: ->" + checks_1.validNestedRuleName.toString() + "<-.\n") + "Note that this means a nested rule name must start with the '$'(dollar) sign."; return msg; }, buildDuplicateNestedRuleNameError: function (topLevelRule, nestedProd) { var duplicateName = utils_1.first(nestedProd).name; var errMsg = "Duplicate nested rule name: ->" + duplicateName + "<- inside rule: ->" + topLevelRule.name + "<-\n" + "A nested name must be unique in the scope of a top level grammar rule."; return errMsg; }, buildNamespaceConflictError: function (rule) { var errMsg = "Namespace conflict found in grammar.\n" + ("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <" + rule.name + ">.\n") + "To resolve this make sure each Terminal and Non-Terminal names are unique\n" + "This is easy to accomplish by using the convention that Terminal names start with an uppercase letter\n" + "and Non-Terminal names start with a lower case letter."; return errMsg; }, buildAlternationPrefixAmbiguityError: function (options) { var pathMsg = utils_1.map(options.prefixPath, function (currTok) { return tokens_public_1.tokenLabel(currTok); }).join(", "); var occurrence = options.alternation.idx === 0 ? "" : options.alternation.idx; var errMsg = "Ambiguous alternatives: <" + options.ambiguityIndices.join(" ,") + "> due to common lookahead prefix\n" + ("in inside <" + options.topLevelRule.name + "> Rule,\n") + ("<" + pathMsg + "> may appears as a prefix path in all these alternatives.\n") + "https://sap.github.io/chevrotain/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\n" + "For Further details."; return errMsg; }, buildAlternationAmbiguityError: function (options) { var pathMsg = utils_1.map(options.prefixPath, function (currtok) { return tokens_public_1.tokenLabel(currtok); }).join(", "); var occurrence = options.alternation.idx === 0 ? "" : options.alternation.idx; var currMessage = "Ambiguous alternatives: <" + options.ambiguityIndices.join(" ,") + "> in " + (" inside <" + options.topLevelRule.name + "> Rule,\n") + ("<" + pathMsg + "> may appears as a prefix path in all these alternatives.\n"); var docs_version = version_1.VERSION.replace(/\./g, "_"); // Should this information be on the error message or in some common errors docs? currMessage = currMessage + "To Resolve this, try one of of the following: \n" + "1. Refactor your grammar to be LL(K) for the current value of k (by default k=5)\n" + "2. Increase the value of K for your grammar by providing a larger 'maxLookahead' value in the parser's config\n" + "3. This issue can be ignored (if you know what you are doing...), see" + " https://sap.github.io/chevrotain/documentation/" + docs_version + "/interfaces/iparserconfig.html#ignoredissues for more" + " details\n"; return currMessage; }, buildEmptyRepetitionError: function (options) { var dslName = gast_1.getProductionDslName(options.repetition); if (options.repetition.idx !== 0) { dslName += options.repetition.idx; } var errMsg = "The repetition <" + dslName + "> within Rule <" + options.topLevelRule.name + "> can never consume any tokens.\n" + "This could lead to an infinite loop."; return errMsg; }, buildTokenNameError: function (options) { var tokTypeName = tokens_public_1.tokenName(options.tokenType); var errMsg = "Invalid Grammar Token name: ->" + tokTypeName + "<- it must match the pattern: ->" + options.expectedPattern.toString() + "<-"; return errMsg; }, buildEmptyAlternationError: function (options) { var errMsg = "Ambiguous empty alternative: <" + (options.emptyChoiceIdx + 1) + ">" + (" in inside <" + options.topLevelRule.name + "> Rule.\n") + "Only the last alternative may be an empty alternative."; return errMsg; }, buildTooManyAlternativesError: function (options) { var errMsg = "An Alternation cannot have more than 256 alternatives:\n" + (" inside <" + options.topLevelRule.name + "> Rule.\n has " + (options.alternation.definition.length + 1) + " alternatives."); return errMsg; }, buildLeftRecursionError: function (options) { var ruleName = options.topLevelRule.name; var pathNames = utils.map(options.leftRecursionPath, function (currRule) { return currRule.name; }); var leftRecursivePath = ruleName + " --> " + pathNames .concat([ruleName]) .join(" --> "); var errMsg = "Left Recursion found in grammar.\n" + ("rule: <" + ruleName + "> can be invoked from itself (directly or indirectly)\n") + ("without consuming any Tokens. The grammar path that causes this is: \n " + leftRecursivePath + "\n") + " To fix this refactor your grammar to remove the left recursion.\n" + "see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring."; return errMsg; }, buildInvalidRuleNameError: function (options) { var ruleName = options.topLevelRule.name; var expectedPatternString = options.expectedPattern.toString(); var errMsg = "Invalid grammar rule name: ->" + ruleName + "<- it must match the pattern: ->" + expectedPatternString + "<-"; return errMsg; }, buildDuplicateRuleNameError: function (options) { var ruleName; if (options.topLevelRule instanceof gast_public_1.Rule) { ruleName = options.topLevelRule.name; } else { ruleName = options.topLevelRule; } var errMsg = "Duplicate definition, rule: ->" + ruleName + "<- is already defined in the grammar: ->" + options.grammarName + "<-"; return errMsg; } }; //# sourceMappingURL=errors_public.js.map /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* istanbul ignore next */ var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var rest_1 = __webpack_require__(26); var utils_1 = __webpack_require__(0); var tokens_public_1 = __webpack_require__(3); var first_1 = __webpack_require__(38); var gast_public_1 = __webpack_require__(1); var AbstractNextPossibleTokensWalker = /** @class */ (function (_super) { __extends(AbstractNextPossibleTokensWalker, _super); function AbstractNextPossibleTokensWalker(topProd, path) { var _this = _super.call(this) /* istanbul ignore next */ || this; _this.topProd = topProd; _this.path = path; _this.possibleTokTypes = []; _this.nextProductionName = ""; _this.nextProductionOccurrence = 0; _this.found = false; _this.isAtEndOfPath = false; return _this; } AbstractNextPossibleTokensWalker.prototype.startWalking = function () { this.found = false; if (this.path.ruleStack[0] !== this.topProd.name) { throw Error("The path does not start with the walker's top Rule!"); } // immutable for the win this.ruleStack = utils_1.cloneArr(this.path.ruleStack).reverse(); // intelij bug requires assertion this.occurrenceStack = utils_1.cloneArr(this.path.occurrenceStack).reverse(); // intelij bug requires assertion // already verified that the first production is valid, we now seek the 2nd production this.ruleStack.pop(); this.occurrenceStack.pop(); this.updateExpectedNext(); this.walk(this.topProd); return this.possibleTokTypes; }; AbstractNextPossibleTokensWalker.prototype.walk = function (prod, prevRest) { if (prevRest === void 0) { prevRest = []; } // stop scanning once we found the path if (!this.found) { _super.prototype.walk.call(this, prod, prevRest); } }; AbstractNextPossibleTokensWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) { // found the next production, need to keep walking in it if (refProd.referencedRule.name === this.nextProductionName && refProd.idx === this.nextProductionOccurrence) { var fullRest = currRest.concat(prevRest); this.updateExpectedNext(); this.walk(refProd.referencedRule, fullRest); } }; AbstractNextPossibleTokensWalker.prototype.updateExpectedNext = function () { // need to consume the Terminal if (utils_1.isEmpty(this.ruleStack)) { // must reset nextProductionXXX to avoid walking down another Top Level production while what we are // really seeking is the last Terminal... this.nextProductionName = ""; this.nextProductionOccurrence = 0; this.isAtEndOfPath = true; } else { this.nextProductionName = this.ruleStack.pop(); this.nextProductionOccurrence = this.occurrenceStack.pop(); } }; return AbstractNextPossibleTokensWalker; }(rest_1.RestWalker)); exports.AbstractNextPossibleTokensWalker = AbstractNextPossibleTokensWalker; var NextAfterTokenWalker = /** @class */ (function (_super) { __extends(NextAfterTokenWalker, _super); function NextAfterTokenWalker(topProd, path) { var _this = _super.call(this, topProd, path) /* istanbul ignore next */ || this; _this.path = path; _this.nextTerminalName = ""; _this.nextTerminalOccurrence = 0; _this.nextTerminalName = tokens_public_1.tokenName(_this.path.lastTok); _this.nextTerminalOccurrence = _this.path.lastTokOccurrence; return _this; } NextAfterTokenWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) { if (this.isAtEndOfPath && tokens_public_1.tokenName(terminal.terminalType) === this.nextTerminalName && terminal.idx === this.nextTerminalOccurrence && !this.found) { var fullRest = currRest.concat(prevRest); var restProd = new gast_public_1.Flat({ definition: fullRest }); this.possibleTokTypes = first_1.first(restProd); this.found = true; } }; return NextAfterTokenWalker; }(AbstractNextPossibleTokensWalker)); exports.NextAfterTokenWalker = NextAfterTokenWalker; /** * This walker only "walks" a single "TOP" level in the Grammar Ast, this means * it never "follows" production refs */ var AbstractNextTerminalAfterProductionWalker = /** @class */ (function (_super) { __extends(AbstractNextTerminalAfterProductionWalker, _super); function AbstractNextTerminalAfterProductionWalker(topRule, occurrence) { var _this = _super.call(this) /* istanbul ignore next */ || this; _this.topRule = topRule; _this.occurrence = occurrence; _this.result = { token: undefined, occurrence: undefined, isEndOfRule: undefined }; return _this; } AbstractNextTerminalAfterProductionWalker.prototype.startWalking = function () { this.walk(this.topRule); return this.result; }; return AbstractNextTerminalAfterProductionWalker; }(rest_1.RestWalker)); exports.AbstractNextTerminalAfterProductionWalker = AbstractNextTerminalAfterProductionWalker; var NextTerminalAfterManyWalker = /** @class */ (function (_super) { __extends(NextTerminalAfterManyWalker, _super); function NextTerminalAfterManyWalker() { return _super !== null && _super.apply(this, arguments) /* istanbul ignore next */ || this; } NextTerminalAfterManyWalker.prototype.walkMany = function (manyProd, currRest, prevRest) { if (manyProd.idx === this.occurrence) { var firstAfterMany = utils_1.first(currRest.concat(prevRest)); this.result.isEndOfRule = firstAfterMany === undefined; if (firstAfterMany instanceof gast_public_1.Terminal) { this.result.token = firstAfterMany.terminalType; this.result.occurrence = firstAfterMany.idx; } } else { _super.prototype.walkMany.call(this, manyProd, currRest, prevRest); } }; return NextTerminalAfterManyWalker; }(AbstractNextTerminalAfterProductionWalker)); exports.NextTerminalAfterManyWalker = NextTerminalAfterManyWalker; var NextTerminalAfterManySepWalker = /** @class */ (function (_super) { __extends(NextTerminalAfterManySepWalker, _super); function NextTerminalAfterManySepWalker() { return _super !== null && _super.apply(this, arguments) /* istanbul ignore next */ || this; } NextTerminalAfterManySepWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) { if (manySepProd.idx === this.occurrence) { var firstAfterManySep = utils_1.first(currRest.concat(prevRest)); this.result.isEndOfRule = firstAfterManySep === undefined; if (firstAfterManySep instanceof gast_public_1.Terminal) { this.result.token = firstAfterManySep.terminalType; this.result.occurrence = firstAfterManySep.idx; } } else { _super.prototype.walkManySep.call(this, manySepProd, currRest, prevRest); } }; return NextTerminalAfterManySepWalker; }(AbstractNextTerminalAfterProductionWalker)); exports.NextTerminalAfterManySepWalker = NextTerminalAfterManySepWalker; var NextTerminalAfterAtLeastOneWalker = /** @class */ (function (_super) { __extends(NextTerminalAfterAtLeastOneWalker, _super); function NextTerminalAfterAtLeastOneWalker() { return _super !== null && _super.apply(this, arguments) /* istanbul ignore next */ || this; } NextTerminalAfterAtLeastOneWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) { if (atLeastOneProd.idx === this.occurrence) { var firstAfterAtLeastOne = utils_1.first(currRest.concat(prevRest)); this.result.isEndOfRule = firstAfterAtLeastOne === undefined; if (firstAfterAtLeastOne instanceof gast_public_1.Terminal) { this.result.token = firstAfterAtLeastOne.terminalType; this.result.occurrence = firstAfterAtLeastOne.idx; } } else { _super.prototype.walkAtLeastOne.call(this, atLeastOneProd, currRest, prevRest); } }; return NextTerminalAfterAtLeastOneWalker; }(AbstractNextTerminalAfterProductionWalker)); exports.NextTerminalAfterAtLeastOneWalker = NextTerminalAfterAtLeastOneWalker; // TODO: reduce code duplication in the AfterWalkers var NextTerminalAfterAtLeastOneSepWalker = /** @class */ (function (_super) { __extends(NextTerminalAfterAtLeastOneSepWalker, _super); function NextTerminalAfterAtLeastOneSepWalker() { return _super !== null && _super.apply(this, arguments) /* istanbul ignore next */ || this; } NextTerminalAfterAtLeastOneSepWalker.prototype.walkAtLeastOneSep = function (atleastOneSepProd, currRest, prevRest) { if (atleastOneSepProd.idx === this.occurrence) { var firstAfterfirstAfterAtLeastOneSep = utils_1.first(currRest.concat(prevRest)); this.result.isEndOfRule = firstAfterfirstAfterAtLeastOneSep === undefined; if (firstAfterfirstAfterAtLeastOneSep instanceof gast_public_1.Terminal) { this.result.token = firstAfterfirstAfterAtLeastOneSep.terminalType; this.result.occurrence = firstAfterfirstAfterAtLeastOneSep.idx; } } else { _super.prototype.walkAtLeastOneSep.call(this, atleastOneSepProd, currRest, prevRest); } }; return NextTerminalAfterAtLeastOneSepWalker; }(AbstractNextTerminalAfterProductionWalker)); exports.NextTerminalAfterAtLeastOneSepWalker = NextTerminalAfterAtLeastOneSepWalker; function possiblePathsFrom(targetDef, maxLength, currPath) { if (currPath === void 0) { currPath = []; } // avoid side effects currPath = utils_1.cloneArr(currPath); var result = []; var i = 0; function remainingPathWith(nextDef) { return nextDef.concat(utils_1.drop(targetDef, i + 1)); } function getAlternativesForProd(definition) { var alternatives = possiblePathsFrom(remainingPathWith(definition), maxLength, currPath); return result.concat(alternatives); } /** * Mandatory productions will halt the loop as the paths computed from their recursive calls will already contain the * following (rest) of the targetDef. * * For optional productions (Option/Repetition/...) the loop will continue to represent the paths that do not include the * the optional production. */ while (currPath.length < maxLength && i < targetDef.length) { var prod = targetDef[i]; /* istanbul ignore else */ if (prod instanceof gast_public_1.Flat) { return getAlternativesForProd(prod.definition); } else if (prod instanceof gast_public_1.NonTerminal) { return getAlternativesForProd(prod.definition); } else if (prod instanceof gast_public_1.Option) { result = getAlternativesForProd(prod.definition); } else if (prod instanceof gast_public_1.RepetitionMandatory) { return getAlternativesForProd(prod.definition); } else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) { var newDef = [ new gast_public_1.Flat({ definition: prod.definition }), new gast_public_1.Repetition({ definition: [ new gast_public_1.Terminal({ terminalType: prod.separator }) ].concat(prod.definition) }) ]; return getAlternativesForProd(newDef); } else if (prod instanceof gast_public_1.RepetitionWithSeparator) { var newDef = prod.definition.concat([ new gast_public_1.Repetition({ definition: [ new gast_public_1.Terminal({ terminalType: prod.separator }) ].concat(prod.definition) }) ]); result = getAlternativesForProd(newDef); } else if (prod instanceof gast_public_1.Repetition) { result = getAlternativesForProd(prod.definition); } else if (prod instanceof gast_public_1.Alternation) { utils_1.forEach(prod.definition, function (currAlt) { result = getAlternativesForProd(currAlt.definition); }); return result; } else if (prod instanceof gast_public_1.Terminal) { currPath.push(prod.terminalType); } else { throw Error("non exhaustive match"); } i++; } result.push({ partialPath: currPath, suffixDef: utils_1.drop(targetDef, i) }); return result; } exports.possiblePathsFrom = possiblePathsFrom; function nextPossibleTokensAfter(initialDef, tokenVector, tokMatcher, maxLookAhead) { var EXIT_NON_TERMINAL = "EXIT_NONE_TERMINAL"; // to avoid creating a new Array each time. var EXIT_NON_TERMINAL_ARR = [EXIT_NON_TERMINAL]; var EXIT_ALTERNATIVE = "EXIT_ALTERNATIVE"; var foundCompletePath = false; var tokenVectorLength = tokenVector.length; var minimalAlternativesIndex = tokenVectorLength - maxLookAhead - 1; var result = []; var possiblePaths = []; possiblePaths.push({ idx: -1, def: initialDef, ruleStack: [], occurrenceStack: [] }); while (!utils_1.isEmpty(possiblePaths)) { var currPath = possiblePaths.pop(); // skip alternatives if no more results can be found (assuming deterministic grammar with fixed lookahead) if (currPath === EXIT_ALTERNATIVE) { if (foundCompletePath && utils_1.last(possiblePaths).idx <= minimalAlternativesIndex) { // remove irrelevant alternative possiblePaths.pop(); } continue; } var currDef = currPath.def; var currIdx = currPath.idx; var currRuleStack = currPath.ruleStack; var currOccurrenceStack = currPath.occurrenceStack; // For Example: an empty path could exist in a valid grammar in the case of an EMPTY_ALT if (utils_1.isEmpty(currDef)) { continue; } var prod = currDef[0]; /* istanbul ignore else */ if (prod === EXIT_NON_TERMINAL) { var nextPath = { idx: currIdx, def: utils_1.drop(currDef), ruleStack: utils_1.dropRight(currRuleStack), occurrenceStack: utils_1.dropRight(currOccurrenceStack) }; possiblePaths.push(nextPath); } else if (prod instanceof gast_public_1.Terminal) { /* istanbul ignore else */ if (currIdx < tokenVectorLength - 1) { var nextIdx = currIdx + 1; var actualToken = tokenVector[nextIdx]; if (tokMatcher(actualToken, prod.terminalType)) { var nextPath = { idx: nextIdx, def: utils_1.drop(currDef), ruleStack: currRuleStack, occurrenceStack: currOccurrenceStack }; possiblePaths.push(nextPath); } // end of the line } else if (currIdx === tokenVectorLength - 1) { // IGNORE ABOVE ELSE result.push({ nextTokenType: prod.terminalType, nextTokenOccurrence: prod.idx, ruleStack: currRuleStack, occurrenceStack: currOccurrenceStack }); foundCompletePath = true; } else { throw Error("non exhaustive match"); } } else if (prod instanceof gast_public_1.NonTerminal) { var newRuleStack = utils_1.cloneArr(currRuleStack); newRuleStack.push(prod.nonTerminalName); var newOccurrenceStack = utils_1.cloneArr(currOccurrenceStack); newOccurrenceStack.push(prod.idx); var nextPath = { idx: currIdx, def: prod.definition.concat(EXIT_NON_TERMINAL_ARR, utils_1.drop(currDef)), ruleStack: newRuleStack, occurrenceStack: newOccurrenceStack }; possiblePaths.push(nextPath); } else if (prod instanceof gast_public_1.Option) { // the order of alternatives is meaningful, FILO (Last path will be traversed first). var nextPathWithout = { idx: currIdx, def: utils_1.drop(currDef), ruleStack: currRuleStack, occurrenceStack: currOccurrenceStack }; possiblePaths.push(nextPathWithout); // required marker to avoid backtracking paths whose higher priority alternatives already matched possiblePaths.push(EXIT_ALTERNATIVE); var nextPathWith = { idx: currIdx, def: prod.definition.concat(utils_1.drop(currDef)), ruleStack: currRuleStack, occurrenceStack: currOccurrenceStack }; possiblePaths.push(nextPathWith); } else if (prod instanceof gast_public_1.RepetitionMandatory) { // TODO:(THE NEW operators here take a while...) (convert once?) var secondIteration = new gast_public_1.Repetition({ definition: prod.definition, idx: prod.idx }); var nextDef = prod.definition.concat([secondIteration], utils_1.drop(currDef)); var nextPath = { idx: currIdx, def: nextDef, ruleStack: currRuleStack, occurrenceStack: currOccurrenceStack }; possiblePaths.push(nextPath); } else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) { // TODO:(THE NEW operators here take a while...) (convert once?) var separatorGast = new gast_public_1.Terminal({ terminalType: prod.separator }); var secondIteration = new gast_public_1.Repetition({ definition: [separatorGast].concat(prod.definition), idx: prod.idx }); var nextDef = prod.definition.concat([secondIteration], utils_1.drop(currDef)); var nextPath = { idx: currIdx, def: nextDef, ruleStack: currRuleStack, occurrenceStack: currOccurrenceStack }; possiblePaths.push(nextPath); } else if (prod instanceof gast_public_1.RepetitionWithSeparator) { // the order of alternatives is meaningful, FILO (Last path will be traversed first). var nextPathWithout = { idx: currIdx, def: utils_1.drop(currDef), ruleStack: currRuleStack, occurrenceStack: currOccurrenceStack }; possiblePaths.push(nextPathWithout); // required marker to avoid backtracking paths whose higher priority alternatives already matched possiblePaths.push(EXIT_ALTERNATIVE); var separatorGast = new gast_public_1.Terminal({ terminalType: prod.separator }); var nthRepetition = new gast_public_1.Repetition({ definition: [separatorGast].concat(prod.definition), idx: prod.idx }); var nextDef = prod.definition.concat([nthRepetition], utils_1.drop(currDef)); var nextPathWith = { idx: currIdx, def: nextDef, ruleStack: currRuleStack, occurrenceStack: currOccurrenceStack }; possiblePaths.push(nextPathWith); } else if (prod instanceof gast_public_1.Repetition) { // the order of alternatives is meaningful, FILO (Last path will be traversed first). var nextPathWithout = { idx: currIdx, def: utils_1.drop(currDef), ruleStack: currRuleStack, occurrenceStack: currOccurrenceStack }; possiblePaths.push(nextPathWithout); // required marker to avoid backtracking paths whose higher priority alternatives already matched possiblePaths.push(EXIT_ALTERNATIVE); // TODO: an empty repetition will cause infinite loops here, will the parser detect this in selfAnalysis? var nthRepetition = new gast_public_1.Repetition({ definition: prod.definition, idx: prod.idx }); var nextDef = prod.definition.concat([nthRepetition], utils_1.drop(currDef)); var nextPathWith = { idx: currIdx, def: nextDef, ruleStack: currRuleStack, occurrenceStack: currOccurrenceStack }; possiblePaths.push(nextPathWith); } else if (prod instanceof gast_public_1.Alternation) { // the order of alternatives is meaningful, FILO (Last path will be traversed first). for (var i = prod.definition.length - 1; i >= 0; i--) { var currAlt = prod.definition[i]; var currAltPath = { idx: currIdx, def: currAlt.definition.concat(utils_1.drop(currDef)), ruleStack: currRuleStack, occurrenceStack: currOccurrenceStack }; possiblePaths.push(currAltPath); possiblePaths.push(EXIT_ALTERNATIVE); } } else if (prod instanceof gast_public_1.Flat) { possiblePaths.push({ idx: currIdx, def: prod.definition.concat(utils_1.drop(currDef)), ruleStack: currRuleStack, occurrenceStack: currOccurrenceStack }); } else if (prod instanceof gast_public_1.Rule) { // last because we should only encounter at most a single one of these per invocation. possiblePaths.push(expandTopLevelRule(prod, currIdx, currRuleStack, currOccurrenceStack)); } else { throw Error("non exhaustive match"); } } return result; } exports.nextPossibleTokensAfter = nextPossibleTokensAfter; function expandTopLevelRule(topRule, currIdx, currRuleStack, currOccurrenceStack) { var newRuleStack = utils_1.cloneArr(currRuleStack); newRuleStack.push(topRule.name); var newCurrOccurrenceStack = utils_1.cloneArr(currOccurrenceStack); // top rule is always assumed to have been called with occurrence index 1 newCurrOccurrenceStack.push(1); return { idx: currIdx, def: topRule.definition, ruleStack: newRuleStack, occurrenceStack: newCurrOccurrenceStack }; } //# sourceMappingURL=interpreter.js.map /***/ }), /* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = __webpack_require__(0); var gast_public_1 = __webpack_require__(1); /** * A Grammar Walker that computes the "remaining" grammar "after" a productions in the grammar. */ var RestWalker = /** @class */ (function () { function RestWalker() { } RestWalker.prototype.walk = function (prod, prevRest) { var _this = this; if (prevRest === void 0) { prevRest = []; } utils_1.forEach(prod.definition, function (subProd, index) { var currRest = utils_1.drop(prod.definition, index + 1); /* istanbul ignore else */ if (subProd instanceof gast_public_1.NonTerminal) { _this.walkProdRef(subProd, currRest, prevRest); } else if (subProd instanceof gast_public_1.Terminal) { _this.walkTerminal(subProd, currRest, prevRest); } else if (subProd instanceof gast_public_1.Flat) { _this.walkFlat(subProd, currRest, prevRest); } else if (subProd instanceof gast_public_1.Option) { _this.walkOption(subProd, currRest, prevRest); } else if (subProd instanceof gast_public_1.RepetitionMandatory) { _this.walkAtLeastOne(subProd, currRest, prevRest); } else if (subProd instanceof gast_public_1.RepetitionMandatoryWithSeparator) { _this.walkAtLeastOneSep(subProd, currRest, prevRest); } else if (subProd instanceof gast_public_1.RepetitionWithSeparator) { _this.walkManySep(subProd, currRest, prevRest); } else if (subProd instanceof gast_public_1.Repetition) { _this.walkMany(subProd, currRest, prevRest); } else if (subProd instanceof gast_public_1.Alternation) { _this.walkOr(subProd, currRest, prevRest); } else { throw Error("non exhaustive match"); } }); }; RestWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) { }; RestWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) { }; RestWalker.prototype.walkFlat = function (flatProd, currRest, prevRest) { // ABCDEF => after the D the rest is EF var fullOrRest = currRest.concat(prevRest); this.walk(flatProd, fullOrRest); }; RestWalker.prototype.walkOption = function (optionProd, currRest, prevRest) { // ABC(DE)?F => after the (DE)? the rest is F var fullOrRest = currRest.concat(prevRest); this.walk(optionProd, fullOrRest); }; RestWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) { // ABC(DE)+F => after the (DE)+ the rest is (DE)?F var fullAtLeastOneRest = [ new gast_public_1.Option({ definition: atLeastOneProd.definition }) ].concat(currRest, prevRest); this.walk(atLeastOneProd, fullAtLeastOneRest); }; RestWalker.prototype.walkAtLeastOneSep = function (atLeastOneSepProd, currRest, prevRest) { // ABC DE(,DE)* F => after the (,DE)+ the rest is (,DE)?F var fullAtLeastOneSepRest = restForRepetitionWithSeparator(atLeastOneSepProd, currRest, prevRest); this.walk(atLeastOneSepProd, fullAtLeastOneSepRest); }; RestWalker.prototype.walkMany = function (manyProd, currRest, prevRest) { // ABC(DE)*F => after the (DE)* the rest is (DE)?F var fullManyRest = [ new gast_public_1.Option({ definition: manyProd.definition }) ].concat(currRest, prevRest); this.walk(manyProd, fullManyRest); }; RestWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) { // ABC (DE(,DE)*)? F => after the (,DE)* the rest is (,DE)?F var fullManySepRest = restForRepetitionWithSeparator(manySepProd, currRest, prevRest); this.walk(manySepProd, fullManySepRest); }; RestWalker.prototype.walkOr = function (orProd, currRest, prevRest) { var _this = this; // ABC(D|E|F)G => when finding the (D|E|F) the rest is G var fullOrRest = currRest.concat(prevRest); // walk all different alternatives utils_1.forEach(orProd.definition, function (alt) { // wrapping each alternative in a single definition wrapper // to avoid errors in computing the rest of that alternative in the invocation to computeInProdFollows // (otherwise for OR([alt1,alt2]) alt2 will be considered in 'rest' of alt1 var prodWrapper = new gast_public_1.Flat({ definition: [alt] }); _this.walk(prodWrapper, fullOrRest); }); }; return RestWalker; }()); exports.RestWalker = RestWalker; function restForRepetitionWithSeparator(repSepProd, currRest, prevRest) { var repSepRest = [ new gast_public_1.Option({ definition: [ new gast_public_1.Terminal({ terminalType: repSepProd.separator }) ].concat(repSepProd.definition) }) ]; var fullRepSepRest = repSepRest.concat(currRest, prevRest); return fullRepSepRest; } //# sourceMappingURL=rest.js.map /***/ }), /* 27 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var exceptions_public_1 = __webpack_require__(37); var lang_extensions_1 = __webpack_require__(5); var checks_1 = __webpack_require__(9); var utils_1 = __webpack_require__(0); var follow_1 = __webpack_require__(61); var tokens_public_1 = __webpack_require__(3); var lookahead_1 = __webpack_require__(41); var gast_builder_1 = __webpack_require__(60); var interpreter_1 = __webpack_require__(25); var constants_1 = __webpack_require__(35); var tokens_1 = __webpack_require__(11); var cst_1 = __webpack_require__(36); var keys_1 = __webpack_require__(40); var cst_visitor_1 = __webpack_require__(59); var errors_public_1 = __webpack_require__(24); var gast_public_1 = __webpack_require__(1); var gast_resolver_public_1 = __webpack_require__(39); var IN_RULE_RECOVERY_EXCEPTION = "InRuleRecoveryException"; exports.END_OF_FILE = tokens_public_1.createTokenInstance(tokens_public_1.EOF, "", NaN, NaN, NaN, NaN, NaN, NaN); Object.freeze(exports.END_OF_FILE); var DEFAULT_PARSER_CONFIG = Object.freeze({ recoveryEnabled: false, maxLookahead: 4, ignoredIssues: {}, dynamicTokensEnabled: false, outputCst: false, errorMessageProvider: errors_public_1.defaultParserErrorProvider, serializedGrammar: null }); var DEFAULT_RULE_CONFIG = Object.freeze({ recoveryValueFunc: function () { return undefined; }, resyncEnabled: true }); var ParserDefinitionErrorType; (function (ParserDefinitionErrorType) { ParserDefinitionErrorType[ParserDefinitionErrorType["INVALID_RULE_NAME"] = 0] = "INVALID_RULE_NAME"; ParserDefinitionErrorType[ParserDefinitionErrorType["DUPLICATE_RULE_NAME"] = 1] = "DUPLICATE_RULE_NAME"; ParserDefinitionErrorType[ParserDefinitionErrorType["INVALID_RULE_OVERRIDE"] = 2] = "INVALID_RULE_OVERRIDE"; ParserDefinitionErrorType[ParserDefinitionErrorType["DUPLICATE_PRODUCTIONS"] = 3] = "DUPLICATE_PRODUCTIONS"; ParserDefinitionErrorType[ParserDefinitionErrorType["UNRESOLVED_SUBRULE_REF"] = 4] = "UNRESOLVED_SUBRULE_REF"; ParserDefinitionErrorType[ParserDefinitionErrorType["LEFT_RECURSION"] = 5] = "LEFT_RECURSION"; ParserDefinitionErrorType[ParserDefinitionErrorType["NONE_LAST_EMPTY_ALT"] = 6] = "NONE_LAST_EMPTY_ALT"; ParserDefinitionErrorType[ParserDefinitionErrorType["AMBIGUOUS_ALTS"] = 7] = "AMBIGUOUS_ALTS"; ParserDefinitionErrorType[ParserDefinitionErrorType["CONFLICT_TOKENS_RULES_NAMESPACE"] = 8] = "CONFLICT_TOKENS_RULES_NAMESPACE"; ParserDefinitionErrorType[ParserDefinitionErrorType["INVALID_TOKEN_NAME"] = 9] = "INVALID_TOKEN_NAME"; ParserDefinitionErrorType[ParserDefinitionErrorType["INVALID_NESTED_RULE_NAME"] = 10] = "INVALID_NESTED_RULE_NAME"; ParserDefinitionErrorType[ParserDefinitionErrorType["DUPLICATE_NESTED_NAME"] = 11] = "DUPLICATE_NESTED_NAME"; ParserDefinitionErrorType[ParserDefinitionErrorType["NO_NON_EMPTY_LOOKAHEAD"] = 12] = "NO_NON_EMPTY_LOOKAHEAD"; ParserDefinitionErrorType[ParserDefinitionErrorType["AMBIGUOUS_PREFIX_ALTS"] = 13] = "AMBIGUOUS_PREFIX_ALTS"; ParserDefinitionErrorType[ParserDefinitionErrorType["TOO_MANY_ALTS"] = 14] = "TOO_MANY_ALTS"; })(ParserDefinitionErrorType = exports.ParserDefinitionErrorType || (exports.ParserDefinitionErrorType = {})); function EMPTY_ALT(value) { if (value === void 0) { value = undefined; } return function () { return value; }; } exports.EMPTY_ALT = EMPTY_ALT; var EOF_FOLLOW_KEY = {}; var Parser = /** @class */ (function () { function Parser(input, tokenVocabulary, config) { if (config === void 0) { config = DEFAULT_PARSER_CONFIG; } this.gastProductionsCache = new lang_extensions_1.HashTable(); this.ProductionOverriddenForClass = new lang_extensions_1.HashTable(); this._errors = []; this.isBackTrackingStack = []; this.RULE_STACK = []; this.RULE_OCCURRENCE_STACK = []; this.CST_STACK = []; this.tokensMap = undefined; this.definitionErrors = []; this.definedRulesNames = []; this.shortRuleNameToFull = new lang_extensions_1.HashTable(); this.fullRuleNameToShort = new lang_extensions_1.HashTable(); // The shortName Index must be coded "after" the first 8bits to enable building unique lookahead keys this.ruleShortNameIdx = 256; this.LAST_EXPLICIT_RULE_STACK = []; this.selfAnalysisDone = false; this.currIdx = -1; this.input = input; // configuration this.recoveryEnabled = utils_1.has(config, "recoveryEnabled") ? config.recoveryEnabled : DEFAULT_PARSER_CONFIG.recoveryEnabled; // performance optimization, NOOP will be inlined which // effectively means that this optional feature does not exist // when not used. if (!this.recoveryEnabled) { this.attemptInRepetitionRecovery = utils_1.NOOP; } this.dynamicTokensEnabled = utils_1.has(config, "dynamicTokensEnabled") ? config.dynamicTokensEnabled : DEFAULT_PARSER_CONFIG.dynamicTokensEnabled; this.maxLookahead = utils_1.has(config, "maxLookahead") ? config.maxLookahead : DEFAULT_PARSER_CONFIG.maxLookahead; this.ignoredIssues = utils_1.has(config, "ignoredIssues") ? config.ignoredIssues : DEFAULT_PARSER_CONFIG.ignoredIssues; this.outputCst = utils_1.has(config, "outputCst") ? config.outputCst : DEFAULT_PARSER_CONFIG.outputCst; this.errorMessageProvider = utils_1.defaults(config.errorMessageProvider, DEFAULT_PARSER_CONFIG.errorMessageProvider); this.serializedGrammar = utils_1.has(config, "serializedGrammar") ? config.serializedGrammar : DEFAULT_PARSER_CONFIG.serializedGrammar; if (!this.outputCst) { this.cstInvocationStateUpdate = utils_1.NOOP; this.cstFinallyStateUpdate = utils_1.NOOP; this.cstPostTerminal = utils_1.NOOP; this.cstPostNonTerminal = utils_1.NOOP; this.getLastExplicitRuleShortName = this.getLastExplicitRuleShortNameNoCst; this.getPreviousExplicitRuleShortName = this.getPreviousExplicitRuleShortNameNoCst; this.getLastExplicitRuleOccurrenceIndex = this.getLastExplicitRuleOccurrenceIndexNoCst; this.manyInternal = this.manyInternalNoCst; this.orInternal = this.orInternalNoCst; this.optionInternal = this.optionInternalNoCst; this.atLeastOneInternal = this.atLeastOneInternalNoCst; this.manySepFirstInternal = this.manySepFirstInternalNoCst; this.atLeastOneSepFirstInternal = this.atLeastOneSepFirstInternalNoCst; } this.className = lang_extensions_1.classNameFromInstance(this); this.firstAfterRepMap = new lang_extensions_1.HashTable(); this.lookAheadFuncsCache = []; if (utils_1.isArray(tokenVocabulary)) { this.tokensMap = utils_1.reduce(tokenVocabulary, function (acc, tokenClazz) { acc[tokens_public_1.tokenName(tokenClazz)] = tokenClazz; return acc; }, {}); } else if (utils_1.has(tokenVocabulary, "modes") && utils_1.every(utils_1.flatten(utils_1.values(tokenVocabulary.modes)), tokens_1.isTokenType)) { var allTokenTypes = utils_1.flatten(utils_1.values(tokenVocabulary.modes)); var uniqueTokens = utils_1.uniq(allTokenTypes); this.tokensMap = utils_1.reduce(uniqueTokens, function (acc, tokenClazz) { acc[tokens_public_1.tokenName(tokenClazz)] = tokenClazz; return acc; }, {}); } else if (utils_1.isObject(tokenVocabulary)) { this.tokensMap = utils_1.cloneObj(tokenVocabulary); } else { throw new Error(" argument must be An Array of Token constructors" + " A dictionary of Token constructors or an IMultiModeLexerDefinition"); } var noTokenCategoriesUsed = utils_1.every(utils_1.values(tokenVocabulary), function (tokenConstructor) { return utils_1.isEmpty(tokenConstructor.categoryMatches); }); this.tokenMatcher = noTokenCategoriesUsed ? tokens_1.tokenStructuredMatcherNoCategories : tokens_1.tokenStructuredMatcher; // always add EOF to the tokenNames -> constructors map. it is useful to assure all the input has been // parsed with a clear error message ("expecting EOF but found ...") /* tslint:disable */ this.tokensMap["EOF"] = tokens_public_1.EOF; /* tslint:enable */ // Because ES2015+ syntax should be supported for creating Token classes // We cannot assume that the Token classes were created using the "extendToken" utilities // Therefore we must augment the Token classes both on Lexer initialization and on Parser initialization tokens_1.augmentTokenTypes(utils_1.values(this.tokensMap)); } /** * @deprecated use the **instance** method with the same name instead */ Parser.performSelfAnalysis = function (parserInstance) { parserInstance.performSelfAnalysis(); }; Parser.prototype.performSelfAnalysis = function () { var _this = this; var defErrorsMsgs; this.selfAnalysisDone = true; var className = lang_extensions_1.classNameFromInstance(this); var productions = this.gastProductionsCache; if (this.serializedGrammar) { var rules = gast_builder_1.deserializeGrammar(this.serializedGrammar, this.tokensMap); utils_1.forEach(rules, function (rule) { _this.gastProductionsCache.put(rule.name, rule); }); } var resolverErrors = gast_resolver_public_1.resolveGrammar({ rules: productions.values() }); this.definitionErrors.push.apply(this.definitionErrors, resolverErrors); // mutability for the win? // only perform additional grammar validations IFF no resolving errors have occurred. // as unresolved grammar may lead to unhandled runtime exceptions in the follow up validations. if (utils_1.isEmpty(resolverErrors)) { var validationErrors = gast_resolver_public_1.validateGrammar({ rules: productions.values(), maxLookahead: this.maxLookahead, tokenTypes: utils_1.values(this.tokensMap), ignoredIssues: this.ignoredIssues, errMsgProvider: errors_public_1.defaultGrammarValidatorErrorProvider, grammarName: className }); this.definitionErrors.push.apply(this.definitionErrors, validationErrors); // mutability for the win? } if (utils_1.isEmpty(this.definitionErrors)) { // this analysis may fail if the grammar is not perfectly valid var allFollows = follow_1.computeAllProdsFollows(productions.values()); this.resyncFollows = allFollows; } var cstAnalysisResult = cst_1.analyzeCst(productions.values(), this.fullRuleNameToShort); this.allRuleNames = cstAnalysisResult.allRuleNames; if (!Parser.DEFER_DEFINITION_ERRORS_HANDLING && !utils_1.isEmpty(this.definitionErrors)) { defErrorsMsgs = utils_1.map(this.definitionErrors, function (defError) { return defError.message; }); throw new Error("Parser Definition Errors detected:\n " + defErrorsMsgs.join("\n-------------------------------\n")); } }; Object.defineProperty(Parser.prototype, "errors", { get: function () { return utils_1.cloneArr(this._errors); }, set: function (newErrors) { this._errors = newErrors; }, enumerable: true, configurable: true }); Parser.prototype.reset = function () { this.resetLexerState(); this.isBackTrackingStack = []; this.errors = []; this.RULE_STACK = []; this.LAST_EXPLICIT_RULE_STACK = []; this.CST_STACK = []; this.RULE_OCCURRENCE_STACK = []; }; Parser.prototype.isAtEndOfInput = function () { return this.tokenMatcher(this.LA(1), tokens_public_1.EOF); }; Parser.prototype.getBaseCstVisitorConstructor = function () { if (utils_1.isUndefined(this.baseCstVisitorConstructor)) { var newBaseCstVisitorConstructor = cst_visitor_1.createBaseSemanticVisitorConstructor(this.className, this.allRuleNames); this.baseCstVisitorConstructor = newBaseCstVisitorConstructor; return newBaseCstVisitorConstructor; } return this.baseCstVisitorConstructor; }; Parser.prototype.getBaseCstVisitorConstructorWithDefaults = function () { if (utils_1.isUndefined(this.baseCstVisitorWithDefaultsConstructor)) { var newConstructor = cst_visitor_1.createBaseVisitorConstructorWithDefaults(this.className, this.allRuleNames, this.getBaseCstVisitorConstructor()); this.baseCstVisitorWithDefaultsConstructor = newConstructor; return newConstructor; } return this.baseCstVisitorWithDefaultsConstructor; }; Parser.prototype.getGAstProductions = function () { return this.gastProductionsCache; }; Parser.prototype.getSerializedGastProductions = function () { return gast_public_1.serializeGrammar(this.gastProductionsCache.values()); }; Parser.prototype.computeContentAssist = function (startRuleName, precedingInput) { var startRuleGast = this.gastProductionsCache.get(startRuleName); if (utils_1.isUndefined(startRuleGast)) { throw Error("Rule ->" + startRuleName + "<- does not exist in this grammar."); } return interpreter_1.nextPossibleTokensAfter([startRuleGast], precedingInput, this.tokenMatcher, this.maxLookahead); }; Parser.prototype.BACKTRACK = function (grammarRule, args) { return function () { // save org state this.isBackTrackingStack.push(1); var orgState = this.saveRecogState(); try { grammarRule.apply(this, args); // if no exception was thrown we have succeed parsing the rule. return true; } catch (e) { if (exceptions_public_1.isRecognitionException(e)) { return false; } else { throw e; } } finally { this.reloadRecogState(orgState); this.isBackTrackingStack.pop(); } }; }; Parser.prototype.SAVE_ERROR = function (error) { if (exceptions_public_1.isRecognitionException(error)) { error.context = { ruleStack: this.getHumanReadableRuleStack(), ruleOccurrenceStack: utils_1.cloneArr(this.RULE_OCCURRENCE_STACK) }; this._errors.push(error); return error; } else { throw Error("Trying to save an Error which is not a RecognitionException"); } }; Parser.prototype.isBackTracking = function () { return !utils_1.isEmpty(this.isBackTrackingStack); }; Parser.prototype.getCurrRuleFullName = function () { var shortName = this.getLastExplicitRuleShortName(); return this.shortRuleNameToFull.get(shortName); }; Parser.prototype.shortRuleNameToFullName = function (shortName) { return this.shortRuleNameToFull.get(shortName); }; Parser.prototype.getHumanReadableRuleStack = function () { var _this = this; if (!utils_1.isEmpty(this.LAST_EXPLICIT_RULE_STACK)) { return utils_1.map(this.LAST_EXPLICIT_RULE_STACK, function (currIdx) { return _this.shortRuleNameToFullName(_this.RULE_STACK[currIdx]); }); } else { return utils_1.map(this.RULE_STACK, function (currShortName) { return _this.shortRuleNameToFullName(currShortName); }); } }; // Parsing DSL Parser.prototype.CONSUME = function (tokType, options) { return this.consumeInternal(tokType, 0, options); }; Parser.prototype.CONSUME1 = function (tokType, options) { return this.consumeInternal(tokType, 1, options); }; Parser.prototype.CONSUME2 = function (tokType, options) { return this.consumeInternal(tokType, 2, options); }; Parser.prototype.CONSUME3 = function (tokType, options) { return this.consumeInternal(tokType, 3, options); }; Parser.prototype.CONSUME4 = function (tokType, options) { return this.consumeInternal(tokType, 4, options); }; Parser.prototype.CONSUME5 = function (tokType, options) { return this.consumeInternal(tokType, 5, options); }; Parser.prototype.CONSUME6 = function (tokType, options) { return this.consumeInternal(tokType, 6, options); }; Parser.prototype.CONSUME7 = function (tokType, options) { return this.consumeInternal(tokType, 7, options); }; Parser.prototype.CONSUME8 = function (tokType, options) { return this.consumeInternal(tokType, 8, options); }; Parser.prototype.CONSUME9 = function (tokType, options) { return this.consumeInternal(tokType, 9, options); }; Parser.prototype.SUBRULE = function (ruleToCall, options) { return this.subruleInternal(ruleToCall, 0, options); }; Parser.prototype.SUBRULE1 = function (ruleToCall, options) { return this.subruleInternal(ruleToCall, 1, options); }; Parser.prototype.SUBRULE2 = function (ruleToCall, options) { return this.subruleInternal(ruleToCall, 2, options); }; Parser.prototype.SUBRULE3 = function (ruleToCall, options) { return this.subruleInternal(ruleToCall, 3, options); }; Parser.prototype.SUBRULE4 = function (ruleToCall, options) { return this.subruleInternal(ruleToCall, 4, options); }; Parser.prototype.SUBRULE5 = function (ruleToCall, options) { return this.subruleInternal(ruleToCall, 5, options); }; Parser.prototype.SUBRULE6 = function (ruleToCall, options) { return this.subruleInternal(ruleToCall, 6, options); }; Parser.prototype.SUBRULE7 = function (ruleToCall, options) { return this.subruleInternal(ruleToCall, 7, options); }; Parser.prototype.SUBRULE8 = function (ruleToCall, options) { return this.subruleInternal(ruleToCall, 8, options); }; Parser.prototype.SUBRULE9 = function (ruleToCall, options) { return this.subruleInternal(ruleToCall, 9, options); }; Parser.prototype.OPTION = function (actionORMethodDef) { return this.optionInternal(actionORMethodDef, 0); }; Parser.prototype.OPTION1 = function (actionORMethodDef) { return this.optionInternal(actionORMethodDef, 1); }; Parser.prototype.OPTION2 = function (actionORMethodDef) { return this.optionInternal(actionORMethodDef, 2); }; Parser.prototype.OPTION3 = function (actionORMethodDef) { return this.optionInternal(actionORMethodDef, 3); }; Parser.prototype.OPTION4 = function (actionORMethodDef) { return this.optionInternal(actionORMethodDef, 4); }; Parser.prototype.OPTION5 = function (actionORMethodDef) { return this.optionInternal(actionORMethodDef, 5); }; Parser.prototype.OPTION6 = function (actionORMethodDef) { return this.optionInternal(actionORMethodDef, 6); }; Parser.prototype.OPTION7 = function (actionORMethodDef) { return this.optionInternal(actionORMethodDef, 7); }; Parser.prototype.OPTION8 = function (actionORMethodDef) { return this.optionInternal(actionORMethodDef, 8); }; Parser.prototype.OPTION9 = function (actionORMethodDef) { return this.optionInternal(actionORMethodDef, 9); }; Parser.prototype.OR = function (altsOrOpts) { return this.orInternal(altsOrOpts, 0); }; Parser.prototype.OR1 = function (altsOrOpts) { return this.orInternal(altsOrOpts, 1); }; Parser.prototype.OR2 = function (altsOrOpts) { return this.orInternal(altsOrOpts, 2); }; Parser.prototype.OR3 = function (altsOrOpts) { return this.orInternal(altsOrOpts, 3); }; Parser.prototype.OR4 = function (altsOrOpts) { return this.orInternal(altsOrOpts, 4); }; Parser.prototype.OR5 = function (altsOrOpts) { return this.orInternal(altsOrOpts, 5); }; Parser.prototype.OR6 = function (altsOrOpts) { return this.orInternal(altsOrOpts, 6); }; Parser.prototype.OR7 = function (altsOrOpts) { return this.orInternal(altsOrOpts, 7); }; Parser.prototype.OR8 = function (altsOrOpts) { return this.orInternal(altsOrOpts, 8); }; Parser.prototype.OR9 = function (altsOrOpts) { return this.orInternal(altsOrOpts, 9); }; Parser.prototype.MANY = function (actionORMethodDef) { return this.manyInternal(0, actionORMethodDef, []); }; Parser.prototype.MANY1 = function (actionORMethodDef) { return this.manyInternal(1, actionORMethodDef, []); }; Parser.prototype.MANY2 = function (actionORMethodDef) { return this.manyInternal(2, actionORMethodDef, []); }; Parser.prototype.MANY3 = function (actionORMethodDef) { return this.manyInternal(3, actionORMethodDef, []); }; Parser.prototype.MANY4 = function (actionORMethodDef) { return this.manyInternal(4, actionORMethodDef, []); }; Parser.prototype.MANY5 = function (actionORMethodDef) { return this.manyInternal(5, actionORMethodDef, []); }; Parser.prototype.MANY6 = function (actionORMethodDef) { return this.manyInternal(6, actionORMethodDef, []); }; Parser.prototype.MANY7 = function (actionORMethodDef) { return this.manyInternal(7, actionORMethodDef, []); }; Parser.prototype.MANY8 = function (actionORMethodDef) { return this.manyInternal(8, actionORMethodDef, []); }; Parser.prototype.MANY9 = function (actionORMethodDef) { return this.manyInternal(9, actionORMethodDef, []); }; Parser.prototype.MANY_SEP = function (options) { return this.manySepFirstInternal(0, options, { values: [], separators: [] }); }; Parser.prototype.MANY_SEP1 = function (options) { return this.manySepFirstInternal(1, options, { values: [], separators: [] }); }; Parser.prototype.MANY_SEP2 = function (options) { return this.manySepFirstInternal(2, options, { values: [], separators: [] }); }; Parser.prototype.MANY_SEP3 = function (options) { return this.manySepFirstInternal(3, options, { values: [], separators: [] }); }; Parser.prototype.MANY_SEP4 = function (options) { return this.manySepFirstInternal(4, options, { values: [], separators: [] }); }; Parser.prototype.MANY_SEP5 = function (options) { return this.manySepFirstInternal(5, options, { values: [], separators: [] }); }; Parser.prototype.MANY_SEP6 = function (options) { return this.manySepFirstInternal(6, options, { values: [], separators: [] }); }; Parser.prototype.MANY_SEP7 = function (options) { return this.manySepFirstInternal(7, options, { values: [], separators: [] }); }; Parser.prototype.MANY_SEP8 = function (options) { return this.manySepFirstInternal(8, options, { values: [], separators: [] }); }; Parser.prototype.MANY_SEP9 = function (options) { return this.manySepFirstInternal(9, options, { values: [], separators: [] }); }; Parser.prototype.AT_LEAST_ONE = function (actionORMethodDef) { return this.atLeastOneInternal(0, actionORMethodDef, []); }; Parser.prototype.AT_LEAST_ONE1 = function (actionORMethodDef) { return this.atLeastOneInternal(1, actionORMethodDef, []); }; Parser.prototype.AT_LEAST_ONE2 = function (actionORMethodDef) { return this.atLeastOneInternal(2, actionORMethodDef, []); }; Parser.prototype.AT_LEAST_ONE3 = function (actionORMethodDef) { return this.atLeastOneInternal(3, actionORMethodDef, []); }; Parser.prototype.AT_LEAST_ONE4 = function (actionORMethodDef) { return this.atLeastOneInternal(4, actionORMethodDef, []); }; Parser.prototype.AT_LEAST_ONE5 = function (actionORMethodDef) { return this.atLeastOneInternal(5, actionORMethodDef, []); }; Parser.prototype.AT_LEAST_ONE6 = function (actionORMethodDef) { return this.atLeastOneInternal(6, actionORMethodDef, []); }; Parser.prototype.AT_LEAST_ONE7 = function (actionORMethodDef) { return this.atLeastOneInternal(7, actionORMethodDef, []); }; Parser.prototype.AT_LEAST_ONE8 = function (actionORMethodDef) { return this.atLeastOneInternal(8, actionORMethodDef, []); }; Parser.prototype.AT_LEAST_ONE9 = function (actionORMethodDef) { return this.atLeastOneInternal(9, actionORMethodDef, []); }; Parser.prototype.AT_LEAST_ONE_SEP = function (options) { return this.atLeastOneSepFirstInternal(0, options, { values: [], separators: [] }); }; Parser.prototype.AT_LEAST_ONE_SEP1 = function (options) { return this.atLeastOneSepFirstInternal(1, options, { values: [], separators: [] }); }; Parser.prototype.AT_LEAST_ONE_SEP2 = function (options) { return this.atLeastOneSepFirstInternal(2, options, { values: [], separators: [] }); }; Parser.prototype.AT_LEAST_ONE_SEP3 = function (options) { return this.atLeastOneSepFirstInternal(3, options, { values: [], separators: [] }); }; Parser.prototype.AT_LEAST_ONE_SEP4 = function (options) { return this.atLeastOneSepFirstInternal(4, options, { values: [], separators: [] }); }; Parser.prototype.AT_LEAST_ONE_SEP5 = function (options) { return this.atLeastOneSepFirstInternal(5, options, { values: [], separators: [] }); }; Parser.prototype.AT_LEAST_ONE_SEP6 = function (options) { return this.atLeastOneSepFirstInternal(6, options, { values: [], separators: [] }); }; Parser.prototype.AT_LEAST_ONE_SEP7 = function (options) { return this.atLeastOneSepFirstInternal(7, options, { values: [], separators: [] }); }; Parser.prototype.AT_LEAST_ONE_SEP8 = function (options) { return this.atLeastOneSepFirstInternal(8, options, { values: [], separators: [] }); }; Parser.prototype.AT_LEAST_ONE_SEP9 = function (options) { return this.atLeastOneSepFirstInternal(9, options, { values: [], separators: [] }); }; Parser.prototype.RULE = function (name, implementation, // TODO: how to describe the optional return type of CSTNode? T|CstNode is not good because it is not backward // compatible, T|any is very general... config) { if (config === void 0) { // TODO: how to describe the optional return type of CSTNode? T|CstNode is not good because it is not backward // compatible, T|any is very general... config = DEFAULT_RULE_CONFIG; } if (utils_1.contains(this.definedRulesNames, name)) { var errMsg = errors_public_1.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({ topLevelRule: name, grammarName: this.className }); var error = { message: errMsg, type: ParserDefinitionErrorType.DUPLICATE_RULE_NAME, ruleName: name }; this.definitionErrors.push(error); } this.definedRulesNames.push(name); // only build the gast representation once. if (!this.gastProductionsCache.containsKey(name) && !this.serializedGrammar) { var gastProduction = gast_builder_1.buildTopProduction(implementation.toString(), name, this.tokensMap); this.gastProductionsCache.put(name, gastProduction); } var ruleImplementation = this.defineRule(name, implementation, config); this[name] = ruleImplementation; return ruleImplementation; }; Parser.prototype.OVERRIDE_RULE = function (name, impl, config) { if (config === void 0) { config = DEFAULT_RULE_CONFIG; } var ruleErrors = []; ruleErrors = ruleErrors.concat(checks_1.validateRuleIsOverridden(name, this.definedRulesNames, this.className)); this.definitionErrors.push.apply(this.definitionErrors, ruleErrors); // mutability for the win this.ProductionOverriddenForClass.put(name, true); // TODO: avoid building the rule when serializing grammars var gastProduction = gast_builder_1.buildTopProduction(impl.toString(), name, this.tokensMap); this.gastProductionsCache.put(name, gastProduction); return this.defineRule(name, impl, config); }; Parser.prototype.getTokenToInsert = function (tokType) { var tokToInsert = tokens_public_1.createTokenInstance(tokType, "", NaN, NaN, NaN, NaN, NaN, NaN); tokToInsert.isInsertedInRecovery = true; return tokToInsert; }; Parser.prototype.canTokenTypeBeInsertedInRecovery = function (tokType) { return true; }; Parser.prototype.ruleInvocationStateUpdate = function (shortName, fullName, idxInCallingRule) { this.RULE_OCCURRENCE_STACK.push(idxInCallingRule); this.RULE_STACK.push(shortName); // NOOP when cst is disabled this.cstInvocationStateUpdate(fullName, shortName); }; Parser.prototype.ruleFinallyStateUpdate = function () { this.RULE_STACK.pop(); this.RULE_OCCURRENCE_STACK.pop(); // NOOP when cst is disabled this.cstFinallyStateUpdate(); if (this.RULE_STACK.length === 0 && !this.isAtEndOfInput()) { var firstRedundantTok = this.LA(1); var errMsg = this.errorMessageProvider.buildNotAllInputParsedMessage({ firstRedundant: firstRedundantTok, ruleName: this.getCurrRuleFullName() }); this.SAVE_ERROR(new exceptions_public_1.NotAllInputParsedException(errMsg, firstRedundantTok)); } }; Parser.prototype.nestedRuleInvocationStateUpdate = function (nestedRuleName, shortNameKey) { this.RULE_OCCURRENCE_STACK.push(1); this.RULE_STACK.push(shortNameKey); this.cstNestedInvocationStateUpdate(nestedRuleName, shortNameKey); }; Parser.prototype.nestedRuleFinallyStateUpdate = function () { this.RULE_STACK.pop(); this.RULE_OCCURRENCE_STACK.pop(); // NOOP when cst is disabled this.cstNestedFinallyStateUpdate(); }; Parser.prototype.getCurrentGrammarPath = function (tokType, tokIdxInRule) { var pathRuleStack = this.getHumanReadableRuleStack(); var pathOccurrenceStack = utils_1.cloneArr(this.RULE_OCCURRENCE_STACK); var grammarPath = { ruleStack: pathRuleStack, occurrenceStack: pathOccurrenceStack, lastTok: tokType, lastTokOccurrence: tokIdxInRule }; return grammarPath; }; // TODO: should this be a member method or a utility? it does not have any state or usage of 'this'... // TODO: should this be more explicitly part of the public API? Parser.prototype.getNextPossibleTokenTypes = function (grammarPath) { var topRuleName = utils_1.first(grammarPath.ruleStack); var gastProductions = this.getGAstProductions(); var topProduction = gastProductions.get(topRuleName); var nextPossibleTokenTypes = new interpreter_1.NextAfterTokenWalker(topProduction, grammarPath).startWalking(); return nextPossibleTokenTypes; }; Parser.prototype.subruleInternal = function (ruleToCall, idx, options) { var args = options !== undefined ? options.ARGS : undefined; var ruleResult = ruleToCall.call(this, idx, args); this.cstPostNonTerminal(ruleResult, options !== undefined && options.LABEL !== undefined ? options.LABEL : ruleToCall.ruleName); return ruleResult; }; /** * @param tokType - The Type of Token we wish to consume (Reference to its constructor function). * @param idx - Occurrence index of consumed token in the invoking parser rule text * for example: * IDENT (DOT IDENT)* * the first ident will have idx 1 and the second one idx 2 * * note that for the second ident the idx is always 2 even if its invoked 30 times in the same rule * the idx is about the position in grammar (source code) and has nothing to do with a specific invocation * details. * @param options - * * @returns {Token} - The consumed Token. */ Parser.prototype.consumeInternal = function (tokType, idx, options) { var consumedToken; try { var nextToken = this.LA(1); if (this.tokenMatcher(nextToken, tokType) === true) { this.consumeToken(); consumedToken = nextToken; } else { var msg = void 0; var previousToken = this.LA(0); if (options !== undefined && options.ERR_MSG) { msg = options.ERR_MSG; } else { msg = this.errorMessageProvider.buildMismatchTokenMessage({ expected: tokType, actual: nextToken, previous: previousToken, ruleName: this.getCurrRuleFullName() }); } throw this.SAVE_ERROR(new exceptions_public_1.MismatchedTokenException(msg, nextToken, previousToken)); } } catch (eFromConsumption) { // no recovery allowed during backtracking, otherwise backtracking may recover invalid syntax and accept it // but the original syntax could have been parsed successfully without any backtracking + recovery if (this.recoveryEnabled && // TODO: more robust checking of the exception type. Perhaps Typescript extending expressions? eFromConsumption.name === "MismatchedTokenException" && !this.isBackTracking()) { var follows = this.getFollowsForInRuleRecovery(tokType, idx); try { consumedToken = this.tryInRuleRecovery(tokType, follows); } catch (eFromInRuleRecovery) { if (eFromInRuleRecovery.name === IN_RULE_RECOVERY_EXCEPTION) { // failed in RuleRecovery. // throw the original error in order to trigger reSync error recovery throw eFromConsumption; } else { throw eFromInRuleRecovery; } } } else { throw eFromConsumption; } } this.cstPostTerminal(options !== undefined && options.LABEL !== undefined ? options.LABEL : tokType.tokenName, consumedToken); return consumedToken; }; // other functionality Parser.prototype.saveRecogState = function () { // errors is a getter which will clone the errors array var savedErrors = this.errors; var savedRuleStack = utils_1.cloneArr(this.RULE_STACK); return { errors: savedErrors, lexerState: this.exportLexerState(), RULE_STACK: savedRuleStack, CST_STACK: this.CST_STACK, LAST_EXPLICIT_RULE_STACK: this.LAST_EXPLICIT_RULE_STACK }; }; Parser.prototype.reloadRecogState = function (newState) { this.errors = newState.errors; this.importLexerState(newState.lexerState); this.RULE_STACK = newState.RULE_STACK; }; Parser.prototype.defineRule = function (ruleName, impl, config) { if (this.selfAnalysisDone) { throw Error("Grammar rule <" + ruleName + "> may not be defined after the 'performSelfAnalysis' method has been called'\n" + "Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called."); } var resyncEnabled = utils_1.has(config, "resyncEnabled") ? config.resyncEnabled : DEFAULT_RULE_CONFIG.resyncEnabled; var recoveryValueFunc = utils_1.has(config, "recoveryValueFunc") ? config.recoveryValueFunc : DEFAULT_RULE_CONFIG.recoveryValueFunc; // performance optimization: Use small integers as keys for the longer human readable "full" rule names. // this greatly improves Map access time (as much as 8% for some performance benchmarks). /* tslint:disable */ var shortName = this.ruleShortNameIdx << (keys_1.BITS_FOR_METHOD_IDX + keys_1.BITS_FOR_OCCURRENCE_IDX); /* tslint:enable */ this.ruleShortNameIdx++; this.shortRuleNameToFull.put(shortName, ruleName); this.fullRuleNameToShort.put(ruleName, shortName); function invokeRuleWithTry(args) { try { // TODO: dynamically get rid of this? if (this.outputCst === true) { impl.apply(this, args); return this.CST_STACK[this.CST_STACK.length - 1]; } else { return impl.apply(this, args); } } catch (e) { var isFirstInvokedRule = this.RULE_STACK.length === 1; // note the reSync is always enabled for the first rule invocation, because we must always be able to // reSync with EOF and just output some INVALID ParseTree // during backtracking reSync recovery is disabled, otherwise we can't be certain the backtracking // path is really the most valid one var reSyncEnabled = resyncEnabled && !this.isBackTracking() && this.recoveryEnabled; if (exceptions_public_1.isRecognitionException(e)) { if (reSyncEnabled) { var reSyncTokType = this.findReSyncTokenType(); if (this.isInCurrentRuleReSyncSet(reSyncTokType)) { e.resyncedTokens = this.reSyncTo(reSyncTokType); if (this.outputCst) { var partialCstResult = this.CST_STACK[this.CST_STACK.length - 1]; partialCstResult.recoveredNode = true; return partialCstResult; } else { return recoveryValueFunc(); } } else { if (this.outputCst) { // recovery is only for "real" non nested rules var prevRuleShortName = this.getLastExplicitRuleShortNameNoCst(); var preRuleFullName = this.shortRuleNameToFull.get(prevRuleShortName); var partialCstResult = this.CST_STACK[this.CST_STACK.length - 1]; partialCstResult.recoveredNode = true; this.cstPostNonTerminalRecovery(partialCstResult, preRuleFullName); } // to be handled Further up the call stack throw e; } } else if (isFirstInvokedRule) { // otherwise a Redundant input error will be created as well and we cannot guarantee that this is indeed the case this.moveToTerminatedState(); // the parser should never throw one of its own errors outside its flow. // even if error recovery is disabled return recoveryValueFunc(); } else { // to be handled Further up the call stack throw e; } } else { // some other Error type which we don't know how to handle (for example a built in JavaScript Error) throw e; } } finally { this.ruleFinallyStateUpdate(); } } var wrappedGrammarRule; wrappedGrammarRule = function (idxInCallingRule, args) { if (idxInCallingRule === void 0) { idxInCallingRule = 0; } this.ruleInvocationStateUpdate(shortName, ruleName, idxInCallingRule); return invokeRuleWithTry.call(this, args); }; var ruleNamePropName = "ruleName"; wrappedGrammarRule[ruleNamePropName] = ruleName; return wrappedGrammarRule; }; Parser.prototype.tryInRepetitionRecovery = function (grammarRule, grammarRuleArgs, lookAheadFunc, expectedTokType) { var _this = this; // TODO: can the resyncTokenType be cached? var reSyncTokType = this.findReSyncTokenType(); var savedLexerState = this.exportLexerState(); var resyncedTokens = []; var passedResyncPoint = false; var nextTokenWithoutResync = this.LA(1); var currToken = this.LA(1); var generateErrorMessage = function () { var previousToken = _this.LA(0); // we are preemptively re-syncing before an error has been detected, therefor we must reproduce // the error that would have been thrown var msg = _this.errorMessageProvider.buildMismatchTokenMessage({ expected: expectedTokType, actual: nextTokenWithoutResync, previous: previousToken, ruleName: _this.getCurrRuleFullName() }); var error = new exceptions_public_1.MismatchedTokenException(msg, nextTokenWithoutResync, _this.LA(0)); // the first token here will be the original cause of the error, this is not part of the resyncedTokens property. error.resyncedTokens = utils_1.dropRight(resyncedTokens); _this.SAVE_ERROR(error); }; while (!passedResyncPoint) { // re-synced to a point where we can safely exit the repetition/ if (this.tokenMatcher(currToken, expectedTokType)) { generateErrorMessage(); return; // must return here to avoid reverting the inputIdx } else if (lookAheadFunc.call(this)) { // we skipped enough tokens so we can resync right back into another iteration of the repetition grammar rule generateErrorMessage(); // recursive invocation in other to support multiple re-syncs in the same top level repetition grammar rule grammarRule.apply(this, grammarRuleArgs); return; // must return here to avoid reverting the inputIdx } else if (this.tokenMatcher(currToken, reSyncTokType)) { passedResyncPoint = true; } else { currToken = this.SKIP_TOKEN(); this.addToResyncTokens(currToken, resyncedTokens); } } // we were unable to find a CLOSER point to resync inside the Repetition, reset the state. // The parsing exception we were trying to prevent will happen in the NEXT parsing step. it may be handled by // "between rules" resync recovery later in the flow. this.importLexerState(savedLexerState); }; Parser.prototype.shouldInRepetitionRecoveryBeTried = function (expectTokAfterLastMatch, nextTokIdx) { // arguments to try and perform resync into the next iteration of the many are missing if (expectTokAfterLastMatch === undefined || nextTokIdx === undefined) { return false; } // no need to recover, next token is what we expect... if (this.tokenMatcher(this.LA(1), expectTokAfterLastMatch)) { return false; } // error recovery is disabled during backtracking as it can make the parser ignore a valid grammar path // and prefer some backtracking path that includes recovered errors. if (this.isBackTracking()) { return false; } // if we can perform inRule recovery (single token insertion or deletion) we always prefer that recovery algorithm // because if it works, it makes the least amount of changes to the input stream (greedy algorithm) //noinspection RedundantIfStatementJS if (this.canPerformInRuleRecovery(expectTokAfterLastMatch, this.getFollowsForInRuleRecovery(expectTokAfterLastMatch, nextTokIdx))) { return false; } return true; }; // Error Recovery functionality Parser.prototype.getFollowsForInRuleRecovery = function (tokType, tokIdxInRule) { var grammarPath = this.getCurrentGrammarPath(tokType, tokIdxInRule); var follows = this.getNextPossibleTokenTypes(grammarPath); return follows; }; Parser.prototype.tryInRuleRecovery = function (expectedTokType, follows) { if (this.canRecoverWithSingleTokenInsertion(expectedTokType, follows)) { var tokToInsert = this.getTokenToInsert(expectedTokType); return tokToInsert; } if (this.canRecoverWithSingleTokenDeletion(expectedTokType)) { var nextTok = this.SKIP_TOKEN(); this.consumeToken(); return nextTok; } throw new InRuleRecoveryException("sad sad panda"); }; Parser.prototype.canPerformInRuleRecovery = function (expectedToken, follows) { return (this.canRecoverWithSingleTokenInsertion(expectedToken, follows) || this.canRecoverWithSingleTokenDeletion(expectedToken)); }; Parser.prototype.canRecoverWithSingleTokenInsertion = function (expectedTokType, follows) { var _this = this; if (!this.canTokenTypeBeInsertedInRecovery(expectedTokType)) { return false; } // must know the possible following tokens to perform single token insertion if (utils_1.isEmpty(follows)) { return false; } var mismatchedTok = this.LA(1); var isMisMatchedTokInFollows = utils_1.find(follows, function (possibleFollowsTokType) { return _this.tokenMatcher(mismatchedTok, possibleFollowsTokType); }) !== undefined; return isMisMatchedTokInFollows; }; Parser.prototype.canRecoverWithSingleTokenDeletion = function (expectedTokType) { var isNextTokenWhatIsExpected = this.tokenMatcher(this.LA(2), expectedTokType); return isNextTokenWhatIsExpected; }; Parser.prototype.isInCurrentRuleReSyncSet = function (tokenTypeIdx) { var followKey = this.getCurrFollowKey(); var currentRuleReSyncSet = this.getFollowSetFromFollowKey(followKey); return utils_1.contains(currentRuleReSyncSet, tokenTypeIdx); }; Parser.prototype.findReSyncTokenType = function () { var allPossibleReSyncTokTypes = this.flattenFollowSet(); // this loop will always terminate as EOF is always in the follow stack and also always (virtually) in the input var nextToken = this.LA(1); var k = 2; while (true) { var nextTokenType = nextToken.tokenType; if (utils_1.contains(allPossibleReSyncTokTypes, nextTokenType)) { return nextTokenType; } nextToken = this.LA(k); k++; } }; Parser.prototype.getCurrFollowKey = function () { // the length is at least one as we always add the ruleName to the stack before invoking the rule. if (this.RULE_STACK.length === 1) { return EOF_FOLLOW_KEY; } var currRuleShortName = this.getLastExplicitRuleShortName(); var currRuleIdx = this.getLastExplicitRuleOccurrenceIndex(); var prevRuleShortName = this.getPreviousExplicitRuleShortName(); return { ruleName: this.shortRuleNameToFullName(currRuleShortName), idxInCallingRule: currRuleIdx, inRule: this.shortRuleNameToFullName(prevRuleShortName) }; }; Parser.prototype.buildFullFollowKeyStack = function () { var _this = this; var explicitRuleStack = this.RULE_STACK; var explicitOccurrenceStack = this.RULE_OCCURRENCE_STACK; if (!utils_1.isEmpty(this.LAST_EXPLICIT_RULE_STACK)) { explicitRuleStack = utils_1.map(this.LAST_EXPLICIT_RULE_STACK, function (idx) { return _this.RULE_STACK[idx]; }); explicitOccurrenceStack = utils_1.map(this.LAST_EXPLICIT_RULE_STACK, function (idx) { return _this.RULE_OCCURRENCE_STACK[idx]; }); } // TODO: only iterate over explicit rules here return utils_1.map(explicitRuleStack, function (ruleName, idx) { if (idx === 0) { return EOF_FOLLOW_KEY; } return { ruleName: _this.shortRuleNameToFullName(ruleName), idxInCallingRule: explicitOccurrenceStack[idx], inRule: _this.shortRuleNameToFullName(explicitRuleStack[idx - 1]) }; }); }; Parser.prototype.flattenFollowSet = function () { var _this = this; var followStack = utils_1.map(this.buildFullFollowKeyStack(), function (currKey) { return _this.getFollowSetFromFollowKey(currKey); }); return utils_1.flatten(followStack); }; Parser.prototype.getFollowSetFromFollowKey = function (followKey) { if (followKey === EOF_FOLLOW_KEY) { return [tokens_public_1.EOF]; } var followName = followKey.ruleName + followKey.idxInCallingRule + constants_1.IN + followKey.inRule; return this.resyncFollows.get(followName); }; // It does not make any sense to include a virtual EOF token in the list of resynced tokens // as EOF does not really exist and thus does not contain any useful information (line/column numbers) Parser.prototype.addToResyncTokens = function (token, resyncTokens) { if (!this.tokenMatcher(token, tokens_public_1.EOF)) { resyncTokens.push(token); } return resyncTokens; }; Parser.prototype.reSyncTo = function (tokType) { var resyncedTokens = []; var nextTok = this.LA(1); while (this.tokenMatcher(nextTok, tokType) === false) { nextTok = this.SKIP_TOKEN(); this.addToResyncTokens(nextTok, resyncedTokens); } // the last token is not part of the error. return utils_1.dropRight(resyncedTokens); }; Parser.prototype.attemptInRepetitionRecovery = function (prodFunc, args, lookaheadFunc, dslMethodIdx, prodOccurrence, nextToksWalker) { var key = this.getKeyForAutomaticLookahead(dslMethodIdx, prodOccurrence); var firstAfterRepInfo = this.firstAfterRepMap.get(key); if (firstAfterRepInfo === undefined) { var currRuleName = this.getCurrRuleFullName(); var ruleGrammar = this.getGAstProductions().get(currRuleName); var walker = new nextToksWalker(ruleGrammar, prodOccurrence); firstAfterRepInfo = walker.startWalking(); this.firstAfterRepMap.put(key, firstAfterRepInfo); } var expectTokAfterLastMatch = firstAfterRepInfo.token; var nextTokIdx = firstAfterRepInfo.occurrence; var isEndOfRule = firstAfterRepInfo.isEndOfRule; // special edge case of a TOP most repetition after which the input should END. // this will force an attempt for inRule recovery in that scenario. if (this.RULE_STACK.length === 1 && isEndOfRule && expectTokAfterLastMatch === undefined) { expectTokAfterLastMatch = tokens_public_1.EOF; nextTokIdx = 1; } if (this.shouldInRepetitionRecoveryBeTried(expectTokAfterLastMatch, nextTokIdx)) { // TODO: performance optimization: instead of passing the original args here, we modify // the args param (or create a new one) and make sure the lookahead func is explicitly provided // to avoid searching the cache for it once more. this.tryInRepetitionRecovery(prodFunc, args, lookaheadFunc, expectTokAfterLastMatch); } }; Parser.prototype.cstNestedInvocationStateUpdate = function (nestedName, shortName) { this.CST_STACK.push({ name: nestedName, fullName: this.shortRuleNameToFull.get(this.getLastExplicitRuleShortName()) + nestedName, children: {} }); }; Parser.prototype.cstInvocationStateUpdate = function (fullRuleName, shortName) { this.LAST_EXPLICIT_RULE_STACK.push(this.RULE_STACK.length - 1); this.CST_STACK.push({ name: fullRuleName, children: {} }); }; Parser.prototype.cstFinallyStateUpdate = function () { this.LAST_EXPLICIT_RULE_STACK.pop(); this.CST_STACK.pop(); }; Parser.prototype.cstNestedFinallyStateUpdate = function () { this.CST_STACK.pop(); }; // Implementation of parsing DSL Parser.prototype.optionInternal = function (actionORMethodDef, occurrence) { var key = this.getKeyForAutomaticLookahead(keys_1.OPTION_IDX, occurrence); var nestedName = this.nestedRuleBeforeClause(actionORMethodDef, key); try { return this.optionInternalLogic(actionORMethodDef, occurrence, key); } finally { if (nestedName !== undefined) { this.nestedRuleFinallyClause(key, nestedName); } } }; Parser.prototype.optionInternalNoCst = function (actionORMethodDef, occurrence) { var key = this.getKeyForAutomaticLookahead(keys_1.OPTION_IDX, occurrence); return this.optionInternalLogic(actionORMethodDef, occurrence, key); }; Parser.prototype.optionInternalLogic = function (actionORMethodDef, occurrence, key) { var _this = this; var lookAheadFunc = this.getLookaheadFuncForOption(key, occurrence); var action; var predicate; if (actionORMethodDef.DEF !== undefined) { action = actionORMethodDef.DEF; predicate = actionORMethodDef.GATE; // predicate present if (predicate !== undefined) { var orgLookaheadFunction_1 = lookAheadFunc; lookAheadFunc = function () { return (predicate.call(_this) && orgLookaheadFunction_1.call(_this)); }; } } else { action = actionORMethodDef; } if (lookAheadFunc.call(this) === true) { return action.call(this); } return undefined; }; Parser.prototype.atLeastOneInternal = function (prodOccurrence, actionORMethodDef, result) { var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_IDX, prodOccurrence); var nestedName = this.nestedRuleBeforeClause(actionORMethodDef, laKey); try { return this.atLeastOneInternalLogic(prodOccurrence, actionORMethodDef, result, laKey); } finally { if (nestedName !== undefined) { this.nestedRuleFinallyClause(laKey, nestedName); } } }; Parser.prototype.atLeastOneInternalNoCst = function (prodOccurrence, actionORMethodDef, result) { var key = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_IDX, prodOccurrence); return this.atLeastOneInternalLogic(prodOccurrence, actionORMethodDef, result, key); }; Parser.prototype.atLeastOneInternalLogic = function (prodOccurrence, actionORMethodDef, result, key) { var _this = this; var lookAheadFunc = this.getLookaheadFuncForAtLeastOne(key, prodOccurrence); var action; var predicate; if (actionORMethodDef.DEF !== undefined) { action = actionORMethodDef.DEF; predicate = actionORMethodDef.GATE; // predicate present if (predicate !== undefined) { var orgLookaheadFunction_2 = lookAheadFunc; lookAheadFunc = function () { return (predicate.call(_this) && orgLookaheadFunction_2.call(_this)); }; } } else { action = actionORMethodDef; } if (lookAheadFunc.call(this) === true) { result.push(action.call(this)); while (lookAheadFunc.call(this) === true) { result.push(action.call(this)); } } else { throw this.raiseEarlyExitException(prodOccurrence, lookahead_1.PROD_TYPE.REPETITION_MANDATORY, actionORMethodDef.ERR_MSG); } // note that while it may seem that this can cause an error because by using a recursive call to // AT_LEAST_ONE we change the grammar to AT_LEAST_TWO, AT_LEAST_THREE ... , the possible recursive call // from the tryInRepetitionRecovery(...) will only happen IFF there really are TWO/THREE/.... items. // Performance optimization: "attemptInRepetitionRecovery" will be defined as NOOP unless recovery is enabled this.attemptInRepetitionRecovery(this.atLeastOneInternal, [prodOccurrence, actionORMethodDef, result], lookAheadFunc, keys_1.AT_LEAST_ONE_IDX, prodOccurrence, interpreter_1.NextTerminalAfterAtLeastOneWalker); return result; }; Parser.prototype.atLeastOneSepFirstInternal = function (prodOccurrence, options, result) { var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence); var nestedName = this.nestedRuleBeforeClause(options, laKey); try { return this.atLeastOneSepFirstInternalLogic(prodOccurrence, options, result, laKey); } finally { if (nestedName !== undefined) { this.nestedRuleFinallyClause(laKey, nestedName); } } }; Parser.prototype.atLeastOneSepFirstInternalNoCst = function (prodOccurrence, options, result) { var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence); return this.atLeastOneSepFirstInternalLogic(prodOccurrence, options, result, laKey); }; Parser.prototype.atLeastOneSepFirstInternalLogic = function (prodOccurrence, options, result, key) { var _this = this; var action = options.DEF; var separator = options.SEP; var firstIterationLookaheadFunc = this.getLookaheadFuncForAtLeastOneSep(key, prodOccurrence); var values = result.values; var separators = result.separators; // 1st iteration if (firstIterationLookaheadFunc.call(this) === true) { values.push(action.call(this)); var separatorLookAheadFunc = function () { return _this.tokenMatcher(_this.LA(1), separator); }; // 2nd..nth iterations while (this.tokenMatcher(this.LA(1), separator) === true) { // note that this CONSUME will never enter recovery because // the separatorLookAheadFunc checks that the separator really does exist. separators.push(this.CONSUME(separator)); values.push(action.call(this)); } // Performance optimization: "attemptInRepetitionRecovery" will be defined as NOOP unless recovery is enabled this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [ prodOccurrence, separator, separatorLookAheadFunc, action, interpreter_1.NextTerminalAfterAtLeastOneSepWalker, result ], separatorLookAheadFunc, keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence, interpreter_1.NextTerminalAfterAtLeastOneSepWalker); } else { throw this.raiseEarlyExitException(prodOccurrence, lookahead_1.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, options.ERR_MSG); } return result; }; Parser.prototype.manyInternal = function (prodOccurrence, actionORMethodDef, result) { var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_IDX, prodOccurrence); var nestedName = this.nestedRuleBeforeClause(actionORMethodDef, laKey); try { return this.manyInternalLogic(prodOccurrence, actionORMethodDef, result, laKey); } finally { if (nestedName !== undefined) { this.nestedRuleFinallyClause(laKey, nestedName); } } }; Parser.prototype.manyInternalNoCst = function (prodOccurrence, actionORMethodDef, result) { var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_IDX, prodOccurrence); return this.manyInternalLogic(prodOccurrence, actionORMethodDef, result, laKey); }; Parser.prototype.manyInternalLogic = function (prodOccurrence, actionORMethodDef, result, key) { var _this = this; var lookaheadFunction = this.getLookaheadFuncForMany(key, prodOccurrence); var action; var predicate; if (actionORMethodDef.DEF !== undefined) { action = actionORMethodDef.DEF; predicate = actionORMethodDef.GATE; // predicate present if (predicate !== undefined) { var orgLookaheadFunction_3 = lookaheadFunction; lookaheadFunction = function () { return (predicate.call(_this) && orgLookaheadFunction_3.call(_this)); }; } } else { action = actionORMethodDef; } while (lookaheadFunction.call(this)) { result.push(action.call(this)); } // Performance optimization: "attemptInRepetitionRecovery" will be defined as NOOP unless recovery is enabled this.attemptInRepetitionRecovery(this.manyInternal, [prodOccurrence, actionORMethodDef, result], lookaheadFunction, keys_1.MANY_IDX, prodOccurrence, interpreter_1.NextTerminalAfterManyWalker); return result; }; Parser.prototype.manySepFirstInternal = function (prodOccurrence, options, result) { var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_SEP_IDX, prodOccurrence); var nestedName = this.nestedRuleBeforeClause(options, laKey); try { return this.manySepFirstInternalLogic(prodOccurrence, options, result, laKey); } finally { if (nestedName !== undefined) { this.nestedRuleFinallyClause(laKey, nestedName); } } }; Parser.prototype.manySepFirstInternalNoCst = function (prodOccurrence, options, result) { var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_SEP_IDX, prodOccurrence); return this.manySepFirstInternalLogic(prodOccurrence, options, result, laKey); }; Parser.prototype.manySepFirstInternalLogic = function (prodOccurrence, options, result, key) { var _this = this; var action = options.DEF; var separator = options.SEP; var firstIterationLaFunc = this.getLookaheadFuncForManySep(key, prodOccurrence); var values = result.values; var separators = result.separators; // 1st iteration if (firstIterationLaFunc.call(this) === true) { values.push(action.call(this)); var separatorLookAheadFunc = function () { return _this.tokenMatcher(_this.LA(1), separator); }; // 2nd..nth iterations while (this.tokenMatcher(this.LA(1), separator) === true) { // note that this CONSUME will never enter recovery because // the separatorLookAheadFunc checks that the separator really does exist. separators.push(this.CONSUME(separator)); values.push(action.call(this)); } // Performance optimization: "attemptInRepetitionRecovery" will be defined as NOOP unless recovery is enabled this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [ prodOccurrence, separator, separatorLookAheadFunc, action, interpreter_1.NextTerminalAfterManySepWalker, result ], separatorLookAheadFunc, keys_1.MANY_SEP_IDX, prodOccurrence, interpreter_1.NextTerminalAfterManySepWalker); } return result; }; Parser.prototype.repetitionSepSecondInternal = function (prodOccurrence, separator, separatorLookAheadFunc, action, nextTerminalAfterWalker, result) { while (separatorLookAheadFunc()) { // note that this CONSUME will never enter recovery because // the separatorLookAheadFunc checks that the separator really does exist. result.separators.push(this.CONSUME(separator)); result.values.push(action.call(this)); } // we can only arrive to this function after an error // has occurred (hence the name 'second') so the following // IF will always be entered, its possible to remove it... // however it is kept to avoid confusion and be consistent. // Performance optimization: "attemptInRepetitionRecovery" will be defined as NOOP unless recovery is enabled /* istanbul ignore else */ this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [ prodOccurrence, separator, separatorLookAheadFunc, action, nextTerminalAfterWalker, result ], separatorLookAheadFunc, keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence, nextTerminalAfterWalker); }; Parser.prototype.orInternalNoCst = function (altsOrOpts, occurrence) { var alts = utils_1.isArray(altsOrOpts) ? altsOrOpts : altsOrOpts.DEF; var laFunc = this.getLookaheadFuncForOr(occurrence, alts); var altIdxToTake = laFunc.call(this, alts); if (altIdxToTake !== undefined) { var chosenAlternative = alts[altIdxToTake]; return chosenAlternative.ALT.call(this); } this.raiseNoAltException(occurrence, altsOrOpts.ERR_MSG); }; Parser.prototype.orInternal = function (altsOrOpts, occurrence) { var laKey = this.getKeyForAutomaticLookahead(keys_1.OR_IDX, occurrence); var nestedName = this.nestedRuleBeforeClause(altsOrOpts, laKey); try { var alts = utils_1.isArray(altsOrOpts) ? altsOrOpts : altsOrOpts.DEF; var laFunc = this.getLookaheadFuncForOr(occurrence, alts); var altIdxToTake = laFunc.call(this, alts); if (altIdxToTake !== undefined) { var chosenAlternative = alts[altIdxToTake]; var nestedAltBeforeClauseResult = this.nestedAltBeforeClause(chosenAlternative, occurrence, keys_1.OR_IDX, altIdxToTake); try { return chosenAlternative.ALT.call(this); } finally { if (nestedAltBeforeClauseResult !== undefined) { this.nestedRuleFinallyClause(nestedAltBeforeClauseResult.shortName, nestedAltBeforeClauseResult.nestedName); } } } this.raiseNoAltException(occurrence, altsOrOpts.ERR_MSG); } finally { if (nestedName !== undefined) { this.nestedRuleFinallyClause(laKey, nestedName); } } }; // this actually returns a number, but it is always used as a string (object prop key) Parser.prototype.getKeyForAutomaticLookahead = function (dslMethodIdx, occurrence) { var currRuleShortName = this.getLastExplicitRuleShortName(); return keys_1.getKeyForAutomaticLookahead(currRuleShortName, dslMethodIdx, occurrence); }; Parser.prototype.getLookaheadFuncForOr = function (occurrence, alts) { var key = this.getKeyForAutomaticLookahead(keys_1.OR_IDX, occurrence); var laFunc = this.lookAheadFuncsCache[key]; if (laFunc === undefined) { var ruleName = this.getCurrRuleFullName(); var ruleGrammar = this.getGAstProductions().get(ruleName); // note that hasPredicates is only computed once. var hasPredicates = utils_1.some(alts, function (currAlt) { return utils_1.isFunction(currAlt.GATE); }); laFunc = lookahead_1.buildLookaheadFuncForOr(occurrence, ruleGrammar, this.maxLookahead, hasPredicates, this.dynamicTokensEnabled, this.lookAheadBuilderForAlternatives); this.lookAheadFuncsCache[key] = laFunc; return laFunc; } else { return laFunc; } }; // Automatic lookahead calculation Parser.prototype.getLookaheadFuncForOption = function (key, occurrence) { return this.getLookaheadFuncFor(key, occurrence, this.maxLookahead, lookahead_1.PROD_TYPE.OPTION); }; Parser.prototype.getLookaheadFuncForMany = function (key, occurrence) { return this.getLookaheadFuncFor(key, occurrence, this.maxLookahead, lookahead_1.PROD_TYPE.REPETITION); }; Parser.prototype.getLookaheadFuncForManySep = function (key, occurrence) { return this.getLookaheadFuncFor(key, occurrence, this.maxLookahead, lookahead_1.PROD_TYPE.REPETITION_WITH_SEPARATOR); }; Parser.prototype.getLookaheadFuncForAtLeastOne = function (key, occurrence) { return this.getLookaheadFuncFor(key, occurrence, this.maxLookahead, lookahead_1.PROD_TYPE.REPETITION_MANDATORY); }; Parser.prototype.getLookaheadFuncForAtLeastOneSep = function (key, occurrence) { return this.getLookaheadFuncFor(key, occurrence, this.maxLookahead, lookahead_1.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR); }; // TODO: consider caching the error message computed information Parser.prototype.raiseNoAltException = function (occurrence, errMsgTypes) { var ruleName = this.getCurrRuleFullName(); var ruleGrammar = this.getGAstProductions().get(ruleName); // TODO: getLookaheadPathsForOr can be slow for large enough maxLookahead and certain grammars, consider caching ? var lookAheadPathsPerAlternative = lookahead_1.getLookaheadPathsForOr(occurrence, ruleGrammar, this.maxLookahead); var actualTokens = []; for (var i = 1; i < this.maxLookahead; i++) { actualTokens.push(this.LA(i)); } var previousToken = this.LA(0); var errMsg = this.errorMessageProvider.buildNoViableAltMessage({ expectedPathsPerAlt: lookAheadPathsPerAlternative, actual: actualTokens, previous: previousToken, customUserDescription: errMsgTypes, ruleName: this.getCurrRuleFullName() }); throw this.SAVE_ERROR(new exceptions_public_1.NoViableAltException(errMsg, this.LA(1), previousToken)); }; Parser.prototype.getLookaheadFuncFor = function (key, occurrence, maxLookahead, prodType) { var laFunc = this.lookAheadFuncsCache[key]; if (laFunc === undefined) { var ruleName = this.getCurrRuleFullName(); var ruleGrammar = this.getGAstProductions().get(ruleName); laFunc = lookahead_1.buildLookaheadFuncForOptionalProd(occurrence, ruleGrammar, maxLookahead, this.dynamicTokensEnabled, prodType, this.lookAheadBuilderForOptional); this.lookAheadFuncsCache[key] = laFunc; return laFunc; } else { return laFunc; } }; // TODO: consider caching the error message computed information Parser.prototype.raiseEarlyExitException = function (occurrence, prodType, userDefinedErrMsg) { var ruleName = this.getCurrRuleFullName(); var ruleGrammar = this.getGAstProductions().get(ruleName); var lookAheadPathsPerAlternative = lookahead_1.getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, this.maxLookahead); var insideProdPaths = lookAheadPathsPerAlternative[0]; var actualTokens = []; for (var i = 1; i < this.maxLookahead; i++) { actualTokens.push(this.LA(i)); } var msg = this.errorMessageProvider.buildEarlyExitMessage({ expectedIterationPaths: insideProdPaths, actual: actualTokens, previous: this.LA(0), customUserDescription: userDefinedErrMsg, ruleName: ruleName }); throw this.SAVE_ERROR(new exceptions_public_1.EarlyExitException(msg, this.LA(1), this.LA(0))); }; Parser.prototype.getLastExplicitRuleShortName = function () { var lastExplictIndex = this.LAST_EXPLICIT_RULE_STACK[this.LAST_EXPLICIT_RULE_STACK.length - 1]; return this.RULE_STACK[lastExplictIndex]; }; Parser.prototype.getLastExplicitRuleShortNameNoCst = function () { var ruleStack = this.RULE_STACK; return ruleStack[ruleStack.length - 1]; }; Parser.prototype.getPreviousExplicitRuleShortName = function () { var lastExplicitIndex = this.LAST_EXPLICIT_RULE_STACK[this.LAST_EXPLICIT_RULE_STACK.length - 2]; return this.RULE_STACK[lastExplicitIndex]; }; Parser.prototype.getPreviousExplicitRuleShortNameNoCst = function () { var ruleStack = this.RULE_STACK; return ruleStack[ruleStack.length - 2]; }; Parser.prototype.getLastExplicitRuleOccurrenceIndex = function () { var lastExplicitIndex = this.LAST_EXPLICIT_RULE_STACK[this.LAST_EXPLICIT_RULE_STACK.length - 1]; return this.RULE_OCCURRENCE_STACK[lastExplicitIndex]; }; Parser.prototype.getLastExplicitRuleOccurrenceIndexNoCst = function () { var occurrenceStack = this.RULE_OCCURRENCE_STACK; return occurrenceStack[occurrenceStack.length - 1]; }; Parser.prototype.nestedRuleBeforeClause = function (methodOpts, laKey) { var nestedName; if (methodOpts.NAME !== undefined) { nestedName = methodOpts.NAME; this.nestedRuleInvocationStateUpdate(nestedName, laKey); return nestedName; } else { return undefined; } }; Parser.prototype.nestedAltBeforeClause = function (methodOpts, occurrence, methodKeyIdx, altIdx) { var ruleIdx = this.getLastExplicitRuleShortName(); var shortName = keys_1.getKeyForAltIndex(ruleIdx, methodKeyIdx, occurrence, altIdx); var nestedName; if (methodOpts.NAME !== undefined) { nestedName = methodOpts.NAME; this.nestedRuleInvocationStateUpdate(nestedName, shortName); return { shortName: shortName, nestedName: nestedName }; } else { return undefined; } }; Parser.prototype.nestedRuleFinallyClause = function (laKey, nestedName) { var cstStack = this.CST_STACK; var nestedRuleCst = cstStack[cstStack.length - 1]; this.nestedRuleFinallyStateUpdate(); // this return a different result than the previous invocation because "nestedRuleFinallyStateUpdate" pops the cst stack var parentCstNode = cstStack[cstStack.length - 1]; cst_1.addNoneTerminalToCst(parentCstNode, nestedName, nestedRuleCst); }; Parser.prototype.cstPostTerminal = function (key, consumedToken) { // TODO: would save the "current rootCST be faster than locating it for each terminal? var rootCst = this.CST_STACK[this.CST_STACK.length - 1]; cst_1.addTerminalToCst(rootCst, consumedToken, key); }; Parser.prototype.cstPostNonTerminal = function (ruleCstResult, ruleName) { cst_1.addNoneTerminalToCst(this.CST_STACK[this.CST_STACK.length - 1], ruleName, ruleCstResult); }; Parser.prototype.cstPostNonTerminalRecovery = function (ruleCstResult, ruleName) { // TODO: assumes not first rule, is this assumption always correct? cst_1.addNoneTerminalToCst(this.CST_STACK[this.CST_STACK.length - 2], ruleName, ruleCstResult); }; Object.defineProperty(Parser.prototype, "input", { get: function () { return this.tokVector; }, // lexer related methods set: function (newInput) { this.reset(); this.tokVector = newInput; this.tokVectorLength = newInput.length; }, enumerable: true, configurable: true }); // skips a token and returns the next token Parser.prototype.SKIP_TOKEN = function () { if (this.currIdx <= this.tokVector.length - 2) { this.consumeToken(); return this.LA(1); } else { return exports.END_OF_FILE; } }; // Lexer (accessing Token vector) related methods which can be overridden to implement lazy lexers // or lexers dependent on parser context. Parser.prototype.LA = function (howMuch) { // does: is this optimization (saving tokVectorLength benefits?) if (this.currIdx + howMuch < 0 || this.tokVectorLength <= this.currIdx + howMuch) { return exports.END_OF_FILE; } else { return this.tokVector[this.currIdx + howMuch]; } }; Parser.prototype.consumeToken = function () { this.currIdx++; }; Parser.prototype.exportLexerState = function () { return this.currIdx; }; Parser.prototype.importLexerState = function (newState) { this.currIdx = newState; }; Parser.prototype.resetLexerState = function () { this.currIdx = -1; }; Parser.prototype.moveToTerminatedState = function () { this.currIdx = this.tokVector.length - 1; }; Parser.prototype.lookAheadBuilderForOptional = function (alt, tokenMatcher, dynamicTokensEnabled) { return lookahead_1.buildSingleAlternativeLookaheadFunction(alt, tokenMatcher, dynamicTokensEnabled); }; Parser.prototype.lookAheadBuilderForAlternatives = function (alts, hasPredicates, tokenMatcher, dynamicTokensEnabled) { return lookahead_1.buildAlternativesLookAheadFunc(alts, hasPredicates, tokenMatcher, dynamicTokensEnabled); }; Parser.NO_RESYNC = false; // Set this flag to true if you don't want the Parser to throw error when problems in it's definition are detected. // (normally during the parser's constructor). // This is a design time flag, it will not affect the runtime error handling of the parser, just design time errors, // for example: duplicate rule names, referencing an unresolved subrule, ect... // This flag should not be enabled during normal usage, it is used in special situations, for example when // needing to display the parser definition errors in some GUI(online playground). Parser.DEFER_DEFINITION_ERRORS_HANDLING = false; return Parser; }()); exports.Parser = Parser; function InRuleRecoveryException(message) { this.name = IN_RULE_RECOVERY_EXCEPTION; this.message = message; } InRuleRecoveryException.prototype = Error.prototype; //# sourceMappingURL=parser_public.js.map /***/ }), /* 28 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var lexer_1 = __webpack_require__(63); var utils_1 = __webpack_require__(0); var tokens_1 = __webpack_require__(11); var LexerDefinitionErrorType; (function (LexerDefinitionErrorType) { LexerDefinitionErrorType[LexerDefinitionErrorType["MISSING_PATTERN"] = 0] = "MISSING_PATTERN"; LexerDefinitionErrorType[LexerDefinitionErrorType["INVALID_PATTERN"] = 1] = "INVALID_PATTERN"; LexerDefinitionErrorType[LexerDefinitionErrorType["EOI_ANCHOR_FOUND"] = 2] = "EOI_ANCHOR_FOUND"; LexerDefinitionErrorType[LexerDefinitionErrorType["UNSUPPORTED_FLAGS_FOUND"] = 3] = "UNSUPPORTED_FLAGS_FOUND"; LexerDefinitionErrorType[LexerDefinitionErrorType["DUPLICATE_PATTERNS_FOUND"] = 4] = "DUPLICATE_PATTERNS_FOUND"; LexerDefinitionErrorType[LexerDefinitionErrorType["INVALID_GROUP_TYPE_FOUND"] = 5] = "INVALID_GROUP_TYPE_FOUND"; LexerDefinitionErrorType[LexerDefinitionErrorType["PUSH_MODE_DOES_NOT_EXIST"] = 6] = "PUSH_MODE_DOES_NOT_EXIST"; LexerDefinitionErrorType[LexerDefinitionErrorType["MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE"] = 7] = "MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE"; LexerDefinitionErrorType[LexerDefinitionErrorType["MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY"] = 8] = "MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY"; LexerDefinitionErrorType[LexerDefinitionErrorType["MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST"] = 9] = "MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST"; LexerDefinitionErrorType[LexerDefinitionErrorType["LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED"] = 10] = "LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED"; LexerDefinitionErrorType[LexerDefinitionErrorType["SOI_ANCHOR_FOUND"] = 11] = "SOI_ANCHOR_FOUND"; LexerDefinitionErrorType[LexerDefinitionErrorType["EMPTY_MATCH_PATTERN"] = 12] = "EMPTY_MATCH_PATTERN"; LexerDefinitionErrorType[LexerDefinitionErrorType["NO_LINE_BREAKS_FLAGS"] = 13] = "NO_LINE_BREAKS_FLAGS"; LexerDefinitionErrorType[LexerDefinitionErrorType["UNREACHABLE_PATTERN"] = 14] = "UNREACHABLE_PATTERN"; LexerDefinitionErrorType[LexerDefinitionErrorType["IDENTIFY_TERMINATOR"] = 15] = "IDENTIFY_TERMINATOR"; LexerDefinitionErrorType[LexerDefinitionErrorType["CUSTOM_LINE_BREAK"] = 16] = "CUSTOM_LINE_BREAK"; })(LexerDefinitionErrorType = exports.LexerDefinitionErrorType || (exports.LexerDefinitionErrorType = {})); var DEFAULT_LEXER_CONFIG = { deferDefinitionErrorsHandling: false, positionTracking: "full", lineTerminatorsPattern: /\n|\r\n?/g, lineTerminatorCharacters: ["\n", "\r"], ensureOptimizations: false, safeMode: false }; Object.freeze(DEFAULT_LEXER_CONFIG); var Lexer = /** @class */ (function () { function Lexer(lexerDefinition, config) { if (config === void 0) { config = DEFAULT_LEXER_CONFIG; } var _this = this; this.lexerDefinition = lexerDefinition; this.lexerDefinitionErrors = []; this.lexerDefinitionWarning = []; this.patternIdxToConfig = {}; this.charCodeToPatternIdxToConfig = {}; this.modes = []; this.emptyGroups = {}; this.config = undefined; this.trackStartLines = true; this.trackEndLines = true; this.hasCustom = false; this.canModeBeOptimized = {}; if (typeof config === "boolean") { throw Error("The second argument to the Lexer constructor is now an ILexerConfig Object.\n" + "a boolean 2nd argument is no longer supported"); } // todo: defaults func? this.config = utils_1.merge(DEFAULT_LEXER_CONFIG, config); if (this.config.lineTerminatorsPattern === DEFAULT_LEXER_CONFIG.lineTerminatorsPattern) { // optimized built-in implementation for the defaults definition of lineTerminators this.config.lineTerminatorsPattern = lexer_1.LineTerminatorOptimizedTester; } else { if (this.config.lineTerminatorCharacters === DEFAULT_LEXER_CONFIG.lineTerminatorCharacters) { throw Error("Error: Missing property on the Lexer config.\n" + "\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS"); } } if (config.safeMode && config.ensureOptimizations) { throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.'); } this.trackStartLines = /full|onlyStart/i.test(this.config.positionTracking); this.trackEndLines = /full/i.test(this.config.positionTracking); var hasOnlySingleMode = true; var actualDefinition; // Convert SingleModeLexerDefinition into a IMultiModeLexerDefinition. if (utils_1.isArray(lexerDefinition)) { actualDefinition = { modes: {} }; actualDefinition.modes[lexer_1.DEFAULT_MODE] = utils_1.cloneArr((lexerDefinition)); actualDefinition[lexer_1.DEFAULT_MODE] = lexer_1.DEFAULT_MODE; } else { // no conversion needed, input should already be a IMultiModeLexerDefinition hasOnlySingleMode = false; actualDefinition = utils_1.cloneObj((lexerDefinition)); } this.lexerDefinitionErrors = this.lexerDefinitionErrors.concat(lexer_1.performRuntimeChecks(actualDefinition, this.trackStartLines, this.config.lineTerminatorCharacters)); this.lexerDefinitionWarning = this.lexerDefinitionWarning.concat(lexer_1.performWarningRuntimeChecks(actualDefinition, this.trackStartLines, this.config.lineTerminatorCharacters)); // for extra robustness to avoid throwing an none informative error message actualDefinition.modes = actualDefinition.modes ? actualDefinition.modes : {}; // an error of undefined TokenTypes will be detected in "performRuntimeChecks" above. // this transformation is to increase robustness in the case of partially invalid lexer definition. utils_1.forEach(actualDefinition.modes, function (currModeValue, currModeName) { actualDefinition.modes[currModeName] = utils_1.reject(currModeValue, function (currTokType) { return utils_1.isUndefined(currTokType); }); }); var allModeNames = utils_1.keys(actualDefinition.modes); utils_1.forEach(actualDefinition.modes, function (currModDef, currModName) { _this.modes.push(currModName); _this.lexerDefinitionErrors = _this.lexerDefinitionErrors.concat(lexer_1.validatePatterns(currModDef, allModeNames)); // If definition errors were encountered, the analysis phase may fail unexpectedly/ // Considering a lexer with definition errors may never be used, there is no point // to performing the analysis anyhow... if (utils_1.isEmpty(_this.lexerDefinitionErrors)) { tokens_1.augmentTokenTypes(currModDef); var currAnalyzeResult = lexer_1.analyzeTokenTypes(currModDef, { lineTerminatorCharacters: _this.config .lineTerminatorCharacters, positionTracking: config.positionTracking, ensureOptimizations: config.ensureOptimizations, safeMode: config.safeMode }); _this.patternIdxToConfig[currModName] = currAnalyzeResult.patternIdxToConfig; _this.charCodeToPatternIdxToConfig[currModName] = currAnalyzeResult.charCodeToPatternIdxToConfig; _this.emptyGroups = utils_1.merge(_this.emptyGroups, currAnalyzeResult.emptyGroups); _this.hasCustom = currAnalyzeResult.hasCustom || _this.hasCustom; _this.canModeBeOptimized[currModName] = currAnalyzeResult.canBeOptimized; } }); this.defaultMode = actualDefinition.defaultMode; if (!utils_1.isEmpty(this.lexerDefinitionErrors) && !this.config.deferDefinitionErrorsHandling) { var allErrMessages = utils_1.map(this.lexerDefinitionErrors, function (error) { return error.message; }); var allErrMessagesString = allErrMessages.join("-----------------------\n"); throw new Error("Errors detected in definition of Lexer:\n" + allErrMessagesString); } // Only print warning if there are no errors, This will avoid pl utils_1.forEach(this.lexerDefinitionWarning, function (warningDescriptor) { utils_1.PRINT_WARNING(warningDescriptor.message); }); // Choose the relevant internal implementations for this specific parser. // These implementations should be in-lined by the JavaScript engine // to provide optimal performance in each scenario. if (lexer_1.SUPPORT_STICKY) { this.chopInput = utils_1.IDENTITY; this.match = this.matchWithTest; } else { this.updateLastIndex = utils_1.NOOP; this.match = this.matchWithExec; } if (hasOnlySingleMode) { this.handleModes = utils_1.NOOP; } if (this.trackStartLines === false) { this.computeNewColumn = utils_1.IDENTITY; } if (this.trackEndLines === false) { this.updateTokenEndLineColumnLocation = utils_1.NOOP; } if (/full/i.test(this.config.positionTracking)) { this.createTokenInstance = this.createFullToken; } else if (/onlyStart/i.test(this.config.positionTracking)) { this.createTokenInstance = this.createStartOnlyToken; } else if (/onlyOffset/i.test(this.config.positionTracking)) { this.createTokenInstance = this.createOffsetOnlyToken; } else { throw Error("Invalid config option: \"" + this.config.positionTracking + "\""); } if (this.hasCustom) { this.addToken = this.addTokenUsingPush; } else { this.addToken = this.addTokenUsingMemberAccess; } var unOptimizedModes = utils_1.reduce(this.canModeBeOptimized, function (cannotBeOptimized, canBeOptimized, modeName) { if (canBeOptimized === false) { cannotBeOptimized.push(modeName); } return cannotBeOptimized; }, []); if (config.ensureOptimizations && !utils_1.isEmpty(unOptimizedModes)) { throw Error("Lexer Modes: < " + unOptimizedModes.join(", ") + " > cannot be optimized.\n" + '\t Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\n' + "\t Or inspect the console log for details on how to resolve these issues."); } } Lexer.prototype.tokenize = function (text, initialMode) { if (initialMode === void 0) { initialMode = this.defaultMode; } if (!utils_1.isEmpty(this.lexerDefinitionErrors)) { var allErrMessages = utils_1.map(this.lexerDefinitionErrors, function (error) { return error.message; }); var allErrMessagesString = allErrMessages.join("-----------------------\n"); throw new Error("Unable to Tokenize because Errors detected in definition of Lexer:\n" + allErrMessagesString); } var lexResult = this.tokenizeInternal(text, initialMode); return lexResult; }; // There is quite a bit of duplication between this and "tokenizeInternalLazy" // This is intentional due to performance considerations. Lexer.prototype.tokenizeInternal = function (text, initialMode) { var _this = this; var i, j, matchAltImage, longerAltIdx, matchedImage, imageLength, group, tokType, newToken, errLength, droppedChar, msg, match; var orgText = text; var orgLength = orgText.length; var offset = 0; var matchedTokensIndex = 0; // initializing the tokensArray to the "guessed" size. // guessing too little will still reduce the number of array re-sizes on pushes. // guessing too large (Tested by guessing x4 too large) may cost a bit more of memory // but would still have a faster runtime by avoiding (All but one) array resizing. var guessedNumberOfTokens = this.hasCustom ? 0 // will break custom token pattern APIs the matchedTokens array will contain undefined elements. : Math.floor(text.length / 10); var matchedTokens = new Array(guessedNumberOfTokens); var errors = []; var line = this.trackStartLines ? 1 : undefined; var column = this.trackStartLines ? 1 : undefined; var groups = lexer_1.cloneEmptyGroups(this.emptyGroups); var trackLines = this.trackStartLines; var lineTerminatorPattern = this.config.lineTerminatorsPattern; var currModePatternsLength = 0; var patternIdxToConfig = []; var currCharCodeToPatternIdxToConfig = []; var modeStack = []; var emptyArray = []; Object.freeze(emptyArray); var getPossiblePatterns = undefined; var pop_mode = function (popToken) { // TODO: perhaps avoid this error in the edge case there is no more input? if (modeStack.length === 1 && // if we have both a POP_MODE and a PUSH_MODE this is in-fact a "transition" // So no error should occur. popToken.tokenType.PUSH_MODE === undefined) { // if we try to pop the last mode there lexer will no longer have ANY mode. // thus the pop is ignored, an error will be created and the lexer will continue parsing in the previous mode. var msg_1 = "Unable to pop Lexer Mode after encountering Token ->" + popToken.image + "<- The Mode Stack is empty"; errors.push({ offset: popToken.startOffset, line: popToken.startLine !== undefined ? popToken.startLine : undefined, column: popToken.startColumn !== undefined ? popToken.startColumn : undefined, length: popToken.image.length, message: msg_1 }); } else { modeStack.pop(); var newMode = utils_1.last(modeStack); patternIdxToConfig = _this.patternIdxToConfig[newMode]; currCharCodeToPatternIdxToConfig = _this .charCodeToPatternIdxToConfig[newMode]; currModePatternsLength = patternIdxToConfig.length; var modeCanBeOptimized = _this.canModeBeOptimized[newMode] && _this.config.safeMode === false; if (currCharCodeToPatternIdxToConfig && modeCanBeOptimized) { getPossiblePatterns = function (charCode) { var possiblePatterns = currCharCodeToPatternIdxToConfig[charCode]; if (possiblePatterns === undefined) { return emptyArray; } else { return possiblePatterns; } }; } else { getPossiblePatterns = function () { return patternIdxToConfig; }; } } }; function push_mode(newMode) { modeStack.push(newMode); currCharCodeToPatternIdxToConfig = this .charCodeToPatternIdxToConfig[newMode]; patternIdxToConfig = this.patternIdxToConfig[newMode]; currModePatternsLength = patternIdxToConfig.length; currModePatternsLength = patternIdxToConfig.length; var modeCanBeOptimized = this.canModeBeOptimized[newMode] && this.config.safeMode === false; if (currCharCodeToPatternIdxToConfig && modeCanBeOptimized) { getPossiblePatterns = function (charCode) { var possiblePatterns = currCharCodeToPatternIdxToConfig[charCode]; if (possiblePatterns === undefined) { return emptyArray; } else { return possiblePatterns; } }; } else { getPossiblePatterns = function () { return patternIdxToConfig; }; } } // this pattern seems to avoid a V8 de-optimization, although that de-optimization does not // seem to matter performance wise. push_mode.call(this, initialMode); var currConfig; while (offset < orgLength) { matchedImage = null; var nextCharCode = orgText.charCodeAt(offset); var chosenPatternIdxToConfig = getPossiblePatterns(nextCharCode); var chosenPatternsLength = chosenPatternIdxToConfig.length; for (i = 0; i < chosenPatternsLength; i++) { currConfig = chosenPatternIdxToConfig[i]; var currPattern = currConfig.pattern; // manually in-lined because > 600 chars won't be in-lined in V8 var singleCharCode = currConfig.short; if (singleCharCode !== false) { if (nextCharCode === singleCharCode) { // single character string matchedImage = currPattern; } } else if (currConfig.isCustom === true) { match = currPattern.exec(orgText, offset, matchedTokens, groups); matchedImage = match !== null ? match[0] : match; } else { this.updateLastIndex(currPattern, offset); matchedImage = this.match(currPattern, text, offset); } if (matchedImage !== null) { // even though this pattern matched we must try a another longer alternative. // this can be used to prioritize keywords over identifiers longerAltIdx = currConfig.longerAlt; if (longerAltIdx !== undefined) { // TODO: micro optimize, avoid extra prop access // by saving/linking longerAlt on the original config? var longerAltConfig = patternIdxToConfig[longerAltIdx]; var longerAltPattern = longerAltConfig.pattern; // single Char can never be a longer alt so no need to test it. // manually in-lined because > 600 chars won't be in-lined in V8 if (longerAltConfig.isCustom === true) { match = longerAltPattern.exec(orgText, offset, matchedTokens, groups); matchAltImage = match !== null ? match[0] : match; } else { this.updateLastIndex(longerAltPattern, offset); matchAltImage = this.match(longerAltPattern, text, offset); } if (matchAltImage && matchAltImage.length > matchedImage.length) { matchedImage = matchAltImage; currConfig = longerAltConfig; } } break; } } // successful match if (matchedImage !== null) { // matchedImage = match[0] imageLength = matchedImage.length; group = currConfig.group; if (group !== undefined) { tokType = currConfig.tokenTypeIdx; // TODO: "offset + imageLength" and the new column may be computed twice in case of "full" location information inside // createFullToken method newToken = this.createTokenInstance(matchedImage, offset, tokType, currConfig.tokenType, line, column, imageLength); if (group === false) { matchedTokensIndex = this.addToken(matchedTokens, matchedTokensIndex, newToken); } else { groups[group].push(newToken); } } text = this.chopInput(text, imageLength); offset = offset + imageLength; // TODO: with newlines the column may be assigned twice column = this.computeNewColumn(column, imageLength); if (trackLines === true && currConfig.canLineTerminator === true) { var numOfLTsInMatch = 0; var foundTerminator = void 0; var lastLTEndOffset = void 0; lineTerminatorPattern.lastIndex = 0; do { foundTerminator = lineTerminatorPattern.test(matchedImage); if (foundTerminator === true) { lastLTEndOffset = lineTerminatorPattern.lastIndex - 1; numOfLTsInMatch++; } } while (foundTerminator); if (numOfLTsInMatch !== 0) { line = line + numOfLTsInMatch; column = imageLength - lastLTEndOffset; this.updateTokenEndLineColumnLocation(newToken, group, lastLTEndOffset, numOfLTsInMatch, line, column, imageLength); } } // will be NOOP if no modes present this.handleModes(currConfig, pop_mode, push_mode, newToken); } else { // error recovery, drop characters until we identify a valid token's start point var errorStartOffset = offset; var errorLine = line; var errorColumn = column; var foundResyncPoint = false; while (!foundResyncPoint && offset < orgLength) { // drop chars until we succeed in matching something droppedChar = orgText.charCodeAt(offset); // Identity Func (when sticky flag is enabled) text = this.chopInput(text, 1); offset++; for (j = 0; j < currModePatternsLength; j++) { var currConfig_1 = patternIdxToConfig[j]; var currPattern = currConfig_1.pattern; // manually in-lined because > 600 chars won't be in-lined in V8 var singleCharCode = currConfig_1.short; if (singleCharCode !== false) { if (orgText.charCodeAt(offset) === singleCharCode) { // single character string foundResyncPoint = true; } } else if (currConfig_1.isCustom === true) { foundResyncPoint = currPattern.exec(orgText, offset, matchedTokens, groups) !== null; } else { this.updateLastIndex(currPattern, offset); foundResyncPoint = currPattern.exec(text) !== null; } if (foundResyncPoint === true) { break; } } } errLength = offset - errorStartOffset; // at this point we either re-synced or reached the end of the input text msg = "unexpected character: ->" + orgText.charAt(errorStartOffset) + "<- at offset: " + errorStartOffset + "," + (" skipped " + (offset - errorStartOffset) + " characters."); errors.push({ offset: errorStartOffset, line: errorLine, column: errorColumn, length: errLength, message: msg }); } } // if we do have custom patterns which push directly into the if (!this.hasCustom) { // if we guessed a too large size for the tokens array this will shrink it to the right size. matchedTokens.length = matchedTokensIndex; } return { tokens: matchedTokens, groups: groups, errors: errors }; }; Lexer.prototype.handleModes = function (config, pop_mode, push_mode, newToken) { if (config.pop === true) { // need to save the PUSH_MODE property as if the mode is popped // patternIdxToPopMode is updated to reflect the new mode after popping the stack var pushMode = config.push; pop_mode(newToken); if (pushMode !== undefined) { push_mode.call(this, pushMode); } } else if (config.push !== undefined) { push_mode.call(this, config.push); } }; Lexer.prototype.chopInput = function (text, length) { return text.substring(length); }; Lexer.prototype.updateLastIndex = function (regExp, newLastIndex) { regExp.lastIndex = newLastIndex; }; // TODO: decrease this under 600 characters? inspect stripping comments option in TSC compiler Lexer.prototype.updateTokenEndLineColumnLocation = function (newToken, group, lastLTIdx, numOfLTsInMatch, line, column, imageLength) { var lastCharIsLT, fixForEndingInLT; if (group !== undefined) { // a none skipped multi line Token, need to update endLine/endColumn lastCharIsLT = lastLTIdx === imageLength - 1; fixForEndingInLT = lastCharIsLT ? -1 : 0; if (!(numOfLTsInMatch === 1 && lastCharIsLT === true)) { // if a token ends in a LT that last LT only affects the line numbering of following Tokens newToken.endLine = line + fixForEndingInLT; // the last LT in a token does not affect the endColumn either as the [columnStart ... columnEnd) // inclusive to exclusive range. newToken.endColumn = column - 1 + -fixForEndingInLT; } // else single LT in the last character of a token, no need to modify the endLine/EndColumn } }; Lexer.prototype.computeNewColumn = function (oldColumn, imageLength) { return oldColumn + imageLength; }; // Place holder, will be replaced by the correct variant according to the locationTracking option at runtime. /* istanbul ignore next - place holder */ Lexer.prototype.createTokenInstance = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return null; }; Lexer.prototype.createOffsetOnlyToken = function (image, startOffset, tokenTypeIdx, tokenType) { return { image: image, startOffset: startOffset, tokenTypeIdx: tokenTypeIdx, tokenType: tokenType }; }; Lexer.prototype.createStartOnlyToken = function (image, startOffset, tokenTypeIdx, tokenType, startLine, startColumn) { return { image: image, startOffset: startOffset, startLine: startLine, startColumn: startColumn, tokenTypeIdx: tokenTypeIdx, tokenType: tokenType }; }; Lexer.prototype.createFullToken = function (image, startOffset, tokenTypeIdx, tokenType, startLine, startColumn, imageLength) { return { image: image, startOffset: startOffset, endOffset: startOffset + imageLength - 1, startLine: startLine, endLine: startLine, startColumn: startColumn, endColumn: startColumn + imageLength - 1, tokenTypeIdx: tokenTypeIdx, tokenType: tokenType }; }; // Place holder, will be replaced by the correct variant according to the locationTracking option at runtime. /* istanbul ignore next - place holder */ Lexer.prototype.addToken = function (tokenVector, index, tokenToAdd) { return 666; }; Lexer.prototype.addTokenUsingPush = function (tokenVector, index, tokenToAdd) { tokenVector.push(tokenToAdd); return index; }; Lexer.prototype.addTokenUsingMemberAccess = function (tokenVector, index, tokenToAdd) { tokenVector[index] = tokenToAdd; index++; return index; }; /* istanbul ignore next - place holder to be replaced with chosen alternative at runtime */ Lexer.prototype.match = function (pattern, text, offset) { return null; }; Lexer.prototype.matchWithTest = function (pattern, text, offset) { var found = pattern.test(text); if (found === true) { return text.substring(offset, pattern.lastIndex); } return null; }; Lexer.prototype.matchWithExec = function (pattern, text) { var regExpArray = pattern.exec(text); return regExpArray !== null ? regExpArray[0] : regExpArray; }; Lexer.SKIPPED = "This marks a skipped Token pattern, this means each token identified by it will" + "be consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace."; Lexer.NA = /NOT_APPLICABLE/; return Lexer; }()); exports.Lexer = Lexer; //# sourceMappingURL=lexer_public.js.map /***/ }), /* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // needs a separate module as this is required inside chevrotain productive code // and also in the entry point for webpack(api.ts). // A separate file avoids cyclic dependencies and webpack errors. exports.VERSION = "3.7.0"; //# sourceMappingURL=version.js.map /***/ }), /* 30 */ /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(43).goog; /***/ }), /* 31 */ /***/ (function(module, exports, __webpack_require__) { // Generated by CoffeeScript 1.12.7 (function() { var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLText, XMLWriterBase, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; XMLDeclaration = __webpack_require__(18); XMLDocType = __webpack_require__(19); XMLCData = __webpack_require__(12); XMLComment = __webpack_require__(13); XMLElement = __webpack_require__(20); XMLRaw = __webpack_require__(22); XMLText = __webpack_require__(23); XMLProcessingInstruction = __webpack_require__(21); XMLDTDAttList = __webpack_require__(14); XMLDTDElement = __webpack_require__(15); XMLDTDEntity = __webpack_require__(16); XMLDTDNotation = __webpack_require__(17); XMLWriterBase = __webpack_require__(46); module.exports = XMLStringWriter = (function(superClass) { extend(XMLStringWriter, superClass); function XMLStringWriter(options) { XMLStringWriter.__super__.constructor.call(this, options); } XMLStringWriter.prototype.document = function(doc) { var child, i, len, r, ref; this.textispresent = false; r = ''; ref = doc.children; for (i = 0, len = ref.length; i < len; i++) { child = ref[i]; r += (function() { switch (false) { case !(child instanceof XMLDeclaration): return this.declaration(child); case !(child instanceof XMLDocType): return this.docType(child); case !(child instanceof XMLComment): return this.comment(child); case !(child instanceof XMLProcessingInstruction): return this.processingInstruction(child); default: return this.element(child, 0); } }).call(this); } if (this.pretty && r.slice(-this.newline.length) === this.newline) { r = r.slice(0, -this.newline.length); } return r; }; XMLStringWriter.prototype.attribute = function(att) { return ' ' + att.name + '="' + att.value + '"'; }; XMLStringWriter.prototype.cdata = function(node, level) { return this.space(level) + '' + this.newline; }; XMLStringWriter.prototype.comment = function(node, level) { return this.space(level) + '' + this.newline; }; XMLStringWriter.prototype.declaration = function(node, level) { var r; r = this.space(level); r += ''; r += this.newline; return r; }; XMLStringWriter.prototype.docType = function(node, level) { var child, i, len, r, ref; level || (level = 0); r = this.space(level); r += ' 0) { r += ' ['; r += this.newline; ref = node.children; for (i = 0, len = ref.length; i < len; i++) { child = ref[i]; r += (function() { switch (false) { case !(child instanceof XMLDTDAttList): return this.dtdAttList(child, level + 1); case !(child instanceof XMLDTDElement): return this.dtdElement(child, level + 1); case !(child instanceof XMLDTDEntity): return this.dtdEntity(child, level + 1); case !(child instanceof XMLDTDNotation): return this.dtdNotation(child, level + 1); case !(child instanceof XMLCData): return this.cdata(child, level + 1); case !(child instanceof XMLComment): return this.comment(child, level + 1); case !(child instanceof XMLProcessingInstruction): return this.processingInstruction(child, level + 1); default: throw new Error("Unknown DTD node type: " + child.constructor.name); } }).call(this); } r += ']'; } r += this.spacebeforeslash + '>'; r += this.newline; return r; }; XMLStringWriter.prototype.element = function(node, level) { var att, child, i, j, len, len1, name, r, ref, ref1, ref2, space, textispresentwasset; level || (level = 0); textispresentwasset = false; if (this.textispresent) { this.newline = ''; this.pretty = false; } else { this.newline = this.newlinedefault; this.pretty = this.prettydefault; } space = this.space(level); r = ''; r += space + '<' + node.name; ref = node.attributes; for (name in ref) { if (!hasProp.call(ref, name)) continue; att = ref[name]; r += this.attribute(att); } if (node.children.length === 0 || node.children.every(function(e) { return e.value === ''; })) { if (this.allowEmpty) { r += '>' + this.newline; } else { r += this.spacebeforeslash + '/>' + this.newline; } } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) { r += '>'; r += node.children[0].value; r += '' + this.newline; } else { if (this.dontprettytextnodes) { ref1 = node.children; for (i = 0, len = ref1.length; i < len; i++) { child = ref1[i]; if (child.value != null) { this.textispresent++; textispresentwasset = true; break; } } } if (this.textispresent) { this.newline = ''; this.pretty = false; space = this.space(level); } r += '>' + this.newline; ref2 = node.children; for (j = 0, len1 = ref2.length; j < len1; j++) { child = ref2[j]; r += (function() { switch (false) { case !(child instanceof XMLCData): return this.cdata(child, level + 1); case !(child instanceof XMLComment): return this.comment(child, level + 1); case !(child instanceof XMLElement): return this.element(child, level + 1); case !(child instanceof XMLRaw): return this.raw(child, level + 1); case !(child instanceof XMLText): return this.text(child, level + 1); case !(child instanceof XMLProcessingInstruction): return this.processingInstruction(child, level + 1); default: throw new Error("Unknown XML node type: " + child.constructor.name); } }).call(this); } if (textispresentwasset) { this.textispresent--; } if (!this.textispresent) { this.newline = this.newlinedefault; this.pretty = this.prettydefault; } r += space + '' + this.newline; } return r; }; XMLStringWriter.prototype.processingInstruction = function(node, level) { var r; r = this.space(level) + '' + this.newline; return r; }; XMLStringWriter.prototype.raw = function(node, level) { return this.space(level) + node.value + this.newline; }; XMLStringWriter.prototype.text = function(node, level) { return this.space(level) + node.value + this.newline; }; XMLStringWriter.prototype.dtdAttList = function(node, level) { var r; r = this.space(level) + '' + this.newline; return r; }; XMLStringWriter.prototype.dtdElement = function(node, level) { return this.space(level) + '' + this.newline; }; XMLStringWriter.prototype.dtdEntity = function(node, level) { var r; r = this.space(level) + '' + this.newline; return r; }; XMLStringWriter.prototype.dtdNotation = function(node, level) { var r; r = this.space(level) + '' + this.newline; return r; }; XMLStringWriter.prototype.openNode = function(node, level) { var att, name, r, ref; level || (level = 0); if (node instanceof XMLElement) { r = this.space(level) + '<' + node.name; ref = node.attributes; for (name in ref) { if (!hasProp.call(ref, name)) continue; att = ref[name]; r += this.attribute(att); } r += (node.children ? '>' : '/>') + this.newline; return r; } else { r = this.space(level) + '') + this.newline; return r; } }; XMLStringWriter.prototype.closeNode = function(node, level) { level || (level = 0); switch (false) { case !(node instanceof XMLElement): return this.space(level) + '' + this.newline; case !(node instanceof XMLDocType): return this.space(level) + ']>' + this.newline; } }; return XMLStringWriter; })(XMLWriterBase); }).call(this); /***/ }), /* 32 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_chevrotain__ = __webpack_require__(7); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_chevrotain___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_chevrotain__); /** * LNLexer + tokens. * * @file This files defines the lexer and tokens for scratch-LN. * @author Ellen Vanhove. */ //DO NOT FORGET TO ADD THE EXPORT WHEN COPY PASTING //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ const Label = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "Label", pattern: //necessary to escape: [] {} () " ; \n # | @ \n and whitespace //this cannot contain :: and should not partially match :: //--> :(?!:) : not followed by another : // --> x(?!y) = negative lookahead (matches 'x' when it's not followed by 'y') //atleast one character // - a : followed by a not : = (:(?!:)) // - normal - not necessary to escape or whitespace - characters = [^\{\|\(\)\}\<\>\[\];\\"\n#@: \t] // - \ followed by any character or a newline = [^] not //no whitespace in the beginning or end -> will be skipped (OR allow whitespace with keywords?) //char (whitespace* char)* /((:(?!:))|(\/(?![\/*]))|[^\{\|\(\)\}\<\>\[\];\\"#@: \t\n\/]|\\[^])([ \t]*((:(?!:))|(\/(?![\/*]))|[^\{\|\(\)\}\<\>\[\];\\"\n#@: \t\/]|\\[^]))*/, line_breaks: true }); /* harmony export (immutable) */ __webpack_exports__["Label"] = Label; const ScratchLNComment = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "ScratchLNComment", pattern: __WEBPACK_IMPORTED_MODULE_0_chevrotain__["Lexer"].NA, }) /* harmony export (immutable) */ __webpack_exports__["ScratchLNComment"] = ScratchLNComment; const LineComment = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "LineComment", pattern: /(;[ \t]*\n?|\n)?[ \t]*\/\/[^\n;]*/, group: __WEBPACK_IMPORTED_MODULE_0_chevrotain__["Lexer"].SKIPPED, categories: [ScratchLNComment], }); /* harmony export (immutable) */ __webpack_exports__["LineComment"] = LineComment; const BlockComment = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "BlockComment", //between /**/ //allowed to use * and / within text but not after each other //most chars = [^\*] //* followed by / = /\*(?!\/)) pattern: /(;[ \t]*\n?|\n)?[ \t]*\/\*([^\*]|\*(?!\/))*\*\//, group: __WEBPACK_IMPORTED_MODULE_0_chevrotain__["Lexer"].SKIPPED, categories: [ScratchLNComment], line_breaks: true }); /* harmony export (immutable) */ __webpack_exports__["BlockComment"] = BlockComment; const LCurlyBracket = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "LCurlyBracket", pattern: /{/ }); /* harmony export (immutable) */ __webpack_exports__["LCurlyBracket"] = LCurlyBracket; const RCurlyBracket = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "RCurlyBracket", pattern: /}/ }); /* harmony export (immutable) */ __webpack_exports__["RCurlyBracket"] = RCurlyBracket; const LRoundBracket = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "LRoundBracket", pattern: /\(/ }); /* harmony export (immutable) */ __webpack_exports__["LRoundBracket"] = LRoundBracket; const RRoundBracket = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "RRoundBracket", pattern: /\)/ }); /* harmony export (immutable) */ __webpack_exports__["RRoundBracket"] = RRoundBracket; const LAngleBracket = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "LAngleBracket", pattern: // }); /* harmony export (immutable) */ __webpack_exports__["RAngleBracket"] = RAngleBracket; const Literal = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "Literal", pattern: __WEBPACK_IMPORTED_MODULE_0_chevrotain__["Lexer"].NA }); /* harmony export (immutable) */ __webpack_exports__["Literal"] = Literal; const StringLiteral = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "StringLiteral", //"char*" -> "char+" or "" //most characters = [^"] //escaped the " char = \\" //cannot end with \ so must end with = [^\\"] or \\" //empty is allowed "" pattern: /"([^"\\]|\\.)*"/, categories: [Literal], line_breaks: true }); /* harmony export (immutable) */ __webpack_exports__["StringLiteral"] = StringLiteral; const NumberLiteral = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "NumberLiteral", //pattern: /-?(\d+)(\.\d+)?/, todo test of dit werkt met een * pattern: /-?(\d+)(\.\d+)?/, categories: [Literal,Label], longer_alt: Label, }); /* harmony export (immutable) */ __webpack_exports__["NumberLiteral"] = NumberLiteral; const ColorLiteral = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "ColorLiteral", //first the 6 , otherwise only 3 will be matched pattern: /#([0-9a-f]{6}|[0-9a-f]{3})/i, categories: [Literal] }); /* harmony export (immutable) */ __webpack_exports__["ColorLiteral"] = ColorLiteral; const ChoiceLiteral = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "ChoiceLiteral", //idem stringLiteral pattern: /\[([^\]\\]|\\.)*\]/, categories: [Literal], line_breaks: true }); /* harmony export (immutable) */ __webpack_exports__["ChoiceLiteral"] = ChoiceLiteral; const Keyword = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "Keyword", pattern: __WEBPACK_IMPORTED_MODULE_0_chevrotain__["Lexer"].NA, //longer_alt: Label //I would expect that this is valid for all keywords but apparently not }); /* harmony export (immutable) */ __webpack_exports__["Keyword"] = Keyword; const If = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "If", pattern: /if/i, categories: [Keyword], longer_alt: Label }); /* harmony export (immutable) */ __webpack_exports__["If"] = If; const Then = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "Then", pattern: /then/i, categories: [Keyword], longer_alt: Label }); /* harmony export (immutable) */ __webpack_exports__["Then"] = Then; const Else = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "Else", pattern: /else/i, categories: [Keyword], longer_alt: Label }); /* harmony export (immutable) */ __webpack_exports__["Else"] = Else; const Forever = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "Forever", pattern: /forever/i, categories: [Keyword], longer_alt: Label }); /* harmony export (immutable) */ __webpack_exports__["Forever"] = Forever; const RepeatUntil = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "RepeatUntil", pattern: /repeat[ \t]*until/i, categories: [Keyword], longer_alt: Label }); /* harmony export (immutable) */ __webpack_exports__["RepeatUntil"] = RepeatUntil; const Repeat = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "Repeat", pattern: /repeat/i, categories: [Keyword], longer_alt: Label }); /* harmony export (immutable) */ __webpack_exports__["Repeat"] = Repeat; const End = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "End", pattern: /end/i, categories: [Keyword], longer_alt: Label }); /* harmony export (immutable) */ __webpack_exports__["End"] = End; const Modifier = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "Modifier", pattern: /::((:(?!:))|[^\{\|\(\)<>\\#@: \t\n]|\\[^])([ \t]*((:(?!:))|[^\|\(\)<>\\#@: \t\n]|\\[^]))*/ }); /* harmony export (immutable) */ __webpack_exports__["Modifier"] = Modifier; const Comment = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "Comment", //similar to stringliteral but between || pattern: /\|([^\|\\]|\\.)*\|/ }); /* harmony export (immutable) */ __webpack_exports__["Comment"] = Comment; const ID = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "ID", pattern: /@[a-z0-9_]+/i }); /* harmony export (immutable) */ __webpack_exports__["ID"] = ID; const MultipleDelimiters = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "MultipleDelimiters", //; \n should always bee seen as a whole //so a ; alone must explicitly not been followed by a \n pattern: /((;[ \t]*\n|;[ \t]*(?!\n)|\n)[ \t]*){2,}/, line_breaks: true }); /* harmony export (immutable) */ __webpack_exports__["MultipleDelimiters"] = MultipleDelimiters; const Delimiter = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "Delimiter", pattern: /;[ \t]*\n?|\n/, line_breaks: true, //longer_alt: MultipleDelimiters }); /* harmony export (immutable) */ __webpack_exports__["Delimiter"] = Delimiter; // marking WhiteSpace as 'SKIPPED' makes the lexer skip it. const WhiteSpace = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["createToken"])({ name: "WhiteSpace", pattern: /[ \t]+/, group: __WEBPACK_IMPORTED_MODULE_0_chevrotain__["Lexer"].SKIPPED, line_breaks: false }); /* harmony export (immutable) */ __webpack_exports__["WhiteSpace"] = WhiteSpace; //order matters! const allTokens = [ WhiteSpace, LineComment, BlockComment, Comment, //match before anything else Literal, StringLiteral, NumberLiteral, ColorLiteral, ChoiceLiteral, //WARNING: RepeatUntil must be defined before Repeat Forever, End, RepeatUntil, Repeat, If, Else, Then, //WARNING: StackDelimiter must be defined before Delimiter MultipleDelimiters, Delimiter, LCurlyBracket, RCurlyBracket, LRoundBracket, RRoundBracket, RAngleBracket, LAngleBracket, Modifier, ID, //WARNING: Label must be defined after anything else Label ]; /* harmony export (immutable) */ __webpack_exports__["allTokens"] = allTokens; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ const LNLexer = new __WEBPACK_IMPORTED_MODULE_0_chevrotain__["Lexer"](allTokens); /* harmony export (immutable) */ __webpack_exports__["LNLexer"] = LNLexer; /***/ }), /* 33 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = parse; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_chevrotain__ = __webpack_require__(7); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_chevrotain___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_chevrotain__); /** * Parser * * Define parser rules * * @file This files defines the LNParser class and parse function. * @author Ellen Vanhove. */ // Using ES6 style imports, this means Webpack 2 can perform tree shaking const lntokens = __webpack_require__(32); let LNLexer = lntokens.LNLexer; let allTokens = lntokens.allTokens; let Label = lntokens.Label; let Delimiter = lntokens.Delimiter; let MultipleDelimiters = lntokens.MultipleDelimiters; let Literal = lntokens.Literal; let StringLiteral = lntokens.StringLiteral; let ColorLiteral = lntokens.ColorLiteral; let NumberLiteral = lntokens.NumberLiteral; let ChoiceLiteral = lntokens.ChoiceLiteral; let Forever = lntokens.Forever; let End = lntokens.End; let RepeatUntil = lntokens.RepeatUntil; let Repeat = lntokens.Repeat; let If = lntokens.If; let Else = lntokens.Else; let Then = lntokens.Then; let LCurlyBracket = lntokens.LCurlyBracket; let RCurlyBracket = lntokens.RCurlyBracket; let LRoundBracket = lntokens.LRoundBracket; let RRoundBracket = lntokens.RRoundBracket; let RAngleBracket = lntokens.RAngleBracket; let LAngleBracket = lntokens.LAngleBracket; let Modifier = lntokens.Modifier; let ID = lntokens.ID; let Comment = lntokens.Comment; //REMINDER: remove chevroitain.emptyalt //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ // ----------------- parser ----------------- // Note that this is a Pure grammar, it only describes the grammar // Not any actions (semantics) to perform during parsing. function LNParser(input) { __WEBPACK_IMPORTED_MODULE_0_chevrotain__["Parser"].call(this, input, allTokens, { outputCst: true }); const $ = this; $.RULE("code", () => { $.SUBRULE($.delimiters); $.OPTION(() => { $.SUBRULE($.comments); }) $.OPTION2(() => { $.SUBRULE($.stack); $.MANY({ DEF: () => { $.SUBRULE($.stackDelimiter); $.OPTION3(() => { $.SUBRULE2($.stack); }) } }); }) //$.CONSUME(chevrotain.EOF); }); $.RULE("delimiters", () => { $.MANY({ DEF: () => { $.OR([{ ALT: () => { $.CONSUME(Delimiter, { LABEL: "leadingCodeDelimiters" }); } }, { ALT: () => { $.CONSUME(MultipleDelimiters, { LABEL: "leadingCodeDelimiters" }); }, } /*{ ALT: chevrotain.EMPTY_ALT() }*/]) } }) }) $.RULE("stackDelimiter", () => { $.AT_LEAST_ONE({ DEF: () => { $.OR([{ ALT: () => { $.CONSUME(MultipleDelimiters, { LABEL: "intermediateCodeDelimiters" }); $.OPTION(() => { $.CONSUME(Delimiter, { LABEL: "intermediateCodeDelimiter" }); }) } }, { ALT: () => { $.SUBRULE($.comments); } }]); } }); }); $.RULE("comments", () => { $.AT_LEAST_ONE(() => { $.SUBRULE($.comment); $.SUBRULE($.delimiters, { LABEL: "trailingCommentsDelimiters" }); }); }); $.RULE("stack", () => { $.SUBRULE($.block); $.MANY(() => { $.CONSUME(Delimiter, { LABEL: "intermediateStackDelimiter" }); $.SUBRULE2($.block); }); $.OPTION(() => { $.CONSUME2(Delimiter, { LABEL: "trailingStackDelimiter" }); }) }); $.RULE("block", () => { $.OR([{ ALT: () => { $.SUBRULE($.atomic); } }, { ALT: () => { $.SUBRULE($.composite); } }]); }); $.RULE("atomic", () => { $.AT_LEAST_ONE(() => { $.OR([{ ALT: () => { $.CONSUME(Label); } }, { ALT: () => { $.SUBRULE($.argument); } }]); }); $.SUBRULE($.annotations); }); $.RULE("composite", () => { $.OR([{ ALT: () => { $.SUBRULE($.ifelse); } }, { ALT: () => { $.SUBRULE($.forever); } }, { ALT: () => { $.SUBRULE($.repeat); } }, { ALT: () => { $.SUBRULE($.repeatuntil); } }]); }); $.RULE("ifelse", () => { $.CONSUME(If); $.SUBRULE($.condition); $.OPTION(() => { $.CONSUME(Then); }); $.SUBRULE($.annotations); $.SUBRULE($.clause, { LABEL: "ifClause" }); $.OPTION3(() => { $.OPTION4(() => { $.CONSUME(Delimiter, { LABEL: "trailingIfClauseDelimiter" }); }); $.CONSUME(Else); $.SUBRULE3($.clause, { LABEL: "elseClause" }); }); $.OPTION5(() => { $.CONSUME(End); }) }); $.RULE("forever", () => { $.CONSUME(Forever); $.SUBRULE($.annotations); $.SUBRULE($.clause); $.OPTION(() => { $.CONSUME(End); }) }); $.RULE("repeat", () => { $.CONSUME(Repeat); $.SUBRULE($.argument); $.SUBRULE($.annotations); $.SUBRULE($.clause); $.OPTION(() => { $.CONSUME(End); }) }); $.RULE("repeatuntil", () => { $.CONSUME(RepeatUntil); $.SUBRULE($.condition); $.SUBRULE($.annotations); $.SUBRULE($.clause); $.OPTION(() => { $.CONSUME(End); }) }); $.RULE("clause", () => { $.OPTION(() => { $.CONSUME(Delimiter, { LABEL: "leadingClauseDelimiter" }); }); $.OPTION2(() => { $.SUBRULE($.stack); }); }); $.RULE("annotations", () => { $.SUBRULE($.modifiers); $.SUBRULE($.id); $.OPTION(() => { $.SUBRULE($.comment); }); }); $.RULE("modifiers", () => { $.MANY(() => { $.CONSUME(Modifier); }) }); $.RULE("id", () => { $.OPTION(() => { $.CONSUME(ID); }); }); $.RULE("comment", () => { $.CONSUME(Comment); $.SUBRULE($.modifiers); $.SUBRULE($.id); }); $.RULE("argument", () => { $.OR([{ ALT: () => { $.CONSUME(LCurlyBracket); $.OR2([{ ALT: () => { $.CONSUME(Literal); } }, { ALT: () => { $.CONSUME(Label); } }, { ALT: () => { $.SUBRULE($.expression); } }, { ALT: () => { $.SUBRULE($.predicate); } }, { NAME: "$empty", ALT: __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["EMPTY_ALT"])() }, ]); $.SUBRULE($.id); $.CONSUME(RCurlyBracket); } }, { ALT: () => { $.OR3([{ ALT: () => { $.CONSUME(StringLiteral, { LABEL: "Literal" }); } }, { ALT: () => { $.CONSUME(ColorLiteral, { LABEL: "Literal" }); } }, { ALT: () => { $.CONSUME(ChoiceLiteral, { LABEL: "Literal" }); } }, { ALT: () => { $.SUBRULE2($.expression); } }, { ALT: () => { $.SUBRULE2($.predicate); } }]); } }]) }); $.RULE("condition", () => { $.OR([{ ALT: () => { $.CONSUME(LCurlyBracket); $.OR2([{ ALT: () => { $.SUBRULE($.predicate); } }, { NAME: "$empty", ALT: __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["EMPTY_ALT"])() }, ]); $.OPTION2(() => { $.CONSUME(ID); }); $.CONSUME(RCurlyBracket); } }, { ALT: () => { $.SUBRULE2($.predicate); } }]) }); $.RULE("expression", () => { $.CONSUME(LRoundBracket); $.OPTION(() => { $.SUBRULE($.atomic); }); $.CONSUME(RRoundBracket); }); $.RULE("predicate", () => { $.CONSUME(LAngleBracket); $.OPTION(() => { $.SUBRULE($.atomic); }); $.CONSUME(RAngleBracket); }); // very important to call this after all the rules have been defined. // otherwise the parser may not work correctly as it will lack information // derived during the self analysis phase. __WEBPACK_IMPORTED_MODULE_0_chevrotain__["Parser"].performSelfAnalysis(this); } //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ LNParser.prototype = Object.create(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["Parser"].prototype); LNParser.prototype.constructor = LNParser; // wrapping it all together // reuse the same parser instance. const lnparser = new LNParser([]); /* harmony export (immutable) */ __webpack_exports__["b"] = lnparser; function parse(text) { //console.log('seperate file, function'); const lexResult = LNLexer.tokenize(text); // setting a new input will RESET the parser instance's state. //console.log(lexResult.tokens); lnparser.input = lexResult.tokens; // any top level rule may be used as an entry point const value = lnparser.code(); //TOP RULE return { value: value, lexErrors: lexResult.errors, parseErrors: lnparser.errors } } /***/ }), /* 34 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_chevrotain__ = __webpack_require__(7); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_chevrotain___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_chevrotain__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__LNParser__ = __webpack_require__(33); /** * Template for the visitor. * * .Provides information about parts of the three in the format * * { * placeHolder: %b (boolean)| %s (string) , * offset: number, * text: "a string", * type: "tokename" or "expression" or "predicate" * modifiers: list of tokens * } * the options are only avaible if they make sense. * * @file This files defines the LNVisitor class. * @author Ellen Vanhove. */ //import {NumberLiteral, ColorLiteral} from "./LNLexer"; const lntokens = __webpack_require__(32); let NumberLiteral = lntokens.NumberLiteral; let ColorLiteral = lntokens.ColorLiteral; let StringLiteral = lntokens.StringLiteral; let ChoiceLiteral = lntokens.ChoiceLiteral; const PLACEHOLDER = "placeholder"; /* unused harmony export PLACEHOLDER */ const OFFSET = "offset"; /* unused harmony export OFFSET */ //todo make this an enum or something const TYPE = "type"; /* unused harmony export TYPE */ const EXPRESSION = "expression"; /* harmony export (immutable) */ __webpack_exports__["a"] = EXPRESSION; const PREDICATE = "predicate"; /* harmony export (immutable) */ __webpack_exports__["b"] = PREDICATE; const ATOMIC = "atomic"; /* unused harmony export ATOMIC */ const EMPTY = "empty"; /* unused harmony export EMPTY */ const CHOICE = "choice"; /* harmony export (immutable) */ __webpack_exports__["c"] = CHOICE; const TEXT = "text"; /* unused harmony export TEXT */ const TEXT_OR_NUMBER = "text or number"; /* unused harmony export TEXT_OR_NUMBER */ const COLOR = "color"; /* unused harmony export COLOR */ const COMMENT = "comment"; /* unused harmony export COMMENT */ const ID = "id"; /* unused harmony export ID */ const CBLOCK = "cblock"; /* unused harmony export CBLOCK */ const BaseCstVisitor = __WEBPACK_IMPORTED_MODULE_1__LNParser__["b" /* lnparser */].getBaseCstVisitorConstructor(); class InfoLNVisitor extends BaseCstVisitor { constructor() { super(); // This helper will detect any missing or redundant methods on this visitor this.validateVisitor() } code(ctx) { } delimiters(ctx) { } stackDelimiter(ctx) { } comments(ctx) { } stack(ctx) { } block(ctx) { } atomic(ctx) { //calculate the offset let offset = 0; if (ctx.Label) { //if there is a label and a argument check which one occurs first if (ctx.argument) { offset = this.getOffsetArgument(ctx.argument[0]) < ctx.Label[0].startOffset ? this.getOffsetArgument(ctx.argument[0]) : ctx.Label[0].startOffset } else { offset = ctx.Label[0].startOffset } } else { //only a argument offset = this.getOffsetArgument(ctx.argument[0]) } return { TEXT: this.unescapeLabel(this.getTextAtomic(ctx)), OFFSET: offset, TYPE: ATOMIC, ID: this.visit(ctx.annotations).ID } } unescapeLabel(text){ //replace a \ followed by a not nothing character by only the character return text.replace(/\\([^])/g, '$1'); } /** * marges the labels into one string * @param ctx * @returns {string} */ getTextAtomic(ctx) { let matchString = ''; let a = 0; for (let i = 0; ctx.Label && i < ctx.Label.length; i++) { if (ctx.argument && a < ctx.argument.length) { while (a < ctx.argument.length && this.getOffsetArgument(ctx.argument[a]) < ctx.Label[i].startOffset) { matchString += ' %' + (a + 1) + ' '; ++a; } } matchString += ' ' + ctx.Label[i].image + ' '; } for (a; ctx.argument && a < ctx.argument.length; a++) { matchString += ' %' + (a + 1) + ' '; } return this.cleanupText(matchString) } getOffsetArgument(arg) { if (!arg) { return Number.MAX_SAFE_INTEGER; //avoid infinite loop } let child = this.visit(arg); return child.OFFSET } /** * cleanup a text * * to remove multiple spaces * * unescape special characters todo * @param text e.g. merged labels * @returns {*} */ cleanupText(text) { //remove double spaces to easier match text = text.replace(/ +(?= )/g, ''); //' ?' text = text.replace(/ +(?=[\?])/g, ''); //text = text.replace(/ +(?=[\%][^sbn])/g, ''); //remove spaces at beginning and end text = text.trim(); return text; } composite(ctx) { } ifelse(ctx) { return { PLACEHOLDER: "%s", TEXT: "", OFFSET: ctx.If.offset, TYPE: CBLOCK, ID: this.visit(ctx.annotations).ID } } forever(ctx) { return { PLACEHOLDER: "%s", TEXT: "", OFFSET: ctx.Forever.offset, TYPE: CBLOCK, ID: this.visit(ctx.annotations).ID } } repeat(ctx) { return { PLACEHOLDER: "%s", TEXT: "", OFFSET: ctx.Repeat.offset, TYPE: CBLOCK, ID: this.visit(ctx.annotations).ID } } repeatuntil(ctx) { return { PLACEHOLDER: "%s", TEXT: "", OFFSET: ctx.RepeatUntil.offset, TYPE: CBLOCK, ID: this.visit(ctx.annotations).ID } } clause(ctx) { } modifiers(ctx) { if (!ctx.Modifier) { return { MODIFIERS: [] } } return { MODIFIERS: ctx.Modifier } } id(ctx) { if (ctx && ctx.ID) { return { OFFSET: ctx.ID[0].offset, TEXT: ctx.ID[0].image, ID: ctx.ID[0].image, TYPE: ID } } else { return { ID: null, TYPE: ID } } } comment(ctx) { return { OFFSET: ctx.Comment[0].offset, TEXT: this.unescapeComment(ctx.Comment[0].image), TYPE: COMMENT } } unescapeComment(text) { return text.replace(/\\([^])/g, '$1').replace(/^\|(.*(?=\|$))\|$/, '$1'); } annotations(ctx) { let idinfo = this.visit(ctx.id); let modInfo = this.visit(ctx.modifiers); return { ID: idinfo.ID, MODIFIERS: modInfo.MODIFIERS } } argument(ctx) { let type; let id = ctx.id?this.visit(ctx.id).ID:null; if (ctx.Literal) { let text = ""; if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["tokenMatcher"])(ctx.Literal[0], ChoiceLiteral)) { text = this.unescapeChoiceLiteral(ctx.Literal[0].image); type = CHOICE; } else if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_chevrotain__["tokenMatcher"])(ctx.Literal[0], ColorLiteral)) { text = this.makeValidColor(ctx.Literal[0].image); type = COLOR } else { text = this.unescapeStringLiteral(ctx.Literal[0].image); type = TEXT_OR_NUMBER } return { PLACEHOLDER: "%s", TEXT: text, OFFSET: ctx.Literal[0].startOffset, TYPE: type, ID: id } }else if (ctx.Label) { return { PLACEHOLDER: "%s", TEXT: ctx.Label[0].image, OFFSET: ctx.Label[0].startOffset, TYPE: TEXT_OR_NUMBER, ID: id } } else if (ctx.expression) { return this.visit(ctx.expression); } else if (ctx.predicate) { return this.visit(ctx.predicate); } else { //empty argument return { PLACEHOLDER: "%s", TEXT: "", OFFSET: ctx.LCurlyBracket[0].startOffset, TYPE: EMPTY, ID: id } } } argument$empty(ctx) { } unescapeStringLiteral(text) { return text.replace(/\\([^])/g, '$1').replace(/^"(.*(?="$))"$/, '$1'); } unescapeChoiceLiteral(text) { return text.replace(/\\([^])/g, '$1').replace(/^\[(.*(?=\]$))\]$/, '$1'); } /** * color has to have 6 digits so ABC -> AABBCC * @param text */ makeValidColor(text) { return text.replace(/^#([0-F])([0-F])([0-F])$/i, '#$1$1$2$2$3$3') } condition(ctx) { return this.visit(ctx.expression); } condition$empty(ctx) { } expression(ctx) { return { PLACEHOLDER: "%s", OFFSET: ctx.LRoundBracket[0].startOffset, TYPE: EXPRESSION, ID: this.id(ctx.ID).ID, TEXT: ctx.atomic?this.visit(ctx.atomic).TEXT:"" } } predicate(ctx) { return { PLACEHOLDER: "%b", OFFSET: ctx.LAngleBracket[0].startOffset, TYPE: PREDICATE, ID: this.id(ctx.ID).ID, TEXT: ctx.atomic?this.visit(ctx.atomic).TEXT:"" } } ////////////////////////////////////////////////// //// no 'real' visitor methods as they are not rules. ////////////////////////////////////////////////// ////////////////////////////////////////////////// //// simplified getters ////////////////////////////////////////////////// /** * returns a string for the given ctx * @param ctx * @param rule explicitly declare the rule that needs to be used: * this is necessary if this function is called with whole ctx and not with a child */ getString(ctx, rule = null) { let x; if (!rule) { x = this.visit(ctx); } else { x = this[rule](ctx); } return x.TEXT; } getPlaceholder(ctx, rule = null) { let x; if (!rule) { x = this.visit(ctx); } else { x = this[rule](ctx); } return x.PLACEHOLDER; } getID(ctx, rule = null) { let x; if (!rule) { x = this.visit(ctx); } else { x = this[rule](ctx); } return x.ID; } getType(ctx, rule = null) { let x; if (!rule) { x = this.visit(ctx); } else { x = this[rule](ctx); } return x.TYPE; } getModifiers(ctx, rule = null) { let x; if (!rule) { x = this.visit(ctx); } else { x = this[rule](ctx); } return x.MODIFIERS; } } /* harmony export (immutable) */ __webpack_exports__["d"] = InfoLNVisitor; /***/ }), /* 35 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // TODO: can this be removed? where is it used? exports.IN = "_~IN~_"; //# sourceMappingURL=constants.js.map /***/ }), /* 36 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = __webpack_require__(0); var lang_extensions_1 = __webpack_require__(5); var keys_1 = __webpack_require__(40); var gast_public_1 = __webpack_require__(1); var gast_visitor_public_1 = __webpack_require__(6); function addTerminalToCst(node, token, tokenTypeName) { if (node.children[tokenTypeName] === undefined) { node.children[tokenTypeName] = [token]; } else { node.children[tokenTypeName].push(token); } } exports.addTerminalToCst = addTerminalToCst; function addNoneTerminalToCst(node, ruleName, ruleResult) { if (node.children[ruleName] === undefined) { node.children[ruleName] = [ruleResult]; } else { node.children[ruleName].push(ruleResult); } } exports.addNoneTerminalToCst = addNoneTerminalToCst; var NamedDSLMethodsCollectorVisitor = /** @class */ (function (_super) { __extends(NamedDSLMethodsCollectorVisitor, _super); function NamedDSLMethodsCollectorVisitor(ruleIdx) { var _this = _super.call(this) || this; _this.result = []; _this.ruleIdx = ruleIdx; return _this; } NamedDSLMethodsCollectorVisitor.prototype.collectNamedDSLMethod = function (node, newNodeConstructor, methodIdx) { // TODO: better hack to copy what we need here... if (!utils_1.isUndefined(node.name)) { // copy without name so this will indeed be processed later. var nameLessNode /* istanbul ignore else */ = void 0; /* istanbul ignore else */ if (node instanceof gast_public_1.Option || node instanceof gast_public_1.Repetition || node instanceof gast_public_1.RepetitionMandatory || node instanceof gast_public_1.Alternation) { nameLessNode = new newNodeConstructor({ definition: node.definition, idx: node.idx }); } else if (node instanceof gast_public_1.RepetitionMandatoryWithSeparator || node instanceof gast_public_1.RepetitionWithSeparator) { nameLessNode = new newNodeConstructor({ definition: node.definition, idx: node.idx, separator: node.separator }); } else { throw Error("non exhaustive match"); } var def = [nameLessNode]; var key = keys_1.getKeyForAutomaticLookahead(this.ruleIdx, methodIdx, node.idx); this.result.push({ def: def, key: key, name: node.name, orgProd: node }); } }; NamedDSLMethodsCollectorVisitor.prototype.visitOption = function (node) { this.collectNamedDSLMethod(node, gast_public_1.Option, keys_1.OPTION_IDX); }; NamedDSLMethodsCollectorVisitor.prototype.visitRepetition = function (node) { this.collectNamedDSLMethod(node, gast_public_1.Repetition, keys_1.MANY_IDX); }; NamedDSLMethodsCollectorVisitor.prototype.visitRepetitionMandatory = function (node) { this.collectNamedDSLMethod(node, gast_public_1.RepetitionMandatory, keys_1.AT_LEAST_ONE_IDX); }; NamedDSLMethodsCollectorVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) { this.collectNamedDSLMethod(node, gast_public_1.RepetitionMandatoryWithSeparator, keys_1.AT_LEAST_ONE_SEP_IDX); }; NamedDSLMethodsCollectorVisitor.prototype.visitRepetitionWithSeparator = function (node) { this.collectNamedDSLMethod(node, gast_public_1.RepetitionWithSeparator, keys_1.MANY_SEP_IDX); }; NamedDSLMethodsCollectorVisitor.prototype.visitAlternation = function (node) { var _this = this; this.collectNamedDSLMethod(node, gast_public_1.Alternation, keys_1.OR_IDX); var hasMoreThanOneAlternative = node.definition.length > 1; utils_1.forEach(node.definition, function (currFlatAlt, altIdx) { if (!utils_1.isUndefined(currFlatAlt.name)) { var def = currFlatAlt.definition; if (hasMoreThanOneAlternative) { def = [new gast_public_1.Option({ definition: currFlatAlt.definition })]; } else { // mandatory def = currFlatAlt.definition; } var key = keys_1.getKeyForAltIndex(_this.ruleIdx, keys_1.OR_IDX, node.idx, altIdx); _this.result.push({ def: def, key: key, name: currFlatAlt.name, orgProd: currFlatAlt }); } }); }; return NamedDSLMethodsCollectorVisitor; }(gast_visitor_public_1.GAstVisitor)); exports.NamedDSLMethodsCollectorVisitor = NamedDSLMethodsCollectorVisitor; function analyzeCst(topRules, fullToShortName) { var result = { dictDef: new lang_extensions_1.HashTable(), allRuleNames: [] }; utils_1.forEach(topRules, function (currTopRule) { var currTopRuleShortName = fullToShortName.get(currTopRule.name); result.allRuleNames.push(currTopRule.name); var namedCollectorVisitor = new NamedDSLMethodsCollectorVisitor(currTopRuleShortName); currTopRule.accept(namedCollectorVisitor); utils_1.forEach(namedCollectorVisitor.result, function (_a) { var def = _a.def, key = _a.key, name = _a.name; result.allRuleNames.push(currTopRule.name + name); }); }); return result; } exports.analyzeCst = analyzeCst; //# sourceMappingURL=cst.js.map /***/ }), /* 37 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = __webpack_require__(0); var MISMATCHED_TOKEN_EXCEPTION = "MismatchedTokenException"; var NO_VIABLE_ALT_EXCEPTION = "NoViableAltException"; var EARLY_EXIT_EXCEPTION = "EarlyExitException"; var NOT_ALL_INPUT_PARSED_EXCEPTION = "NotAllInputParsedException"; var RECOGNITION_EXCEPTION_NAMES = [ MISMATCHED_TOKEN_EXCEPTION, NO_VIABLE_ALT_EXCEPTION, EARLY_EXIT_EXCEPTION, NOT_ALL_INPUT_PARSED_EXCEPTION ]; Object.freeze(RECOGNITION_EXCEPTION_NAMES); // hacks to bypass no support for custom Errors in javascript/typescript function isRecognitionException(error) { // can't do instanceof on hacked custom js exceptions return utils_1.contains(RECOGNITION_EXCEPTION_NAMES, error.name); } exports.isRecognitionException = isRecognitionException; function MismatchedTokenException(message, token, previousToken) { this.name = MISMATCHED_TOKEN_EXCEPTION; this.message = message; this.token = token; this.previousToken = previousToken; this.resyncedTokens = []; } exports.MismatchedTokenException = MismatchedTokenException; // must use the "Error.prototype" instead of "new Error" // because the stack trace points to where "new Error" was invoked" MismatchedTokenException.prototype = Error.prototype; function NoViableAltException(message, token, previousToken) { this.name = NO_VIABLE_ALT_EXCEPTION; this.message = message; this.token = token; this.previousToken = previousToken; this.resyncedTokens = []; } exports.NoViableAltException = NoViableAltException; NoViableAltException.prototype = Error.prototype; function NotAllInputParsedException(message, token) { this.name = NOT_ALL_INPUT_PARSED_EXCEPTION; this.message = message; this.token = token; this.resyncedTokens = []; } exports.NotAllInputParsedException = NotAllInputParsedException; NotAllInputParsedException.prototype = Error.prototype; function EarlyExitException(message, token, previousToken) { this.name = EARLY_EXIT_EXCEPTION; this.message = message; this.token = token; this.previousToken = previousToken; this.resyncedTokens = []; } exports.EarlyExitException = EarlyExitException; EarlyExitException.prototype = Error.prototype; //# sourceMappingURL=exceptions_public.js.map /***/ }), /* 38 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = __webpack_require__(0); var gast_public_1 = __webpack_require__(1); var gast_1 = __webpack_require__(10); function first(prod) { /* istanbul ignore else */ if (prod instanceof gast_public_1.NonTerminal) { // this could in theory cause infinite loops if // (1) prod A refs prod B. // (2) prod B refs prod A // (3) AB can match the empty set // in other words a cycle where everything is optional so the first will keep // looking ahead for the next optional part and will never exit // currently there is no safeguard for this unique edge case because // (1) not sure a grammar in which this can happen is useful for anything (productive) return first(prod.referencedRule); } else if (prod instanceof gast_public_1.Terminal) { return firstForTerminal(prod); } else if (gast_1.isSequenceProd(prod)) { return firstForSequence(prod); } else if (gast_1.isBranchingProd(prod)) { return firstForBranching(prod); } else { throw Error("non exhaustive match"); } } exports.first = first; function firstForSequence(prod) { var firstSet = []; var seq = prod.definition; var nextSubProdIdx = 0; var hasInnerProdsRemaining = seq.length > nextSubProdIdx; var currSubProd; // so we enter the loop at least once (if the definition is not empty var isLastInnerProdOptional = true; // scan a sequence until it's end or until we have found a NONE optional production in it while (hasInnerProdsRemaining && isLastInnerProdOptional) { currSubProd = seq[nextSubProdIdx]; isLastInnerProdOptional = gast_1.isOptionalProd(currSubProd); firstSet = firstSet.concat(first(currSubProd)); nextSubProdIdx = nextSubProdIdx + 1; hasInnerProdsRemaining = seq.length > nextSubProdIdx; } return utils_1.uniq(firstSet); } exports.firstForSequence = firstForSequence; function firstForBranching(prod) { var allAlternativesFirsts = utils_1.map(prod.definition, function (innerProd) { return first(innerProd); }); return utils_1.uniq(utils_1.flatten(allAlternativesFirsts)); } exports.firstForBranching = firstForBranching; function firstForTerminal(terminal) { return [terminal.terminalType]; } exports.firstForTerminal = firstForTerminal; //# sourceMappingURL=first.js.map /***/ }), /* 39 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = __webpack_require__(0); var lang_extensions_1 = __webpack_require__(5); var resolver_1 = __webpack_require__(62); var checks_1 = __webpack_require__(9); var errors_public_1 = __webpack_require__(24); var gast_1 = __webpack_require__(10); function resolveGrammar(options) { options = utils_1.defaults(options, { errMsgProvider: errors_public_1.defaultGrammarResolverErrorProvider }); var topRulesTable = new lang_extensions_1.HashTable(); utils_1.forEach(options.rules, function (rule) { topRulesTable.put(rule.name, rule); }); return resolver_1.resolveGrammar(topRulesTable, options.errMsgProvider); } exports.resolveGrammar = resolveGrammar; function validateGrammar(options) { options = utils_1.defaults(options, { errMsgProvider: errors_public_1.defaultGrammarValidatorErrorProvider, ignoredIssues: {} }); return checks_1.validateGrammar(options.rules, options.maxLookahead, options.tokenTypes, options.ignoredIssues, options.errMsgProvider, options.grammarName); } exports.validateGrammar = validateGrammar; function assignOccurrenceIndices(options) { utils_1.forEach(options.rules, function (currRule) { var methodsCollector = new gast_1.DslMethodsCollectorVisitor(); currRule.accept(methodsCollector); utils_1.forEach(methodsCollector.dslMethods, function (methods) { utils_1.forEach(methods, function (currMethod, arrIdx) { currMethod.idx = arrIdx + 1; }); }); }); } exports.assignOccurrenceIndices = assignOccurrenceIndices; //# sourceMappingURL=gast_resolver_public.js.map /***/ }), /* 40 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Lookahead keys are 32Bit integers in the form // TTTTTTTTT-ZZZZZZZZZZZZZZZ-YYYY-XXXX // XXXX -> Occurrence Index bitmap. // YYYY -> DSL Method Name bitmap. // ZZZZZZZZZZZZZZZ -> Rule short Index bitmap. // TTTTTTTTT -> alternation alternative index bitmap Object.defineProperty(exports, "__esModule", { value: true }); exports.BITS_FOR_METHOD_IDX = 4; exports.BITS_FOR_OCCURRENCE_IDX = 4; exports.BITS_FOR_RULE_IDX = 24; // TODO: validation, this means that there may at most 2^8 --> 256 alternatives for an alternation. exports.BITS_FOR_ALT_IDX = 8; // short string used as part of mapping keys. // being short improves the performance when composing KEYS for maps out of these // The 5 - 8 bits (16 possible values, are reserved for the DSL method indices) /* tslint:disable */ exports.OR_IDX = 1 << exports.BITS_FOR_METHOD_IDX; exports.OPTION_IDX = 2 << exports.BITS_FOR_METHOD_IDX; exports.MANY_IDX = 3 << exports.BITS_FOR_METHOD_IDX; exports.AT_LEAST_ONE_IDX = 4 << exports.BITS_FOR_METHOD_IDX; exports.MANY_SEP_IDX = 5 << exports.BITS_FOR_METHOD_IDX; exports.AT_LEAST_ONE_SEP_IDX = 6 << exports.BITS_FOR_METHOD_IDX; /* tslint:enable */ // this actually returns a number, but it is always used as a string (object prop key) function getKeyForAutomaticLookahead(ruleIdx, dslMethodIdx, occurrence) { /* tslint:disable */ return occurrence | dslMethodIdx | ruleIdx; /* tslint:enable */ } exports.getKeyForAutomaticLookahead = getKeyForAutomaticLookahead; var BITS_START_FOR_ALT_IDX = 32 - exports.BITS_FOR_ALT_IDX; function getKeyForAltIndex(ruleIdx, dslMethodIdx, occurrence, altIdx) { /* tslint:disable */ // alternative indices are zero based, thus must always add one (turn on one bit) to guarantee uniqueness. var altIdxBitMap = (altIdx + 1) << BITS_START_FOR_ALT_IDX; return (getKeyForAutomaticLookahead(ruleIdx, dslMethodIdx, occurrence) | altIdxBitMap); /* tslint:enable */ } exports.getKeyForAltIndex = getKeyForAltIndex; //# sourceMappingURL=keys.js.map /***/ }), /* 41 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = __webpack_require__(0); var interpreter_1 = __webpack_require__(25); var rest_1 = __webpack_require__(26); var tokens_1 = __webpack_require__(11); var gast_public_1 = __webpack_require__(1); var gast_visitor_public_1 = __webpack_require__(6); var PROD_TYPE; (function (PROD_TYPE) { PROD_TYPE[PROD_TYPE["OPTION"] = 0] = "OPTION"; PROD_TYPE[PROD_TYPE["REPETITION"] = 1] = "REPETITION"; PROD_TYPE[PROD_TYPE["REPETITION_MANDATORY"] = 2] = "REPETITION_MANDATORY"; PROD_TYPE[PROD_TYPE["REPETITION_MANDATORY_WITH_SEPARATOR"] = 3] = "REPETITION_MANDATORY_WITH_SEPARATOR"; PROD_TYPE[PROD_TYPE["REPETITION_WITH_SEPARATOR"] = 4] = "REPETITION_WITH_SEPARATOR"; PROD_TYPE[PROD_TYPE["ALTERNATION"] = 5] = "ALTERNATION"; })(PROD_TYPE = exports.PROD_TYPE || (exports.PROD_TYPE = {})); function getProdType(prod) { /* istanbul ignore else */ if (prod instanceof gast_public_1.Option) { return PROD_TYPE.OPTION; } else if (prod instanceof gast_public_1.Repetition) { return PROD_TYPE.REPETITION; } else if (prod instanceof gast_public_1.RepetitionMandatory) { return PROD_TYPE.REPETITION_MANDATORY; } else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) { return PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR; } else if (prod instanceof gast_public_1.RepetitionWithSeparator) { return PROD_TYPE.REPETITION_WITH_SEPARATOR; } else if (prod instanceof gast_public_1.Alternation) { return PROD_TYPE.ALTERNATION; } else { throw Error("non exhaustive match"); } } exports.getProdType = getProdType; function buildLookaheadFuncForOr(occurrence, ruleGrammar, k, hasPredicates, dynamicTokensEnabled, laFuncBuilder) { var lookAheadPaths = getLookaheadPathsForOr(occurrence, ruleGrammar, k); var tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths) ? tokens_1.tokenStructuredMatcherNoCategories : tokens_1.tokenStructuredMatcher; return laFuncBuilder(lookAheadPaths, hasPredicates, tokenMatcher, dynamicTokensEnabled); } exports.buildLookaheadFuncForOr = buildLookaheadFuncForOr; /** * When dealing with an Optional production (OPTION/MANY/2nd iteration of AT_LEAST_ONE/...) we need to compare * the lookahead "inside" the production and the lookahead immediately "after" it in the same top level rule (context free). * * Example: given a production: * ABC(DE)?DF * * The optional '(DE)?' should only be entered if we see 'DE'. a single Token 'D' is not sufficient to distinguish between the two * alternatives. * * @returns A Lookahead function which will return true IFF the parser should parse the Optional production. */ function buildLookaheadFuncForOptionalProd(occurrence, ruleGrammar, k, dynamicTokensEnabled, prodType, lookaheadBuilder) { var lookAheadPaths = getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k); var tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths) ? tokens_1.tokenStructuredMatcherNoCategories : tokens_1.tokenStructuredMatcher; return lookaheadBuilder(lookAheadPaths[0], tokenMatcher, dynamicTokensEnabled); } exports.buildLookaheadFuncForOptionalProd = buildLookaheadFuncForOptionalProd; function buildAlternativesLookAheadFunc(alts, hasPredicates, tokenMatcher, dynamicTokensEnabled) { var numOfAlts = alts.length; var areAllOneTokenLookahead = utils_1.every(alts, function (currAlt) { return utils_1.every(currAlt, function (currPath) { return currPath.length === 1; }); }); // This version takes into account the predicates as well. if (hasPredicates) { /** * @returns {number} - The chosen alternative index */ return function (orAlts) { // unfortunately the predicates must be extracted every single time // as they cannot be cached due to references to parameters(vars) which are no longer valid. // note that in the common case of no predicates, no cpu time will be wasted on this (see else block) var predicates = utils_1.map(orAlts, function (currAlt) { return currAlt.GATE; }); for (var t = 0; t < numOfAlts; t++) { var currAlt = alts[t]; var currNumOfPaths = currAlt.length; var currPredicate = predicates[t]; if (currPredicate !== undefined && currPredicate.call(this) === false) { // if the predicate does not match there is no point in checking the paths continue; } nextPath: for (var j = 0; j < currNumOfPaths; j++) { var currPath = currAlt[j]; var currPathLength = currPath.length; for (var i = 0; i < currPathLength; i++) { var nextToken = this.LA(i + 1); if (tokenMatcher(nextToken, currPath[i]) === false) { // mismatch in current path // try the next pth continue nextPath; } } // found a full path that matches. // this will also work for an empty ALT as the loop will be skipped return t; } // none of the paths for the current alternative matched // try the next alternative } // none of the alternatives could be matched return undefined; }; } else if (areAllOneTokenLookahead && !dynamicTokensEnabled) { // optimized (common) case of all the lookaheads paths requiring only // a single token lookahead. These Optimizations cannot work if dynamically defined Tokens are used. var singleTokenAlts = utils_1.map(alts, function (currAlt) { return utils_1.flatten(currAlt); }); var choiceToAlt_1 = utils_1.reduce(singleTokenAlts, function (result, currAlt, idx) { utils_1.forEach(currAlt, function (currTokType) { if (!utils_1.has(result, currTokType.tokenTypeIdx)) { result[currTokType.tokenTypeIdx] = idx; } utils_1.forEach(currTokType.categoryMatches, function (currExtendingType) { if (!utils_1.has(result, currExtendingType)) { result[currExtendingType] = idx; } }); }); return result; }, []); /** * @returns {number} - The chosen alternative index */ return function () { var nextToken = this.LA(1); return choiceToAlt_1[nextToken.tokenTypeIdx]; }; } else { // optimized lookahead without needing to check the predicates at all. // this causes code duplication which is intentional to improve performance. /** * @returns {number} - The chosen alternative index */ return function () { for (var t = 0; t < numOfAlts; t++) { var currAlt = alts[t]; var currNumOfPaths = currAlt.length; nextPath: for (var j = 0; j < currNumOfPaths; j++) { var currPath = currAlt[j]; var currPathLength = currPath.length; for (var i = 0; i < currPathLength; i++) { var nextToken = this.LA(i + 1); if (tokenMatcher(nextToken, currPath[i]) === false) { // mismatch in current path // try the next pth continue nextPath; } } // found a full path that matches. // this will also work for an empty ALT as the loop will be skipped return t; } // none of the paths for the current alternative matched // try the next alternative } // none of the alternatives could be matched return undefined; }; } } exports.buildAlternativesLookAheadFunc = buildAlternativesLookAheadFunc; function buildSingleAlternativeLookaheadFunction(alt, tokenMatcher, dynamicTokensEnabled) { var areAllOneTokenLookahead = utils_1.every(alt, function (currPath) { return currPath.length === 1; }); var numOfPaths = alt.length; // optimized (common) case of all the lookaheads paths requiring only // a single token lookahead. if (areAllOneTokenLookahead && !dynamicTokensEnabled) { var singleTokensTypes = utils_1.flatten(alt); if (singleTokensTypes.length === 1 && utils_1.isEmpty(singleTokensTypes[0].categoryMatches)) { var expectedTokenType = singleTokensTypes[0]; var expectedTokenUniqueKey_1 = expectedTokenType.tokenTypeIdx; return function () { return this.LA(1).tokenTypeIdx === expectedTokenUniqueKey_1; }; } else { var choiceToAlt_2 = utils_1.reduce(singleTokensTypes, function (result, currTokType, idx) { result[currTokType.tokenTypeIdx] = true; utils_1.forEach(currTokType.categoryMatches, function (currExtendingType) { result[currExtendingType] = true; }); return result; }, []); return function () { var nextToken = this.LA(1); return choiceToAlt_2[nextToken.tokenTypeIdx] === true; }; } } else { return function () { nextPath: for (var j = 0; j < numOfPaths; j++) { var currPath = alt[j]; var currPathLength = currPath.length; for (var i = 0; i < currPathLength; i++) { var nextToken = this.LA(i + 1); if (tokenMatcher(nextToken, currPath[i]) === false) { // mismatch in current path // try the next pth continue nextPath; } } // found a full path that matches. return true; } // none of the paths matched return false; }; } } exports.buildSingleAlternativeLookaheadFunction = buildSingleAlternativeLookaheadFunction; var RestDefinitionFinderWalker = /** @class */ (function (_super) { __extends(RestDefinitionFinderWalker, _super); function RestDefinitionFinderWalker(topProd, targetOccurrence, targetProdType) { var _this = _super.call(this) || this; _this.topProd = topProd; _this.targetOccurrence = targetOccurrence; _this.targetProdType = targetProdType; return _this; } RestDefinitionFinderWalker.prototype.startWalking = function () { this.walk(this.topProd); return this.restDef; }; RestDefinitionFinderWalker.prototype.checkIsTarget = function (node, expectedProdType, currRest, prevRest) { if (node.idx === this.targetOccurrence && this.targetProdType === expectedProdType) { this.restDef = currRest.concat(prevRest); return true; } // performance optimization, do not iterate over the entire Grammar ast after we have found the target return false; }; RestDefinitionFinderWalker.prototype.walkOption = function (optionProd, currRest, prevRest) { if (!this.checkIsTarget(optionProd, PROD_TYPE.OPTION, currRest, prevRest)) { _super.prototype.walkOption.call(this, optionProd, currRest, prevRest); } }; RestDefinitionFinderWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) { if (!this.checkIsTarget(atLeastOneProd, PROD_TYPE.REPETITION_MANDATORY, currRest, prevRest)) { _super.prototype.walkOption.call(this, atLeastOneProd, currRest, prevRest); } }; RestDefinitionFinderWalker.prototype.walkAtLeastOneSep = function (atLeastOneSepProd, currRest, prevRest) { if (!this.checkIsTarget(atLeastOneSepProd, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, currRest, prevRest)) { _super.prototype.walkOption.call(this, atLeastOneSepProd, currRest, prevRest); } }; RestDefinitionFinderWalker.prototype.walkMany = function (manyProd, currRest, prevRest) { if (!this.checkIsTarget(manyProd, PROD_TYPE.REPETITION, currRest, prevRest)) { _super.prototype.walkOption.call(this, manyProd, currRest, prevRest); } }; RestDefinitionFinderWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) { if (!this.checkIsTarget(manySepProd, PROD_TYPE.REPETITION_WITH_SEPARATOR, currRest, prevRest)) { _super.prototype.walkOption.call(this, manySepProd, currRest, prevRest); } }; return RestDefinitionFinderWalker; }(rest_1.RestWalker)); /** * Returns the definition of a target production in a top level level rule. */ var InsideDefinitionFinderVisitor = /** @class */ (function (_super) { __extends(InsideDefinitionFinderVisitor, _super); function InsideDefinitionFinderVisitor(targetOccurrence, targetProdType) { var _this = _super.call(this) || this; _this.targetOccurrence = targetOccurrence; _this.targetProdType = targetProdType; _this.result = []; return _this; } InsideDefinitionFinderVisitor.prototype.checkIsTarget = function (node, expectedProdName) { if (node.idx === this.targetOccurrence && this.targetProdType === expectedProdName) { this.result = node.definition; } }; InsideDefinitionFinderVisitor.prototype.visitOption = function (node) { this.checkIsTarget(node, PROD_TYPE.OPTION); }; InsideDefinitionFinderVisitor.prototype.visitRepetition = function (node) { this.checkIsTarget(node, PROD_TYPE.REPETITION); }; InsideDefinitionFinderVisitor.prototype.visitRepetitionMandatory = function (node) { this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY); }; InsideDefinitionFinderVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) { this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR); }; InsideDefinitionFinderVisitor.prototype.visitRepetitionWithSeparator = function (node) { this.checkIsTarget(node, PROD_TYPE.REPETITION_WITH_SEPARATOR); }; InsideDefinitionFinderVisitor.prototype.visitAlternation = function (node) { this.checkIsTarget(node, PROD_TYPE.ALTERNATION); }; return InsideDefinitionFinderVisitor; }(gast_visitor_public_1.GAstVisitor)); function lookAheadSequenceFromAlternatives(altsDefs, k) { function getOtherPaths(pathsAndSuffixes, filterIdx) { return utils_1.reduce(pathsAndSuffixes, function (result, currPathsAndSuffixes, currIdx) { if (currIdx !== filterIdx) { var currPartialPaths = utils_1.map(currPathsAndSuffixes, function (singlePathAndSuffix) { return singlePathAndSuffix.partialPath; }); return result.concat(currPartialPaths); } return result; }, []); } function isUniquePrefix(arr, item) { return (utils_1.find(arr, function (currOtherPath) { return utils_1.every(item, function (currPathTok, idx) { return currPathTok === currOtherPath[idx]; }); }) === undefined); } function initializeArrayOfArrays(size) { var result = []; for (var i = 0; i < size; i++) { result.push([]); } return result; } var partialAlts = utils_1.map(altsDefs, function (currAlt) { return interpreter_1.possiblePathsFrom([currAlt], 1); }); var finalResult = initializeArrayOfArrays(partialAlts.length); var newData = partialAlts; // maxLookahead loop for (var pathLength = 1; pathLength <= k; pathLength++) { var currDataset = newData; newData = initializeArrayOfArrays(currDataset.length); // alternatives loop for (var resultIdx = 0; resultIdx < currDataset.length; resultIdx++) { var currAltPathsAndSuffixes = currDataset[resultIdx]; var otherPaths = getOtherPaths(currDataset, resultIdx); // paths in current alternative loop for (var currPathIdx = 0; currPathIdx < currAltPathsAndSuffixes.length; currPathIdx++) { var currPathPrefix = currAltPathsAndSuffixes[currPathIdx].partialPath; var suffixDef = currAltPathsAndSuffixes[currPathIdx].suffixDef; var isUnique = isUniquePrefix(otherPaths, currPathPrefix); // even if a path is not unique, but there are no longer alternatives to try // or if we have reached the maximum lookahead (k) permitted. if (isUnique || utils_1.isEmpty(suffixDef) || currPathPrefix.length === k) { var currAltResult = finalResult[resultIdx]; if (!containsPath(currAltResult, currPathPrefix)) { currAltResult.push(currPathPrefix); } } else { var newPartialPathsAndSuffixes = interpreter_1.possiblePathsFrom(suffixDef, pathLength + 1, currPathPrefix); newData[resultIdx] = newData[resultIdx].concat(newPartialPathsAndSuffixes); } } } } return finalResult; } exports.lookAheadSequenceFromAlternatives = lookAheadSequenceFromAlternatives; function getLookaheadPathsForOr(occurrence, ruleGrammar, k) { var visitor = new InsideDefinitionFinderVisitor(occurrence, PROD_TYPE.ALTERNATION); ruleGrammar.accept(visitor); return lookAheadSequenceFromAlternatives(visitor.result, k); } exports.getLookaheadPathsForOr = getLookaheadPathsForOr; function getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k) { var insideDefVisitor = new InsideDefinitionFinderVisitor(occurrence, prodType); ruleGrammar.accept(insideDefVisitor); var insideDef = insideDefVisitor.result; var afterDefWalker = new RestDefinitionFinderWalker(ruleGrammar, occurrence, prodType); var afterDef = afterDefWalker.startWalking(); var insideFlat = new gast_public_1.Flat({ definition: insideDef }); var afterFlat = new gast_public_1.Flat({ definition: afterDef }); return lookAheadSequenceFromAlternatives([insideFlat, afterFlat], k); } exports.getLookaheadPathsForOptionalProd = getLookaheadPathsForOptionalProd; function containsPath(alternative, path) { var found = utils_1.find(alternative, function (otherPath) { return (path.length === otherPath.length && utils_1.every(path, function (targetItem, idx) { return targetItem === otherPath[idx]; })); }); return found !== undefined; } exports.containsPath = containsPath; function isStrictPrefixOfPath(prefix, other) { return (prefix.length < other.length && utils_1.every(prefix, function (tokType, idx) { return tokType === other[idx]; })); } exports.isStrictPrefixOfPath = isStrictPrefixOfPath; function areTokenCategoriesNotUsed(lookAheadPaths) { return utils_1.every(lookAheadPaths, function (singleAltPaths) { return utils_1.every(singleAltPaths, function (singlePath) { return utils_1.every(singlePath, function (token) { return utils_1.isEmpty(token.categoryMatches); }); }); }); } exports.areTokenCategoriesNotUsed = areTokenCategoriesNotUsed; //# sourceMappingURL=lookahead.js.map /***/ }), /* 42 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;;(function(root, factory) { // istanbul ignore next if (true) { // istanbul ignore next !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) } else if (typeof module === "object" && module.exports) { module.exports = factory() } else { // istanbul ignore next root.regexpToAst = factory() } })( typeof self !== "undefined" ? // istanbul ignore next self : this, function() { // references // https://hackernoon.com/the-madness-of-parsing-real-world-javascript-regexps-d9ee336df983 // https://www.ecma-international.org/ecma-262/8.0/index.html#prod-Pattern function RegExpParser() {} RegExpParser.prototype.saveState = function() { return { idx: this.idx, input: this.input, groupIdx: this.groupIdx } } RegExpParser.prototype.restoreState = function(newState) { this.idx = newState.idx this.input = newState.input this.groupIdx = newState.groupIdx } RegExpParser.prototype.pattern = function(input) { // parser state this.idx = 0 this.input = input this.groupIdx = 0 this.consumeChar("/") var value = this.disjunction() this.consumeChar("/") var flags = { type: "Flags", global: false, ignoreCase: false, multiLine: false, unicode: false, sticky: false } while (this.isRegExpFlag()) { switch (this.popChar()) { case "g": addFlag(flags, "global") break case "i": addFlag(flags, "ignoreCase") break case "m": addFlag(flags, "multiLine") break case "u": addFlag(flags, "unicode") break case "y": addFlag(flags, "sticky") break } } if (this.idx !== this.input.length) { throw Error( "Redundant input: " + this.input.substring(this.idx) ) } return { type: "Pattern", flags: flags, value: value } } RegExpParser.prototype.disjunction = function() { var alts = [] alts.push(this.alternative()) while (this.peekChar() === "|") { this.consumeChar("|") alts.push(this.alternative()) } return { type: "Disjunction", value: alts } } RegExpParser.prototype.alternative = function() { var terms = [] while (this.isTerm()) { terms.push(this.term()) } return { type: "Alternative", value: terms } } RegExpParser.prototype.term = function() { if (this.isAssertion()) { return this.assertion() } else { return this.atom() } } RegExpParser.prototype.assertion = function() { switch (this.popChar()) { case "^": return { type: "StartAnchor" } case "$": return { type: "EndAnchor" } // '\b' or '\B' case "\\": switch (this.popChar()) { case "b": return { type: "WordBoundary" } case "B": return { type: "NonWordBoundary" } } // istanbul ignore next throw Error("Invalid Assertion Escape") // '(?=' or '(?!' case "(": this.consumeChar("?") var type switch (this.popChar()) { case "=": type = "Lookahead" break case "!": type = "NegativeLookahead" break } ASSERT_EXISTS(type) var disjunction = this.disjunction() this.consumeChar(")") return { type: type, value: disjunction } } // istanbul ignore next ASSERT_NEVER_REACH_HERE() } RegExpParser.prototype.quantifier = function() { var range switch (this.popChar()) { case "*": range = { atLeast: 0, atMost: Infinity } break case "+": range = { atLeast: 1, atMost: Infinity } break case "?": range = { atLeast: 0, atMost: 1 } break case "{": var atLeast = this.integerIncludingZero() switch (this.popChar()) { case "}": range = { atLeast: atLeast, atMost: atLeast } break case ",": var atMost if (this.isDigit()) { atMost = this.integerIncludingZero() range = { atLeast: atLeast, atMost: atMost } } else { range = { atLeast: atLeast, atMost: Infinity } } this.consumeChar("}") break } ASSERT_EXISTS(range) break } ASSERT_EXISTS(range) if (this.peekChar(0) === "?") { this.consumeChar("?") range.greedy = false } else { range.greedy = true } range.type = "Quantifier" return range } RegExpParser.prototype.atom = function() { var atom switch (this.peekChar()) { case ".": atom = this.dotAll() break case "\\": atom = this.atomEscape() break case "[": atom = this.characterClass() break case "(": atom = this.group() break } if (atom === undefined && this.isPatternCharacter()) { atom = this.patternCharacter() } ASSERT_EXISTS(atom) if (this.isQuantifier()) { atom.quantifier = this.quantifier() } return atom } RegExpParser.prototype.dotAll = function() { this.consumeChar(".") return { type: "Set", complement: true, value: [cc("\n"), cc("\r"), cc("\u2028"), cc("\u2029")] } } RegExpParser.prototype.atomEscape = function() { this.consumeChar("\\") switch (this.peekChar()) { case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": return this.decimalEscapeAtom() case "d": case "D": case "s": case "S": case "w": case "W": return this.characterClassEscape() case "f": case "n": case "r": case "t": case "v": return this.controlEscapeAtom() case "c": return this.controlLetterEscapeAtom() case "0": return this.nulCharacterAtom() case "x": return this.hexEscapeSequenceAtom() case "u": return this.regExpUnicodeEscapeSequenceAtom() default: return this.identityEscapeAtom() } } RegExpParser.prototype.decimalEscapeAtom = function() { var value = this.positiveInteger() return { type: "GroupBackReference", value: value } } RegExpParser.prototype.characterClassEscape = function() { var set var complement = false switch (this.popChar()) { case "d": set = digitsCharCodes break case "D": set = digitsCharCodes complement = true break case "s": set = whitespaceCodes break case "S": set = whitespaceCodes complement = true break case "w": set = wordCharCodes break case "W": set = wordCharCodes complement = true break } ASSERT_EXISTS(set) return { type: "Set", value: set, complement: complement } } RegExpParser.prototype.controlEscapeAtom = function() { var escapeCode switch (this.popChar()) { case "f": escapeCode = cc("\f") break case "n": escapeCode = cc("\n") break case "r": escapeCode = cc("\r") break case "t": escapeCode = cc("\t") break case "v": escapeCode = cc("\v") break } ASSERT_EXISTS(escapeCode) return { type: "Character", value: escapeCode } } RegExpParser.prototype.controlLetterEscapeAtom = function() { this.consumeChar("c") var letter = this.popChar() if (/[a-zA-Z]/.test(letter) === false) { throw Error("Invalid ") } var letterCode = letter.toUpperCase().charCodeAt(0) - 64 return { type: "Character", value: letterCode } } RegExpParser.prototype.nulCharacterAtom = function() { // TODO implement '[lookahead ∉ DecimalDigit]' // TODO: for the deprecated octal escape sequence this.consumeChar("0") return { type: "Character", value: cc("\0") } } RegExpParser.prototype.hexEscapeSequenceAtom = function() { this.consumeChar("x") return this.parseHexDigits(2) } RegExpParser.prototype.regExpUnicodeEscapeSequenceAtom = function() { this.consumeChar("u") return this.parseHexDigits(4) } RegExpParser.prototype.identityEscapeAtom = function() { // TODO: implement "SourceCharacter but not UnicodeIDContinue" // // http://unicode.org/reports/tr31/#Specific_Character_Adjustments var escapedChar = this.popChar() return { type: "Character", value: cc(escapedChar) } } RegExpParser.prototype.classPatternCharacterAtom = function() { switch (this.peekChar()) { // istanbul ignore next case "\n": // istanbul ignore next case "\r": // istanbul ignore next case "\u2028": // istanbul ignore next case "\u2029": // istanbul ignore next case "\\": // istanbul ignore next case "]": throw Error("TBD") default: var nextChar = this.popChar() return { type: "Character", value: cc(nextChar) } } } RegExpParser.prototype.characterClass = function() { var set = [] var complement = false this.consumeChar("[") if (this.peekChar(0) === "^") { this.consumeChar("^") complement = true } while (this.isClassAtom()) { var from = this.classAtom() var isFromSingleChar = from.type === "Character" if (isFromSingleChar && this.isRangeDash()) { this.consumeChar("-") var to = this.classAtom() var isToSingleChar = to.type === "Character" // a range can only be used when both sides are single characters if (isToSingleChar) { if (to.value < from.value) { throw Error("Range out of order in character class") } for ( var charCode = from.value; charCode <= to.value; charCode++ ) { set.push(charCode) } } else { insertToSet(from.value, set) set.push(cc("-")) insertToSet(to.value, set) } } else { insertToSet(from.value, set) } } this.consumeChar("]") return { type: "Set", complement: complement, value: uniq(set) } } RegExpParser.prototype.classAtom = function() { switch (this.peekChar()) { // istanbul ignore next case "]": // istanbul ignore next case "\n": // istanbul ignore next case "\r": // istanbul ignore next case "\u2028": // istanbul ignore next case "\u2029": throw Error("TBD") case "\\": return this.classEscape() default: return this.classPatternCharacterAtom() } } RegExpParser.prototype.classEscape = function() { this.consumeChar("\\") switch (this.peekChar()) { // Matches a backspace. // (Not to be confused with \b word boundary outside characterClass) case "b": this.consumeChar("b") return { type: "Character", value: cc("\u0008") } case "d": case "D": case "s": case "S": case "w": case "W": return this.characterClassEscape() case "f": case "n": case "r": case "t": case "v": return this.controlEscapeAtom() case "c": return this.controlLetterEscapeAtom() case "0": return this.nulCharacterAtom() case "x": return this.hexEscapeSequenceAtom() case "u": return this.regExpUnicodeEscapeSequenceAtom() default: return this.identityEscapeAtom() } } RegExpParser.prototype.group = function() { var capturing = true this.consumeChar("(") switch (this.peekChar(0)) { case "?": this.consumeChar("?") this.consumeChar(":") capturing = false break default: this.groupIdx++ break } var value = this.disjunction() this.consumeChar(")") var groupAst = { type: "Group", capturing: capturing, value: value } if (capturing) { groupAst.idx = this.groupIdx } return groupAst } RegExpParser.prototype.positiveInteger = function() { var number = this.popChar() // istanbul ignore next - can't ever get here due to previous lookahead checks // still implementing this error checking in case this ever changes. if (decimalPatternNoZero.test(number) === false) { throw Error("Expecting a positive integer") } while (decimalPattern.test(this.peekChar(0))) { number += this.popChar() } return parseInt(number, 10) } RegExpParser.prototype.integerIncludingZero = function() { var number = this.popChar() if (decimalPattern.test(number) === false) { throw Error("Expecting an integer") } while (decimalPattern.test(this.peekChar(0))) { number += this.popChar() } return parseInt(number, 10) } RegExpParser.prototype.patternCharacter = function() { var nextChar = this.popChar() switch (nextChar) { // istanbul ignore next case "\n": // istanbul ignore next case "\r": // istanbul ignore next case "\u2028": // istanbul ignore next case "\u2029": // istanbul ignore next case "^": // istanbul ignore next case "$": // istanbul ignore next case "\\": // istanbul ignore next case ".": // istanbul ignore next case "*": // istanbul ignore next case "+": // istanbul ignore next case "?": // istanbul ignore next case "(": // istanbul ignore next case ")": // istanbul ignore next case "[": // istanbul ignore next case "|": // istanbul ignore next throw Error("TBD") default: return { type: "Character", value: cc(nextChar) } } } RegExpParser.prototype.isRegExpFlag = function() { switch (this.peekChar(0)) { case "g": case "i": case "m": case "u": case "y": return true default: return false } } RegExpParser.prototype.isRangeDash = function() { return this.peekChar() === "-" && this.isClassAtom(1) } RegExpParser.prototype.isDigit = function() { return decimalPattern.test(this.peekChar(0)) } RegExpParser.prototype.isClassAtom = function(howMuch) { if (howMuch === undefined) { howMuch = 0 } switch (this.peekChar(howMuch)) { case "]": case "\n": case "\r": case "\u2028": case "\u2029": return false default: return true } } RegExpParser.prototype.isTerm = function() { return this.isAtom() || this.isAssertion() } RegExpParser.prototype.isAtom = function() { if (this.isPatternCharacter()) { return true } switch (this.peekChar(0)) { case ".": case "\\": // atomEscape case "[": // characterClass // TODO: isAtom must be called before isAssertion - disambiguate case "(": // group return true default: return false } } RegExpParser.prototype.isAssertion = function() { switch (this.peekChar(0)) { case "^": case "$": return true // '\b' or '\B' case "\\": switch (this.peekChar(1)) { case "b": case "B": return true default: return false } // '(?=' or '(?!' case "(": return ( this.peekChar(1) === "?" && (this.peekChar(2) === "=" || this.peekChar(2) === "!") ) default: return false } } RegExpParser.prototype.isQuantifier = function() { var prevState = this.saveState() try { return this.quantifier() } catch (e) { return false } finally { this.restoreState(prevState) } } RegExpParser.prototype.isPatternCharacter = function() { switch (this.peekChar()) { case "^": case "$": case "\\": case ".": case "*": case "+": case "?": case "(": case ")": case "[": case "|": case "/": case "\n": case "\r": case "\u2028": case "\u2029": return false default: return true } } RegExpParser.prototype.parseHexDigits = function(howMany) { var hexString = "" for (var i = 0; i < howMany; i++) { var hexChar = this.popChar() if (hexDigitPattern.test(hexChar) === false) { throw Error("Expecting a HexDecimal digits") } hexString += hexChar } var charCode = parseInt(hexString, 16) return { type: "Character", value: charCode } } RegExpParser.prototype.peekChar = function(howMuch) { if (howMuch === undefined) { howMuch = 0 } return this.input[this.idx + howMuch] } RegExpParser.prototype.popChar = function() { var nextChar = this.peekChar(0) this.consumeChar() return nextChar } RegExpParser.prototype.consumeChar = function(char) { if (char !== undefined && this.input[this.idx] !== char) { throw Error( "Expected: '" + char + "' but found: '" + this.input[this.idx] + "' at offset: " + this.idx ) } if (this.idx >= this.input.length) { throw Error("Unexpected end of input") } this.idx++ } // consts and utilities var hexDigitPattern = /[0-9a-fA-F]/ var decimalPattern = /[0-9]/ var decimalPatternNoZero = /[1-9]/ function cc(char) { return char.charCodeAt(0) } function uniq(arr) { var setMap = {} arr.forEach(function(item) { setMap[item] = item }) var set = [] for (var key in setMap) { set.push(setMap[key]) } return set } function insertToSet(item, set) { if (item.length !== undefined) { item.forEach(function(subItem) { set.push(subItem) }) } else { set.push(item) } } function addFlag(flagObj, flagKey) { if (flagObj[flagKey] === true) { throw "duplicate flag " + flagKey } flagObj[flagKey] = true } function ASSERT_EXISTS(obj) { // istanbul ignore next if (obj === undefined) { throw Error("Internal Error - Should never get here!") } } // istanbul ignore next function ASSERT_NEVER_REACH_HERE() { throw Error("Internal Error - Should never get here!") } var i var digitsCharCodes = [] for (i = cc("0"); i <= cc("9"); i++) { digitsCharCodes.push(i) } var wordCharCodes = [cc("_")].concat(digitsCharCodes) for (i = cc("a"); i <= cc("z"); i++) { wordCharCodes.push(i) } for (i = cc("A"); i <= cc("Z"); i++) { wordCharCodes.push(i) } // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#character-classes var whitespaceCodes = [ cc(" "), cc("\f"), cc("\n"), cc("\r"), cc("\t"), cc("\v"), cc("\t"), cc("\u00a0"), cc("\u1680"), cc("\u2000"), cc("\u2001"), cc("\u2002"), cc("\u2003"), cc("\u2004"), cc("\u2005"), cc("\u2006"), cc("\u2007"), cc("\u2008"), cc("\u2009"), cc("\u200a"), cc("\u2028"), cc("\u2029"), cc("\u202f"), cc("\u205f"), cc("\u3000"), cc("\ufeff") ] function BaseRegExpVisitor() {} BaseRegExpVisitor.prototype.visitChildren = function(node) { for (var key in node) { var child = node[key] /* istanbul ignore else */ if (node.hasOwnProperty(key)) { if (child.type !== undefined) { this.visit(child) } else if (Array.isArray(child)) { child.forEach(function(subChild) { this.visit(subChild) }, this) } } } } BaseRegExpVisitor.prototype.visit = function(node) { switch (node.type) { case "Pattern": this.visitPattern(node) break case "Flags": this.visitFlags(node) break case "Disjunction": this.visitDisjunction(node) break case "Alternative": this.visitAlternative(node) break case "StartAnchor": this.visitStartAnchor(node) break case "EndAnchor": this.visitEndAnchor(node) break case "WordBoundary": this.visitWordBoundary(node) break case "NonWordBoundary": this.visitNonWordBoundary(node) break case "Lookahead": this.visitLookahead(node) break case "NegativeLookahead": this.visitNegativeLookahead(node) break case "Character": this.visitCharacter(node) break case "Set": this.visitSet(node) break case "Group": this.visitGroup(node) break case "GroupBackReference": this.visitGroupBackReference(node) break case "Quantifier": this.visitQuantifier(node) break } this.visitChildren(node) } BaseRegExpVisitor.prototype.visitPattern = function(node) {} BaseRegExpVisitor.prototype.visitFlags = function(node) {} BaseRegExpVisitor.prototype.visitDisjunction = function(node) {} BaseRegExpVisitor.prototype.visitAlternative = function(node) {} // Assertion BaseRegExpVisitor.prototype.visitStartAnchor = function(node) {} BaseRegExpVisitor.prototype.visitEndAnchor = function(node) {} BaseRegExpVisitor.prototype.visitWordBoundary = function(node) {} BaseRegExpVisitor.prototype.visitNonWordBoundary = function(node) {} BaseRegExpVisitor.prototype.visitLookahead = function(node) {} BaseRegExpVisitor.prototype.visitNegativeLookahead = function(node) {} // atoms BaseRegExpVisitor.prototype.visitCharacter = function(node) {} BaseRegExpVisitor.prototype.visitSet = function(node) {} BaseRegExpVisitor.prototype.visitGroup = function(node) {} BaseRegExpVisitor.prototype.visitGroupBackReference = function(node) {} BaseRegExpVisitor.prototype.visitQuantifier = function(node) {} return { RegExpParser: RegExpParser, BaseRegExpVisitor: BaseRegExpVisitor, VERSION: "0.3.4" } } ) /***/ }), /* 43 */ /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(70); /***/ }), /* 44 */ /***/ (function(module, exports) { // Generated by CoffeeScript 1.12.7 (function() { var XMLAttribute; module.exports = XMLAttribute = (function() { function XMLAttribute(parent, name, value) { this.options = parent.options; this.stringify = parent.stringify; if (name == null) { throw new Error("Missing attribute name of element " + parent.name); } if (value == null) { throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name); } this.name = this.stringify.attName(name); this.value = this.stringify.attValue(value); } XMLAttribute.prototype.clone = function() { return Object.create(this); }; XMLAttribute.prototype.toString = function(options) { return this.options.writer.set(options).attribute(this); }; return XMLAttribute; })(); }).call(this); /***/ }), /* 45 */ /***/ (function(module, exports) { // Generated by CoffeeScript 1.12.7 (function() { var XMLStringifier, bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, hasProp = {}.hasOwnProperty; module.exports = XMLStringifier = (function() { function XMLStringifier(options) { this.assertLegalChar = bind(this.assertLegalChar, this); var key, ref, value; options || (options = {}); this.noDoubleEncoding = options.noDoubleEncoding; ref = options.stringify || {}; for (key in ref) { if (!hasProp.call(ref, key)) continue; value = ref[key]; this[key] = value; } } XMLStringifier.prototype.eleName = function(val) { val = '' + val || ''; return this.assertLegalChar(val); }; XMLStringifier.prototype.eleText = function(val) { val = '' + val || ''; return this.assertLegalChar(this.elEscape(val)); }; XMLStringifier.prototype.cdata = function(val) { val = '' + val || ''; val = val.replace(']]>', ']]]]>'); return this.assertLegalChar(val); }; XMLStringifier.prototype.comment = function(val) { val = '' + val || ''; if (val.match(/--/)) { throw new Error("Comment text cannot contain double-hypen: " + val); } return this.assertLegalChar(val); }; XMLStringifier.prototype.raw = function(val) { return '' + val || ''; }; XMLStringifier.prototype.attName = function(val) { return val = '' + val || ''; }; XMLStringifier.prototype.attValue = function(val) { val = '' + val || ''; return this.attEscape(val); }; XMLStringifier.prototype.insTarget = function(val) { return '' + val || ''; }; XMLStringifier.prototype.insValue = function(val) { val = '' + val || ''; if (val.match(/\?>/)) { throw new Error("Invalid processing instruction value: " + val); } return val; }; XMLStringifier.prototype.xmlVersion = function(val) { val = '' + val || ''; if (!val.match(/1\.[0-9]+/)) { throw new Error("Invalid version number: " + val); } return val; }; XMLStringifier.prototype.xmlEncoding = function(val) { val = '' + val || ''; if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/)) { throw new Error("Invalid encoding: " + val); } return val; }; XMLStringifier.prototype.xmlStandalone = function(val) { if (val) { return "yes"; } else { return "no"; } }; XMLStringifier.prototype.dtdPubID = function(val) { return '' + val || ''; }; XMLStringifier.prototype.dtdSysID = function(val) { return '' + val || ''; }; XMLStringifier.prototype.dtdElementValue = function(val) { return '' + val || ''; }; XMLStringifier.prototype.dtdAttType = function(val) { return '' + val || ''; }; XMLStringifier.prototype.dtdAttDefault = function(val) { if (val != null) { return '' + val || ''; } else { return val; } }; XMLStringifier.prototype.dtdEntityValue = function(val) { return '' + val || ''; }; XMLStringifier.prototype.dtdNData = function(val) { return '' + val || ''; }; XMLStringifier.prototype.convertAttKey = '@'; XMLStringifier.prototype.convertPIKey = '?'; XMLStringifier.prototype.convertTextKey = '#text'; XMLStringifier.prototype.convertCDataKey = '#cdata'; XMLStringifier.prototype.convertCommentKey = '#comment'; XMLStringifier.prototype.convertRawKey = '#raw'; XMLStringifier.prototype.assertLegalChar = function(str) { var res; res = str.match(/[\0\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/); if (res) { throw new Error("Invalid character in string: " + str + " at index " + res.index); } return str; }; XMLStringifier.prototype.elEscape = function(str) { var ampregex; ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g; return str.replace(ampregex, '&').replace(//g, '>').replace(/\r/g, ' '); }; XMLStringifier.prototype.attEscape = function(str) { var ampregex; ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g; return str.replace(ampregex, '&').replace(/ 0) { return new Array(indent).join(this.indent); } else { return ''; } } else { return ''; } }; return XMLWriterBase; })(); }).call(this); /***/ }), /* 47 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /** * Generation and storage of ids during the generation of an XML. * * things that need to be possible are: * - varID, id for the variable * - unique id for every block * - * * @file This files defines the BasicIDManager class. * @author Ellen Vanhove. */ const ARG = 'arg'; /* harmony export (immutable) */ __webpack_exports__["d"] = ARG; const BROADCAST = 'broadcast_msg'; /* harmony export (immutable) */ __webpack_exports__["b"] = BROADCAST; const LIST = 'list'; /* harmony export (immutable) */ __webpack_exports__["a"] = LIST; class BasicIDManager{ constructor(informationVisitor) { this.infoVisitor = informationVisitor; this.reset(); } reset(){ this.counter = 0; //maps blockid -> counter for the inputs this.inputCounter = {}; //-- variables -- //map a variablename to its id this.varMap = {}; this.varCounter = 0; //comments this.commentCounter = 0; } /** * generates an unique id for every block * if an id is defined in the ctx this one should be used * todo: waring in case an id is used twice. * @param definedID the id defiend by the user, null incase the id is not defined * @returns {string} */ getNextBlockID(definedID=null) { let id; if(definedID){ id=definedID; }else { id = "block_" + this.counter++; } if (this.inputCounter[id]) { //the id is already used, this is not allowed //todo generate warning } this.inputCounter[id] = 0; return id; } /** * generates an unique id for every block * if an id is defined in the ctx this one should be used * todo: waring in case an id is used twice. * @param definedID the id defiend by the user, null incase the id is not defined * @param parentID the id of the parent block that contains this input * @returns {string} */ getNextInputID(parentID,definedID=null) { let id; if(definedID){ id=definedID; }else { id=parentID + '_input_' + this.inputCounter[parentID]++; } return id; } /** * variable id is never defined or used by the user. it is only for internal reference to the same block * @param varName * @param variableType */ acquireVariableID(varName, variableType = '') { //if first time this variable is encountered, create an ID for it if (!this.varMap[varName]) { this.varMap[varName] = { 'id': 'variable_' + this.varCounter++, 'variableType': variableType } } return this.varMap[varName].id; } /** * generates an unique id for every coment * if an id is defined in the ctx this one should be used * todo: waring in case an id is used twice. * @param definedID * @param {boolean} pinned is it a stand alone block? * @returns {string} */ getNextCommentID(definedID,pinned=true){ let id; if(definedID){ id=definedID; }else { id="comment_"+this.commentCounter++; } return id; } } /* harmony export (immutable) */ __webpack_exports__["c"] = BasicIDManager; /***/ }), /* 48 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = init_parser_utils; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__blockspecification_blockspecification__ = __webpack_require__(55); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__typeConfig__ = __webpack_require__(8); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__blocksConverter__ = __webpack_require__(49); /** * Functions that structure the functions that generate the xml of the build-in blocks;. * * @file This files defines the functions * @author Ellen Vanhove. */ let blocks = {}; //map of strings -> objects that look like /** * WARNING: blocks with the same text are wrapped in the converter. * WARNING: currently only one modus for each block, * so should be relooked in case same string in two modusses can be used. * { * converter: function that generates xml * modus: see typeConfig, in which context can this block been build. * } */ /* harmony default export */ __webpack_exports__["b"] = (blocks); /** * init blocks with information from blockspecifications */ function init_parser_utils() { // blockspecifications //generate the functions in blocks for (let x = 0; x < __WEBPACK_IMPORTED_MODULE_0__blockspecification_blockspecification__["a" /* blockspecifications */].length; x++) { let b = __WEBPACK_IMPORTED_MODULE_0__blockspecification_blockspecification__["a" /* blockspecifications */][x]; if (Array.isArray(b['template'])) { let ts = b['template']; for (let t = 0; t < ts.length; t++) { createBlockEntry(b['template'][t].toLowerCase(), b) } } else { createBlockEntry(b['template'].toLowerCase(), b) } } } /** * adds an function element to blocks * @param templateString {String} to match so that the block from the definition is build * @param specification as defined in blockspecifications */ function createBlockEntry(templateString, specification) { //determine the modus for the block let modus; switch (specification.description.shape) { case "booleanblock": modus = __WEBPACK_IMPORTED_MODULE_1__typeConfig__["a" /* MODUS */].BOOLEAN; break; case "reporterblock": modus=__WEBPACK_IMPORTED_MODULE_1__typeConfig__["a" /* MODUS */].REPORTER; break; default: modus = __WEBPACK_IMPORTED_MODULE_1__typeConfig__["a" /* MODUS */].STACK; } //if the template has no converter assigned yet, there is no problem, just create it if (!blocks[templateString]) { blocks[templateString] = {}; blocks[templateString].converter = createBlockFunction(specification); //If no modus is defined it is always ok blocks[templateString].modus = [__WEBPACK_IMPORTED_MODULE_1__typeConfig__["a" /* MODUS */].NONE,modus]; } else { let higherDefinedSpecification = blocks[templateString].converter; //wrap the previous one blocks[templateString].converter = function (ctx, visitor) { //if it not succeeds let first_call_executed = higherDefinedSpecification(ctx, visitor); if (!first_call_executed) { //Call the next one return createBlockFunction(specification)(ctx, visitor); } return first_call_executed; }; //add the modus if it is a different one if(!(modus in blocks[templateString].modus)){ blocks[templateString].modus.push(modus); } } } /** * creates a function that can be called with (ctx,visitor) * it creates xml based on the specifications by calling the converter function if the predicate is true * @param specification object as defined in the file blockspecifications * @returns {Function} */ function createBlockFunction(specification) { let b = specification; return function (ctx, visitor) { if (!b['predicate'] || b['predicate'](ctx, visitor)) { if(b['converter']) { b['converter'](ctx, visitor, b['description']); }else{ __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__blocksConverter__["a" /* universalBlockConverter */])(ctx, visitor, b['description']); } return true; } return false; }; } /***/ }), /* 49 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = universalBlockConverter; /* harmony export (immutable) */ __webpack_exports__["c"] = addType; /* harmony export (immutable) */ __webpack_exports__["f"] = variableBlockConverter; /* harmony export (immutable) */ __webpack_exports__["b"] = listBlockConverter; /* harmony export (immutable) */ __webpack_exports__["e"] = messageShadowBlockconverter; /* harmony export (immutable) */ __webpack_exports__["d"] = messageBlockconverter; /* harmony export (immutable) */ __webpack_exports__["g"] = stopConverter; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__infoLNVisitor__ = __webpack_require__(34); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__IDManager__ = __webpack_require__(47); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__typeConfigUtils__ = __webpack_require__(50); /** * * @param ctx * @param visitor * @param arg definition from the structure * @param i the index of the argument in the ctx */ function makeArgument(ctx, visitor, arg, i) { if (arg.check === "Boolean") { visitor.state.expectBoolean(); } else { if (arg.shadowType) { let inputType = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__typeConfigUtils__["a" /* stringToinputType */])(arg.shadowType); visitor.state.setExpectingInput(inputType); } else { visitor.state.expectNothing(); } } let type = visitor.infoVisitor.getType(ctx.argument[i]); //check menu first, because round dropdwons are also inputvalues if (arg.menu) { //can be replaced -> round dropdown visitor.xml = visitor.xml.ele('value', { 'name': arg.name }); if (type === __WEBPACK_IMPORTED_MODULE_0__infoLNVisitor__["a" /* EXPRESSION */] || type === __WEBPACK_IMPORTED_MODULE_0__infoLNVisitor__["b" /* PREDICATE */]) { visitor.visit(ctx.argument[i]); //generate an empty dropdown below visitor.xml.ele('shadow', { 'type': arg.menu //this was added to the json and was not default. }).ele('field', { 'name': arg.name }); // '_mouse_' } else { //wrong input type if (type !== __WEBPACK_IMPORTED_MODULE_0__infoLNVisitor__["c" /* CHOICE */]) { visitor.warningsKeeper.add(ctx, "expected a choice but found " + type); } visitor.xml.ele('shadow', { 'type': arg.menu //this was added to the json and was not default. }).ele('field', { 'name': arg.name }, visitor.infoVisitor.getString(ctx.argument[i])); // '_mouse_' } visitor.xml = visitor.xml.up(); } else if (arg.type === 'input_value') { //normal input visitor.xml = visitor.xml.ele('value', { 'name': arg.name }); visitor.visit(ctx.argument[i]); visitor.xml = visitor.xml.up(); } else if (arg.type === 'field_dropdown') { //limited options -> rectangle dropdwon let option = visitor.infoVisitor.getString(ctx.argument[i]); let key; for (let i = 0; i < arg.options.length; i++) { let text = arg.options[i][0]; if (text === option) { key = arg.options[i][1]; break; } } if (!key) { visitor.warningsKeeper.add(ctx, "unknown option: " + option); key = option; } if (type !== __WEBPACK_IMPORTED_MODULE_0__infoLNVisitor__["c" /* CHOICE */]) { visitor.warningsKeeper.add(ctx, "expected a choice but found " + type); } visitor.xml = visitor.xml.ele('field', { 'name': arg.name }, key); visitor.xml = visitor.xml.up(); } visitor.state.expectNothing(); } function universalBlockConverter(ctx, visitor, structure) { console.log(structure) if (structure.shape === "hatblock") { visitor.interruptStack(ctx, true); } addType(ctx, visitor, structure.opcode); for (let i = 0; ctx.argument && i < ctx.argument.length; i++) { let arg = structure.args[i]; makeArgument(ctx, visitor, arg, i); } if (structure.shape === "hatblock") { visitor.startStack(ctx); } if (structure.shape === "capblock") { visitor.interruptStack(ctx, false); } } function addType(ctx, visitor, type) { let blockid = visitor.idManager.getNextBlockID(visitor.infoVisitor.getID(ctx, "atomic")); visitor.xml = visitor.xml.ele('block', { 'id': blockid, 'type': type }); visitor.state.addBlock(blockid); }; //======================================================================================================================================= // variable and list operations require special treatment considering the IDS //======================================================================================================================================= function variableBlockConverter(ctx, visitor, structure) { addType(ctx, visitor, structure.opcode); //name of the variable let varble = visitor.infoVisitor.getString(ctx.argument[0]); //function must be called to register VariableID visitor.idManager.acquireVariableID(varble); visitor.xml = visitor.xml.ele('field', { 'name': 'VARIABLE' }, varble); if (structure.args.length > 1) { visitor.xml = visitor.xml.up().ele('value', { 'name': 'VALUE' }); } //the second argument. visitor.visit(ctx.argument[1]); visitor.xml = visitor.xml.up(); } //todo function listBlockConverter(ctx, visitor, structure) { addType(ctx, visitor, structure.opcode); for (let i = 0; i < ctx.argument.length; i++) { let arg = structure.args[i]; if (arg.name === 'LIST') { let varble = visitor.infoVisitor.getString(ctx.argument[i]); visitor.idManager.acquireVariableID(varble, __WEBPACK_IMPORTED_MODULE_1__IDManager__["a" /* LIST */]); visitor.xml = visitor.xml.ele('field', { 'name': 'LIST', 'variabletype': 'list', }, varble); visitor.xml = visitor.xml.up(); } else { makeArgument(ctx, visitor, arg, i); } } } //todo function messageShadowBlockconverter(ctx, visitor, structure) { addType(ctx, visitor, structure.opcode); let varble = visitor.infoVisitor.getString(ctx.argument[0]); let arg = structure.args[0]; let id = visitor.idManager.acquireVariableID(varble, __WEBPACK_IMPORTED_MODULE_1__IDManager__["b" /* BROADCAST */]); visitor.xml = visitor.xml.ele('value', { 'name': arg.name }); visitor.xml.ele('shadow', { 'type': "event_broadcast_menu" }).ele('field', { 'name': 'BROADCAST_OPTION', 'variabletype': "broadcast_msg", 'id': id }, varble); visitor.xml = visitor.xml.up(); } // "when I receive %1" function messageBlockconverter(ctx, visitor, structure) { if (structure.shape === "hatblock") { visitor.interruptStack(); } addType(ctx, visitor, structure.opcode); let varble = visitor.infoVisitor.getString(ctx.argument[0]); let arg = structure.args[0]; let id = visitor.idManager.acquireVariableID(varble, __WEBPACK_IMPORTED_MODULE_1__IDManager__["b" /* BROADCAST */]); visitor.xml.ele('field', { 'name': "BROADCAST_OPTION", 'variabletype': "broadcast_msg", 'id': id }, varble); if (structure.shape === "hatblock") { visitor.startStack(ctx); } } //todo function stopConverter(ctx, visitor, structure) { addType(ctx, visitor, structure.opcode); visitor.xml = visitor.xml.ele('field', { 'name': "STOP_OPTION" }, visitor.infoVisitor.getString(ctx.argument[0])); visitor.xml = visitor.xml.up(); visitor.interruptStack(ctx, false); } /***/ }), /* 50 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = stringToinputType; /* harmony export (immutable) */ __webpack_exports__["b"] = verifyInputType; /* harmony export (immutable) */ __webpack_exports__["c"] = getXMLTags; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__typeConfig__ = __webpack_require__(8); /** * Utilities for converting to and from typeConfigs. * * string -> type etc. * * @file This files defines the stringToinputType * @author Ellen Vanhove. */ const stringInputTypeMap = { "text": __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].text, "math_number": __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].NUMBER, "math_angle": __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].ANGLE, "math_integer": __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].INTEGER, "math_positive_number": __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].POSITIVE_NUMBER, "math_whole_number": __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].WHOLE_NUMBER, "colour_picker": __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].COLOR }; /* unused harmony export stringInputTypeMap */ /** * maps a string of an inputtype to an inputtype * @param text string textual version of inputtype * @returns {*} */ function stringToinputType(text) { if (stringInputTypeMap[text]) { return stringInputTypeMap[text]; } else { return __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].NONE; } } /** * returns whether a certain text matches an certain inputtype * text should already have "" or other things removed. * Ofcourse for color # is part of the color code definition so this should remain. * @param text an text * @param type an inputType * @returns {boolean} */ function verifyInputType(text, type) { switch (type) { case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].NUMBER://fallthrough (for now?) case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].ANGLE: return !/[^0-9.]/i.test(text); case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].INTEGER: return !/\./i.test(text); case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].WHOLE_NUMBER: if (/\./i.test(text)) { return false; } //fallthrough case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].POSITIVE_NUMBER: if (/[^0-9.]/i.test(text)) { return false; } let num = parseFloat(text); // "1a1" is parsed to 1 "a" is parsed to nan return num >= 0; case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].COLOR: return /#[0-F]{6}/i.test(text); case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].NONE: //everything is ok if no inputtype is specified case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].TEXT: return true; case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].BOOLEAN: case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].DROPDOWN: default: return null; //not specified, not enough information based only on the text } } /** * return the type and name of the tags related to the inputtype * @param inputType * @returns {*} */ function getXMLTags(inputType) { switch (inputType) { case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].NONE: //none is treated as text. case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].TEXT: return {type: 'text', name: 'TEXT'}; case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].NUMBER: return {type: 'math_number', name: 'NUM'}; case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].ANGLE: return {type: 'math_angle', name: 'NUM'}; case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].INTEGER: return {type: 'math_integer', name: 'NUM'}; case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].WHOLE_NUMBER: return {type: 'math_whole_number', name: 'NUM'}; case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].POSITIVE_NUMBER: return {type: 'math_positive_number', name: 'NUM'}; case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].COLOR: return {type: 'colour_picker', name: 'COLOUR'}; case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].BOOLEAN: case __WEBPACK_IMPORTED_MODULE_0__typeConfig__["b" /* INPUTTYPE */].DROPDOWN: default: return null; } } /***/ }), /* 51 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /** * config. * * Configuration parameters for developers * * @file This files defines the consts. * @author Ellen Vanhove. */ const MEDIA = '/static/blocks-media/'; /* harmony export (immutable) */ __webpack_exports__["a"] = MEDIA; /***/ }), /* 52 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! * jQuery JavaScript Library v3.3.1 * https://jquery.com/ * * Includes Sizzle.js * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * * Date: 2018-01-20T17:24Z */ ( function( global, factory ) { "use strict"; if ( typeof module === "object" && typeof module.exports === "object" ) { // For CommonJS and CommonJS-like environments where a proper `window` // is present, execute the factory and get jQuery. // For environments that do not have a `window` with a `document` // (such as Node.js), expose a factory as module.exports. // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); // See ticket #14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }; } else { factory( global ); } // Pass this if window is not defined yet } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common // enough that all such attempts are guarded in a try block. "use strict"; var arr = []; var document = window.document; var getProto = Object.getPrototypeOf; var slice = arr.slice; var concat = arr.concat; var push = arr.push; var indexOf = arr.indexOf; var class2type = {}; var toString = class2type.toString; var hasOwn = class2type.hasOwnProperty; var fnToString = hasOwn.toString; var ObjectFunctionString = fnToString.call( Object ); var support = {}; var isFunction = function isFunction( obj ) { // Support: Chrome <=57, Firefox <=52 // In some browsers, typeof returns "function" for HTML elements // (i.e., `typeof document.createElement( "object" ) === "function"`). // We don't want to classify *any* DOM node as a function. return typeof obj === "function" && typeof obj.nodeType !== "number"; }; var isWindow = function isWindow( obj ) { return obj != null && obj === obj.window; }; var preservedScriptAttributes = { type: true, src: true, noModule: true }; function DOMEval( code, doc, node ) { doc = doc || document; var i, script = doc.createElement( "script" ); script.text = code; if ( node ) { for ( i in preservedScriptAttributes ) { if ( node[ i ] ) { script[ i ] = node[ i ]; } } } doc.head.appendChild( script ).parentNode.removeChild( script ); } function toType( obj ) { if ( obj == null ) { return obj + ""; } // Support: Android <=2.3 only (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call( obj ) ] || "object" : typeof obj; } /* global Symbol */ // Defining this global in .eslintrc.json would create a danger of using the global // unguarded in another place, it seems safer to define global only for this module var version = "3.3.1", // Define a local copy of jQuery jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); }, // Support: Android <=4.0 only // Make sure we trim BOM and NBSP rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; jQuery.fn = jQuery.prototype = { // The current version of jQuery being used jquery: version, constructor: jQuery, // The default length of a jQuery object is 0 length: 0, toArray: function() { return slice.call( this ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { // Return all the elements in a clean array if ( num == null ) { return slice.call( this ); } // Return just the one element from the set return num < 0 ? this[ num + this.length ] : this[ num ]; }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems ) { // Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. each: function( callback ) { return jQuery.each( this, callback ); }, map: function( callback ) { return this.pushStack( jQuery.map( this, function( elem, i ) { return callback.call( elem, i, elem ); } ) ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ) ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); }, end: function() { return this.prevObject || this.constructor(); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: arr.sort, splice: arr.splice }; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // Skip the boolean and the target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !isFunction( target ) ) { target = {}; } // Extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( ( options = arguments[ i ] ) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject( copy ) || ( copyIsArray = Array.isArray( copy ) ) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && Array.isArray( src ) ? src : []; } else { clone = src && jQuery.isPlainObject( src ) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend( { // Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), // Assume jQuery is ready without the ready module isReady: true, error: function( msg ) { throw new Error( msg ); }, noop: function() {}, isPlainObject: function( obj ) { var proto, Ctor; // Detect obvious negatives // Use toString instead of jQuery.type to catch host objects if ( !obj || toString.call( obj ) !== "[object Object]" ) { return false; } proto = getProto( obj ); // Objects with no prototype (e.g., `Object.create( null )`) are plain if ( !proto ) { return true; } // Objects with prototype are plain iff they were constructed by a global Object function Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; }, isEmptyObject: function( obj ) { /* eslint-disable no-unused-vars */ // See https://github.com/eslint/eslint/issues/6125 var name; for ( name in obj ) { return false; } return true; }, // Evaluates a script in a global context globalEval: function( code ) { DOMEval( code ); }, each: function( obj, callback ) { var length, i = 0; if ( isArrayLike( obj ) ) { length = obj.length; for ( ; i < length; i++ ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } else { for ( i in obj ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } return obj; }, // Support: Android <=4.0 only trim: function( text ) { return text == null ? "" : ( text + "" ).replace( rtrim, "" ); }, // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; if ( arr != null ) { if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { push.call( ret, arr ); } } return ret; }, inArray: function( elem, arr, i ) { return arr == null ? -1 : indexOf.call( arr, elem, i ); }, // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; for ( ; j < len; j++ ) { first[ i++ ] = second[ j ]; } first.length = i; return first; }, grep: function( elems, callback, invert ) { var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert; // Go through the array, only saving the items // that pass the validator function for ( ; i < length; i++ ) { callbackInverse = !callback( elems[ i ], i ); if ( callbackInverse !== callbackExpect ) { matches.push( elems[ i ] ); } } return matches; }, // arg is for internal usage only map: function( elems, callback, arg ) { var length, value, i = 0, ret = []; // Go through the array, translating each of the items to their new values if ( isArrayLike( elems ) ) { length = elems.length; for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } // Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } } // Flatten any nested arrays return concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support } ); if ( typeof Symbol === "function" ) { jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; } // Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), function( i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); function isArrayLike( obj ) { // Support: real iOS 8.2 only (not reproducible in simulator) // `in` check used to prevent JIT error (gh-2145) // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE var length = !!obj && "length" in obj && obj.length, type = toType( obj ); if ( isFunction( obj ) || isWindow( obj ) ) { return false; } return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var Sizzle = /*! * Sizzle CSS Selector Engine v2.3.3 * https://sizzlejs.com/ * * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2016-08-08 */ (function( window ) { var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, // Local document vars setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains, // Instance-specific data expando = "sizzle" + 1 * new Date(), preferredDoc = window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; } return 0; }, // Instance methods hasOwn = ({}).hasOwnProperty, arr = [], pop = arr.pop, push_native = arr.push, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf as it's faster than native // https://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; for ( ; i < len; i++ ) { if ( list[i] === elem ) { return i; } } return -1; }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", // Regular expressions // http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) ".*" + ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { "ID": new RegExp( "^#(" + identifier + ")" ), "CLASS": new RegExp( "^\\.(" + identifier + ")" ), "TAG": new RegExp( "^(" + identifier + "|[*])" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, // CSS escapes // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), funescape = function( _, escaped, escapedWhitespace ) { var high = "0x" + escaped - 0x10000; // NaN means non-codepoint // Support: Firefox<24 // Workaround erroneous numeric interpretation of +"0x" return high !== high || escapedWhitespace ? escaped : high < 0 ? // BMP codepoint String.fromCharCode( high + 0x10000 ) : // Supplemental Plane codepoint (surrogate pair) String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, // CSS string/identifier serialization // https://drafts.csswg.org/cssom/#common-serializing-idioms rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, fcssescape = function( ch, asCodePoint ) { if ( asCodePoint ) { // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER if ( ch === "\0" ) { return "\uFFFD"; } // Control characters and (dependent upon position) numbers get escaped as code points return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; } // Other potentially-special ASCII characters get backslash-escaped return "\\" + ch; }, // Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE unloadHandler = function() { setDocument(); }, disabledAncestor = addCombinator( function( elem ) { return elem.disabled === true && ("form" in elem || "label" in elem); }, { dir: "parentNode", next: "legend" } ); // Optimize for push.apply( _, NodeList ) try { push.apply( (arr = slice.call( preferredDoc.childNodes )), preferredDoc.childNodes ); // Support: Android<4.0 // Detect silently failing push.apply arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { push = { apply: arr.length ? // Leverage slice if possible function( target, els ) { push_native.apply( target, slice.call(els) ); } : // Support: IE<9 // Otherwise append directly function( target, els ) { var j = target.length, i = 0; // Can't trust NodeList.length while ( (target[j++] = els[i++]) ) {} target.length = j - 1; } }; } function Sizzle( selector, context, results, seed ) { var m, i, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, // nodeType defaults to 9, since context defaults to document nodeType = context ? context.nodeType : 9; results = results || []; // Return early from calls with invalid selector or context if ( typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { return results; } // Try to shortcut find operations (as opposed to filters) in HTML documents if ( !seed ) { if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { setDocument( context ); } context = context || document; if ( documentIsHTML ) { // If the selector is sufficiently simple, try using a "get*By*" DOM method // (excepting DocumentFragment context, where the methods don't exist) if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { // ID selector if ( (m = match[1]) ) { // Document context if ( nodeType === 9 ) { if ( (elem = context.getElementById( m )) ) { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; } // Element context } else { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( newContext && (elem = newContext.getElementById( m )) && contains( context, elem ) && elem.id === m ) { results.push( elem ); return results; } } // Type selector } else if ( match[2] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results; // Class selector } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // Take advantage of querySelectorAll if ( support.qsa && !compilerCache[ selector + " " ] && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { if ( nodeType !== 1 ) { newContext = context; newSelector = selector; // qSA looks outside Element context, which is not what we want // Thanks to Andrew Dupont for this workaround technique // Support: IE <=8 // Exclude object elements } else if ( context.nodeName.toLowerCase() !== "object" ) { // Capture the context ID, setting it first if necessary if ( (nid = context.getAttribute( "id" )) ) { nid = nid.replace( rcssescape, fcssescape ); } else { context.setAttribute( "id", (nid = expando) ); } // Prefix every selector in the list groups = tokenize( selector ); i = groups.length; while ( i-- ) { groups[i] = "#" + nid + " " + toSelector( groups[i] ); } newSelector = groups.join( "," ); // Expand context for sibling selectors newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; } if ( newSelector ) { try { push.apply( results, newContext.querySelectorAll( newSelector ) ); return results; } catch ( qsaError ) { } finally { if ( nid === expando ) { context.removeAttribute( "id" ); } } } } } } // All others return select( selector.replace( rtrim, "$1" ), context, results, seed ); } /** * Create key-value caches of limited size * @returns {function(string, object)} Returns the Object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) * deleting the oldest entry */ function createCache() { var keys = []; function cache( key, value ) { // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries delete cache[ keys.shift() ]; } return (cache[ key + " " ] = value); } return cache; } /** * Mark a function for special use by Sizzle * @param {Function} fn The function to mark */ function markFunction( fn ) { fn[ expando ] = true; return fn; } /** * Support testing using an element * @param {Function} fn Passed the created element and returns a boolean result */ function assert( fn ) { var el = document.createElement("fieldset"); try { return !!fn( el ); } catch (e) { return false; } finally { // Remove from its parent by default if ( el.parentNode ) { el.parentNode.removeChild( el ); } // release memory in IE el = null; } } /** * Adds the same handler for all of the specified attrs * @param {String} attrs Pipe-separated list of attributes * @param {Function} handler The method that will be applied */ function addHandle( attrs, handler ) { var arr = attrs.split("|"), i = arr.length; while ( i-- ) { Expr.attrHandle[ arr[i] ] = handler; } } /** * Checks document order of two siblings * @param {Element} a * @param {Element} b * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b */ function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && a.sourceIndex - b.sourceIndex; // Use IE sourceIndex if available on both nodes if ( diff ) { return diff; } // Check if b follows a if ( cur ) { while ( (cur = cur.nextSibling) ) { if ( cur === b ) { return -1; } } } return a ? 1 : -1; } /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === type; }; } /** * Returns a function to use in pseudos for buttons * @param {String} type */ function createButtonPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && elem.type === type; }; } /** * Returns a function to use in pseudos for :enabled/:disabled * @param {Boolean} disabled true for :disabled; false for :enabled */ function createDisabledPseudo( disabled ) { // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable return function( elem ) { // Only certain elements can match :enabled or :disabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled if ( "form" in elem ) { // Check for inherited disabledness on relevant non-disabled elements: // * listed form-associated elements in a disabled fieldset // https://html.spec.whatwg.org/multipage/forms.html#category-listed // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled // * option elements in a disabled optgroup // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled // All such elements have a "form" property. if ( elem.parentNode && elem.disabled === false ) { // Option elements defer to a parent optgroup if present if ( "label" in elem ) { if ( "label" in elem.parentNode ) { return elem.parentNode.disabled === disabled; } else { return elem.disabled === disabled; } } // Support: IE 6 - 11 // Use the isDisabled shortcut property to check for disabled fieldset ancestors return elem.isDisabled === disabled || // Where there is no isDisabled, check manually /* jshint -W018 */ elem.isDisabled !== !disabled && disabledAncestor( elem ) === disabled; } return elem.disabled === disabled; // Try to winnow out elements that can't be disabled before trusting the disabled property. // Some victims get caught in our net (label, legend, menu, track), but it shouldn't // even exist on them, let alone have a boolean value. } else if ( "label" in elem ) { return elem.disabled === disabled; } // Remaining elements are neither :enabled nor :disabled return false; }; } /** * Returns a function to use in pseudos for positionals * @param {Function} fn */ function createPositionalPseudo( fn ) { return markFunction(function( argument ) { argument = +argument; return markFunction(function( seed, matches ) { var j, matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length; // Match elements found at the specified indexes while ( i-- ) { if ( seed[ (j = matchIndexes[i]) ] ) { seed[j] = !(matches[j] = seed[j]); } } }); }); } /** * Checks a node for validity as a Sizzle context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } // Expose support vars for convenience support = Sizzle.support = {}; /** * Detects XML nodes * @param {Element|Object} elem An element or a document * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = elem && (elem.ownerDocument || elem).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; /** * Sets document-related variables once based on the current document * @param {Element|Object} [doc] An element or document object to use to set the document * @returns {Object} Returns the current document */ setDocument = Sizzle.setDocument = function( node ) { var hasCompare, subWindow, doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } // Update global variables document = doc; docElem = document.documentElement; documentIsHTML = !isXML( document ); // Support: IE 9-11, Edge // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) if ( preferredDoc !== document && (subWindow = document.defaultView) && subWindow.top !== subWindow ) { // Support: IE 11, Edge if ( subWindow.addEventListener ) { subWindow.addEventListener( "unload", unloadHandler, false ); // Support: IE 9 - 10 only } else if ( subWindow.attachEvent ) { subWindow.attachEvent( "onunload", unloadHandler ); } } /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties // (excepting IE8 booleans) support.attributes = assert(function( el ) { el.className = "i"; return !el.getAttribute("className"); }); /* getElement(s)By* ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements support.getElementsByTagName = assert(function( el ) { el.appendChild( document.createComment("") ); return !el.getElementsByTagName("*").length; }); // Support: IE<9 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); // Support: IE<10 // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programmatically-set names, // so use a roundabout getElementsByName test support.getById = assert(function( el ) { docElem.appendChild( el ).id = expando; return !document.getElementsByName || !document.getElementsByName( expando ).length; }); // ID filter and find if ( support.getById ) { Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute("id") === attrId; }; }; Expr.find["ID"] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var elem = context.getElementById( id ); return elem ? [ elem ] : []; } }; } else { Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return node && node.value === attrId; }; }; // Support: IE 6 - 7 only // getElementById is not reliable as a find shortcut Expr.find["ID"] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var node, i, elems, elem = context.getElementById( id ); if ( elem ) { // Verify the id attribute node = elem.getAttributeNode("id"); if ( node && node.value === id ) { return [ elem ]; } // Fall back on getElementsByName elems = context.getElementsByName( id ); i = 0; while ( (elem = elems[i++]) ) { node = elem.getAttributeNode("id"); if ( node && node.value === id ) { return [ elem ]; } } } return []; } }; } // Tag Expr.find["TAG"] = support.getElementsByTagName ? function( tag, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( tag ); // DocumentFragment nodes don't have gEBTN } else if ( support.qsa ) { return context.querySelectorAll( tag ); } } : function( tag, context ) { var elem, tmp = [], i = 0, // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too results = context.getElementsByTagName( tag ); // Filter out possible comments if ( tag === "*" ) { while ( (elem = results[i++]) ) { if ( elem.nodeType === 1 ) { tmp.push( elem ); } } return tmp; } return results; }; // Class Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } }; /* QSA/matchesSelector ---------------------------------------------------------------------- */ // QSA and matchesSelector support // matchesSelector(:active) reports false when true (IE9/Opera 11.5) rbuggyMatches = []; // qSa(:focus) reports false when true (Chrome 21) // We allow this because of a bug in IE8/9 that throws an error // whenever `document.activeElement` is accessed on an iframe // So, we allow :focus to pass through QSA all the time to avoid the IE error // See https://bugs.jquery.com/ticket/13378 rbuggyQSA = []; if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { // Build QSA regex // Regex strategy adopted from Diego Perini assert(function( el ) { // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // https://bugs.jquery.com/ticket/12359 docElem.appendChild( el ).innerHTML = "" + ""; // Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section if ( el.querySelectorAll("[msallowcapture^='']").length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly if ( !el.querySelectorAll("[selected]").length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push("~="); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests if ( !el.querySelectorAll(":checked").length ) { rbuggyQSA.push(":checked"); } // Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 // In-page `selector#id sibling-combinator selector` fails if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { rbuggyQSA.push(".#.+[+~]"); } }); assert(function( el ) { el.innerHTML = "" + ""; // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment var input = document.createElement("input"); input.setAttribute( "type", "hidden" ); el.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute if ( el.querySelectorAll("[name=d]").length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests if ( el.querySelectorAll(":enabled").length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Support: IE9-11+ // IE's :disabled selector does not pick up the children of disabled fieldsets docElem.appendChild( el ).disabled = true; if ( el.querySelectorAll(":disabled").length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Opera 10-11 does not throw on post-comma invalid pseudos el.querySelectorAll("*,:x"); rbuggyQSA.push(",.*:"); }); } if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector) )) ) { assert(function( el ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) support.disconnectedMatch = matches.call( el, "*" ); // This should fail with an exception // Gecko does not error, returns false instead matches.call( el, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); }); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); /* Contains ---------------------------------------------------------------------- */ hasCompare = rnative.test( docElem.compareDocumentPosition ); // Element contains another // Purposefully self-exclusive // As in, an element does not contain itself contains = hasCompare || rnative.test( docElem.contains ) ? function( a, b ) { var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode; return a === bup || !!( bup && bup.nodeType === 1 && ( adown.contains ? adown.contains( bup ) : a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 )); } : function( a, b ) { if ( b ) { while ( (b = b.parentNode) ) { if ( b === a ) { return true; } } } return false; }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting sortOrder = hasCompare ? function( a, b ) { // Flag for duplicate removal if ( a === b ) { hasDuplicate = true; return 0; } // Sort on method existence if only one input has compareDocumentPosition var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; if ( compare ) { return compare; } // Calculate position if both inputs belong to the same document compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? a.compareDocumentPosition( b ) : // Otherwise we know they are disconnected 1; // Disconnected nodes if ( compare & 1 || (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { // Choose the first element that is related to our preferred document if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { return -1; } if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { return 1; } // Maintain original order return sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; } : function( a, b ) { // Exit early if the nodes are identical if ( a === b ) { hasDuplicate = true; return 0; } var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [ a ], bp = [ b ]; // Parentless nodes are either documents or disconnected if ( !aup || !bup ) { return a === document ? -1 : b === document ? 1 : aup ? -1 : bup ? 1 : sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; // If the nodes are siblings, we can do a quick check } else if ( aup === bup ) { return siblingCheck( a, b ); } // Otherwise we need full lists of their ancestors for comparison cur = a; while ( (cur = cur.parentNode) ) { ap.unshift( cur ); } cur = b; while ( (cur = cur.parentNode) ) { bp.unshift( cur ); } // Walk down the tree looking for a discrepancy while ( ap[i] === bp[i] ) { i++; } return i ? // Do a sibling check if the nodes have a common ancestor siblingCheck( ap[i], bp[i] ) : // Otherwise nodes in our document sort first ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0; }; return document; }; Sizzle.matches = function( expr, elements ) { return Sizzle( expr, null, null, elements ); }; Sizzle.matchesSelector = function( elem, expr ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } // Make sure that attribute selectors are quoted expr = expr.replace( rattributeQuotes, "='$1']" ); if ( support.matchesSelector && documentIsHTML && !compilerCache[ expr + " " ] && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9 elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch (e) {} } return Sizzle( expr, document, null, [ elem ] ).length > 0; }; Sizzle.contains = function( context, elem ) { // Set document vars if needed if ( ( context.ownerDocument || context ) !== document ) { setDocument( context ); } return contains( context, elem ); }; Sizzle.attr = function( elem, name ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } var fn = Expr.attrHandle[ name.toLowerCase() ], // Don't get fooled by Object.prototype properties (jQuery #13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute( name ) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null; }; Sizzle.escape = function( sel ) { return (sel + "").replace( rcssescape, fcssescape ); }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Document sorting and removing duplicates * @param {ArrayLike} results */ Sizzle.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence hasDuplicate = !support.detectDuplicates; sortInput = !support.sortStable && results.slice( 0 ); results.sort( sortOrder ); if ( hasDuplicate ) { while ( (elem = results[i++]) ) { if ( elem === results[ i ] ) { j = duplicates.push( i ); } } while ( j-- ) { results.splice( duplicates[ j ], 1 ); } } // Clear input after sorting to release objects // See https://github.com/jquery/sizzle/pull/225 sortInput = null; return results; }; /** * Utility function for retrieving the text value of an array of DOM nodes * @param {Array|Element} elem */ getText = Sizzle.getText = function( elem ) { var node, ret = "", i = 0, nodeType = elem.nodeType; if ( !nodeType ) { // If no nodeType, this is expected to be an array while ( (node = elem[i++]) ) { // Do not traverse comment nodes ret += getText( node ); } } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent for elements // innerText usage removed for consistency of new lines (jQuery #11153) if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { // Traverse its children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } // Do not include comment or processing instruction nodes return ret; }; Expr = Sizzle.selectors = { // Can be adjusted by the user cacheLength: 50, createPseudo: markFunction, match: matchExpr, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: true }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: true }, "~": { dir: "previousSibling" } }, preFilter: { "ATTR": function( match ) { match[1] = match[1].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); if ( match[2] === "~=" ) { match[3] = " " + match[3] + " "; } return match.slice( 0, 4 ); }, "CHILD": function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 4 xn-component of xn+y argument ([+-]?\d*n|) 5 sign of xn-component 6 x of xn-component 7 sign of y-component 8 y of y-component */ match[1] = match[1].toLowerCase(); if ( match[1].slice( 0, 3 ) === "nth" ) { // nth-* requires argument if ( !match[3] ) { Sizzle.error( match[0] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); // other types prohibit arguments } else if ( match[3] ) { Sizzle.error( match[0] ); } return match; }, "PSEUDO": function( match ) { var excess, unquoted = !match[6] && match[2]; if ( matchExpr["CHILD"].test( match[0] ) ) { return null; } // Accept quoted arguments as-is if ( match[3] ) { match[2] = match[4] || match[5] || ""; // Strip excess characters from unquoted arguments } else if ( unquoted && rpseudo.test( unquoted ) && // Get excess from tokenize (recursively) (excess = tokenize( unquoted, true )) && // advance to the next closing parenthesis (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { // excess is a negative index match[0] = match[0].slice( 0, excess ); match[2] = unquoted.slice( 0, excess ); } // Return only captures needed by the pseudo filter method (type and argument) return match.slice( 0, 3 ); } }, filter: { "TAG": function( nodeNameSelector ) { var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; }, "CLASS": function( className ) { var pattern = classCache[ className + " " ]; return pattern || (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && classCache( className, function( elem ) { return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); }); }, "ATTR": function( name, operator, check ) { return function( elem ) { var result = Sizzle.attr( elem, name ); if ( result == null ) { return operator === "!="; } if ( !operator ) { return true; } result += ""; return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "*=" ? check && result.indexOf( check ) > -1 : operator === "$=" ? check && result.slice( -check.length ) === check : operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; }; }, "CHILD": function( type, what, argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; return first === 1 && last === 0 ? // Shortcut for :nth-*(n) function( elem ) { return !!elem.parentNode; } : function( elem, context, xml ) { var cache, uniqueCache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType, diff = false; if ( parent ) { // :(first|last|only)-(child|of-type) if ( simple ) { while ( dir ) { node = elem; while ( (node = node[ dir ]) ) { if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { return false; } } // Reverse direction for :only-* (if we haven't yet done so) start = dir = type === "only" && !start && "nextSibling"; } return true; } start = [ forward ? parent.firstChild : parent.lastChild ]; // non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) { // Seek `elem` from a previously-cached index // ...in a gzip-friendly way node = parent; outerCache = node[ expando ] || (node[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {}); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ]; while ( (node = ++nodeIndex && node && node[ dir ] || // Fallback to seeking `elem` from the start (diff = nodeIndex = 0) || start.pop()) ) { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } } else { // Use previously-cached element index if available if ( useCache ) { // ...in a gzip-friendly way node = elem; outerCache = node[ expando ] || (node[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {}); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex; } // xml :nth-child(...) // or :nth-last-child(...) or :nth(-last)?-of-type(...) if ( diff === false ) { // Use the same loop as above to seek `elem` from the start while ( (node = ++nodeIndex && node && node[ dir ] || (diff = nodeIndex = 0) || start.pop()) ) { if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { // Cache the index of each encountered element if ( useCache ) { outerCache = node[ expando ] || (node[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {}); uniqueCache[ type ] = [ dirruns, diff ]; } if ( node === elem ) { break; } } } } } // Incorporate the offset, then check against cycle size diff -= last; return diff === first || ( diff % first === 0 && diff / first >= 0 ); } }; }, "PSEUDO": function( pseudo, argument ) { // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || Sizzle.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as Sizzle does if ( fn[ expando ] ) { return fn( argument ); } // But maintain support for old signatures if ( fn.length > 1 ) { args = [ pseudo, pseudo, "", argument ]; return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? markFunction(function( seed, matches ) { var idx, matched = fn( seed, argument ), i = matched.length; while ( i-- ) { idx = indexOf( seed, matched[i] ); seed[ idx ] = !( matches[ idx ] = matched[i] ); } }) : function( elem ) { return fn( elem, 0, args ); }; } return fn; } }, pseudos: { // Potentially complex pseudos "not": markFunction(function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], matcher = compile( selector.replace( rtrim, "$1" ) ); return matcher[ expando ] ? markFunction(function( seed, matches, context, xml ) { var elem, unmatched = matcher( seed, null, xml, [] ), i = seed.length; // Match elements unmatched by `matcher` while ( i-- ) { if ( (elem = unmatched[i]) ) { seed[i] = !(matches[i] = elem); } } }) : function( elem, context, xml ) { input[0] = elem; matcher( input, null, xml, results ); // Don't keep the element (issue #299) input[0] = null; return !results.pop(); }; }), "has": markFunction(function( selector ) { return function( elem ) { return Sizzle( selector, elem ).length > 0; }; }), "contains": markFunction(function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; }; }), // "Whether an element is represented by a :lang() selector // is based solely on the element's language value // being equal to the identifier C, // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo "lang": markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test(lang || "") ) { Sizzle.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { var elemLang; do { if ( (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { elemLang = elemLang.toLowerCase(); return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); return false; }; }), // Miscellaneous "target": function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, "root": function( elem ) { return elem === docElem; }, "focus": function( elem ) { return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); }, // Boolean properties "enabled": createDisabledPseudo( false ), "disabled": createDisabledPseudo( true ), "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); }, "selected": function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, // Contents "empty": function( elem ) { // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { if ( elem.nodeType < 6 ) { return false; } } return true; }, "parent": function( elem ) { return !Expr.pseudos["empty"]( elem ); }, // Element/input types "header": function( elem ) { return rheader.test( elem.nodeName ); }, "input": function( elem ) { return rinputs.test( elem.nodeName ); }, "button": function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === "button" || name === "button"; }, "text": function( elem ) { var attr; return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && // Support: IE<8 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); }, // Position-in-collection "first": createPositionalPseudo(function() { return [ 0 ]; }), "last": createPositionalPseudo(function( matchIndexes, length ) { return [ length - 1 ]; }), "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; }), "even": createPositionalPseudo(function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "odd": createPositionalPseudo(function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; }), "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); } return matchIndexes; }) } }; Expr.pseudos["nth"] = Expr.pseudos["eq"]; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { Expr.pseudos[ i ] = createInputPseudo( i ); } for ( i in { submit: true, reset: true } ) { Expr.pseudos[ i ] = createButtonPseudo( i ); } // Easy API for creating new setFilters function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); tokenize = Sizzle.tokenize = function( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; if ( cached ) { return parseOnly ? 0 : cached.slice( 0 ); } soFar = selector; groups = []; preFilters = Expr.preFilter; while ( soFar ) { // Comma and first run if ( !matched || (match = rcomma.exec( soFar )) ) { if ( match ) { // Don't consume trailing commas as valid soFar = soFar.slice( match[0].length ) || soFar; } groups.push( (tokens = []) ); } matched = false; // Combinators if ( (match = rcombinators.exec( soFar )) ) { matched = match.shift(); tokens.push({ value: matched, // Cast descendant combinators to space type: match[0].replace( rtrim, " " ) }); soFar = soFar.slice( matched.length ); } // Filters for ( type in Expr.filter ) { if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || (match = preFilters[ type ]( match ))) ) { matched = match.shift(); tokens.push({ value: matched, type: type, matches: match }); soFar = soFar.slice( matched.length ); } } if ( !matched ) { break; } } // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens return parseOnly ? soFar.length : soFar ? Sizzle.error( selector ) : // Cache the tokens tokenCache( selector, groups ).slice( 0 ); }; function toSelector( tokens ) { var i = 0, len = tokens.length, selector = ""; for ( ; i < len; i++ ) { selector += tokens[i].value; } return selector; } function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, skip = combinator.next, key = skip || dir, checkNonElements = base && key === "parentNode", doneName = done++; return combinator.first ? // Check against closest ancestor/preceding element function( elem, context, xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { return matcher( elem, context, xml ); } } return false; } : // Check against all ancestor/preceding elements function( elem, context, xml ) { var oldCache, uniqueCache, outerCache, newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching if ( xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { if ( matcher( elem, context, xml ) ) { return true; } } } } else { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || (elem[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); if ( skip && skip === elem.nodeName.toLowerCase() ) { elem = elem[ dir ] || elem; } else if ( (oldCache = uniqueCache[ key ]) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements return (newCache[ 2 ] = oldCache[ 2 ]); } else { // Reuse newcache so results back-propagate to previous elements uniqueCache[ key ] = newCache; // A match means we're done; a fail means we have to keep checking if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { return true; } } } } } return false; }; } function elementMatcher( matchers ) { return matchers.length > 1 ? function( elem, context, xml ) { var i = matchers.length; while ( i-- ) { if ( !matchers[i]( elem, context, xml ) ) { return false; } } return true; } : matchers[0]; } function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { Sizzle( selector, contexts[i], results ); } return results; } function condense( unmatched, map, filter, context, xml ) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null; for ( ; i < len; i++ ) { if ( (elem = unmatched[i]) ) { if ( !filter || filter( elem, context, xml ) ) { newUnmatched.push( elem ); if ( mapped ) { map.push( i ); } } } } return newUnmatched; } function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { if ( postFilter && !postFilter[ expando ] ) { postFilter = setMatcher( postFilter ); } if ( postFinder && !postFinder[ expando ] ) { postFinder = setMatcher( postFinder, postSelector ); } return markFunction(function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : elems, matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, postFinder || ( seed ? preFilter : preexisting || postFilter ) ? // ...intermediate processing is necessary [] : // ...otherwise use results directly results : matcherIn; // Find primary matches if ( matcher ) { matcher( matcherIn, matcherOut, context, xml ); } // Apply postFilter if ( postFilter ) { temp = condense( matcherOut, postMap ); postFilter( temp, [], context, xml ); // Un-match failing elements by moving them back to matcherIn i = temp.length; while ( i-- ) { if ( (elem = temp[i]) ) { matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); } } } if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) ) { // Restore matcherIn since elem is not yet a final match temp.push( (matcherIn[i] = elem) ); } } postFinder( null, (matcherOut = []), temp, xml ); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) && (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { seed[temp] = !(results[temp] = elem); } } } // Add elements to results, through postFinder if defined } else { matcherOut = condense( matcherOut === results ? matcherOut.splice( preexisting, matcherOut.length ) : matcherOut ); if ( postFinder ) { postFinder( null, results, matcherOut, xml ); } else { push.apply( results, matcherOut ); } } }); } function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[ tokens[0].type ], implicitRelative = leadingRelative || Expr.relative[" "], i = leadingRelative ? 1 : 0, // The foundational matcher ensures that elements are reachable from top-level context(s) matchContext = addCombinator( function( elem ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { return indexOf( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( (checkContext = context).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); // Avoid hanging onto element (issue #299) checkContext = null; return ret; } ]; for ( ; i < len; i++ ) { if ( (matcher = Expr.relative[ tokens[i].type ]) ) { matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; } else { matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); // Return special upon seeing a positional matcher if ( matcher[ expando ] ) { // Find the next relative operator (if any) for proper handling j = ++i; for ( ; j < len; j++ ) { if ( Expr.relative[ tokens[j].type ] ) { break; } } return setMatcher( i > 1 && elementMatcher( matchers ), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) ).replace( rtrim, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), j < len && toSelector( tokens ) ); } matchers.push( matcher ); } } return elementMatcher( matchers ); } function matcherFromGroupMatchers( elementMatchers, setMatchers ) { var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function( seed, context, xml, results, outermost ) { var elem, j, matcher, matchedCount = 0, i = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, // We must always have either seed elements or outermost context elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), len = elems.length; if ( outermost ) { outermostContext = context === document || context || outermost; } // Add elements passing elementMatchers directly to results // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id for ( ; i !== len && (elem = elems[i]) != null; i++ ) { if ( byElement && elem ) { j = 0; if ( !context && elem.ownerDocument !== document ) { setDocument( elem ); xml = !documentIsHTML; } while ( (matcher = elementMatchers[j++]) ) { if ( matcher( elem, context || document, xml) ) { results.push( elem ); break; } } if ( outermost ) { dirruns = dirrunsUnique; } } // Track unmatched elements for set filters if ( bySet ) { // They will have gone through all possible matchers if ( (elem = !matcher && elem) ) { matchedCount--; } // Lengthen the array for every element, matched or not if ( seed ) { unmatched.push( elem ); } } } // `i` is now the count of elements visited above, and adding it to `matchedCount` // makes the latter nonnegative. matchedCount += i; // Apply set filters to unmatched elements // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` // equals `i`), unless we didn't visit _any_ elements in the above loop because we have // no element matchers and no seed. // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that // case, which will result in a "00" `matchedCount` that differs from `i` but is also // numerically zero. if ( bySet && i !== matchedCount ) { j = 0; while ( (matcher = setMatchers[j++]) ) { matcher( unmatched, setMatched, context, xml ); } if ( seed ) { // Reintegrate element matches to eliminate the need for sorting if ( matchedCount > 0 ) { while ( i-- ) { if ( !(unmatched[i] || setMatched[i]) ) { setMatched[i] = pop.call( results ); } } } // Discard index placeholder values to get only actual matches setMatched = condense( setMatched ); } // Add matches to results push.apply( results, setMatched ); // Seedless set matches succeeding multiple successful matchers stipulate sorting if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { Sizzle.uniqueSort( results ); } } // Override manipulation of globals by nested matchers if ( outermost ) { dirruns = dirrunsUnique; outermostContext = contextBackup; } return unmatched; }; return bySet ? markFunction( superMatcher ) : superMatcher; } compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], cached = compilerCache[ selector + " " ]; if ( !cached ) { // Generate a function of recursive functions that can be used to check each element if ( !match ) { match = tokenize( selector ); } i = match.length; while ( i-- ) { cached = matcherFromTokens( match[i] ); if ( cached[ expando ] ) { setMatchers.push( cached ); } else { elementMatchers.push( cached ); } } // Cache the compiled function cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; } return cached; }; /** * A low-level selection function that works with Sizzle's compiled * selector functions * @param {String|Function} selector A selector or a pre-compiled * selector function built with Sizzle.compile * @param {Element} context * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ select = Sizzle.select = function( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( (selector = compiled.selector || selector) ); results = results || []; // Try to minimize operations if there is only one selector in the list and no seed // (the latter of which guarantees us context) if ( match.length === 1 ) { // Reduce context if the leading compound selector is an ID tokens = match[0] = match[0].slice( 0 ); if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; if ( !context ) { return results; // Precompiled matchers will still verify ancestry, so step up a level } else if ( compiled ) { context = context.parentNode; } selector = selector.slice( tokens.shift().value.length ); } // Fetch a seed set for right-to-left matching i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[i]; // Abort if we hit a combinator if ( Expr.relative[ (type = token.type) ] ) { break; } if ( (find = Expr.find[ type ]) ) { // Search, expanding context for leading sibling combinators if ( (seed = find( token.matches[0].replace( runescape, funescape ), rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context )) ) { // If seed is empty or no tokens remain, we can return early tokens.splice( i, 1 ); selector = seed.length && toSelector( tokens ); if ( !selector ) { push.apply( results, seed ); return results; } break; } } } } // Compile and execute a filtering function if one is not provided // Provide `match` to avoid retokenization if we modified the selector above ( compiled || compile( selector, match ) )( seed, context, !documentIsHTML, results, !context || rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; }; // One-time assignments // Sort stability support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; // Support: Chrome 14-35+ // Always assume duplicates if they aren't passed to the comparison function support.detectDuplicates = !!hasDuplicate; // Initialize against the default document setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* support.sortDetached = assert(function( el ) { // Should return 1, but returns 4 (following) return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; }); // Support: IE<8 // Prevent attribute/property "interpolation" // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx if ( !assert(function( el ) { el.innerHTML = ""; return el.firstChild.getAttribute("href") === "#" ; }) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } }); } // Support: IE<9 // Use defaultValue in place of getAttribute("value") if ( !support.attributes || !assert(function( el ) { el.innerHTML = ""; el.firstChild.setAttribute( "value", "" ); return el.firstChild.getAttribute( "value" ) === ""; }) ) { addHandle( "value", function( elem, name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } }); } // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies if ( !assert(function( el ) { return el.getAttribute("disabled") == null; }) ) { addHandle( booleans, function( elem, name, isXML ) { var val; if ( !isXML ) { return elem[ name ] === true ? name.toLowerCase() : (val = elem.getAttributeNode( name )) && val.specified ? val.value : null; } }); } return Sizzle; })( window ); jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; // Deprecated jQuery.expr[ ":" ] = jQuery.expr.pseudos; jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; jQuery.escapeSelector = Sizzle.escape; var dir = function( elem, dir, until ) { var matched = [], truncate = until !== undefined; while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { if ( elem.nodeType === 1 ) { if ( truncate && jQuery( elem ).is( until ) ) { break; } matched.push( elem ); } } return matched; }; var siblings = function( n, elem ) { var matched = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { matched.push( n ); } } return matched; }; var rneedsContext = jQuery.expr.match.needsContext; function nodeName( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }; var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { if ( isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { return !!qualifier.call( elem, i, elem ) !== not; } ); } // Single element if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; } ); } // Arraylike of elements (jQuery, arguments, Array) if ( typeof qualifier !== "string" ) { return jQuery.grep( elements, function( elem ) { return ( indexOf.call( qualifier, elem ) > -1 ) !== not; } ); } // Filtered directly for both simple and complex selectors return jQuery.filter( qualifier, elements, not ); } jQuery.filter = function( expr, elems, not ) { var elem = elems[ 0 ]; if ( not ) { expr = ":not(" + expr + ")"; } if ( elems.length === 1 && elem.nodeType === 1 ) { return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; } return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; } ) ); }; jQuery.fn.extend( { find: function( selector ) { var i, ret, len = this.length, self = this; if ( typeof selector !== "string" ) { return this.pushStack( jQuery( selector ).filter( function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } } ) ); } ret = this.pushStack( [] ); for ( i = 0; i < len; i++ ) { jQuery.find( selector, self[ i ], ret ); } return len > 1 ? jQuery.uniqueSort( ret ) : ret; }, filter: function( selector ) { return this.pushStack( winnow( this, selector || [], false ) ); }, not: function( selector ) { return this.pushStack( winnow( this, selector || [], true ) ); }, is: function( selector ) { return !!winnow( this, // If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". typeof selector === "string" && rneedsContext.test( selector ) ? jQuery( selector ) : selector || [], false ).length; } } ); // Initialize a jQuery object // A central reference to the root jQuery(document) var rootjQuery, // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) // Shortcut simple #id case for speed rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, init = jQuery.fn.init = function( selector, context, root ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } // Method init() accepts an alternate rootjQuery // so migrate can support jQuery.sub (gh-2101) root = root || rootjQuery; // Handle HTML strings if ( typeof selector === "string" ) { if ( selector[ 0 ] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = rquickExpr.exec( selector ); } // Match html or make sure no context is specified for #id if ( match && ( match[ 1 ] || !context ) ) { // HANDLE: $(html) -> $(array) if ( match[ 1 ] ) { context = context instanceof jQuery ? context[ 0 ] : context; // Option to run scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( match[ 1 ], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { // Properties of context are called as methods if possible if ( isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes } else { this.attr( match, context[ match ] ); } } } return this; // HANDLE: $(#id) } else { elem = document.getElementById( match[ 2 ] ); if ( elem ) { // Inject the element directly into the jQuery object this[ 0 ] = elem; this.length = 1; } return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || root ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { this[ 0 ] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready } else if ( isFunction( selector ) ) { return root.ready !== undefined ? root.ready( selector ) : // Execute immediately if ready is not present selector( jQuery ); } return jQuery.makeArray( selector, this ); }; // Give the init function the jQuery prototype for later instantiation init.prototype = jQuery.fn; // Initialize central reference rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, // Methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend( { has: function( target ) { var targets = jQuery( target, this ), l = targets.length; return this.filter( function() { var i = 0; for ( ; i < l; i++ ) { if ( jQuery.contains( this, targets[ i ] ) ) { return true; } } } ); }, closest: function( selectors, context ) { var cur, i = 0, l = this.length, matched = [], targets = typeof selectors !== "string" && jQuery( selectors ); // Positional selectors never match, since there's no _selection_ context if ( !rneedsContext.test( selectors ) ) { for ( ; i < l; i++ ) { for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { // Always skip document fragments if ( cur.nodeType < 11 && ( targets ? targets.index( cur ) > -1 : // Don't pass non-elements to Sizzle cur.nodeType === 1 && jQuery.find.matchesSelector( cur, selectors ) ) ) { matched.push( cur ); break; } } } } return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); }, // Determine the position of an element within the set index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; } // Index in selector if ( typeof elem === "string" ) { return indexOf.call( jQuery( elem ), this[ 0 ] ); } // Locate the position of the desired element return indexOf.call( this, // If it receives a jQuery object, the first element is used elem.jquery ? elem[ 0 ] : elem ); }, add: function( selector, context ) { return this.pushStack( jQuery.uniqueSort( jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); }, addBack: function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter( selector ) ); } } ); function sibling( cur, dir ) { while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} return cur; } jQuery.each( { parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); }, prev: function( elem ) { return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { return dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return siblings( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return siblings( elem.firstChild ); }, contents: function( elem ) { if ( nodeName( elem, "iframe" ) ) { return elem.contentDocument; } // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only // Treat the template element as a regular one in browsers that // don't support it. if ( nodeName( elem, "template" ) ) { elem = elem.content || elem; } return jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var matched = jQuery.map( this, fn, until ); if ( name.slice( -5 ) !== "Until" ) { selector = until; } if ( selector && typeof selector === "string" ) { matched = jQuery.filter( selector, matched ); } if ( this.length > 1 ) { // Remove duplicates if ( !guaranteedUnique[ name ] ) { jQuery.uniqueSort( matched ); } // Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { matched.reverse(); } } return this.pushStack( matched ); }; } ); var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); // Convert String-formatted options into Object-formatted ones function createOptions( options ) { var object = {}; jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { object[ flag ] = true; } ); return object; } /* * Create a callback list using the following parameters: * * options: an optional list of space-separated options that will change how * the callback list behaves or a more traditional option object * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible options: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( options ) { // Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? createOptions( options ) : jQuery.extend( {}, options ); var // Flag to know if list is currently firing firing, // Last fire value for non-forgettable lists memory, // Flag to know if list was already fired fired, // Flag to prevent firing locked, // Actual callback list list = [], // Queue of execution data for repeatable lists queue = [], // Index of currently firing callback (modified by add/remove as needed) firingIndex = -1, // Fire callbacks fire = function() { // Enforce single-firing locked = locked || options.once; // Execute callbacks for all pending executions, // respecting firingIndex overrides and runtime changes fired = firing = true; for ( ; queue.length; firingIndex = -1 ) { memory = queue.shift(); while ( ++firingIndex < list.length ) { // Run callback and check for early termination if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && options.stopOnFalse ) { // Jump to end and forget the data so .add doesn't re-fire firingIndex = list.length; memory = false; } } } // Forget the data if we're done with it if ( !options.memory ) { memory = false; } firing = false; // Clean up if we're done firing for good if ( locked ) { // Keep an empty list if we have data for future add calls if ( memory ) { list = []; // Otherwise, this object is spent } else { list = ""; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { // If we have memory from a past run, we should fire after adding if ( memory && !firing ) { firingIndex = list.length - 1; queue.push( memory ); } ( function add( args ) { jQuery.each( args, function( _, arg ) { if ( isFunction( arg ) ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } } else if ( arg && arg.length && toType( arg ) !== "string" ) { // Inspect recursively add( arg ); } } ); } )( arguments ); if ( memory && !firing ) { fire(); } } return this; }, // Remove a callback from the list remove: function() { jQuery.each( arguments, function( _, arg ) { var index; while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { list.splice( index, 1 ); // Handle firing indexes if ( index <= firingIndex ) { firingIndex--; } } } ); return this; }, // Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { return fn ? jQuery.inArray( fn, list ) > -1 : list.length > 0; }, // Remove all callbacks from the list empty: function() { if ( list ) { list = []; } return this; }, // Disable .fire and .add // Abort any current/pending executions // Clear all callbacks and values disable: function() { locked = queue = []; list = memory = ""; return this; }, disabled: function() { return !list; }, // Disable .fire // Also disable .add unless we have memory (since it would have no effect) // Abort any pending executions lock: function() { locked = queue = []; if ( !memory && !firing ) { list = memory = ""; } return this; }, locked: function() { return !!locked; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( !locked ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; queue.push( args ); if ( !firing ) { fire(); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; function Identity( v ) { return v; } function Thrower( ex ) { throw ex; } function adoptValue( value, resolve, reject, noValue ) { var method; try { // Check for promise aspect first to privilege synchronous behavior if ( value && isFunction( ( method = value.promise ) ) ) { method.call( value ).done( resolve ).fail( reject ); // Other thenables } else if ( value && isFunction( ( method = value.then ) ) ) { method.call( value, resolve, reject ); // Other non-thenables } else { // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: // * false: [ value ].slice( 0 ) => resolve( value ) // * true: [ value ].slice( 1 ) => resolve() resolve.apply( undefined, [ value ].slice( noValue ) ); } // For Promises/A+, convert exceptions into rejections // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in // Deferred#then to conditionally suppress rejection. } catch ( value ) { // Support: Android 4.0 only // Strict mode functions invoked without .call/.apply get global-object context reject.apply( undefined, [ value ] ); } } jQuery.extend( { Deferred: function( func ) { var tuples = [ // action, add listener, callbacks, // ... .then handlers, argument index, [final state] [ "notify", "progress", jQuery.Callbacks( "memory" ), jQuery.Callbacks( "memory" ), 2 ], [ "resolve", "done", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), 0, "resolved" ], [ "reject", "fail", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), 1, "rejected" ] ], state = "pending", promise = { state: function() { return state; }, always: function() { deferred.done( arguments ).fail( arguments ); return this; }, "catch": function( fn ) { return promise.then( null, fn ); }, // Keep pipe for back-compat pipe: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; return jQuery.Deferred( function( newDefer ) { jQuery.each( tuples, function( i, tuple ) { // Map tuples (progress, done, fail) to arguments (done, fail, progress) var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; // deferred.progress(function() { bind to newDefer or newDefer.notify }) // deferred.done(function() { bind to newDefer or newDefer.resolve }) // deferred.fail(function() { bind to newDefer or newDefer.reject }) deferred[ tuple[ 1 ] ]( function() { var returned = fn && fn.apply( this, arguments ); if ( returned && isFunction( returned.promise ) ) { returned.promise() .progress( newDefer.notify ) .done( newDefer.resolve ) .fail( newDefer.reject ); } else { newDefer[ tuple[ 0 ] + "With" ]( this, fn ? [ returned ] : arguments ); } } ); } ); fns = null; } ).promise(); }, then: function( onFulfilled, onRejected, onProgress ) { var maxDepth = 0; function resolve( depth, deferred, handler, special ) { return function() { var that = this, args = arguments, mightThrow = function() { var returned, then; // Support: Promises/A+ section 2.3.3.3.3 // https://promisesaplus.com/#point-59 // Ignore double-resolution attempts if ( depth < maxDepth ) { return; } returned = handler.apply( that, args ); // Support: Promises/A+ section 2.3.1 // https://promisesaplus.com/#point-48 if ( returned === deferred.promise() ) { throw new TypeError( "Thenable self-resolution" ); } // Support: Promises/A+ sections 2.3.3.1, 3.5 // https://promisesaplus.com/#point-54 // https://promisesaplus.com/#point-75 // Retrieve `then` only once then = returned && // Support: Promises/A+ section 2.3.4 // https://promisesaplus.com/#point-64 // Only check objects and functions for thenability ( typeof returned === "object" || typeof returned === "function" ) && returned.then; // Handle a returned thenable if ( isFunction( then ) ) { // Special processors (notify) just wait for resolution if ( special ) { then.call( returned, resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ) ); // Normal processors (resolve) also hook into progress } else { // ...and disregard older resolution values maxDepth++; then.call( returned, resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ), resolve( maxDepth, deferred, Identity, deferred.notifyWith ) ); } // Handle all other returned values } else { // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Identity ) { that = undefined; args = [ returned ]; } // Process the value(s) // Default process is resolve ( special || deferred.resolveWith )( that, args ); } }, // Only normal processors (resolve) catch and reject exceptions process = special ? mightThrow : function() { try { mightThrow(); } catch ( e ) { if ( jQuery.Deferred.exceptionHook ) { jQuery.Deferred.exceptionHook( e, process.stackTrace ); } // Support: Promises/A+ section 2.3.3.3.4.1 // https://promisesaplus.com/#point-61 // Ignore post-resolution exceptions if ( depth + 1 >= maxDepth ) { // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Thrower ) { that = undefined; args = [ e ]; } deferred.rejectWith( that, args ); } } }; // Support: Promises/A+ section 2.3.3.3.1 // https://promisesaplus.com/#point-57 // Re-resolve promises immediately to dodge false rejection from // subsequent errors if ( depth ) { process(); } else { // Call an optional hook to record the stack, in case of exception // since it's otherwise lost when execution goes async if ( jQuery.Deferred.getStackHook ) { process.stackTrace = jQuery.Deferred.getStackHook(); } window.setTimeout( process ); } }; } return jQuery.Deferred( function( newDefer ) { // progress_handlers.add( ... ) tuples[ 0 ][ 3 ].add( resolve( 0, newDefer, isFunction( onProgress ) ? onProgress : Identity, newDefer.notifyWith ) ); // fulfilled_handlers.add( ... ) tuples[ 1 ][ 3 ].add( resolve( 0, newDefer, isFunction( onFulfilled ) ? onFulfilled : Identity ) ); // rejected_handlers.add( ... ) tuples[ 2 ][ 3 ].add( resolve( 0, newDefer, isFunction( onRejected ) ? onRejected : Thrower ) ); } ).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { return obj != null ? jQuery.extend( obj, promise ) : promise; } }, deferred = {}; // Add list-specific methods jQuery.each( tuples, function( i, tuple ) { var list = tuple[ 2 ], stateString = tuple[ 5 ]; // promise.progress = list.add // promise.done = list.add // promise.fail = list.add promise[ tuple[ 1 ] ] = list.add; // Handle state if ( stateString ) { list.add( function() { // state = "resolved" (i.e., fulfilled) // state = "rejected" state = stateString; }, // rejected_callbacks.disable // fulfilled_callbacks.disable tuples[ 3 - i ][ 2 ].disable, // rejected_handlers.disable // fulfilled_handlers.disable tuples[ 3 - i ][ 3 ].disable, // progress_callbacks.lock tuples[ 0 ][ 2 ].lock, // progress_handlers.lock tuples[ 0 ][ 3 ].lock ); } // progress_handlers.fire // fulfilled_handlers.fire // rejected_handlers.fire list.add( tuple[ 3 ].fire ); // deferred.notify = function() { deferred.notifyWith(...) } // deferred.resolve = function() { deferred.resolveWith(...) } // deferred.reject = function() { deferred.rejectWith(...) } deferred[ tuple[ 0 ] ] = function() { deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); return this; }; // deferred.notifyWith = list.fireWith // deferred.resolveWith = list.fireWith // deferred.rejectWith = list.fireWith deferred[ tuple[ 0 ] + "With" ] = list.fireWith; } ); // Make the deferred a promise promise.promise( deferred ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( singleValue ) { var // count of uncompleted subordinates remaining = arguments.length, // count of unprocessed arguments i = remaining, // subordinate fulfillment data resolveContexts = Array( i ), resolveValues = slice.call( arguments ), // the master Deferred master = jQuery.Deferred(), // subordinate callback factory updateFunc = function( i ) { return function( value ) { resolveContexts[ i ] = this; resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( !( --remaining ) ) { master.resolveWith( resolveContexts, resolveValues ); } }; }; // Single- and empty arguments are adopted like Promise.resolve if ( remaining <= 1 ) { adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, !remaining ); // Use .then() to unwrap secondary thenables (cf. gh-3000) if ( master.state() === "pending" || isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { return master.then(); } } // Multiple arguments are aggregated like Promise.all array elements while ( i-- ) { adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); } return master.promise(); } } ); // These usually indicate a programmer mistake during development, // warn about them ASAP rather than swallowing them by default. var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; jQuery.Deferred.exceptionHook = function( error, stack ) { // Support: IE 8 - 9 only // Console exists when dev tools are open, which can happen at any time if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); } }; jQuery.readyException = function( error ) { window.setTimeout( function() { throw error; } ); }; // The deferred used on DOM ready var readyList = jQuery.Deferred(); jQuery.fn.ready = function( fn ) { readyList .then( fn ) // Wrap jQuery.readyException in a function so that the lookup // happens at the time of error handling instead of callback // registration. .catch( function( error ) { jQuery.readyException( error ); } ); return this; }; jQuery.extend( { // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Handle when the DOM is ready ready: function( wait ) { // Abort if there are pending holds or we're already ready if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.resolveWith( document, [ jQuery ] ); } } ); jQuery.ready.then = readyList.then; // The ready event handler and self cleanup method function completed() { document.removeEventListener( "DOMContentLoaded", completed ); window.removeEventListener( "load", completed ); jQuery.ready(); } // Catch cases where $(document).ready() is called // after the browser event has already occurred. // Support: IE <=9 - 10 only // Older IE sometimes signals "interactive" too soon if ( document.readyState === "complete" || ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { // Handle it asynchronously to allow scripts the opportunity to delay ready window.setTimeout( jQuery.ready ); } else { // Use the handy event callback document.addEventListener( "DOMContentLoaded", completed ); // A fallback to window.onload, that will always work window.addEventListener( "load", completed ); } // Multifunctional method to get and set values of a collection // The value/s can optionally be executed if it's a function var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, len = elems.length, bulk = key == null; // Sets many values if ( toType( key ) === "object" ) { chainable = true; for ( i in key ) { access( elems, fn, i, key[ i ], true, emptyGet, raw ); } // Sets one value } else if ( value !== undefined ) { chainable = true; if ( !isFunction( value ) ) { raw = true; } if ( bulk ) { // Bulk operations run against the entire set if ( raw ) { fn.call( elems, value ); fn = null; // ...except when executing function values } else { bulk = fn; fn = function( elem, key, value ) { return bulk.call( jQuery( elem ), value ); }; } } if ( fn ) { for ( ; i < len; i++ ) { fn( elems[ i ], key, raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) ); } } } if ( chainable ) { return elems; } // Gets if ( bulk ) { return fn.call( elems ); } return len ? fn( elems[ 0 ], key ) : emptyGet; }; // Matches dashed string for camelizing var rmsPrefix = /^-ms-/, rdashAlpha = /-([a-z])/g; // Used by camelCase as callback to replace() function fcamelCase( all, letter ) { return letter.toUpperCase(); } // Convert dashed to camelCase; used by the css and data modules // Support: IE <=9 - 11, Edge 12 - 15 // Microsoft forgot to hump their vendor prefix (#9572) function camelCase( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); } var acceptData = function( owner ) { // Accepts only: // - Node // - Node.ELEMENT_NODE // - Node.DOCUMENT_NODE // - Object // - Any return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); }; function Data() { this.expando = jQuery.expando + Data.uid++; } Data.uid = 1; Data.prototype = { cache: function( owner ) { // Check if the owner object already has a cache var value = owner[ this.expando ]; // If not, create one if ( !value ) { value = {}; // We can accept data for non-element nodes in modern browsers, // but we should not, see #8335. // Always return an empty object. if ( acceptData( owner ) ) { // If it is a node unlikely to be stringify-ed or looped over // use plain assignment if ( owner.nodeType ) { owner[ this.expando ] = value; // Otherwise secure it in a non-enumerable property // configurable must be true to allow the property to be // deleted when data is removed } else { Object.defineProperty( owner, this.expando, { value: value, configurable: true } ); } } } return value; }, set: function( owner, data, value ) { var prop, cache = this.cache( owner ); // Handle: [ owner, key, value ] args // Always use camelCase key (gh-2257) if ( typeof data === "string" ) { cache[ camelCase( data ) ] = value; // Handle: [ owner, { properties } ] args } else { // Copy the properties one-by-one to the cache object for ( prop in data ) { cache[ camelCase( prop ) ] = data[ prop ]; } } return cache; }, get: function( owner, key ) { return key === undefined ? this.cache( owner ) : // Always use camelCase key (gh-2257) owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; }, access: function( owner, key, value ) { // In cases where either: // // 1. No key was specified // 2. A string key was specified, but no value provided // // Take the "read" path and allow the get method to determine // which value to return, respectively either: // // 1. The entire cache object // 2. The data stored at the key // if ( key === undefined || ( ( key && typeof key === "string" ) && value === undefined ) ) { return this.get( owner, key ); } // When the key is not a string, or both a key and value // are specified, set or extend (existing objects) with either: // // 1. An object of properties // 2. A key and value // this.set( owner, key, value ); // Since the "set" path can have two possible entry points // return the expected data based on which path was taken[*] return value !== undefined ? value : key; }, remove: function( owner, key ) { var i, cache = owner[ this.expando ]; if ( cache === undefined ) { return; } if ( key !== undefined ) { // Support array or space separated string of keys if ( Array.isArray( key ) ) { // If key is an array of keys... // We always set camelCase keys, so remove that. key = key.map( camelCase ); } else { key = camelCase( key ); // If a key with the spaces exists, use it. // Otherwise, create an array by matching non-whitespace key = key in cache ? [ key ] : ( key.match( rnothtmlwhite ) || [] ); } i = key.length; while ( i-- ) { delete cache[ key[ i ] ]; } } // Remove the expando if there's no more data if ( key === undefined || jQuery.isEmptyObject( cache ) ) { // Support: Chrome <=35 - 45 // Webkit & Blink performance suffers when deleting properties // from DOM nodes, so set to undefined instead // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) if ( owner.nodeType ) { owner[ this.expando ] = undefined; } else { delete owner[ this.expando ]; } } }, hasData: function( owner ) { var cache = owner[ this.expando ]; return cache !== undefined && !jQuery.isEmptyObject( cache ); } }; var dataPriv = new Data(); var dataUser = new Data(); // Implementation Summary // // 1. Enforce API surface and semantic compatibility with 1.9.x branch // 2. Improve the module's maintainability by reducing the storage // paths to a single mechanism. // 3. Use the same single mechanism to support "private" and "user" data. // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) // 5. Avoid exposing implementation details on user objects (eg. expando properties) // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /[A-Z]/g; function getData( data ) { if ( data === "true" ) { return true; } if ( data === "false" ) { return false; } if ( data === "null" ) { return null; } // Only convert to a number if it doesn't change the string if ( data === +data + "" ) { return +data; } if ( rbrace.test( data ) ) { return JSON.parse( data ); } return data; } function dataAttr( elem, key, data ) { var name; // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = getData( data ); } catch ( e ) {} // Make sure we set the data so it isn't changed later dataUser.set( elem, key, data ); } else { data = undefined; } } return data; } jQuery.extend( { hasData: function( elem ) { return dataUser.hasData( elem ) || dataPriv.hasData( elem ); }, data: function( elem, name, data ) { return dataUser.access( elem, name, data ); }, removeData: function( elem, name ) { dataUser.remove( elem, name ); }, // TODO: Now that all calls to _data and _removeData have been replaced // with direct calls to dataPriv methods, these can be deprecated. _data: function( elem, name, data ) { return dataPriv.access( elem, name, data ); }, _removeData: function( elem, name ) { dataPriv.remove( elem, name ); } } ); jQuery.fn.extend( { data: function( key, value ) { var i, name, data, elem = this[ 0 ], attrs = elem && elem.attributes; // Gets all values if ( key === undefined ) { if ( this.length ) { data = dataUser.get( elem ); if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { i = attrs.length; while ( i-- ) { // Support: IE 11 only // The attrs elements can be null (#14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { name = camelCase( name.slice( 5 ) ); dataAttr( elem, name, data[ name ] ); } } } dataPriv.set( elem, "hasDataAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each( function() { dataUser.set( this, key ); } ); } return access( this, function( value ) { var data; // The calling jQuery object (element matches) is not empty // (and therefore has an element appears at this[ 0 ]) and the // `value` parameter was not undefined. An empty jQuery object // will result in `undefined` for elem = this[ 0 ] which will // throw an exception if an attempt to read a data cache is made. if ( elem && value === undefined ) { // Attempt to get data from the cache // The key will always be camelCased in Data data = dataUser.get( elem, key ); if ( data !== undefined ) { return data; } // Attempt to "discover" the data in // HTML5 custom data-* attrs data = dataAttr( elem, key ); if ( data !== undefined ) { return data; } // We tried really hard, but the data doesn't exist. return; } // Set the data... this.each( function() { // We always store the camelCased key dataUser.set( this, key, value ); } ); }, null, value, arguments.length > 1, null, true ); }, removeData: function( key ) { return this.each( function() { dataUser.remove( this, key ); } ); } } ); jQuery.extend( { queue: function( elem, type, data ) { var queue; if ( elem ) { type = ( type || "fx" ) + "queue"; queue = dataPriv.get( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !queue || Array.isArray( data ) ) { queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); } else { queue.push( data ); } } return queue || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), startLength = queue.length, fn = queue.shift(), hooks = jQuery._queueHooks( elem, type ), next = function() { jQuery.dequeue( elem, type ); }; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); startLength--; } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } // Clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); } if ( !startLength && hooks ) { hooks.empty.fire(); } }, // Not public - generate a queueHooks object, or return the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { empty: jQuery.Callbacks( "once memory" ).add( function() { dataPriv.remove( elem, [ type + "queue", key ] ); } ) } ); } } ); jQuery.fn.extend( { queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[ 0 ], type ); } return data === undefined ? this : this.each( function() { var queue = jQuery.queue( this, type, data ); // Ensure a hooks for this queue jQuery._queueHooks( this, type ); if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { jQuery.dequeue( this, type ); } } ); }, dequeue: function( type ) { return this.each( function() { jQuery.dequeue( this, type ); } ); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } }; if ( typeof type !== "string" ) { obj = type; type = undefined; } type = type || "fx"; while ( i-- ) { tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); } } resolve(); return defer.promise( obj ); } } ); var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; var isHiddenWithinTree = function( elem, el ) { // isHiddenWithinTree might be called from jQuery#filter function; // in that case, element will be second argument elem = el || elem; // Inline style trumps all return elem.style.display === "none" || elem.style.display === "" && // Otherwise, check computed style // Support: Firefox <=43 - 45 // Disconnected elements can have computed display: none, so first confirm that elem is // in the document. jQuery.contains( elem.ownerDocument, elem ) && jQuery.css( elem, "display" ) === "none"; }; var swap = function( elem, options, callback, args ) { var ret, name, old = {}; // Remember the old values, and insert the new ones for ( name in options ) { old[ name ] = elem.style[ name ]; elem.style[ name ] = options[ name ]; } ret = callback.apply( elem, args || [] ); // Revert the old values for ( name in options ) { elem.style[ name ] = old[ name ]; } return ret; }; function adjustCSS( elem, prop, valueParts, tween ) { var adjusted, scale, maxIterations = 20, currentValue = tween ? function() { return tween.cur(); } : function() { return jQuery.css( elem, prop, "" ); }, initial = currentValue(), unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), // Starting value computation is required for potential unit mismatches initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && rcssNum.exec( jQuery.css( elem, prop ) ); if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { // Support: Firefox <=54 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) initial = initial / 2; // Trust units reported by jQuery.css unit = unit || initialInUnit[ 3 ]; // Iteratively approximate from a nonzero starting point initialInUnit = +initial || 1; while ( maxIterations-- ) { // Evaluate and update our best guess (doubling guesses that zero out). // Finish if the scale equals or crosses 1 (making the old*new product non-positive). jQuery.style( elem, prop, initialInUnit + unit ); if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { maxIterations = 0; } initialInUnit = initialInUnit / scale; } initialInUnit = initialInUnit * 2; jQuery.style( elem, prop, initialInUnit + unit ); // Make sure we update the tween properties later on valueParts = valueParts || []; } if ( valueParts ) { initialInUnit = +initialInUnit || +initial || 0; // Apply relative offset (+=/-=) if specified adjusted = valueParts[ 1 ] ? initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : +valueParts[ 2 ]; if ( tween ) { tween.unit = unit; tween.start = initialInUnit; tween.end = adjusted; } } return adjusted; } var defaultDisplayMap = {}; function getDefaultDisplay( elem ) { var temp, doc = elem.ownerDocument, nodeName = elem.nodeName, display = defaultDisplayMap[ nodeName ]; if ( display ) { return display; } temp = doc.body.appendChild( doc.createElement( nodeName ) ); display = jQuery.css( temp, "display" ); temp.parentNode.removeChild( temp ); if ( display === "none" ) { display = "block"; } defaultDisplayMap[ nodeName ] = display; return display; } function showHide( elements, show ) { var display, elem, values = [], index = 0, length = elements.length; // Determine new display value for elements that need to change for ( ; index < length; index++ ) { elem = elements[ index ]; if ( !elem.style ) { continue; } display = elem.style.display; if ( show ) { // Since we force visibility upon cascade-hidden elements, an immediate (and slow) // check is required in this first loop unless we have a nonempty display value (either // inline or about-to-be-restored) if ( display === "none" ) { values[ index ] = dataPriv.get( elem, "display" ) || null; if ( !values[ index ] ) { elem.style.display = ""; } } if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { values[ index ] = getDefaultDisplay( elem ); } } else { if ( display !== "none" ) { values[ index ] = "none"; // Remember what we're overwriting dataPriv.set( elem, "display", display ); } } } // Set the display of the elements in a second loop to avoid constant reflow for ( index = 0; index < length; index++ ) { if ( values[ index ] != null ) { elements[ index ].style.display = values[ index ]; } } return elements; } jQuery.fn.extend( { show: function() { return showHide( this, true ); }, hide: function() { return showHide( this ); }, toggle: function( state ) { if ( typeof state === "boolean" ) { return state ? this.show() : this.hide(); } return this.each( function() { if ( isHiddenWithinTree( this ) ) { jQuery( this ).show(); } else { jQuery( this ).hide(); } } ); } } ); var rcheckableType = ( /^(?:checkbox|radio)$/i ); var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); // We have to close these tags to support XHTML (#13200) var wrapMap = { // Support: IE <=9 only option: [ 1, "" ], // XHTML parsers do not magically insert elements in the // same way that tag soup parsers do. So we cannot shorten // this by omitting or other required elements. thead: [ 1, "", "
" ], col: [ 2, "", "
" ], tr: [ 2, "", "
" ], td: [ 3, "", "
" ], _default: [ 0, "", "" ] }; // Support: IE <=9 only wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; function getAll( context, tag ) { // Support: IE <=9 - 11 only // Use typeof to avoid zero-argument method invocation on host objects (#15151) var ret; if ( typeof context.getElementsByTagName !== "undefined" ) { ret = context.getElementsByTagName( tag || "*" ); } else if ( typeof context.querySelectorAll !== "undefined" ) { ret = context.querySelectorAll( tag || "*" ); } else { ret = []; } if ( tag === undefined || tag && nodeName( context, tag ) ) { return jQuery.merge( [ context ], ret ); } return ret; } // Mark scripts as having already been evaluated function setGlobalEval( elems, refElements ) { var i = 0, l = elems.length; for ( ; i < l; i++ ) { dataPriv.set( elems[ i ], "globalEval", !refElements || dataPriv.get( refElements[ i ], "globalEval" ) ); } } var rhtml = /<|&#?\w+;/; function buildFragment( elems, context, scripts, selection, ignored ) { var elem, tmp, tag, wrap, contains, j, fragment = context.createDocumentFragment(), nodes = [], i = 0, l = elems.length; for ( ; i < l; i++ ) { elem = elems[ i ]; if ( elem || elem === 0 ) { // Add nodes directly if ( toType( elem ) === "object" ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); // Convert non-html into a text node } else if ( !rhtml.test( elem ) ) { nodes.push( context.createTextNode( elem ) ); // Convert html into DOM nodes } else { tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); // Deserialize a standard representation tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); wrap = wrapMap[ tag ] || wrapMap._default; tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; // Descend through wrappers to the right content j = wrap[ 0 ]; while ( j-- ) { tmp = tmp.lastChild; } // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, tmp.childNodes ); // Remember the top-level container tmp = fragment.firstChild; // Ensure the created nodes are orphaned (#12392) tmp.textContent = ""; } } } // Remove wrapper from fragment fragment.textContent = ""; i = 0; while ( ( elem = nodes[ i++ ] ) ) { // Skip elements already in the context collection (trac-4087) if ( selection && jQuery.inArray( elem, selection ) > -1 ) { if ( ignored ) { ignored.push( elem ); } continue; } contains = jQuery.contains( elem.ownerDocument, elem ); // Append to fragment tmp = getAll( fragment.appendChild( elem ), "script" ); // Preserve script evaluation history if ( contains ) { setGlobalEval( tmp ); } // Capture executables if ( scripts ) { j = 0; while ( ( elem = tmp[ j++ ] ) ) { if ( rscriptType.test( elem.type || "" ) ) { scripts.push( elem ); } } } } return fragment; } ( function() { var fragment = document.createDocumentFragment(), div = fragment.appendChild( document.createElement( "div" ) ), input = document.createElement( "input" ); // Support: Android 4.0 - 4.3 only // Check state lost if the name is set (#11217) // Support: Windows Web Apps (WWA) // `name` and `type` must use .setAttribute for WWA (#14901) input.setAttribute( "type", "radio" ); input.setAttribute( "checked", "checked" ); input.setAttribute( "name", "t" ); div.appendChild( input ); // Support: Android <=4.1 only // Older WebKit doesn't clone checked state correctly in fragments support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; // Support: IE <=11 only // Make sure textarea (and checkbox) defaultValue is properly cloned div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; } )(); var documentElement = document.documentElement; var rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { return true; } function returnFalse() { return false; } // Support: IE <=9 only // See #13393 for more info function safeActiveElement() { try { return document.activeElement; } catch ( err ) { } } function on( elem, types, selector, data, fn, one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { on( elem, type, selector, data, types[ type ], one ); } return elem; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return elem; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return elem.each( function() { jQuery.event.add( this, types, fn, data, selector ); } ); } /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { var handleObjIn, eventHandle, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.get( elem ); // Don't attach events to noData or text/comment nodes (but allow plain objects) if ( !elemData ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Ensure that invalid selectors throw exceptions at attach time // Evaluate against documentElement in case elem is a non-element node (e.g., document) if ( selector ) { jQuery.find.matchesSelector( documentElement, selector ); } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first if ( !( events = elemData.events ) ) { events = elemData.events = {}; } if ( !( eventHandle = elemData.handle ) ) { eventHandle = elemData.handle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply( elem, arguments ) : undefined; }; } // Handle multiple events separated by a space types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { continue; } // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend( { type: type, origType: origType, data: data, handler: handler, guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), namespace: namespaces.join( "." ) }, handleObjIn ); // Init the event handler queue if we're the first if ( !( handlers = events[ type ] ) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var j, origCount, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); if ( !elemData || !( events = elemData.events ) ) { return; } // Once for each type.namespace in types; type may be omitted types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; tmp = tmp[ 2 ] && new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; while ( j-- ) { handleObj = handlers[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { handlers.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove data and the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { dataPriv.remove( elem, "handle events" ); } }, dispatch: function( nativeEvent ) { // Make a writable jQuery.Event from the native event object var event = jQuery.event.fix( nativeEvent ); var i, j, ret, matched, handleObj, handlerQueue, args = new Array( arguments.length ), handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[ 0 ] = event; for ( i = 1; i < arguments.length; i++ ) { args[ i ] = arguments[ i ]; } event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers handlerQueue = jQuery.event.handlers.call( this, event, handlers ); // Run delegates first; they may want to stop propagation beneath us i = 0; while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; while ( ( handleObj = matched.handlers[ j++ ] ) && !event.isImmediatePropagationStopped() ) { // Triggered event must either 1) have no namespace, or 2) have namespace(s) // a subset or equal to those in the bound event (both can have no namespace). if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || handleObj.handler ).apply( matched.elem, args ); if ( ret !== undefined ) { if ( ( event.result = ret ) === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, handlers: function( event, handlers ) { var i, handleObj, sel, matchedHandlers, matchedSelectors, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Find delegate handlers if ( delegateCount && // Support: IE <=9 // Black-hole SVG instance trees (trac-13180) cur.nodeType && // Support: Firefox <=42 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click // Support: IE 11 only // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) !( event.type === "click" && event.button >= 1 ) ) { for ( ; cur !== this; cur = cur.parentNode || this ) { // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { matchedHandlers = []; matchedSelectors = {}; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; // Don't conflict with Object.prototype properties (#13203) sel = handleObj.selector + " "; if ( matchedSelectors[ sel ] === undefined ) { matchedSelectors[ sel ] = handleObj.needsContext ? jQuery( sel, this ).index( cur ) > -1 : jQuery.find( sel, this, null, [ cur ] ).length; } if ( matchedSelectors[ sel ] ) { matchedHandlers.push( handleObj ); } } if ( matchedHandlers.length ) { handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); } } } } // Add the remaining (directly-bound) handlers cur = this; if ( delegateCount < handlers.length ) { handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); } return handlerQueue; }, addProp: function( name, hook ) { Object.defineProperty( jQuery.Event.prototype, name, { enumerable: true, configurable: true, get: isFunction( hook ) ? function() { if ( this.originalEvent ) { return hook( this.originalEvent ); } } : function() { if ( this.originalEvent ) { return this.originalEvent[ name ]; } }, set: function( value ) { Object.defineProperty( this, name, { enumerable: true, configurable: true, writable: true, value: value } ); } } ); }, fix: function( originalEvent ) { return originalEvent[ jQuery.expando ] ? originalEvent : new jQuery.Event( originalEvent ); }, special: { load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { // Fire native event if possible so blur/focus sequence is correct trigger: function() { if ( this !== safeActiveElement() && this.focus ) { this.focus(); return false; } }, delegateType: "focusin" }, blur: { trigger: function() { if ( this === safeActiveElement() && this.blur ) { this.blur(); return false; } }, delegateType: "focusout" }, click: { // For checkbox, fire native event so checked state will be right trigger: function() { if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { this.click(); return false; } }, // For cross-browser consistency, don't fire native .click() on links _default: function( event ) { return nodeName( event.target, "a" ); } }, beforeunload: { postDispatch: function( event ) { // Support: Firefox 20+ // Firefox doesn't alert if the returnValue field is not set. if ( event.result !== undefined && event.originalEvent ) { event.originalEvent.returnValue = event.result; } } } } }; jQuery.removeEvent = function( elem, type, handle ) { // This "if" is needed for plain objects if ( elem.removeEventListener ) { elem.removeEventListener( type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !( this instanceof jQuery.Event ) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: Android <=2.3 only src.returnValue === false ? returnTrue : returnFalse; // Create target properties // Support: Safari <=6 - 7 only // Target should not be a text node (#504, #13143) this.target = ( src.target && src.target.nodeType === 3 ) ? src.target.parentNode : src.target; this.currentTarget = src.currentTarget; this.relatedTarget = src.relatedTarget; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || Date.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { constructor: jQuery.Event, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, isSimulated: false, preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; if ( e && !this.isSimulated ) { e.preventDefault(); } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; if ( e && !this.isSimulated ) { e.stopPropagation(); } }, stopImmediatePropagation: function() { var e = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; if ( e && !this.isSimulated ) { e.stopImmediatePropagation(); } this.stopPropagation(); } }; // Includes all common event props including KeyEvent and MouseEvent specific props jQuery.each( { altKey: true, bubbles: true, cancelable: true, changedTouches: true, ctrlKey: true, detail: true, eventPhase: true, metaKey: true, pageX: true, pageY: true, shiftKey: true, view: true, "char": true, charCode: true, key: true, keyCode: true, button: true, buttons: true, clientX: true, clientY: true, offsetX: true, offsetY: true, pointerId: true, pointerType: true, screenX: true, screenY: true, targetTouches: true, toElement: true, touches: true, which: function( event ) { var button = event.button; // Add which for key events if ( event.which == null && rkeyEvent.test( event.type ) ) { return event.charCode != null ? event.charCode : event.keyCode; } // Add which for click: 1 === left; 2 === middle; 3 === right if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { if ( button & 1 ) { return 1; } if ( button & 2 ) { return 3; } if ( button & 4 ) { return 2; } return 0; } return event.which; } }, jQuery.event.addProp ); // Create mouseenter/leave events using mouseover/out and event-time checks // so that event delegation works in jQuery. // Do the same for pointerenter/pointerleave and pointerover/pointerout // // Support: Safari 7 only // Safari sends mouseenter too often; see: // https://bugs.chromium.org/p/chromium/issues/detail?id=470258 // for the description of the bug (it existed in older Chrome versions as well). jQuery.each( { mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; } ); jQuery.fn.extend( { on: function( types, selector, data, fn ) { return on( this, types, selector, data, fn ); }, one: function( types, selector, data, fn ) { return on( this, types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { var handleObj, type; if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each( function() { jQuery.event.remove( this, types, fn, selector ); } ); } } ); var /* eslint-disable max-len */ // See https://github.com/eslint/eslint/issues/3229 rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, /* eslint-enable */ // Support: IE <=10 - 11, Edge 12 - 13 only // In IE/Edge using regex groups here causes severe slowdowns. // See https://connect.microsoft.com/IE/feedback/details/1736512/ rnoInnerhtml = /\s*$/g; // Prefer a tbody over its parent table for containing new rows function manipulationTarget( elem, content ) { if ( nodeName( elem, "table" ) && nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { return jQuery( elem ).children( "tbody" )[ 0 ] || elem; } return elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; return elem; } function restoreScript( elem ) { if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { elem.type = elem.type.slice( 5 ); } else { elem.removeAttribute( "type" ); } return elem; } function cloneCopyEvent( src, dest ) { var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; if ( dest.nodeType !== 1 ) { return; } // 1. Copy private data: events, handlers, etc. if ( dataPriv.hasData( src ) ) { pdataOld = dataPriv.access( src ); pdataCur = dataPriv.set( dest, pdataOld ); events = pdataOld.events; if ( events ) { delete pdataCur.handle; pdataCur.events = {}; for ( type in events ) { for ( i = 0, l = events[ type ].length; i < l; i++ ) { jQuery.event.add( dest, type, events[ type ][ i ] ); } } } } // 2. Copy user data if ( dataUser.hasData( src ) ) { udataOld = dataUser.access( src ); udataCur = jQuery.extend( {}, udataOld ); dataUser.set( dest, udataCur ); } } // Fix IE bugs, see support tests function fixInput( src, dest ) { var nodeName = dest.nodeName.toLowerCase(); // Fails to persist the checked state of a cloned checkbox or radio button. if ( nodeName === "input" && rcheckableType.test( src.type ) ) { dest.checked = src.checked; // Fails to return the selected option to the default selected state when cloning options } else if ( nodeName === "input" || nodeName === "textarea" ) { dest.defaultValue = src.defaultValue; } } function domManip( collection, args, callback, ignored ) { // Flatten any nested arrays args = concat.apply( [], args ); var fragment, first, scripts, hasScripts, node, doc, i = 0, l = collection.length, iNoClone = l - 1, value = args[ 0 ], valueIsFunction = isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit if ( valueIsFunction || ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test( value ) ) ) { return collection.each( function( index ) { var self = collection.eq( index ); if ( valueIsFunction ) { args[ 0 ] = value.call( this, index, self.html() ); } domManip( self, args, callback, ignored ); } ); } if ( l ) { fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { fragment = first; } // Require either new content or an interest in ignored elements to invoke the callback if ( first || ignored ) { scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); hasScripts = scripts.length; // Use the original fragment for the last item // instead of the first because it can end up // being emptied incorrectly in certain situations (#8070). for ( ; i < l; i++ ) { node = fragment; if ( i !== iNoClone ) { node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration if ( hasScripts ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( scripts, getAll( node, "script" ) ); } } callback.call( collection[ i ], node, i ); } if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !dataPriv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { // Optional AJAX dependency, but won't run scripts if not present if ( jQuery._evalUrl ) { jQuery._evalUrl( node.src ); } } else { DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node ); } } } } } } return collection; } function remove( elem, selector, keepData ) { var node, nodes = selector ? jQuery.filter( selector, elem ) : elem, i = 0; for ( ; ( node = nodes[ i ] ) != null; i++ ) { if ( !keepData && node.nodeType === 1 ) { jQuery.cleanData( getAll( node ) ); } if ( node.parentNode ) { if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { setGlobalEval( getAll( node, "script" ) ); } node.parentNode.removeChild( node ); } } return elem; } jQuery.extend( { htmlPrefilter: function( html ) { return html.replace( rxhtmlTag, "<$1>" ); }, clone: function( elem, dataAndEvents, deepDataAndEvents ) { var i, l, srcElements, destElements, clone = elem.cloneNode( true ), inPage = jQuery.contains( elem.ownerDocument, elem ); // Fix IE cloning issues if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); for ( i = 0, l = srcElements.length; i < l; i++ ) { fixInput( srcElements[ i ], destElements[ i ] ); } } // Copy the events from the original to the clone if ( dataAndEvents ) { if ( deepDataAndEvents ) { srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); for ( i = 0, l = srcElements.length; i < l; i++ ) { cloneCopyEvent( srcElements[ i ], destElements[ i ] ); } } else { cloneCopyEvent( elem, clone ); } } // Preserve script evaluation history destElements = getAll( clone, "script" ); if ( destElements.length > 0 ) { setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } // Return the cloned set return clone; }, cleanData: function( elems ) { var data, elem, type, special = jQuery.event.special, i = 0; for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { if ( acceptData( elem ) ) { if ( ( data = elem[ dataPriv.expando ] ) ) { if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); // This is a shortcut to avoid jQuery.event.remove's overhead } else { jQuery.removeEvent( elem, type, data.handle ); } } } // Support: Chrome <=35 - 45+ // Assign undefined instead of using delete, see Data#remove elem[ dataPriv.expando ] = undefined; } if ( elem[ dataUser.expando ] ) { // Support: Chrome <=35 - 45+ // Assign undefined instead of using delete, see Data#remove elem[ dataUser.expando ] = undefined; } } } } } ); jQuery.fn.extend( { detach: function( selector ) { return remove( this, selector, true ); }, remove: function( selector ) { return remove( this, selector ); }, text: function( value ) { return access( this, function( value ) { return value === undefined ? jQuery.text( this ) : this.empty().each( function() { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { this.textContent = value; } } ); }, null, value, arguments.length ); }, append: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.appendChild( elem ); } } ); }, prepend: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.insertBefore( elem, target.firstChild ); } } ); }, before: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this ); } } ); }, after: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this.nextSibling ); } } ); }, empty: function() { var elem, i = 0; for ( ; ( elem = this[ i ] ) != null; i++ ) { if ( elem.nodeType === 1 ) { // Prevent memory leaks jQuery.cleanData( getAll( elem, false ) ); // Remove any remaining nodes elem.textContent = ""; } } return this; }, clone: function( dataAndEvents, deepDataAndEvents ) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map( function() { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); } ); }, html: function( value ) { return access( this, function( value ) { var elem = this[ 0 ] || {}, i = 0, l = this.length; if ( value === undefined && elem.nodeType === 1 ) { return elem.innerHTML; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { value = jQuery.htmlPrefilter( value ); try { for ( ; i < l; i++ ) { elem = this[ i ] || {}; // Remove element nodes and prevent memory leaks if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } elem = 0; // If using innerHTML throws an exception, use the fallback method } catch ( e ) {} } if ( elem ) { this.empty().append( value ); } }, null, value, arguments.length ); }, replaceWith: function() { var ignored = []; // Make the changes, replacing each non-ignored context element with the new content return domManip( this, arguments, function( elem ) { var parent = this.parentNode; if ( jQuery.inArray( this, ignored ) < 0 ) { jQuery.cleanData( getAll( this ) ); if ( parent ) { parent.replaceChild( elem, this ); } } // Force callback invocation }, ignored ); } } ); jQuery.each( { appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, ret = [], insert = jQuery( selector ), last = insert.length - 1, i = 0; for ( ; i <= last; i++ ) { elems = i === last ? this : this.clone( true ); jQuery( insert[ i ] )[ original ]( elems ); // Support: Android <=4.0 only, PhantomJS 1 only // .get() because push.apply(_, arraylike) throws on ancient WebKit push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; } ); var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); var getStyles = function( elem ) { // Support: IE <=11 only, Firefox <=30 (#15098, #14150) // IE throws on elements created in popups // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" var view = elem.ownerDocument.defaultView; if ( !view || !view.opener ) { view = window; } return view.getComputedStyle( elem ); }; var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); ( function() { // Executing both pixelPosition & boxSizingReliable tests require only one layout // so they're executed at the same time to save the second computation. function computeStyleTests() { // This is a singleton, we need to execute it only once if ( !div ) { return; } container.style.cssText = "position:absolute;left:-11111px;width:60px;" + "margin-top:1px;padding:0;border:0"; div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + "margin:auto;border:1px;padding:1px;" + "width:60%;top:1%"; documentElement.appendChild( container ).appendChild( div ); var divStyle = window.getComputedStyle( div ); pixelPositionVal = divStyle.top !== "1%"; // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 // Some styles come back with percentage values, even though they shouldn't div.style.right = "60%"; pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; // Support: IE 9 - 11 only // Detect misreporting of content dimensions for box-sizing:border-box elements boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; // Support: IE 9 only // Detect overflow:scroll screwiness (gh-3699) div.style.position = "absolute"; scrollboxSizeVal = div.offsetWidth === 36 || "absolute"; documentElement.removeChild( container ); // Nullify the div so it wouldn't be stored in the memory and // it will also be a sign that checks already performed div = null; } function roundPixelMeasures( measure ) { return Math.round( parseFloat( measure ) ); } var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, reliableMarginLeftVal, container = document.createElement( "div" ), div = document.createElement( "div" ); // Finish early in limited (non-browser) environments if ( !div.style ) { return; } // Support: IE <=9 - 11 only // Style of cloned element affects source element cloned (#8908) div.style.backgroundClip = "content-box"; div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; jQuery.extend( support, { boxSizingReliable: function() { computeStyleTests(); return boxSizingReliableVal; }, pixelBoxStyles: function() { computeStyleTests(); return pixelBoxStylesVal; }, pixelPosition: function() { computeStyleTests(); return pixelPositionVal; }, reliableMarginLeft: function() { computeStyleTests(); return reliableMarginLeftVal; }, scrollboxSize: function() { computeStyleTests(); return scrollboxSizeVal; } } ); } )(); function curCSS( elem, name, computed ) { var width, minWidth, maxWidth, ret, // Support: Firefox 51+ // Retrieving style before computed somehow // fixes an issue with getting wrong values // on detached elements style = elem.style; computed = computed || getStyles( elem ); // getPropertyValue is needed for: // .css('filter') (IE 9 only, #12537) // .css('--customProperty) (#3144) if ( computed ) { ret = computed.getPropertyValue( name ) || computed[ name ]; if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { ret = jQuery.style( elem, name ); } // A tribute to the "awesome hack by Dean Edwards" // Android Browser returns percentage for some values, // but width seems to be reliably pixels. // This is against the CSSOM draft spec: // https://drafts.csswg.org/cssom/#resolved-values if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { // Remember the original values width = style.width; minWidth = style.minWidth; maxWidth = style.maxWidth; // Put in the new values to get a computed value out style.minWidth = style.maxWidth = style.width = ret; ret = computed.width; // Revert the changed values style.width = width; style.minWidth = minWidth; style.maxWidth = maxWidth; } } return ret !== undefined ? // Support: IE <=9 - 11 only // IE returns zIndex value as an integer. ret + "" : ret; } function addGetHookIf( conditionFn, hookFn ) { // Define the hook, we'll check on the first run if it's really needed. return { get: function() { if ( conditionFn() ) { // Hook not needed (or it's not possible to use it due // to missing dependency), remove it. delete this.get; return; } // Hook needed; redefine it so that the support test is not executed again. return ( this.get = hookFn ).apply( this, arguments ); } }; } var // Swappable if display is none or starts with table // except "table", "table-cell", or "table-caption" // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display rdisplayswap = /^(none|table(?!-c[ea]).+)/, rcustomProp = /^--/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { letterSpacing: "0", fontWeight: "400" }, cssPrefixes = [ "Webkit", "Moz", "ms" ], emptyStyle = document.createElement( "div" ).style; // Return a css property mapped to a potentially vendor prefixed property function vendorPropName( name ) { // Shortcut for names that are not vendor prefixed if ( name in emptyStyle ) { return name; } // Check for vendor prefixed names var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), i = cssPrefixes.length; while ( i-- ) { name = cssPrefixes[ i ] + capName; if ( name in emptyStyle ) { return name; } } } // Return a property mapped along what jQuery.cssProps suggests or to // a vendor prefixed property. function finalPropName( name ) { var ret = jQuery.cssProps[ name ]; if ( !ret ) { ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; } return ret; } function setPositiveNumber( elem, value, subtract ) { // Any relative (+/-) values have already been // normalized at this point var matches = rcssNum.exec( value ); return matches ? // Guard against undefined "subtract", e.g., when used as in cssHooks Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : value; } function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { var i = dimension === "width" ? 1 : 0, extra = 0, delta = 0; // Adjustment may not be necessary if ( box === ( isBorderBox ? "border" : "content" ) ) { return 0; } for ( ; i < 4; i += 2 ) { // Both box models exclude margin if ( box === "margin" ) { delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); } // If we get here with a content-box, we're seeking "padding" or "border" or "margin" if ( !isBorderBox ) { // Add padding delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); // For "border" or "margin", add border if ( box !== "padding" ) { delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); // But still keep track of it otherwise } else { extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } // If we get here with a border-box (content + padding + border), we're seeking "content" or // "padding" or "margin" } else { // For "content", subtract padding if ( box === "content" ) { delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); } // For "content" or "padding", subtract border if ( box !== "margin" ) { delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } } } // Account for positive content-box scroll gutter when requested by providing computedVal if ( !isBorderBox && computedVal >= 0 ) { // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border // Assuming integer scroll gutter, subtract the rest and round down delta += Math.max( 0, Math.ceil( elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - computedVal - delta - extra - 0.5 ) ); } return delta; } function getWidthOrHeight( elem, dimension, extra ) { // Start with computed style var styles = getStyles( elem ), val = curCSS( elem, dimension, styles ), isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", valueIsBorderBox = isBorderBox; // Support: Firefox <=54 // Return a confounding non-pixel value or feign ignorance, as appropriate. if ( rnumnonpx.test( val ) ) { if ( !extra ) { return val; } val = "auto"; } // Check for style in case a browser which returns unreliable values // for getComputedStyle silently falls back to the reliable elem.style valueIsBorderBox = valueIsBorderBox && ( support.boxSizingReliable() || val === elem.style[ dimension ] ); // Fall back to offsetWidth/offsetHeight when value is "auto" // This happens for inline elements with no explicit setting (gh-3571) // Support: Android <=4.1 - 4.3 only // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) if ( val === "auto" || !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) { val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ]; // offsetWidth/offsetHeight provide border-box values valueIsBorderBox = true; } // Normalize "" and auto val = parseFloat( val ) || 0; // Adjust for the element's box model return ( val + boxModelAdjustment( elem, dimension, extra || ( isBorderBox ? "border" : "content" ), valueIsBorderBox, styles, // Provide the current computed size to request scroll gutter calculation (gh-3589) val ) ) + "px"; } jQuery.extend( { // Add in style property hooks for overriding the default // behavior of getting and setting a style property cssHooks: { opacity: { get: function( elem, computed ) { if ( computed ) { // We should always get a number back from opacity var ret = curCSS( elem, "opacity" ); return ret === "" ? "1" : ret; } } } }, // Don't automatically add "px" to these possibly-unitless properties cssNumber: { "animationIterationCount": true, "columnCount": true, "fillOpacity": true, "flexGrow": true, "flexShrink": true, "fontWeight": true, "lineHeight": true, "opacity": true, "order": true, "orphans": true, "widows": true, "zIndex": true, "zoom": true }, // Add in properties whose names you wish to fix before // setting or getting the value cssProps: {}, // Get and set the style property on a DOM Node style: function( elem, name, value, extra ) { // Don't set styles on text and comment nodes if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { return; } // Make sure that we're working with the right name var ret, type, hooks, origName = camelCase( name ), isCustomProp = rcustomProp.test( name ), style = elem.style; // Make sure that we're working with the right name. We don't // want to query the value if it is a CSS custom property // since they are user-defined. if ( !isCustomProp ) { name = finalPropName( origName ); } // Gets hook for the prefixed version, then unprefixed version hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // Check if we're setting a value if ( value !== undefined ) { type = typeof value; // Convert "+=" or "-=" to relative numbers (#7345) if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { value = adjustCSS( elem, name, ret ); // Fixes bug #9237 type = "number"; } // Make sure that null and NaN values aren't set (#7116) if ( value == null || value !== value ) { return; } // If a number was passed in, add the unit (except for certain CSS properties) if ( type === "number" ) { value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); } // background-* props affect original clone's values if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { style[ name ] = "inherit"; } // If a hook was provided, use that value, otherwise just set the specified value if ( !hooks || !( "set" in hooks ) || ( value = hooks.set( elem, value, extra ) ) !== undefined ) { if ( isCustomProp ) { style.setProperty( name, value ); } else { style[ name ] = value; } } } else { // If a hook was provided get the non-computed value from there if ( hooks && "get" in hooks && ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { return ret; } // Otherwise just get the value from the style object return style[ name ]; } }, css: function( elem, name, extra, styles ) { var val, num, hooks, origName = camelCase( name ), isCustomProp = rcustomProp.test( name ); // Make sure that we're working with the right name. We don't // want to modify the value if it is a CSS custom property // since they are user-defined. if ( !isCustomProp ) { name = finalPropName( origName ); } // Try prefixed name followed by the unprefixed name hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // If a hook was provided get the computed value from there if ( hooks && "get" in hooks ) { val = hooks.get( elem, true, extra ); } // Otherwise, if a way to get the computed value exists, use that if ( val === undefined ) { val = curCSS( elem, name, styles ); } // Convert "normal" to computed value if ( val === "normal" && name in cssNormalTransform ) { val = cssNormalTransform[ name ]; } // Make numeric if forced or a qualifier was provided and val looks numeric if ( extra === "" || extra ) { num = parseFloat( val ); return extra === true || isFinite( num ) ? num || 0 : val; } return val; } } ); jQuery.each( [ "height", "width" ], function( i, dimension ) { jQuery.cssHooks[ dimension ] = { get: function( elem, computed, extra ) { if ( computed ) { // Certain elements can have dimension info if we invisibly show them // but it must have a current display style that would benefit return rdisplayswap.test( jQuery.css( elem, "display" ) ) && // Support: Safari 8+ // Table columns in Safari have non-zero offsetWidth & zero // getBoundingClientRect().width unless display is changed. // Support: IE <=11 only // Running getBoundingClientRect on a disconnected node // in IE throws an error. ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? swap( elem, cssShow, function() { return getWidthOrHeight( elem, dimension, extra ); } ) : getWidthOrHeight( elem, dimension, extra ); } }, set: function( elem, value, extra ) { var matches, styles = getStyles( elem ), isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", subtract = extra && boxModelAdjustment( elem, dimension, extra, isBorderBox, styles ); // Account for unreliable border-box dimensions by comparing offset* to computed and // faking a content-box to get border and padding (gh-3699) if ( isBorderBox && support.scrollboxSize() === styles.position ) { subtract -= Math.ceil( elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - parseFloat( styles[ dimension ] ) - boxModelAdjustment( elem, dimension, "border", false, styles ) - 0.5 ); } // Convert to pixels if value adjustment is needed if ( subtract && ( matches = rcssNum.exec( value ) ) && ( matches[ 3 ] || "px" ) !== "px" ) { elem.style[ dimension ] = value; value = jQuery.css( elem, dimension ); } return setPositiveNumber( elem, value, subtract ); } }; } ); jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, function( elem, computed ) { if ( computed ) { return ( parseFloat( curCSS( elem, "marginLeft" ) ) || elem.getBoundingClientRect().left - swap( elem, { marginLeft: 0 }, function() { return elem.getBoundingClientRect().left; } ) ) + "px"; } } ); // These hooks are used by animate to expand properties jQuery.each( { margin: "", padding: "", border: "Width" }, function( prefix, suffix ) { jQuery.cssHooks[ prefix + suffix ] = { expand: function( value ) { var i = 0, expanded = {}, // Assumes a single number if not a string parts = typeof value === "string" ? value.split( " " ) : [ value ]; for ( ; i < 4; i++ ) { expanded[ prefix + cssExpand[ i ] + suffix ] = parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; } return expanded; } }; if ( prefix !== "margin" ) { jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; } } ); jQuery.fn.extend( { css: function( name, value ) { return access( this, function( elem, name, value ) { var styles, len, map = {}, i = 0; if ( Array.isArray( name ) ) { styles = getStyles( elem ); len = name.length; for ( ; i < len; i++ ) { map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); } return map; } return value !== undefined ? jQuery.style( elem, name, value ) : jQuery.css( elem, name ); }, name, value, arguments.length > 1 ); } } ); function Tween( elem, options, prop, end, easing ) { return new Tween.prototype.init( elem, options, prop, end, easing ); } jQuery.Tween = Tween; Tween.prototype = { constructor: Tween, init: function( elem, options, prop, end, easing, unit ) { this.elem = elem; this.prop = prop; this.easing = easing || jQuery.easing._default; this.options = options; this.start = this.now = this.cur(); this.end = end; this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); }, cur: function() { var hooks = Tween.propHooks[ this.prop ]; return hooks && hooks.get ? hooks.get( this ) : Tween.propHooks._default.get( this ); }, run: function( percent ) { var eased, hooks = Tween.propHooks[ this.prop ]; if ( this.options.duration ) { this.pos = eased = jQuery.easing[ this.easing ]( percent, this.options.duration * percent, 0, 1, this.options.duration ); } else { this.pos = eased = percent; } this.now = ( this.end - this.start ) * eased + this.start; if ( this.options.step ) { this.options.step.call( this.elem, this.now, this ); } if ( hooks && hooks.set ) { hooks.set( this ); } else { Tween.propHooks._default.set( this ); } return this; } }; Tween.prototype.init.prototype = Tween.prototype; Tween.propHooks = { _default: { get: function( tween ) { var result; // Use a property on the element directly when it is not a DOM element, // or when there is no matching style property that exists. if ( tween.elem.nodeType !== 1 || tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { return tween.elem[ tween.prop ]; } // Passing an empty string as a 3rd parameter to .css will automatically // attempt a parseFloat and fallback to a string if the parse fails. // Simple values such as "10px" are parsed to Float; // complex values such as "rotate(1rad)" are returned as-is. result = jQuery.css( tween.elem, tween.prop, "" ); // Empty strings, null, undefined and "auto" are converted to 0. return !result || result === "auto" ? 0 : result; }, set: function( tween ) { // Use step hook for back compat. // Use cssHook if its there. // Use .style if available and use plain properties where available. if ( jQuery.fx.step[ tween.prop ] ) { jQuery.fx.step[ tween.prop ]( tween ); } else if ( tween.elem.nodeType === 1 && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) { jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); } else { tween.elem[ tween.prop ] = tween.now; } } } }; // Support: IE <=9 only // Panic based approach to setting things on disconnected nodes Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { set: function( tween ) { if ( tween.elem.nodeType && tween.elem.parentNode ) { tween.elem[ tween.prop ] = tween.now; } } }; jQuery.easing = { linear: function( p ) { return p; }, swing: function( p ) { return 0.5 - Math.cos( p * Math.PI ) / 2; }, _default: "swing" }; jQuery.fx = Tween.prototype.init; // Back compat <1.8 extension point jQuery.fx.step = {}; var fxNow, inProgress, rfxtypes = /^(?:toggle|show|hide)$/, rrun = /queueHooks$/; function schedule() { if ( inProgress ) { if ( document.hidden === false && window.requestAnimationFrame ) { window.requestAnimationFrame( schedule ); } else { window.setTimeout( schedule, jQuery.fx.interval ); } jQuery.fx.tick(); } } // Animations created synchronously will run synchronously function createFxNow() { window.setTimeout( function() { fxNow = undefined; } ); return ( fxNow = Date.now() ); } // Generate parameters to create a standard animation function genFx( type, includeWidth ) { var which, i = 0, attrs = { height: type }; // If we include width, step value is 1 to do all cssExpand values, // otherwise step value is 2 to skip over Left and Right includeWidth = includeWidth ? 1 : 0; for ( ; i < 4; i += 2 - includeWidth ) { which = cssExpand[ i ]; attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; } if ( includeWidth ) { attrs.opacity = attrs.width = type; } return attrs; } function createTween( value, prop, animation ) { var tween, collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), index = 0, length = collection.length; for ( ; index < length; index++ ) { if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { // We're done with this property return tween; } } } function defaultPrefilter( elem, props, opts ) { var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, isBox = "width" in props || "height" in props, anim = this, orig = {}, style = elem.style, hidden = elem.nodeType && isHiddenWithinTree( elem ), dataShow = dataPriv.get( elem, "fxshow" ); // Queue-skipping animations hijack the fx hooks if ( !opts.queue ) { hooks = jQuery._queueHooks( elem, "fx" ); if ( hooks.unqueued == null ) { hooks.unqueued = 0; oldfire = hooks.empty.fire; hooks.empty.fire = function() { if ( !hooks.unqueued ) { oldfire(); } }; } hooks.unqueued++; anim.always( function() { // Ensure the complete handler is called before this completes anim.always( function() { hooks.unqueued--; if ( !jQuery.queue( elem, "fx" ).length ) { hooks.empty.fire(); } } ); } ); } // Detect show/hide animations for ( prop in props ) { value = props[ prop ]; if ( rfxtypes.test( value ) ) { delete props[ prop ]; toggle = toggle || value === "toggle"; if ( value === ( hidden ? "hide" : "show" ) ) { // Pretend to be hidden if this is a "show" and // there is still data from a stopped show/hide if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { hidden = true; // Ignore all other no-op show/hide data } else { continue; } } orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); } } // Bail out if this is a no-op like .hide().hide() propTween = !jQuery.isEmptyObject( props ); if ( !propTween && jQuery.isEmptyObject( orig ) ) { return; } // Restrict "overflow" and "display" styles during box animations if ( isBox && elem.nodeType === 1 ) { // Support: IE <=9 - 11, Edge 12 - 15 // Record all 3 overflow attributes because IE does not infer the shorthand // from identically-valued overflowX and overflowY and Edge just mirrors // the overflowX value there. opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; // Identify a display type, preferring old show/hide data over the CSS cascade restoreDisplay = dataShow && dataShow.display; if ( restoreDisplay == null ) { restoreDisplay = dataPriv.get( elem, "display" ); } display = jQuery.css( elem, "display" ); if ( display === "none" ) { if ( restoreDisplay ) { display = restoreDisplay; } else { // Get nonempty value(s) by temporarily forcing visibility showHide( [ elem ], true ); restoreDisplay = elem.style.display || restoreDisplay; display = jQuery.css( elem, "display" ); showHide( [ elem ] ); } } // Animate inline elements as inline-block if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { if ( jQuery.css( elem, "float" ) === "none" ) { // Restore the original display value at the end of pure show/hide animations if ( !propTween ) { anim.done( function() { style.display = restoreDisplay; } ); if ( restoreDisplay == null ) { display = style.display; restoreDisplay = display === "none" ? "" : display; } } style.display = "inline-block"; } } } if ( opts.overflow ) { style.overflow = "hidden"; anim.always( function() { style.overflow = opts.overflow[ 0 ]; style.overflowX = opts.overflow[ 1 ]; style.overflowY = opts.overflow[ 2 ]; } ); } // Implement show/hide animations propTween = false; for ( prop in orig ) { // General show/hide setup for this element animation if ( !propTween ) { if ( dataShow ) { if ( "hidden" in dataShow ) { hidden = dataShow.hidden; } } else { dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); } // Store hidden/visible for toggle so `.stop().toggle()` "reverses" if ( toggle ) { dataShow.hidden = !hidden; } // Show elements before animating them if ( hidden ) { showHide( [ elem ], true ); } /* eslint-disable no-loop-func */ anim.done( function() { /* eslint-enable no-loop-func */ // The final step of a "hide" animation is actually hiding the element if ( !hidden ) { showHide( [ elem ] ); } dataPriv.remove( elem, "fxshow" ); for ( prop in orig ) { jQuery.style( elem, prop, orig[ prop ] ); } } ); } // Per-property setup propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); if ( !( prop in dataShow ) ) { dataShow[ prop ] = propTween.start; if ( hidden ) { propTween.end = propTween.start; propTween.start = 0; } } } } function propFilter( props, specialEasing ) { var index, name, easing, value, hooks; // camelCase, specialEasing and expand cssHook pass for ( index in props ) { name = camelCase( index ); easing = specialEasing[ name ]; value = props[ index ]; if ( Array.isArray( value ) ) { easing = value[ 1 ]; value = props[ index ] = value[ 0 ]; } if ( index !== name ) { props[ name ] = value; delete props[ index ]; } hooks = jQuery.cssHooks[ name ]; if ( hooks && "expand" in hooks ) { value = hooks.expand( value ); delete props[ name ]; // Not quite $.extend, this won't overwrite existing keys. // Reusing 'index' because we have the correct "name" for ( index in value ) { if ( !( index in props ) ) { props[ index ] = value[ index ]; specialEasing[ index ] = easing; } } } else { specialEasing[ name ] = easing; } } } function Animation( elem, properties, options ) { var result, stopped, index = 0, length = Animation.prefilters.length, deferred = jQuery.Deferred().always( function() { // Don't match elem in the :animated selector delete tick.elem; } ), tick = function() { if ( stopped ) { return false; } var currentTime = fxNow || createFxNow(), remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), // Support: Android 2.3 only // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) temp = remaining / animation.duration || 0, percent = 1 - temp, index = 0, length = animation.tweens.length; for ( ; index < length; index++ ) { animation.tweens[ index ].run( percent ); } deferred.notifyWith( elem, [ animation, percent, remaining ] ); // If there's more to do, yield if ( percent < 1 && length ) { return remaining; } // If this was an empty animation, synthesize a final progress notification if ( !length ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); } // Resolve the animation and report its conclusion deferred.resolveWith( elem, [ animation ] ); return false; }, animation = deferred.promise( { elem: elem, props: jQuery.extend( {}, properties ), opts: jQuery.extend( true, { specialEasing: {}, easing: jQuery.easing._default }, options ), originalProperties: properties, originalOptions: options, startTime: fxNow || createFxNow(), duration: options.duration, tweens: [], createTween: function( prop, end ) { var tween = jQuery.Tween( elem, animation.opts, prop, end, animation.opts.specialEasing[ prop ] || animation.opts.easing ); animation.tweens.push( tween ); return tween; }, stop: function( gotoEnd ) { var index = 0, // If we are going to the end, we want to run all the tweens // otherwise we skip this part length = gotoEnd ? animation.tweens.length : 0; if ( stopped ) { return this; } stopped = true; for ( ; index < length; index++ ) { animation.tweens[ index ].run( 1 ); } // Resolve when we played the last frame; otherwise, reject if ( gotoEnd ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); deferred.resolveWith( elem, [ animation, gotoEnd ] ); } else { deferred.rejectWith( elem, [ animation, gotoEnd ] ); } return this; } } ), props = animation.props; propFilter( props, animation.opts.specialEasing ); for ( ; index < length; index++ ) { result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); if ( result ) { if ( isFunction( result.stop ) ) { jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = result.stop.bind( result ); } return result; } } jQuery.map( props, createTween, animation ); if ( isFunction( animation.opts.start ) ) { animation.opts.start.call( elem, animation ); } // Attach callbacks from options animation .progress( animation.opts.progress ) .done( animation.opts.done, animation.opts.complete ) .fail( animation.opts.fail ) .always( animation.opts.always ); jQuery.fx.timer( jQuery.extend( tick, { elem: elem, anim: animation, queue: animation.opts.queue } ) ); return animation; } jQuery.Animation = jQuery.extend( Animation, { tweeners: { "*": [ function( prop, value ) { var tween = this.createTween( prop, value ); adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); return tween; } ] }, tweener: function( props, callback ) { if ( isFunction( props ) ) { callback = props; props = [ "*" ]; } else { props = props.match( rnothtmlwhite ); } var prop, index = 0, length = props.length; for ( ; index < length; index++ ) { prop = props[ index ]; Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; Animation.tweeners[ prop ].unshift( callback ); } }, prefilters: [ defaultPrefilter ], prefilter: function( callback, prepend ) { if ( prepend ) { Animation.prefilters.unshift( callback ); } else { Animation.prefilters.push( callback ); } } } ); jQuery.speed = function( speed, easing, fn ) { var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { complete: fn || !fn && easing || isFunction( speed ) && speed, duration: speed, easing: fn && easing || easing && !isFunction( easing ) && easing }; // Go to the end state if fx are off if ( jQuery.fx.off ) { opt.duration = 0; } else { if ( typeof opt.duration !== "number" ) { if ( opt.duration in jQuery.fx.speeds ) { opt.duration = jQuery.fx.speeds[ opt.duration ]; } else { opt.duration = jQuery.fx.speeds._default; } } } // Normalize opt.queue - true/undefined/null -> "fx" if ( opt.queue == null || opt.queue === true ) { opt.queue = "fx"; } // Queueing opt.old = opt.complete; opt.complete = function() { if ( isFunction( opt.old ) ) { opt.old.call( this ); } if ( opt.queue ) { jQuery.dequeue( this, opt.queue ); } }; return opt; }; jQuery.fn.extend( { fadeTo: function( speed, to, easing, callback ) { // Show any hidden elements after setting opacity to 0 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() // Animate to the value specified .end().animate( { opacity: to }, speed, easing, callback ); }, animate: function( prop, speed, easing, callback ) { var empty = jQuery.isEmptyObject( prop ), optall = jQuery.speed( speed, easing, callback ), doAnimation = function() { // Operate on a copy of prop so per-property easing won't be lost var anim = Animation( this, jQuery.extend( {}, prop ), optall ); // Empty animations, or finishing resolves immediately if ( empty || dataPriv.get( this, "finish" ) ) { anim.stop( true ); } }; doAnimation.finish = doAnimation; return empty || optall.queue === false ? this.each( doAnimation ) : this.queue( optall.queue, doAnimation ); }, stop: function( type, clearQueue, gotoEnd ) { var stopQueue = function( hooks ) { var stop = hooks.stop; delete hooks.stop; stop( gotoEnd ); }; if ( typeof type !== "string" ) { gotoEnd = clearQueue; clearQueue = type; type = undefined; } if ( clearQueue && type !== false ) { this.queue( type || "fx", [] ); } return this.each( function() { var dequeue = true, index = type != null && type + "queueHooks", timers = jQuery.timers, data = dataPriv.get( this ); if ( index ) { if ( data[ index ] && data[ index ].stop ) { stopQueue( data[ index ] ); } } else { for ( index in data ) { if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { stopQueue( data[ index ] ); } } } for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && ( type == null || timers[ index ].queue === type ) ) { timers[ index ].anim.stop( gotoEnd ); dequeue = false; timers.splice( index, 1 ); } } // Start the next in the queue if the last step wasn't forced. // Timers currently will call their complete callbacks, which // will dequeue but only if they were gotoEnd. if ( dequeue || !gotoEnd ) { jQuery.dequeue( this, type ); } } ); }, finish: function( type ) { if ( type !== false ) { type = type || "fx"; } return this.each( function() { var index, data = dataPriv.get( this ), queue = data[ type + "queue" ], hooks = data[ type + "queueHooks" ], timers = jQuery.timers, length = queue ? queue.length : 0; // Enable finishing flag on private data data.finish = true; // Empty the queue first jQuery.queue( this, type, [] ); if ( hooks && hooks.stop ) { hooks.stop.call( this, true ); } // Look for any active animations, and finish them for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && timers[ index ].queue === type ) { timers[ index ].anim.stop( true ); timers.splice( index, 1 ); } } // Look for any animations in the old queue and finish them for ( index = 0; index < length; index++ ) { if ( queue[ index ] && queue[ index ].finish ) { queue[ index ].finish.call( this ); } } // Turn off finishing flag delete data.finish; } ); } } ); jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { var cssFn = jQuery.fn[ name ]; jQuery.fn[ name ] = function( speed, easing, callback ) { return speed == null || typeof speed === "boolean" ? cssFn.apply( this, arguments ) : this.animate( genFx( name, true ), speed, easing, callback ); }; } ); // Generate shortcuts for custom animations jQuery.each( { slideDown: genFx( "show" ), slideUp: genFx( "hide" ), slideToggle: genFx( "toggle" ), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide" }, fadeToggle: { opacity: "toggle" } }, function( name, props ) { jQuery.fn[ name ] = function( speed, easing, callback ) { return this.animate( props, speed, easing, callback ); }; } ); jQuery.timers = []; jQuery.fx.tick = function() { var timer, i = 0, timers = jQuery.timers; fxNow = Date.now(); for ( ; i < timers.length; i++ ) { timer = timers[ i ]; // Run the timer and safely remove it when done (allowing for external removal) if ( !timer() && timers[ i ] === timer ) { timers.splice( i--, 1 ); } } if ( !timers.length ) { jQuery.fx.stop(); } fxNow = undefined; }; jQuery.fx.timer = function( timer ) { jQuery.timers.push( timer ); jQuery.fx.start(); }; jQuery.fx.interval = 13; jQuery.fx.start = function() { if ( inProgress ) { return; } inProgress = true; schedule(); }; jQuery.fx.stop = function() { inProgress = null; }; jQuery.fx.speeds = { slow: 600, fast: 200, // Default speed _default: 400 }; // Based off of the plugin by Clint Helfers, with permission. // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ jQuery.fn.delay = function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = window.setTimeout( next, time ); hooks.stop = function() { window.clearTimeout( timeout ); }; } ); }; ( function() { var input = document.createElement( "input" ), select = document.createElement( "select" ), opt = select.appendChild( document.createElement( "option" ) ); input.type = "checkbox"; // Support: Android <=4.3 only // Default value for a checkbox should be "on" support.checkOn = input.value !== ""; // Support: IE <=11 only // Must access selectedIndex to make default options select support.optSelected = opt.selected; // Support: IE <=11 only // An input loses its value after becoming a radio input = document.createElement( "input" ); input.value = "t"; input.type = "radio"; support.radioValue = input.value === "t"; } )(); var boolHook, attrHandle = jQuery.expr.attrHandle; jQuery.fn.extend( { attr: function( name, value ) { return access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each( function() { jQuery.removeAttr( this, name ); } ); } } ); jQuery.extend( { attr: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType; // Don't get/set attributes on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } // Attribute hooks are determined by the lowercase version // Grab necessary hook if one is defined if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { hooks = jQuery.attrHooks[ name.toLowerCase() ] || ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; } elem.setAttribute( name, value + "" ); return value; } if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; } ret = jQuery.find.attr( elem, name ); // Non-existent attributes return null, we normalize to undefined return ret == null ? undefined : ret; }, attrHooks: { type: { set: function( elem, value ) { if ( !support.radioValue && value === "radio" && nodeName( elem, "input" ) ) { var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } } }, removeAttr: function( elem, value ) { var name, i = 0, // Attribute names can contain non-HTML whitespace characters // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 attrNames = value && value.match( rnothtmlwhite ); if ( attrNames && elem.nodeType === 1 ) { while ( ( name = attrNames[ i++ ] ) ) { elem.removeAttribute( name ); } } } } ); // Hooks for boolean attributes boolHook = { set: function( elem, value, name ) { if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { elem.setAttribute( name, name ); } return name; } }; jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { var getter = attrHandle[ name ] || jQuery.find.attr; attrHandle[ name ] = function( elem, name, isXML ) { var ret, handle, lowercaseName = name.toLowerCase(); if ( !isXML ) { // Avoid an infinite loop by temporarily removing this function from the getter handle = attrHandle[ lowercaseName ]; attrHandle[ lowercaseName ] = ret; ret = getter( elem, name, isXML ) != null ? lowercaseName : null; attrHandle[ lowercaseName ] = handle; } return ret; }; } ); var rfocusable = /^(?:input|select|textarea|button)$/i, rclickable = /^(?:a|area)$/i; jQuery.fn.extend( { prop: function( name, value ) { return access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { return this.each( function() { delete this[ jQuery.propFix[ name ] || name ]; } ); } } ); jQuery.extend( { prop: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType; // Don't get/set properties on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; } if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; } return ( elem[ name ] = value ); } if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; } return elem[ name ]; }, propHooks: { tabIndex: { get: function( elem ) { // Support: IE <=9 - 11 only // elem.tabIndex doesn't always return the // correct value when it hasn't been explicitly set // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ // Use proper attribute retrieval(#12072) var tabindex = jQuery.find.attr( elem, "tabindex" ); if ( tabindex ) { return parseInt( tabindex, 10 ); } if ( rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ) { return 0; } return -1; } } }, propFix: { "for": "htmlFor", "class": "className" } } ); // Support: IE <=11 only // Accessing the selectedIndex property // forces the browser to respect setting selected // on the option // The getter ensures a default option is selected // when in an optgroup // eslint rule "no-unused-expressions" is disabled for this code // since it considers such accessions noop if ( !support.optSelected ) { jQuery.propHooks.selected = { get: function( elem ) { /* eslint no-unused-expressions: "off" */ var parent = elem.parentNode; if ( parent && parent.parentNode ) { parent.parentNode.selectedIndex; } return null; }, set: function( elem ) { /* eslint no-unused-expressions: "off" */ var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } } }; } jQuery.each( [ "tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable" ], function() { jQuery.propFix[ this.toLowerCase() ] = this; } ); // Strip and collapse whitespace according to HTML spec // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace function stripAndCollapse( value ) { var tokens = value.match( rnothtmlwhite ) || []; return tokens.join( " " ); } function getClass( elem ) { return elem.getAttribute && elem.getAttribute( "class" ) || ""; } function classesToArray( value ) { if ( Array.isArray( value ) ) { return value; } if ( typeof value === "string" ) { return value.match( rnothtmlwhite ) || []; } return []; } jQuery.fn.extend( { addClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); } ); } classes = classesToArray( value ); if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { if ( cur.indexOf( " " + clazz + " " ) < 0 ) { cur += clazz + " "; } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { elem.setAttribute( "class", finalValue ); } } } } return this; }, removeClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); } ); } if ( !arguments.length ) { return this.attr( "class", "" ); } classes = classesToArray( value ); if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); // This expression is here for better compressibility (see addClass) cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { // Remove *all* instances while ( cur.indexOf( " " + clazz + " " ) > -1 ) { cur = cur.replace( " " + clazz + " ", " " ); } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { elem.setAttribute( "class", finalValue ); } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isValidValue = type === "string" || Array.isArray( value ); if ( typeof stateVal === "boolean" && isValidValue ) { return stateVal ? this.addClass( value ) : this.removeClass( value ); } if ( isFunction( value ) ) { return this.each( function( i ) { jQuery( this ).toggleClass( value.call( this, i, getClass( this ), stateVal ), stateVal ); } ); } return this.each( function() { var className, i, self, classNames; if ( isValidValue ) { // Toggle individual class names i = 0; self = jQuery( this ); classNames = classesToArray( value ); while ( ( className = classNames[ i++ ] ) ) { // Check each className given, space separated list if ( self.hasClass( className ) ) { self.removeClass( className ); } else { self.addClass( className ); } } // Toggle whole class name } else if ( value === undefined || type === "boolean" ) { className = getClass( this ); if ( className ) { // Store className if set dataPriv.set( this, "__className__", className ); } // If the element has a class name or if we're passed `false`, // then remove the whole classname (if there was one, the above saved it). // Otherwise bring back whatever was previously saved (if anything), // falling back to the empty string if nothing was stored. if ( this.setAttribute ) { this.setAttribute( "class", className || value === false ? "" : dataPriv.get( this, "__className__" ) || "" ); } } } ); }, hasClass: function( selector ) { var className, elem, i = 0; className = " " + selector + " "; while ( ( elem = this[ i++ ] ) ) { if ( elem.nodeType === 1 && ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { return true; } } return false; } } ); var rreturn = /\r/g; jQuery.fn.extend( { val: function( value ) { var hooks, ret, valueIsFunction, elem = this[ 0 ]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && ( ret = hooks.get( elem, "value" ) ) !== undefined ) { return ret; } ret = elem.value; // Handle most common string cases if ( typeof ret === "string" ) { return ret.replace( rreturn, "" ); } // Handle cases where value is null/undef or number return ret == null ? "" : ret; } return; } valueIsFunction = isFunction( value ); return this.each( function( i ) { var val; if ( this.nodeType !== 1 ) { return; } if ( valueIsFunction ) { val = value.call( this, i, jQuery( this ).val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( Array.isArray( val ) ) { val = jQuery.map( val, function( value ) { return value == null ? "" : value + ""; } ); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } } ); } } ); jQuery.extend( { valHooks: { option: { get: function( elem ) { var val = jQuery.find.attr( elem, "value" ); return val != null ? val : // Support: IE <=10 - 11 only // option.text throws exceptions (#14686, #14858) // Strip and collapse whitespace // https://html.spec.whatwg.org/#strip-and-collapse-whitespace stripAndCollapse( jQuery.text( elem ) ); } }, select: { get: function( elem ) { var value, option, i, options = elem.options, index = elem.selectedIndex, one = elem.type === "select-one", values = one ? null : [], max = one ? index + 1 : options.length; if ( index < 0 ) { i = max; } else { i = one ? index : 0; } // Loop through all the selected options for ( ; i < max; i++ ) { option = options[ i ]; // Support: IE <=9 only // IE8-9 doesn't update selected after form reset (#2551) if ( ( option.selected || i === index ) && // Don't return options that are disabled or in a disabled optgroup !option.disabled && ( !option.parentNode.disabled || !nodeName( option.parentNode, "optgroup" ) ) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } return values; }, set: function( elem, value ) { var optionSet, option, options = elem.options, values = jQuery.makeArray( value ), i = options.length; while ( i-- ) { option = options[ i ]; /* eslint-disable no-cond-assign */ if ( option.selected = jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) { optionSet = true; } /* eslint-enable no-cond-assign */ } // Force browsers to behave consistently when non-matching value is set if ( !optionSet ) { elem.selectedIndex = -1; } return values; } } } } ); // Radios and checkboxes getter/setter jQuery.each( [ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { set: function( elem, value ) { if ( Array.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); } } }; if ( !support.checkOn ) { jQuery.valHooks[ this ].get = function( elem ) { return elem.getAttribute( "value" ) === null ? "on" : elem.value; }; } } ); // Return jQuery for attributes-only inclusion support.focusin = "onfocusin" in window; var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, stopPropagationCallback = function( e ) { e.stopPropagation(); }; jQuery.extend( jQuery.event, { trigger: function( event, data, elem, onlyHandlers ) { var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; cur = lastElement = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "." ) > -1 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split( "." ); type = namespaces.shift(); namespaces.sort(); } ontype = type.indexOf( ":" ) < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string event = event[ jQuery.expando ] ? event : new jQuery.Event( type, typeof event === "object" && event ); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) event.isTrigger = onlyHandlers ? 2 : 3; event.namespace = namespaces.join( "." ); event.rnamespace = event.namespace ? new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : null; // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data == null ? [ event ] : jQuery.makeArray( data, [ event ] ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { cur = cur.parentNode; } for ( ; cur; cur = cur.parentNode ) { eventPath.push( cur ); tmp = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( tmp === ( elem.ownerDocument || document ) ) { eventPath.push( tmp.defaultView || tmp.parentWindow || window ); } } // Fire handlers on the event path i = 0; while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { lastElement = cur; event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && dataPriv.get( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Native handler handle = ontype && cur[ ontype ]; if ( handle && handle.apply && acceptData( cur ) ) { event.result = handle.apply( cur, data ); if ( event.result === false ) { event.preventDefault(); } } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( ( !special._default || special._default.apply( eventPath.pop(), data ) === false ) && acceptData( elem ) ) { // Call a native DOM method on the target with the same name as the event. // Don't do default actions on window, that's where global variables be (#6170) if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; if ( tmp ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; if ( event.isPropagationStopped() ) { lastElement.addEventListener( type, stopPropagationCallback ); } elem[ type ](); if ( event.isPropagationStopped() ) { lastElement.removeEventListener( type, stopPropagationCallback ); } jQuery.event.triggered = undefined; if ( tmp ) { elem[ ontype ] = tmp; } } } } return event.result; }, // Piggyback on a donor event to simulate a different one // Used only for `focus(in | out)` events simulate: function( type, elem, event ) { var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true } ); jQuery.event.trigger( e, null, elem ); } } ); jQuery.fn.extend( { trigger: function( type, data ) { return this.each( function() { jQuery.event.trigger( type, data, this ); } ); }, triggerHandler: function( type, data ) { var elem = this[ 0 ]; if ( elem ) { return jQuery.event.trigger( type, data, elem, true ); } } } ); // Support: Firefox <=44 // Firefox doesn't have focus(in | out) events // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 // // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 // focus(in | out) events fire after focus & blur events, // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 if ( !support.focusin ) { jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler on the document while someone wants focusin/focusout var handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); }; jQuery.event.special[ fix ] = { setup: function() { var doc = this.ownerDocument || this, attaches = dataPriv.access( doc, fix ); if ( !attaches ) { doc.addEventListener( orig, handler, true ); } dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); }, teardown: function() { var doc = this.ownerDocument || this, attaches = dataPriv.access( doc, fix ) - 1; if ( !attaches ) { doc.removeEventListener( orig, handler, true ); dataPriv.remove( doc, fix ); } else { dataPriv.access( doc, fix, attaches ); } } }; } ); } var location = window.location; var nonce = Date.now(); var rquery = ( /\?/ ); // Cross-browser xml parsing jQuery.parseXML = function( data ) { var xml; if ( !data || typeof data !== "string" ) { return null; } // Support: IE 9 - 11 only // IE throws on parseFromString with invalid input. try { xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); } catch ( e ) { xml = undefined; } if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }; var rbracket = /\[\]$/, rCRLF = /\r?\n/g, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, rsubmittable = /^(?:input|select|textarea|keygen)/i; function buildParams( prefix, obj, traditional, add ) { var name; if ( Array.isArray( obj ) ) { // Serialize array item. jQuery.each( obj, function( i, v ) { if ( traditional || rbracket.test( prefix ) ) { // Treat each array item as a scalar. add( prefix, v ); } else { // Item is non-scalar (array or object), encode its numeric index. buildParams( prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", v, traditional, add ); } } ); } else if ( !traditional && toType( obj ) === "object" ) { // Serialize object item. for ( name in obj ) { buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); } } else { // Serialize scalar item. add( prefix, obj ); } } // Serialize an array of form elements or a set of // key/values into a query string jQuery.param = function( a, traditional ) { var prefix, s = [], add = function( key, valueOrFunction ) { // If value is a function, invoke it and use its return value var value = isFunction( valueOrFunction ) ? valueOrFunction() : valueOrFunction; s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value == null ? "" : value ); }; // If an array was passed in, assume that it is an array of form elements. if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { // Serialize the form elements jQuery.each( a, function() { add( this.name, this.value ); } ); } else { // If traditional, encode the "old" way (the way 1.3.2 or older // did it), otherwise encode params recursively. for ( prefix in a ) { buildParams( prefix, a[ prefix ], traditional, add ); } } // Return the resulting serialization return s.join( "&" ); }; jQuery.fn.extend( { serialize: function() { return jQuery.param( this.serializeArray() ); }, serializeArray: function() { return this.map( function() { // Can add propHook for "elements" to filter or add form elements var elements = jQuery.prop( this, "elements" ); return elements ? jQuery.makeArray( elements ) : this; } ) .filter( function() { var type = this.type; // Use .is( ":disabled" ) so that fieldset[disabled] works return this.name && !jQuery( this ).is( ":disabled" ) && rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && ( this.checked || !rcheckableType.test( type ) ); } ) .map( function( i, elem ) { var val = jQuery( this ).val(); if ( val == null ) { return null; } if ( Array.isArray( val ) ) { return jQuery.map( val, function( val ) { return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ); } return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ).get(); } } ); var r20 = /%20/g, rhash = /#.*$/, rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, // #7653, #8125, #8152: local protocol detection rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, /* Prefilters * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) * 2) These are called: * - BEFORE asking for a transport * - AFTER param serialization (s.data is a string if s.processData is true) * 3) key is the dataType * 4) the catchall symbol "*" can be used * 5) execution will start with transport dataType and THEN continue down to "*" if needed */ prefilters = {}, /* Transports bindings * 1) key is the dataType * 2) the catchall symbol "*" can be used * 3) selection will start with transport dataType and THEN go to "*" if needed */ transports = {}, // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression allTypes = "*/".concat( "*" ), // Anchor tag for parsing the document origin originAnchor = document.createElement( "a" ); originAnchor.href = location.href; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport function addToPrefiltersOrTransports( structure ) { // dataTypeExpression is optional and defaults to "*" return function( dataTypeExpression, func ) { if ( typeof dataTypeExpression !== "string" ) { func = dataTypeExpression; dataTypeExpression = "*"; } var dataType, i = 0, dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; if ( isFunction( func ) ) { // For each dataType in the dataTypeExpression while ( ( dataType = dataTypes[ i++ ] ) ) { // Prepend if requested if ( dataType[ 0 ] === "+" ) { dataType = dataType.slice( 1 ) || "*"; ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); // Otherwise append } else { ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); } } } }; } // Base inspection function for prefilters and transports function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { var inspected = {}, seekingTransport = ( structure === transports ); function inspect( dataType ) { var selected; inspected[ dataType ] = true; jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) { options.dataTypes.unshift( dataTypeOrTransport ); inspect( dataTypeOrTransport ); return false; } else if ( seekingTransport ) { return !( selected = dataTypeOrTransport ); } } ); return selected; } return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); } // A special extend for ajax options // that takes "flat" options (not to be deep extended) // Fixes #9887 function ajaxExtend( target, src ) { var key, deep, flatOptions = jQuery.ajaxSettings.flatOptions || {}; for ( key in src ) { if ( src[ key ] !== undefined ) { ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; } } if ( deep ) { jQuery.extend( true, target, deep ); } return target; } /* Handles responses to an ajax request: * - finds the right dataType (mediates between content-type and expected dataType) * - returns the corresponding response */ function ajaxHandleResponses( s, jqXHR, responses ) { var ct, type, finalDataType, firstDataType, contents = s.contents, dataTypes = s.dataTypes; // Remove auto dataType and get content-type in the process while ( dataTypes[ 0 ] === "*" ) { dataTypes.shift(); if ( ct === undefined ) { ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); } } // Check if we're dealing with a known content-type if ( ct ) { for ( type in contents ) { if ( contents[ type ] && contents[ type ].test( ct ) ) { dataTypes.unshift( type ); break; } } } // Check to see if we have a response for the expected dataType if ( dataTypes[ 0 ] in responses ) { finalDataType = dataTypes[ 0 ]; } else { // Try convertible dataTypes for ( type in responses ) { if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { finalDataType = type; break; } if ( !firstDataType ) { firstDataType = type; } } // Or just use first one finalDataType = finalDataType || firstDataType; } // If we found a dataType // We add the dataType to the list if needed // and return the corresponding response if ( finalDataType ) { if ( finalDataType !== dataTypes[ 0 ] ) { dataTypes.unshift( finalDataType ); } return responses[ finalDataType ]; } } /* Chain conversions given the request and the original response * Also sets the responseXXX fields on the jqXHR instance */ function ajaxConvert( s, response, jqXHR, isSuccess ) { var conv2, current, conv, tmp, prev, converters = {}, // Work with a copy of dataTypes in case we need to modify it for conversion dataTypes = s.dataTypes.slice(); // Create converters map with lowercased keys if ( dataTypes[ 1 ] ) { for ( conv in s.converters ) { converters[ conv.toLowerCase() ] = s.converters[ conv ]; } } current = dataTypes.shift(); // Convert to each sequential dataType while ( current ) { if ( s.responseFields[ current ] ) { jqXHR[ s.responseFields[ current ] ] = response; } // Apply the dataFilter if provided if ( !prev && isSuccess && s.dataFilter ) { response = s.dataFilter( response, s.dataType ); } prev = current; current = dataTypes.shift(); if ( current ) { // There's only work to do if current dataType is non-auto if ( current === "*" ) { current = prev; // Convert response if prev dataType is non-auto and differs from current } else if ( prev !== "*" && prev !== current ) { // Seek a direct converter conv = converters[ prev + " " + current ] || converters[ "* " + current ]; // If none found, seek a pair if ( !conv ) { for ( conv2 in converters ) { // If conv2 outputs current tmp = conv2.split( " " ); if ( tmp[ 1 ] === current ) { // If prev can be converted to accepted input conv = converters[ prev + " " + tmp[ 0 ] ] || converters[ "* " + tmp[ 0 ] ]; if ( conv ) { // Condense equivalence converters if ( conv === true ) { conv = converters[ conv2 ]; // Otherwise, insert the intermediate dataType } else if ( converters[ conv2 ] !== true ) { current = tmp[ 0 ]; dataTypes.unshift( tmp[ 1 ] ); } break; } } } } // Apply converter (if not an equivalence) if ( conv !== true ) { // Unless errors are allowed to bubble, catch and return them if ( conv && s.throws ) { response = conv( response ); } else { try { response = conv( response ); } catch ( e ) { return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; } } } } } } return { state: "success", data: response }; } jQuery.extend( { // Counter for holding the number of active queries active: 0, // Last-Modified header cache for next request lastModified: {}, etag: {}, ajaxSettings: { url: location.href, type: "GET", isLocal: rlocalProtocol.test( location.protocol ), global: true, processData: true, async: true, contentType: "application/x-www-form-urlencoded; charset=UTF-8", /* timeout: 0, data: null, dataType: null, username: null, password: null, cache: null, throws: false, traditional: false, headers: {}, */ accepts: { "*": allTypes, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript" }, contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, responseFields: { xml: "responseXML", text: "responseText", json: "responseJSON" }, // Data converters // Keys separate source (or catchall "*") and destination types with a single space converters: { // Convert anything to text "* text": String, // Text to html (true = no transformation) "text html": true, // Evaluate text as a json expression "text json": JSON.parse, // Parse text as xml "text xml": jQuery.parseXML }, // For options that shouldn't be deep extended: // you can add your own custom options here if // and when you create one that shouldn't be // deep extended (see ajaxExtend) flatOptions: { url: true, context: true } }, // Creates a full fledged settings object into target // with both ajaxSettings and settings fields. // If target is omitted, writes into ajaxSettings. ajaxSetup: function( target, settings ) { return settings ? // Building a settings object ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : // Extending ajaxSettings ajaxExtend( jQuery.ajaxSettings, target ); }, ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), ajaxTransport: addToPrefiltersOrTransports( transports ), // Main method ajax: function( url, options ) { // If url is an object, simulate pre-1.5 signature if ( typeof url === "object" ) { options = url; url = undefined; } // Force options to be an object options = options || {}; var transport, // URL without anti-cache param cacheURL, // Response headers responseHeadersString, responseHeaders, // timeout handle timeoutTimer, // Url cleanup var urlAnchor, // Request state (becomes false upon send and true upon completion) completed, // To know if global events are to be dispatched fireGlobals, // Loop variable i, // uncached part of the url uncached, // Create the final options object s = jQuery.ajaxSetup( {}, options ), // Callbacks context callbackContext = s.context || s, // Context for global events is callbackContext if it is a DOM node or jQuery collection globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? jQuery( callbackContext ) : jQuery.event, // Deferreds deferred = jQuery.Deferred(), completeDeferred = jQuery.Callbacks( "once memory" ), // Status-dependent callbacks statusCode = s.statusCode || {}, // Headers (they are sent all at once) requestHeaders = {}, requestHeadersNames = {}, // Default abort message strAbort = "canceled", // Fake xhr jqXHR = { readyState: 0, // Builds headers hashtable if needed getResponseHeader: function( key ) { var match; if ( completed ) { if ( !responseHeaders ) { responseHeaders = {}; while ( ( match = rheaders.exec( responseHeadersString ) ) ) { responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; } } match = responseHeaders[ key.toLowerCase() ]; } return match == null ? null : match; }, // Raw string getAllResponseHeaders: function() { return completed ? responseHeadersString : null; }, // Caches the header setRequestHeader: function( name, value ) { if ( completed == null ) { name = requestHeadersNames[ name.toLowerCase() ] = requestHeadersNames[ name.toLowerCase() ] || name; requestHeaders[ name ] = value; } return this; }, // Overrides response content-type header overrideMimeType: function( type ) { if ( completed == null ) { s.mimeType = type; } return this; }, // Status-dependent callbacks statusCode: function( map ) { var code; if ( map ) { if ( completed ) { // Execute the appropriate callbacks jqXHR.always( map[ jqXHR.status ] ); } else { // Lazy-add the new callbacks in a way that preserves old ones for ( code in map ) { statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; } } } return this; }, // Cancel the request abort: function( statusText ) { var finalText = statusText || strAbort; if ( transport ) { transport.abort( finalText ); } done( 0, finalText ); return this; } }; // Attach deferreds deferred.promise( jqXHR ); // Add protocol if not provided (prefilters might expect it) // Handle falsy url in the settings object (#10093: consistency with old signature) // We also use the url parameter if available s.url = ( ( url || s.url || location.href ) + "" ) .replace( rprotocol, location.protocol + "//" ); // Alias method option to type as per ticket #12004 s.type = options.method || options.type || s.method || s.type; // Extract dataTypes list s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; // A cross-domain request is in order when the origin doesn't match the current origin. if ( s.crossDomain == null ) { urlAnchor = document.createElement( "a" ); // Support: IE <=8 - 11, Edge 12 - 15 // IE throws exception on accessing the href property if url is malformed, // e.g. http://example.com:80x/ try { urlAnchor.href = s.url; // Support: IE <=8 - 11 only // Anchor's host property isn't correctly set when s.url is relative urlAnchor.href = urlAnchor.href; s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host; } catch ( e ) { // If there is an error parsing the URL, assume it is crossDomain, // it can be rejected by the transport if it is invalid s.crossDomain = true; } } // Convert data if not already a string if ( s.data && s.processData && typeof s.data !== "string" ) { s.data = jQuery.param( s.data, s.traditional ); } // Apply prefilters inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); // If request was aborted inside a prefilter, stop there if ( completed ) { return jqXHR; } // We can fire global events as of now if asked to // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) fireGlobals = jQuery.event && s.global; // Watch for a new set of requests if ( fireGlobals && jQuery.active++ === 0 ) { jQuery.event.trigger( "ajaxStart" ); } // Uppercase the type s.type = s.type.toUpperCase(); // Determine if request has content s.hasContent = !rnoContent.test( s.type ); // Save the URL in case we're toying with the If-Modified-Since // and/or If-None-Match header later on // Remove hash to simplify url manipulation cacheURL = s.url.replace( rhash, "" ); // More options handling for requests with no content if ( !s.hasContent ) { // Remember the hash so we can put it back uncached = s.url.slice( cacheURL.length ); // If data is available and should be processed, append data to url if ( s.data && ( s.processData || typeof s.data === "string" ) ) { cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; // #9682: remove data so that it's not used in an eventual retry delete s.data; } // Add or update anti-cache param if needed if ( s.cache === false ) { cacheURL = cacheURL.replace( rantiCache, "$1" ); uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; } // Put hash and anti-cache on the URL that will be requested (gh-1732) s.url = cacheURL + uncached; // Change '%20' to '+' if this is encoded form body content (gh-2658) } else if ( s.data && s.processData && ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { s.data = s.data.replace( r20, "+" ); } // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { if ( jQuery.lastModified[ cacheURL ] ) { jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); } if ( jQuery.etag[ cacheURL ] ) { jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); } } // Set the correct header, if data is being sent if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { jqXHR.setRequestHeader( "Content-Type", s.contentType ); } // Set the Accepts header for the server, depending on the dataType jqXHR.setRequestHeader( "Accept", s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? s.accepts[ s.dataTypes[ 0 ] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : s.accepts[ "*" ] ); // Check for headers option for ( i in s.headers ) { jqXHR.setRequestHeader( i, s.headers[ i ] ); } // Allow custom headers/mimetypes and early abort if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { // Abort if not done already and return return jqXHR.abort(); } // Aborting is no longer a cancellation strAbort = "abort"; // Install callbacks on deferreds completeDeferred.add( s.complete ); jqXHR.done( s.success ); jqXHR.fail( s.error ); // Get transport transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); // If no transport, we auto-abort if ( !transport ) { done( -1, "No Transport" ); } else { jqXHR.readyState = 1; // Send global event if ( fireGlobals ) { globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); } // If request was aborted inside ajaxSend, stop there if ( completed ) { return jqXHR; } // Timeout if ( s.async && s.timeout > 0 ) { timeoutTimer = window.setTimeout( function() { jqXHR.abort( "timeout" ); }, s.timeout ); } try { completed = false; transport.send( requestHeaders, done ); } catch ( e ) { // Rethrow post-completion exceptions if ( completed ) { throw e; } // Propagate others as results done( -1, e ); } } // Callback for when everything is done function done( status, nativeStatusText, responses, headers ) { var isSuccess, success, error, response, modified, statusText = nativeStatusText; // Ignore repeat invocations if ( completed ) { return; } completed = true; // Clear timeout if it exists if ( timeoutTimer ) { window.clearTimeout( timeoutTimer ); } // Dereference transport for early garbage collection // (no matter how long the jqXHR object will be used) transport = undefined; // Cache response headers responseHeadersString = headers || ""; // Set readyState jqXHR.readyState = status > 0 ? 4 : 0; // Determine if successful isSuccess = status >= 200 && status < 300 || status === 304; // Get response data if ( responses ) { response = ajaxHandleResponses( s, jqXHR, responses ); } // Convert no matter what (that way responseXXX fields are always set) response = ajaxConvert( s, response, jqXHR, isSuccess ); // If successful, handle type chaining if ( isSuccess ) { // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { modified = jqXHR.getResponseHeader( "Last-Modified" ); if ( modified ) { jQuery.lastModified[ cacheURL ] = modified; } modified = jqXHR.getResponseHeader( "etag" ); if ( modified ) { jQuery.etag[ cacheURL ] = modified; } } // if no content if ( status === 204 || s.type === "HEAD" ) { statusText = "nocontent"; // if not modified } else if ( status === 304 ) { statusText = "notmodified"; // If we have data, let's convert it } else { statusText = response.state; success = response.data; error = response.error; isSuccess = !error; } } else { // Extract error from statusText and normalize for non-aborts error = statusText; if ( status || !statusText ) { statusText = "error"; if ( status < 0 ) { status = 0; } } } // Set data for the fake xhr object jqXHR.status = status; jqXHR.statusText = ( nativeStatusText || statusText ) + ""; // Success/Error if ( isSuccess ) { deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); } else { deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); } // Status-dependent callbacks jqXHR.statusCode( statusCode ); statusCode = undefined; if ( fireGlobals ) { globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", [ jqXHR, s, isSuccess ? success : error ] ); } // Complete completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); if ( fireGlobals ) { globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); // Handle the global AJAX counter if ( !( --jQuery.active ) ) { jQuery.event.trigger( "ajaxStop" ); } } } return jqXHR; }, getJSON: function( url, data, callback ) { return jQuery.get( url, data, callback, "json" ); }, getScript: function( url, callback ) { return jQuery.get( url, undefined, callback, "script" ); } } ); jQuery.each( [ "get", "post" ], function( i, method ) { jQuery[ method ] = function( url, data, callback, type ) { // Shift arguments if data argument was omitted if ( isFunction( data ) ) { type = type || callback; callback = data; data = undefined; } // The url can be an options object (which then must have .url) return jQuery.ajax( jQuery.extend( { url: url, type: method, dataType: type, data: data, success: callback }, jQuery.isPlainObject( url ) && url ) ); }; } ); jQuery._evalUrl = function( url ) { return jQuery.ajax( { url: url, // Make this explicit, since user can override this through ajaxSetup (#11264) type: "GET", dataType: "script", cache: true, async: false, global: false, "throws": true } ); }; jQuery.fn.extend( { wrapAll: function( html ) { var wrap; if ( this[ 0 ] ) { if ( isFunction( html ) ) { html = html.call( this[ 0 ] ); } // The elements to wrap the target around wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); if ( this[ 0 ].parentNode ) { wrap.insertBefore( this[ 0 ] ); } wrap.map( function() { var elem = this; while ( elem.firstElementChild ) { elem = elem.firstElementChild; } return elem; } ).append( this ); } return this; }, wrapInner: function( html ) { if ( isFunction( html ) ) { return this.each( function( i ) { jQuery( this ).wrapInner( html.call( this, i ) ); } ); } return this.each( function() { var self = jQuery( this ), contents = self.contents(); if ( contents.length ) { contents.wrapAll( html ); } else { self.append( html ); } } ); }, wrap: function( html ) { var htmlIsFunction = isFunction( html ); return this.each( function( i ) { jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); } ); }, unwrap: function( selector ) { this.parent( selector ).not( "body" ).each( function() { jQuery( this ).replaceWith( this.childNodes ); } ); return this; } } ); jQuery.expr.pseudos.hidden = function( elem ) { return !jQuery.expr.pseudos.visible( elem ); }; jQuery.expr.pseudos.visible = function( elem ) { return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); }; jQuery.ajaxSettings.xhr = function() { try { return new window.XMLHttpRequest(); } catch ( e ) {} }; var xhrSuccessStatus = { // File protocol always yields status code 0, assume 200 0: 200, // Support: IE <=9 only // #1450: sometimes IE returns 1223 when it should be 204 1223: 204 }, xhrSupported = jQuery.ajaxSettings.xhr(); support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); support.ajax = xhrSupported = !!xhrSupported; jQuery.ajaxTransport( function( options ) { var callback, errorCallback; // Cross domain only allowed if supported through XMLHttpRequest if ( support.cors || xhrSupported && !options.crossDomain ) { return { send: function( headers, complete ) { var i, xhr = options.xhr(); xhr.open( options.type, options.url, options.async, options.username, options.password ); // Apply custom fields if provided if ( options.xhrFields ) { for ( i in options.xhrFields ) { xhr[ i ] = options.xhrFields[ i ]; } } // Override mime type if needed if ( options.mimeType && xhr.overrideMimeType ) { xhr.overrideMimeType( options.mimeType ); } // X-Requested-With header // For cross-domain requests, seeing as conditions for a preflight are // akin to a jigsaw puzzle, we simply never set it to be sure. // (it can always be set on a per-request basis or even using ajaxSetup) // For same-domain requests, won't change header if already provided. if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { headers[ "X-Requested-With" ] = "XMLHttpRequest"; } // Set headers for ( i in headers ) { xhr.setRequestHeader( i, headers[ i ] ); } // Callback callback = function( type ) { return function() { if ( callback ) { callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null; if ( type === "abort" ) { xhr.abort(); } else if ( type === "error" ) { // Support: IE <=9 only // On a manual native abort, IE9 throws // errors on any property access that is not readyState if ( typeof xhr.status !== "number" ) { complete( 0, "error" ); } else { complete( // File: protocol always yields status 0; see #8605, #14207 xhr.status, xhr.statusText ); } } else { complete( xhrSuccessStatus[ xhr.status ] || xhr.status, xhr.statusText, // Support: IE <=9 only // IE9 has no XHR2 but throws on binary (trac-11426) // For XHR2 non-text, let the caller handle it (gh-2498) ( xhr.responseType || "text" ) !== "text" || typeof xhr.responseText !== "string" ? { binary: xhr.response } : { text: xhr.responseText }, xhr.getAllResponseHeaders() ); } } }; }; // Listen to events xhr.onload = callback(); errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); // Support: IE 9 only // Use onreadystatechange to replace onabort // to handle uncaught aborts if ( xhr.onabort !== undefined ) { xhr.onabort = errorCallback; } else { xhr.onreadystatechange = function() { // Check readyState before timeout as it changes if ( xhr.readyState === 4 ) { // Allow onerror to be called first, // but that will not handle a native abort // Also, save errorCallback to a variable // as xhr.onerror cannot be accessed window.setTimeout( function() { if ( callback ) { errorCallback(); } } ); } }; } // Create the abort callback callback = callback( "abort" ); try { // Do send the request (this may raise an exception) xhr.send( options.hasContent && options.data || null ); } catch ( e ) { // #14683: Only rethrow if this hasn't been notified as an error yet if ( callback ) { throw e; } } }, abort: function() { if ( callback ) { callback(); } } }; } } ); // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) jQuery.ajaxPrefilter( function( s ) { if ( s.crossDomain ) { s.contents.script = false; } } ); // Install script dataType jQuery.ajaxSetup( { accepts: { script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript" }, contents: { script: /\b(?:java|ecma)script\b/ }, converters: { "text script": function( text ) { jQuery.globalEval( text ); return text; } } } ); // Handle cache's special case and crossDomain jQuery.ajaxPrefilter( "script", function( s ) { if ( s.cache === undefined ) { s.cache = false; } if ( s.crossDomain ) { s.type = "GET"; } } ); // Bind script tag hack transport jQuery.ajaxTransport( "script", function( s ) { // This transport only deals with cross domain requests if ( s.crossDomain ) { var script, callback; return { send: function( _, complete ) { script = jQuery( "\n\n\n\n"; var diagramsDiv = "\n
\n"; var serializedGrammar = "\n\n"; var initLogic = "\n\n"; return (header + cssHtml + scripts + diagramsDiv + serializedGrammar + initLogic); } exports.createSyntaxDiagramsCode = createSyntaxDiagramsCode; //# sourceMappingURL=render_public.js.map /***/ }), /* 57 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = __webpack_require__(0); var tokens_public_1 = __webpack_require__(3); var gast_public_1 = __webpack_require__(1); /** * Missing features * 1. Rule arguments * 2. Gates * 3. embedded actions */ var NL = "\n"; function genUmdModule(options) { return "\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['chevrotain'], factory);\n } else if (typeof module === 'object' && module.exports) {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory(require('chevrotain'));\n } else {\n // Browser globals (root is window)\n root.returnExports = factory(root.b);\n }\n}(typeof self !== 'undefined' ? self : this, function (chevrotain) {\n\n" + genClass(options) + "\n \nreturn {\n " + options.name + ": " + options.name + " \n}\n}));\n"; } exports.genUmdModule = genUmdModule; function genWrapperFunction(options) { return " \n" + genClass(options) + "\nreturn new " + options.name + "(tokenVocabulary, config) \n"; } exports.genWrapperFunction = genWrapperFunction; function genClass(options) { // TODO: how to pass the token vocabulary? Constructor? other? // TODO: should outputCst be enabled by default? var result = "\nfunction " + options.name + "(tokenVocabulary, config) {\n // invoke super constructor\n chevrotain.Parser.call(this, [], tokenVocabulary, config)\n\n const $ = this\n\n " + genAllRules(options.rules) + "\n\n // very important to call this after all the rules have been defined.\n // otherwise the parser may not work correctly as it will lack information\n // derived during the self analysis phase.\n chevrotain.Parser.performSelfAnalysis(this)\n}\n\n// inheritance as implemented in javascript in the previous decade... :(\n" + options.name + ".prototype = Object.create(chevrotain.Parser.prototype)\n" + options.name + ".prototype.constructor = " + options.name + " \n "; return result; } exports.genClass = genClass; function genAllRules(rules) { var rulesText = utils_1.map(rules, function (currRule) { return genRule(currRule, 1); }); return rulesText.join("\n"); } exports.genAllRules = genAllRules; function genRule(prod, n) { var result = indent(n, "$.RULE(\"" + prod.name + "\", function() {") + NL; result += genDefinition(prod.definition, n + 1); result += indent(n + 1, "})") + NL; return result; } exports.genRule = genRule; function genTerminal(prod, n) { var name = tokens_public_1.tokenName(prod.terminalType); // TODO: potential performance optimization, avoid tokenMap Dictionary access return indent(n, "$.CONSUME" + prod.idx + "(this.tokensMap." + name + ")" + NL); } exports.genTerminal = genTerminal; function genNonTerminal(prod, n) { return indent(n, "$.SUBRULE" + prod.idx + "($." + prod.nonTerminalName + ")" + NL); } exports.genNonTerminal = genNonTerminal; function genAlternation(prod, n) { var result = indent(n, "$.OR" + prod.idx + "([") + NL; var alts = utils_1.map(prod.definition, function (altDef) { return genSingleAlt(altDef, n + 1); }); result += alts.join("," + NL); result += NL + indent(n, "])" + NL); return result; } exports.genAlternation = genAlternation; function genSingleAlt(prod, n) { var result = indent(n, "{") + NL; if (prod.name) { result += indent(n + 1, "NAME: \"" + prod.name + "\",") + NL; } result += indent(n + 1, "ALT: function() {") + NL; result += genDefinition(prod.definition, n + 1); result += indent(n + 1, "}") + NL; result += indent(n, "}"); return result; } exports.genSingleAlt = genSingleAlt; function genProd(prod, n) { /* istanbul ignore else */ if (prod instanceof gast_public_1.NonTerminal) { return genNonTerminal(prod, n); } else if (prod instanceof gast_public_1.Option) { return genDSLRule("OPTION", prod, n); } else if (prod instanceof gast_public_1.RepetitionMandatory) { return genDSLRule("AT_LEAST_ONE", prod, n); } else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) { return genDSLRule("AT_LEAST_ONE_SEP", prod, n); } else if (prod instanceof gast_public_1.RepetitionWithSeparator) { return genDSLRule("MANY_SEP", prod, n); } else if (prod instanceof gast_public_1.Repetition) { return genDSLRule("MANY", prod, n); } else if (prod instanceof gast_public_1.Alternation) { return genAlternation(prod, n); } else if (prod instanceof gast_public_1.Terminal) { return genTerminal(prod, n); } else if (prod instanceof gast_public_1.Flat) { return genDefinition(prod.definition, n); } else { throw Error("non exhaustive match"); } } function genDSLRule(dslName, prod, n) { var result = indent(n, "$." + (dslName + prod.idx) + "("); if (prod.name || prod.separator) { result += "{" + NL; if (prod.name) { result += indent(n + 1, "NAME: \"" + prod.name + "\"") + "," + NL; } if (prod.separator) { result += indent(n + 1, "SEP: this.tokensMap." + tokens_public_1.tokenName(prod.separator)) + "," + NL; } result += "DEF: " + genDefFunction(prod.definition, n + 2) + NL; result += indent(n, "}") + NL; } else { result += genDefFunction(prod.definition, n + 1); } result += indent(n, ")") + NL; return result; } function genDefFunction(definition, n) { var def = "function() {" + NL; def += genDefinition(definition, n); def += indent(n, "}") + NL; return def; } function genDefinition(def, n) { var result = ""; utils_1.forEach(def, function (prod) { result += genProd(prod, n + 1); }); return result; } function indent(howMuch, text) { var spaces = Array(howMuch * 4 + 1).join(" "); return spaces + text; } //# sourceMappingURL=generate.js.map /***/ }), /* 58 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var generate_1 = __webpack_require__(57); function generateParserFactory(options) { var wrapperText = generate_1.genWrapperFunction({ name: options.name, rules: options.rules }); var constructorWrapper = new Function("tokenVocabulary", "config", "chevrotain", wrapperText); return function (config) { return constructorWrapper(options.tokenVocabulary, config, // TODO: check how the require is transpiled/webpacked __webpack_require__(7)); }; } exports.generateParserFactory = generateParserFactory; function generateParserModule(options) { return generate_1.genUmdModule({ name: options.name, rules: options.rules }); } exports.generateParserModule = generateParserModule; //# sourceMappingURL=generate_public.js.map /***/ }), /* 59 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = __webpack_require__(0); var lang_extensions_1 = __webpack_require__(5); var checks_1 = __webpack_require__(9); function defaultVisit(ctx, param) { var childrenNames = utils_1.keys(ctx); var childrenNamesLength = childrenNames.length; for (var i = 0; i < childrenNamesLength; i++) { var currChildName = childrenNames[i]; var currChildArray = ctx[currChildName]; var currChildArrayLength = currChildArray.length; for (var j = 0; j < currChildArrayLength; j++) { var currChild = currChildArray[j]; // distinction between Tokens Children and CstNode children if (currChild.tokenTypeIdx === undefined) { if (currChild.fullName !== undefined) { this[currChild.fullName](currChild.children, param); } else { this[currChild.name](currChild.children, param); } } } } // defaultVisit does not support generic out param return undefined; } exports.defaultVisit = defaultVisit; function createBaseSemanticVisitorConstructor(grammarName, ruleNames) { var derivedConstructor = function () { }; // can be overwritten according to: // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/ // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname lang_extensions_1.defineNameProp(derivedConstructor, grammarName + "BaseSemantics"); var semanticProto = { visit: function (cstNode, param) { // enables writing more concise visitor methods when CstNode has only a single child if (utils_1.isArray(cstNode)) { // A CST Node's children dictionary can never have empty arrays as values // If a key is defined there will be at least one element in the corresponding value array. cstNode = cstNode[0]; } // enables passing optional CstNodes concisely. if (utils_1.isUndefined(cstNode)) { return undefined; } if (cstNode.fullName !== undefined) { return this[cstNode.fullName](cstNode.children, param); } else { return this[cstNode.name](cstNode.children, param); } }, validateVisitor: function () { var semanticDefinitionErrors = validateVisitor(this, ruleNames); if (!utils_1.isEmpty(semanticDefinitionErrors)) { var errorMessages = utils_1.map(semanticDefinitionErrors, function (currDefError) { return currDefError.msg; }); throw Error("Errors Detected in CST Visitor <" + lang_extensions_1.functionName(this.constructor) + ">:\n\t" + ("" + errorMessages.join("\n\n").replace(/\n/g, "\n\t"))); } } }; derivedConstructor.prototype = semanticProto; derivedConstructor.prototype.constructor = derivedConstructor; derivedConstructor._RULE_NAMES = ruleNames; return derivedConstructor; } exports.createBaseSemanticVisitorConstructor = createBaseSemanticVisitorConstructor; function createBaseVisitorConstructorWithDefaults(grammarName, ruleNames, baseConstructor) { var derivedConstructor = function () { }; // can be overwritten according to: // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/ // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname lang_extensions_1.defineNameProp(derivedConstructor, grammarName + "BaseSemanticsWithDefaults"); var withDefaultsProto = Object.create(baseConstructor.prototype); utils_1.forEach(ruleNames, function (ruleName) { withDefaultsProto[ruleName] = defaultVisit; }); derivedConstructor.prototype = withDefaultsProto; derivedConstructor.prototype.constructor = derivedConstructor; return derivedConstructor; } exports.createBaseVisitorConstructorWithDefaults = createBaseVisitorConstructorWithDefaults; var CstVisitorDefinitionError; (function (CstVisitorDefinitionError) { CstVisitorDefinitionError[CstVisitorDefinitionError["REDUNDANT_METHOD"] = 0] = "REDUNDANT_METHOD"; CstVisitorDefinitionError[CstVisitorDefinitionError["MISSING_METHOD"] = 1] = "MISSING_METHOD"; })(CstVisitorDefinitionError = exports.CstVisitorDefinitionError || (exports.CstVisitorDefinitionError = {})); function validateVisitor(visitorInstance, ruleNames) { var missingErrors = validateMissingCstMethods(visitorInstance, ruleNames); var redundantErrors = validateRedundantMethods(visitorInstance, ruleNames); return missingErrors.concat(redundantErrors); } exports.validateVisitor = validateVisitor; function validateMissingCstMethods(visitorInstance, ruleNames) { var errors = utils_1.map(ruleNames, function (currRuleName) { if (!utils_1.isFunction(visitorInstance[currRuleName])) { return { msg: "Missing visitor method: <" + currRuleName + "> on " + lang_extensions_1.functionName(visitorInstance.constructor) + " CST Visitor.", type: CstVisitorDefinitionError.MISSING_METHOD, methodName: currRuleName }; } }); return utils_1.compact(errors); } exports.validateMissingCstMethods = validateMissingCstMethods; var VALID_PROP_NAMES = ["constructor", "visit", "validateVisitor"]; function validateRedundantMethods(visitorInstance, ruleNames) { var errors = []; for (var prop in visitorInstance) { if (checks_1.validTermsPattern.test(prop) && utils_1.isFunction(visitorInstance[prop]) && !utils_1.contains(VALID_PROP_NAMES, prop) && !utils_1.contains(ruleNames, prop)) { errors.push({ msg: "Redundant visitor method: <" + prop + "> on " + lang_extensions_1.functionName(visitorInstance.constructor) + " CST Visitor\n" + "There is no Grammar Rule corresponding to this method's name.\n" + ("For utility methods on visitor classes use methods names that do not match /" + checks_1.validTermsPattern.source + "/."), type: CstVisitorDefinitionError.REDUNDANT_METHOD, methodName: prop }); } } return errors; } exports.validateRedundantMethods = validateRedundantMethods; //# sourceMappingURL=cst_visitor.js.map /***/ }), /* 60 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var range_1 = __webpack_require__(65); var utils_1 = __webpack_require__(0); var gast_public_1 = __webpack_require__(1); var ProdType; (function (ProdType) { ProdType[ProdType["OPTION"] = 0] = "OPTION"; ProdType[ProdType["OR"] = 1] = "OR"; ProdType[ProdType["MANY"] = 2] = "MANY"; ProdType[ProdType["MANY_SEP"] = 3] = "MANY_SEP"; ProdType[ProdType["AT_LEAST_ONE"] = 4] = "AT_LEAST_ONE"; ProdType[ProdType["AT_LEAST_ONE_SEP"] = 5] = "AT_LEAST_ONE_SEP"; ProdType[ProdType["REF"] = 6] = "REF"; ProdType[ProdType["TERMINAL"] = 7] = "TERMINAL"; ProdType[ProdType["FLAT"] = 8] = "FLAT"; })(ProdType = exports.ProdType || (exports.ProdType = {})); var namePropRegExp = /(?:\s*{\s*NAME\s*:\s*["'`]([\w$]*)["'`])?/; var namePropRegExpNoCurlyFirstOfTwo = new RegExp(namePropRegExp.source // remove opening curly brackets .replace("{", "") // add the comma between the NAME prop and the following prop .replace(")?", "\\s*,)?")); var terminalRegEx = /\.\s*CONSUME(\d+)?\s*\(\s*(?:[a-zA-Z_$]\w*\s*\.\s*)*([a-zA-Z_$]\w*)/; var terminalRegGlobal = new RegExp(terminalRegEx.source, "g"); var refRegEx = /\.\s*SUBRULE(\d+)?\s*\(\s*(?:[a-zA-Z_$]\w*\s*\.\s*)*([a-zA-Z_$]\w*)/; var refRegExGlobal = new RegExp(refRegEx.source, "g"); var optionPrefixRegEx = /\.\s*OPTION(\d+)?\s*\(/; var optionRegEx = new RegExp(optionPrefixRegEx.source + namePropRegExp.source); var optionRegExGlobal = new RegExp(optionPrefixRegEx.source, "g"); var manyPrefixRegEx = /\.\s*MANY(\d+)?\s*\(/; var manyRegEx = new RegExp(manyPrefixRegEx.source + namePropRegExp.source); var manyRegExGlobal = new RegExp(manyPrefixRegEx.source, "g"); var sepPropRegEx = /\s*SEP\s*:\s*(?:[a-zA-Z_$]\w*\s*\.\s*)*([a-zA-Z_$]\w*)/; var manySepPrefixRegEx = /\.\s*MANY_SEP(\d+)?\s*\(\s*{/; var manyWithSeparatorRegEx = new RegExp(manySepPrefixRegEx.source + namePropRegExpNoCurlyFirstOfTwo.source + sepPropRegEx.source); var manyWithSeparatorRegExGlobal = new RegExp(manyWithSeparatorRegEx.source, "g"); var atLeastOneSepPrefixRegEx = /\.\s*AT_LEAST_ONE_SEP(\d+)?\s*\(\s*{/; var atLeastOneWithSeparatorRegEx = new RegExp(atLeastOneSepPrefixRegEx.source + namePropRegExpNoCurlyFirstOfTwo.source + sepPropRegEx.source); var atLeastOneWithSeparatorRegExGlobal = new RegExp(atLeastOneWithSeparatorRegEx.source, "g"); var atLeastOnePrefixRegEx = /\.\s*AT_LEAST_ONE(\d+)?\s*\(/; var atLeastOneRegEx = new RegExp(atLeastOnePrefixRegEx.source + namePropRegExp.source); var atLeastOneRegExGlobal = new RegExp(atLeastOnePrefixRegEx.source, "g"); var orPrefixRegEx = /\.\s*OR(\d+)?\s*\(/; var orRegEx = new RegExp(orPrefixRegEx.source + namePropRegExp.source); var orRegExGlobal = new RegExp(orPrefixRegEx.source, "g"); var orPartSuffixRegEx = /\s*(ALT)\s*:/; var orPartRegEx = new RegExp(namePropRegExpNoCurlyFirstOfTwo.source + orPartSuffixRegEx.source); var orPartRegExGlobal = new RegExp(orPartRegEx.source, "g"); exports.terminalNameToConstructor = {}; function buildTopProduction(impelText, name, terminals) { // pseudo state. so little state does not yet mandate the complexity of wrapping in a class... // TODO: this is confusing, might be time to create a class.. exports.terminalNameToConstructor = terminals; // the top most range must strictly contain all the other ranges // which is why we prefix the text with " " (curr Range impel is only for positive ranges) var spacedImpelText = " " + impelText; // TODO: why do we add whitespace twice? var txtWithoutComments = removeComments(" " + spacedImpelText); var textWithoutCommentsAndStrings = removeStringLiterals(txtWithoutComments); var prodRanges = createRanges(textWithoutCommentsAndStrings); var topRange = new range_1.Range(0, impelText.length + 2); var topRule = buildTopLevel(name, topRange, prodRanges, impelText); return topRule; } exports.buildTopProduction = buildTopProduction; function buildTopLevel(name, topRange, allRanges, orgText) { var topLevelProd = new gast_public_1.Rule({ name: name, definition: [], orgText: orgText }); return buildAbstractProd(topLevelProd, topRange, allRanges); } function buildProdGast(prodRange, allRanges) { switch (prodRange.type) { case ProdType.AT_LEAST_ONE: return buildAtLeastOneProd(prodRange, allRanges); case ProdType.AT_LEAST_ONE_SEP: return buildAtLeastOneSepProd(prodRange, allRanges); case ProdType.MANY_SEP: return buildManySepProd(prodRange, allRanges); case ProdType.MANY: return buildManyProd(prodRange, allRanges); case ProdType.OPTION: return buildOptionProd(prodRange, allRanges); case ProdType.OR: return buildOrProd(prodRange, allRanges); case ProdType.FLAT: return buildFlatProd(prodRange, allRanges); case ProdType.REF: return buildRefProd(prodRange); case ProdType.TERMINAL: return buildTerminalProd(prodRange); /* istanbul ignore next */ default: throw Error("non exhaustive match"); } } exports.buildProdGast = buildProdGast; function buildRefProd(prodRange) { var reResult = refRegEx.exec(prodRange.text); var isImplicitOccurrenceIdx = reResult[1] === undefined; var refOccurrence = isImplicitOccurrenceIdx ? 0 : parseInt(reResult[1], 10); var refProdName = reResult[2]; var newRef = new gast_public_1.NonTerminal({ nonTerminalName: refProdName, idx: refOccurrence }); return newRef; } function buildTerminalProd(prodRange) { var reResult = terminalRegEx.exec(prodRange.text); var isImplicitOccurrenceIdx = reResult[1] === undefined; var terminalOccurrence = isImplicitOccurrenceIdx ? 0 : parseInt(reResult[1], 10); var terminalName = reResult[2]; var terminalType = exports.terminalNameToConstructor[terminalName]; if (!terminalType) { throw Error("Terminal Token name: " + terminalName + " not found\n" + "\tSee: https://sap.github.io/chevrotain/docs/guide/resolving_grammar_errors.html#TERMINAL_NAME_NOT_FOUND\n" + "\tFor Further details."); } var newTerminal = new gast_public_1.Terminal({ terminalType: terminalType, idx: terminalOccurrence }); return newTerminal; } function buildProdWithOccurrence(regEx, prodInstance, prodRange, allRanges) { var reResult = regEx.exec(prodRange.text); var isImplicitOccurrenceIdx = reResult[1] === undefined; prodInstance.idx = isImplicitOccurrenceIdx ? 0 : parseInt(reResult[1], 10); var nestedName = reResult[2]; if (!utils_1.isUndefined(nestedName)) { ; prodInstance.name = nestedName; } return buildAbstractProd(prodInstance, prodRange.range, allRanges); } function buildAtLeastOneProd(prodRange, allRanges) { return buildProdWithOccurrence(atLeastOneRegEx, new gast_public_1.RepetitionMandatory({ definition: [] }), prodRange, allRanges); } function buildAtLeastOneSepProd(prodRange, allRanges) { return buildRepetitionWithSep(prodRange, allRanges, gast_public_1.RepetitionMandatoryWithSeparator, atLeastOneWithSeparatorRegEx); } function buildManyProd(prodRange, allRanges) { return buildProdWithOccurrence(manyRegEx, new gast_public_1.Repetition({ definition: [] }), prodRange, allRanges); } function buildManySepProd(prodRange, allRanges) { return buildRepetitionWithSep(prodRange, allRanges, gast_public_1.RepetitionWithSeparator, manyWithSeparatorRegEx); } function buildRepetitionWithSep(prodRange, allRanges, repConstructor, regExp) { var reResult = regExp.exec(prodRange.text); var isImplicitOccurrenceIdx = reResult[1] === undefined; var occurrenceIdx = isImplicitOccurrenceIdx ? 0 : parseInt(reResult[1], 10); var sepName = reResult[3]; var separatorType = exports.terminalNameToConstructor[sepName]; if (!separatorType) { throw Error("Separator Terminal Token name: " + sepName + " not found"); } var repetitionInstance = new repConstructor({ definition: [], separator: separatorType, idx: occurrenceIdx }); var nestedName = reResult[2]; if (!utils_1.isUndefined(nestedName)) { ; repetitionInstance.name = nestedName; } return (buildAbstractProd(repetitionInstance, prodRange.range, allRanges)); } function buildOptionProd(prodRange, allRanges) { return buildProdWithOccurrence(optionRegEx, new gast_public_1.Option({ definition: [] }), prodRange, allRanges); } function buildOrProd(prodRange, allRanges) { return buildProdWithOccurrence(orRegEx, new gast_public_1.Alternation({ definition: [] }), prodRange, allRanges); } function buildFlatProd(prodRange, allRanges) { var prodInstance = new gast_public_1.Flat({ definition: [] }); var reResult = orPartRegEx.exec(prodRange.text); var nestedName = reResult[1]; if (!utils_1.isUndefined(nestedName)) { ; prodInstance.name = nestedName; } return buildAbstractProd(prodInstance, prodRange.range, allRanges); } function buildAbstractProd(prod, topLevelRange, allRanges) { var secondLevelProds = getDirectlyContainedRanges(topLevelRange, allRanges); var secondLevelInOrder = utils_1.sortBy(secondLevelProds, function (prodRng) { return prodRng.range.start; }); var definition = []; utils_1.forEach(secondLevelInOrder, function (prodRng) { definition.push(buildProdGast(prodRng, allRanges)); }); prod.definition = definition; return prod; } function getDirectlyContainedRanges(y, prodRanges) { return utils_1.filter(prodRanges, function (x) { var isXDescendantOfY = y.strictlyContainsRange(x.range); var xDoesNotHaveAnyAncestorWhichIsDecendantOfY = utils_1.every(prodRanges, function (maybeAnotherParent) { var isParentOfX = maybeAnotherParent.range.strictlyContainsRange(x.range); var isChildOfY = maybeAnotherParent.range.isStrictlyContainedInRange(y); return !(isParentOfX && isChildOfY); }); return isXDescendantOfY && xDoesNotHaveAnyAncestorWhichIsDecendantOfY; }); } exports.getDirectlyContainedRanges = getDirectlyContainedRanges; var singleLineCommentRegEx = /\/\/.*/g; var multiLineCommentRegEx = /\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g; var doubleQuoteStringLiteralRegEx = /(NAME\s*:\s*)?"([^\\"]|\\([bfnrtv"\\/]|u[0-9a-fA-F]{4}))*"/g; var singleQuoteStringLiteralRegEx = /(NAME\s*:\s*)?'([^\\']|\\([bfnrtv'\\/]|u[0-9a-fA-F]{4}))*'/g; function removeComments(text) { var noSingleLine = text.replace(singleLineCommentRegEx, ""); var noComments = noSingleLine.replace(multiLineCommentRegEx, ""); return noComments; } exports.removeComments = removeComments; function replaceWithEmptyStringExceptNestedRules(match, nestedRuleGroup) { // do not replace with empty string if a nest rule (NAME:"bamba") was detected if (nestedRuleGroup !== undefined) { return match; } return ""; } function removeStringLiterals(text) { var noDoubleQuotes = text.replace(doubleQuoteStringLiteralRegEx, replaceWithEmptyStringExceptNestedRules); var noSingleQuotes = noDoubleQuotes.replace(singleQuoteStringLiteralRegEx, replaceWithEmptyStringExceptNestedRules); return noSingleQuotes; } exports.removeStringLiterals = removeStringLiterals; function createRanges(text) { var terminalRanges = createTerminalRanges(text); var refsRanges = createRefsRanges(text); var atLeastOneRanges = createAtLeastOneRanges(text); var atLeastOneSepRanges = createAtLeastOneSepRanges(text); var manyRanges = createManyRanges(text); var manySepRanges = createManySepRanges(text); var optionRanges = createOptionRanges(text); var orRanges = createOrRanges(text); return [].concat(terminalRanges, refsRanges, atLeastOneRanges, atLeastOneSepRanges, manyRanges, manySepRanges, optionRanges, orRanges); } exports.createRanges = createRanges; function createTerminalRanges(text) { return createRefOrTerminalProdRangeInternal(text, ProdType.TERMINAL, terminalRegGlobal); } exports.createTerminalRanges = createTerminalRanges; function createRefsRanges(text) { return createRefOrTerminalProdRangeInternal(text, ProdType.REF, refRegExGlobal); } exports.createRefsRanges = createRefsRanges; function createAtLeastOneRanges(text) { return createOperatorProdRangeParenthesis(text, ProdType.AT_LEAST_ONE, atLeastOneRegExGlobal); } exports.createAtLeastOneRanges = createAtLeastOneRanges; function createAtLeastOneSepRanges(text) { return createOperatorProdRangeParenthesis(text, ProdType.AT_LEAST_ONE_SEP, atLeastOneWithSeparatorRegExGlobal); } exports.createAtLeastOneSepRanges = createAtLeastOneSepRanges; function createManyRanges(text) { return createOperatorProdRangeParenthesis(text, ProdType.MANY, manyRegExGlobal); } exports.createManyRanges = createManyRanges; function createManySepRanges(text) { return createOperatorProdRangeParenthesis(text, ProdType.MANY_SEP, manyWithSeparatorRegExGlobal); } exports.createManySepRanges = createManySepRanges; function createOptionRanges(text) { return createOperatorProdRangeParenthesis(text, ProdType.OPTION, optionRegExGlobal); } exports.createOptionRanges = createOptionRanges; function createOrRanges(text) { var orRanges = createOperatorProdRangeParenthesis(text, ProdType.OR, orRegExGlobal); // have to split up the OR cases into separate FLAT productions // (A |BB | CDE) ==> or.def[0] --> FLAT(A) , or.def[1] --> FLAT(BB) , or.def[2] --> FLAT(CCDE) var orSubPartsRanges = createOrPartRanges(orRanges); return orRanges.concat(orSubPartsRanges); } exports.createOrRanges = createOrRanges; var findClosingCurly = (utils_1.partial(findClosingOffset, "{", "}")); var findClosingParen = (utils_1.partial(findClosingOffset, "(", ")")); function createOrPartRanges(orRanges) { var orPartRanges = []; utils_1.forEach(orRanges, function (orRange) { var currOrParts = createOperatorProdRangeInternal(orRange.text, ProdType.FLAT, orPartRegExGlobal, findClosingCurly); var currOrRangeStart = orRange.range.start; // fix offsets as we are working on a subset of the text utils_1.forEach(currOrParts, function (orPart) { orPart.range.start += currOrRangeStart; orPart.range.end += currOrRangeStart; }); orPartRanges = orPartRanges.concat(currOrParts); }); var uniqueOrPartRanges = utils_1.uniq(orPartRanges, function (prodRange) { // using "~" as a separator for the identify function as its not a valid char in javascript return (prodRange.type + "~" + prodRange.range.start + "~" + prodRange.range.end + "~" + prodRange.text); }); return uniqueOrPartRanges; } exports.createOrPartRanges = createOrPartRanges; function createRefOrTerminalProdRangeInternal(text, prodType, pattern) { var prodRanges = []; var matched; while ((matched = pattern.exec(text))) { var start = matched.index; var stop_1 = pattern.lastIndex; var currRange = new range_1.Range(start, stop_1); var currText = matched[0]; prodRanges.push({ range: currRange, text: currText, type: prodType }); } return prodRanges; } function createOperatorProdRangeParenthesis(text, prodType, pattern) { return createOperatorProdRangeInternal(text, prodType, pattern, findClosingParen); } function createOperatorProdRangeInternal(text, prodType, pattern, findTerminatorOffSet) { var operatorRanges = []; var matched; while ((matched = pattern.exec(text))) { var start = matched.index; // note that (start + matched[0].length) is the first character AFTER the match var stop_2 = findTerminatorOffSet(start + matched[0].length, text); var currRange = new range_1.Range(start, stop_2); var currText = text.substr(start, stop_2 - start + 1); operatorRanges.push({ range: currRange, text: currText, type: prodType }); } return operatorRanges; } function findClosingOffset(opening, closing, start, text) { var parenthesisStack = [1]; var i = -1; while (!utils_1.isEmpty(parenthesisStack) && i + start < text.length) { i++; var nextChar = text.charAt(start + i); if (nextChar === opening) { parenthesisStack.push(1); } else if (nextChar === closing) { parenthesisStack.pop(); } } // valid termination of the search loop if (utils_1.isEmpty(parenthesisStack)) { return i + start; } else { throw new Error("INVALID INPUT TEXT, UNTERMINATED PARENTHESIS"); } } exports.findClosingOffset = findClosingOffset; function deserializeGrammar(grammar, terminals) { return utils_1.map(grammar, function (production) { return deserializeProduction(production, terminals); }); } exports.deserializeGrammar = deserializeGrammar; function deserializeProduction(node, terminals) { switch (node.type) { case "NonTerminal": return new gast_public_1.NonTerminal({ nonTerminalName: node.name, idx: node.idx }); case "Flat": return new gast_public_1.Flat({ name: node.name, definition: deserializeGrammar(node.definition, terminals) }); case "Option": return new gast_public_1.Option({ name: node.name, idx: node.idx, definition: deserializeGrammar(node.definition, terminals) }); case "RepetitionMandatory": return new gast_public_1.RepetitionMandatory({ name: node.name, idx: node.idx, definition: deserializeGrammar(node.definition, terminals) }); case "RepetitionMandatoryWithSeparator": return new gast_public_1.RepetitionMandatoryWithSeparator({ name: node.name, idx: node.idx, separator: terminals[node.separator.name], definition: deserializeGrammar(node.definition, terminals) }); case "RepetitionWithSeparator": return new gast_public_1.RepetitionWithSeparator({ name: node.name, idx: node.idx, separator: terminals[node.separator.name], definition: deserializeGrammar(node.definition, terminals) }); case "Repetition": return new gast_public_1.Repetition({ name: node.name, idx: node.idx, definition: deserializeGrammar(node.definition, terminals) }); case "Alternation": return new gast_public_1.Alternation({ name: node.name, idx: node.idx, definition: deserializeGrammar(node.definition, terminals) }); case "Terminal": return new gast_public_1.Terminal({ terminalType: terminals[node.name], idx: node.idx }); case "Rule": return new gast_public_1.Rule({ name: node.name, orgText: node.orgText, definition: deserializeGrammar(node.definition, terminals) }); /* istanbul ignore next */ default: var _never = node; } } exports.deserializeProduction = deserializeProduction; //# sourceMappingURL=gast_builder.js.map /***/ }), /* 61 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var rest_1 = __webpack_require__(26); var lang_extensions_1 = __webpack_require__(5); var first_1 = __webpack_require__(38); var utils_1 = __webpack_require__(0); var constants_1 = __webpack_require__(35); var tokens_public_1 = __webpack_require__(3); var gast_public_1 = __webpack_require__(1); // This ResyncFollowsWalker computes all of the follows required for RESYNC // (skipping reference production). var ResyncFollowsWalker = /** @class */ (function (_super) { __extends(ResyncFollowsWalker, _super); function ResyncFollowsWalker(topProd) { var _this = _super.call(this) || this; _this.topProd = topProd; _this.follows = new lang_extensions_1.HashTable(); return _this; } ResyncFollowsWalker.prototype.startWalking = function () { this.walk(this.topProd); return this.follows; }; ResyncFollowsWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) { // do nothing! just like in the public sector after 13:00 }; ResyncFollowsWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) { var followName = buildBetweenProdsFollowPrefix(refProd.referencedRule, refProd.idx) + this.topProd.name; var fullRest = currRest.concat(prevRest); var restProd = new gast_public_1.Flat({ definition: fullRest }); var t_in_topProd_follows = first_1.first(restProd); this.follows.put(followName, t_in_topProd_follows); }; return ResyncFollowsWalker; }(rest_1.RestWalker)); exports.ResyncFollowsWalker = ResyncFollowsWalker; function computeAllProdsFollows(topProductions) { var reSyncFollows = new lang_extensions_1.HashTable(); utils_1.forEach(topProductions, function (topProd) { var currRefsFollow = new ResyncFollowsWalker(topProd).startWalking(); reSyncFollows.putAll(currRefsFollow); }); return reSyncFollows; } exports.computeAllProdsFollows = computeAllProdsFollows; function buildBetweenProdsFollowPrefix(inner, occurenceInParent) { return inner.name + occurenceInParent + constants_1.IN; } exports.buildBetweenProdsFollowPrefix = buildBetweenProdsFollowPrefix; function buildInProdFollowPrefix(terminal) { var terminalName = tokens_public_1.tokenName(terminal.terminalType); return terminalName + terminal.idx + constants_1.IN; } exports.buildInProdFollowPrefix = buildInProdFollowPrefix; //# sourceMappingURL=follow.js.map /***/ }), /* 62 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var parser_public_1 = __webpack_require__(27); var utils_1 = __webpack_require__(0); var gast_visitor_public_1 = __webpack_require__(6); function resolveGrammar(topLevels, errMsgProvider) { var refResolver = new GastRefResolverVisitor(topLevels, errMsgProvider); refResolver.resolveRefs(); return refResolver.errors; } exports.resolveGrammar = resolveGrammar; var GastRefResolverVisitor = /** @class */ (function (_super) { __extends(GastRefResolverVisitor, _super); function GastRefResolverVisitor(nameToTopRule, errMsgProvider) { var _this = _super.call(this) || this; _this.nameToTopRule = nameToTopRule; _this.errMsgProvider = errMsgProvider; _this.errors = []; return _this; } GastRefResolverVisitor.prototype.resolveRefs = function () { var _this = this; utils_1.forEach(this.nameToTopRule.values(), function (prod) { _this.currTopLevel = prod; prod.accept(_this); }); }; GastRefResolverVisitor.prototype.visitNonTerminal = function (node) { var ref = this.nameToTopRule.get(node.nonTerminalName); if (!ref) { var msg = this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel, node); this.errors.push({ message: msg, type: parser_public_1.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF, ruleName: this.currTopLevel.name, unresolvedRefName: node.nonTerminalName }); } else { node.referencedRule = ref; } }; return GastRefResolverVisitor; }(gast_visitor_public_1.GAstVisitor)); exports.GastRefResolverVisitor = GastRefResolverVisitor; //# sourceMappingURL=resolver.js.map /***/ }), /* 63 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var regexp_to_ast_1 = __webpack_require__(42); var tokens_public_1 = __webpack_require__(3); var lexer_public_1 = __webpack_require__(28); var utils_1 = __webpack_require__(0); var reg_exp_1 = __webpack_require__(64); var regExpParser = new regexp_to_ast_1.RegExpParser(); var PATTERN = "PATTERN"; exports.DEFAULT_MODE = "defaultMode"; exports.MODES = "modes"; exports.SUPPORT_STICKY = typeof new RegExp("(?:)").sticky === "boolean"; function disableSticky() { exports.SUPPORT_STICKY = false; } exports.disableSticky = disableSticky; function enableSticky() { exports.SUPPORT_STICKY = true; } exports.enableSticky = enableSticky; function analyzeTokenTypes(tokenTypes, options) { options = utils_1.defaults(options, { useSticky: exports.SUPPORT_STICKY, debug: false, safeMode: false, positionTracking: "full", lineTerminatorCharacters: ["\r", "\n"] }); var onlyRelevantTypes = utils_1.reject(tokenTypes, function (currType) { return currType[PATTERN] === lexer_public_1.Lexer.NA; }); var hasCustom = false; var allTransformedPatterns = utils_1.map(onlyRelevantTypes, function (currType) { var currPattern = currType[PATTERN]; /* istanbul ignore else */ if (utils_1.isRegExp(currPattern)) { var regExpSource = currPattern.source; if (regExpSource.length === 1 && // only these regExp meta characters which can appear in a length one regExp regExpSource !== "^" && regExpSource !== "$" && regExpSource !== ".") { return regExpSource; } else if (regExpSource.length === 2 && regExpSource[0] === "\\" && // not a meta character !utils_1.contains([ "d", "D", "s", "S", "t", "r", "n", "t", "0", "c", "b", "B", "f", "v", "w", "W" ], regExpSource[1])) { // escaped meta Characters: /\+/ /\[/ // or redundant escaping: /\a/ // without the escaping "\" return regExpSource[1]; } else { return options.useSticky ? addStickyFlag(currPattern) : addStartOfInput(currPattern); } } else if (utils_1.isFunction(currPattern)) { hasCustom = true; // CustomPatternMatcherFunc - custom patterns do not require any transformations, only wrapping in a RegExp Like object return { exec: currPattern }; } else if (utils_1.has(currPattern, "exec")) { hasCustom = true; // ICustomPattern return currPattern; } else if (typeof currPattern === "string") { // IGNORE ABOVE ELSE if (currPattern.length === 1) { return currPattern; } else { var escapedRegExpString = currPattern.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&"); var wrappedRegExp = new RegExp(escapedRegExpString); return options.useSticky ? addStickyFlag(wrappedRegExp) : addStartOfInput(wrappedRegExp); } } else { throw Error("non exhaustive match"); } }); var patternIdxToType = utils_1.map(onlyRelevantTypes, function (currType) { return currType.tokenTypeIdx; }); var patternIdxToGroup = utils_1.map(onlyRelevantTypes, function (clazz) { var groupName = clazz.GROUP; /* istanbul ignore next */ if (groupName === lexer_public_1.Lexer.SKIPPED) { return undefined; } else if (utils_1.isString(groupName)) { return groupName; } else if (utils_1.isUndefined(groupName)) { return false; } else { throw Error("non exhaustive match"); } }); var patternIdxToLongerAltIdx = utils_1.map(onlyRelevantTypes, function (clazz) { var longerAltType = clazz.LONGER_ALT; if (longerAltType) { var longerAltIdx = utils_1.indexOf(onlyRelevantTypes, longerAltType); return longerAltIdx; } }); var patternIdxToPushMode = utils_1.map(onlyRelevantTypes, function (clazz) { return clazz.PUSH_MODE; }); var patternIdxToPopMode = utils_1.map(onlyRelevantTypes, function (clazz) { return utils_1.has(clazz, "POP_MODE"); }); var lineTerminatorCharCodes = getCharCodes(options.lineTerminatorCharacters); var patternIdxToCanLineTerminator = utils_1.map(onlyRelevantTypes, function (tokType) { return false; }); if (options.positionTracking !== "onlyOffset") { patternIdxToCanLineTerminator = utils_1.map(onlyRelevantTypes, function (tokType) { if (utils_1.has(tokType, "LINE_BREAKS")) { return tokType.LINE_BREAKS; } else { if (checkLineBreaksIssues(tokType, lineTerminatorCharCodes) === false) { return reg_exp_1.canMatchCharCode(lineTerminatorCharCodes, tokType.PATTERN); } } }); } var patternIdxToIsCustom = utils_1.map(onlyRelevantTypes, isCustomPattern); var patternIdxToShort = utils_1.map(allTransformedPatterns, isShortPattern); var emptyGroups = utils_1.reduce(onlyRelevantTypes, function (acc, clazz) { var groupName = clazz.GROUP; if (utils_1.isString(groupName) && !(groupName === lexer_public_1.Lexer.SKIPPED)) { acc[groupName] = []; } return acc; }, {}); var patternIdxToConfig = utils_1.map(allTransformedPatterns, function (x, idx) { return { pattern: allTransformedPatterns[idx], longerAlt: patternIdxToLongerAltIdx[idx], canLineTerminator: patternIdxToCanLineTerminator[idx], isCustom: patternIdxToIsCustom[idx], short: patternIdxToShort[idx], group: patternIdxToGroup[idx], push: patternIdxToPushMode[idx], pop: patternIdxToPopMode[idx], tokenTypeIdx: patternIdxToType[idx], tokenType: onlyRelevantTypes[idx] }; }); function addToMapOfArrays(map, key, value) { if (map[key] === undefined) { map[key] = []; } map[key].push(value); } var canBeOptimized = true; var charCodeToPatternIdxToConfig = []; if (!options.safeMode) { charCodeToPatternIdxToConfig = utils_1.reduce(onlyRelevantTypes, function (result, currTokType, idx) { if (typeof currTokType.PATTERN === "string") { var key = currTokType.PATTERN.charCodeAt(0); addToMapOfArrays(result, key, patternIdxToConfig[idx]); } else if (utils_1.isArray(currTokType.START_CHARS_HINT)) { utils_1.forEach(currTokType.START_CHARS_HINT, function (charOrInt) { var key = typeof charOrInt === "string" ? charOrInt.charCodeAt(0) : charOrInt; addToMapOfArrays(result, key, patternIdxToConfig[idx]); }); } else if (utils_1.isRegExp(currTokType.PATTERN)) { if (currTokType.PATTERN.unicode) { canBeOptimized = false; if (options.ensureOptimizations) { utils_1.PRINT_ERROR("" + reg_exp_1.failedOptimizationPrefixMsg + ("\tUnable to analyze < " + currTokType.PATTERN.toString() + " > pattern.\n") + "\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\n" + "\tThis will disable the lexer's first char optimizations.\n" + "\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE"); } } else { var startCodes = reg_exp_1.getStartCodes(currTokType.PATTERN, options.ensureOptimizations); /* istanbul ignore if */ // start code will only be empty given an empty regExp or failure of regexp-to-ast library // the first should be a different validation and the second cannot be tested. if (utils_1.isEmpty(startCodes)) { // we cannot understand what codes may start possible matches // The optimization correctness requires knowing start codes for ALL patterns. // Not actually sure this is an error, no debug message canBeOptimized = false; } utils_1.forEach(startCodes, function (code) { addToMapOfArrays(result, code, patternIdxToConfig[idx]); }); } } else { if (options.ensureOptimizations) { utils_1.PRINT_ERROR("" + reg_exp_1.failedOptimizationPrefixMsg + ("\tTokenType: <" + tokens_public_1.tokenName(currTokType) + "> is using a custom token pattern without providing parameter.\n") + "\tThis will disable the lexer's first char optimizations.\n" + "\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE"); } canBeOptimized = false; } return result; }, []); } if (canBeOptimized && charCodeToPatternIdxToConfig.length < 65536) { charCodeToPatternIdxToConfig = utils_1.packArray(charCodeToPatternIdxToConfig); } return { emptyGroups: emptyGroups, patternIdxToConfig: patternIdxToConfig, charCodeToPatternIdxToConfig: charCodeToPatternIdxToConfig, hasCustom: hasCustom, canBeOptimized: canBeOptimized }; } exports.analyzeTokenTypes = analyzeTokenTypes; function validatePatterns(tokenTypes, validModesNames) { var errors = []; var missingResult = findMissingPatterns(tokenTypes); errors = errors.concat(missingResult.errors); var invalidResult = findInvalidPatterns(missingResult.valid); var validTokenTypes = invalidResult.valid; errors = errors.concat(invalidResult.errors); errors = errors.concat(validateRegExpPattern(validTokenTypes)); errors = errors.concat(findInvalidGroupType(validTokenTypes)); errors = errors.concat(findModesThatDoNotExist(validTokenTypes, validModesNames)); errors = errors.concat(findUnreachablePatterns(validTokenTypes)); return errors; } exports.validatePatterns = validatePatterns; function validateRegExpPattern(tokenTypes) { var errors = []; var withRegExpPatterns = utils_1.filter(tokenTypes, function (currTokType) { return utils_1.isRegExp(currTokType[PATTERN]); }); errors = errors.concat(findEndOfInputAnchor(withRegExpPatterns)); errors = errors.concat(findStartOfInputAnchor(withRegExpPatterns)); errors = errors.concat(findUnsupportedFlags(withRegExpPatterns)); errors = errors.concat(findDuplicatePatterns(withRegExpPatterns)); errors = errors.concat(findEmptyMatchRegExps(withRegExpPatterns)); return errors; } function findMissingPatterns(tokenTypes) { var tokenTypesWithMissingPattern = utils_1.filter(tokenTypes, function (currType) { return !utils_1.has(currType, PATTERN); }); var errors = utils_1.map(tokenTypesWithMissingPattern, function (currType) { return { message: "Token Type: ->" + tokens_public_1.tokenName(currType) + "<- missing static 'PATTERN' property", type: lexer_public_1.LexerDefinitionErrorType.MISSING_PATTERN, tokenTypes: [currType] }; }); var valid = utils_1.difference(tokenTypes, tokenTypesWithMissingPattern); return { errors: errors, valid: valid }; } exports.findMissingPatterns = findMissingPatterns; function findInvalidPatterns(tokenTypes) { var tokenTypesWithInvalidPattern = utils_1.filter(tokenTypes, function (currType) { var pattern = currType[PATTERN]; return (!utils_1.isRegExp(pattern) && !utils_1.isFunction(pattern) && !utils_1.has(pattern, "exec") && !utils_1.isString(pattern)); }); var errors = utils_1.map(tokenTypesWithInvalidPattern, function (currType) { return { message: "Token Type: ->" + tokens_public_1.tokenName(currType) + "<- static 'PATTERN' can only be a RegExp, a" + " Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.", type: lexer_public_1.LexerDefinitionErrorType.INVALID_PATTERN, tokenTypes: [currType] }; }); var valid = utils_1.difference(tokenTypes, tokenTypesWithInvalidPattern); return { errors: errors, valid: valid }; } exports.findInvalidPatterns = findInvalidPatterns; var end_of_input = /[^\\][\$]/; function findEndOfInputAnchor(tokenTypes) { var EndAnchorFinder = /** @class */ (function (_super) { __extends(EndAnchorFinder, _super); function EndAnchorFinder() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.found = false; return _this; } EndAnchorFinder.prototype.visitEndAnchor = function (node) { this.found = true; }; return EndAnchorFinder; }(regexp_to_ast_1.BaseRegExpVisitor)); var invalidRegex = utils_1.filter(tokenTypes, function (currType) { var pattern = currType[PATTERN]; try { var regexpAst = regExpParser.pattern(pattern.toString()); var endAnchorVisitor = new EndAnchorFinder(); endAnchorVisitor.visit(regexpAst); return endAnchorVisitor.found; } catch (e) { // old behavior in case of runtime exceptions with regexp-to-ast. /* istanbul ignore next - cannot ensure an error in regexp-to-ast*/ return end_of_input.test(pattern.source); } }); var errors = utils_1.map(invalidRegex, function (currType) { return { message: "Unexpected RegExp Anchor Error:\n" + "\tToken Type: ->" + tokens_public_1.tokenName(currType) + "<- static 'PATTERN' cannot contain end of input anchor '$'\n" + "\tSee sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#ANCHORS" + "\tfor details.", type: lexer_public_1.LexerDefinitionErrorType.EOI_ANCHOR_FOUND, tokenTypes: [currType] }; }); return errors; } exports.findEndOfInputAnchor = findEndOfInputAnchor; function findEmptyMatchRegExps(tokenTypes) { var matchesEmptyString = utils_1.filter(tokenTypes, function (currType) { var pattern = currType[PATTERN]; return pattern.test(""); }); var errors = utils_1.map(matchesEmptyString, function (currType) { return { message: "Token Type: ->" + tokens_public_1.tokenName(currType) + "<- static 'PATTERN' must not match an empty string", type: lexer_public_1.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN, tokenTypes: [currType] }; }); return errors; } exports.findEmptyMatchRegExps = findEmptyMatchRegExps; var start_of_input = /[^\\[][\^]|^\^/; function findStartOfInputAnchor(tokenTypes) { var StartAnchorFinder = /** @class */ (function (_super) { __extends(StartAnchorFinder, _super); function StartAnchorFinder() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.found = false; return _this; } StartAnchorFinder.prototype.visitStartAnchor = function (node) { this.found = true; }; return StartAnchorFinder; }(regexp_to_ast_1.BaseRegExpVisitor)); var invalidRegex = utils_1.filter(tokenTypes, function (currType) { var pattern = currType[PATTERN]; try { var regexpAst = regExpParser.pattern(pattern.toString()); var startAnchorVisitor = new StartAnchorFinder(); startAnchorVisitor.visit(regexpAst); return startAnchorVisitor.found; } catch (e) { // old behavior in case of runtime exceptions with regexp-to-ast. /* istanbul ignore next - cannot ensure an error in regexp-to-ast*/ return start_of_input.test(pattern.source); } }); var errors = utils_1.map(invalidRegex, function (currType) { return { message: "Unexpected RegExp Anchor Error:\n" + "\tToken Type: ->" + tokens_public_1.tokenName(currType) + "<- static 'PATTERN' cannot contain start of input anchor '^'\n" + "\tSee https://github.com/SAP/chevrotain/blob/master/docs/resolving_lexer_errors.md#ANCHORS\n" + "\tfor details.", type: lexer_public_1.LexerDefinitionErrorType.SOI_ANCHOR_FOUND, tokenTypes: [currType] }; }); return errors; } exports.findStartOfInputAnchor = findStartOfInputAnchor; function findUnsupportedFlags(tokenTypes) { var invalidFlags = utils_1.filter(tokenTypes, function (currType) { var pattern = currType[PATTERN]; return (pattern instanceof RegExp && (pattern.multiline || pattern.global)); }); var errors = utils_1.map(invalidFlags, function (currType) { return { message: "Token Type: ->" + tokens_public_1.tokenName(currType) + "<- static 'PATTERN' may NOT contain global('g') or multiline('m')", type: lexer_public_1.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND, tokenTypes: [currType] }; }); return errors; } exports.findUnsupportedFlags = findUnsupportedFlags; // This can only test for identical duplicate RegExps, not semantically equivalent ones. function findDuplicatePatterns(tokenTypes) { var found = []; var identicalPatterns = utils_1.map(tokenTypes, function (outerType) { return utils_1.reduce(tokenTypes, function (result, innerType) { if (outerType.PATTERN.source === innerType.PATTERN.source && !utils_1.contains(found, innerType) && innerType.PATTERN !== lexer_public_1.Lexer.NA) { // this avoids duplicates in the result, each Token Type may only appear in one "set" // in essence we are creating Equivalence classes on equality relation. found.push(innerType); result.push(innerType); return result; } return result; }, []); }); identicalPatterns = utils_1.compact(identicalPatterns); var duplicatePatterns = utils_1.filter(identicalPatterns, function (currIdenticalSet) { return currIdenticalSet.length > 1; }); var errors = utils_1.map(duplicatePatterns, function (setOfIdentical) { var tokenTypeNames = utils_1.map(setOfIdentical, function (currType) { return tokens_public_1.tokenName(currType); }); var dupPatternSrc = utils_1.first(setOfIdentical).PATTERN; return { message: "The same RegExp pattern ->" + dupPatternSrc + "<-" + ("has been used in all of the following Token Types: " + tokenTypeNames.join(", ") + " <-"), type: lexer_public_1.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND, tokenTypes: setOfIdentical }; }); return errors; } exports.findDuplicatePatterns = findDuplicatePatterns; function findInvalidGroupType(tokenTypes) { var invalidTypes = utils_1.filter(tokenTypes, function (clazz) { if (!utils_1.has(clazz, "GROUP")) { return false; } var group = clazz.GROUP; return group !== lexer_public_1.Lexer.SKIPPED && group !== lexer_public_1.Lexer.NA && !utils_1.isString(group); }); var errors = utils_1.map(invalidTypes, function (currType) { return { message: "Token Type: ->" + tokens_public_1.tokenName(currType) + "<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String", type: lexer_public_1.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND, tokenTypes: [currType] }; }); return errors; } exports.findInvalidGroupType = findInvalidGroupType; function findModesThatDoNotExist(tokenTypes, validModes) { var invalidModes = utils_1.filter(tokenTypes, function (clazz) { return (clazz.PUSH_MODE !== undefined && !utils_1.contains(validModes, clazz.PUSH_MODE)); }); var errors = utils_1.map(invalidModes, function (clazz) { var msg = "Token Type: ->" + tokens_public_1.tokenName(clazz) + "<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->" + clazz.PUSH_MODE + "<-" + "which does not exist"; return { message: msg, type: lexer_public_1.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST, tokenTypes: [clazz] }; }); return errors; } exports.findModesThatDoNotExist = findModesThatDoNotExist; function findUnreachablePatterns(tokenTypes) { var errors = []; var canBeTested = utils_1.reduce(tokenTypes, function (result, tokType, idx) { var pattern = tokType.PATTERN; if (pattern === lexer_public_1.Lexer.NA) { return result; } // a more comprehensive validation for all forms of regExps would require // deeper regExp analysis capabilities if (utils_1.isString(pattern)) { result.push({ str: pattern, idx: idx, tokenType: tokType }); } else if (utils_1.isRegExp(pattern) && noMetaChar(pattern)) { result.push({ str: pattern.source, idx: idx, tokenType: tokType }); } return result; }, []); utils_1.forEach(tokenTypes, function (tokType, testIdx) { utils_1.forEach(canBeTested, function (_a) { var str = _a.str, idx = _a.idx, tokenType = _a.tokenType; if (testIdx < idx && testTokenType(str, tokType.PATTERN)) { var msg = "Token: ->" + tokens_public_1.tokenName(tokenType) + "<- can never be matched.\n" + ("Because it appears AFTER the Token Type ->" + tokens_public_1.tokenName(tokType) + "<-") + "in the lexer's definition.\n" + "See https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#UNREACHABLE"; errors.push({ message: msg, type: lexer_public_1.LexerDefinitionErrorType.UNREACHABLE_PATTERN, tokenTypes: [tokType, tokenType] }); } }); }); return errors; } exports.findUnreachablePatterns = findUnreachablePatterns; function testTokenType(str, pattern) { /* istanbul ignore else */ if (utils_1.isRegExp(pattern)) { var regExpArray = pattern.exec(str); return regExpArray !== null && regExpArray.index === 0; } else if (utils_1.isFunction(pattern)) { // maintain the API of custom patterns return pattern(str, 0, [], {}); } else if (utils_1.has(pattern, "exec")) { // maintain the API of custom patterns return pattern.exec(str, 0, [], {}); } else if (typeof pattern === "string") { return pattern === str; } else { throw Error("non exhaustive match"); } } function noMetaChar(regExp) { //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp var metaChars = [ ".", "\\", "[", "]", "|", "^", "$", "(", ")", "?", "*", "+", "{" ]; return (utils_1.find(metaChars, function (char) { return regExp.source.indexOf(char) !== -1; }) === undefined); } function addStartOfInput(pattern) { var flags = pattern.ignoreCase ? "i" : ""; // always wrapping in a none capturing group preceded by '^' to make sure matching can only work on start of input. // duplicate/redundant start of input markers have no meaning (/^^^^A/ === /^A/) return new RegExp("^(?:" + pattern.source + ")", flags); } exports.addStartOfInput = addStartOfInput; function addStickyFlag(pattern) { var flags = pattern.ignoreCase ? "iy" : "y"; // always wrapping in a none capturing group preceded by '^' to make sure matching can only work on start of input. // duplicate/redundant start of input markers have no meaning (/^^^^A/ === /^A/) return new RegExp("" + pattern.source, flags); } exports.addStickyFlag = addStickyFlag; function performRuntimeChecks(lexerDefinition, trackLines, lineTerminatorCharacters) { var errors = []; // some run time checks to help the end users. if (!utils_1.has(lexerDefinition, exports.DEFAULT_MODE)) { errors.push({ message: "A MultiMode Lexer cannot be initialized without a <" + exports.DEFAULT_MODE + "> property in its definition\n", type: lexer_public_1.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE }); } if (!utils_1.has(lexerDefinition, exports.MODES)) { errors.push({ message: "A MultiMode Lexer cannot be initialized without a <" + exports.MODES + "> property in its definition\n", type: lexer_public_1.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY }); } if (utils_1.has(lexerDefinition, exports.MODES) && utils_1.has(lexerDefinition, exports.DEFAULT_MODE) && !utils_1.has(lexerDefinition.modes, lexerDefinition.defaultMode)) { errors.push({ message: "A MultiMode Lexer cannot be initialized with a " + exports.DEFAULT_MODE + ": <" + lexerDefinition.defaultMode + ">" + "which does not exist\n", type: lexer_public_1.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST }); } if (utils_1.has(lexerDefinition, exports.MODES)) { utils_1.forEach(lexerDefinition.modes, function (currModeValue, currModeName) { utils_1.forEach(currModeValue, function (currTokType, currIdx) { if (utils_1.isUndefined(currTokType)) { errors.push({ message: "A Lexer cannot be initialized using an undefined Token Type. Mode:" + ("<" + currModeName + "> at index: <" + currIdx + ">\n"), type: lexer_public_1.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED }); } }); }); } return errors; } exports.performRuntimeChecks = performRuntimeChecks; function performWarningRuntimeChecks(lexerDefinition, trackLines, lineTerminatorCharacters) { var warnings = []; var hasAnyLineBreak = false; var allTokenTypes = utils_1.compact(utils_1.flatten(utils_1.mapValues(lexerDefinition.modes, function (tokTypes) { return tokTypes; }))); var concreteTokenTypes = utils_1.reject(allTokenTypes, function (currType) { return currType[PATTERN] === lexer_public_1.Lexer.NA; }); var terminatorCharCodes = getCharCodes(lineTerminatorCharacters); if (trackLines) { utils_1.forEach(concreteTokenTypes, function (tokType) { var currIssue = checkLineBreaksIssues(tokType, terminatorCharCodes); if (currIssue !== false) { var message = buildLineBreakIssueMessage(tokType, currIssue); var warningDescriptor = { message: message, type: currIssue.issue, tokenType: tokType }; warnings.push(warningDescriptor); } else { // we don't want to attempt to scan if the user explicitly specified the line_breaks option. if (utils_1.has(tokType, "LINE_BREAKS")) { if (tokType.LINE_BREAKS === true) { hasAnyLineBreak = true; } } else { if (reg_exp_1.canMatchCharCode(terminatorCharCodes, tokType.PATTERN)) { hasAnyLineBreak = true; } } } }); } if (trackLines && !hasAnyLineBreak) { warnings.push({ message: "Warning: No LINE_BREAKS Found.\n" + "\tThis Lexer has been defined to track line and column information,\n" + "\tBut none of the Token Types can be identified as matching a line terminator.\n" + "\tSee https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \n" + "\tfor details.", type: lexer_public_1.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS }); } return warnings; } exports.performWarningRuntimeChecks = performWarningRuntimeChecks; function cloneEmptyGroups(emptyGroups) { var clonedResult = {}; var groupKeys = utils_1.keys(emptyGroups); utils_1.forEach(groupKeys, function (currKey) { var currGroupValue = emptyGroups[currKey]; /* istanbul ignore else */ if (utils_1.isArray(currGroupValue)) { clonedResult[currKey] = []; } else { throw Error("non exhaustive match"); } }); return clonedResult; } exports.cloneEmptyGroups = cloneEmptyGroups; // TODO: refactor to avoid duplication function isCustomPattern(tokenType) { var pattern = tokenType.PATTERN; /* istanbul ignore else */ if (utils_1.isRegExp(pattern)) { return false; } else if (utils_1.isFunction(pattern)) { // CustomPatternMatcherFunc - custom patterns do not require any transformations, only wrapping in a RegExp Like object return true; } else if (utils_1.has(pattern, "exec")) { // ICustomPattern return true; } else if (utils_1.isString(pattern)) { return false; } else { throw Error("non exhaustive match"); } } exports.isCustomPattern = isCustomPattern; function isShortPattern(pattern) { if (utils_1.isString(pattern) && pattern.length === 1) { return pattern.charCodeAt(0); } else { return false; } } exports.isShortPattern = isShortPattern; /** * Faster than using a RegExp for default newline detection during lexing. */ exports.LineTerminatorOptimizedTester = { // implements /\n|\r\n?/g.test test: function (text) { var len = text.length; for (var i = this.lastIndex; i < len; i++) { var c = text.charCodeAt(i); if (c === 10) { this.lastIndex = i + 1; return true; } else if (c === 13) { if (text.charCodeAt(i + 1) === 10) { this.lastIndex = i + 2; } else { this.lastIndex = i + 1; } return true; } } return false; }, lastIndex: 0 }; function checkLineBreaksIssues(tokType, lineTerminatorCharCodes) { if (utils_1.has(tokType, "LINE_BREAKS")) { // if the user explicitly declared the line_breaks option we will respect their choice // and assume it is correct. return false; } else { /* istanbul ignore else */ if (utils_1.isRegExp(tokType.PATTERN)) { try { reg_exp_1.canMatchCharCode(lineTerminatorCharCodes, tokType.PATTERN); } catch (e) { /* istanbul ignore next - to test this we would have to mock to throw an error */ return { issue: lexer_public_1.LexerDefinitionErrorType.IDENTIFY_TERMINATOR, errMsg: e.message }; } return false; } else if (utils_1.isString(tokType.PATTERN)) { // string literal patterns can always be analyzed to detect line terminator usage return false; } else if (isCustomPattern(tokType)) { // custom token types return { issue: lexer_public_1.LexerDefinitionErrorType.CUSTOM_LINE_BREAK }; } else { throw Error("non exhaustive match"); } } } function buildLineBreakIssueMessage(tokType, details) { /* istanbul ignore else */ if (details.issue === lexer_public_1.LexerDefinitionErrorType.IDENTIFY_TERMINATOR) { return ("Warning: unable to identify line terminator usage in pattern.\n" + ("\tThe problem is in the <" + tokType.name + "> Token Type\n") + ("\t Root cause: " + details.errMsg + ".\n") + "\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR"); } else if (details.issue === lexer_public_1.LexerDefinitionErrorType.CUSTOM_LINE_BREAK) { return ("Warning: A Custom Token Pattern should specify the option.\n" + ("\tThe problem is in the <" + tokType.name + "> Token Type\n") + "\tFor details See: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK"); } else { throw Error("non exhaustive match"); } } exports.buildLineBreakIssueMessage = buildLineBreakIssueMessage; function getCharCodes(charsOrCodes) { var charCodes = utils_1.map(charsOrCodes, function (numOrString) { if (utils_1.isString(numOrString) && numOrString.length > 0) { return numOrString.charCodeAt(0); } else { return numOrString; } }); return charCodes; } //# sourceMappingURL=lexer.js.map /***/ }), /* 64 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var regexp_to_ast_1 = __webpack_require__(42); var utils_1 = __webpack_require__(0); var regExpParser = new regexp_to_ast_1.RegExpParser(); var complementErrorMessage = "Complement Sets are not supported for first char optimization"; exports.failedOptimizationPrefixMsg = 'Unable to use "first char" lexer optimizations:\n'; function getStartCodes(regExp, ensureOptimizations) { if (ensureOptimizations === void 0) { ensureOptimizations = false; } try { var ast = regExpParser.pattern(regExp.toString()); var firstChars = firstChar(ast.value); if (ast.flags.ignoreCase) { firstChars = applyIgnoreCase(firstChars); } return firstChars; } catch (e) { /* istanbul ignore next */ // Testing this relies on the regexp-to-ast library having a bug... */ // TODO: only the else branch needs to be ignored, try to fix with newer prettier / tsc if (e.message === complementErrorMessage) { if (ensureOptimizations) { utils_1.PRINT_WARNING("" + exports.failedOptimizationPrefixMsg + ("\tUnable to optimize: < " + regExp.toString() + " >\n") + "\tComplement Sets cannot be automatically optimized.\n" + "\tThis will disable the lexer's first char optimizations.\n" + "\tSee: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details."); } } else { var msgSuffix = ""; if (ensureOptimizations) { msgSuffix = "\n\tThis will disable the lexer's first char optimizations.\n" + "\tSee: https://sap.github.io/chevrotain/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details."; } utils_1.PRINT_ERROR(exports.failedOptimizationPrefixMsg + "\n" + ("\tFailed parsing: < " + regExp.toString() + " >\n") + ("\tUsing the regexp-to-ast library version: " + regexp_to_ast_1.VERSION + "\n") + "\tPlease open an issue at: https://github.com/bd82/regexp-to-ast/issues" + msgSuffix); } } return []; } exports.getStartCodes = getStartCodes; function firstChar(ast) { switch (ast.type) { case "Disjunction": return utils_1.flatten(utils_1.map(ast.value, firstChar)); case "Alternative": var startChars_1 = []; var terms = ast.value; for (var i = 0; i < terms.length; i++) { var term = terms[i]; if (utils_1.contains([ // A group back reference cannot affect potential starting char. // because if a back reference is the first production than automatically // the group being referenced has had to come BEFORE so its codes have already been added "GroupBackReference", // assertions do not affect potential starting codes "Lookahead", "NegativeLookahead", "StartAnchor", "EndAnchor", "WordBoundary", "NonWordBoundary" ], term.type)) { continue; } var atom = term; switch (atom.type) { case "Character": startChars_1.push(atom.value); break; case "Set": if (atom.complement === true) { throw Error(complementErrorMessage); } utils_1.forEach(atom.value, function (code) { return startChars_1.push(code); }); break; case "Group": var groupCodes = firstChar(atom.value); utils_1.forEach(groupCodes, function (code) { return startChars_1.push(code); }); break; /* istanbul ignore next */ default: throw Error("Non Exhaustive Match"); } // reached a mandatory production, no more start codes can be found on this alternative if ( // atom.quantifier === undefined || (atom.quantifier !== undefined && atom.quantifier.atLeast > 0)) { break; } } return startChars_1; /* istanbul ignore next */ default: throw Error("non exhaustive match!"); } } exports.firstChar = firstChar; function applyIgnoreCase(firstChars) { var firstCharsCase = []; utils_1.forEach(firstChars, function (charCode) { firstCharsCase.push(charCode); var char = String.fromCharCode(charCode); /* istanbul ignore else */ if (char.toUpperCase() !== char) { firstCharsCase.push(char.toUpperCase().charCodeAt(0)); } else if (char.toLowerCase() !== char) { firstCharsCase.push(char.toLowerCase().charCodeAt(0)); } }); return firstCharsCase; } exports.applyIgnoreCase = applyIgnoreCase; var CharCodeFinder = /** @class */ (function (_super) { __extends(CharCodeFinder, _super); function CharCodeFinder(targetCharCodes) { var _this = _super.call(this) || this; _this.targetCharCodes = targetCharCodes; _this.found = false; return _this; } CharCodeFinder.prototype.visitChildren = function (node) { // switch lookaheads as they do not actually consume any characters thus // finding a charCode at lookahead context does not mean that regexp can actually contain it in a match. switch (node.type) { case "Lookahead": this.visitLookahead(node); return; case "NegativeLookahead": this.visitNegativeLookahead(node); return; } _super.prototype.visitChildren.call(this, node); }; CharCodeFinder.prototype.visitCharacter = function (node) { if (utils_1.contains(this.targetCharCodes, node.value)) { this.found = true; } }; CharCodeFinder.prototype.visitSet = function (node) { var _this = this; if (node.complement) { if (utils_1.find(node.value, function (charCode) { return utils_1.contains(_this.targetCharCodes, charCode); }) === undefined) { this.found = true; } } else { if (utils_1.find(node.value, function (charCode) { return utils_1.contains(_this.targetCharCodes, charCode); }) !== undefined) { this.found = true; } } }; return CharCodeFinder; }(regexp_to_ast_1.BaseRegExpVisitor)); function canMatchCharCode(charCodes, pattern) { if (pattern instanceof RegExp) { var ast = regExpParser.pattern(pattern.toString()); var charCodeFinder = new CharCodeFinder(charCodes); charCodeFinder.visit(ast); return charCodeFinder.found; } else { return (utils_1.find(pattern, function (char) { return utils_1.contains(charCodes, char.charCodeAt(0)); }) !== undefined); } } exports.canMatchCharCode = canMatchCharCode; //# sourceMappingURL=reg_exp.js.map /***/ }), /* 65 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Range = /** @class */ (function () { function Range(start, end) { this.start = start; this.end = end; if (!isValidRange(start, end)) { throw new Error("INVALID RANGE"); } } Range.prototype.contains = function (num) { return this.start <= num && this.end >= num; }; Range.prototype.containsRange = function (other) { return this.start <= other.start && this.end >= other.end; }; Range.prototype.isContainedInRange = function (other) { return other.containsRange(this); }; Range.prototype.strictlyContainsRange = function (other) { return this.start < other.start && this.end > other.end; }; Range.prototype.isStrictlyContainedInRange = function (other) { return other.strictlyContainsRange(this); }; return Range; }()); exports.Range = Range; function isValidRange(start, end) { return !(start < 0 || end < start); } exports.isValidRange = isValidRange; //# sourceMappingURL=range.js.map /***/ }), /* 66 */ /***/ (function(module, exports, __webpack_require__) { /*** IMPORTS FROM imports-loader ***/ var Blockly = __webpack_require__(74); var goog = __webpack_require__(30); /** * @license * Visual Blocks Language * * Copyright 2012 Google Inc. * https://developers.google.com/blockly/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @fileoverview English strings. * @author ascii@media.mit.edu (Andrew Sliwinski) * * After modifying this file, run `npm run translate` from the root directory * to regenerate `./msg/json/en.json`. * IMPORTANT: * All message strings must use single quotes for the scripts to work properly */ 'use strict'; goog.provide('Blockly.Msg.en'); goog.require('Blockly.Msg'); // Control blocks Blockly.Msg.CONTROL_FOREVER = 'forever'; Blockly.Msg.CONTROL_REPEAT = 'repeat %1'; Blockly.Msg.CONTROL_IF = 'if %1 then'; Blockly.Msg.CONTROL_ELSE = 'else'; Blockly.Msg.CONTROL_STOP = 'stop'; Blockly.Msg.CONTROL_STOP_ALL = 'all'; Blockly.Msg.CONTROL_STOP_THIS = 'this script'; Blockly.Msg.CONTROL_STOP_OTHER = 'other scripts in sprite'; Blockly.Msg.CONTROL_WAIT = 'wait %1 seconds'; Blockly.Msg.CONTROL_WAITUNTIL = 'wait until %1'; Blockly.Msg.CONTROL_REPEATUNTIL = 'repeat until %1'; Blockly.Msg.CONTROL_WHILE = 'while %1'; Blockly.Msg.CONTROL_FOREACH = 'for each %1 in %2'; Blockly.Msg.CONTROL_STARTASCLONE = 'when I start as a clone'; Blockly.Msg.CONTROL_CREATECLONEOF = 'create clone of %1'; Blockly.Msg.CONTROL_CREATECLONEOF_MYSELF = 'myself'; Blockly.Msg.CONTROL_DELETETHISCLONE = 'delete this clone'; Blockly.Msg.CONTROL_COUNTER = 'counter'; Blockly.Msg.CONTROL_INCRCOUNTER = 'increment counter'; Blockly.Msg.CONTROL_CLEARCOUNTER = 'clear counter'; Blockly.Msg.CONTROL_ALLATONCE = 'all at once'; // Data blocks Blockly.Msg.DATA_SETVARIABLETO = 'set %1 to %2'; Blockly.Msg.DATA_CHANGEVARIABLEBY = 'change %1 by %2'; Blockly.Msg.DATA_SHOWVARIABLE = 'show variable %1'; Blockly.Msg.DATA_HIDEVARIABLE = 'hide variable %1'; Blockly.Msg.DATA_ADDTOLIST = 'add %1 to %2'; Blockly.Msg.DATA_DELETEOFLIST = 'delete %1 of %2'; Blockly.Msg.DATA_INSERTATLIST = 'insert %1 at %2 of %3'; Blockly.Msg.DATA_REPLACEITEMOFLIST = 'replace item %1 of %2 with %3'; Blockly.Msg.DATA_ITEMOFLIST = 'item %1 of %2'; Blockly.Msg.DATA_LENGTHOFLIST = 'length of %1'; Blockly.Msg.DATA_LISTCONTAINSITEM = '%1 contains %2?'; Blockly.Msg.DATA_SHOWLIST = 'show list %1'; Blockly.Msg.DATA_HIDELIST = 'hide list %1'; Blockly.Msg.DATA_INDEX_ALL = 'all'; Blockly.Msg.DATA_INDEX_LAST = 'last'; Blockly.Msg.DATA_INDEX_RANDOM = 'random'; // Event blocks Blockly.Msg.EVENT_WHENFLAGCLICKED = 'when %1 clicked'; Blockly.Msg.EVENT_WHENTHISSPRITECLICKED = 'when this sprite clicked'; Blockly.Msg.EVENT_WHENSTAGECLICKED = 'when stage clicked'; Blockly.Msg.EVENT_WHENTOUCHINGOBJECT = 'when this sprite touches %1'; Blockly.Msg.EVENT_WHENBROADCASTRECEIVED = 'when I receive %1'; Blockly.Msg.EVENT_WHENBACKDROPSWITCHESTO = 'when backdrop switches to %1'; Blockly.Msg.EVENT_WHENGREATERTHAN = 'when %1 > %2'; Blockly.Msg.EVENT_WHENGREATERTHAN_TIMER = 'timer'; Blockly.Msg.EVENT_WHENGREATERTHAN_LOUDNESS = 'loudness'; Blockly.Msg.EVENT_BROADCAST = 'broadcast %1'; Blockly.Msg.EVENT_BROADCASTANDWAIT = 'broadcast %1 and wait'; Blockly.Msg.EVENT_WHENKEYPRESSED = 'when %1 key pressed'; Blockly.Msg.EVENT_WHENKEYPRESSED_SPACE = 'space'; Blockly.Msg.EVENT_WHENKEYPRESSED_LEFT = 'left arrow'; Blockly.Msg.EVENT_WHENKEYPRESSED_RIGHT = 'right arrow'; Blockly.Msg.EVENT_WHENKEYPRESSED_DOWN = 'down arrow'; Blockly.Msg.EVENT_WHENKEYPRESSED_UP = 'up arrow'; Blockly.Msg.EVENT_WHENKEYPRESSED_ANY = 'any'; // Looks blocks Blockly.Msg.LOOKS_SAYFORSECS = 'say %1 for %2 seconds'; Blockly.Msg.LOOKS_SAY = 'say %1'; Blockly.Msg.LOOKS_HELLO = 'Hello!'; Blockly.Msg.LOOKS_THINKFORSECS = 'think %1 for %2 seconds'; Blockly.Msg.LOOKS_THINK = 'think %1'; Blockly.Msg.LOOKS_HMM = 'Hmm...'; Blockly.Msg.LOOKS_SHOW = 'show'; Blockly.Msg.LOOKS_HIDE = 'hide'; Blockly.Msg.LOOKS_HIDEALLSPRITES = 'hide all sprites'; Blockly.Msg.LOOKS_EFFECT_COLOR = 'color'; Blockly.Msg.LOOKS_EFFECT_FISHEYE = 'fisheye'; Blockly.Msg.LOOKS_EFFECT_WHIRL = 'whirl'; Blockly.Msg.LOOKS_EFFECT_PIXELATE = 'pixelate'; Blockly.Msg.LOOKS_EFFECT_MOSAIC = 'mosaic'; Blockly.Msg.LOOKS_EFFECT_BRIGHTNESS = 'brightness'; Blockly.Msg.LOOKS_EFFECT_GHOST = 'ghost'; Blockly.Msg.LOOKS_CHANGEEFFECTBY = 'change %1 effect by %2'; Blockly.Msg.LOOKS_SETEFFECTTO = 'set %1 effect to %2'; Blockly.Msg.LOOKS_CLEARGRAPHICEFFECTS = 'clear graphic effects'; Blockly.Msg.LOOKS_CHANGESIZEBY = 'change size by %1'; Blockly.Msg.LOOKS_SETSIZETO = 'set size to %1 %'; Blockly.Msg.LOOKS_SIZE = 'size'; Blockly.Msg.LOOKS_CHANGESTRETCHBY = 'change stretch by %1'; Blockly.Msg.LOOKS_SETSTRETCHTO = 'set stretch to %1 %'; Blockly.Msg.LOOKS_SWITCHCOSTUMETO = 'switch costume to %1'; Blockly.Msg.LOOKS_NEXTCOSTUME = 'next costume'; Blockly.Msg.LOOKS_SWITCHBACKDROPTO = 'switch backdrop to %1'; Blockly.Msg.LOOKS_GOTOFRONTBACK = 'go to %1 layer'; Blockly.Msg.LOOKS_GOTOFRONTBACK_FRONT = 'front'; Blockly.Msg.LOOKS_GOTOFRONTBACK_BACK = 'back'; Blockly.Msg.LOOKS_GOFORWARDBACKWARDLAYERS = 'go %1 %2 layers'; Blockly.Msg.LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD = 'forward'; Blockly.Msg.LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD = 'backward'; Blockly.Msg.LOOKS_BACKDROPNUMBERNAME = 'backdrop %1'; Blockly.Msg.LOOKS_COSTUMENUMBERNAME = 'costume %1'; Blockly.Msg.LOOKS_NUMBERNAME_NUMBER = 'number'; Blockly.Msg.LOOKS_NUMBERNAME_NAME = 'name'; Blockly.Msg.LOOKS_SWITCHBACKDROPTOANDWAIT = 'switch backdrop to %1 and wait'; Blockly.Msg.LOOKS_NEXTBACKDROP = 'next backdrop'; Blockly.Msg.LOOKS_PREVIOUSBACKDROP = 'previous backdrop'; Blockly.Msg.LOOKS_RANDOMBACKDROP = 'random backdrop'; // Motion blocks Blockly.Msg.MOTION_MOVESTEPS = 'move %1 steps'; Blockly.Msg.MOTION_TURNLEFT = 'turn %1 %2 degrees'; Blockly.Msg.MOTION_TURNRIGHT = 'turn %1 %2 degrees'; Blockly.Msg.MOTION_POINTINDIRECTION = 'point in direction %1'; Blockly.Msg.MOTION_POINTTOWARDS = 'point towards %1'; Blockly.Msg.MOTION_POINTTOWARDS_POINTER = 'mouse-pointer'; Blockly.Msg.MOTION_GOTO = 'go to %1'; Blockly.Msg.MOTION_GOTO_POINTER = 'mouse-pointer'; Blockly.Msg.MOTION_GOTO_RANDOM = 'random position'; Blockly.Msg.MOTION_GOTOXY = 'go to x: %1 y: %2'; Blockly.Msg.MOTION_GLIDESECSTOXY = 'glide %1 secs to x: %2 y: %3'; Blockly.Msg.MOTION_GLIDETO = 'glide %1 secs to %2'; Blockly.Msg.MOTION_GLIDETO_POINTER = 'mouse-pointer'; Blockly.Msg.MOTION_GLIDETO_RANDOM = 'random position'; Blockly.Msg.MOTION_CHANGEXBY = 'change x by %1'; Blockly.Msg.MOTION_SETX = 'set x to %1'; Blockly.Msg.MOTION_CHANGEYBY = 'change y by %1'; Blockly.Msg.MOTION_SETY = 'set y to %1'; Blockly.Msg.MOTION_IFONEDGEBOUNCE = 'if on edge, bounce'; Blockly.Msg.MOTION_SETROTATIONSTYLE = 'set rotation style %1'; Blockly.Msg.MOTION_SETROTATIONSTYLE_LEFTRIGHT = 'left-right'; Blockly.Msg.MOTION_SETROTATIONSTYLE_DONTROTATE = 'don\'t rotate'; Blockly.Msg.MOTION_SETROTATIONSTYLE_ALLAROUND = 'all around'; Blockly.Msg.MOTION_XPOSITION = 'x position'; Blockly.Msg.MOTION_YPOSITION = 'y position'; Blockly.Msg.MOTION_DIRECTION = 'direction'; Blockly.Msg.MOTION_SCROLLRIGHT = 'scroll right %1'; Blockly.Msg.MOTION_SCROLLUP = 'scroll up %1'; Blockly.Msg.MOTION_ALIGNSCENE = 'align scene %1'; Blockly.Msg.MOTION_ALIGNSCENE_BOTTOMLEFT = 'bottom-left'; Blockly.Msg.MOTION_ALIGNSCENE_BOTTOMRIGHT = 'bottom-right'; Blockly.Msg.MOTION_ALIGNSCENE_MIDDLE = 'middle'; Blockly.Msg.MOTION_ALIGNSCENE_TOPLEFT = 'top-left'; Blockly.Msg.MOTION_ALIGNSCENE_TOPRIGHT = 'top-right'; Blockly.Msg.MOTION_XSCROLL = 'x scroll'; Blockly.Msg.MOTION_YSCROLL = 'y scroll'; Blockly.Msg.MOTION_STAGE_SELECTED = 'Stage selected: no motion blocks'; // Operators blocks Blockly.Msg.OPERATORS_ADD = '%1 + %2'; Blockly.Msg.OPERATORS_SUBTRACT = '%1 - %2'; Blockly.Msg.OPERATORS_MULTIPLY = '%1 * %2'; Blockly.Msg.OPERATORS_DIVIDE = '%1 / %2'; Blockly.Msg.OPERATORS_RANDOM = 'pick random %1 to %2'; Blockly.Msg.OPERATORS_GT = '%1 > %2'; Blockly.Msg.OPERATORS_LT = '%1 < %2'; Blockly.Msg.OPERATORS_EQUALS = '%1 = %2'; Blockly.Msg.OPERATORS_AND = '%1 and %2'; Blockly.Msg.OPERATORS_OR = '%1 or %2'; Blockly.Msg.OPERATORS_NOT = 'not %1'; Blockly.Msg.OPERATORS_JOIN = 'join %1 %2'; Blockly.Msg.OPERATORS_JOIN_APPLE = 'apple'; Blockly.Msg.OPERATORS_JOIN_BANANA = 'banana'; Blockly.Msg.OPERATORS_LETTEROF = 'letter %1 of %2'; Blockly.Msg.OPERATORS_LETTEROF_APPLE = 'a'; Blockly.Msg.OPERATORS_LENGTH = 'length of %1'; Blockly.Msg.OPERATORS_CONTAINS = '%1 contains %2?'; Blockly.Msg.OPERATORS_MOD = '%1 mod %2'; Blockly.Msg.OPERATORS_ROUND = 'round %1'; Blockly.Msg.OPERATORS_MATHOP = '%1 of %2'; Blockly.Msg.OPERATORS_MATHOP_ABS = 'abs'; Blockly.Msg.OPERATORS_MATHOP_FLOOR = 'floor'; Blockly.Msg.OPERATORS_MATHOP_CEILING = 'ceiling'; Blockly.Msg.OPERATORS_MATHOP_SQRT = 'sqrt'; Blockly.Msg.OPERATORS_MATHOP_SIN = 'sin'; Blockly.Msg.OPERATORS_MATHOP_COS = 'cos'; Blockly.Msg.OPERATORS_MATHOP_TAN = 'tan'; Blockly.Msg.OPERATORS_MATHOP_ASIN = 'asin'; Blockly.Msg.OPERATORS_MATHOP_ACOS = 'acos'; Blockly.Msg.OPERATORS_MATHOP_ATAN = 'atan'; Blockly.Msg.OPERATORS_MATHOP_LN = 'ln'; Blockly.Msg.OPERATORS_MATHOP_LOG = 'log'; Blockly.Msg.OPERATORS_MATHOP_EEXP = 'e ^'; Blockly.Msg.OPERATORS_MATHOP_10EXP = '10 ^'; // Procedures blocks Blockly.Msg.PROCEDURES_DEFINITION = 'define %1'; // Sensing blocks Blockly.Msg.SENSING_TOUCHINGOBJECT = 'touching %1?'; Blockly.Msg.SENSING_TOUCHINGOBJECT_POINTER = 'mouse-pointer'; Blockly.Msg.SENSING_TOUCHINGOBJECT_EDGE = 'edge'; Blockly.Msg.SENSING_TOUCHINGCOLOR = 'touching color %1?'; Blockly.Msg.SENSING_COLORISTOUCHINGCOLOR = 'color %1 is touching %2?'; Blockly.Msg.SENSING_DISTANCETO = 'distance to %1'; Blockly.Msg.SENSING_DISTANCETO_POINTER = 'mouse-pointer'; Blockly.Msg.SENSING_ASKANDWAIT = 'ask %1 and wait'; Blockly.Msg.SENSING_ASK_TEXT = 'What\'s your name?'; Blockly.Msg.SENSING_ANSWER = 'answer'; Blockly.Msg.SENSING_KEYPRESSED = 'key %1 pressed?'; Blockly.Msg.SENSING_MOUSEDOWN = 'mouse down?'; Blockly.Msg.SENSING_MOUSEX = 'mouse x'; Blockly.Msg.SENSING_MOUSEY = 'mouse y'; Blockly.Msg.SENSING_SETDRAGMODE = 'set drag mode %1'; Blockly.Msg.SENSING_SETDRAGMODE_DRAGGABLE = 'draggable'; Blockly.Msg.SENSING_SETDRAGMODE_NOTDRAGGABLE = 'not draggable'; Blockly.Msg.SENSING_LOUDNESS = 'loudness'; Blockly.Msg.SENSING_LOUD = 'loud?'; Blockly.Msg.SENSING_TIMER = 'timer'; Blockly.Msg.SENSING_RESETTIMER = 'reset timer'; Blockly.Msg.SENSING_OF = '%1 of %2'; Blockly.Msg.SENSING_OF_XPOSITION = 'x position'; Blockly.Msg.SENSING_OF_YPOSITION = 'y position'; Blockly.Msg.SENSING_OF_DIRECTION = 'direction'; Blockly.Msg.SENSING_OF_COSTUMENUMBER = 'costume #'; Blockly.Msg.SENSING_OF_COSTUMENAME = 'costume name'; Blockly.Msg.SENSING_OF_SIZE = 'size'; Blockly.Msg.SENSING_OF_VOLUME = 'volume'; Blockly.Msg.SENSING_OF_BACKDROPNUMBER = 'backdrop #'; Blockly.Msg.SENSING_OF_BACKDROPNAME = 'backdrop name'; Blockly.Msg.SENSING_OF_STAGE = 'Stage'; Blockly.Msg.SENSING_CURRENT = 'current %1'; Blockly.Msg.SENSING_CURRENT_YEAR = 'year'; Blockly.Msg.SENSING_CURRENT_MONTH = 'month'; Blockly.Msg.SENSING_CURRENT_DATE = 'date'; Blockly.Msg.SENSING_CURRENT_DAYOFWEEK = 'day of week'; Blockly.Msg.SENSING_CURRENT_HOUR = 'hour'; Blockly.Msg.SENSING_CURRENT_MINUTE = 'minute'; Blockly.Msg.SENSING_CURRENT_SECOND = 'second'; Blockly.Msg.SENSING_DAYSSINCE2000 = 'days since 2000'; Blockly.Msg.SENSING_USERNAME = 'username'; Blockly.Msg.SENSING_USERID = 'user id'; // Sound blocks Blockly.Msg.SOUND_PLAY = 'start sound %1'; Blockly.Msg.SOUND_PLAYUNTILDONE = 'play sound %1 until done'; Blockly.Msg.SOUND_STOPALLSOUNDS = 'stop all sounds'; Blockly.Msg.SOUND_SETEFFECTO = 'set %1 effect to %2'; Blockly.Msg.SOUND_CHANGEEFFECTBY = 'change %1 effect by %2'; Blockly.Msg.SOUND_CLEAREFFECTS = 'clear sound effects'; Blockly.Msg.SOUND_EFFECTS_PITCH = 'pitch'; Blockly.Msg.SOUND_EFFECTS_PAN = 'pan left/right'; Blockly.Msg.SOUND_CHANGEVOLUMEBY = 'change volume by %1'; Blockly.Msg.SOUND_SETVOLUMETO = 'set volume to %1%'; Blockly.Msg.SOUND_VOLUME = 'volume'; // Category labels Blockly.Msg.CATEGORY_MOTION = 'Motion'; Blockly.Msg.CATEGORY_LOOKS = 'Looks'; Blockly.Msg.CATEGORY_SOUND = 'Sound'; Blockly.Msg.CATEGORY_EVENTS = 'Events'; Blockly.Msg.CATEGORY_CONTROL = 'Control'; Blockly.Msg.CATEGORY_SENSING = 'Sensing'; Blockly.Msg.CATEGORY_OPERATORS = 'Operators'; Blockly.Msg.CATEGORY_VARIABLES = 'Variables'; Blockly.Msg.CATEGORY_MYBLOCKS = 'My Blocks'; // Context menus Blockly.Msg.DUPLICATE = 'Duplicate'; Blockly.Msg.DELETE = 'Delete'; Blockly.Msg.ADD_COMMENT = 'Add Comment'; Blockly.Msg.REMOVE_COMMENT = 'Remove Comment'; Blockly.Msg.DELETE_BLOCK = 'Delete Block'; Blockly.Msg.DELETE_X_BLOCKS = 'Delete %1 Blocks'; Blockly.Msg.DELETE_ALL_BLOCKS = 'Delete all %1 blocks?'; Blockly.Msg.CLEAN_UP = 'Clean up Blocks'; Blockly.Msg.HELP = 'Help'; Blockly.Msg.UNDO = 'Undo'; Blockly.Msg.REDO = 'Redo'; Blockly.Msg.EDIT_PROCEDURE = 'Edit'; Blockly.Msg.SHOW_PROCEDURE_DEFINITION = 'Go to definition'; Blockly.Msg.WORKSPACE_COMMENT_DEFAULT_TEXT = 'Say something...'; // Color Blockly.Msg.COLOUR_HUE_LABEL = 'Color'; Blockly.Msg.COLOUR_SATURATION_LABEL = 'Saturation'; Blockly.Msg.COLOUR_BRIGHTNESS_LABEL = 'Brightness'; // Variables // @todo Remove these once fully managed by Scratch VM / Scratch GUI Blockly.Msg.CHANGE_VALUE_TITLE = 'Change value:'; Blockly.Msg.RENAME_VARIABLE = 'Rename variable'; Blockly.Msg.RENAME_VARIABLE_TITLE = 'Rename all "%1" variables to:'; Blockly.Msg.RENAME_VARIABLE_MODAL_TITLE = 'Rename Variable'; Blockly.Msg.NEW_VARIABLE = 'Make a Variable'; Blockly.Msg.NEW_VARIABLE_TITLE = 'New variable name:'; Blockly.Msg.VARIABLE_MODAL_TITLE = 'New Variable'; Blockly.Msg.VARIABLE_ALREADY_EXISTS = 'A variable named "%1" already exists.'; Blockly.Msg.VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE = 'A variable named "%1" already exists for another variable of type "%2".'; Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = 'Delete %1 uses of the "%2" variable?'; Blockly.Msg.CANNOT_DELETE_VARIABLE_PROCEDURE = 'Can\'t delete the variable "%1" because it\'s part of the definition of the function "%2"'; Blockly.Msg.DELETE_VARIABLE = 'Delete the "%1" variable'; // Custom Procedures // @todo Remove these once fully managed by Scratch VM / Scratch GUI Blockly.Msg.NEW_PROCEDURE = 'Make a Block'; Blockly.Msg.PROCEDURE_ALREADY_EXISTS = 'A procedure named "%1" already exists.'; // Lists // @todo Remove these once fully managed by Scratch VM / Scratch GUI Blockly.Msg.NEW_LIST = 'Make a List'; Blockly.Msg.NEW_LIST_TITLE = 'New list name:'; Blockly.Msg.LIST_MODAL_TITLE = 'New List'; Blockly.Msg.LIST_ALREADY_EXISTS = 'A list named "%1" already exists.'; Blockly.Msg.RENAME_LIST_TITLE = 'Rename all "%1" lists to:'; Blockly.Msg.RENAME_LIST_MODAL_TITLE = 'Rename List'; // Broadcast Messages // @todo Remove these once fully managed by Scratch VM / Scratch GUI Blockly.Msg.NEW_BROADCAST_MESSAGE = 'New message'; Blockly.Msg.NEW_BROADCAST_MESSAGE_TITLE = 'New message name:'; Blockly.Msg.BROADCAST_MODAL_TITLE = 'New Message'; Blockly.Msg.DEFAULT_BROADCAST_MESSAGE_NAME = 'message1'; /*** EXPORTS FROM exports-loader ***/ module.exports = Blockly; /***/ }), /* 67 */ /***/ (function(module, exports, __webpack_require__) { /*** IMPORTS FROM imports-loader ***/ var Blockly = __webpack_require__(73); var goog = __webpack_require__(30); // This file was automatically generated. Do not modify. 'use strict'; goog.provide('Blockly.ScratchMsgs.allLocales'); goog.require('Blockly.ScratchMsgs'); Blockly.ScratchMsgs.locales["ab"] = { "CONTROL_FOREVER": "инагӡалатәуп", "CONTROL_REPEAT": "инагӡалатәуп %1 - нтә", "CONTROL_IF": "%1 акәзар", "CONTROL_ELSE": "акәымзар", "CONTROL_STOP": "иаанкылатәуп", "CONTROL_STOP_ALL": "зегьы", "CONTROL_STOP_THIS": "ари апрограмма", "CONTROL_STOP_OTHER": "анагӡаҩ егьырҭ ипрограммақәа", "CONTROL_WAIT": "иԥштәуп %1 секундк", "CONTROL_WAITUNTIL": "иԥштәуп %1 -нӡа", "CONTROL_REPEATUNTIL": "инагӡалатәуп %1 акәымзар", "CONTROL_WHILE": "%1 иашанаҵ", "CONTROL_FOREACH": "рыцԥхьаӡа %1 рзы %2 аҟны", "CONTROL_STARTASCLONE": "сара аклон еиԥш саналаго", "CONTROL_CREATECLONEOF": "иаԥҵатәуп аклон %1 аҟынтәи", "CONTROL_CREATECLONEOF_MYSELF": "сара схала", "CONTROL_DELETETHISCLONE": "ианыхтәуп ари аклон", "CONTROL_COUNTER": "аԥхьаӡага", "CONTROL_INCRCOUNTER": "аԥхьаӡага иазырҳатәуп", "CONTROL_CLEARCOUNTER": "ирыцқьатәуп аԥхьаӡага", "CONTROL_ALLATONCE": "зегьы иаразнак", "DATA_SETVARIABLETO": "%1 иаҭатәуп %2 ", "DATA_CHANGEVARIABLEBY": "иԥсахтәуп %1 %2 ала", "DATA_SHOWVARIABLE": "иаарԥштәуп аҽеиҭак %1", "DATA_HIDEVARIABLE": "иҵәахтәуп аҽеиҭак %1", "DATA_ADDTOLIST": "иацҵатәуп %1 %2 ахь ", "DATA_DELETEOFLIST": "ианыхтәуп %1 %2 аҟынтәи ", "DATA_INSERTATLIST": "%3 аҟны ибжьаргылатәуп %1 %2 аҭыԥахь ", "DATA_REPLACEITEMOFLIST": "%2 аҟны иԥсахтәуп аелемент %1 %3 ала ", "DATA_ITEMOFLIST": "аелемент %1 %2 аҟынтәи ", "DATA_LENGTHOFLIST": "%1 аура", "DATA_LISTCONTAINSITEM": "%1 иаҵанакуама %2?", "DATA_SHOWLIST": "иаарԥштәуп ахьӡынҵа %1", "DATA_HIDELIST": "иҵәахтәуп ахьӡынҵа %1", "DATA_INDEX_ALL": "зегьы", "DATA_INDEX_LAST": "аҵыхәтәантәи", "DATA_INDEX_RANDOM": "иарбанзаалакь", "EVENT_WHENFLAGCLICKED": "%1 ҳанақәыӷәӷәалакь", "EVENT_WHENTHISSPRITECLICKED": "анагӡаҩ ҳаниқәыӷәӷәалакь", "EVENT_WHENSTAGECLICKED": "асцена ҳанақәыӷәӷәалакь", "EVENT_WHENTOUCHINGOBJECT": "when this sprite touches %1", "EVENT_WHENBROADCASTRECEIVED": " %1 аус арура", "EVENT_WHENBACKDROPSWITCHESTO": "аҿаԥшыра %1 ала аҽанаԥсахуа ", "EVENT_WHENGREATERTHAN": "%1 > %2 акәзар", "EVENT_WHENGREATERTHAN_TIMER": "аамҭарбага", "EVENT_BROADCAST": "ишьҭтәуп %1 ", "EVENT_BROADCASTANDWAIT": "ишьҭтәуп %1 нас иԥштәуп", "EVENT_WHENKEYPRESSED": "аклавиша %1 ҳанақәыӷәӷәалакь", "EVENT_WHENKEYPRESSED_SPACE": "абжьажьга", "EVENT_WHENKEYPRESSED_LEFT": "ахыц арӷьарахь", "EVENT_WHENKEYPRESSED_RIGHT": "ахыц армарахь", "EVENT_WHENKEYPRESSED_DOWN": "ахыц алада", "EVENT_WHENKEYPRESSED_UP": "ахыц аҩада", "EVENT_WHENKEYPRESSED_ANY": "иарбанзаалакь", "LOOKS_SAYFORSECS": "иҳәалатәуп %1 %2 секундк ", "LOOKS_SAY": "иҳәатәуп %1 ", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "ахәыцра %1 %2 секундк ", "LOOKS_THINK": "ахәыцра %1 ", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "ацәырҵра", "LOOKS_HIDE": "аҽыҵәахра", "LOOKS_HIDEALLSPRITES": "иҵәахтәуп анагӡаҩцәа зегьы", "LOOKS_EFFECT_COLOR": "аԥштәы", "LOOKS_EFFECT_FISHEYE": "аԥсыӡ аблақәа", "LOOKS_EFFECT_WHIRL": "акьаҳәхара", "LOOKS_EFFECT_PIXELATE": "апиксельқәа рырдура", "LOOKS_EFFECT_MOSAIC": "амозаика", "LOOKS_EFFECT_BRIGHTNESS": "ажжара", "LOOKS_EFFECT_GHOST": "алаԥшҵашәара", "LOOKS_CHANGEEFFECTBY": "иԥсахтәуп %1 аеффект %2 ала ", "LOOKS_SETEFFECTTO": "иқәыргылатәуп аеффект %1 %2 аҟны ", "LOOKS_CLEARGRAPHICEFFECTS": "иқәгатәуп аграфикатә еффектқәа", "LOOKS_CHANGESIZEBY": "иԥсахтәуп ашәагаа %1 ала", "LOOKS_SETSIZETO": "иқәыргылатәуп ашәагаа %1 % ", "LOOKS_SIZE": "ашәагаа", "LOOKS_CHANGESTRETCHBY": "change stretch by %1", "LOOKS_SETSTRETCHTO": "set stretch to %1 %", "LOOKS_SWITCHCOSTUMETO": "иԥсахтәуп акостиум %1 ала", "LOOKS_NEXTCOSTUME": "анаҩстәи акостиум", "LOOKS_SWITCHBACKDROPTO": "иԥсахтәуп аҿаԥшыра %1 ала", "LOOKS_GOTOFRONTBACK": "ииастәуп %1 ҿыгҳарак ала ", "LOOKS_GOTOFRONTBACK_FRONT": "front", "LOOKS_GOTOFRONTBACK_BACK": "шьҭахьҟа", "LOOKS_GOFORWARDBACKWARDLAYERS": "go %1 %2 layers", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ԥхьаҟа", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "шьҭахьҟа", "LOOKS_BACKDROPNUMBERNAME": "аҿаԥшыра %1 ", "LOOKS_COSTUMENUMBERNAME": "акостиум %1", "LOOKS_NUMBERNAME_NUMBER": "аномер", "LOOKS_NUMBERNAME_NAME": "ахьӡ", "LOOKS_SWITCHBACKDROPTOANDWAIT": "иԥсахтәуп аҿаԥшыра %1 ала нас иԥштәуп ", "LOOKS_NEXTBACKDROP": "анаҩстәи аҿаԥшыра", "LOOKS_PREVIOUSBACKDROP": "уаанӡатәи аҿаҧшыра", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "ицатәуп %1 шьаҿак", "MOTION_TURNLEFT": "иргьежьтәуп %1 %2 градус рыла ", "MOTION_TURNRIGHT": "иргьежьтәуп %1 %2 градус рыла ", "MOTION_POINTINDIRECTION": "инарҳәтәуп %1 ", "MOTION_POINTTOWARDS": "%1 ахь инаҳәтәуп", "MOTION_POINTTOWARDS_POINTER": "аҳәынаԥ арбага", "MOTION_GOTO": "ииастәуп %1 ахь", "MOTION_GOTO_POINTER": "аҳәынаԥ арбага", "MOTION_GOTO_RANDOM": "иарбанзаалакь апозициа", "MOTION_GOTOXY": "ииастәуп x: %1 y: %2 ахь ", "MOTION_GLIDESECSTOXY": "иқәҵәраатәуп x: %2 y: %3 ахь %1 секундк ", "MOTION_GLIDETO": "иқәҵәраатәуп %2 ахь %1 секундк ", "MOTION_GLIDETO_POINTER": "аҳәынаԥ арбага", "MOTION_GLIDETO_RANDOM": "иарбанзаалакь апозициа", "MOTION_CHANGEXBY": "иԥсахтәуп x %1 ала ", "MOTION_SETX": "иқәыргылатәуп x %1 аҟны ", "MOTION_CHANGEYBY": "иԥсахтәуп y %1 ала ", "MOTION_SETY": "иқәыргылатәуп y %1 аҟны ", "MOTION_IFONEDGEBOUNCE": "акьыԥшь акәзар, иадԥатәуп", "MOTION_SETROTATIONSTYLE": "аргьежьра астиль %1 ", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "армарахьтә-арӷьарахь", "MOTION_SETROTATIONSTYLE_DONTROTATE": "иргьежьтәӡам", "MOTION_SETROTATIONSTYLE_ALLAROUND": "акәша-мыкәша", "MOTION_XPOSITION": "x аҭыԥ", "MOTION_YPOSITION": "y аҭыԥ", "MOTION_DIRECTION": "ахырхарҭа", "MOTION_SCROLLRIGHT": "scroll right %1", "MOTION_SCROLLUP": "scroll up %1", "MOTION_ALIGNSCENE": "align scene %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "bottom-left", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "bottom-right", "MOTION_ALIGNSCENE_MIDDLE": "ибжьаратәу", "MOTION_ALIGNSCENE_TOPLEFT": "top-left", "MOTION_ALIGNSCENE_TOPRIGHT": "top-right", "MOTION_XSCROLL": "x scroll", "MOTION_YSCROLL": "y scroll", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "иарбанзаалакь %1 -и %2 -и рыбжьара ", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 - еи %2 - еи", "OPERATORS_OR": "%1 ма %2", "OPERATORS_NOT": "%1 акәӡам", "OPERATORS_JOIN": "еиԥшьтәуп %1 %2 ", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "асимвол %1 %2 аҟны", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "%1 аура", "OPERATORS_CONTAINS": "%1 иаҵанакуама %2?", "OPERATORS_MOD": "%1 mod %2", "OPERATORS_ROUND": "ихаргьежьтәуп %1 ", "OPERATORS_MATHOP": "%1 %2 аҟынтәи", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "еиҵоу еибгоу", "OPERATORS_MATHOP_CEILING": "еиҳау еибгоу", "OPERATORS_MATHOP_SQRT": "sqrt", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "define %1", "SENSING_TOUCHINGOBJECT": "иадкьыслома %1? ", "SENSING_TOUCHINGOBJECT_POINTER": "аҳәынаԥ арбага", "SENSING_TOUCHINGOBJECT_EDGE": "акьыԥшь", "SENSING_TOUCHINGCOLOR": "иадкьыслома аԥштәы %1? ", "SENSING_COLORISTOUCHINGCOLOR": "аԥштәы %1 иадкьыслома %2? ", "SENSING_DISTANCETO": "%1 аҟынӡа ибжьоу", "SENSING_DISTANCETO_POINTER": "аҳәынаԥ арбага", "SENSING_ASKANDWAIT": "иазҵаатәуп %1 нас иԥштәуп ", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "аҭак", "SENSING_KEYPRESSED": "аклавиша %1 иақәыӷәӷәома? ", "SENSING_MOUSEDOWN": "аҳәынаԥ иақәыӷәӷәома?", "SENSING_MOUSEX": "аҳәынаԥ x ала", "SENSING_MOUSEY": "аҳәынаԥ y ала", "SENSING_SETDRAGMODE": "иқәыргылатәуп аиагара арежим %1 ", "SENSING_SETDRAGMODE_DRAGGABLE": "ииаугар зуа", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "аиагара зымуа", "SENSING_LOUDNESS": "абжьы адура", "SENSING_LOUD": "loud?", "SENSING_TIMER": "аамҭарбага", "SENSING_RESETTIMER": "аамҭарбага ҿыц адәықәҵара", "SENSING_OF": "%1 %2", "SENSING_OF_XPOSITION": "x аҭыԥ", "SENSING_OF_YPOSITION": "y аҭыԥ", "SENSING_OF_DIRECTION": "ахырхарҭа", "SENSING_OF_COSTUMENUMBER": "акостиум №", "SENSING_OF_COSTUMENAME": "акостиум ахьӡ", "SENSING_OF_SIZE": "ашәагаа", "SENSING_OF_VOLUME": "абжьы адура", "SENSING_OF_BACKDROPNUMBER": "аҿаԥшыра №", "SENSING_OF_BACKDROPNAME": "аҿаԥшыра ахьӡ", "SENSING_OF_STAGE": "Асцена", "SENSING_CURRENT": "уажәтәи %1 ", "SENSING_CURRENT_YEAR": "ашықәс", "SENSING_CURRENT_MONTH": "амза", "SENSING_CURRENT_DATE": "арыцхә", "SENSING_CURRENT_DAYOFWEEK": "амчыбжь амш", "SENSING_CURRENT_HOUR": "асааҭ", "SENSING_CURRENT_MINUTE": "аминуҭ", "SENSING_CURRENT_SECOND": "асекунд", "SENSING_DAYSSINCE2000": "амшқәа 01.01.2000 инаркны ", "SENSING_USERNAME": "алахәылаҩ ихьӡ", "SENSING_USERID": "Ахархәаҩ ID", "SOUND_PLAY": "иргатәуп абжьы %1 ", "SOUND_PLAYUNTILDONE": "иргатәуп абжьы %1 инҵәаанӡа ", "SOUND_STOPALLSOUNDS": "иаанкылатәуп абжьқәа зегьы", "SOUND_SETEFFECTO": "иқәыргылатәуп %1 аеффект %2 аҟны ", "SOUND_CHANGEEFFECTBY": "иԥсахтәуп %1 аеффект %2 ала ", "SOUND_CLEAREFFECTS": "иқәгатәуп абжьы аеффектқәа", "SOUND_EFFECTS_PITCH": "pitch", "SOUND_EFFECTS_PAN": "pan left/right", "SOUND_CHANGEVOLUMEBY": "иԥсахтәуп абжьы %1 ала ", "SOUND_SETVOLUMETO": "иқәыргылатәуп абжьы адура %1%", "SOUND_VOLUME": "абжьы адура", "CATEGORY_MOTION": "Аиҭаҵра", "CATEGORY_LOOKS": "Аԥшра-асахьа", "CATEGORY_SOUND": "Абжьы", "CATEGORY_EVENTS": "Ахҭысқәа", "CATEGORY_CONTROL": "Аконтроль", "CATEGORY_SENSING": "Асенсорқәа", "CATEGORY_OPERATORS": "Аоператорқәа", "CATEGORY_VARIABLES": "Аҽеиҭакқәа", "CATEGORY_MYBLOCKS": "Сара сблокқәа", "DUPLICATE": "Адубликат", "DELETE": "Ианыхтәуп", "ADD_COMMENT": "Иацҵатәуп акомментари", "REMOVE_COMMENT": "Ианыхтәуп акомментари", "DELETE_BLOCK": "Ианыхтәуп аблок", "DELETE_X_BLOCKS": "Ианыхтәуп %1 блокк ", "DELETE_ALL_BLOCKS": "Ианыхтәума аблокқәа %1 зегьы?", "CLEAN_UP": "Clean up Blocks", "HELP": "Ацхыраара", "UNDO": "Иаҟәыхтәуп", "REDO": "Ирхынҳәтәуп", "EDIT_PROCEDURE": "Ариашара", "SHOW_PROCEDURE_DEFINITION": "Go to definition", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Иҳәатәуп џьара акы...", "COLOUR_HUE_LABEL": "Аԥштәы", "COLOUR_SATURATION_LABEL": "Аԥштәылгазаара", "COLOUR_BRIGHTNESS_LABEL": "Ажжара", "CHANGE_VALUE_TITLE": "Change value:", "RENAME_VARIABLE": "Аҽеиҭак ахьӡ ԥсахтәуп", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Аҽеиҭак ахьӡ ԥсахтәуп", "NEW_VARIABLE": "Иаԥҵатәуп аҽеиҭак", "NEW_VARIABLE_TITLE": "Аҽеиҭак ахьӡ ҿыц:", "VARIABLE_MODAL_TITLE": "Аҽеиҭак ҿыц", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Иаԥҵатәуп аблок", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Ахьӡынҵа аԥҵара", "NEW_LIST_TITLE": "Ахьӡынҵа ахьӡ ҿыц:", "LIST_MODAL_TITLE": "Ахьӡынҵа ҿыц", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Ахьӡынҵа ахьӡ ԥсахтәуп", "NEW_BROADCAST_MESSAGE": "Ацҳамҭа ҿыц", "NEW_BROADCAST_MESSAGE_TITLE": "Ацҳамҭа ҿыц ахьӡ:", "BROADCAST_MODAL_TITLE": "Ацҳамҭа ҿыц", "DEFAULT_BROADCAST_MESSAGE_NAME": "ацҳамҭа1" }; Blockly.ScratchMsgs.locales["ca"] = { "CONTROL_FOREVER": "per sempre", "CONTROL_REPEAT": "repeteix %1", "CONTROL_IF": "si %1 llavors", "CONTROL_ELSE": "si no", "CONTROL_STOP": "atura", "CONTROL_STOP_ALL": "tot", "CONTROL_STOP_THIS": "aquest programa", "CONTROL_STOP_OTHER": "altres programes del personatge", "CONTROL_WAIT": "espera %1 segons", "CONTROL_WAITUNTIL": "espera fins %1", "CONTROL_REPEATUNTIL": "repeteix fins %1", "CONTROL_WHILE": "mentre %1", "CONTROL_FOREACH": "per cada %1 a %2", "CONTROL_STARTASCLONE": "quan una còpia meva comenci", "CONTROL_CREATECLONEOF": "crea una còpia de %1", "CONTROL_CREATECLONEOF_MYSELF": "jo mateix", "CONTROL_DELETETHISCLONE": "esborra aquesta còpia", "CONTROL_COUNTER": "comptador", "CONTROL_INCRCOUNTER": "augmenta comptador", "CONTROL_CLEARCOUNTER": "neteja comptador", "CONTROL_ALLATONCE": "tot d'una vegada", "DATA_SETVARIABLETO": "assigna a %1 el valor %2", "DATA_CHANGEVARIABLEBY": "augmenta %1 en %2", "DATA_SHOWVARIABLE": "mostra la variable %1", "DATA_HIDEVARIABLE": "amaga la variable %1", "DATA_ADDTOLIST": "afegeix %1 a %2", "DATA_DELETEOFLIST": "esborra l'element %1 de %2", "DATA_INSERTATLIST": "afegeix %1 a la posició %2 de %3", "DATA_REPLACEITEMOFLIST": "canvia l'element %1 de %2 per %3", "DATA_ITEMOFLIST": "element %1 de %2", "DATA_LENGTHOFLIST": "llargada de %1", "DATA_LISTCONTAINSITEM": "%1 conté %2?", "DATA_SHOWLIST": "mostra la llista %1", "DATA_HIDELIST": "amaga la llista %1", "DATA_INDEX_ALL": "tot", "DATA_INDEX_LAST": "darrer", "DATA_INDEX_RANDOM": "aleatori", "EVENT_WHENFLAGCLICKED": "quan %1 es premi", "EVENT_WHENTHISSPRITECLICKED": "quan es cliqui aquest personatge", "EVENT_WHENSTAGECLICKED": "quan es cliqui l'escenari", "EVENT_WHENTOUCHINGOBJECT": "quan aquest objecte toqui %1", "EVENT_WHENBROADCASTRECEIVED": "quan rebi %1", "EVENT_WHENBACKDROPSWITCHESTO": "quan l'escenari canviï al fons %1", "EVENT_WHENGREATERTHAN": "quan %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "cronòmetre", "EVENT_BROADCAST": "envia a tots %1", "EVENT_BROADCASTANDWAIT": "envia a tots %1 i espera", "EVENT_WHENKEYPRESSED": "quan la tecla %1 es premi", "EVENT_WHENKEYPRESSED_SPACE": "espai", "EVENT_WHENKEYPRESSED_LEFT": "fletxa esquerra", "EVENT_WHENKEYPRESSED_RIGHT": "fletxa dreta", "EVENT_WHENKEYPRESSED_DOWN": "fletxa avall", "EVENT_WHENKEYPRESSED_UP": "fletxa amunt", "EVENT_WHENKEYPRESSED_ANY": "qualsevol", "LOOKS_SAYFORSECS": "digues %1 durant %2 segons", "LOOKS_SAY": "digues %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "pensa %1 durant %2 segons", "LOOKS_THINK": "pensa %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "mostra't", "LOOKS_HIDE": "amaga't", "LOOKS_HIDEALLSPRITES": "Amagar tots els personatges", "LOOKS_EFFECT_COLOR": "color", "LOOKS_EFFECT_FISHEYE": "ull de peix", "LOOKS_EFFECT_WHIRL": "girar", "LOOKS_EFFECT_PIXELATE": "pixelar", "LOOKS_EFFECT_MOSAIC": "mosaic", "LOOKS_EFFECT_BRIGHTNESS": "brillantor", "LOOKS_EFFECT_GHOST": "transparència", "LOOKS_CHANGEEFFECTBY": "augmenta l'efecte %1 en %2", "LOOKS_SETEFFECTTO": "fixa l'efecte %1 a %2", "LOOKS_CLEARGRAPHICEFFECTS": "treu els efectes gràfics", "LOOKS_CHANGESIZEBY": "augmenta %1 la mida", "LOOKS_SETSIZETO": "fixa la mida a %1 %", "LOOKS_SIZE": "mida", "LOOKS_CHANGESTRETCHBY": "augmenta %1 l'estirament", "LOOKS_SETSTRETCHTO": "fixa l'estirament a %1 %", "LOOKS_SWITCHCOSTUMETO": "canvia el vestit a %1", "LOOKS_NEXTCOSTUME": "següent vestit", "LOOKS_SWITCHBACKDROPTO": "canvia el fons a %1", "LOOKS_GOTOFRONTBACK": "vés a la capa %1", "LOOKS_GOTOFRONTBACK_FRONT": "front", "LOOKS_GOTOFRONTBACK_BACK": "darrere", "LOOKS_GOFORWARDBACKWARDLAYERS": "vés %1 %2 capes", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "endavant", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "enrere", "LOOKS_BACKDROPNUMBERNAME": "fons %1", "LOOKS_COSTUMENUMBERNAME": "vestit %1", "LOOKS_NUMBERNAME_NUMBER": "nombre", "LOOKS_NUMBERNAME_NAME": "nom", "LOOKS_SWITCHBACKDROPTOANDWAIT": "canvia el fons a %1 i espera", "LOOKS_NEXTBACKDROP": "següent fons de pantalla", "LOOKS_PREVIOUSBACKDROP": "fons anterior", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "mou-te %1 passos", "MOTION_TURNLEFT": "gira %1 %2 graus", "MOTION_TURNRIGHT": "gira %1 %2 graus", "MOTION_POINTINDIRECTION": "apunta en direcció %1", "MOTION_POINTTOWARDS": "apunta cap a %1", "MOTION_POINTTOWARDS_POINTER": "punter del ratolí", "MOTION_GOTO": "vés a %1", "MOTION_GOTO_POINTER": "punter del ratolí", "MOTION_GOTO_RANDOM": "posició aleatòria", "MOTION_GOTOXY": "vés a x: %1 y: %2", "MOTION_GLIDESECSTOXY": "llisca en %1 segons fins a x: %2 y: %3", "MOTION_GLIDETO": "llisca en %1 segons fins a %2", "MOTION_GLIDETO_POINTER": "punter del ratolí", "MOTION_GLIDETO_RANDOM": "posició aleatòria", "MOTION_CHANGEXBY": "suma %1 a x", "MOTION_SETX": "assigna el valor %1 a x", "MOTION_CHANGEYBY": "suma %1 a y", "MOTION_SETY": "assigna el valor %1 a y", "MOTION_IFONEDGEBOUNCE": "rebota en tocar una vora", "MOTION_SETROTATIONSTYLE": "fixa el tipus de rotació %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "esquerra-dreta", "MOTION_SETROTATIONSTYLE_DONTROTATE": "no giris", "MOTION_SETROTATIONSTYLE_ALLAROUND": "al voltant", "MOTION_XPOSITION": "posició x", "MOTION_YPOSITION": "posició y", "MOTION_DIRECTION": "direcció", "MOTION_SCROLLRIGHT": "desplaça a la dreta %1", "MOTION_SCROLLUP": "desplaça amunt %1", "MOTION_ALIGNSCENE": "alinea centre %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "Inferior - Esquerre", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "Inferior - Dret", "MOTION_ALIGNSCENE_MIDDLE": "Centre", "MOTION_ALIGNSCENE_TOPLEFT": "Superior - Esquerre", "MOTION_ALIGNSCENE_TOPRIGHT": "Superior - Dret", "MOTION_XSCROLL": "Coordenada X", "MOTION_YSCROLL": "Coordenada Y", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "nombre a l'atzar entre %1 i %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 i %2", "OPERATORS_OR": "%1 o %2", "OPERATORS_NOT": "no %1", "OPERATORS_JOIN": "uneix %1 i %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "lletra %1 de %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "llargada de %1", "OPERATORS_CONTAINS": "%1 conté %2?", "OPERATORS_MOD": "residu de dividir %1 entre %2", "OPERATORS_ROUND": "arrodoneix %1", "OPERATORS_MATHOP": "%1 de %2", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "part sencera", "OPERATORS_MATHOP_CEILING": "sostre", "OPERATORS_MATHOP_SQRT": "arrel quadrada", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "defineix %1", "SENSING_TOUCHINGOBJECT": "tocant %1?", "SENSING_TOUCHINGOBJECT_POINTER": "punter del ratolí", "SENSING_TOUCHINGOBJECT_EDGE": "vora", "SENSING_TOUCHINGCOLOR": "tocant el color %1?", "SENSING_COLORISTOUCHINGCOLOR": "color %1 sobre %2?", "SENSING_DISTANCETO": "distància a %1", "SENSING_DISTANCETO_POINTER": "punter del ratolí", "SENSING_ASKANDWAIT": "pregunta %1 i espera", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "resposta", "SENSING_KEYPRESSED": "tecla %1 premuda?", "SENSING_MOUSEDOWN": "ratolí clicat?", "SENSING_MOUSEX": "ratolí x", "SENSING_MOUSEY": "ratolí y", "SENSING_SETDRAGMODE": "fixa el mode arrossega %1", "SENSING_SETDRAGMODE_DRAGGABLE": "arrossegadís", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "no arrossegadís", "SENSING_LOUDNESS": "volum del so", "SENSING_LOUD": "so fort?", "SENSING_TIMER": "cronòmetre", "SENSING_RESETTIMER": "reinicia el cronòmetre", "SENSING_OF": "%1 de %2", "SENSING_OF_XPOSITION": "posició x", "SENSING_OF_YPOSITION": "posició y", "SENSING_OF_DIRECTION": "direcció", "SENSING_OF_COSTUMENUMBER": "vestit nr", "SENSING_OF_COSTUMENAME": "nom del vestit", "SENSING_OF_SIZE": "mida", "SENSING_OF_VOLUME": "volum", "SENSING_OF_BACKDROPNUMBER": "fons nr", "SENSING_OF_BACKDROPNAME": "nom del fons", "SENSING_OF_STAGE": "Escenari", "SENSING_CURRENT": "actual %1", "SENSING_CURRENT_YEAR": "any", "SENSING_CURRENT_MONTH": "mes", "SENSING_CURRENT_DATE": "data", "SENSING_CURRENT_DAYOFWEEK": "dia de la setmana", "SENSING_CURRENT_HOUR": "hora", "SENSING_CURRENT_MINUTE": "minut", "SENSING_CURRENT_SECOND": "segon", "SENSING_DAYSSINCE2000": "dies des del 2000", "SENSING_USERNAME": "nom d'usuari", "SENSING_USERID": "Id. usuari", "SOUND_PLAY": "inicia el so %1", "SOUND_PLAYUNTILDONE": "toca el so %1 fins que acabi", "SOUND_STOPALLSOUNDS": "atura tots els sons", "SOUND_SETEFFECTO": "fixa l'efecte %1 a %2", "SOUND_CHANGEEFFECTBY": "augmenta l'efecte %1 en %2", "SOUND_CLEAREFFECTS": "treu els efectes sonors", "SOUND_EFFECTS_PITCH": "altura tonal", "SOUND_EFFECTS_PAN": "panoramització esquerra/dreta", "SOUND_CHANGEVOLUMEBY": "puja %1 el volum", "SOUND_SETVOLUMETO": "fixa el volum a %1%", "SOUND_VOLUME": "volum", "CATEGORY_MOTION": "Moviment", "CATEGORY_LOOKS": "Aspecte", "CATEGORY_SOUND": "So", "CATEGORY_EVENTS": "Esdeveniments", "CATEGORY_CONTROL": "Control", "CATEGORY_SENSING": "Sensors", "CATEGORY_OPERATORS": "Operadors", "CATEGORY_VARIABLES": "Variables", "CATEGORY_MYBLOCKS": "Els meus blocs", "DUPLICATE": "Duplica", "DELETE": "Elimina", "ADD_COMMENT": "Afegir comentari", "REMOVE_COMMENT": "Eliminar comentari", "DELETE_BLOCK": "Eliminar bloc", "DELETE_X_BLOCKS": "Eliminar %1 blocs", "DELETE_ALL_BLOCKS": "Eliminar tots els blocs %1 ?", "CLEAN_UP": "Netejar blocs", "HELP": "Ajuda", "UNDO": "Desfer", "REDO": "Refer / Tornar a fer", "EDIT_PROCEDURE": "Edita", "SHOW_PROCEDURE_DEFINITION": "Anar a la definició", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Dir alguna cosa...", "COLOUR_HUE_LABEL": "Color", "COLOUR_SATURATION_LABEL": "Saturació", "COLOUR_BRIGHTNESS_LABEL": "Lluminositat", "CHANGE_VALUE_TITLE": "Canviar el valor :", "RENAME_VARIABLE": "Canviar el nom de la variable", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Canviar el nom de la variable", "NEW_VARIABLE": "Crea una variable", "NEW_VARIABLE_TITLE": "Nou nom de variable :", "VARIABLE_MODAL_TITLE": "Nova Variable", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Crea un bloc", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Crea una llista", "NEW_LIST_TITLE": "Nou nom per la Llista :", "LIST_MODAL_TITLE": "Nova Llista", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Canviar el nom de la Llista", "NEW_BROADCAST_MESSAGE": "Nou missatge", "NEW_BROADCAST_MESSAGE_TITLE": "Nou nom pel missatge :", "BROADCAST_MODAL_TITLE": "Missatge nou", "DEFAULT_BROADCAST_MESSAGE_NAME": "missatge1" }; Blockly.ScratchMsgs.locales["cs"] = { "CONTROL_FOREVER": "opakuj stále", "CONTROL_REPEAT": "opakuj %1 krát", "CONTROL_IF": "když %1 tak", "CONTROL_ELSE": "jinak", "CONTROL_STOP": "zastav", "CONTROL_STOP_ALL": "všechno", "CONTROL_STOP_THIS": "tento scénář", "CONTROL_STOP_OTHER": "jiné scénáře postavy", "CONTROL_WAIT": "čekej %1 sekund", "CONTROL_WAITUNTIL": "čekej dokud nenastane %1", "CONTROL_REPEATUNTIL": "opakuj dokud nenastane %1", "CONTROL_WHILE": "opakuj dokud platí %1", "CONTROL_FOREACH": "pro každé %1 z %2", "CONTROL_STARTASCLONE": "když startuje můj klon", "CONTROL_CREATECLONEOF": "klonuj %1", "CONTROL_CREATECLONEOF_MYSELF": "sebe", "CONTROL_DELETETHISCLONE": "zruš tento klon", "CONTROL_COUNTER": "čítač", "CONTROL_INCRCOUNTER": "zvyš čítač", "CONTROL_CLEARCOUNTER": "vynuluj čítač", "CONTROL_ALLATONCE": "vše najednou", "DATA_SETVARIABLETO": "nastav %1 na %2", "DATA_CHANGEVARIABLEBY": "změň %1 o %2", "DATA_SHOWVARIABLE": "ukaž proměnnou %1", "DATA_HIDEVARIABLE": "skryj proměnnou %1", "DATA_ADDTOLIST": "přidej %1 k %2", "DATA_DELETEOFLIST": "smaž %1 z %2", "DATA_INSERTATLIST": "vlož %1 na %2 v %3", "DATA_REPLACEITEMOFLIST": "nahraď %1 v %2 hodnotou %3", "DATA_ITEMOFLIST": "prvek %1 z %2", "DATA_LENGTHOFLIST": "délka %1", "DATA_LISTCONTAINSITEM": "%1 obsahuje %2", "DATA_SHOWLIST": "ukaž seznam %1", "DATA_HIDELIST": "skryj seznam %1", "DATA_INDEX_ALL": "všechno", "DATA_INDEX_LAST": "poslední", "DATA_INDEX_RANDOM": "náhodně", "EVENT_WHENFLAGCLICKED": "po kliknutí na %1", "EVENT_WHENTHISSPRITECLICKED": "po kliknutí na mě", "EVENT_WHENSTAGECLICKED": "po kliknutí na scénu", "EVENT_WHENTOUCHINGOBJECT": "po doteku %1", "EVENT_WHENBROADCASTRECEIVED": "po obdržení zprávy %1", "EVENT_WHENBACKDROPSWITCHESTO": "po změně pozadí na %1", "EVENT_WHENGREATERTHAN": "když %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "stopky", "EVENT_BROADCAST": "vyšli zprávu %1", "EVENT_BROADCASTANDWAIT": "vyšli zprávu %1 a čekej", "EVENT_WHENKEYPRESSED": "po stisku klávesy %1", "EVENT_WHENKEYPRESSED_SPACE": "mezerník", "EVENT_WHENKEYPRESSED_LEFT": "šipka vlevo", "EVENT_WHENKEYPRESSED_RIGHT": "šipka vpravo", "EVENT_WHENKEYPRESSED_DOWN": "šipka dolů", "EVENT_WHENKEYPRESSED_UP": "šipka nahoru", "EVENT_WHENKEYPRESSED_ANY": "libovolná", "LOOKS_SAYFORSECS": "bublina %1 %2 sekund", "LOOKS_SAY": "bublina %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "myšlenka %1 %2 sekund", "LOOKS_THINK": "myšlenka %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "ukaž se", "LOOKS_HIDE": "skryj se", "LOOKS_HIDEALLSPRITES": "skryj všechny postavy", "LOOKS_EFFECT_COLOR": "barva", "LOOKS_EFFECT_FISHEYE": "rybí oko", "LOOKS_EFFECT_WHIRL": "víření", "LOOKS_EFFECT_PIXELATE": "kostičkování", "LOOKS_EFFECT_MOSAIC": "mozaika", "LOOKS_EFFECT_BRIGHTNESS": "jas", "LOOKS_EFFECT_GHOST": "průhlednost", "LOOKS_CHANGEEFFECTBY": "změň efekt %1 o %2", "LOOKS_SETEFFECTTO": "nastav efekt %1 na %2", "LOOKS_CLEARGRAPHICEFFECTS": "zruš grafické efekty", "LOOKS_CHANGESIZEBY": "změň velikost o %1", "LOOKS_SETSIZETO": "nastav velikost na %1 %", "LOOKS_SIZE": "velikost", "LOOKS_CHANGESTRETCHBY": "změň roztažení o %1", "LOOKS_SETSTRETCHTO": "nastav roztažení na %1 %", "LOOKS_SWITCHCOSTUMETO": "změň kostým na %1", "LOOKS_NEXTCOSTUME": "další kostým", "LOOKS_SWITCHBACKDROPTO": "přepni pozadí na %1", "LOOKS_GOTOFRONTBACK": "přejdi na vrstvu %1", "LOOKS_GOTOFRONTBACK_FRONT": "popředí", "LOOKS_GOTOFRONTBACK_BACK": "pozadí", "LOOKS_GOFORWARDBACKWARDLAYERS": "jdi %1 o %2", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "dopředu", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "dozadu", "LOOKS_BACKDROPNUMBERNAME": "pozadí %1", "LOOKS_COSTUMENUMBERNAME": "kostým %1", "LOOKS_NUMBERNAME_NUMBER": "číslo", "LOOKS_NUMBERNAME_NAME": "název", "LOOKS_SWITCHBACKDROPTOANDWAIT": "změň pozadí na %1", "LOOKS_NEXTBACKDROP": "další pozadí", "LOOKS_PREVIOUSBACKDROP": "předchozí pozadí", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "dopředu o %1 kroků", "MOTION_TURNLEFT": "otoč se %1 o %2 stupňů", "MOTION_TURNRIGHT": "otoč se %1 o %2 stupňů", "MOTION_POINTINDIRECTION": "nastav směr %1", "MOTION_POINTTOWARDS": "nastav směr k %1", "MOTION_POINTTOWARDS_POINTER": "ukazateli myši", "MOTION_GOTO": "skoč na %1", "MOTION_GOTO_POINTER": "ukazatel myši", "MOTION_GOTO_RANDOM": "náhodná pozice", "MOTION_GOTOXY": "skoč na x: %1 y: %2", "MOTION_GLIDESECSTOXY": "klouzej %1 sekund na x: %2 y: %3", "MOTION_GLIDETO": "klouzej %1 sekund na %2", "MOTION_GLIDETO_POINTER": "ukazatel myši", "MOTION_GLIDETO_RANDOM": "náhodná pozice", "MOTION_CHANGEXBY": "změň x o %1", "MOTION_SETX": "nastav x na %1", "MOTION_CHANGEYBY": "změň y o %1", "MOTION_SETY": "nastav y na %1", "MOTION_IFONEDGEBOUNCE": "když narazíš na okraj, odraž se", "MOTION_SETROTATIONSTYLE": "nastav otáčení %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "vlevo-vpravo", "MOTION_SETROTATIONSTYLE_DONTROTATE": "neotáčet", "MOTION_SETROTATIONSTYLE_ALLAROUND": "dokola", "MOTION_XPOSITION": "x", "MOTION_YPOSITION": "y", "MOTION_DIRECTION": "směr", "MOTION_SCROLLRIGHT": "posuň se doprava %1", "MOTION_SCROLLUP": "posuň se nahoru %1", "MOTION_ALIGNSCENE": "zarovnej scénu %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "vlevo dole", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "vpravo dole", "MOTION_ALIGNSCENE_MIDDLE": "prostřední", "MOTION_ALIGNSCENE_TOPLEFT": "vlevo nahoře", "MOTION_ALIGNSCENE_TOPRIGHT": "vpravo nahoře", "MOTION_XSCROLL": "x přesouvání", "MOTION_YSCROLL": "y přesouvání", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "náhodné číslo od %1 do %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 a %2", "OPERATORS_OR": "%1 nebo %2", "OPERATORS_NOT": "ne %1", "OPERATORS_JOIN": "spoj %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "písmeno %1 z %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "délka %1", "OPERATORS_CONTAINS": "%1 obsahuje %2?", "OPERATORS_MOD": "zbytek %1 děleno %2", "OPERATORS_ROUND": "zaokrouhli %1", "OPERATORS_MATHOP": "%1 %2", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "zaokr. dolů", "OPERATORS_MATHOP_CEILING": "zaokr. nahoru", "OPERATORS_MATHOP_SQRT": "odmocnina", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tg", "OPERATORS_MATHOP_ASIN": "arcsin", "OPERATORS_MATHOP_ACOS": "arccos", "OPERATORS_MATHOP_ATAN": "arctg", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "scénář pro %1", "SENSING_TOUCHINGOBJECT": "dotýkáš se %1?", "SENSING_TOUCHINGOBJECT_POINTER": "ukazatele myši", "SENSING_TOUCHINGOBJECT_EDGE": "okraje", "SENSING_TOUCHINGCOLOR": "dotýkáš se barvy %1?", "SENSING_COLORISTOUCHINGCOLOR": "barvou %1 se dotýkáš %2?", "SENSING_DISTANCETO": "vzdálenost k %1", "SENSING_DISTANCETO_POINTER": "ukazateli myši", "SENSING_ASKANDWAIT": "otázka %1", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "odpověď", "SENSING_KEYPRESSED": "klávesa %1 stisknuta?", "SENSING_MOUSEDOWN": "myš stisknuta?", "SENSING_MOUSEX": "x myši", "SENSING_MOUSEY": "y myši", "SENSING_SETDRAGMODE": "povoleno přesouvat %1", "SENSING_SETDRAGMODE_DRAGGABLE": "ano", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "ne", "SENSING_LOUDNESS": "hlasitost", "SENSING_LOUD": "hlasité?", "SENSING_TIMER": "stopky", "SENSING_RESETTIMER": "vynuluj stopky", "SENSING_OF": "%1 z %2", "SENSING_OF_XPOSITION": "x", "SENSING_OF_YPOSITION": "y", "SENSING_OF_DIRECTION": "směr", "SENSING_OF_COSTUMENUMBER": "číslo kostýmu", "SENSING_OF_COSTUMENAME": "název kostýmu", "SENSING_OF_SIZE": "velikost", "SENSING_OF_VOLUME": "hlasitost", "SENSING_OF_BACKDROPNUMBER": "číslo pozadí", "SENSING_OF_BACKDROPNAME": "název pozadí", "SENSING_OF_STAGE": "Scéna", "SENSING_CURRENT": "aktuální %1", "SENSING_CURRENT_YEAR": "rok", "SENSING_CURRENT_MONTH": "měsíc", "SENSING_CURRENT_DATE": "den v měsíci", "SENSING_CURRENT_DAYOFWEEK": "den týdne", "SENSING_CURRENT_HOUR": "hodina", "SENSING_CURRENT_MINUTE": "minuta", "SENSING_CURRENT_SECOND": "sekunda", "SENSING_DAYSSINCE2000": "dnů od r. 2000", "SENSING_USERNAME": "jméno uživatele", "SENSING_USERID": "ID uživatele", "SOUND_PLAY": "začni hrát zvuk %1", "SOUND_PLAYUNTILDONE": "přehraj zvuk %1 až do konce", "SOUND_STOPALLSOUNDS": "zastav všechny zvuky", "SOUND_SETEFFECTO": "nastav efekt %1 na %2", "SOUND_CHANGEEFFECTBY": "změň efekt %1 o %2", "SOUND_CLEAREFFECTS": "zruš zvukové efekty", "SOUND_EFFECTS_PITCH": "poloha", "SOUND_EFFECTS_PAN": "stereo vlevo/vpravo", "SOUND_CHANGEVOLUMEBY": "změň hlasitost o %1", "SOUND_SETVOLUMETO": "nastav hlasitost na %1%", "SOUND_VOLUME": "hlasitost", "CATEGORY_MOTION": "Pohyb", "CATEGORY_LOOKS": "Vzhled", "CATEGORY_SOUND": "Zvuk", "CATEGORY_EVENTS": "Události", "CATEGORY_CONTROL": "Ovládání", "CATEGORY_SENSING": "Vnímání", "CATEGORY_OPERATORS": "Operátory", "CATEGORY_VARIABLES": "Proměnné", "CATEGORY_MYBLOCKS": "Moje bloky", "DUPLICATE": "Kopírovat", "DELETE": "Odstranit", "ADD_COMMENT": "Přidat poznámku", "REMOVE_COMMENT": "Odstranit poznámku", "DELETE_BLOCK": "Smaž blok", "DELETE_X_BLOCKS": "Smazat %1 bloků", "DELETE_ALL_BLOCKS": "Smazat všech %1 bloků?", "CLEAN_UP": "Ukliď bloky", "HELP": "Pomoc", "UNDO": "Vrátit", "REDO": "Znovu provést", "EDIT_PROCEDURE": "Upravit", "SHOW_PROCEDURE_DEFINITION": "Jdi ke scénáři", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Řekni něco ...", "COLOUR_HUE_LABEL": "Barva", "COLOUR_SATURATION_LABEL": "Sytost", "COLOUR_BRIGHTNESS_LABEL": "Jas", "CHANGE_VALUE_TITLE": "Změň hodnotu:", "RENAME_VARIABLE": "Přejmenovat proměnnou", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Přejmenovat proměnnou", "NEW_VARIABLE": "Vytvoř proměnnou", "NEW_VARIABLE_TITLE": "Nové jméno proměnné:", "VARIABLE_MODAL_TITLE": "Nová proměnná", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Vytvořit blok", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Vytvoř seznam", "NEW_LIST_TITLE": "Nový název seznamu:", "LIST_MODAL_TITLE": "Nový seznam", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Přejmenuj seznam", "NEW_BROADCAST_MESSAGE": "Nová zpráva", "NEW_BROADCAST_MESSAGE_TITLE": "Nový název zprávy:", "BROADCAST_MODAL_TITLE": "Nová zpráva", "DEFAULT_BROADCAST_MESSAGE_NAME": "zpráva1" }; Blockly.ScratchMsgs.locales["cy"] = { "CONTROL_FOREVER": "am byth", "CONTROL_REPEAT": "ailadrodd %1", "CONTROL_IF": "os %1 yna", "CONTROL_ELSE": "fel arall", "CONTROL_STOP": "aros", "CONTROL_STOP_ALL": "y cyfan", "CONTROL_STOP_THIS": "y sgript hon", "CONTROL_STOP_OTHER": "sgriptiau eraill yn y ciplun", "CONTROL_WAIT": "aros %1 eiliad", "CONTROL_WAITUNTIL": "aros hyd at %1", "CONTROL_REPEATUNTIL": "ailadrodd hyd at %1", "CONTROL_WHILE": "tra bo %1", "CONTROL_FOREACH": "am bob %1 yn %2", "CONTROL_STARTASCLONE": "pan rwyf yn dechrau fel clôn", "CONTROL_CREATECLONEOF": "creu clôn o %1", "CONTROL_CREATECLONEOF_MYSELF": "fi fy hun", "CONTROL_DELETETHISCLONE": "dileu y clôn hwn", "CONTROL_COUNTER": "rhifydd", "CONTROL_INCRCOUNTER": "rhifydd cynyddiad", "CONTROL_CLEARCOUNTER": "clirio'r rhifydd", "CONTROL_ALLATONCE": "pob un ar unwaith", "DATA_SETVARIABLETO": "gosod %1 i %2", "DATA_CHANGEVARIABLEBY": "newid %1 gan %2", "DATA_SHOWVARIABLE": "dangos newidyn %1", "DATA_HIDEVARIABLE": "cuddio newidyn %1", "DATA_ADDTOLIST": "ychwanegu %1 i %2", "DATA_DELETEOFLIST": "dileu %1 o %2", "DATA_INSERTATLIST": "mewnosod %1 yn %2 o %3", "DATA_REPLACEITEMOFLIST": "amnewid eitem %1 o %2 gyda %3", "DATA_ITEMOFLIST": "eitem %1 o %2", "DATA_LENGTHOFLIST": "hyd %1", "DATA_LISTCONTAINSITEM": "%1 yn cynnwys %2?", "DATA_SHOWLIST": "dangos rhestr %1", "DATA_HIDELIST": "cuddio rhestr %1", "DATA_INDEX_ALL": "y cyfan", "DATA_INDEX_LAST": "olaf", "DATA_INDEX_RANDOM": "ar hap", "EVENT_WHENFLAGCLICKED": "pan fydd %1 wedi ei glicio", "EVENT_WHENTHISSPRITECLICKED": "pan gaiff y ciplun yma ei glicio", "EVENT_WHENSTAGECLICKED": "pan fydd llwyfan wedi ei glicio", "EVENT_WHENTOUCHINGOBJECT": "when this sprite touches %1", "EVENT_WHENBROADCASTRECEIVED": "pan rwy'n derbyn %1", "EVENT_WHENBACKDROPSWITCHESTO": "pan fydd cefndir yn newid i %1", "EVENT_WHENGREATERTHAN": "pan %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "amserydd", "EVENT_BROADCAST": "darlledu %1", "EVENT_BROADCASTANDWAIT": "darlledu %1 ac aros", "EVENT_WHENKEYPRESSED": "pan fo bysell %1 wedi ei wasgu", "EVENT_WHENKEYPRESSED_SPACE": "bwlch", "EVENT_WHENKEYPRESSED_LEFT": "saeth chwith", "EVENT_WHENKEYPRESSED_RIGHT": "saeth de", "EVENT_WHENKEYPRESSED_DOWN": "saeth i lawr", "EVENT_WHENKEYPRESSED_UP": "saeth i fyny", "EVENT_WHENKEYPRESSED_ANY": "unrhyw", "LOOKS_SAYFORSECS": "dweud %1 am %2 eiliad", "LOOKS_SAY": "dweud %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "meddwl %1 am %2 eiliad", "LOOKS_THINK": "meddwl %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "dangos", "LOOKS_HIDE": "cuddio", "LOOKS_HIDEALLSPRITES": "cuddio pob ciplun", "LOOKS_EFFECT_COLOR": "lliw", "LOOKS_EFFECT_FISHEYE": "llygaid pysgodyn", "LOOKS_EFFECT_WHIRL": "chwyrliad", "LOOKS_EFFECT_PIXELATE": "picseleiddio", "LOOKS_EFFECT_MOSAIC": "mosaig", "LOOKS_EFFECT_BRIGHTNESS": "disgleirdeb", "LOOKS_EFFECT_GHOST": "ysbryd", "LOOKS_CHANGEEFFECTBY": "newid effaith %1 gan %2", "LOOKS_SETEFFECTTO": "gosod effaith %1 effaith i %2", "LOOKS_CLEARGRAPHICEFFECTS": "clirio effeithiau graffeg", "LOOKS_CHANGESIZEBY": "newid maint gan %1", "LOOKS_SETSIZETO": "gosod maint i %1 %", "LOOKS_SIZE": "maint", "LOOKS_CHANGESTRETCHBY": "newid yr ymestyn gan %1", "LOOKS_SETSTRETCHTO": "gosod ymestyniad gan %1 %", "LOOKS_SWITCHCOSTUMETO": "newid gwisg i %1", "LOOKS_NEXTCOSTUME": "gwisg nesaf", "LOOKS_SWITCHBACKDROPTO": "newid cefndir i %1", "LOOKS_GOTOFRONTBACK": "mynd i haen %1", "LOOKS_GOTOFRONTBACK_FRONT": "blaen", "LOOKS_GOTOFRONTBACK_BACK": "cefn", "LOOKS_GOFORWARDBACKWARDLAYERS": "mynd i haenau %1 %2", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ymlaen", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "nôl", "LOOKS_BACKDROPNUMBERNAME": "cefnlen %1", "LOOKS_COSTUMENUMBERNAME": "gwisg %1", "LOOKS_NUMBERNAME_NUMBER": "rhif", "LOOKS_NUMBERNAME_NAME": "enw", "LOOKS_SWITCHBACKDROPTOANDWAIT": "newid cefnlen i %1 ac aros", "LOOKS_NEXTBACKDROP": "cefnlen nesaf", "LOOKS_PREVIOUSBACKDROP": "cefndir blaenorol", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "symud %1 cam", "MOTION_TURNLEFT": "troi %1 %2 gradd", "MOTION_TURNRIGHT": "troi %1 %2 gradd", "MOTION_POINTINDIRECTION": "pwyntio i gyfeiriad %1", "MOTION_POINTTOWARDS": "pwyntio tuag at %1", "MOTION_POINTTOWARDS_POINTER": "pwyntydd llygoden", "MOTION_GOTO": "mynd i %1", "MOTION_GOTO_POINTER": "pwyntydd llygoden", "MOTION_GOTO_RANDOM": "safle ar hap", "MOTION_GOTOXY": "mynd i x:%1 y: %2", "MOTION_GLIDESECSTOXY": "llithro %1 eiliad i x: %2 y: %3", "MOTION_GLIDETO": "llithro %1 eiliad i %2", "MOTION_GLIDETO_POINTER": "pwyntydd llygoden", "MOTION_GLIDETO_RANDOM": "safle ar hap", "MOTION_CHANGEXBY": "newid x gan %1", "MOTION_SETX": "gosod x i %1", "MOTION_CHANGEYBY": "newid y gan %1", "MOTION_SETY": "gosod y i %1", "MOTION_IFONEDGEBOUNCE": "os ar ymyl, bowndio", "MOTION_SETROTATIONSTYLE": "gosod steil cylchdroi %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "chwith-dde", "MOTION_SETROTATIONSTYLE_DONTROTATE": "peidio troi", "MOTION_SETROTATIONSTYLE_ALLAROUND": "o amgylch", "MOTION_XPOSITION": "safle x", "MOTION_YPOSITION": "safle y", "MOTION_DIRECTION": "cyfeiriad", "MOTION_SCROLLRIGHT": "sgrolio i'r dde %1", "MOTION_SCROLLUP": "sgrolio i fyny %1", "MOTION_ALIGNSCENE": "alinio golygfa %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "gwaelod chwith", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "gwaelod de", "MOTION_ALIGNSCENE_MIDDLE": "canol", "MOTION_ALIGNSCENE_TOPLEFT": "brig chwith", "MOTION_ALIGNSCENE_TOPRIGHT": "brig de", "MOTION_XSCROLL": "sgrolio x", "MOTION_YSCROLL": "sgrolio y", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "dewis ar hap %1 i %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 a %2", "OPERATORS_OR": "%1 neu %2", "OPERATORS_NOT": "nid %1", "OPERATORS_JOIN": "uno %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "llythyren %1 o %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "hyd %1", "OPERATORS_CONTAINS": "%1 yn cynnwys %2?", "OPERATORS_MOD": "%1 mod %2", "OPERATORS_ROUND": "talgrynnu %1", "OPERATORS_MATHOP": "%1 o %2", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "llawr", "OPERATORS_MATHOP_CEILING": "nenfwd", "OPERATORS_MATHOP_SQRT": "ail isradd", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "Yn", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "diffinio %1", "SENSING_TOUCHINGOBJECT": "cyffwrdd %1?", "SENSING_TOUCHINGOBJECT_POINTER": "pwyntydd llygoden", "SENSING_TOUCHINGOBJECT_EDGE": "ymyl", "SENSING_TOUCHINGCOLOR": "cyffwrdd lliw %1?", "SENSING_COLORISTOUCHINGCOLOR": "lliw %1 yn cyffwrdd %2?", "SENSING_DISTANCETO": "pellter i %1", "SENSING_DISTANCETO_POINTER": "pwyntydd llygoden", "SENSING_ASKANDWAIT": "gofyn %1 ac aros", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "ateb", "SENSING_KEYPRESSED": "bysell %1 wedi ei phwyso", "SENSING_MOUSEDOWN": "llygoden i lawr?", "SENSING_MOUSEX": "llygoden x", "SENSING_MOUSEY": "llygoden y", "SENSING_SETDRAGMODE": "gosod y modd llusgo %1", "SENSING_SETDRAGMODE_DRAGGABLE": "llusgadwy", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "anllusgadwy", "SENSING_LOUDNESS": "cryfder sain", "SENSING_LOUD": "sain gref?", "SENSING_TIMER": "amserydd", "SENSING_RESETTIMER": "ailosod amserydd", "SENSING_OF": "%1 o %2", "SENSING_OF_XPOSITION": "safle x", "SENSING_OF_YPOSITION": "safle y", "SENSING_OF_DIRECTION": "cyfeiriad", "SENSING_OF_COSTUMENUMBER": "gwisg #", "SENSING_OF_COSTUMENAME": "enw'r wisg", "SENSING_OF_SIZE": "maint", "SENSING_OF_VOLUME": "lefel sain", "SENSING_OF_BACKDROPNUMBER": "cefndir #", "SENSING_OF_BACKDROPNAME": "enw cefndir", "SENSING_OF_STAGE": "Llwyfan", "SENSING_CURRENT": "cyfredol %1", "SENSING_CURRENT_YEAR": "blwyddyn", "SENSING_CURRENT_MONTH": "mis", "SENSING_CURRENT_DATE": "dyddiad", "SENSING_CURRENT_DAYOFWEEK": "diwrnod o'r wythnos", "SENSING_CURRENT_HOUR": "awr", "SENSING_CURRENT_MINUTE": "munud", "SENSING_CURRENT_SECOND": "eiliad", "SENSING_DAYSSINCE2000": "dyddiau ers 2000", "SENSING_USERNAME": "enw defnyddiwr", "SENSING_USERID": "id defnyddiwr", "SOUND_PLAY": "cychwyn sain %1", "SOUND_PLAYUNTILDONE": "chwarae sain %1 tan y diwedd", "SOUND_STOPALLSOUNDS": "atal pob sain", "SOUND_SETEFFECTO": "gosod effaith %1 effaith i %2", "SOUND_CHANGEEFFECTBY": "newid effaith %1 gan %2", "SOUND_CLEAREFFECTS": "clirio effeithiau sain", "SOUND_EFFECTS_PITCH": "traw", "SOUND_EFFECTS_PAN": "troi chwith/de", "SOUND_CHANGEVOLUMEBY": "newid uchder sain gan %1", "SOUND_SETVOLUMETO": "gosod lefel sain i %1%", "SOUND_VOLUME": "lefel sain", "CATEGORY_MOTION": "Symudiad", "CATEGORY_LOOKS": "Edrychiad", "CATEGORY_SOUND": "Sain", "CATEGORY_EVENTS": "Digwyddiadau", "CATEGORY_CONTROL": "Rheoli", "CATEGORY_SENSING": "Synhwyro", "CATEGORY_OPERATORS": "Gweithredwyr", "CATEGORY_VARIABLES": "Variables", "CATEGORY_MYBLOCKS": "My Blocks", "DUPLICATE": "Dyblygu", "DELETE": "Dileu", "ADD_COMMENT": "Add Comment", "REMOVE_COMMENT": "Remove Comment", "DELETE_BLOCK": "Delete Block", "DELETE_X_BLOCKS": "Delete %1 Blocks", "DELETE_ALL_BLOCKS": "Delete all %1 blocks?", "CLEAN_UP": "Clean up Blocks", "HELP": "Cymorth", "UNDO": "Dadwneud", "REDO": "Ailwneud", "EDIT_PROCEDURE": "Golygu", "SHOW_PROCEDURE_DEFINITION": "Go to definition", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Say something...", "COLOUR_HUE_LABEL": "Lliw", "COLOUR_SATURATION_LABEL": "Dirlawnder", "COLOUR_BRIGHTNESS_LABEL": "Disgleirdeb", "CHANGE_VALUE_TITLE": "Change value:", "RENAME_VARIABLE": "Rename variable", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Rename Variable", "NEW_VARIABLE": "Creu Newidyn", "NEW_VARIABLE_TITLE": "New variable name:", "VARIABLE_MODAL_TITLE": "Newidyn Newydd", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Creu Bloc", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Gwneud Rhestr", "NEW_LIST_TITLE": "New list name:", "LIST_MODAL_TITLE": "Rhestr Newydd", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Rename List", "NEW_BROADCAST_MESSAGE": "New message", "NEW_BROADCAST_MESSAGE_TITLE": "New message name:", "BROADCAST_MODAL_TITLE": "Neges Newydd", "DEFAULT_BROADCAST_MESSAGE_NAME": "neges1" }; Blockly.ScratchMsgs.locales["da"] = { "CONTROL_FOREVER": "for evigt", "CONTROL_REPEAT": "gentag %1", "CONTROL_IF": "hvis %1 så", "CONTROL_ELSE": "ellers", "CONTROL_STOP": "stop", "CONTROL_STOP_ALL": "alle", "CONTROL_STOP_THIS": "dette script", "CONTROL_STOP_OTHER": "andre scripts i sprite", "CONTROL_WAIT": "vent %1 sekunder", "CONTROL_WAITUNTIL": "vent indtil %1", "CONTROL_REPEATUNTIL": "gentag indtil %1", "CONTROL_WHILE": "mens %1", "CONTROL_FOREACH": "for hver %1 i %2", "CONTROL_STARTASCLONE": "når jeg starter som klon", "CONTROL_CREATECLONEOF": "opret en klon af %1", "CONTROL_CREATECLONEOF_MYSELF": "mig selv", "CONTROL_DELETETHISCLONE": "slet denne klon", "CONTROL_COUNTER": "tæller", "CONTROL_INCRCOUNTER": "tæl tæller op", "CONTROL_CLEARCOUNTER": "nulstil tæller", "CONTROL_ALLATONCE": "alle på en gang", "DATA_SETVARIABLETO": "sæt %1 til %2", "DATA_CHANGEVARIABLEBY": "ændre %1 med %2", "DATA_SHOWVARIABLE": "vis variabel %1", "DATA_HIDEVARIABLE": "skjul variabel %1", "DATA_ADDTOLIST": "tilføj %1 til %2", "DATA_DELETEOFLIST": "slet %1 af %2", "DATA_INSERTATLIST": "indsæt %1 ved %2 af %3", "DATA_REPLACEITEMOFLIST": "erstat objekt %1 af %2 med %3", "DATA_ITEMOFLIST": "objekt %1 af %2", "DATA_LENGTHOFLIST": "længden af %1", "DATA_LISTCONTAINSITEM": "%1 indeholder %2?", "DATA_SHOWLIST": "vis liste %1", "DATA_HIDELIST": "skjul liste %1", "DATA_INDEX_ALL": "alle", "DATA_INDEX_LAST": "sidste", "DATA_INDEX_RANDOM": "tilfældig", "EVENT_WHENFLAGCLICKED": "når der klikkes på %1 ", "EVENT_WHENTHISSPRITECLICKED": "når denne sprite klikkes", "EVENT_WHENSTAGECLICKED": "når scene er valgt", "EVENT_WHENTOUCHINGOBJECT": "når denne sprite berører %1", "EVENT_WHENBROADCASTRECEIVED": "når jeg modtager %1", "EVENT_WHENBACKDROPSWITCHESTO": "når baggrund skifter til %1", "EVENT_WHENGREATERTHAN": "når %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "stopur", "EVENT_BROADCAST": "send %1", "EVENT_BROADCASTANDWAIT": "send %1 og vent", "EVENT_WHENKEYPRESSED": "når du trykker på %1", "EVENT_WHENKEYPRESSED_SPACE": "mellemrum", "EVENT_WHENKEYPRESSED_LEFT": "venstre pil", "EVENT_WHENKEYPRESSED_RIGHT": "højre pil", "EVENT_WHENKEYPRESSED_DOWN": "pil nedad", "EVENT_WHENKEYPRESSED_UP": "pil opad", "EVENT_WHENKEYPRESSED_ANY": "vilkårlig", "LOOKS_SAYFORSECS": "sig %1 i %2 sekunder", "LOOKS_SAY": "sig %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "tænke %1 i %2 sekunder", "LOOKS_THINK": "tænk %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "vis", "LOOKS_HIDE": "skjul", "LOOKS_HIDEALLSPRITES": "skjul alle sprites", "LOOKS_EFFECT_COLOR": "farve", "LOOKS_EFFECT_FISHEYE": "fiskeøje", "LOOKS_EFFECT_WHIRL": "vrid", "LOOKS_EFFECT_PIXELATE": "pixeler", "LOOKS_EFFECT_MOSAIC": "mosaik", "LOOKS_EFFECT_BRIGHTNESS": "lysstyrke", "LOOKS_EFFECT_GHOST": "spøgelse", "LOOKS_CHANGEEFFECTBY": "ændr effekt %1 med %2", "LOOKS_SETEFFECTTO": "sæt effekt %1 til %2", "LOOKS_CLEARGRAPHICEFFECTS": "fjern grafiske effekter", "LOOKS_CHANGESIZEBY": "ændre størrelse med %1", "LOOKS_SETSIZETO": "sæt størrelse til %1 %", "LOOKS_SIZE": "størrelse", "LOOKS_CHANGESTRETCHBY": "ændre stræk med %1", "LOOKS_SETSTRETCHTO": "sæt stræk til %1 %", "LOOKS_SWITCHCOSTUMETO": "skift kostume til %1", "LOOKS_NEXTCOSTUME": "næste kostume", "LOOKS_SWITCHBACKDROPTO": "skift baggrund til %1", "LOOKS_GOTOFRONTBACK": "gå til %1 lag", "LOOKS_GOTOFRONTBACK_FRONT": "forreste", "LOOKS_GOTOFRONTBACK_BACK": "bagerste", "LOOKS_GOFORWARDBACKWARDLAYERS": "gå %2 lag %1", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "frem", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "tilbage", "LOOKS_BACKDROPNUMBERNAME": "baggrund %1", "LOOKS_COSTUMENUMBERNAME": "kostume %1", "LOOKS_NUMBERNAME_NUMBER": "nummer", "LOOKS_NUMBERNAME_NAME": "navn", "LOOKS_SWITCHBACKDROPTOANDWAIT": "skift baggrund til %1 og vent", "LOOKS_NEXTBACKDROP": "næste baggrund", "LOOKS_PREVIOUSBACKDROP": "forrige baggrund", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "gå %1 trin", "MOTION_TURNLEFT": "drej %1 %2 grader", "MOTION_TURNRIGHT": "drej %1 %2 grader", "MOTION_POINTINDIRECTION": "peg i retning %1", "MOTION_POINTTOWARDS": "peg mod %1", "MOTION_POINTTOWARDS_POINTER": "musepil", "MOTION_GOTO": "gå til %1", "MOTION_GOTO_POINTER": "musepil", "MOTION_GOTO_RANDOM": "tilfældig position", "MOTION_GOTOXY": "gå til x: %1 y: %2", "MOTION_GLIDESECSTOXY": "glid %1 sekunder til x: %2 y: %3", "MOTION_GLIDETO": "glid %1 sekunder til %2", "MOTION_GLIDETO_POINTER": "musepil", "MOTION_GLIDETO_RANDOM": "tilfældig position", "MOTION_CHANGEXBY": "ændre x med %1", "MOTION_SETX": "sæt x til %1", "MOTION_CHANGEYBY": "ændre y med %1", "MOTION_SETY": "sæt y til %1", "MOTION_IFONEDGEBOUNCE": "hop tilbage ved kanten", "MOTION_SETROTATIONSTYLE": "sæt rotationsstil til %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "venstre-højre", "MOTION_SETROTATIONSTYLE_DONTROTATE": "drej ikke", "MOTION_SETROTATIONSTYLE_ALLAROUND": "alle retninger", "MOTION_XPOSITION": "x position", "MOTION_YPOSITION": "y position", "MOTION_DIRECTION": "retning", "MOTION_SCROLLRIGHT": "rul mod højre %1", "MOTION_SCROLLUP": "rul op %1", "MOTION_ALIGNSCENE": "tilpas scene %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "nederst-til-venstre", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "nederst-til-højre", "MOTION_ALIGNSCENE_MIDDLE": "midten", "MOTION_ALIGNSCENE_TOPLEFT": "øverst-til-venstre", "MOTION_ALIGNSCENE_TOPRIGHT": "øverst-til-højre", "MOTION_XSCROLL": "x rul", "MOTION_YSCROLL": "y rul", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "vælg tilfældigt mellem %1 og %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 og %2", "OPERATORS_OR": "%1 eller %2", "OPERATORS_NOT": "ikke %1", "OPERATORS_JOIN": "%1 tilkobles %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "bogstav %1 af %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "længden af %1", "OPERATORS_CONTAINS": "%1 indeholder %2?", "OPERATORS_MOD": "%1 modulus %2", "OPERATORS_ROUND": "afrund %1", "OPERATORS_MATHOP": "%1 af %2", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "gulv", "OPERATORS_MATHOP_CEILING": "loft", "OPERATORS_MATHOP_SQRT": "kvrod", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "definer %1", "SENSING_TOUCHINGOBJECT": "berører %1?", "SENSING_TOUCHINGOBJECT_POINTER": "musepil", "SENSING_TOUCHINGOBJECT_EDGE": "kant", "SENSING_TOUCHINGCOLOR": "berører farven %1?", "SENSING_COLORISTOUCHINGCOLOR": "berører %1 farven %2?", "SENSING_DISTANCETO": "afstand til %1", "SENSING_DISTANCETO_POINTER": "musepil", "SENSING_ASKANDWAIT": "bed om %1 og vent", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "svar", "SENSING_KEYPRESSED": "trykket på tasten %1?", "SENSING_MOUSEDOWN": "trykket på musen?", "SENSING_MOUSEX": "musens x-position", "SENSING_MOUSEY": "musens y-position", "SENSING_SETDRAGMODE": "sæt træk %1", "SENSING_SETDRAGMODE_DRAGGABLE": "kan trækkes", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "kan ikke trækkes", "SENSING_LOUDNESS": "lydstyrke", "SENSING_LOUD": "højt?", "SENSING_TIMER": "stopur", "SENSING_RESETTIMER": "nulstil stopur", "SENSING_OF": "%1 af %2", "SENSING_OF_XPOSITION": "x position", "SENSING_OF_YPOSITION": "y position", "SENSING_OF_DIRECTION": "retning", "SENSING_OF_COSTUMENUMBER": "kostume #", "SENSING_OF_COSTUMENAME": "navn på kostume", "SENSING_OF_SIZE": "størrelse", "SENSING_OF_VOLUME": "lydstyrke", "SENSING_OF_BACKDROPNUMBER": "baggrund #", "SENSING_OF_BACKDROPNAME": "navn på baggrund", "SENSING_OF_STAGE": "Scene", "SENSING_CURRENT": "nuværende %1", "SENSING_CURRENT_YEAR": "år", "SENSING_CURRENT_MONTH": "måned", "SENSING_CURRENT_DATE": "dato", "SENSING_CURRENT_DAYOFWEEK": "ugedag", "SENSING_CURRENT_HOUR": "time", "SENSING_CURRENT_MINUTE": "minut", "SENSING_CURRENT_SECOND": "sekund", "SENSING_DAYSSINCE2000": "dage siden 2000", "SENSING_USERNAME": "brugernavn", "SENSING_USERID": "bruger id", "SOUND_PLAY": "spil lyden %1", "SOUND_PLAYUNTILDONE": "spil lyden %1 indtil færdig", "SOUND_STOPALLSOUNDS": "stop al lyd", "SOUND_SETEFFECTO": "sæt effekt %1 til %2", "SOUND_CHANGEEFFECTBY": "ændr effekt %1 med %2", "SOUND_CLEAREFFECTS": "fjern lydeffekter", "SOUND_EFFECTS_PITCH": "tonehøjde", "SOUND_EFFECTS_PAN": "balance venstre/højre", "SOUND_CHANGEVOLUMEBY": "ændr lydstyrke med %1", "SOUND_SETVOLUMETO": "sæt lydstyrke til %1%", "SOUND_VOLUME": "lydstyrke", "CATEGORY_MOTION": "Bevægelse", "CATEGORY_LOOKS": "Udseende", "CATEGORY_SOUND": "Lyd", "CATEGORY_EVENTS": "Hændelser", "CATEGORY_CONTROL": "Kontrol", "CATEGORY_SENSING": "Registrering", "CATEGORY_OPERATORS": "Operatorer", "CATEGORY_VARIABLES": "Variabler", "CATEGORY_MYBLOCKS": "Mine brikker", "DUPLICATE": "Kopiér", "DELETE": "Slet", "ADD_COMMENT": "Tilføj kommentar", "REMOVE_COMMENT": "Slet kommentar", "DELETE_BLOCK": "Slet brik", "DELETE_X_BLOCKS": "Slet %1 brikker", "DELETE_ALL_BLOCKS": "Slet alle %1 brikker?", "CLEAN_UP": "Ryd brikkerne op", "HELP": "Hjælp", "UNDO": "Fortryd", "REDO": "Gør om", "EDIT_PROCEDURE": "Redigér", "SHOW_PROCEDURE_DEFINITION": "Gå til forklaring", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Sig noget...", "COLOUR_HUE_LABEL": "Farve", "COLOUR_SATURATION_LABEL": "Farvemætning", "COLOUR_BRIGHTNESS_LABEL": "Lysstyrke", "CHANGE_VALUE_TITLE": "Ændre værdien:", "RENAME_VARIABLE": "Omdøb variabel", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Omdøb variabel", "NEW_VARIABLE": "Lav en variabel", "NEW_VARIABLE_TITLE": "Navn på ny variabel:", "VARIABLE_MODAL_TITLE": "Ny variabel", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Lav en brik", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Lav en liste", "NEW_LIST_TITLE": "Navn på ny liste:", "LIST_MODAL_TITLE": "Ny liste", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Omdøb liste", "NEW_BROADCAST_MESSAGE": "Ny besked", "NEW_BROADCAST_MESSAGE_TITLE": "Navn på ny besked:", "BROADCAST_MODAL_TITLE": "Ny besked", "DEFAULT_BROADCAST_MESSAGE_NAME": "besked1" }; Blockly.ScratchMsgs.locales["de"] = { "CONTROL_FOREVER": "wiederhole fortlaufend", "CONTROL_REPEAT": "wiederhole %1 mal", "CONTROL_IF": "falls %1, dann", "CONTROL_ELSE": "sonst", "CONTROL_STOP": "stoppe", "CONTROL_STOP_ALL": "alles", "CONTROL_STOP_THIS": "dieses Skript", "CONTROL_STOP_OTHER": "andere Skripte der Figur", "CONTROL_WAIT": "warte %1 Sekunden", "CONTROL_WAITUNTIL": "warte bis %1", "CONTROL_REPEATUNTIL": "wiederhole bis %1", "CONTROL_WHILE": "wiederhole solange %1", "CONTROL_FOREACH": "wiederhole für jedes %1 in %2", "CONTROL_STARTASCLONE": "Wenn ich als Klon entstehe", "CONTROL_CREATECLONEOF": "erzeuge Klon von %1", "CONTROL_CREATECLONEOF_MYSELF": "mir selbst", "CONTROL_DELETETHISCLONE": "lösche diesen Klon", "CONTROL_COUNTER": "Zähler", "CONTROL_INCRCOUNTER": "erhöhe Zähler", "CONTROL_CLEARCOUNTER": "lösche Zähler", "CONTROL_ALLATONCE": "Alle gleichzeitig", "DATA_SETVARIABLETO": "setze %1 auf %2", "DATA_CHANGEVARIABLEBY": "ändere %1 um %2", "DATA_SHOWVARIABLE": "zeige Variable %1", "DATA_HIDEVARIABLE": "verstecke Variable %1", "DATA_ADDTOLIST": "füge %1 zu %2 hinzu", "DATA_DELETEOFLIST": "lösche %1 von %2", "DATA_INSERTATLIST": "füge %1 an %2 von %3 ein", "DATA_REPLACEITEMOFLIST": "ersetze Element %1 von %2 durch %3", "DATA_ITEMOFLIST": "Element %1 von %2", "DATA_LENGTHOFLIST": "Länge von %1", "DATA_LISTCONTAINSITEM": "%1 enthält %2?", "DATA_SHOWLIST": "zeige Liste %1", "DATA_HIDELIST": "verstecke Liste %1", "DATA_INDEX_ALL": "alles", "DATA_INDEX_LAST": "letztes", "DATA_INDEX_RANDOM": "zufälliges", "EVENT_WHENFLAGCLICKED": "Wenn %1 angeklickt", "EVENT_WHENTHISSPRITECLICKED": "Wenn diese Figur angeklickt", "EVENT_WHENSTAGECLICKED": "Wenn Bühne angeklickt", "EVENT_WHENTOUCHINGOBJECT": "Wenn diese Figur %1 berührt", "EVENT_WHENBROADCASTRECEIVED": "Wenn ich %1 empfange", "EVENT_WHENBACKDROPSWITCHESTO": "Wenn das Bühnenbild zu %1 wechselt", "EVENT_WHENGREATERTHAN": "Wenn %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "Stoppuhr", "EVENT_BROADCAST": "sende %1 an alle", "EVENT_BROADCASTANDWAIT": "sende %1 an alle und warte", "EVENT_WHENKEYPRESSED": "Wenn Taste %1 gedrückt", "EVENT_WHENKEYPRESSED_SPACE": "Leertaste", "EVENT_WHENKEYPRESSED_LEFT": "Pfeil nach links", "EVENT_WHENKEYPRESSED_RIGHT": "Pfeil nach rechts", "EVENT_WHENKEYPRESSED_DOWN": "Pfeil nach unten", "EVENT_WHENKEYPRESSED_UP": "Pfeil nach oben", "EVENT_WHENKEYPRESSED_ANY": "beliebiges", "LOOKS_SAYFORSECS": "sage %1 für %2 Sekunden", "LOOKS_SAY": "sage %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "denke %1 für %2 Sekunden", "LOOKS_THINK": "denke %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "zeige dich", "LOOKS_HIDE": "verstecke dich", "LOOKS_HIDEALLSPRITES": "Alle Figuren verbergen", "LOOKS_EFFECT_COLOR": "Farbe", "LOOKS_EFFECT_FISHEYE": "Fischauge", "LOOKS_EFFECT_WHIRL": "Wirbel", "LOOKS_EFFECT_PIXELATE": "Pixel", "LOOKS_EFFECT_MOSAIC": "Mosaik", "LOOKS_EFFECT_BRIGHTNESS": "Helligkeit", "LOOKS_EFFECT_GHOST": "Durchsichtigkeit", "LOOKS_CHANGEEFFECTBY": "ändere Effekt %1 um %2", "LOOKS_SETEFFECTTO": "setze Effekt %1 auf %2", "LOOKS_CLEARGRAPHICEFFECTS": "schalte Grafikeffekte aus", "LOOKS_CHANGESIZEBY": "ändere Größe um %1", "LOOKS_SETSIZETO": "setze Größe auf %1", "LOOKS_SIZE": "Größe", "LOOKS_CHANGESTRETCHBY": "ändere Dehnung um %1", "LOOKS_SETSTRETCHTO": "setze Dehnung auf %1 %", "LOOKS_SWITCHCOSTUMETO": "wechsle zu Kostüm %1", "LOOKS_NEXTCOSTUME": "nächstes Kostüm", "LOOKS_SWITCHBACKDROPTO": "wechsle zu Bühnenbild %1", "LOOKS_GOTOFRONTBACK": "gehe zu %1 Ebene", "LOOKS_GOTOFRONTBACK_FRONT": "vorderster", "LOOKS_GOTOFRONTBACK_BACK": "hinterster", "LOOKS_GOFORWARDBACKWARDLAYERS": "gehe %2 Ebenen %1", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "nach vorne", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "nach hinten", "LOOKS_BACKDROPNUMBERNAME": "Bühnenbild %1", "LOOKS_COSTUMENUMBERNAME": "Kostüm %1", "LOOKS_NUMBERNAME_NUMBER": "Nummer", "LOOKS_NUMBERNAME_NAME": "Name", "LOOKS_SWITCHBACKDROPTOANDWAIT": "wechsle zu Bühnenbild %1 und warte", "LOOKS_NEXTBACKDROP": "nächstes Bühnenbild", "LOOKS_PREVIOUSBACKDROP": "vorheriges Bühnenbild", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "gehe %1 er Schritt", "MOTION_TURNLEFT": "drehe dich %1 um %2 Grad", "MOTION_TURNRIGHT": "drehe dich %1 um %2 Grad", "MOTION_POINTINDIRECTION": "setze Richtung auf %1 Grad", "MOTION_POINTTOWARDS": "drehe dich zu %1", "MOTION_POINTTOWARDS_POINTER": "Mauszeiger", "MOTION_GOTO": "gehe zu %1", "MOTION_GOTO_POINTER": "Mauszeiger", "MOTION_GOTO_RANDOM": "Zufallsposition", "MOTION_GOTOXY": "gehe zu x: %1 y: %2", "MOTION_GLIDESECSTOXY": "gleite %1 Sek. zu x: %2 y: %3", "MOTION_GLIDETO": "gleite %1 Sek. zu %2", "MOTION_GLIDETO_POINTER": "Mauszeiger", "MOTION_GLIDETO_RANDOM": "Zufallsposition", "MOTION_CHANGEXBY": "ändere x um %1", "MOTION_SETX": "setze x auf %1", "MOTION_CHANGEYBY": "ändere y um %1", "MOTION_SETY": "setze y auf %1", "MOTION_IFONEDGEBOUNCE": "pralle vom Rand ab", "MOTION_SETROTATIONSTYLE": "setze Drehtyp auf %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "links-rechts", "MOTION_SETROTATIONSTYLE_DONTROTATE": "nicht drehen", "MOTION_SETROTATIONSTYLE_ALLAROUND": "rundherum", "MOTION_XPOSITION": "x-Position", "MOTION_YPOSITION": "y-Position", "MOTION_DIRECTION": "Richtung", "MOTION_SCROLLRIGHT": "%1 nach rechts bewegen", "MOTION_SCROLLUP": "%1 nach oben bewegen", "MOTION_ALIGNSCENE": "Szene ausrichten %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "unten links", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "unten rechts", "MOTION_ALIGNSCENE_MIDDLE": "Mitte", "MOTION_ALIGNSCENE_TOPLEFT": "oben links", "MOTION_ALIGNSCENE_TOPRIGHT": "oben rechts", "MOTION_XSCROLL": "x-Bewegung", "MOTION_YSCROLL": "y-Bewegung", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "Zufallszahl von %1 bis %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 und %2", "OPERATORS_OR": "%1 oder %2", "OPERATORS_NOT": "nicht %1", "OPERATORS_JOIN": "verbinde %1 und %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "Zeichen %1 von %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "Länge von %1", "OPERATORS_CONTAINS": "%1 enthält %2?", "OPERATORS_MOD": "%1 mod %2", "OPERATORS_ROUND": "%1 gerundet", "OPERATORS_MATHOP": "%1 von %2", "OPERATORS_MATHOP_ABS": "Betrag", "OPERATORS_MATHOP_FLOOR": "abrunden", "OPERATORS_MATHOP_CEILING": "aufrunden", "OPERATORS_MATHOP_SQRT": "Wurzel", "OPERATORS_MATHOP_SIN": "Sinus", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e^", "OPERATORS_MATHOP_10EXP": "10^", "PROCEDURES_DEFINITION": "definiere %1", "SENSING_TOUCHINGOBJECT": "wird %1 berührt?", "SENSING_TOUCHINGOBJECT_POINTER": "Mauszeiger", "SENSING_TOUCHINGOBJECT_EDGE": "Rand", "SENSING_TOUCHINGCOLOR": "wird Farbe %1 berührt?", "SENSING_COLORISTOUCHINGCOLOR": "Farbe %1 berührt %2?", "SENSING_DISTANCETO": "Entfernung von %1", "SENSING_DISTANCETO_POINTER": "Mauszeiger", "SENSING_ASKANDWAIT": "frage %1 und warte", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "Antwort", "SENSING_KEYPRESSED": "Taste %1 gedrückt?", "SENSING_MOUSEDOWN": "Maustaste gedrückt?", "SENSING_MOUSEX": "Maus x-Position", "SENSING_MOUSEY": "Maus y-Position", "SENSING_SETDRAGMODE": "setze Ziehbarkeit auf %1", "SENSING_SETDRAGMODE_DRAGGABLE": "ziehbar", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "nicht ziehbar", "SENSING_LOUDNESS": "Lautstärke", "SENSING_LOUD": "laut?", "SENSING_TIMER": "Stoppuhr", "SENSING_RESETTIMER": "setze Stoppuhr zurück", "SENSING_OF": "%1 von %2", "SENSING_OF_XPOSITION": "x-Position", "SENSING_OF_YPOSITION": "y-Position", "SENSING_OF_DIRECTION": "Richtung", "SENSING_OF_COSTUMENUMBER": "Kostümnummer", "SENSING_OF_COSTUMENAME": "Kostümname", "SENSING_OF_SIZE": "Größe", "SENSING_OF_VOLUME": "Lautstärke", "SENSING_OF_BACKDROPNUMBER": "Bühnenbildnummer", "SENSING_OF_BACKDROPNAME": "Bühnenbildname", "SENSING_OF_STAGE": "Bühne", "SENSING_CURRENT": "%1 im Moment", "SENSING_CURRENT_YEAR": "Jahr", "SENSING_CURRENT_MONTH": "Monat", "SENSING_CURRENT_DATE": "Datum", "SENSING_CURRENT_DAYOFWEEK": "Wochentag", "SENSING_CURRENT_HOUR": "Stunde", "SENSING_CURRENT_MINUTE": "Minute", "SENSING_CURRENT_SECOND": "Sekunde", "SENSING_DAYSSINCE2000": "Tage seit 2000", "SENSING_USERNAME": "Benutzername", "SENSING_USERID": "Benutzer-ID", "SOUND_PLAY": "spiele Klang %1", "SOUND_PLAYUNTILDONE": "spiele Klang %1 ganz", "SOUND_STOPALLSOUNDS": "stoppe alle Klänge", "SOUND_SETEFFECTO": "setze Effekt %1 auf %2", "SOUND_CHANGEEFFECTBY": "ändere Effekt %1 um %2", "SOUND_CLEAREFFECTS": "schalte Klangeffekte aus", "SOUND_EFFECTS_PITCH": "Höhe", "SOUND_EFFECTS_PAN": "aussteuern links/rechts", "SOUND_CHANGEVOLUMEBY": "ändere Lautstärke um %1", "SOUND_SETVOLUMETO": "setze Lautstärke auf %1%", "SOUND_VOLUME": "Lautstärke", "CATEGORY_MOTION": "Bewegung", "CATEGORY_LOOKS": "Aussehen", "CATEGORY_SOUND": "Klang", "CATEGORY_EVENTS": "Ereignisse", "CATEGORY_CONTROL": "Steuerung", "CATEGORY_SENSING": "Fühlen", "CATEGORY_OPERATORS": "Operatoren", "CATEGORY_VARIABLES": "Variablen", "CATEGORY_MYBLOCKS": "Meine Blöcke", "DUPLICATE": "Duplizieren", "DELETE": "Löschen", "ADD_COMMENT": "Kommentar hinzufügen", "REMOVE_COMMENT": "Kommentar entfernen", "DELETE_BLOCK": "Lösche Block", "DELETE_X_BLOCKS": "Lösche %1 Blöcke", "DELETE_ALL_BLOCKS": "Alle %1 Blöcke löschen?", "CLEAN_UP": "Blöcke aufräumen", "HELP": "Hilfe", "UNDO": "Rückgängig", "REDO": "Wiederherstellen", "EDIT_PROCEDURE": "Bearbeiten", "SHOW_PROCEDURE_DEFINITION": "Gehe zur Definition", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Sag etwas...", "COLOUR_HUE_LABEL": "Farbe", "COLOUR_SATURATION_LABEL": "Sättigung", "COLOUR_BRIGHTNESS_LABEL": "Helligkeit", "CHANGE_VALUE_TITLE": "Ändere Wert", "RENAME_VARIABLE": "Variable umbenennen", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Variable umbenennen", "NEW_VARIABLE": "Neue Variable", "NEW_VARIABLE_TITLE": "Neue Variable Name:", "VARIABLE_MODAL_TITLE": "Neue Variable", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Neuer Block", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Neue Liste", "NEW_LIST_TITLE": "Neuer Listen Name:", "LIST_MODAL_TITLE": "Neue Liste", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Liste umbenennen", "NEW_BROADCAST_MESSAGE": "Neue Nachricht", "NEW_BROADCAST_MESSAGE_TITLE": "Neue Nachricht name:", "BROADCAST_MODAL_TITLE": "Neue Nachricht", "DEFAULT_BROADCAST_MESSAGE_NAME": "Nachricht1" }; Blockly.ScratchMsgs.locales["el"] = { "CONTROL_FOREVER": "για πάντα", "CONTROL_REPEAT": "επανάλαβε %1", "CONTROL_IF": "εάν %1 τότε", "CONTROL_ELSE": "αλλιώς", "CONTROL_STOP": "σταμάτησε", "CONTROL_STOP_ALL": "όλα", "CONTROL_STOP_THIS": "αυτό το σενάριο", "CONTROL_STOP_OTHER": "άλλα σενάρια σε αυτό το αντικείμενο", "CONTROL_WAIT": "περίμενε %1 δευτερόλεπτα", "CONTROL_WAITUNTIL": "περίμενε ώσπου %1", "CONTROL_REPEATUNTIL": "επανάλαβε ώσπου %1", "CONTROL_WHILE": "όσο %1", "CONTROL_FOREACH": "για κάθε %1 στο %2", "CONTROL_STARTASCLONE": "όταν ξεκινήσει ο κλώνος", "CONTROL_CREATECLONEOF": "δημιούργησε έναν κλώνο του %1", "CONTROL_CREATECLONEOF_MYSELF": "εαυτού μου", "CONTROL_DELETETHISCLONE": "διάγραψε αυτόν τον κλώνο", "CONTROL_COUNTER": "μετρητής", "CONTROL_INCRCOUNTER": "μετρητής αύξησης", "CONTROL_CLEARCOUNTER": "καθαρισμός μετρητή", "CONTROL_ALLATONCE": "all at once", "DATA_SETVARIABLETO": "όρισε το %1 σε %2", "DATA_CHANGEVARIABLEBY": "άλλαξε το %1 κατά %2", "DATA_SHOWVARIABLE": "εμφάνισε τη μεταβλητή %1", "DATA_HIDEVARIABLE": "απόκρυψε τη μεταβλητή %1", "DATA_ADDTOLIST": "πρόσθεσε το %1 στη λίστα %2", "DATA_DELETEOFLIST": "διάγραψε το %1 από τη λίστα %2", "DATA_INSERTATLIST": "βάλε το %1 στη θέση %2 της λίστας %3", "DATA_REPLACEITEMOFLIST": "αντικατάστησε το στοιχείο %1 της λίστας %2 με %3", "DATA_ITEMOFLIST": "το στοιχείο %1 της λίστας %2", "DATA_LENGTHOFLIST": "το μήκος της λίστας %1", "DATA_LISTCONTAINSITEM": "η λίστα %1 περιέχει %2", "DATA_SHOWLIST": "εμφάνισε την λίστα %1", "DATA_HIDELIST": "απόκρυψε τη λίστα %1", "DATA_INDEX_ALL": "όλα", "DATA_INDEX_LAST": "τελευταίο", "DATA_INDEX_RANDOM": "τυχαία επιλογή", "EVENT_WHENFLAGCLICKED": "όταν γίνει κλικ στο αντικείμενο %1", "EVENT_WHENTHISSPRITECLICKED": "όταν σε αυτό το αντικείμενο γίνει κλικ", "EVENT_WHENSTAGECLICKED": "όταν γίνει κλικ στο Σκηνικό", "EVENT_WHENTOUCHINGOBJECT": "when this sprite touches %1", "EVENT_WHENBROADCASTRECEIVED": "όταν λάβω %1", "EVENT_WHENBACKDROPSWITCHESTO": "όταν το υπόβαθρο αλλάξει σε %1", "EVENT_WHENGREATERTHAN": "όταν %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "χρονομέτρηση", "EVENT_BROADCAST": "μετάδωσε %1", "EVENT_BROADCASTANDWAIT": "μετάδωσε %1 και περίμενε", "EVENT_WHENKEYPRESSED": "όταν το πλήκτρο %1 πατηθεί", "EVENT_WHENKEYPRESSED_SPACE": "διάστημα", "EVENT_WHENKEYPRESSED_LEFT": "αριστερό βέλος", "EVENT_WHENKEYPRESSED_RIGHT": "δεξί βέλος", "EVENT_WHENKEYPRESSED_DOWN": "κάτω βέλος", "EVENT_WHENKEYPRESSED_UP": "πάνω βέλος", "EVENT_WHENKEYPRESSED_ANY": "οποιοδήποτε", "LOOKS_SAYFORSECS": "πες %1 για %2 δευτερόλεπτα", "LOOKS_SAY": "πες %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "σκέψου %1 για %2 δευτερόλεπτα", "LOOKS_THINK": "σκέψου %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "εμφανίσου", "LOOKS_HIDE": "εξαφανίσου", "LOOKS_HIDEALLSPRITES": "hide all sprites", "LOOKS_EFFECT_COLOR": "χρώματος", "LOOKS_EFFECT_FISHEYE": "κυρτότητας", "LOOKS_EFFECT_WHIRL": "δίνης", "LOOKS_EFFECT_PIXELATE": "εικονοστοιχειοποίησης", "LOOKS_EFFECT_MOSAIC": "ψηφιδωτού", "LOOKS_EFFECT_BRIGHTNESS": "φωτεινότητας", "LOOKS_EFFECT_GHOST": "εξαφάνισης", "LOOKS_CHANGEEFFECTBY": "άλλαξε το εφέ %1 κατά %2", "LOOKS_SETEFFECTTO": "όρισε το εφέ %1 σε %2", "LOOKS_CLEARGRAPHICEFFECTS": "επανάφερε τα γραφικά εφέ", "LOOKS_CHANGESIZEBY": "άλλαξε το μέγεθος του αντικειμένου κατά %1", "LOOKS_SETSIZETO": "όρισε το μέγεθος σε %1 %", "LOOKS_SIZE": "μέγεθος", "LOOKS_CHANGESTRETCHBY": "change stretch by %1", "LOOKS_SETSTRETCHTO": "set stretch to %1 %", "LOOKS_SWITCHCOSTUMETO": "άλλαξε την ενδυμασία σε %1", "LOOKS_NEXTCOSTUME": "άλλαξε στην επόμενη ενδυμασία", "LOOKS_SWITCHBACKDROPTO": "άλλαξε το υπόβαθρο σε %1", "LOOKS_GOTOFRONTBACK": "πήγαινε στην %1 στρώση", "LOOKS_GOTOFRONTBACK_FRONT": "μπροστινή", "LOOKS_GOTOFRONTBACK_BACK": "πισινή", "LOOKS_GOFORWARDBACKWARDLAYERS": "πήγαινε %1 %2 στρώσεις", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "μπροστά", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "πίσω", "LOOKS_BACKDROPNUMBERNAME": "υπόβαθρο %1", "LOOKS_COSTUMENUMBERNAME": "ενδυμασία %1", "LOOKS_NUMBERNAME_NUMBER": "νούμερο", "LOOKS_NUMBERNAME_NAME": "όνομα", "LOOKS_SWITCHBACKDROPTOANDWAIT": "άλλαξε το υπόβαθρο σε %1 και περίμενε", "LOOKS_NEXTBACKDROP": "άλλαξε στο επόμενο υπόβαθρο", "LOOKS_PREVIOUSBACKDROP": "προηγούμενο υπόβαθρο", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "κινήσου %1 βήματα", "MOTION_TURNLEFT": "στρίψε %1 %2 μοίρες", "MOTION_TURNRIGHT": "στρίψε %1 %2 μοίρες", "MOTION_POINTINDIRECTION": "στρίψε προς την κατεύθυνση %1", "MOTION_POINTTOWARDS": "στρίψε προς το %1", "MOTION_POINTTOWARDS_POINTER": "δείκτη του ποντικιού", "MOTION_GOTO": "πήγαινε %1", "MOTION_GOTO_POINTER": "στο δείκτη του ποντικιού", "MOTION_GOTO_RANDOM": "σε μία τυχαία θέση", "MOTION_GOTOXY": "πήγαινε στη θέση x: %1 και y: %2", "MOTION_GLIDESECSTOXY": "ολίσθησε για %1 δευτερόλεπτα προς τη θέση x: %2 και y: %3", "MOTION_GLIDETO": "ολίσθησε για %1 δευτερόλεπτα προς %2", "MOTION_GLIDETO_POINTER": "το δείκτη του ποντικιού", "MOTION_GLIDETO_RANDOM": "μία τυχαία θέση", "MOTION_CHANGEXBY": "άλλαξε το x κατά %1", "MOTION_SETX": "όρισε το x ίσο με %1", "MOTION_CHANGEYBY": "άλλαξε το y κατά %1", "MOTION_SETY": "όρισε το y ίσο με %1", "MOTION_IFONEDGEBOUNCE": "εάν βρίσκεσαι στα όρια, αναπήδησε", "MOTION_SETROTATIONSTYLE": "όρισε τον τρόπο περιστροφής %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "οριζόντιο", "MOTION_SETROTATIONSTYLE_DONTROTATE": "να μην γίνεται περιστροφή", "MOTION_SETROTATIONSTYLE_ALLAROUND": "ελεύθερο", "MOTION_XPOSITION": "θέση x", "MOTION_YPOSITION": "θέση y", "MOTION_DIRECTION": "κατεύθυνση", "MOTION_SCROLLRIGHT": "κύλιση δεξιά %1", "MOTION_SCROLLUP": "κύλιση πάνω %1", "MOTION_ALIGNSCENE": "align scene %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "κάτω-αριστερά", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "κάτω-δεξιά", "MOTION_ALIGNSCENE_MIDDLE": "μέσο", "MOTION_ALIGNSCENE_TOPLEFT": "πάνω-αριστερά", "MOTION_ALIGNSCENE_TOPRIGHT": "πάνω-δεξιά", "MOTION_XSCROLL": "κύλιση χ", "MOTION_YSCROLL": "κύλιση ψ", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "επίλεξε έναν τυχαίο αριθμό από το %1 μέχρι το %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 και %2", "OPERATORS_OR": "%1 ή %2", "OPERATORS_NOT": "δεν ισχύει ότι %1", "OPERATORS_JOIN": "ένωσε το %1 και το %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "το %1 ° γράμμα του %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "το μήκος του %1", "OPERATORS_CONTAINS": "το %1 περιλαμβάνει το %2;", "OPERATORS_MOD": "υπόλοιπο ακέραιας διαίρεσης %1 δια %2", "OPERATORS_ROUND": "στρογγυλοποίησε το %1", "OPERATORS_MATHOP": "%1 από %2", "OPERATORS_MATHOP_ABS": "απόλυτη τιμή", "OPERATORS_MATHOP_FLOOR": "στρογγυλοποίηση προς τα κάτω", "OPERATORS_MATHOP_CEILING": "στρογγυλοποίηση προς τα πάνω", "OPERATORS_MATHOP_SQRT": "τετραγωνική ρίζα", "OPERATORS_MATHOP_SIN": "ημίτονο", "OPERATORS_MATHOP_COS": "συνημίτονο", "OPERATORS_MATHOP_TAN": "εφαπτομένη", "OPERATORS_MATHOP_ASIN": "αντίστροφο ημίτονο", "OPERATORS_MATHOP_ACOS": "αντίστροφο συνημίτονο", "OPERATORS_MATHOP_ATAN": "αντίστροφη εφαπτομένη", "OPERATORS_MATHOP_LN": "φυσικός λογάριθμος", "OPERATORS_MATHOP_LOG": "δεκαδικός λογάριθμος", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "ορισμός του %1", "SENSING_TOUCHINGOBJECT": "αγγίζει %1;", "SENSING_TOUCHINGOBJECT_POINTER": "το δείκτη του ποντικιού", "SENSING_TOUCHINGOBJECT_EDGE": "τα όρια", "SENSING_TOUCHINGCOLOR": "αγγίζει το χρώμα %1;", "SENSING_COLORISTOUCHINGCOLOR": "το χρώμα %1 αγγίζει το χρώμα %2;", "SENSING_DISTANCETO": "η απόσταση μέχρι το %1", "SENSING_DISTANCETO_POINTER": "δείκτη του ποντικιού", "SENSING_ASKANDWAIT": "ρώτησε %1 και περίμενε", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "απάντηση", "SENSING_KEYPRESSED": "πατήθηκε το πλήκτρο %1", "SENSING_MOUSEDOWN": "πατήθηκε το ποντίκι;", "SENSING_MOUSEX": "θέση x του ποντικιού", "SENSING_MOUSEY": "θέση y του ποντικιού", "SENSING_SETDRAGMODE": "όρισε τον τρόπο συρσίματος σε %1", "SENSING_SETDRAGMODE_DRAGGABLE": "συρόμενο", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "μη συρόμενο", "SENSING_LOUDNESS": "ένταση", "SENSING_LOUD": "loud?", "SENSING_TIMER": "χρονομέτρηση", "SENSING_RESETTIMER": "μηδένησε τη χρονομέτρηση", "SENSING_OF": "%1 από %2", "SENSING_OF_XPOSITION": "θέση x", "SENSING_OF_YPOSITION": "θέση y", "SENSING_OF_DIRECTION": "κατεύθυνση", "SENSING_OF_COSTUMENUMBER": "ενδυμασία #", "SENSING_OF_COSTUMENAME": "όνομα ενδυμασίας", "SENSING_OF_SIZE": "μέγεθος", "SENSING_OF_VOLUME": "ένταση", "SENSING_OF_BACKDROPNUMBER": "υπόβαθρο #", "SENSING_OF_BACKDROPNAME": "όνομα υποβάθρου", "SENSING_OF_STAGE": "Σκηνικό", "SENSING_CURRENT": "τρέχων %1", "SENSING_CURRENT_YEAR": "χρόνος", "SENSING_CURRENT_MONTH": "μήνας", "SENSING_CURRENT_DATE": "ημερομηνία", "SENSING_CURRENT_DAYOFWEEK": "μέρα της εβδομάδας", "SENSING_CURRENT_HOUR": "ώρα", "SENSING_CURRENT_MINUTE": "λεπτό", "SENSING_CURRENT_SECOND": "δευτερόλεπτο", "SENSING_DAYSSINCE2000": "ημέρες από το 2000", "SENSING_USERNAME": "όνομα χρήστη", "SENSING_USERID": "user id", "SOUND_PLAY": "παίξε τον ήχο %1", "SOUND_PLAYUNTILDONE": "παίξε τον ήχο %1 μέχρι το τέλος", "SOUND_STOPALLSOUNDS": "σταμάτησε όλους τους ήχους", "SOUND_SETEFFECTO": "όρισε το εφέ %1 σε %2", "SOUND_CHANGEEFFECTBY": "άλλαξε το εφέ %1 κατά %2", "SOUND_CLEAREFFECTS": "επανάφερε τα ηχητικά εφέ", "SOUND_EFFECTS_PITCH": "τόνος", "SOUND_EFFECTS_PAN": "μετατόπιση αριστερά/δεξιά", "SOUND_CHANGEVOLUMEBY": "άλλαξε την ένταση κατά %1", "SOUND_SETVOLUMETO": "όρισε την ένταση σε %1%", "SOUND_VOLUME": "ένταση", "CATEGORY_MOTION": "Κινήσεις", "CATEGORY_LOOKS": "Όψεις", "CATEGORY_SOUND": "Ήχος", "CATEGORY_EVENTS": "Συμβάντα", "CATEGORY_CONTROL": "Έλεγχος", "CATEGORY_SENSING": "Αισθητήρες", "CATEGORY_OPERATORS": "Τελεστές", "CATEGORY_VARIABLES": "Variables", "CATEGORY_MYBLOCKS": "My Blocks", "DUPLICATE": "Διπλασιασμός ", "DELETE": "Διαγραφή", "ADD_COMMENT": "Προσθήκη σχολίου", "REMOVE_COMMENT": "Αφαίρεση σχολίου", "DELETE_BLOCK": "Delete Block", "DELETE_X_BLOCKS": "Delete %1 Blocks", "DELETE_ALL_BLOCKS": "Delete all %1 blocks?", "CLEAN_UP": "Clean up Blocks", "HELP": "Βοήθεια", "UNDO": "Αναίρεση", "REDO": "Ακύρωση αναίρεσης", "EDIT_PROCEDURE": "Επεξεργασία", "SHOW_PROCEDURE_DEFINITION": "Μετάβαση σε όρισμό", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Πες κάτι...", "COLOUR_HUE_LABEL": "Χρώμα", "COLOUR_SATURATION_LABEL": "Κορεσμός", "COLOUR_BRIGHTNESS_LABEL": "Φωτεινότητα", "CHANGE_VALUE_TITLE": "Αλλαγή τιμής:", "RENAME_VARIABLE": "Μετονομασία μεταβλητής", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Μετονομασία μεταβλητής", "NEW_VARIABLE": "Δημιουργία Μεταβλητής", "NEW_VARIABLE_TITLE": "Νέο όνομα μεταβλητής:", "VARIABLE_MODAL_TITLE": "Νέα Μεταβλητή", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "δημιουργήστε ένα τετράγωνο εντολών", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Δημιουργία Λίστας", "NEW_LIST_TITLE": "Νέο όνομα λίστας:", "LIST_MODAL_TITLE": "Νέα Λίστα", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Μετονομασία λίστας", "NEW_BROADCAST_MESSAGE": "Νέο μήνυμα", "NEW_BROADCAST_MESSAGE_TITLE": "Νέο όνομα μηνύματος:", "BROADCAST_MODAL_TITLE": "Νέο μήνυμα", "DEFAULT_BROADCAST_MESSAGE_NAME": "μήνυμα1" }; Blockly.ScratchMsgs.locales["en"] = { "CONTROL_FOREVER": "forever", "CONTROL_REPEAT": "repeat %1", "CONTROL_IF": "if %1 then", "CONTROL_ELSE": "else", "CONTROL_STOP": "stop", "CONTROL_STOP_ALL": "all", "CONTROL_STOP_THIS": "this script", "CONTROL_STOP_OTHER": "other scripts in sprite", "CONTROL_WAIT": "wait %1 seconds", "CONTROL_WAITUNTIL": "wait until %1", "CONTROL_REPEATUNTIL": "repeat until %1", "CONTROL_WHILE": "while %1", "CONTROL_FOREACH": "for each %1 in %2", "CONTROL_STARTASCLONE": "when I start as a clone", "CONTROL_CREATECLONEOF": "create clone of %1", "CONTROL_CREATECLONEOF_MYSELF": "myself", "CONTROL_DELETETHISCLONE": "delete this clone", "CONTROL_COUNTER": "counter", "CONTROL_INCRCOUNTER": "increment counter", "CONTROL_CLEARCOUNTER": "clear counter", "CONTROL_ALLATONCE": "all at once", "DATA_SETVARIABLETO": "set %1 to %2", "DATA_CHANGEVARIABLEBY": "change %1 by %2", "DATA_SHOWVARIABLE": "show variable %1", "DATA_HIDEVARIABLE": "hide variable %1", "DATA_ADDTOLIST": "add %1 to %2", "DATA_DELETEOFLIST": "delete %1 of %2", "DATA_INSERTATLIST": "insert %1 at %2 of %3", "DATA_REPLACEITEMOFLIST": "replace item %1 of %2 with %3", "DATA_ITEMOFLIST": "item %1 of %2", "DATA_LENGTHOFLIST": "length of %1", "DATA_LISTCONTAINSITEM": "%1 contains %2?", "DATA_SHOWLIST": "show list %1", "DATA_HIDELIST": "hide list %1", "DATA_INDEX_ALL": "all", "DATA_INDEX_LAST": "last", "DATA_INDEX_RANDOM": "random", "EVENT_WHENFLAGCLICKED": "when %1 clicked", "EVENT_WHENTHISSPRITECLICKED": "when this sprite clicked", "EVENT_WHENSTAGECLICKED": "when stage clicked", "EVENT_WHENTOUCHINGOBJECT": "when this sprite touches %1", "EVENT_WHENBROADCASTRECEIVED": "when I receive %1", "EVENT_WHENBACKDROPSWITCHESTO": "when backdrop switches to %1", "EVENT_WHENGREATERTHAN": "when %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "timer", "EVENT_BROADCAST": "broadcast %1", "EVENT_BROADCASTANDWAIT": "broadcast %1 and wait", "EVENT_WHENKEYPRESSED": "when %1 key pressed", "EVENT_WHENKEYPRESSED_SPACE": "space", "EVENT_WHENKEYPRESSED_LEFT": "left arrow", "EVENT_WHENKEYPRESSED_RIGHT": "right arrow", "EVENT_WHENKEYPRESSED_DOWN": "down arrow", "EVENT_WHENKEYPRESSED_UP": "up arrow", "EVENT_WHENKEYPRESSED_ANY": "any", "LOOKS_SAYFORSECS": "say %1 for %2 seconds", "LOOKS_SAY": "say %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "think %1 for %2 seconds", "LOOKS_THINK": "think %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "show", "LOOKS_HIDE": "hide", "LOOKS_HIDEALLSPRITES": "hide all sprites", "LOOKS_EFFECT_COLOR": "color", "LOOKS_EFFECT_FISHEYE": "fisheye", "LOOKS_EFFECT_WHIRL": "whirl", "LOOKS_EFFECT_PIXELATE": "pixelate", "LOOKS_EFFECT_MOSAIC": "mosaic", "LOOKS_EFFECT_BRIGHTNESS": "brightness", "LOOKS_EFFECT_GHOST": "ghost", "LOOKS_CHANGEEFFECTBY": "change %1 effect by %2", "LOOKS_SETEFFECTTO": "set %1 effect to %2", "LOOKS_CLEARGRAPHICEFFECTS": "clear graphic effects", "LOOKS_CHANGESIZEBY": "change size by %1", "LOOKS_SETSIZETO": "set size to %1 %", "LOOKS_SIZE": "size", "LOOKS_CHANGESTRETCHBY": "change stretch by %1", "LOOKS_SETSTRETCHTO": "set stretch to %1 %", "LOOKS_SWITCHCOSTUMETO": "switch costume to %1", "LOOKS_NEXTCOSTUME": "next costume", "LOOKS_SWITCHBACKDROPTO": "switch backdrop to %1", "LOOKS_GOTOFRONTBACK": "go to %1 layer", "LOOKS_GOTOFRONTBACK_FRONT": "front", "LOOKS_GOTOFRONTBACK_BACK": "back", "LOOKS_GOFORWARDBACKWARDLAYERS": "go %1 %2 layers", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "forward", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "backward", "LOOKS_BACKDROPNUMBERNAME": "backdrop %1", "LOOKS_COSTUMENUMBERNAME": "costume %1", "LOOKS_NUMBERNAME_NUMBER": "number", "LOOKS_NUMBERNAME_NAME": "name", "LOOKS_SWITCHBACKDROPTOANDWAIT": "switch backdrop to %1 and wait", "LOOKS_NEXTBACKDROP": "next backdrop", "LOOKS_PREVIOUSBACKDROP": "previous backdrop", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "move %1 steps", "MOTION_TURNLEFT": "turn %1 %2 degrees", "MOTION_TURNRIGHT": "turn %1 %2 degrees", "MOTION_POINTINDIRECTION": "point in direction %1", "MOTION_POINTTOWARDS": "point towards %1", "MOTION_POINTTOWARDS_POINTER": "mouse-pointer", "MOTION_GOTO": "go to %1", "MOTION_GOTO_POINTER": "mouse-pointer", "MOTION_GOTO_RANDOM": "random position", "MOTION_GOTOXY": "go to x: %1 y: %2", "MOTION_GLIDESECSTOXY": "glide %1 secs to x: %2 y: %3", "MOTION_GLIDETO": "glide %1 secs to %2", "MOTION_GLIDETO_POINTER": "mouse-pointer", "MOTION_GLIDETO_RANDOM": "random position", "MOTION_CHANGEXBY": "change x by %1", "MOTION_SETX": "set x to %1", "MOTION_CHANGEYBY": "change y by %1", "MOTION_SETY": "set y to %1", "MOTION_IFONEDGEBOUNCE": "if on edge, bounce", "MOTION_SETROTATIONSTYLE": "set rotation style %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "left-right", "MOTION_SETROTATIONSTYLE_DONTROTATE": "don't rotate", "MOTION_SETROTATIONSTYLE_ALLAROUND": "all around", "MOTION_XPOSITION": "x position", "MOTION_YPOSITION": "y position", "MOTION_DIRECTION": "direction", "MOTION_SCROLLRIGHT": "scroll right %1", "MOTION_SCROLLUP": "scroll up %1", "MOTION_ALIGNSCENE": "align scene %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "bottom-left", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "bottom-right", "MOTION_ALIGNSCENE_MIDDLE": "middle", "MOTION_ALIGNSCENE_TOPLEFT": "top-left", "MOTION_ALIGNSCENE_TOPRIGHT": "top-right", "MOTION_XSCROLL": "x scroll", "MOTION_YSCROLL": "y scroll", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "pick random %1 to %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 and %2", "OPERATORS_OR": "%1 or %2", "OPERATORS_NOT": "not %1", "OPERATORS_JOIN": "join %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "letter %1 of %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "length of %1", "OPERATORS_CONTAINS": "%1 contains %2?", "OPERATORS_MOD": "%1 mod %2", "OPERATORS_ROUND": "round %1", "OPERATORS_MATHOP": "%1 of %2", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "floor", "OPERATORS_MATHOP_CEILING": "ceiling", "OPERATORS_MATHOP_SQRT": "sqrt", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "define %1", "SENSING_TOUCHINGOBJECT": "touching %1?", "SENSING_TOUCHINGOBJECT_POINTER": "mouse-pointer", "SENSING_TOUCHINGOBJECT_EDGE": "edge", "SENSING_TOUCHINGCOLOR": "touching color %1?", "SENSING_COLORISTOUCHINGCOLOR": "color %1 is touching %2?", "SENSING_DISTANCETO": "distance to %1", "SENSING_DISTANCETO_POINTER": "mouse-pointer", "SENSING_ASKANDWAIT": "ask %1 and wait", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "answer", "SENSING_KEYPRESSED": "key %1 pressed?", "SENSING_MOUSEDOWN": "mouse down?", "SENSING_MOUSEX": "mouse x", "SENSING_MOUSEY": "mouse y", "SENSING_SETDRAGMODE": "set drag mode %1", "SENSING_SETDRAGMODE_DRAGGABLE": "draggable", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "not draggable", "SENSING_LOUDNESS": "loudness", "SENSING_LOUD": "loud?", "SENSING_TIMER": "timer", "SENSING_RESETTIMER": "reset timer", "SENSING_OF": "%1 of %2", "SENSING_OF_XPOSITION": "x position", "SENSING_OF_YPOSITION": "y position", "SENSING_OF_DIRECTION": "direction", "SENSING_OF_COSTUMENUMBER": "costume #", "SENSING_OF_COSTUMENAME": "costume name", "SENSING_OF_SIZE": "size", "SENSING_OF_VOLUME": "volume", "SENSING_OF_BACKDROPNUMBER": "backdrop #", "SENSING_OF_BACKDROPNAME": "backdrop name", "SENSING_OF_STAGE": "Stage", "SENSING_CURRENT": "current %1", "SENSING_CURRENT_YEAR": "year", "SENSING_CURRENT_MONTH": "month", "SENSING_CURRENT_DATE": "date", "SENSING_CURRENT_DAYOFWEEK": "day of week", "SENSING_CURRENT_HOUR": "hour", "SENSING_CURRENT_MINUTE": "minute", "SENSING_CURRENT_SECOND": "second", "SENSING_DAYSSINCE2000": "days since 2000", "SENSING_USERNAME": "username", "SENSING_USERID": "user id", "SOUND_PLAY": "start sound %1", "SOUND_PLAYUNTILDONE": "play sound %1 until done", "SOUND_STOPALLSOUNDS": "stop all sounds", "SOUND_SETEFFECTO": "set %1 effect to %2", "SOUND_CHANGEEFFECTBY": "change %1 effect by %2", "SOUND_CLEAREFFECTS": "clear sound effects", "SOUND_EFFECTS_PITCH": "pitch", "SOUND_EFFECTS_PAN": "pan left/right", "SOUND_CHANGEVOLUMEBY": "change volume by %1", "SOUND_SETVOLUMETO": "set volume to %1%", "SOUND_VOLUME": "volume", "CATEGORY_MOTION": "Motion", "CATEGORY_LOOKS": "Looks", "CATEGORY_SOUND": "Sound", "CATEGORY_EVENTS": "Events", "CATEGORY_CONTROL": "Control", "CATEGORY_SENSING": "Sensing", "CATEGORY_OPERATORS": "Operators", "CATEGORY_VARIABLES": "Variables", "CATEGORY_MYBLOCKS": "My Blocks", "DUPLICATE": "Duplicate", "DELETE": "Delete", "ADD_COMMENT": "Add Comment", "REMOVE_COMMENT": "Remove Comment", "DELETE_BLOCK": "Delete Block", "DELETE_X_BLOCKS": "Delete %1 Blocks", "DELETE_ALL_BLOCKS": "Delete all %1 blocks?", "CLEAN_UP": "Clean up Blocks", "HELP": "Help", "UNDO": "Undo", "REDO": "Redo", "EDIT_PROCEDURE": "Edit", "SHOW_PROCEDURE_DEFINITION": "Go to definition", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Say something...", "COLOUR_HUE_LABEL": "Color", "COLOUR_SATURATION_LABEL": "Saturation", "COLOUR_BRIGHTNESS_LABEL": "Brightness", "CHANGE_VALUE_TITLE": "Change value:", "RENAME_VARIABLE": "Rename variable", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Rename Variable", "NEW_VARIABLE": "Make a Variable", "NEW_VARIABLE_TITLE": "New variable name:", "VARIABLE_MODAL_TITLE": "New Variable", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Make a Block", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Make a List", "NEW_LIST_TITLE": "New list name:", "LIST_MODAL_TITLE": "New List", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Rename List", "NEW_BROADCAST_MESSAGE": "New message", "NEW_BROADCAST_MESSAGE_TITLE": "New message name:", "BROADCAST_MODAL_TITLE": "New Message", "DEFAULT_BROADCAST_MESSAGE_NAME": "message1" }; Blockly.ScratchMsgs.locales["es-419"] = { "CONTROL_FOREVER": "por siempre", "CONTROL_REPEAT": "repetir %1", "CONTROL_IF": "si %1 entonces", "CONTROL_ELSE": "si no", "CONTROL_STOP": "detener", "CONTROL_STOP_ALL": "todos", "CONTROL_STOP_THIS": "este programa", "CONTROL_STOP_OTHER": "otros programas en el objeto", "CONTROL_WAIT": "esperar %1 segundos", "CONTROL_WAITUNTIL": "esperar hasta que %1", "CONTROL_REPEATUNTIL": "repetir hasta que %1", "CONTROL_WHILE": "Mientras %1", "CONTROL_FOREACH": "para cada %1 en %2", "CONTROL_STARTASCLONE": "al comenzar como clon", "CONTROL_CREATECLONEOF": "crear clon de %1", "CONTROL_CREATECLONEOF_MYSELF": "mí mismo", "CONTROL_DELETETHISCLONE": "borrar este clon", "CONTROL_COUNTER": "contador", "CONTROL_INCRCOUNTER": "incrementar contador", "CONTROL_CLEARCOUNTER": "borrar contador", "CONTROL_ALLATONCE": "todos a la vez", "DATA_SETVARIABLETO": "establecer %1 a %2", "DATA_CHANGEVARIABLEBY": "Cambiar %1 por %2", "DATA_SHOWVARIABLE": "mostrar variable %1", "DATA_HIDEVARIABLE": "esconder variable %1", "DATA_ADDTOLIST": "añadir %1 a %2", "DATA_DELETEOFLIST": "borrar %1 de %2", "DATA_INSERTATLIST": "insertar %1 en %2 de %3", "DATA_REPLACEITEMOFLIST": "reemplazar elemento %1 de %2 con %3", "DATA_ITEMOFLIST": "elemento %1 de %2", "DATA_LENGTHOFLIST": "longitud de %1", "DATA_LISTCONTAINSITEM": "¿%1 contiene %2?", "DATA_SHOWLIST": "mostrar lista %1", "DATA_HIDELIST": "esconder lista %1", "DATA_INDEX_ALL": "todos", "DATA_INDEX_LAST": "último", "DATA_INDEX_RANDOM": "al azar", "EVENT_WHENFLAGCLICKED": "al hacer clic en %1", "EVENT_WHENTHISSPRITECLICKED": "al hacer clic en este objeto", "EVENT_WHENSTAGECLICKED": "al hacer clic en el escenario", "EVENT_WHENTOUCHINGOBJECT": "cuando este objeto toca %1", "EVENT_WHENBROADCASTRECEIVED": "al recibir %1", "EVENT_WHENBACKDROPSWITCHESTO": "cuando el fondo cambie a %1", "EVENT_WHENGREATERTHAN": "cuando %1 sea > %2", "EVENT_WHENGREATERTHAN_TIMER": "cronómetro", "EVENT_BROADCAST": "enviar %1", "EVENT_BROADCASTANDWAIT": "enviar %1 y esperar", "EVENT_WHENKEYPRESSED": "al presionar tecla %1", "EVENT_WHENKEYPRESSED_SPACE": "Espacio", "EVENT_WHENKEYPRESSED_LEFT": "Flecha izquierda", "EVENT_WHENKEYPRESSED_RIGHT": "Flecha Derecha", "EVENT_WHENKEYPRESSED_DOWN": "Flecha abajo", "EVENT_WHENKEYPRESSED_UP": "Flecha arriba", "EVENT_WHENKEYPRESSED_ANY": "Cualquiera", "LOOKS_SAYFORSECS": "decir %1 por %2 segundos", "LOOKS_SAY": "decir %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "pensar %1 por %2 segundos", "LOOKS_THINK": "pensar %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "Mostrar", "LOOKS_HIDE": "Ocultar", "LOOKS_HIDEALLSPRITES": "esconder todos los disfraces", "LOOKS_EFFECT_COLOR": "Color", "LOOKS_EFFECT_FISHEYE": "ojo de pez", "LOOKS_EFFECT_WHIRL": "remolino", "LOOKS_EFFECT_PIXELATE": "pixelar", "LOOKS_EFFECT_MOSAIC": "mosaico", "LOOKS_EFFECT_BRIGHTNESS": "brillo", "LOOKS_EFFECT_GHOST": "desvanecer", "LOOKS_CHANGEEFFECTBY": "cambiar efecto %1 por %2", "LOOKS_SETEFFECTTO": "establecer efecto %1 a %2", "LOOKS_CLEARGRAPHICEFFECTS": "quitar efectos gráficos", "LOOKS_CHANGESIZEBY": "cambiar tamaño en %1", "LOOKS_SETSIZETO": "fijar tamaño a %1 %", "LOOKS_SIZE": "tamaño", "LOOKS_CHANGESTRETCHBY": "cambiar estiramiento por %1", "LOOKS_SETSTRETCHTO": "fijar estiramiento a %1 %", "LOOKS_SWITCHCOSTUMETO": "cambiar disfraz a %1", "LOOKS_NEXTCOSTUME": "siguiente disfraz", "LOOKS_SWITCHBACKDROPTO": "cambiar fondo a %1", "LOOKS_GOTOFRONTBACK": "ir a la capa %1 ", "LOOKS_GOTOFRONTBACK_FRONT": "del frente", "LOOKS_GOTOFRONTBACK_BACK": "de atrás", "LOOKS_GOFORWARDBACKWARDLAYERS": "ir %1 %2 capas", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "adelante", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "atrás", "LOOKS_BACKDROPNUMBERNAME": "fondo %1", "LOOKS_COSTUMENUMBERNAME": "# de disfraz %1", "LOOKS_NUMBERNAME_NUMBER": "número", "LOOKS_NUMBERNAME_NAME": "nombre", "LOOKS_SWITCHBACKDROPTOANDWAIT": "cambiar fondo a %1 y esperar", "LOOKS_NEXTBACKDROP": "siguiente fondo", "LOOKS_PREVIOUSBACKDROP": "fondo anterior", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "mover %1 pasos", "MOTION_TURNLEFT": "girar %1 %2 grados", "MOTION_TURNRIGHT": "girar %1 %2 grados", "MOTION_POINTINDIRECTION": "apuntar en dirección %1", "MOTION_POINTTOWARDS": "apuntar hacia %1", "MOTION_POINTTOWARDS_POINTER": "puntero del ratón", "MOTION_GOTO": "ir a %1", "MOTION_GOTO_POINTER": "puntero del ratón", "MOTION_GOTO_RANDOM": "posición aleatoria", "MOTION_GOTOXY": "ir a x: %1 y: %2", "MOTION_GLIDESECSTOXY": "deslizar en %1 segs a x: %2 y: %3", "MOTION_GLIDETO": "deslizar en %1 segs a x: %2", "MOTION_GLIDETO_POINTER": "puntero del ratón", "MOTION_GLIDETO_RANDOM": "posición aleatoria", "MOTION_CHANGEXBY": "cambiar x en %1", "MOTION_SETX": "fijar x a %1", "MOTION_CHANGEYBY": "cambiar y en %1", "MOTION_SETY": "fijar y a %1", "MOTION_IFONEDGEBOUNCE": "rebotar si toca un borde", "MOTION_SETROTATIONSTYLE": "fijar estilo de rotación %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "izquierda-derecha", "MOTION_SETROTATIONSTYLE_DONTROTATE": "no rotar", "MOTION_SETROTATIONSTYLE_ALLAROUND": "en todas direcciones", "MOTION_XPOSITION": "posición en x", "MOTION_YPOSITION": "posición en y", "MOTION_DIRECTION": "dirección", "MOTION_SCROLLRIGHT": "desplazar a la derecha %1", "MOTION_SCROLLUP": "desplazar arriba %1", "MOTION_ALIGNSCENE": "alinear escena %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "abajo-izquierda", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "abajo-derecha", "MOTION_ALIGNSCENE_MIDDLE": "medio", "MOTION_ALIGNSCENE_TOPLEFT": "arriba-izquierda", "MOTION_ALIGNSCENE_TOPRIGHT": "arriba-derecha", "MOTION_XSCROLL": "desplazar x", "MOTION_YSCROLL": "desplazar y", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "número al azar entre %1 y %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 y %2", "OPERATORS_OR": "%1 o %2", "OPERATORS_NOT": "no %1", "OPERATORS_JOIN": "unir %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "letra %1 de %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "longitud de %1", "OPERATORS_CONTAINS": "%1 contiene %2?", "OPERATORS_MOD": "%1 mod %2", "OPERATORS_ROUND": "redondear %1", "OPERATORS_MATHOP": "%1 de %2", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "piso", "OPERATORS_MATHOP_CEILING": "techo", "OPERATORS_MATHOP_SQRT": "raíz cuadrada", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "En", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "definir %1", "SENSING_TOUCHINGOBJECT": "tocando %1?", "SENSING_TOUCHINGOBJECT_POINTER": "puntero del ratón", "SENSING_TOUCHINGOBJECT_EDGE": "borde", "SENSING_TOUCHINGCOLOR": "¿tocando el color %1?", "SENSING_COLORISTOUCHINGCOLOR": "¿color %1 está tocando %2?", "SENSING_DISTANCETO": "distancia a %1", "SENSING_DISTANCETO_POINTER": "puntero del ratón", "SENSING_ASKANDWAIT": "preguntar %1 y esperar", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "respuesta", "SENSING_KEYPRESSED": "¿tecla %1 presionada?", "SENSING_MOUSEDOWN": "¿ratón presionado?", "SENSING_MOUSEX": "posición x del ratón", "SENSING_MOUSEY": "posición y del ratón", "SENSING_SETDRAGMODE": "fijar modo de arrastre a %1", "SENSING_SETDRAGMODE_DRAGGABLE": "arrastrable", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "no arrastrable", "SENSING_LOUDNESS": "intensidad del sonido", "SENSING_LOUD": "Muy fuerte?", "SENSING_TIMER": "cronómetro", "SENSING_RESETTIMER": "reiniciar cronómetro", "SENSING_OF": "%1 de %2", "SENSING_OF_XPOSITION": "posición en x", "SENSING_OF_YPOSITION": "posición en y", "SENSING_OF_DIRECTION": "dirección", "SENSING_OF_COSTUMENUMBER": "# de disfraz", "SENSING_OF_COSTUMENAME": "nombre del disfraz", "SENSING_OF_SIZE": "tamaño", "SENSING_OF_VOLUME": "volumen", "SENSING_OF_BACKDROPNUMBER": "# de fondo", "SENSING_OF_BACKDROPNAME": "nombre de fondo", "SENSING_OF_STAGE": "Escenario", "SENSING_CURRENT": "%1 actual", "SENSING_CURRENT_YEAR": "año", "SENSING_CURRENT_MONTH": "mes", "SENSING_CURRENT_DATE": "fecha", "SENSING_CURRENT_DAYOFWEEK": "día de la semana", "SENSING_CURRENT_HOUR": "hora", "SENSING_CURRENT_MINUTE": "minuto", "SENSING_CURRENT_SECOND": "segundo", "SENSING_DAYSSINCE2000": "días desde el 2000", "SENSING_USERNAME": "nombre de usuario", "SENSING_USERID": "Identificación de usuario", "SOUND_PLAY": "comenzar sonido %1", "SOUND_PLAYUNTILDONE": "tocar sonido %1 hasta terminar", "SOUND_STOPALLSOUNDS": "detener todos los sonidos", "SOUND_SETEFFECTO": "establecer efecto %1 a %2", "SOUND_CHANGEEFFECTBY": "cambiar efecto %1 por %2", "SOUND_CLEAREFFECTS": "borrar efectos de sonido", "SOUND_EFFECTS_PITCH": "altura", "SOUND_EFFECTS_PAN": "panel izquierda/derecha", "SOUND_CHANGEVOLUMEBY": "cambiar volumen por %1", "SOUND_SETVOLUMETO": "fijar volumen a %1%", "SOUND_VOLUME": "volumen", "CATEGORY_MOTION": "Movimiento", "CATEGORY_LOOKS": "Apariencia", "CATEGORY_SOUND": "Sonido", "CATEGORY_EVENTS": "Eventos", "CATEGORY_CONTROL": "Control", "CATEGORY_SENSING": "Sensores", "CATEGORY_OPERATORS": "Operadores", "CATEGORY_VARIABLES": "Variables", "CATEGORY_MYBLOCKS": "Mis Bloques", "DUPLICATE": "Duplicar", "DELETE": "Borrar", "ADD_COMMENT": "Agregar comentario", "REMOVE_COMMENT": "Eliminar comentario", "DELETE_BLOCK": "Eliminar bloque", "DELETE_X_BLOCKS": "Eliminar bloque %1", "DELETE_ALL_BLOCKS": "¿Eliminar todos los bloques %1?", "CLEAN_UP": "Limpiar bloques", "HELP": "Ayuda", "UNDO": "Deshacer", "REDO": "Rehacer", "EDIT_PROCEDURE": "Editar", "SHOW_PROCEDURE_DEFINITION": "Ir a la definición", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Decir algo...", "COLOUR_HUE_LABEL": "Color", "COLOUR_SATURATION_LABEL": "Saturación", "COLOUR_BRIGHTNESS_LABEL": "Brillo", "CHANGE_VALUE_TITLE": "Cambiar valor:", "RENAME_VARIABLE": "Renombrar variable", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Renombrar variable", "NEW_VARIABLE": "Crear una variable", "NEW_VARIABLE_TITLE": "Nuevo nombre de variable:", "VARIABLE_MODAL_TITLE": "Variable nueva", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Crear un bloque", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Crear una lista", "NEW_LIST_TITLE": "Nombre para nueva lista:", "LIST_MODAL_TITLE": "Lista nueva", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Renombrar lista", "NEW_BROADCAST_MESSAGE": "Nuevo mensaje", "NEW_BROADCAST_MESSAGE_TITLE": "Nombre para el nuevo mensaje:", "BROADCAST_MODAL_TITLE": "Nuevo Mensaje", "DEFAULT_BROADCAST_MESSAGE_NAME": "mensaje1" }; Blockly.ScratchMsgs.locales["es"] = { "CONTROL_FOREVER": "por siempre", "CONTROL_REPEAT": "repetir %1", "CONTROL_IF": "si %1 entonces", "CONTROL_ELSE": "si no", "CONTROL_STOP": "detener", "CONTROL_STOP_ALL": "todos", "CONTROL_STOP_THIS": "este script", "CONTROL_STOP_OTHER": "otros scripts en el sprite", "CONTROL_WAIT": "esperar %1 segundos", "CONTROL_WAITUNTIL": "esperar hasta que %1", "CONTROL_REPEATUNTIL": "repetir hasta que %1", "CONTROL_WHILE": "mientras %1", "CONTROL_FOREACH": "para cada %1 de %2", "CONTROL_STARTASCLONE": "al comenzar como clon", "CONTROL_CREATECLONEOF": "crear clon de %1", "CONTROL_CREATECLONEOF_MYSELF": "mí mismo", "CONTROL_DELETETHISCLONE": "borrar este clon", "CONTROL_COUNTER": "contador", "CONTROL_INCRCOUNTER": "incrementar contador", "CONTROL_CLEARCOUNTER": "borrar contador", "CONTROL_ALLATONCE": "todo de una vez", "DATA_SETVARIABLETO": "dar a %1 el valor %2", "DATA_CHANGEVARIABLEBY": "sumar a %1 %2", "DATA_SHOWVARIABLE": "mostrar variable %1", "DATA_HIDEVARIABLE": "ocultar variable %1", "DATA_ADDTOLIST": "añadir %1 a %2", "DATA_DELETEOFLIST": "eliminar %1 de %2", "DATA_INSERTATLIST": "insertar %1 en %2 de %3", "DATA_REPLACEITEMOFLIST": "reemplazar elemento %1 de %2 con %3", "DATA_ITEMOFLIST": "elemento %1 de %2", "DATA_LENGTHOFLIST": "longitud de %1", "DATA_LISTCONTAINSITEM": "¿%2 está en %1?", "DATA_SHOWLIST": "mostrar lista %1", "DATA_HIDELIST": "esconder lista %1", "DATA_INDEX_ALL": "todos", "DATA_INDEX_LAST": "último", "DATA_INDEX_RANDOM": "al azar", "EVENT_WHENFLAGCLICKED": "al hacer clic en %1", "EVENT_WHENTHISSPRITECLICKED": "al hacer clic en este objeto", "EVENT_WHENSTAGECLICKED": "al hacer clic en el escenario", "EVENT_WHENTOUCHINGOBJECT": "cuando el objeto toque %1", "EVENT_WHENBROADCASTRECEIVED": "al recibir %1", "EVENT_WHENBACKDROPSWITCHESTO": "cuando el fondo cambie a %1", "EVENT_WHENGREATERTHAN": "cuando %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "cronómetro", "EVENT_BROADCAST": "enviar %1", "EVENT_BROADCASTANDWAIT": "enviar %1 y esperar", "EVENT_WHENKEYPRESSED": "al presionar tecla %1", "EVENT_WHENKEYPRESSED_SPACE": "espacio", "EVENT_WHENKEYPRESSED_LEFT": "flecha izquierda", "EVENT_WHENKEYPRESSED_RIGHT": "flecha derecha", "EVENT_WHENKEYPRESSED_DOWN": "flecha abajo", "EVENT_WHENKEYPRESSED_UP": "flecha arriba", "EVENT_WHENKEYPRESSED_ANY": "cualquiera", "LOOKS_SAYFORSECS": "decir %1 durante %2 segundos", "LOOKS_SAY": "decir %1", "LOOKS_HELLO": "¡Hola!", "LOOKS_THINKFORSECS": "pensar %1 durante %2 segundos", "LOOKS_THINK": "pensar %1", "LOOKS_HMM": "Umm...", "LOOKS_SHOW": "mostrar", "LOOKS_HIDE": "esconder", "LOOKS_HIDEALLSPRITES": "esconder todos los objetos", "LOOKS_EFFECT_COLOR": "color", "LOOKS_EFFECT_FISHEYE": "ojo de pez", "LOOKS_EFFECT_WHIRL": "remolino", "LOOKS_EFFECT_PIXELATE": "pixelizar", "LOOKS_EFFECT_MOSAIC": "mosaico", "LOOKS_EFFECT_BRIGHTNESS": "brillo", "LOOKS_EFFECT_GHOST": "desvanecer", "LOOKS_CHANGEEFFECTBY": "sumar al efecto %1 %2", "LOOKS_SETEFFECTTO": "dar al efecto %1 el valor %2", "LOOKS_CLEARGRAPHICEFFECTS": "quitar efectos gráficos", "LOOKS_CHANGESIZEBY": "cambiar tamaño por %1", "LOOKS_SETSIZETO": "fijar tamaño al %1 %", "LOOKS_SIZE": "tamaño", "LOOKS_CHANGESTRETCHBY": "sumar al estiramiento %1", "LOOKS_SETSTRETCHTO": "fijar estiramiento al %1 %", "LOOKS_SWITCHCOSTUMETO": "cambiar disfraz a %1", "LOOKS_NEXTCOSTUME": "siguiente disfraz", "LOOKS_SWITCHBACKDROPTO": "cambiar fondo a %1", "LOOKS_GOTOFRONTBACK": "ir a capa %1", "LOOKS_GOTOFRONTBACK_FRONT": "delantera", "LOOKS_GOTOFRONTBACK_BACK": "trasera", "LOOKS_GOFORWARDBACKWARDLAYERS": "ir %2 capas hacia %1", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "delante", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "atrás", "LOOKS_BACKDROPNUMBERNAME": "%1 del fondo", "LOOKS_COSTUMENUMBERNAME": "%1 de disfraz", "LOOKS_NUMBERNAME_NUMBER": "número", "LOOKS_NUMBERNAME_NAME": "nombre", "LOOKS_SWITCHBACKDROPTOANDWAIT": "cambiar fondo a %1 y esperar", "LOOKS_NEXTBACKDROP": "siguiente fondo", "LOOKS_PREVIOUSBACKDROP": "fondo anterior", "LOOKS_RANDOMBACKDROP": "telón de fondo aleatorio", "MOTION_MOVESTEPS": "mover %1 pasos", "MOTION_TURNLEFT": "girar %1 %2 grados", "MOTION_TURNRIGHT": "girar %1 %2 grados", "MOTION_POINTINDIRECTION": "apuntar en dirección %1", "MOTION_POINTTOWARDS": "apuntar hacia %1", "MOTION_POINTTOWARDS_POINTER": "puntero del ratón", "MOTION_GOTO": "ir a %1", "MOTION_GOTO_POINTER": "puntero del ratón", "MOTION_GOTO_RANDOM": "posición aleatoria", "MOTION_GOTOXY": "ir a x: %1 y: %2", "MOTION_GLIDESECSTOXY": "deslizar en %1 segs a x: %2 y: %3", "MOTION_GLIDETO": "deslizar en %1 segs a %2", "MOTION_GLIDETO_POINTER": "puntero del ratón", "MOTION_GLIDETO_RANDOM": "posición aleatoria", "MOTION_CHANGEXBY": "sumar a x %1", "MOTION_SETX": "dar a x el valor %1", "MOTION_CHANGEYBY": "sumar a y %1", "MOTION_SETY": "dar a y el valor %1", "MOTION_IFONEDGEBOUNCE": "si toca un borde, rebotar", "MOTION_SETROTATIONSTYLE": "fijar estilo de rotación a %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "izquierda-derecha", "MOTION_SETROTATIONSTYLE_DONTROTATE": "no rotar", "MOTION_SETROTATIONSTYLE_ALLAROUND": "en todas direcciones", "MOTION_XPOSITION": "posición en x", "MOTION_YPOSITION": "posición en y", "MOTION_DIRECTION": "dirección", "MOTION_SCROLLRIGHT": "desplazar a la derecha %1", "MOTION_SCROLLUP": "desplazar arriba %1", "MOTION_ALIGNSCENE": "alinear escena %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "abajo a la izquierda", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "abajo a la derecha", "MOTION_ALIGNSCENE_MIDDLE": "al centro", "MOTION_ALIGNSCENE_TOPLEFT": "arriba a la izquierda", "MOTION_ALIGNSCENE_TOPRIGHT": "arriba a la derecha", "MOTION_XSCROLL": "desplazamiento en x", "MOTION_YSCROLL": "desplazamiento en y", "MOTION_STAGE_SELECTED": "Escenario seleccionado: sin bloques de movimiento", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "número aleatorio entre %1 y %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 y %2", "OPERATORS_OR": "%1 o %2", "OPERATORS_NOT": "no %1", "OPERATORS_JOIN": "unir %1 %2", "OPERATORS_JOIN_APPLE": "manzana", "OPERATORS_JOIN_BANANA": "plátano", "OPERATORS_LETTEROF": "letra %1 de %2", "OPERATORS_LETTEROF_APPLE": "un", "OPERATORS_LENGTH": "longitud de %1", "OPERATORS_CONTAINS": "¿%2 está en %1?", "OPERATORS_MOD": "%1 módulo %2", "OPERATORS_ROUND": "redondear %1", "OPERATORS_MATHOP": "%1 de %2", "OPERATORS_MATHOP_ABS": "valor absoluto", "OPERATORS_MATHOP_FLOOR": "suelo", "OPERATORS_MATHOP_CEILING": "techo", "OPERATORS_MATHOP_SQRT": "raíz cuadrada", "OPERATORS_MATHOP_SIN": "sen", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "arcsen", "OPERATORS_MATHOP_ACOS": "arccos", "OPERATORS_MATHOP_ATAN": "arctan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "definir %1", "SENSING_TOUCHINGOBJECT": "¿tocando %1?", "SENSING_TOUCHINGOBJECT_POINTER": "puntero del ratón", "SENSING_TOUCHINGOBJECT_EDGE": "borde", "SENSING_TOUCHINGCOLOR": "¿tocando el color %1?", "SENSING_COLORISTOUCHINGCOLOR": "¿color %1 tocando %2?", "SENSING_DISTANCETO": "distancia a %1", "SENSING_DISTANCETO_POINTER": "puntero del ratón", "SENSING_ASKANDWAIT": "preguntar %1 y esperar", "SENSING_ASK_TEXT": "¿Cuál es tu nombre?", "SENSING_ANSWER": "respuesta", "SENSING_KEYPRESSED": "¿tecla %1 presionada?", "SENSING_MOUSEDOWN": "¿ratón presionado?", "SENSING_MOUSEX": "posición x del ratón", "SENSING_MOUSEY": "posición y del ratón", "SENSING_SETDRAGMODE": "fijar modo de arrastre a %1", "SENSING_SETDRAGMODE_DRAGGABLE": "arrastrable", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "no arrastrable", "SENSING_LOUDNESS": "volumen del sonido", "SENSING_LOUD": "¿ruidoso?", "SENSING_TIMER": "cronómetro", "SENSING_RESETTIMER": "reiniciar cronómetro", "SENSING_OF": "%1 de %2", "SENSING_OF_XPOSITION": "posición en x", "SENSING_OF_YPOSITION": "posición en y", "SENSING_OF_DIRECTION": "dirección", "SENSING_OF_COSTUMENUMBER": "disfraz #", "SENSING_OF_COSTUMENAME": "nombre del disfraz", "SENSING_OF_SIZE": "tamaño", "SENSING_OF_VOLUME": "volumen", "SENSING_OF_BACKDROPNUMBER": "# del fondo", "SENSING_OF_BACKDROPNAME": "nombre del fondo", "SENSING_OF_STAGE": "Escenario", "SENSING_CURRENT": "%1 actual", "SENSING_CURRENT_YEAR": "año", "SENSING_CURRENT_MONTH": "mes", "SENSING_CURRENT_DATE": "día", "SENSING_CURRENT_DAYOFWEEK": "día de la semana", "SENSING_CURRENT_HOUR": "hora", "SENSING_CURRENT_MINUTE": "minuto", "SENSING_CURRENT_SECOND": "segundo", "SENSING_DAYSSINCE2000": "días desde el 2000", "SENSING_USERNAME": "nombre de usuario", "SENSING_USERID": "id de usuario", "SOUND_PLAY": "iniciar sonido %1", "SOUND_PLAYUNTILDONE": "tocar sonido %1 hasta que termine", "SOUND_STOPALLSOUNDS": "detener todos los sonidos", "SOUND_SETEFFECTO": "dar al efecto %1 el valor %2", "SOUND_CHANGEEFFECTBY": "sumar al efecto %1 %2", "SOUND_CLEAREFFECTS": "quitar efectos de sonido", "SOUND_EFFECTS_PITCH": "altura", "SOUND_EFFECTS_PAN": "balance izquierda/derecha", "SOUND_CHANGEVOLUMEBY": "cambiar volumen por %1", "SOUND_SETVOLUMETO": "fijar volumen a %1%", "SOUND_VOLUME": "volumen", "CATEGORY_MOTION": "Movimiento", "CATEGORY_LOOKS": "Apariencia", "CATEGORY_SOUND": "Sonido", "CATEGORY_EVENTS": "Eventos", "CATEGORY_CONTROL": "Control", "CATEGORY_SENSING": "Sensores", "CATEGORY_OPERATORS": "Operadores", "CATEGORY_VARIABLES": "Variables", "CATEGORY_MYBLOCKS": "Mis bloques", "DUPLICATE": "Duplicar", "DELETE": "Borrar", "ADD_COMMENT": "Añadir comentario", "REMOVE_COMMENT": "Eliminar comentario", "DELETE_BLOCK": "Borrar bloque", "DELETE_X_BLOCKS": "Borrar %1 bloques", "DELETE_ALL_BLOCKS": "¿Borrar los %1 bloques?", "CLEAN_UP": "Limpiar bloques", "HELP": "Ayuda", "UNDO": "Deshacer", "REDO": "Rehacer", "EDIT_PROCEDURE": "Editar", "SHOW_PROCEDURE_DEFINITION": "Ir a definición", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Decir algo...", "COLOUR_HUE_LABEL": "Color", "COLOUR_SATURATION_LABEL": "Saturación", "COLOUR_BRIGHTNESS_LABEL": "Brillo", "CHANGE_VALUE_TITLE": "Cambiar valor:", "RENAME_VARIABLE": "Renombrar variable", "RENAME_VARIABLE_TITLE": "Renombrar todas las variables '%1' por:", "RENAME_VARIABLE_MODAL_TITLE": "Renombrar variable", "NEW_VARIABLE": "Crear una variable", "NEW_VARIABLE_TITLE": "Nuevo nombre de variable:", "VARIABLE_MODAL_TITLE": "Nueva variable", "VARIABLE_ALREADY_EXISTS": "Una variable llamada \"%1\" ya existe.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Una variable llamada \"%1\" ya existe para otra variable de tipo \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "¿Eliminar \"%1\" usos de la variable \"%2\"?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "No se puede borrar la variable \"%1\" porque es parte de la definición de la función \"%2\"", "DELETE_VARIABLE": "Borrar la variable \"%1\"", "NEW_PROCEDURE": "Crear un bloque", "PROCEDURE_ALREADY_EXISTS": "Un procedimiento llamado \"%1\" ya existe.", "NEW_LIST": "Crear una lista", "NEW_LIST_TITLE": "Nuevo nombre de lista:", "LIST_MODAL_TITLE": "Lista nueva", "LIST_ALREADY_EXISTS": "Una lista llamada \"%1\" ya existe.", "RENAME_LIST_TITLE": "Renombrar de todas las listas \"%1\" por:", "RENAME_LIST_MODAL_TITLE": "Renombrar lista", "NEW_BROADCAST_MESSAGE": "Nuevo mensaje", "NEW_BROADCAST_MESSAGE_TITLE": "Nuevo nombre de mensaje:", "BROADCAST_MODAL_TITLE": "Nuevo Mensaje", "DEFAULT_BROADCAST_MESSAGE_NAME": "mensaje1" }; Blockly.ScratchMsgs.locales["fi"] = { "CONTROL_FOREVER": "ikuisesti", "CONTROL_REPEAT": "toista %1 kertaa", "CONTROL_IF": "jos %1, niin", "CONTROL_ELSE": "tai muuten", "CONTROL_STOP": "pysäytä", "CONTROL_STOP_ALL": "kaikki", "CONTROL_STOP_THIS": "tämä skripti", "CONTROL_STOP_OTHER": "hahmon muut skriptit", "CONTROL_WAIT": "odota %1 sekuntia", "CONTROL_WAITUNTIL": "odota kunnes %1", "CONTROL_REPEATUNTIL": "toista kunnes %1", "CONTROL_WHILE": "kun %1", "CONTROL_FOREACH": "jokainen %1 joukossa %2", "CONTROL_STARTASCLONE": "kun aloitan kloonina", "CONTROL_CREATECLONEOF": "luo klooni hahmosta %1", "CONTROL_CREATECLONEOF_MYSELF": "minä itse", "CONTROL_DELETETHISCLONE": "poista tämä klooni", "CONTROL_COUNTER": "laskuri", "CONTROL_INCRCOUNTER": "lisäyslaskuri", "CONTROL_CLEARCOUNTER": "nollaa laskuri", "CONTROL_ALLATONCE": "kaikki kerralla", "DATA_SETVARIABLETO": "aseta %1 arvoon %2", "DATA_CHANGEVARIABLEBY": "lisää muuttujaan %1 arvo %2", "DATA_SHOWVARIABLE": "näytä muuttuja %1", "DATA_HIDEVARIABLE": "piilota muuttuja %1", "DATA_ADDTOLIST": "lisää %1 listaan %2", "DATA_DELETEOFLIST": "poista %1 listasta %2", "DATA_INSERTATLIST": "lisää %1 kohtaan %2 listassa %3", "DATA_REPLACEITEMOFLIST": "korvaa listan %2 kohdan %1 arvo arvolla %3", "DATA_ITEMOFLIST": "listan %2 alkio %1", "DATA_LENGTHOFLIST": "listan %1 pituus", "DATA_LISTCONTAINSITEM": "%1 sisältää %2?", "DATA_SHOWLIST": "näytä lista %1", "DATA_HIDELIST": "piilota lista %1", "DATA_INDEX_ALL": "kaikki", "DATA_INDEX_LAST": "viimeinen", "DATA_INDEX_RANDOM": "satunnainen", "EVENT_WHENFLAGCLICKED": "kun klikataan %1", "EVENT_WHENTHISSPRITECLICKED": "kun tätä hahmoa klikataan", "EVENT_WHENSTAGECLICKED": "kun esiintymislavaa klikataan", "EVENT_WHENTOUCHINGOBJECT": "kun tämä hahmo koskettaa %1", "EVENT_WHENBROADCASTRECEIVED": "kun vastaanotan %1", "EVENT_WHENBACKDROPSWITCHESTO": "kun taustaksi vaihtuu %1", "EVENT_WHENGREATERTHAN": "kun %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "ajastin", "EVENT_BROADCAST": "lähetä %1", "EVENT_BROADCASTANDWAIT": "lähetä %1 ja odota", "EVENT_WHENKEYPRESSED": "kun painetaan %1", "EVENT_WHENKEYPRESSED_SPACE": "välilyönti", "EVENT_WHENKEYPRESSED_LEFT": "nuoli vasemmalle", "EVENT_WHENKEYPRESSED_RIGHT": "nuoli oikealle", "EVENT_WHENKEYPRESSED_DOWN": "nuoli alas", "EVENT_WHENKEYPRESSED_UP": "nuoli ylös", "EVENT_WHENKEYPRESSED_ANY": "mikä tahansa", "LOOKS_SAYFORSECS": "sano %1 %2 sekunnin ajan", "LOOKS_SAY": "sano %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "ajattele %1 %2 sekunnin ajan", "LOOKS_THINK": "ajattele %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "näytä", "LOOKS_HIDE": "piilota", "LOOKS_HIDEALLSPRITES": "piilota kaikki hahmot", "LOOKS_EFFECT_COLOR": "väri", "LOOKS_EFFECT_FISHEYE": "kalansilmä", "LOOKS_EFFECT_WHIRL": "pyörre", "LOOKS_EFFECT_PIXELATE": "pikselöi", "LOOKS_EFFECT_MOSAIC": "mosaiikki", "LOOKS_EFFECT_BRIGHTNESS": "kirkkaus", "LOOKS_EFFECT_GHOST": "haamu", "LOOKS_CHANGEEFFECTBY": " lisää tehosteeseen %1 arvo %2", "LOOKS_SETEFFECTTO": "aseta tehoste %1 arvoon %2", "LOOKS_CLEARGRAPHICEFFECTS": "poista graafiset tehosteet", "LOOKS_CHANGESIZEBY": "kasvata kokoa arvolla %1", "LOOKS_SETSIZETO": "aseta koko arvoon %1", "LOOKS_SIZE": "koko", "LOOKS_CHANGESTRETCHBY": "lisää venytystä arvolla %1", "LOOKS_SETSTRETCHTO": "aseta venytys arvoon %1 %", "LOOKS_SWITCHCOSTUMETO": "vaihda asusteeksi %1", "LOOKS_NEXTCOSTUME": "seuraava asuste", "LOOKS_SWITCHBACKDROPTO": "vaihda taustaksi %1", "LOOKS_GOTOFRONTBACK": "mene %1 alalle", "LOOKS_GOTOFRONTBACK_FRONT": "etu", "LOOKS_GOTOFRONTBACK_BACK": "taka", "LOOKS_GOFORWARDBACKWARDLAYERS": "mene %2 tasoa %1", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "eteenpäin", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "taaksepäin", "LOOKS_BACKDROPNUMBERNAME": "tausta %1", "LOOKS_COSTUMENUMBERNAME": "asuste %1", "LOOKS_NUMBERNAME_NUMBER": "luku", "LOOKS_NUMBERNAME_NAME": "nimi", "LOOKS_SWITCHBACKDROPTOANDWAIT": "vaihda taustaksi %1 ja odota", "LOOKS_NEXTBACKDROP": "seuraava tausta", "LOOKS_PREVIOUSBACKDROP": "edellinen tausta", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "liiku %1 askelta", "MOTION_TURNLEFT": "käänny %1 %2 astetta", "MOTION_TURNRIGHT": "käänny %1 %2 astetta", "MOTION_POINTINDIRECTION": "osoita suuntaan %1", "MOTION_POINTTOWARDS": "osoita kohti %1", "MOTION_POINTTOWARDS_POINTER": "hiiriosoitin", "MOTION_GOTO": "mene sijaintiin %1", "MOTION_GOTO_POINTER": "hiiriosoitin", "MOTION_GOTO_RANDOM": "satunnainen sijainti", "MOTION_GOTOXY": "mene sijaintiin x: %1 y: %2", "MOTION_GLIDESECSTOXY": "liu'u %1 sekuntia sijaintiin x: %2 y: %3", "MOTION_GLIDETO": "liu'u %1 sekuntia sijaintiin %2", "MOTION_GLIDETO_POINTER": "hiiriosoitin", "MOTION_GLIDETO_RANDOM": "satunnainen sijainti", "MOTION_CHANGEXBY": "lisää x:n arvoon arvo %1", "MOTION_SETX": "aseta x:n arvoksi %1", "MOTION_CHANGEYBY": "lisää y:n arvoon arvo %1", "MOTION_SETY": "aseta y:n arvoksi %1", "MOTION_IFONEDGEBOUNCE": "pomppaa reunasta", "MOTION_SETROTATIONSTYLE": "aseta kiertotyyliksi %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "vasen-oikea", "MOTION_SETROTATIONSTYLE_DONTROTATE": "älä kierrä", "MOTION_SETROTATIONSTYLE_ALLAROUND": "joka suuntaan", "MOTION_XPOSITION": "x-sijainti", "MOTION_YPOSITION": "y-sijainti", "MOTION_DIRECTION": "suunta", "MOTION_SCROLLRIGHT": "kierrä oikealle %1", "MOTION_SCROLLUP": "kierrä ylös %1", "MOTION_ALIGNSCENE": "tasaa näkymä %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "alavasen", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "alaoikea", "MOTION_ALIGNSCENE_MIDDLE": "keskikohta", "MOTION_ALIGNSCENE_TOPLEFT": "ylävasen", "MOTION_ALIGNSCENE_TOPRIGHT": "yläoikea", "MOTION_XSCROLL": "x-kierto", "MOTION_YSCROLL": "y-kierto", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "valitse satunnaisluku väliltä %1 - %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 ja %2", "OPERATORS_OR": "%1 tai %2", "OPERATORS_NOT": "ei %1", "OPERATORS_JOIN": "yhdistä %1 ja %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "%1 kirjain sanasta %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "listan %1 pituus", "OPERATORS_CONTAINS": "%1 sisältää %2?", "OPERATORS_MOD": "lukujen %1 ja %2 jakojäännös", "OPERATORS_ROUND": "pyöristä %1", "OPERATORS_MATHOP": "%1 luvusta %2", "OPERATORS_MATHOP_ABS": "itseisarvo", "OPERATORS_MATHOP_FLOOR": "pyöristä alaspäin", "OPERATORS_MATHOP_CEILING": "pyöristä ylöspäin", "OPERATORS_MATHOP_SQRT": "neliöjuuri", "OPERATORS_MATHOP_SIN": "sini", "OPERATORS_MATHOP_COS": "kosini", "OPERATORS_MATHOP_TAN": "tangentti", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "luonnollinen logaritmi", "OPERATORS_MATHOP_LOG": "10-logaritmi", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "määrittele %1", "SENSING_TOUCHINGOBJECT": "koskettaako %1?", "SENSING_TOUCHINGOBJECT_POINTER": "hiiriosoitin", "SENSING_TOUCHINGOBJECT_EDGE": "reuna", "SENSING_TOUCHINGCOLOR": "koskettaako väriä %1?", "SENSING_COLORISTOUCHINGCOLOR": "koskeeko väri %1 väriä %2?", "SENSING_DISTANCETO": "etäisyys kohteeseen %1", "SENSING_DISTANCETO_POINTER": "hiiriosoitin", "SENSING_ASKANDWAIT": "kysy %1 ja odota", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "vastaus", "SENSING_KEYPRESSED": "onko näppäin %1 painettu?", "SENSING_MOUSEDOWN": "onko hiiren nappi painettu?", "SENSING_MOUSEX": "hiiren x-sijainti", "SENSING_MOUSEY": "hiiren y-sijainti", "SENSING_SETDRAGMODE": "aseta raahaustilaksi %1", "SENSING_SETDRAGMODE_DRAGGABLE": "raahaus sallittu", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "raahaus ei sallittu", "SENSING_LOUDNESS": "äänentaso", "SENSING_LOUD": "kova äänentaso?", "SENSING_TIMER": "ajastin", "SENSING_RESETTIMER": "nollaa ajastin", "SENSING_OF": "kohteen %2 %1", "SENSING_OF_XPOSITION": "x-sijainti", "SENSING_OF_YPOSITION": "y-sijainti", "SENSING_OF_DIRECTION": "suunta", "SENSING_OF_COSTUMENUMBER": "asusteen nro.", "SENSING_OF_COSTUMENAME": "asusteen nimi", "SENSING_OF_SIZE": "koko", "SENSING_OF_VOLUME": "äänenvoimakkuus", "SENSING_OF_BACKDROPNUMBER": "taustan nro.", "SENSING_OF_BACKDROPNAME": "taustan nimi", "SENSING_OF_STAGE": "Esiintymislava", "SENSING_CURRENT": "nykyinen %1", "SENSING_CURRENT_YEAR": "vuosi", "SENSING_CURRENT_MONTH": "kuukausi", "SENSING_CURRENT_DATE": "päiväys", "SENSING_CURRENT_DAYOFWEEK": "viikonpäivä", "SENSING_CURRENT_HOUR": "tunti", "SENSING_CURRENT_MINUTE": "minuutti", "SENSING_CURRENT_SECOND": "sekunti", "SENSING_DAYSSINCE2000": "päiviä vuoden 2000 jälkeen", "SENSING_USERNAME": "käyttäjänimi", "SENSING_USERID": "käyttäjä-id", "SOUND_PLAY": "soita ääni %1", "SOUND_PLAYUNTILDONE": "soita ääni %1 loppuun", "SOUND_STOPALLSOUNDS": "pysäytä kaikki äänet", "SOUND_SETEFFECTO": "aseta tehoste %1 arvoon %2", "SOUND_CHANGEEFFECTBY": " lisää tehosteeseen %1 arvo %2", "SOUND_CLEAREFFECTS": "poista ääniefektit", "SOUND_EFFECTS_PITCH": "sävelkorkeus", "SOUND_EFFECTS_PAN": "panoroi vasen/oikea", "SOUND_CHANGEVOLUMEBY": "kasvata äänenvoimakkuutta arvolla %1", "SOUND_SETVOLUMETO": "aseta äänenvoimakkuudeksi %1%", "SOUND_VOLUME": "äänenvoimakkuus", "CATEGORY_MOTION": "Liike", "CATEGORY_LOOKS": "Ulkonäkö", "CATEGORY_SOUND": "Ääni", "CATEGORY_EVENTS": "Tapahtumat", "CATEGORY_CONTROL": "Ohjaus", "CATEGORY_SENSING": "Tuntoaisti", "CATEGORY_OPERATORS": "Toiminnot", "CATEGORY_VARIABLES": "Muuttujat", "CATEGORY_MYBLOCKS": "Lohkoni", "DUPLICATE": "Kopioi", "DELETE": "Poista", "ADD_COMMENT": "Lisää kommentti", "REMOVE_COMMENT": "Poista kommentti", "DELETE_BLOCK": "Poista lohko", "DELETE_X_BLOCKS": "Poista %1 lohkoa", "DELETE_ALL_BLOCKS": "Poistetaanko kaikki %1 lohkoa?", "CLEAN_UP": "Siivoa lohkot", "HELP": "Apua", "UNDO": "Kumoa", "REDO": "Tee uudelleen", "EDIT_PROCEDURE": "Muokkaa", "SHOW_PROCEDURE_DEFINITION": "Siirry määrittelyyn", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Sano jotakin...", "COLOUR_HUE_LABEL": "Väri", "COLOUR_SATURATION_LABEL": "Värikylläisyys", "COLOUR_BRIGHTNESS_LABEL": "Kirkkaus", "CHANGE_VALUE_TITLE": "Vaihda arvo:", "RENAME_VARIABLE": "Nimeä uudelleen muuttuja", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Nimeä uudelleen muuttuja", "NEW_VARIABLE": "Tee muuttuja", "NEW_VARIABLE_TITLE": "Uuden muuttujan nimi:", "VARIABLE_MODAL_TITLE": "Uusi muuttuja", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Tee lohko", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Tee lista", "NEW_LIST_TITLE": "Uuden listan nimi:", "LIST_MODAL_TITLE": "Uusi lista", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Nimeä uudelleen lista", "NEW_BROADCAST_MESSAGE": "Uusi viesti", "NEW_BROADCAST_MESSAGE_TITLE": "Uuden viestin nimi:", "BROADCAST_MODAL_TITLE": "Uusi viesti", "DEFAULT_BROADCAST_MESSAGE_NAME": "viesti1" }; Blockly.ScratchMsgs.locales["fr"] = { "CONTROL_FOREVER": "répéter indéfiniment", "CONTROL_REPEAT": "répéter %1 fois", "CONTROL_IF": "si %1 alors", "CONTROL_ELSE": "sinon", "CONTROL_STOP": "stop", "CONTROL_STOP_ALL": "tout", "CONTROL_STOP_THIS": "ce script", "CONTROL_STOP_OTHER": "autres scripts dans sprite", "CONTROL_WAIT": "attendre %1 secondes", "CONTROL_WAITUNTIL": "attendre jusqu'à %1", "CONTROL_REPEATUNTIL": "répéter jusqu'à %1", "CONTROL_WHILE": "tant que %1", "CONTROL_FOREACH": "pour chaque %1 dans %2", "CONTROL_STARTASCLONE": "quand je commence comme un clone", "CONTROL_CREATECLONEOF": "créer un clone de %1", "CONTROL_CREATECLONEOF_MYSELF": "moi-même", "CONTROL_DELETETHISCLONE": "supprimer ce clone", "CONTROL_COUNTER": "compteur", "CONTROL_INCRCOUNTER": "incrémenter le compteur", "CONTROL_CLEARCOUNTER": "effacer le compteur", "CONTROL_ALLATONCE": "tous en même temps", "DATA_SETVARIABLETO": "mettre %1 à %2", "DATA_CHANGEVARIABLEBY": "changer %1 par %2", "DATA_SHOWVARIABLE": "montrer la variable %1", "DATA_HIDEVARIABLE": "cacher la variable %1", "DATA_ADDTOLIST": "ajouter %1 à %2", "DATA_DELETEOFLIST": "supprimer l'élément %1 de %2", "DATA_INSERTATLIST": "insérer %1 en position %2 de %3", "DATA_REPLACEITEMOFLIST": "remplacer l'élément %1 de la liste %2 par %3", "DATA_ITEMOFLIST": "élément %1 de %2", "DATA_LENGTHOFLIST": "longueur de %1", "DATA_LISTCONTAINSITEM": "%1 contient %2 ?", "DATA_SHOWLIST": "montrer la liste %1", "DATA_HIDELIST": "cacher la liste %1", "DATA_INDEX_ALL": "tout", "DATA_INDEX_LAST": "dernier", "DATA_INDEX_RANDOM": "au hasard", "EVENT_WHENFLAGCLICKED": "quand %1 est cliqué", "EVENT_WHENTHISSPRITECLICKED": "quand ce sprite est cliqué", "EVENT_WHENSTAGECLICKED": "quand la scène est cliquée", "EVENT_WHENTOUCHINGOBJECT": "quand ce lutin touche %1", "EVENT_WHENBROADCASTRECEIVED": "quand je reçois %1", "EVENT_WHENBACKDROPSWITCHESTO": "quand l'arrière-plan bascule sur %1", "EVENT_WHENGREATERTHAN": "quand %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "chronomètre", "EVENT_BROADCAST": "envoyer à tous %1", "EVENT_BROADCASTANDWAIT": "envoyer à tous %1 et attendre", "EVENT_WHENKEYPRESSED": "quand la touche %1 est pressée", "EVENT_WHENKEYPRESSED_SPACE": "espace", "EVENT_WHENKEYPRESSED_LEFT": "flèche gauche", "EVENT_WHENKEYPRESSED_RIGHT": "flèche droite", "EVENT_WHENKEYPRESSED_DOWN": "flèche bas", "EVENT_WHENKEYPRESSED_UP": "flèche haut", "EVENT_WHENKEYPRESSED_ANY": "n'importe laquelle", "LOOKS_SAYFORSECS": "dire %1 pendant %2 secondes", "LOOKS_SAY": "dire %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "penser à %1 pendant %2 secondes", "LOOKS_THINK": "penser à %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "montrer", "LOOKS_HIDE": "cacher", "LOOKS_HIDEALLSPRITES": "cacher tous les sprites", "LOOKS_EFFECT_COLOR": "couleur", "LOOKS_EFFECT_FISHEYE": "œil de poisson", "LOOKS_EFFECT_WHIRL": "tournoyer", "LOOKS_EFFECT_PIXELATE": "pixeliser", "LOOKS_EFFECT_MOSAIC": "mosaïque", "LOOKS_EFFECT_BRIGHTNESS": "luminosité", "LOOKS_EFFECT_GHOST": "fantôme", "LOOKS_CHANGEEFFECTBY": "changer l'effet %1 par %2", "LOOKS_SETEFFECTTO": "mettre l'effet %1 sur %2", "LOOKS_CLEARGRAPHICEFFECTS": "annuler les effets graphiques", "LOOKS_CHANGESIZEBY": "changer la taille par %1", "LOOKS_SETSIZETO": "mettre la taille sur %1 % de la taille initiale", "LOOKS_SIZE": "taille", "LOOKS_CHANGESTRETCHBY": "modifier l'étirement de %1", "LOOKS_SETSTRETCHTO": "mettre l'étirement sur %1 %", "LOOKS_SWITCHCOSTUMETO": "basculer le costume sur %1", "LOOKS_NEXTCOSTUME": "costume suivant", "LOOKS_SWITCHBACKDROPTO": "basculer l'arrière-plan sur %1", "LOOKS_GOTOFRONTBACK": "aller au %1 plan", "LOOKS_GOTOFRONTBACK_FRONT": "devant", "LOOKS_GOTOFRONTBACK_BACK": "derrière", "LOOKS_GOFORWARDBACKWARDLAYERS": "déplacer de %2 plans %1", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "avant", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "arrière", "LOOKS_BACKDROPNUMBERNAME": "arrière-plan %1", "LOOKS_COSTUMENUMBERNAME": "costume %1", "LOOKS_NUMBERNAME_NUMBER": "nombre", "LOOKS_NUMBERNAME_NAME": "nom", "LOOKS_SWITCHBACKDROPTOANDWAIT": "basculer sur l'arrière-plan %1 et attendre", "LOOKS_NEXTBACKDROP": "arrière-plan suivant", "LOOKS_PREVIOUSBACKDROP": "arrière-plan précédent", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "avancer de %1 pas", "MOTION_TURNLEFT": "tourner %1 de %2 degrés", "MOTION_TURNRIGHT": "tourner %1 de %2 degrés", "MOTION_POINTINDIRECTION": "s'orienter en direction de %1", "MOTION_POINTTOWARDS": "s'orienter vers %1", "MOTION_POINTTOWARDS_POINTER": "pointeur de souris", "MOTION_GOTO": "aller à %1", "MOTION_GOTO_POINTER": "pointeur de souris", "MOTION_GOTO_RANDOM": "position aléatoire", "MOTION_GOTOXY": "aller à x: %1 y: %2", "MOTION_GLIDESECSTOXY": "glisser en %1 secondes à x: %2 y: %3", "MOTION_GLIDETO": "glisser en %1 secondes à %2", "MOTION_GLIDETO_POINTER": "pointeur de souris", "MOTION_GLIDETO_RANDOM": "position aléatoire", "MOTION_CHANGEXBY": "changer x par %1", "MOTION_SETX": "mettre x sur %1", "MOTION_CHANGEYBY": "changer y par %1", "MOTION_SETY": "mettre y sur %1", "MOTION_IFONEDGEBOUNCE": "rebondir si le bord est atteint", "MOTION_SETROTATIONSTYLE": "fixer le sens de rotation %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "gauche-droite", "MOTION_SETROTATIONSTYLE_DONTROTATE": "ne tourne pas", "MOTION_SETROTATIONSTYLE_ALLAROUND": "à 360°", "MOTION_XPOSITION": "abscisse x", "MOTION_YPOSITION": "ordonnée y", "MOTION_DIRECTION": "direction", "MOTION_SCROLLRIGHT": "défiler à droite de %1", "MOTION_SCROLLUP": "défiler en haut de %1", "MOTION_ALIGNSCENE": "aligner la scène %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "bas-gauche", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "bas-droite", "MOTION_ALIGNSCENE_MIDDLE": "milieu", "MOTION_ALIGNSCENE_TOPLEFT": "haut-gauche", "MOTION_ALIGNSCENE_TOPRIGHT": "haut-droite", "MOTION_XSCROLL": "défilement x", "MOTION_YSCROLL": "défilement y", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "nombre aléatoire entre %1 et %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 et %2", "OPERATORS_OR": "%1 ou %2", "OPERATORS_NOT": "non %1", "OPERATORS_JOIN": "regroupe %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "lettre %1 de %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "longueur de %1", "OPERATORS_CONTAINS": "%1 contient %2 ?", "OPERATORS_MOD": "%1 modulo %2", "OPERATORS_ROUND": "arrondi de %1", "OPERATORS_MATHOP": "%1 de %2", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "plancher", "OPERATORS_MATHOP_CEILING": "plafond", "OPERATORS_MATHOP_SQRT": "racine", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e^", "OPERATORS_MATHOP_10EXP": "10^", "PROCEDURES_DEFINITION": "définir %1", "SENSING_TOUCHINGOBJECT": "touche %1 ?", "SENSING_TOUCHINGOBJECT_POINTER": "pointeur de souris", "SENSING_TOUCHINGOBJECT_EDGE": "bord", "SENSING_TOUCHINGCOLOR": "couleur %1 touchée ?", "SENSING_COLORISTOUCHINGCOLOR": "couleur %1 touche %2 ?", "SENSING_DISTANCETO": "distance de %1", "SENSING_DISTANCETO_POINTER": "pointeur de souris", "SENSING_ASKANDWAIT": "demander %1 et attendre", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "réponse", "SENSING_KEYPRESSED": "touche %1 pressée ?", "SENSING_MOUSEDOWN": "souris pressée ?", "SENSING_MOUSEX": "souris x", "SENSING_MOUSEY": "souris y", "SENSING_SETDRAGMODE": "mettre mode de glissement à %1", "SENSING_SETDRAGMODE_DRAGGABLE": "glissable", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "non glissable", "SENSING_LOUDNESS": "intensité", "SENSING_LOUD": "fort ?", "SENSING_TIMER": "chronomètre", "SENSING_RESETTIMER": "réinitialiser le chronomètre", "SENSING_OF": "%1 de %2", "SENSING_OF_XPOSITION": "abscisse x", "SENSING_OF_YPOSITION": "ordonnée y", "SENSING_OF_DIRECTION": "direction", "SENSING_OF_COSTUMENUMBER": "costume #", "SENSING_OF_COSTUMENAME": "nom du costume", "SENSING_OF_SIZE": "taille", "SENSING_OF_VOLUME": "volume", "SENSING_OF_BACKDROPNUMBER": "arrière-plan #", "SENSING_OF_BACKDROPNAME": "nom de l'arrière-plan", "SENSING_OF_STAGE": "La scène", "SENSING_CURRENT": "%1 actuel", "SENSING_CURRENT_YEAR": "année", "SENSING_CURRENT_MONTH": "mois", "SENSING_CURRENT_DATE": "date", "SENSING_CURRENT_DAYOFWEEK": "jour de la semaine", "SENSING_CURRENT_HOUR": "heure", "SENSING_CURRENT_MINUTE": "minute", "SENSING_CURRENT_SECOND": "seconde", "SENSING_DAYSSINCE2000": "jours depuis 2000", "SENSING_USERNAME": "nom d'utilisateur", "SENSING_USERID": "id de l'utilisateur", "SOUND_PLAY": "jouer le son %1", "SOUND_PLAYUNTILDONE": "jouer le son %1 jusqu'au bout", "SOUND_STOPALLSOUNDS": "arrêter tous les sons", "SOUND_SETEFFECTO": "mettre l'effet %1 sur %2", "SOUND_CHANGEEFFECTBY": "changer l'effet %1 par %2", "SOUND_CLEAREFFECTS": "annuler tous les effets sonores", "SOUND_EFFECTS_PITCH": "hauteur", "SOUND_EFFECTS_PAN": "stéréo gauche/droite", "SOUND_CHANGEVOLUMEBY": "ajouter %1 au volume", "SOUND_SETVOLUMETO": "mettre le volume au niveau %1%", "SOUND_VOLUME": "volume", "CATEGORY_MOTION": "Mouvement", "CATEGORY_LOOKS": "Apparence", "CATEGORY_SOUND": "Son", "CATEGORY_EVENTS": "Événements", "CATEGORY_CONTROL": "Contrôle", "CATEGORY_SENSING": "Capteurs", "CATEGORY_OPERATORS": "Opérateurs", "CATEGORY_VARIABLES": "Variables", "CATEGORY_MYBLOCKS": "Mes Blocs", "DUPLICATE": "Dupliquer", "DELETE": "Supprimer", "ADD_COMMENT": "Ajouter un commentaire", "REMOVE_COMMENT": "Retirer le commentaire", "DELETE_BLOCK": "Supprimer le bloc", "DELETE_X_BLOCKS": "Supprimer %1 blocs", "DELETE_ALL_BLOCKS": "Supprimer tous les %1 blocs ?", "CLEAN_UP": "Nettoyer les blocs", "HELP": "Aide", "UNDO": "Restaurer", "REDO": "Refaire", "EDIT_PROCEDURE": "Modifier", "SHOW_PROCEDURE_DEFINITION": "Aller à la définition", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Dire quelque chose...", "COLOUR_HUE_LABEL": "Couleur", "COLOUR_SATURATION_LABEL": "Saturation", "COLOUR_BRIGHTNESS_LABEL": "Luminosité", "CHANGE_VALUE_TITLE": "Changer la valeur:", "RENAME_VARIABLE": "Renommer la variable", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Renommer la variable", "NEW_VARIABLE": "Créer une variable", "NEW_VARIABLE_TITLE": "Nouveau nom de la variable", "VARIABLE_MODAL_TITLE": "Nouvelle variable", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Créer un bloc", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Créer une liste", "NEW_LIST_TITLE": "Nom de la nouvelle liste:", "LIST_MODAL_TITLE": "Nouvelle liste", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Renommer la liste", "NEW_BROADCAST_MESSAGE": "Nouveau message", "NEW_BROADCAST_MESSAGE_TITLE": "Nom du nouveau message:", "BROADCAST_MODAL_TITLE": "Nouveau message", "DEFAULT_BROADCAST_MESSAGE_NAME": "message1" }; Blockly.ScratchMsgs.locales["ga"] = { "CONTROL_FOREVER": "go deo", "CONTROL_REPEAT": "déan %1 uair", "CONTROL_IF": "más %1 ansin", "CONTROL_ELSE": "seachas sin", "CONTROL_STOP": "stop", "CONTROL_STOP_ALL": "uile", "CONTROL_STOP_THIS": "an script seo", "CONTROL_STOP_OTHER": "scripteanna eile sa sprid", "CONTROL_WAIT": "fan %1 soicind", "CONTROL_WAITUNTIL": "fan go %1", "CONTROL_REPEATUNTIL": "athdhéan go %1", "CONTROL_WHILE": "chomh fada is %1", "CONTROL_FOREACH": "do gach %1 i %2", "CONTROL_STARTASCLONE": "nuair a thosaím mar chóip", "CONTROL_CREATECLONEOF": "cruthaigh cóip de %1", "CONTROL_CREATECLONEOF_MYSELF": "mise féin", "CONTROL_DELETETHISCLONE": "scrios an chóip seo", "CONTROL_COUNTER": "áiritheoir", "CONTROL_INCRCOUNTER": "incrimintigh an t-áiritheoir", "CONTROL_CLEARCOUNTER": "glan an t-áiritheoir", "CONTROL_ALLATONCE": "d'aon iarraidh", "DATA_SETVARIABLETO": "socraigh %1: %2", "DATA_CHANGEVARIABLEBY": "athraigh %1 de %2", "DATA_SHOWVARIABLE": "taispeáin athróg %1", "DATA_HIDEVARIABLE": "folaigh athróg %1", "DATA_ADDTOLIST": "cuir %1 le %2", "DATA_DELETEOFLIST": "scrios %1 as %2", "DATA_INSERTATLIST": "ionsáigh %1 ag %2 i %3", "DATA_REPLACEITEMOFLIST": "cuir %3 in áit mír %1 i %2", "DATA_ITEMOFLIST": "mír %1 as %2", "DATA_LENGTHOFLIST": "fad %1", "DATA_LISTCONTAINSITEM": "%1 agus %2 ann?", "DATA_SHOWLIST": "taispeáin liosta %1", "DATA_HIDELIST": "folaigh liosta %1", "DATA_INDEX_ALL": "uile", "DATA_INDEX_LAST": "deireanach", "DATA_INDEX_RANDOM": "randamach", "EVENT_WHENFLAGCLICKED": "nuair a chliceáiltear %1", "EVENT_WHENTHISSPRITECLICKED": "nuair a chliceáiltear an sprid seo", "EVENT_WHENSTAGECLICKED": "nuair a chliceáiltear an stáitse", "EVENT_WHENTOUCHINGOBJECT": "nuair a theagmhaíonn an sprid seo le %1", "EVENT_WHENBROADCASTRECEIVED": "nuair a fhaighim %1", "EVENT_WHENBACKDROPSWITCHESTO": "nuair a chuirtear %1 suas", "EVENT_WHENGREATERTHAN": "nuair atá %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "amadóir", "EVENT_BROADCAST": "craol %1", "EVENT_BROADCASTANDWAIT": "craol %1 agus fan", "EVENT_WHENKEYPRESSED": "nuair a bhrúitear eochair %1", "EVENT_WHENKEYPRESSED_SPACE": "spás", "EVENT_WHENKEYPRESSED_LEFT": "saighead chlé", "EVENT_WHENKEYPRESSED_RIGHT": "saighead dheas", "EVENT_WHENKEYPRESSED_DOWN": "saighead síos", "EVENT_WHENKEYPRESSED_UP": "saighead suas", "EVENT_WHENKEYPRESSED_ANY": "ceann ar bith", "LOOKS_SAYFORSECS": "abair %1 ar feadh %2 soicind", "LOOKS_SAY": "abair %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "smaoinigh %1 ar feadh %2 soicind", "LOOKS_THINK": "smaoinigh %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "taispeáin", "LOOKS_HIDE": "folaigh", "LOOKS_HIDEALLSPRITES": "folaigh gach sprid", "LOOKS_EFFECT_COLOR": "dath", "LOOKS_EFFECT_FISHEYE": "súil an éisc", "LOOKS_EFFECT_WHIRL": "rothlú", "LOOKS_EFFECT_PIXELATE": "picteilíniú", "LOOKS_EFFECT_MOSAIC": "mósáic", "LOOKS_EFFECT_BRIGHTNESS": "gile", "LOOKS_EFFECT_GHOST": "taibhse", "LOOKS_CHANGEEFFECTBY": "athraigh maisíocht %1 de %2", "LOOKS_SETEFFECTTO": "socraigh maisíocht %1: %2", "LOOKS_CLEARGRAPHICEFFECTS": "glan na maisíochtaí grafaice", "LOOKS_CHANGESIZEBY": "athraigh an méid de %1", "LOOKS_SETSIZETO": "socraigh an méid: %1 %", "LOOKS_SIZE": "méid", "LOOKS_CHANGESTRETCHBY": "athraigh an síneadh de %1", "LOOKS_SETSTRETCHTO": "socraigh an síneadh: %1 %", "LOOKS_SWITCHCOSTUMETO": "athraigh an chulaith go %1", "LOOKS_NEXTCOSTUME": "an chéad chulaith eile", "LOOKS_SWITCHBACKDROPTO": "athraigh an cúlra go %1", "LOOKS_GOTOFRONTBACK": "téigh go dtí an tsraith %1", "LOOKS_GOTOFRONTBACK_FRONT": "thosaigh", "LOOKS_GOTOFRONTBACK_BACK": "dheiridh", "LOOKS_GOFORWARDBACKWARDLAYERS": "téigh %1 %2 sraith", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ar aghaidh", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "ar gcúl", "LOOKS_BACKDROPNUMBERNAME": "cúlra %1", "LOOKS_COSTUMENUMBERNAME": "culaith %1", "LOOKS_NUMBERNAME_NUMBER": "uimhir", "LOOKS_NUMBERNAME_NAME": "ainm", "LOOKS_SWITCHBACKDROPTOANDWAIT": "athraigh an cúlra go %1 agus fan", "LOOKS_NEXTBACKDROP": "an chéad chúlra eile", "LOOKS_PREVIOUSBACKDROP": "cúlra roimhe seo", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "bog %1 coiscéim", "MOTION_TURNLEFT": "rothlaigh %1 %2 céim", "MOTION_TURNRIGHT": "rothlaigh %1 %2 céim", "MOTION_POINTINDIRECTION": "tabhair aghaidh ar %1", "MOTION_POINTTOWARDS": "tabhair aghaidh i dtreo %1", "MOTION_POINTTOWARDS_POINTER": "pointeoir-luiche", "MOTION_GOTO": "téigh go %1", "MOTION_GOTO_POINTER": "pointeoir-luiche", "MOTION_GOTO_RANDOM": "ionad randamach", "MOTION_GOTOXY": "téigh go x: %1 y: %2", "MOTION_GLIDESECSTOXY": "sleamhnaigh %1 soicind go x: %2 y: %3", "MOTION_GLIDETO": "sleamhnaigh %1 soicind go %2", "MOTION_GLIDETO_POINTER": "pointeoir-luiche", "MOTION_GLIDETO_RANDOM": "ionad randamach", "MOTION_CHANGEXBY": "athraigh x de %1", "MOTION_SETX": "socraigh x: %1", "MOTION_CHANGEYBY": "athraigh y de %1", "MOTION_SETY": "socraigh y: %1", "MOTION_IFONEDGEBOUNCE": "más ar an imeall, preab", "MOTION_SETROTATIONSTYLE": "socraigh an stíl rothlaithe: %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "clé-deas", "MOTION_SETROTATIONSTYLE_DONTROTATE": "ná rothlaigh", "MOTION_SETROTATIONSTYLE_ALLAROUND": "timpeall ar fad", "MOTION_XPOSITION": "ionad x", "MOTION_YPOSITION": "ionad y", "MOTION_DIRECTION": "treo", "MOTION_SCROLLRIGHT": "scrollaigh ar dheis %1", "MOTION_SCROLLUP": "scrollaigh suas %1", "MOTION_ALIGNSCENE": "ailínigh radharc %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "bun ar chlé", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "bun ar dheis", "MOTION_ALIGNSCENE_MIDDLE": "lár", "MOTION_ALIGNSCENE_TOPLEFT": "barr ar chlé", "MOTION_ALIGNSCENE_TOPRIGHT": "barr ar dheis", "MOTION_XSCROLL": "scrollaigh x", "MOTION_YSCROLL": "scrollaigh y", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "uimhir randamach idir %1 agus %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 agus %2", "OPERATORS_OR": "%1 nó %2", "OPERATORS_NOT": "séanadh %1", "OPERATORS_JOIN": "ceangail %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "litir %1 de %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "fad %1", "OPERATORS_CONTAINS": "%1 agus %2 ann?", "OPERATORS_MOD": "%1 mod %2", "OPERATORS_ROUND": "slánaigh %1", "OPERATORS_MATHOP": "%1 as %2", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "urlár", "OPERATORS_MATHOP_CEILING": "síleáil", "OPERATORS_MATHOP_SQRT": "sqrt", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "sainmhínigh %1", "SENSING_TOUCHINGOBJECT": "i dteagmháil le %1?", "SENSING_TOUCHINGOBJECT_POINTER": "pointeoir-luiche", "SENSING_TOUCHINGOBJECT_EDGE": "ciumhais", "SENSING_TOUCHINGCOLOR": "i dteagmháil le dath %1?", "SENSING_COLORISTOUCHINGCOLOR": "dath %1 i dteagmháil le %2?", "SENSING_DISTANCETO": "fad go dtí %1", "SENSING_DISTANCETO_POINTER": "pointeoir-luiche", "SENSING_ASKANDWAIT": "fiafraigh %1 agus fan", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "freagra", "SENSING_KEYPRESSED": "eochair %1 brúite?", "SENSING_MOUSEDOWN": "luchóg síos?", "SENSING_MOUSEX": "luchóg x", "SENSING_MOUSEY": "luchóg y", "SENSING_SETDRAGMODE": "socraigh mód tarraingthe: %1", "SENSING_SETDRAGMODE_DRAGGABLE": "intarraingthe", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "dotharraingthe", "SENSING_LOUDNESS": "treise", "SENSING_LOUD": "os ard?", "SENSING_TIMER": "amadóir", "SENSING_RESETTIMER": "athshocraigh an t-amadóir", "SENSING_OF": "%1 as %2", "SENSING_OF_XPOSITION": "ionad x", "SENSING_OF_YPOSITION": "ionad y", "SENSING_OF_DIRECTION": "treo", "SENSING_OF_COSTUMENUMBER": "culaith #", "SENSING_OF_COSTUMENAME": "ainm na culaithe", "SENSING_OF_SIZE": "méid", "SENSING_OF_VOLUME": "airde", "SENSING_OF_BACKDROPNUMBER": "cúlra #", "SENSING_OF_BACKDROPNAME": "ainm an chúlra", "SENSING_OF_STAGE": "Stáitse", "SENSING_CURRENT": "%1 reatha", "SENSING_CURRENT_YEAR": "bliain", "SENSING_CURRENT_MONTH": "mí", "SENSING_CURRENT_DATE": "dáta", "SENSING_CURRENT_DAYOFWEEK": "lá den tseachtain", "SENSING_CURRENT_HOUR": "uair", "SENSING_CURRENT_MINUTE": "nóiméad", "SENSING_CURRENT_SECOND": "soicind", "SENSING_DAYSSINCE2000": "laethanta ó 2000", "SENSING_USERNAME": "ainm úsáideora", "SENSING_USERID": "aitheantas úsáideora", "SOUND_PLAY": "cas fuaim %1", "SOUND_PLAYUNTILDONE": "seinn fuaim %1 go dtí a deireadh", "SOUND_STOPALLSOUNDS": "stop gach fuaim", "SOUND_SETEFFECTO": "socraigh maisíocht %1: %2", "SOUND_CHANGEEFFECTBY": "athraigh maisíocht %1 de %2", "SOUND_CLEAREFFECTS": "glan na maisíochtaí fuaime", "SOUND_EFFECTS_PITCH": "tuinairde", "SOUND_EFFECTS_PAN": "peanáil ar chlé/ar dheis", "SOUND_CHANGEVOLUMEBY": "athraigh airde na fuaime de %1", "SOUND_SETVOLUMETO": "socraigh airde na fuaime: %1%", "SOUND_VOLUME": "airde", "CATEGORY_MOTION": "Gluaiseacht", "CATEGORY_LOOKS": "Cuma", "CATEGORY_SOUND": "Fuaim", "CATEGORY_EVENTS": "Teagmhais", "CATEGORY_CONTROL": "Rialú", "CATEGORY_SENSING": "Brath", "CATEGORY_OPERATORS": "Oibreoirí", "CATEGORY_VARIABLES": "Athróga", "CATEGORY_MYBLOCKS": "Mo Chuid Blocanna", "DUPLICATE": "Cóipeáil", "DELETE": "Scrios", "ADD_COMMENT": "Cuir Nóta Tráchta Leis", "REMOVE_COMMENT": "Bain an Nóta Tráchta", "DELETE_BLOCK": "Scrios an Bloc", "DELETE_X_BLOCKS": "Scrios %1 Bloc", "DELETE_ALL_BLOCKS": "Scrios na %1 bloc go léir?", "CLEAN_UP": "Glan na Blocanna", "HELP": "Cabhair", "UNDO": "Cealaigh", "REDO": "Athdhéan", "EDIT_PROCEDURE": "Eagar", "SHOW_PROCEDURE_DEFINITION": "Taispeáin an sainmhíniú", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Abair rud éigin...", "COLOUR_HUE_LABEL": "Dath", "COLOUR_SATURATION_LABEL": "Sáithiú", "COLOUR_BRIGHTNESS_LABEL": "Gile", "CHANGE_VALUE_TITLE": "Athraigh an luach:", "RENAME_VARIABLE": "Cuir ainm nua ar an athróg", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Cuir Ainm Nua ar an Athróg", "NEW_VARIABLE": "Cruthaigh Athróg", "NEW_VARIABLE_TITLE": "Ainm na hathróige nua:", "VARIABLE_MODAL_TITLE": "Athróg Nua", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Cruthaigh Bloc", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Cruthaigh Liosta", "NEW_LIST_TITLE": "Ainm an liosta nua:", "LIST_MODAL_TITLE": "Liosta Nua", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Cuir ainm nua ar an liosta", "NEW_BROADCAST_MESSAGE": "Teachtaireacht nua", "NEW_BROADCAST_MESSAGE_TITLE": "Ainm na teachtaireachta nua:", "BROADCAST_MODAL_TITLE": "Teachtaireacht Nua", "DEFAULT_BROADCAST_MESSAGE_NAME": "teachtaireacht1" }; Blockly.ScratchMsgs.locales["gd"] = { "CONTROL_FOREVER": "gu buan", "CONTROL_REPEAT": "dèan seo %1 tursan", "CONTROL_IF": "ma tha %1 a-rèiste", "CONTROL_ELSE": "air neo", "CONTROL_STOP": "cuir stad air", "CONTROL_STOP_ALL": "na h-uile", "CONTROL_STOP_THIS": "an sgriobt seo", "CONTROL_STOP_OTHER": "sgriobtaichean eile na sprìd", "CONTROL_WAIT": "fan fad %1 diog", "CONTROL_WAITUNTIL": "fan gus am bi %1", "CONTROL_REPEATUNTIL": "dèan a-rithist e gus am bi %1", "CONTROL_WHILE": "fhad ’s a tha %1", "CONTROL_FOREACH": "airson gach %1 air %2", "CONTROL_STARTASCLONE": "nuair a thèid thu nad chlòn", "CONTROL_CREATECLONEOF": "cruthaich clòn %1", "CONTROL_CREATECLONEOF_MYSELF": "dhut fhèin", "CONTROL_DELETETHISCLONE": "sguab às an clòn seo", "CONTROL_COUNTER": "cunntair", "CONTROL_INCRCOUNTER": "cunntair ioncramaide", "CONTROL_CLEARCOUNTER": "falamhaich an cunntair", "CONTROL_ALLATONCE": "a h-uile gin aig an aon àm", "DATA_SETVARIABLETO": "suidhich %1 air %2", "DATA_CHANGEVARIABLEBY": "atharraich %1 le %2", "DATA_SHOWVARIABLE": "seall an caochladair %1", "DATA_HIDEVARIABLE": "falaich an caochladair %1", "DATA_ADDTOLIST": "cuir %1 ri %2", "DATA_DELETEOFLIST": "sguab às %1 de %2", "DATA_INSERTATLIST": "cuir %1 ris aig %2 de %3", "DATA_REPLACEITEMOFLIST": "cuir an àite %1 de %2 le %3", "DATA_ITEMOFLIST": "nì %1 de %2", "DATA_LENGTHOFLIST": "an fhaide aig %1", "DATA_LISTCONTAINSITEM": "%2 air %1", "DATA_SHOWLIST": "seall an liosta %1", "DATA_HIDELIST": "falaich an liosta %1", "DATA_INDEX_ALL": "na h-uile", "DATA_INDEX_LAST": "am fear mu dheireadh", "DATA_INDEX_RANDOM": "tuaireamach", "EVENT_WHENFLAGCLICKED": "le briogadh air %1", "EVENT_WHENTHISSPRITECLICKED": "le briogadh air an sprìd seo", "EVENT_WHENSTAGECLICKED": "le briogadh air an àrd-ùrlar", "EVENT_WHENTOUCHINGOBJECT": "nuair a bhios an sprìd a’ beantainn ri %1", "EVENT_WHENBROADCASTRECEIVED": "nuair a gheibh thu %1", "EVENT_WHENBACKDROPSWITCHESTO": "nuair a thèid an cùlaibh na %1", "EVENT_WHENGREATERTHAN": "nuair a thèid %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "tìmear", "EVENT_BROADCAST": "craol %1", "EVENT_BROADCASTANDWAIT": "craol %1 is fan", "EVENT_WHENKEYPRESSED": "le brùthadh na h-iuchrach %1", "EVENT_WHENKEYPRESSED_SPACE": "spàs", "EVENT_WHENKEYPRESSED_LEFT": "saighead gu clì", "EVENT_WHENKEYPRESSED_RIGHT": "saighead gu deas", "EVENT_WHENKEYPRESSED_DOWN": "saighead sìos", "EVENT_WHENKEYPRESSED_UP": "saighead suas", "EVENT_WHENKEYPRESSED_ANY": "sam bith", "LOOKS_SAYFORSECS": "can %1 fad %2 diog", "LOOKS_SAY": "can %1", "LOOKS_HELLO": "Shin thu!", "LOOKS_THINKFORSECS": "smaoinich %1 fad %2 diog", "LOOKS_THINK": "smaoinich %1", "LOOKS_HMM": "An-dà…", "LOOKS_SHOW": "seall", "LOOKS_HIDE": "falaich", "LOOKS_HIDEALLSPRITES": "cuir gach sprìd am falach", "LOOKS_EFFECT_COLOR": "datha", "LOOKS_EFFECT_FISHEYE": "sùil èisg", "LOOKS_EFFECT_WHIRL": "cuairteige", "LOOKS_EFFECT_PIXELATE": "phiogsailean", "LOOKS_EFFECT_MOSAIC": "mosàig", "LOOKS_EFFECT_BRIGHTNESS": "soilleireachd", "LOOKS_EFFECT_GHOST": "taibhse", "LOOKS_CHANGEEFFECTBY": "atharraich èifeachd %1 le %2", "LOOKS_SETEFFECTTO": "suidhich èifeachd %1 de %2 ort", "LOOKS_CLEARGRAPHICEFFECTS": "falamhaich na h-èifeachdan", "LOOKS_CHANGESIZEBY": "atharraich do mheud le %1", "LOOKS_SETSIZETO": "suidhich do mheud air %1 %", "LOOKS_SIZE": "meud", "LOOKS_CHANGESTRETCHBY": "atharraich an sìneadh le %1", "LOOKS_SETSTRETCHTO": "suidhich an sìneadh air %1 %", "LOOKS_SWITCHCOSTUMETO": "cuir an t-aodach %1 ort", "LOOKS_NEXTCOSTUME": "an t-ath-aodach", "LOOKS_SWITCHBACKDROPTO": "atharraich an cùlaibh gu %1", "LOOKS_GOTOFRONTBACK": "rach gu breath %1", "LOOKS_GOTOFRONTBACK_FRONT": "an fhìor-bheulaibh", "LOOKS_GOTOFRONTBACK_BACK": "an fhìor-chùlaibh", "LOOKS_GOFORWARDBACKWARDLAYERS": "rach %2 breath %1", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "an comhair a’ bheòil", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "an comhair a’ chùil", "LOOKS_BACKDROPNUMBERNAME": "cùlaibh %1", "LOOKS_COSTUMENUMBERNAME": "aodach %1", "LOOKS_NUMBERNAME_NUMBER": "àireamh", "LOOKS_NUMBERNAME_NAME": "ainm", "LOOKS_SWITCHBACKDROPTOANDWAIT": "atharraich an cùlaibh gun %1 is fan", "LOOKS_NEXTBACKDROP": "an t-ath-chùlaibh", "LOOKS_PREVIOUSBACKDROP": "chùlaibh roimhe", "LOOKS_RANDOMBACKDROP": "cùlaibh air thuaiream", "MOTION_MOVESTEPS": "gluais %1 ceum", "MOTION_TURNLEFT": "cuairtich %1 le %2 ceum", "MOTION_TURNRIGHT": "cuairtich %1 le %2 ceum", "MOTION_POINTINDIRECTION": "cuir d’ aghaidh ri %1", "MOTION_POINTTOWARDS": "cuir d’ aghaidh an comhair %1", "MOTION_POINTTOWARDS_POINTER": "tomhaire na luchaige", "MOTION_GOTO": "rach gu %1", "MOTION_GOTO_POINTER": "tomhaire na luchaige", "MOTION_GOTO_RANDOM": "ionad air thuaiream", "MOTION_GOTOXY": "rach gu x: %1 y: %2", "MOTION_GLIDESECSTOXY": "gluais fad %1 diog gu x: %2 y: %3", "MOTION_GLIDETO": "gluais fad %1 diog gu %2", "MOTION_GLIDETO_POINTER": "tomhaire na luchaige", "MOTION_GLIDETO_RANDOM": "ionad air thuaiream", "MOTION_CHANGEXBY": "atharraich x le %1", "MOTION_SETX": "suidhich x air %1", "MOTION_CHANGEYBY": "atharraich y le %1", "MOTION_SETY": "suidhich y air %1", "MOTION_IFONEDGEBOUNCE": "ma tha thu ris an oir, boc", "MOTION_SETROTATIONSTYLE": "suidhich stoidhle na cuairte air %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "clì is deas", "MOTION_SETROTATIONSTYLE_DONTROTATE": "gun chuairteachadh", "MOTION_SETROTATIONSTYLE_ALLAROUND": "cuairt shlàn", "MOTION_XPOSITION": "ionad x", "MOTION_YPOSITION": "ionad y", "MOTION_DIRECTION": "comhair", "MOTION_SCROLLRIGHT": "sgrolaich gu deas le %1", "MOTION_SCROLLUP": "sgrolaich suas le %1", "MOTION_ALIGNSCENE": "co-thaobhaich an sealladh dhan %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "taobh clì aig a’ bhonn", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "taobh deas aig a’ bhonn", "MOTION_ALIGNSCENE_MIDDLE": "mheadhan", "MOTION_ALIGNSCENE_TOPLEFT": "taobh clì aig a’ bharr", "MOTION_ALIGNSCENE_TOPRIGHT": "taobh deas aig a’ bharr", "MOTION_XSCROLL": "sgroladh x", "MOTION_YSCROLL": "sgroladh y", "MOTION_STAGE_SELECTED": "Chaidh an t-àrd-ùrlar a thaghadh: chan eil bloca gluasaid ann", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 × %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "luach tuaireamach eadar %1 is %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 agus %2", "OPERATORS_OR": "%1 no %2", "OPERATORS_NOT": "e fallsa gu bheil %1", "OPERATORS_JOIN": "ceangail %1 ri %2", "OPERATORS_JOIN_APPLE": "ubhal", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "litir %1 de %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "an fhaide aig %1", "OPERATORS_CONTAINS": "%2 air %1", "OPERATORS_MOD": "%1 mòidealas %2", "OPERATORS_ROUND": "cuairtich %1", "OPERATORS_MATHOP": "%1 aig %2", "OPERATORS_MATHOP_ABS": "an luach absaloideach", "OPERATORS_MATHOP_FLOOR": "an cuairteachadh sìos", "OPERATORS_MATHOP_CEILING": "an cuairteachadh suas", "OPERATORS_MATHOP_SQRT": "am freumh ceàrnagach", "OPERATORS_MATHOP_SIN": "an sìneas", "OPERATORS_MATHOP_COS": "an co-shìneas", "OPERATORS_MATHOP_TAN": "am beantan", "OPERATORS_MATHOP_ASIN": "an t-àrc-shìneas", "OPERATORS_MATHOP_ACOS": "an t-àrc-cho-shìneas", "OPERATORS_MATHOP_ATAN": "an t-àrc-bheantan", "OPERATORS_MATHOP_LN": "an log-àireamh nàdarra", "OPERATORS_MATHOP_LOG": "an log-àireamh", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "mìnich %1", "SENSING_TOUCHINGOBJECT": "%1 a’ beantainn riut", "SENSING_TOUCHINGOBJECT_POINTER": "tomhaire na luchaige", "SENSING_TOUCHINGOBJECT_EDGE": "an oir", "SENSING_TOUCHINGCOLOR": "an dath %1 a’ beantainn riut", "SENSING_COLORISTOUCHINGCOLOR": "an dath %1 a’ beantainn ri %2", "SENSING_DISTANCETO": "an t-astar gu %1", "SENSING_DISTANCETO_POINTER": "tomhaire na luchaige", "SENSING_ASKANDWAIT": "faighnich %1 is fan", "SENSING_ASK_TEXT": "Dè an t-ainm a th’ort?", "SENSING_ANSWER": "freagairt", "SENSING_KEYPRESSED": "an iuchair %1 ga brùthadh", "SENSING_MOUSEDOWN": "an luchag ga briogadh", "SENSING_MOUSEX": "x na luchaige", "SENSING_MOUSEY": "y na luchaige", "SENSING_SETDRAGMODE": "suidhich %1 a shlaodadh leis an luchag", "SENSING_SETDRAGMODE_DRAGGABLE": "gun tèid", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "nach tèid", "SENSING_LOUDNESS": "àirde na fuaime", "SENSING_LOUD": "an fhuaim air", "SENSING_TIMER": "tìmear", "SENSING_RESETTIMER": "ath-shuidhich an tìmear", "SENSING_OF": "%1 aig %2", "SENSING_OF_XPOSITION": "ionad x", "SENSING_OF_YPOSITION": "ionad y", "SENSING_OF_DIRECTION": "comhair", "SENSING_OF_COSTUMENUMBER": "àireamh an aodaich", "SENSING_OF_COSTUMENAME": "ainm an aodaich", "SENSING_OF_SIZE": "meud", "SENSING_OF_VOLUME": "àirde na fuaime", "SENSING_OF_BACKDROPNUMBER": "àireamh a’ chùlaibh", "SENSING_OF_BACKDROPNAME": "ainm a’ chùlaibh", "SENSING_OF_STAGE": "Àrd-ùrlar", "SENSING_CURRENT": "%1 làithreach", "SENSING_CURRENT_YEAR": "bliadhna", "SENSING_CURRENT_MONTH": "mìos", "SENSING_CURRENT_DATE": "ceann-là", "SENSING_CURRENT_DAYOFWEEK": "latha na seachdaine", "SENSING_CURRENT_HOUR": "uair", "SENSING_CURRENT_MINUTE": "mionaid", "SENSING_CURRENT_SECOND": "diog", "SENSING_DAYSSINCE2000": "làithean o 2000 a-mach", "SENSING_USERNAME": "ainm-cleachdaiche", "SENSING_USERID": "ID a’ chleachdaiche", "SOUND_PLAY": "tòisich air fuaim %1 a chluich", "SOUND_PLAYUNTILDONE": "cluich fuaim %1 gu lèir", "SOUND_STOPALLSOUNDS": "cuir stad air a h-uile fuaim", "SOUND_SETEFFECTO": "suidhich èifeachd %1 de %2 ort", "SOUND_CHANGEEFFECTBY": "atharraich èifeachd %1 le %2", "SOUND_CLEAREFFECTS": "falamhaich èifeachdan na fuaime", "SOUND_EFFECTS_PITCH": "gleus", "SOUND_EFFECTS_PAN": "panachadh gu clì/deas", "SOUND_CHANGEVOLUMEBY": "atharraich àirde na fuaime le %1", "SOUND_SETVOLUMETO": "suidhich àirde na fuaime air %1%", "SOUND_VOLUME": "àirde na fuaime", "CATEGORY_MOTION": "Gluasad", "CATEGORY_LOOKS": "Coltas", "CATEGORY_SOUND": "Fuaim", "CATEGORY_EVENTS": "Tachartas", "CATEGORY_CONTROL": "Smachd", "CATEGORY_SENSING": "Mothachadh", "CATEGORY_OPERATORS": "Gnìomharaiche", "CATEGORY_VARIABLES": "Caochladairean", "CATEGORY_MYBLOCKS": "Am bloca agam", "DUPLICATE": "Dùblaich", "DELETE": "Sguab às", "ADD_COMMENT": "Cuir beachd ris", "REMOVE_COMMENT": "Thoir am beachd air falbh", "DELETE_BLOCK": "Sguab às am bloca", "DELETE_X_BLOCKS": "Sguab às %1 bloca(ichean)", "DELETE_ALL_BLOCKS": "A bheil thu airson na %1 bloca(ichean) uile a sguabadh às?", "CLEAN_UP": "Sgioblaich na blocaichean", "HELP": "Cobhair", "UNDO": "Neo-dhèan", "REDO": "Ath-dhèan", "EDIT_PROCEDURE": "Deasaich", "SHOW_PROCEDURE_DEFINITION": "Rach dhan mhìneachadh", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Can rudeigin…", "COLOUR_HUE_LABEL": "Dath", "COLOUR_SATURATION_LABEL": "Sàthachd", "COLOUR_BRIGHTNESS_LABEL": "Soilleireachd", "CHANGE_VALUE_TITLE": "Atharraich an luach:", "RENAME_VARIABLE": "Thoir ainm ùr air a’ chaochladair", "RENAME_VARIABLE_TITLE": "Thoir ainm ùr air gach caochladair “%1”:", "RENAME_VARIABLE_MODAL_TITLE": "Thoir ainm ùr air a’ chaochladair", "NEW_VARIABLE": "Cruthaich caochladair", "NEW_VARIABLE_TITLE": "Ainm ùr a’ chaochladair:", "VARIABLE_MODAL_TITLE": "Caochladair ùr", "VARIABLE_ALREADY_EXISTS": "Tha caochladair air a bheil “%1” ann mu thràth.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Tha caochladair air a bheil “%1” ann mu thràth airson caochladair eile dhen t-seòrsa “%2”.", "DELETE_VARIABLE_CONFIRMATION": "A bheil thu airson a sguabadh às dha %1 chleachdadh/cleachdaidhean dhen chaochladair “%2”?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Chan urrainn dhuinn an caochladair “%1” a sguabadh às on a e am broinn mìneachadh an fhoincsein “%2”", "DELETE_VARIABLE": "Sguab às dhan chaochladair “%1”", "NEW_PROCEDURE": "Cruthaich bloca", "PROCEDURE_ALREADY_EXISTS": "Tha modh air a bheil “%1” ann mu thràth.", "NEW_LIST": "Cruthaich liosta", "NEW_LIST_TITLE": "Ainm na liosta ùire:", "LIST_MODAL_TITLE": "Liosta ùr", "LIST_ALREADY_EXISTS": "Tha liosta air a bheil “%1” ann mu thràth.", "RENAME_LIST_TITLE": "Thoir ainm ùr air gach liosta “%1”:", "RENAME_LIST_MODAL_TITLE": "Thoir ainm ùr air an liosta", "NEW_BROADCAST_MESSAGE": "Teachdaireachd ùr", "NEW_BROADCAST_MESSAGE_TITLE": "Ainm na teachdaireachd ùire:", "BROADCAST_MODAL_TITLE": "Teachdaireachd ùr", "DEFAULT_BROADCAST_MESSAGE_NAME": "teachdaireachd1" }; Blockly.ScratchMsgs.locales["gl"] = { "CONTROL_FOREVER": "para sempre", "CONTROL_REPEAT": "repetir %1", "CONTROL_IF": "se %1 entón", "CONTROL_ELSE": "se non", "CONTROL_STOP": "parar", "CONTROL_STOP_ALL": "todos", "CONTROL_STOP_THIS": "este programa", "CONTROL_STOP_OTHER": "outros programas na figura", "CONTROL_WAIT": "agardar %1 segundos", "CONTROL_WAITUNTIL": "agardar ata %1", "CONTROL_REPEATUNTIL": "repetir ata %1", "CONTROL_WHILE": "mentres %1", "CONTROL_FOREACH": "para cada %1 en %2", "CONTROL_STARTASCLONE": "cando comece como clon", "CONTROL_CREATECLONEOF": "crear clon de %1", "CONTROL_CREATECLONEOF_MYSELF": "a min mesmo", "CONTROL_DELETETHISCLONE": "borrar este clon", "CONTROL_COUNTER": "contador", "CONTROL_INCRCOUNTER": "contador de incremento", "CONTROL_CLEARCOUNTER": "limpar contador", "CONTROL_ALLATONCE": "todo de vez", "DATA_SETVARIABLETO": "fixar %1 a %2", "DATA_CHANGEVARIABLEBY": "trocar %1 por %2", "DATA_SHOWVARIABLE": "amosar variable %1", "DATA_HIDEVARIABLE": "ocultar variable %1", "DATA_ADDTOLIST": "engadir %1 a %2", "DATA_DELETEOFLIST": "borrar %1 de %2", "DATA_INSERTATLIST": "inserir %1 en %2 de %3", "DATA_REPLACEITEMOFLIST": "reemplazar elemento %1 de %2 con %3", "DATA_ITEMOFLIST": "elemento %1 de %2", "DATA_LENGTHOFLIST": "lonxitude de %1", "DATA_LISTCONTAINSITEM": "%1 contén %2?", "DATA_SHOWLIST": "amosar lista %1", "DATA_HIDELIST": "ocultar lista %1", "DATA_INDEX_ALL": "todos", "DATA_INDEX_LAST": "último", "DATA_INDEX_RANDOM": "ao chou", "EVENT_WHENFLAGCLICKED": "cando se prema %1", "EVENT_WHENTHISSPRITECLICKED": "cando se prema esta figura", "EVENT_WHENSTAGECLICKED": "cando se prema no escenario", "EVENT_WHENTOUCHINGOBJECT": "cando esta figura toca %1", "EVENT_WHENBROADCASTRECEIVED": "cando reciba %1", "EVENT_WHENBACKDROPSWITCHESTO": "cando o fondo cambie a %1", "EVENT_WHENGREATERTHAN": "cando %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "cronómetro", "EVENT_BROADCAST": "emitir %1", "EVENT_BROADCASTANDWAIT": "emitir %1 e agardar", "EVENT_WHENKEYPRESSED": "cando se prema a tecla %1", "EVENT_WHENKEYPRESSED_SPACE": "espazo", "EVENT_WHENKEYPRESSED_LEFT": "frecha esquerda", "EVENT_WHENKEYPRESSED_RIGHT": "frecha dereita", "EVENT_WHENKEYPRESSED_DOWN": "frecha abaixo", "EVENT_WHENKEYPRESSED_UP": "frecha arriba", "EVENT_WHENKEYPRESSED_ANY": "calquera", "LOOKS_SAYFORSECS": "dicir %1 durante %2 segundos", "LOOKS_SAY": "dicir %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "pensar %1 durante %2 segundos", "LOOKS_THINK": "pensar %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "amosar", "LOOKS_HIDE": "ocultar", "LOOKS_HIDEALLSPRITES": "agochar todas as figuras", "LOOKS_EFFECT_COLOR": "cor", "LOOKS_EFFECT_FISHEYE": "ollo de peixe", "LOOKS_EFFECT_WHIRL": "remuiño", "LOOKS_EFFECT_PIXELATE": "pixelar", "LOOKS_EFFECT_MOSAIC": "mosaico", "LOOKS_EFFECT_BRIGHTNESS": "luminosidade", "LOOKS_EFFECT_GHOST": "desaparecer", "LOOKS_CHANGEEFFECTBY": "trocar o efecto %1 por %2", "LOOKS_SETEFFECTTO": "fixar efecto %1 a %2", "LOOKS_CLEARGRAPHICEFFECTS": "quitar efectos gráficos", "LOOKS_CHANGESIZEBY": "cambiar tamaño por %1", "LOOKS_SETSIZETO": "fixar tamaño a %1 %", "LOOKS_SIZE": "tamaño", "LOOKS_CHANGESTRETCHBY": "cambiar estiramento por %1", "LOOKS_SETSTRETCHTO": "fixar estiramento en %1 %", "LOOKS_SWITCHCOSTUMETO": "mudar vestimenta a %1", "LOOKS_NEXTCOSTUME": "seguinte vestimenta", "LOOKS_SWITCHBACKDROPTO": "cambiar fondo a %1", "LOOKS_GOTOFRONTBACK": "ir a capa %1", "LOOKS_GOTOFRONTBACK_FRONT": "fronte", "LOOKS_GOTOFRONTBACK_BACK": "atrás", "LOOKS_GOFORWARDBACKWARDLAYERS": "ir %1 %2 capas", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "adiante", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "atrás", "LOOKS_BACKDROPNUMBERNAME": "fondo %1", "LOOKS_COSTUMENUMBERNAME": "vestimenta %1", "LOOKS_NUMBERNAME_NUMBER": "número", "LOOKS_NUMBERNAME_NAME": "nome", "LOOKS_SWITCHBACKDROPTOANDWAIT": "cambiar fondo a %1 e agardar", "LOOKS_NEXTBACKDROP": "seguinte fondo", "LOOKS_PREVIOUSBACKDROP": "fondo anterior", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "mover %1 paso", "MOTION_TURNLEFT": "xirar %1 %2 grados", "MOTION_TURNRIGHT": "xirar %1 %2 grados", "MOTION_POINTINDIRECTION": "apuntar en dirección %1", "MOTION_POINTTOWARDS": "apuntar cara a %1", "MOTION_POINTTOWARDS_POINTER": "punteiro do rato", "MOTION_GOTO": "ir a %1", "MOTION_GOTO_POINTER": "punteiro do rato", "MOTION_GOTO_RANDOM": "posición aleatoria", "MOTION_GOTOXY": "ir a x: %1 y: %2", "MOTION_GLIDESECSTOXY": "esbarar %1 seg a x: %2 y: %3", "MOTION_GLIDETO": "esbarar %1 seg a %2", "MOTION_GLIDETO_POINTER": "punteiro do rato", "MOTION_GLIDETO_RANDOM": "posición aleatoria", "MOTION_CHANGEXBY": "cambiar x por %1", "MOTION_SETX": "fixar x a %1", "MOTION_CHANGEYBY": "cambiar y por %1", "MOTION_SETY": "fixar y a %1", "MOTION_IFONEDGEBOUNCE": "se toca un bordo, rebotar", "MOTION_SETROTATIONSTYLE": "fixar estilo de rotación %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "esquerda-dereita", "MOTION_SETROTATIONSTYLE_DONTROTATE": "non rotar", "MOTION_SETROTATIONSTYLE_ALLAROUND": "en todas as direccións", "MOTION_XPOSITION": "posición x", "MOTION_YPOSITION": "posición y", "MOTION_DIRECTION": "dirección", "MOTION_SCROLLRIGHT": "desprazamento dereita %1", "MOTION_SCROLLUP": "desprazamento arriba %1", "MOTION_ALIGNSCENE": "aliñar escena %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "abaixo esquerda", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "abaixo dereita", "MOTION_ALIGNSCENE_MIDDLE": "medio", "MOTION_ALIGNSCENE_TOPLEFT": "arriba esquerda", "MOTION_ALIGNSCENE_TOPRIGHT": "arriba dereita", "MOTION_XSCROLL": "desprazamento x", "MOTION_YSCROLL": "desprazamento y", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "número ao choun entre %1 e %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 e %2", "OPERATORS_OR": "%1 ou %2", "OPERATORS_NOT": "non %1", "OPERATORS_JOIN": "unir %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "letra %1 de %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "lonxitude de %1", "OPERATORS_CONTAINS": "%1 contén %2?", "OPERATORS_MOD": "%1 mod %2", "OPERATORS_ROUND": "redondear %1", "OPERATORS_MATHOP": "%1 de %2", "OPERATORS_MATHOP_ABS": "valor absoluto", "OPERATORS_MATHOP_FLOOR": "chan", "OPERATORS_MATHOP_CEILING": "teito", "OPERATORS_MATHOP_SQRT": "raíz cadrada", "OPERATORS_MATHOP_SIN": "seno", "OPERATORS_MATHOP_COS": "coseno", "OPERATORS_MATHOP_TAN": "tanxente", "OPERATORS_MATHOP_ASIN": "arco seno", "OPERATORS_MATHOP_ACOS": "arco coseno", "OPERATORS_MATHOP_ATAN": "arco tanxente", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "definir %1", "SENSING_TOUCHINGOBJECT": "tocando %1?", "SENSING_TOUCHINGOBJECT_POINTER": "punteiro do rato", "SENSING_TOUCHINGOBJECT_EDGE": "bordo", "SENSING_TOUCHINGCOLOR": "tocando cor %1?", "SENSING_COLORISTOUCHINGCOLOR": "cor %1 está tocando %2?", "SENSING_DISTANCETO": "distancia a %1", "SENSING_DISTANCETO_POINTER": "punteiro do rato", "SENSING_ASKANDWAIT": "preguntar %1 e agardar", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "resposta", "SENSING_KEYPRESSED": "tecla %1 premida?", "SENSING_MOUSEDOWN": "rato premido?", "SENSING_MOUSEX": "posición x do rato", "SENSING_MOUSEY": "posición y do rato", "SENSING_SETDRAGMODE": "fixar modo de arrastre %1", "SENSING_SETDRAGMODE_DRAGGABLE": "arrastrábel", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "non arrastrábel", "SENSING_LOUDNESS": "intensidade do son", "SENSING_LOUD": "alto?", "SENSING_TIMER": "cronómetro", "SENSING_RESETTIMER": "reiniciar o cronómetro", "SENSING_OF": "%1 de %2", "SENSING_OF_XPOSITION": "posición x", "SENSING_OF_YPOSITION": "posición y", "SENSING_OF_DIRECTION": "dirección", "SENSING_OF_COSTUMENUMBER": "vestimenta #", "SENSING_OF_COSTUMENAME": "nome da vestimenta", "SENSING_OF_SIZE": "tamaño", "SENSING_OF_VOLUME": "volume", "SENSING_OF_BACKDROPNUMBER": "fondo #", "SENSING_OF_BACKDROPNAME": "nome do fondo", "SENSING_OF_STAGE": "Escenario", "SENSING_CURRENT": "actual %1", "SENSING_CURRENT_YEAR": "ano", "SENSING_CURRENT_MONTH": "mes", "SENSING_CURRENT_DATE": "data", "SENSING_CURRENT_DAYOFWEEK": "día da semana", "SENSING_CURRENT_HOUR": "hora", "SENSING_CURRENT_MINUTE": "minuto", "SENSING_CURRENT_SECOND": "segundo", "SENSING_DAYSSINCE2000": "días desde o 2000", "SENSING_USERNAME": "nome de usuario", "SENSING_USERID": "identificador de usuario", "SOUND_PLAY": "iniciar son %1", "SOUND_PLAYUNTILDONE": "reproducir %1 até rematar", "SOUND_STOPALLSOUNDS": "deter todos os sons", "SOUND_SETEFFECTO": "fixar efecto %1 a %2", "SOUND_CHANGEEFFECTBY": "trocar o efecto %1 por %2", "SOUND_CLEAREFFECTS": "limpar efectos de son", "SOUND_EFFECTS_PITCH": "ton", "SOUND_EFFECTS_PAN": "desprazar esquerda/dereita", "SOUND_CHANGEVOLUMEBY": "cambiar volume en %1", "SOUND_SETVOLUMETO": "fixar volume en %1%", "SOUND_VOLUME": "volume", "CATEGORY_MOTION": "Movemento", "CATEGORY_LOOKS": "Aparencia", "CATEGORY_SOUND": "Son", "CATEGORY_EVENTS": "Eventos", "CATEGORY_CONTROL": "Control", "CATEGORY_SENSING": "Sensores", "CATEGORY_OPERATORS": "Operadores", "CATEGORY_VARIABLES": "Variábeis", "CATEGORY_MYBLOCKS": "Os meus bloques", "DUPLICATE": "Duplicar", "DELETE": "Borrar", "ADD_COMMENT": "Engadir comentario", "REMOVE_COMMENT": "Retirar comentario", "DELETE_BLOCK": "Eliminar bloque", "DELETE_X_BLOCKS": "Eliminar %1 bloques", "DELETE_ALL_BLOCKS": "Eliminar os %1 bloques?", "CLEAN_UP": "Limpar bloques", "HELP": "Axuda", "UNDO": "Desfacer", "REDO": "Refacer", "EDIT_PROCEDURE": "Editar", "SHOW_PROCEDURE_DEFINITION": "Ir a definición", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Dicir algo...", "COLOUR_HUE_LABEL": "Cor", "COLOUR_SATURATION_LABEL": "Saturación", "COLOUR_BRIGHTNESS_LABEL": "Luminosidade", "CHANGE_VALUE_TITLE": "Cambiar valor:", "RENAME_VARIABLE": "Renomear variábel", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Renomear variábel", "NEW_VARIABLE": "Crear unha variábel", "NEW_VARIABLE_TITLE": "Novo nome da variábel:", "VARIABLE_MODAL_TITLE": "Nova Variable", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Crear un bloque", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Crear unha lista", "NEW_LIST_TITLE": "Novo nome da lista:", "LIST_MODAL_TITLE": "Nova lista", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Renomear lista", "NEW_BROADCAST_MESSAGE": "Nova mensaxe", "NEW_BROADCAST_MESSAGE_TITLE": "Novo nome da mensaxe:", "BROADCAST_MODAL_TITLE": "Mensaxe nova", "DEFAULT_BROADCAST_MESSAGE_NAME": "mensaxe1" }; Blockly.ScratchMsgs.locales["he"] = { "CONTROL_FOREVER": "לעולמים", "CONTROL_REPEAT": "חזור %1 פעמים", "CONTROL_IF": "אם %1 אז", "CONTROL_ELSE": "אחרת", "CONTROL_STOP": "עצור", "CONTROL_STOP_ALL": "הכל", "CONTROL_STOP_THIS": "תסריט זה", "CONTROL_STOP_OTHER": "תסריטים אחרים בדמות", "CONTROL_WAIT": "חכה %1 שניות", "CONTROL_WAITUNTIL": "חכה עד ש %1", "CONTROL_REPEATUNTIL": "חזור עד ש %1", "CONTROL_WHILE": "כל עוד %1", "CONTROL_FOREACH": "עבור כל %1 ב %2", "CONTROL_STARTASCLONE": "כאשר מופעל ככפיל", "CONTROL_CREATECLONEOF": "צור כפיל של %1", "CONTROL_CREATECLONEOF_MYSELF": "עצמי", "CONTROL_DELETETHISCLONE": "מחק כפיל זה", "CONTROL_COUNTER": "מונה", "CONTROL_INCRCOUNTER": "הגדל מונה", "CONTROL_CLEARCOUNTER": "אפס מונה", "CONTROL_ALLATONCE": "הכל בבת אחת", "DATA_SETVARIABLETO": "קבע %1 ל %2", "DATA_CHANGEVARIABLEBY": "שנה ערך %1 ב %2", "DATA_SHOWVARIABLE": "הצג משתנה %1", "DATA_HIDEVARIABLE": "הסתר משתנה %1", "DATA_ADDTOLIST": "הוסף %1 ל %2", "DATA_DELETEOFLIST": "מחק פריט %1 מתוך %2", "DATA_INSERTATLIST": "הכנס %1 במקום %2 של %3", "DATA_REPLACEITEMOFLIST": "קבע פריט %1 של %2 ל %3", "DATA_ITEMOFLIST": "פריט %1 של %2", "DATA_LENGTHOFLIST": "אורך של %1", "DATA_LISTCONTAINSITEM": "%1 מכיל %2 ?", "DATA_SHOWLIST": "הצג רשימה %1", "DATA_HIDELIST": "הסתר רשימה %1", "DATA_INDEX_ALL": "הכל", "DATA_INDEX_LAST": "אחרון", "DATA_INDEX_RANDOM": "אקראי", "EVENT_WHENFLAGCLICKED": "כאשר לוחצים על %1", "EVENT_WHENTHISSPRITECLICKED": "כאשר לוחצים על דמות זו", "EVENT_WHENSTAGECLICKED": "כאשר לוחצים על הבמה", "EVENT_WHENTOUCHINGOBJECT": "כאשר דמות זו נוגעת ב %1", "EVENT_WHENBROADCASTRECEIVED": "כאשר מתקבל מסר %1", "EVENT_WHENBACKDROPSWITCHESTO": "כאשר הרקע משתנה ל %1", "EVENT_WHENGREATERTHAN": "כאשר %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "שעון עצר", "EVENT_BROADCAST": "שדר מסר %1", "EVENT_BROADCASTANDWAIT": "שדר מסר %1 וחכה", "EVENT_WHENKEYPRESSED": "כאשר נלחץ מקש %1", "EVENT_WHENKEYPRESSED_SPACE": "רווח", "EVENT_WHENKEYPRESSED_LEFT": "חץ שמאלי", "EVENT_WHENKEYPRESSED_RIGHT": "חץ ימני", "EVENT_WHENKEYPRESSED_DOWN": "חץ מטה", "EVENT_WHENKEYPRESSED_UP": "חץ מעלה", "EVENT_WHENKEYPRESSED_ANY": "כל", "LOOKS_SAYFORSECS": "אמור %1 למשך %2 שניות", "LOOKS_SAY": "אמור %1", "LOOKS_HELLO": "שלום!", "LOOKS_THINKFORSECS": "חשוב %1 למשך %2 שניות", "LOOKS_THINK": "חשוב %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "הצג", "LOOKS_HIDE": "הסתר", "LOOKS_HIDEALLSPRITES": "הסתר את כל הדמויות", "LOOKS_EFFECT_COLOR": "צבע", "LOOKS_EFFECT_FISHEYE": "עין דג", "LOOKS_EFFECT_WHIRL": "סחרור", "LOOKS_EFFECT_PIXELATE": "פיקסלים", "LOOKS_EFFECT_MOSAIC": "פסיפס", "LOOKS_EFFECT_BRIGHTNESS": "בהירות", "LOOKS_EFFECT_GHOST": "רוח", "LOOKS_CHANGEEFFECTBY": "שנה אפקט %1 ב %2", "LOOKS_SETEFFECTTO": "קבע אפקט %1 ל %2", "LOOKS_CLEARGRAPHICEFFECTS": "נקה אפקטים", "LOOKS_CHANGESIZEBY": "שנה גודל ב %1", "LOOKS_SETSIZETO": "קבע גודל ל %1 %", "LOOKS_SIZE": "גודל", "LOOKS_CHANGESTRETCHBY": "שנה מתיחה ב %1", "LOOKS_SETSTRETCHTO": "קבע מתיחה ל %1", "LOOKS_SWITCHCOSTUMETO": "קבע תלבושת ל %1", "LOOKS_NEXTCOSTUME": "התלבושת הבאה", "LOOKS_SWITCHBACKDROPTO": "קבע רקע ל %1", "LOOKS_GOTOFRONTBACK": "העבר לשכבה ה %1", "LOOKS_GOTOFRONTBACK_FRONT": "קדמית", "LOOKS_GOTOFRONTBACK_BACK": "אחורית", "LOOKS_GOFORWARDBACKWARDLAYERS": "העבר %2 שכבות %1", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "קדימה", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "אחורה", "LOOKS_BACKDROPNUMBERNAME": "רקע %1", "LOOKS_COSTUMENUMBERNAME": "תלבושת %1", "LOOKS_NUMBERNAME_NUMBER": "מספר", "LOOKS_NUMBERNAME_NAME": "שם", "LOOKS_SWITCHBACKDROPTOANDWAIT": "החלף רקע ל %1 וחכה", "LOOKS_NEXTBACKDROP": "הרקע הבא", "LOOKS_PREVIOUSBACKDROP": "הרקע הקודם", "LOOKS_RANDOMBACKDROP": "רקע אקראי", "MOTION_MOVESTEPS": "זוז %1 צעדים", "MOTION_TURNLEFT": "הסתובב %1 %2 מעלות", "MOTION_TURNRIGHT": "הסתובב %1 %2 מעלות", "MOTION_POINTINDIRECTION": "פנה לכיוון %1", "MOTION_POINTTOWARDS": "פנה לכיוון של %1", "MOTION_POINTTOWARDS_POINTER": "מצביע העכבר", "MOTION_GOTO": "קפוץ אל %1", "MOTION_GOTO_POINTER": "מצביע העכבר", "MOTION_GOTO_RANDOM": "מיקום אקראי", "MOTION_GOTOXY": "קפוץ אל x: %1 y: %2", "MOTION_GLIDESECSTOXY": "גלוש %1 שניות ל x: %2 y: %3", "MOTION_GLIDETO": "גלוש %1 שניות ל %2", "MOTION_GLIDETO_POINTER": "סמן העכבר", "MOTION_GLIDETO_RANDOM": "מיקום אקראי", "MOTION_CHANGEXBY": "שנה את ערך x ב %1", "MOTION_SETX": "קבע את x ל %1", "MOTION_CHANGEYBY": "שנה את ערך y ב %1", "MOTION_SETY": "קבע את ערך y ל %1", "MOTION_IFONEDGEBOUNCE": "בנגיעה במסגרת שנה כיוון", "MOTION_SETROTATIONSTYLE": "קבע אופן סיבוב %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "שמאל-ימין", "MOTION_SETROTATIONSTYLE_DONTROTATE": "בטל סיבוב", "MOTION_SETROTATIONSTYLE_ALLAROUND": "מסביב", "MOTION_XPOSITION": "מיקום על ציר x", "MOTION_YPOSITION": "מיקום על ציר Y", "MOTION_DIRECTION": "כיוון", "MOTION_SCROLLRIGHT": "גלול ימינה %1", "MOTION_SCROLLUP": "גלול למעלה %1", "MOTION_ALIGNSCENE": "ישר סצנה %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "למטה־משמאל", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "למטה־מימין", "MOTION_ALIGNSCENE_MIDDLE": "אמצעי", "MOTION_ALIGNSCENE_TOPLEFT": "למעלה־משמאל", "MOTION_ALIGNSCENE_TOPRIGHT": "למעלה־מימין", "MOTION_XSCROLL": "גלילה בציר x", "MOTION_YSCROLL": "גלילה בציר y", "MOTION_STAGE_SELECTED": "נבחרה במה: אין לבנים לתנועה", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "בחר מספר אקראי בין %1 ל %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 וגם %2", "OPERATORS_OR": "%1 או %2", "OPERATORS_NOT": "לא %1", "OPERATORS_JOIN": "חבר %1 %2", "OPERATORS_JOIN_APPLE": "תפוח", "OPERATORS_JOIN_BANANA": "בננה", "OPERATORS_LETTEROF": "אות %1 של %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "האורך של %1", "OPERATORS_CONTAINS": "%1 מכיל %2 ?", "OPERATORS_MOD": "%1 מודולו %2", "OPERATORS_ROUND": "עגל %1", "OPERATORS_MATHOP": "%1 של %2", "OPERATORS_MATHOP_ABS": "ערך מוחלט", "OPERATORS_MATHOP_FLOOR": "עיגול למטה", "OPERATORS_MATHOP_CEILING": "עיגול למעלה", "OPERATORS_MATHOP_SQRT": "שורש ריבועי", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": " ^e", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "הגדר %1", "SENSING_TOUCHINGOBJECT": "נוגע ב %1?", "SENSING_TOUCHINGOBJECT_POINTER": "סמן העכבר", "SENSING_TOUCHINGOBJECT_EDGE": "קצה", "SENSING_TOUCHINGCOLOR": "נוגע בצבע %1?", "SENSING_COLORISTOUCHINGCOLOR": "צבע %1 נוגע בצבע %2?", "SENSING_DISTANCETO": "מרחק אל %1", "SENSING_DISTANCETO_POINTER": "סמן העכבר", "SENSING_ASKANDWAIT": "שאל %1 והמתן", "SENSING_ASK_TEXT": "מה השם שלך?", "SENSING_ANSWER": "תשובה", "SENSING_KEYPRESSED": "מקש %1 נלחץ?", "SENSING_MOUSEDOWN": "עכבר נלחץ?", "SENSING_MOUSEX": "מיקום עכבר בציר x", "SENSING_MOUSEY": "מיקום עכבר בציר y", "SENSING_SETDRAGMODE": "קבע מצב גרירה ל %1", "SENSING_SETDRAGMODE_DRAGGABLE": "ניתן לגרירה", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "לא ניתן לגרירה", "SENSING_LOUDNESS": "עוצמת קול", "SENSING_LOUD": "עוצמת קול?", "SENSING_TIMER": "שעון עצר", "SENSING_RESETTIMER": "אפס מונה", "SENSING_OF": "%1 של %2", "SENSING_OF_XPOSITION": "מיקום על ציר x", "SENSING_OF_YPOSITION": "מיקום על ציר y", "SENSING_OF_DIRECTION": "כיוון", "SENSING_OF_COSTUMENUMBER": "תלבושת #", "SENSING_OF_COSTUMENAME": "שם תלבושת", "SENSING_OF_SIZE": "גודל", "SENSING_OF_VOLUME": "עוצמת קול", "SENSING_OF_BACKDROPNUMBER": "רקע #", "SENSING_OF_BACKDROPNAME": "שם רקע", "SENSING_OF_STAGE": "במה", "SENSING_CURRENT": "%1 נוכחית", "SENSING_CURRENT_YEAR": "שנה", "SENSING_CURRENT_MONTH": "חודש", "SENSING_CURRENT_DATE": "תאריך", "SENSING_CURRENT_DAYOFWEEK": "יום בשבוע", "SENSING_CURRENT_HOUR": "שעה", "SENSING_CURRENT_MINUTE": "דקה", "SENSING_CURRENT_SECOND": "שניה", "SENSING_DAYSSINCE2000": "ימים מאז 2000", "SENSING_USERNAME": "שם משתמש", "SENSING_USERID": "זהות המשתמש", "SOUND_PLAY": "נגן צליל %1", "SOUND_PLAYUNTILDONE": "נגן צליל %1 עד לסיום", "SOUND_STOPALLSOUNDS": "הפסק את כל הצלילים", "SOUND_SETEFFECTO": "קבע אפקט %1 ל %2", "SOUND_CHANGEEFFECTBY": "שנה אפקט %1 ב %2", "SOUND_CLEAREFFECTS": "נקה אפקטים קוליים", "SOUND_EFFECTS_PITCH": "גובה צליל", "SOUND_EFFECTS_PAN": "ערוץ שמע שמאלי/ימני", "SOUND_CHANGEVOLUMEBY": "שנה עוצמת קול ב %1", "SOUND_SETVOLUMETO": "קבע עוצמת קול ל %1%", "SOUND_VOLUME": "עוצמת קול", "CATEGORY_MOTION": "תנועה", "CATEGORY_LOOKS": "מראה", "CATEGORY_SOUND": "צלילים", "CATEGORY_EVENTS": "אירועים", "CATEGORY_CONTROL": "בקרה", "CATEGORY_SENSING": "חיישנים", "CATEGORY_OPERATORS": "מפעילים", "CATEGORY_VARIABLES": "משתנים", "CATEGORY_MYBLOCKS": "הלבנים שלי", "DUPLICATE": "שכפל", "DELETE": "מחק", "ADD_COMMENT": "הוסף תגובה", "REMOVE_COMMENT": "מחק תגובה", "DELETE_BLOCK": "מחק לבנה", "DELETE_X_BLOCKS": "מחק %1 לבנים ", "DELETE_ALL_BLOCKS": "למחוק את כל הלבנים של %1?", "CLEAN_UP": "נקה לבנים", "HELP": "עזרה", "UNDO": "בטל", "REDO": "בצע שוב", "EDIT_PROCEDURE": "ערוך", "SHOW_PROCEDURE_DEFINITION": "עבור להגדרה", "WORKSPACE_COMMENT_DEFAULT_TEXT": "אמור משהו...", "COLOUR_HUE_LABEL": "צבע", "COLOUR_SATURATION_LABEL": "רווי צבע", "COLOUR_BRIGHTNESS_LABEL": "בהירות", "CHANGE_VALUE_TITLE": "שנה ערך:", "RENAME_VARIABLE": "שנה שם משתנה", "RENAME_VARIABLE_TITLE": "שנה שמם של המשתנים \"%1\" ל:", "RENAME_VARIABLE_MODAL_TITLE": "שנה שם משתנה", "NEW_VARIABLE": "צור משתנה", "NEW_VARIABLE_TITLE": "שם המשתנה", "VARIABLE_MODAL_TITLE": "משתנה חדשה", "VARIABLE_ALREADY_EXISTS": "משתנה בשם \"%1\" כבר קיים", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "משתנה בשם \"%1\" כבר קיים למשתנה מסוג \"%2\"", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "צור לבנה", "PROCEDURE_ALREADY_EXISTS": "פרוצדורה בשם \"%1\" כבר קיימת", "NEW_LIST": "צור רשימה", "NEW_LIST_TITLE": "שם הרשימה", "LIST_MODAL_TITLE": "רשימה חדשה", "LIST_ALREADY_EXISTS": "רשימה בשם \"%1\" כבר קיימת", "RENAME_LIST_TITLE": "שנה כל \"%1\" הרשימות ל:", "RENAME_LIST_MODAL_TITLE": "שנה שם רשימה", "NEW_BROADCAST_MESSAGE": "מסר חדש", "NEW_BROADCAST_MESSAGE_TITLE": "צור מסר חדש", "BROADCAST_MODAL_TITLE": "מסר חדש", "DEFAULT_BROADCAST_MESSAGE_NAME": "מסר 1" }; Blockly.ScratchMsgs.locales["hu"] = { "CONTROL_FOREVER": "örökké", "CONTROL_REPEAT": "repeat %1", "CONTROL_IF": "if %1 then", "CONTROL_ELSE": "különben", "CONTROL_STOP": "állj", "CONTROL_STOP_ALL": "mind", "CONTROL_STOP_THIS": "ez a feladat", "CONTROL_STOP_OTHER": "szereplő többi feladata", "CONTROL_WAIT": "wait %1 seconds", "CONTROL_WAITUNTIL": "wait until %1", "CONTROL_REPEATUNTIL": "repeat until %1", "CONTROL_WHILE": "while %1", "CONTROL_FOREACH": "for each %1 in %2", "CONTROL_STARTASCLONE": "mikor indul, mint egy klón", "CONTROL_CREATECLONEOF": "create clone of %1", "CONTROL_CREATECLONEOF_MYSELF": "magadról", "CONTROL_DELETETHISCLONE": "klón törlése", "CONTROL_COUNTER": "számláló", "CONTROL_INCRCOUNTER": "increment counter", "CONTROL_CLEARCOUNTER": "clear counter", "CONTROL_ALLATONCE": "all at once", "DATA_SETVARIABLETO": "set %1 to %2", "DATA_CHANGEVARIABLEBY": "change %1 by %2", "DATA_SHOWVARIABLE": "show variable %1", "DATA_HIDEVARIABLE": "hide variable %1", "DATA_ADDTOLIST": "add %1 to %2", "DATA_DELETEOFLIST": "delete %1 of %2", "DATA_INSERTATLIST": "insert %1 at %2 of %3", "DATA_REPLACEITEMOFLIST": "replace item %1 of %2 with %3", "DATA_ITEMOFLIST": "item %1 of %2", "DATA_LENGTHOFLIST": "length of %1", "DATA_LISTCONTAINSITEM": "%1 contains %2?", "DATA_SHOWLIST": "show list %1", "DATA_HIDELIST": "hide list %1", "DATA_INDEX_ALL": "mind", "DATA_INDEX_LAST": "utolsó", "DATA_INDEX_RANDOM": "véletlen", "EVENT_WHENFLAGCLICKED": "when %1 clicked", "EVENT_WHENTHISSPRITECLICKED": "ha erre a szereplőre a kattint", "EVENT_WHENSTAGECLICKED": "when stage clicked", "EVENT_WHENTOUCHINGOBJECT": "when this sprite touches %1", "EVENT_WHENBROADCASTRECEIVED": "when I receive %1", "EVENT_WHENBACKDROPSWITCHESTO": "when backdrop switches to %1", "EVENT_WHENGREATERTHAN": "when %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "időzítő", "EVENT_BROADCAST": "broadcast %1", "EVENT_BROADCASTANDWAIT": "broadcast %1 and wait", "EVENT_WHENKEYPRESSED": "when %1 key pressed", "EVENT_WHENKEYPRESSED_SPACE": "szóköz", "EVENT_WHENKEYPRESSED_LEFT": "balra nyíl", "EVENT_WHENKEYPRESSED_RIGHT": "jobbra nyíl", "EVENT_WHENKEYPRESSED_DOWN": "lefele nyíl", "EVENT_WHENKEYPRESSED_UP": "felfele nyíl", "EVENT_WHENKEYPRESSED_ANY": "egyik", "LOOKS_SAYFORSECS": "say %1 for %2 seconds", "LOOKS_SAY": "say %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "think %1 for %2 seconds", "LOOKS_THINK": "think %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "mutat", "LOOKS_HIDE": "elrejt", "LOOKS_HIDEALLSPRITES": "hide all sprites", "LOOKS_EFFECT_COLOR": "szín", "LOOKS_EFFECT_FISHEYE": "halszem", "LOOKS_EFFECT_WHIRL": "örvény", "LOOKS_EFFECT_PIXELATE": "képpont", "LOOKS_EFFECT_MOSAIC": "mozaik", "LOOKS_EFFECT_BRIGHTNESS": "fényerő", "LOOKS_EFFECT_GHOST": "szellem", "LOOKS_CHANGEEFFECTBY": "change %1 effect by %2", "LOOKS_SETEFFECTTO": "set %1 effect to %2", "LOOKS_CLEARGRAPHICEFFECTS": "töröld a grafikus hatásokat", "LOOKS_CHANGESIZEBY": "change size by %1", "LOOKS_SETSIZETO": "set size to %1 %", "LOOKS_SIZE": "méret", "LOOKS_CHANGESTRETCHBY": "change stretch by %1", "LOOKS_SETSTRETCHTO": "set stretch to %1 %", "LOOKS_SWITCHCOSTUMETO": "switch costume to %1", "LOOKS_NEXTCOSTUME": "következő jelmez", "LOOKS_SWITCHBACKDROPTO": "switch backdrop to %1", "LOOKS_GOTOFRONTBACK": "go to %1 layer", "LOOKS_GOTOFRONTBACK_FRONT": "előtérbe", "LOOKS_GOTOFRONTBACK_BACK": "háttérbe", "LOOKS_GOFORWARDBACKWARDLAYERS": "go %1 %2 layers", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "előre", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "hátra", "LOOKS_BACKDROPNUMBERNAME": "backdrop %1", "LOOKS_COSTUMENUMBERNAME": "costume %1", "LOOKS_NUMBERNAME_NUMBER": "szám", "LOOKS_NUMBERNAME_NAME": "név", "LOOKS_SWITCHBACKDROPTOANDWAIT": "switch backdrop to %1 and wait", "LOOKS_NEXTBACKDROP": "következő háttér", "LOOKS_PREVIOUSBACKDROP": "előző háttér", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "move %1 steps", "MOTION_TURNLEFT": "fordulj %1 %2 fokot", "MOTION_TURNRIGHT": "fordulj %1 %2 fokot", "MOTION_POINTINDIRECTION": "point in direction %1", "MOTION_POINTTOWARDS": "point towards %1", "MOTION_POINTTOWARDS_POINTER": "egérmutató", "MOTION_GOTO": "ugorj %1", "MOTION_GOTO_POINTER": "egérmutató", "MOTION_GOTO_RANDOM": "véletlen pozíció", "MOTION_GOTOXY": "go to x: %1 y: %2", "MOTION_GLIDESECSTOXY": "glide %1 secs to x: %2 y: %3", "MOTION_GLIDETO": "glide %1 secs to %2", "MOTION_GLIDETO_POINTER": "egérmutató", "MOTION_GLIDETO_RANDOM": "véletlen pozíció", "MOTION_CHANGEXBY": "change x by %1", "MOTION_SETX": "set x to %1", "MOTION_CHANGEYBY": "change y by %1", "MOTION_SETY": "set y to %1", "MOTION_IFONEDGEBOUNCE": "ha a szélén, ugrál", "MOTION_SETROTATIONSTYLE": "set rotation style %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "balra-jobbra", "MOTION_SETROTATIONSTYLE_DONTROTATE": "nem foroghat", "MOTION_SETROTATIONSTYLE_ALLAROUND": "foroghat", "MOTION_XPOSITION": "x pozíció", "MOTION_YPOSITION": "y pozíció", "MOTION_DIRECTION": "irány", "MOTION_SCROLLRIGHT": "scroll right %1", "MOTION_SCROLLUP": "scroll up %1", "MOTION_ALIGNSCENE": "align scene %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "bottom-left", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "bottom-right", "MOTION_ALIGNSCENE_MIDDLE": "middle", "MOTION_ALIGNSCENE_TOPLEFT": "top-left", "MOTION_ALIGNSCENE_TOPRIGHT": "top-right", "MOTION_XSCROLL": "x scroll", "MOTION_YSCROLL": "y scroll", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "pick random %1 to %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 és %2", "OPERATORS_OR": "%1 vagy %2", "OPERATORS_NOT": "not %1", "OPERATORS_JOIN": "join %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "letter %1 of %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "length of %1", "OPERATORS_CONTAINS": "%1 contains %2?", "OPERATORS_MOD": "%1 mod %2", "OPERATORS_ROUND": "round %1", "OPERATORS_MATHOP": "%1 of %2", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "lefelé kerekítve", "OPERATORS_MATHOP_CEILING": "felfelé kerekítve", "OPERATORS_MATHOP_SQRT": "sqrt", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "arcsin", "OPERATORS_MATHOP_ACOS": "arccos", "OPERATORS_MATHOP_ATAN": "arctan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "define %1", "SENSING_TOUCHINGOBJECT": "touching %1?", "SENSING_TOUCHINGOBJECT_POINTER": "egérmutató", "SENSING_TOUCHINGOBJECT_EDGE": "játéktér széle", "SENSING_TOUCHINGCOLOR": "touching color %1?", "SENSING_COLORISTOUCHINGCOLOR": "color %1 is touching %2?", "SENSING_DISTANCETO": "distance to %1", "SENSING_DISTANCETO_POINTER": "egérmutató", "SENSING_ASKANDWAIT": "ask %1 and wait", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "válasz", "SENSING_KEYPRESSED": "key %1 pressed?", "SENSING_MOUSEDOWN": "egér lenyomva?", "SENSING_MOUSEX": "egér x", "SENSING_MOUSEY": "egér y", "SENSING_SETDRAGMODE": "set drag mode %1", "SENSING_SETDRAGMODE_DRAGGABLE": "draggable", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "not draggable", "SENSING_LOUDNESS": "hangerő", "SENSING_LOUD": "loud?", "SENSING_TIMER": "időzítő", "SENSING_RESETTIMER": "időzítő visszaállítása", "SENSING_OF": "%1 of %2", "SENSING_OF_XPOSITION": "x pozíció", "SENSING_OF_YPOSITION": "y pozíció", "SENSING_OF_DIRECTION": "irány", "SENSING_OF_COSTUMENUMBER": "lemez #", "SENSING_OF_COSTUMENAME": "jelmez név", "SENSING_OF_SIZE": "méret", "SENSING_OF_VOLUME": "hangerő", "SENSING_OF_BACKDROPNUMBER": "háttér sorszáma", "SENSING_OF_BACKDROPNAME": "háttér neve", "SENSING_OF_STAGE": "Játéktér", "SENSING_CURRENT": "current %1", "SENSING_CURRENT_YEAR": "év", "SENSING_CURRENT_MONTH": "hónap", "SENSING_CURRENT_DATE": "nap", "SENSING_CURRENT_DAYOFWEEK": "hét napja", "SENSING_CURRENT_HOUR": "óra", "SENSING_CURRENT_MINUTE": "perc", "SENSING_CURRENT_SECOND": "másodperc", "SENSING_DAYSSINCE2000": "napok 2000 óta", "SENSING_USERNAME": "felhasználónév", "SENSING_USERID": "user id", "SOUND_PLAY": "start sound %1", "SOUND_PLAYUNTILDONE": "play sound %1 until done", "SOUND_STOPALLSOUNDS": "minden hang álljon le", "SOUND_SETEFFECTO": "set %1 effect to %2", "SOUND_CHANGEEFFECTBY": "change %1 effect by %2", "SOUND_CLEAREFFECTS": "clear sound effects", "SOUND_EFFECTS_PITCH": "pitch", "SOUND_EFFECTS_PAN": "pan left/right", "SOUND_CHANGEVOLUMEBY": "change volume by %1", "SOUND_SETVOLUMETO": "set volume to %1%", "SOUND_VOLUME": "hangerő", "CATEGORY_MOTION": "Mozgás", "CATEGORY_LOOKS": "Kinézet", "CATEGORY_SOUND": "Hang", "CATEGORY_EVENTS": "Események", "CATEGORY_CONTROL": "Vezérlőelem", "CATEGORY_SENSING": "Érzékelés", "CATEGORY_OPERATORS": "Operátorok", "CATEGORY_VARIABLES": "Variables", "CATEGORY_MYBLOCKS": "My Blocks", "DUPLICATE": "Duplikálás", "DELETE": "Törlés", "ADD_COMMENT": "Add Comment", "REMOVE_COMMENT": "Remove Comment", "DELETE_BLOCK": "Delete Block", "DELETE_X_BLOCKS": "Delete %1 Blocks", "DELETE_ALL_BLOCKS": "Delete all %1 blocks?", "CLEAN_UP": "Clean up Blocks", "HELP": "Súgó", "UNDO": "Visszavonás", "REDO": "Mégis", "EDIT_PROCEDURE": "Szerkesztés", "SHOW_PROCEDURE_DEFINITION": "Go to definition", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Say something...", "COLOUR_HUE_LABEL": "Szín", "COLOUR_SATURATION_LABEL": "Színtelítettség", "COLOUR_BRIGHTNESS_LABEL": "Fényerő", "CHANGE_VALUE_TITLE": "Change value:", "RENAME_VARIABLE": "Rename variable", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Rename Variable", "NEW_VARIABLE": "Készíts egy változót", "NEW_VARIABLE_TITLE": "New variable name:", "VARIABLE_MODAL_TITLE": "Új változó", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Készíts blokkot", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Készíts egy listát", "NEW_LIST_TITLE": "New list name:", "LIST_MODAL_TITLE": "Új lista", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Rename List", "NEW_BROADCAST_MESSAGE": "New message", "NEW_BROADCAST_MESSAGE_TITLE": "New message name:", "BROADCAST_MODAL_TITLE": "Új üzenet", "DEFAULT_BROADCAST_MESSAGE_NAME": "üzenet1" }; Blockly.ScratchMsgs.locales["id"] = { "CONTROL_FOREVER": "selamanya", "CONTROL_REPEAT": "ulangi %1 kali", "CONTROL_IF": "jika %1 maka", "CONTROL_ELSE": "jika tidak", "CONTROL_STOP": "berhenti", "CONTROL_STOP_ALL": "semua", "CONTROL_STOP_THIS": "skrip ini", "CONTROL_STOP_OTHER": "skrip lain di sprite ini", "CONTROL_WAIT": "tunggu %1 detik", "CONTROL_WAITUNTIL": "tunggu sampai %1", "CONTROL_REPEATUNTIL": "ulangi sampai %1", "CONTROL_WHILE": "selama %1", "CONTROL_FOREACH": "untuk setiap %1 dalam %2", "CONTROL_STARTASCLONE": "ketika aku mulai sebagai clone", "CONTROL_CREATECLONEOF": "buat clone dari %1", "CONTROL_CREATECLONEOF_MYSELF": "diriku", "CONTROL_DELETETHISCLONE": "hapus clone ini", "CONTROL_COUNTER": "hitungan", "CONTROL_INCRCOUNTER": "tingkatkan hitungan", "CONTROL_CLEARCOUNTER": "bersihkan hitungan", "CONTROL_ALLATONCE": "semuanya sekaligus", "DATA_SETVARIABLETO": "atur %1 ke %2", "DATA_CHANGEVARIABLEBY": "ubah %1 sebesar %2", "DATA_SHOWVARIABLE": "tampilkan variabel %1", "DATA_HIDEVARIABLE": "sembunyikan variabel %1", "DATA_ADDTOLIST": "tambahkan %1 ke %2", "DATA_DELETEOFLIST": "hapus %1 dari %2", "DATA_INSERTATLIST": "sisipkan %1 pada %2 dari %3", "DATA_REPLACEITEMOFLIST": "ganti benda %1 dari %2 dengan %3", "DATA_ITEMOFLIST": "benda %1 dari %2", "DATA_LENGTHOFLIST": "panjang dari %1", "DATA_LISTCONTAINSITEM": "%1 berisi %2?", "DATA_SHOWLIST": "tampilkan daftar %1", "DATA_HIDELIST": "sembunyikan daftar %1", "DATA_INDEX_ALL": "semua", "DATA_INDEX_LAST": "terakhir", "DATA_INDEX_RANDOM": "random", "EVENT_WHENFLAGCLICKED": "ketika %1 diklik", "EVENT_WHENTHISSPRITECLICKED": "ketika sprite ini diklik", "EVENT_WHENSTAGECLICKED": "ketika panggung diklik", "EVENT_WHENTOUCHINGOBJECT": "ketika sprite ini menyentuk %1", "EVENT_WHENBROADCASTRECEIVED": "ketika aku menerima %1", "EVENT_WHENBACKDROPSWITCHESTO": "ketika latar menjadi %1", "EVENT_WHENGREATERTHAN": "ketika %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "pengatur waktu", "EVENT_BROADCAST": "siarkan %1", "EVENT_BROADCASTANDWAIT": "siarkan %1 dan tunggu", "EVENT_WHENKEYPRESSED": "ketika tombol %1 ditekan", "EVENT_WHENKEYPRESSED_SPACE": "spasi", "EVENT_WHENKEYPRESSED_LEFT": "panah kiri", "EVENT_WHENKEYPRESSED_RIGHT": "panah kanan", "EVENT_WHENKEYPRESSED_DOWN": "panah bawah", "EVENT_WHENKEYPRESSED_UP": "panah atas", "EVENT_WHENKEYPRESSED_ANY": "manapun", "LOOKS_SAYFORSECS": "katakan %1 selama %2 detik", "LOOKS_SAY": "katakan %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "pikirkan %1 selama %2 detik", "LOOKS_THINK": "pikirkan %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "tampilkan", "LOOKS_HIDE": "sembunyikan", "LOOKS_HIDEALLSPRITES": "sembunyikan semua sprite", "LOOKS_EFFECT_COLOR": "warna", "LOOKS_EFFECT_FISHEYE": "mata ikan", "LOOKS_EFFECT_WHIRL": "pusaran", "LOOKS_EFFECT_PIXELATE": "pixelasi", "LOOKS_EFFECT_MOSAIC": "mosaik", "LOOKS_EFFECT_BRIGHTNESS": "kecerahan", "LOOKS_EFFECT_GHOST": "bayangan", "LOOKS_CHANGEEFFECTBY": "ubah efek %1 sebesar %2", "LOOKS_SETEFFECTTO": "atur efek %1 ke %2", "LOOKS_CLEARGRAPHICEFFECTS": "hapus semua efek grafis", "LOOKS_CHANGESIZEBY": "ubah ukuran sebesar %1", "LOOKS_SETSIZETO": "atur ukuran ke %1 %", "LOOKS_SIZE": "ukuran", "LOOKS_CHANGESTRETCHBY": "ubah rentangan sebesar %1", "LOOKS_SETSTRETCHTO": "atur rentangan ke %1 %", "LOOKS_SWITCHCOSTUMETO": "ganti kostum ke %1", "LOOKS_NEXTCOSTUME": "kostum berikutnya", "LOOKS_SWITCHBACKDROPTO": "ganti latar ke %1", "LOOKS_GOTOFRONTBACK": "pergi ke lapisan %1", "LOOKS_GOTOFRONTBACK_FRONT": "depan", "LOOKS_GOTOFRONTBACK_BACK": "belakang", "LOOKS_GOFORWARDBACKWARDLAYERS": "pergi %1 %2 lapisan", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "maju", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "mundur", "LOOKS_BACKDROPNUMBERNAME": "latar %1", "LOOKS_COSTUMENUMBERNAME": "kostum %1", "LOOKS_NUMBERNAME_NUMBER": "angka", "LOOKS_NUMBERNAME_NAME": "nama", "LOOKS_SWITCHBACKDROPTOANDWAIT": "ganti latar ke %1 dan tunggu", "LOOKS_NEXTBACKDROP": "latar berikutnya", "LOOKS_PREVIOUSBACKDROP": "Latar sebelumnya", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "gerak %1 langkah", "MOTION_TURNLEFT": "putar %1 %2 derajat", "MOTION_TURNRIGHT": "putar %1 %2 derajat", "MOTION_POINTINDIRECTION": "mengarah ke arah %1", "MOTION_POINTTOWARDS": "mengarah ke %1", "MOTION_POINTTOWARDS_POINTER": "penunjuk tetikus", "MOTION_GOTO": "pergi ke %1", "MOTION_GOTO_POINTER": "penunjuk tetikus", "MOTION_GOTO_RANDOM": "posisi sembarang", "MOTION_GOTOXY": "pergi ke x: %1 y: %2", "MOTION_GLIDESECSTOXY": "meluncur %1 detik ke x: %2 y: %3", "MOTION_GLIDETO": "meluncur %1 detik ke %2", "MOTION_GLIDETO_POINTER": "penunjuk tetikus", "MOTION_GLIDETO_RANDOM": "posisi sembarang", "MOTION_CHANGEXBY": "ubah x sebesar %1", "MOTION_SETX": "atur x ke %1", "MOTION_CHANGEYBY": "ubah y sebesar %1", "MOTION_SETY": "atur y ke %1", "MOTION_IFONEDGEBOUNCE": "jika di pinggir, pantulkan", "MOTION_SETROTATIONSTYLE": "atur gaya rotasi %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "kiri-kanan", "MOTION_SETROTATIONSTYLE_DONTROTATE": "jangan berputar", "MOTION_SETROTATIONSTYLE_ALLAROUND": "seluruh", "MOTION_XPOSITION": "posisi x", "MOTION_YPOSITION": "posisi y", "MOTION_DIRECTION": "arah", "MOTION_SCROLLRIGHT": "gulir ke kanan %1", "MOTION_SCROLLUP": "gulir ke atas %1", "MOTION_ALIGNSCENE": "luruskan pemandangan %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "kiri-bawah", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "kanan-bawah", "MOTION_ALIGNSCENE_MIDDLE": "tengah", "MOTION_ALIGNSCENE_TOPLEFT": "kiri-atas", "MOTION_ALIGNSCENE_TOPRIGHT": "kanan-atas", "MOTION_XSCROLL": "guliran x", "MOTION_YSCROLL": "guliran y", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "pilih acak dari %1 hingga %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 dan %2", "OPERATORS_OR": "%1 atau %2", "OPERATORS_NOT": "tidak %1", "OPERATORS_JOIN": "gabungkan %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "huruf %1 dari %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "panjang dari %1", "OPERATORS_CONTAINS": "%1 berisi %2?", "OPERATORS_MOD": "%1 mod %2", "OPERATORS_ROUND": "bulatkan %1", "OPERATORS_MATHOP": "%1 dari %2", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "floor", "OPERATORS_MATHOP_CEILING": "ceil", "OPERATORS_MATHOP_SQRT": "akar kuadrat", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "artikan %1", "SENSING_TOUCHINGOBJECT": "menyentuh %1?", "SENSING_TOUCHINGOBJECT_POINTER": "penunjuk tetikus", "SENSING_TOUCHINGOBJECT_EDGE": "pinggir", "SENSING_TOUCHINGCOLOR": "menyentuh warna %1?", "SENSING_COLORISTOUCHINGCOLOR": "warna %1 menyentuh %2?", "SENSING_DISTANCETO": "jarak dari %1", "SENSING_DISTANCETO_POINTER": "penunujuk tetikus", "SENSING_ASKANDWAIT": "tanya %1 dan tunggu", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "jawaban", "SENSING_KEYPRESSED": "tombol %1 ditekan?", "SENSING_MOUSEDOWN": "tetikus ditekan?", "SENSING_MOUSEX": "x tetikus", "SENSING_MOUSEY": "y tetikus", "SENSING_SETDRAGMODE": "atur mode seret %1", "SENSING_SETDRAGMODE_DRAGGABLE": "dapat diseret", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "tidak dapat diseret", "SENSING_LOUDNESS": "kenyaringan", "SENSING_LOUD": "nyaring?", "SENSING_TIMER": "pengatur waktu", "SENSING_RESETTIMER": "atur ulang pengatur waktu", "SENSING_OF": "%1 dari %2", "SENSING_OF_XPOSITION": "posisi x", "SENSING_OF_YPOSITION": "posisi y", "SENSING_OF_DIRECTION": "arah", "SENSING_OF_COSTUMENUMBER": "kostum #", "SENSING_OF_COSTUMENAME": "nama kostum", "SENSING_OF_SIZE": "ukuran", "SENSING_OF_VOLUME": "volume", "SENSING_OF_BACKDROPNUMBER": "latar #", "SENSING_OF_BACKDROPNAME": "nama latar", "SENSING_OF_STAGE": "Stage", "SENSING_CURRENT": "%1 saat ini", "SENSING_CURRENT_YEAR": "tahun", "SENSING_CURRENT_MONTH": "bulan", "SENSING_CURRENT_DATE": "tanggal", "SENSING_CURRENT_DAYOFWEEK": "nama hari", "SENSING_CURRENT_HOUR": "jam", "SENSING_CURRENT_MINUTE": "menit", "SENSING_CURRENT_SECOND": "detik", "SENSING_DAYSSINCE2000": "hari-hari sejak 2000", "SENSING_USERNAME": "nama pengguna", "SENSING_USERID": "id pengguna", "SOUND_PLAY": "mulai suara %1", "SOUND_PLAYUNTILDONE": "mainkan suara %1 sampai selesai", "SOUND_STOPALLSOUNDS": "hentikan semua suara", "SOUND_SETEFFECTO": "atur efek %1 ke %2", "SOUND_CHANGEEFFECTBY": "ubah efek %1 sebesar %2", "SOUND_CLEAREFFECTS": "hapus semua efek suara", "SOUND_EFFECTS_PITCH": "nada", "SOUND_EFFECTS_PAN": "pan kiri/kanan", "SOUND_CHANGEVOLUMEBY": "ubah volume sebesar %1", "SOUND_SETVOLUMETO": "atur volume ke %1%", "SOUND_VOLUME": "volume", "CATEGORY_MOTION": "Gerakan", "CATEGORY_LOOKS": "Tampilan", "CATEGORY_SOUND": "Suara", "CATEGORY_EVENTS": "Kejadian", "CATEGORY_CONTROL": "Kontrol", "CATEGORY_SENSING": "Sensor", "CATEGORY_OPERATORS": "Operator", "CATEGORY_VARIABLES": "Variables", "CATEGORY_MYBLOCKS": "My Blocks", "DUPLICATE": "Gandakan", "DELETE": "Hapus", "ADD_COMMENT": "Tambahkan Komentar", "REMOVE_COMMENT": "Hapus Komentar", "DELETE_BLOCK": "Hapus Balok", "DELETE_X_BLOCKS": "Hapus %1 Balok-Balok", "DELETE_ALL_BLOCKS": "Hapus semua %1 balok?", "CLEAN_UP": "Bersihkan Balok-Balok", "HELP": "Bantuan", "UNDO": "Undo", "REDO": "Ulangi", "EDIT_PROCEDURE": "Edit", "SHOW_PROCEDURE_DEFINITION": "Pergi ke pengartian", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Katakan sesuatu...", "COLOUR_HUE_LABEL": "Warna", "COLOUR_SATURATION_LABEL": "Saturasi", "COLOUR_BRIGHTNESS_LABEL": "Keterangan", "CHANGE_VALUE_TITLE": "Ubah nilai:", "RENAME_VARIABLE": "Namakan ulang variabel", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Namakan Ulang Variabel", "NEW_VARIABLE": "Buat sebuah Variabel", "NEW_VARIABLE_TITLE": "Nama variabel baru:", "VARIABLE_MODAL_TITLE": "Variabel Baru", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Buat sebuah Balok", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Buat sebuah Daftar", "NEW_LIST_TITLE": "Nama daftar baru:", "LIST_MODAL_TITLE": "List Baru", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Namakan Ulang Daftar:", "NEW_BROADCAST_MESSAGE": "Pesan baru", "NEW_BROADCAST_MESSAGE_TITLE": "Nama pesan baru:", "BROADCAST_MODAL_TITLE": "Pesan Baru", "DEFAULT_BROADCAST_MESSAGE_NAME": "pesan1" }; Blockly.ScratchMsgs.locales["it"] = { "CONTROL_FOREVER": "per sempre", "CONTROL_REPEAT": "ripeti %1 volte", "CONTROL_IF": "se %1 allora", "CONTROL_ELSE": "altrimenti", "CONTROL_STOP": "ferma", "CONTROL_STOP_ALL": "tutto", "CONTROL_STOP_THIS": "questo script", "CONTROL_STOP_OTHER": "tutti gli altri script dello sprite", "CONTROL_WAIT": "attendi %1 secondi", "CONTROL_WAITUNTIL": "attendi fino a quando %1", "CONTROL_REPEATUNTIL": "ripeti fino a quando %1", "CONTROL_WHILE": "mentre %1", "CONTROL_FOREACH": "per ogni %1 in %2", "CONTROL_STARTASCLONE": "quando vengo clonato", "CONTROL_CREATECLONEOF": "crea clone di %1", "CONTROL_CREATECLONEOF_MYSELF": "me stesso", "CONTROL_DELETETHISCLONE": "elimina questo clone", "CONTROL_COUNTER": "contatore", "CONTROL_INCRCOUNTER": "incrementa contatore", "CONTROL_CLEARCOUNTER": "azzera contatore", "CONTROL_ALLATONCE": "esegui tutto insieme", "DATA_SETVARIABLETO": "porta %1 a %2", "DATA_CHANGEVARIABLEBY": "cambia %1 di %2", "DATA_SHOWVARIABLE": "mostra la variabile %1", "DATA_HIDEVARIABLE": "nascondi la variabile %1", "DATA_ADDTOLIST": "aggiungi %1 a %2", "DATA_DELETEOFLIST": "cancella %1 da %2", "DATA_INSERTATLIST": "inserisci %1 alla posizione %2 di %3", "DATA_REPLACEITEMOFLIST": "sostituisci elemento %1 di %2 con %3", "DATA_ITEMOFLIST": "elemento %1 di %2", "DATA_LENGTHOFLIST": "lunghezza di %1", "DATA_LISTCONTAINSITEM": "%1 contiene %2?", "DATA_SHOWLIST": "mostra la lista %1", "DATA_HIDELIST": "nascondi la lista %1", "DATA_INDEX_ALL": "tutto", "DATA_INDEX_LAST": "ultimo", "DATA_INDEX_RANDOM": "a caso", "EVENT_WHENFLAGCLICKED": "quando si clicca sullo sprite %1", "EVENT_WHENTHISSPRITECLICKED": "quando si clicca questo sprite", "EVENT_WHENSTAGECLICKED": "quando si clicca sullo Stage", "EVENT_WHENTOUCHINGOBJECT": "quando questo sprite tocca %1", "EVENT_WHENBROADCASTRECEIVED": "quando ricevo %1", "EVENT_WHENBACKDROPSWITCHESTO": "quando lo sfondo passa a %1", "EVENT_WHENGREATERTHAN": "porta %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "cronometro", "EVENT_BROADCAST": "invia a tutti %1", "EVENT_BROADCASTANDWAIT": "invia a tutti %1 e attendi", "EVENT_WHENKEYPRESSED": "quando si preme il tasto %1", "EVENT_WHENKEYPRESSED_SPACE": "spazio", "EVENT_WHENKEYPRESSED_LEFT": "freccia sinistra", "EVENT_WHENKEYPRESSED_RIGHT": "freccia destra", "EVENT_WHENKEYPRESSED_DOWN": "freccia giù", "EVENT_WHENKEYPRESSED_UP": "freccia su", "EVENT_WHENKEYPRESSED_ANY": "qualunque", "LOOKS_SAYFORSECS": "dire %1 per %2 secondi", "LOOKS_SAY": "dire %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "pensa %1 per %2 secondi", "LOOKS_THINK": "pensa %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "mostra", "LOOKS_HIDE": "nascondi", "LOOKS_HIDEALLSPRITES": "nascondi tutti gli sprite", "LOOKS_EFFECT_COLOR": "colore", "LOOKS_EFFECT_FISHEYE": "fish-eye", "LOOKS_EFFECT_WHIRL": "mulinello", "LOOKS_EFFECT_PIXELATE": "effetto pixel", "LOOKS_EFFECT_MOSAIC": "mosaico", "LOOKS_EFFECT_BRIGHTNESS": "luminosità", "LOOKS_EFFECT_GHOST": "fantasma", "LOOKS_CHANGEEFFECTBY": "cambia effetto %1 di %2", "LOOKS_SETEFFECTTO": "porta effetto %1 a %2", "LOOKS_CLEARGRAPHICEFFECTS": "rimuovi effetti grafici", "LOOKS_CHANGESIZEBY": "cambia dimensione di %1", "LOOKS_SETSIZETO": "porta dimensione a %1 %", "LOOKS_SIZE": "dimensione", "LOOKS_CHANGESTRETCHBY": "cambia allungamento di %1", "LOOKS_SETSTRETCHTO": "porta allungamento a %1 %", "LOOKS_SWITCHCOSTUMETO": "passa al costume %1", "LOOKS_NEXTCOSTUME": "costume seguente", "LOOKS_SWITCHBACKDROPTO": "passa allo sfondo %1", "LOOKS_GOTOFRONTBACK": "vai al %1 livello", "LOOKS_GOTOFRONTBACK_FRONT": "Primo piano", "LOOKS_GOTOFRONTBACK_BACK": "Secondo piano", "LOOKS_GOFORWARDBACKWARDLAYERS": "vai %1 %2 livelli", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "avanti", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "indietro", "LOOKS_BACKDROPNUMBERNAME": "sfondo %1", "LOOKS_COSTUMENUMBERNAME": "costume %1", "LOOKS_NUMBERNAME_NUMBER": "numero", "LOOKS_NUMBERNAME_NAME": "nome", "LOOKS_SWITCHBACKDROPTOANDWAIT": "passa allo sfondo %1 e attendi", "LOOKS_NEXTBACKDROP": "passa allo sfondo seguente", "LOOKS_PREVIOUSBACKDROP": "sfondo precedente", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "fai %1 passi", "MOTION_TURNLEFT": "ruota %1 di %2 gradi", "MOTION_TURNRIGHT": "ruota %1 di %2 gradi", "MOTION_POINTINDIRECTION": "punta in direzione %1", "MOTION_POINTTOWARDS": "punta verso %1", "MOTION_POINTTOWARDS_POINTER": "puntatore del mouse", "MOTION_GOTO": "vai a %1", "MOTION_GOTO_POINTER": "puntatore del mouse", "MOTION_GOTO_RANDOM": "posizione a caso", "MOTION_GOTOXY": "vai a x: %1 y: %2", "MOTION_GLIDESECSTOXY": "scivola in %1 secondi a x: %2 y: %3", "MOTION_GLIDETO": "scivola in %1 secondi a %2", "MOTION_GLIDETO_POINTER": "puntatore del mouse", "MOTION_GLIDETO_RANDOM": "posizione a caso", "MOTION_CHANGEXBY": "cambia x di %1", "MOTION_SETX": "vai dove y è %1", "MOTION_CHANGEYBY": "cambia y di %1", "MOTION_SETY": "vai dove y è %1", "MOTION_IFONEDGEBOUNCE": "rimbalza quando tocchi il bordo", "MOTION_SETROTATIONSTYLE": "porta stile rotazione a %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "sinistra-destra", "MOTION_SETROTATIONSTYLE_DONTROTATE": "non ruotare", "MOTION_SETROTATIONSTYLE_ALLAROUND": "può ruotare", "MOTION_XPOSITION": "posizione x", "MOTION_YPOSITION": "posizione y", "MOTION_DIRECTION": "direzione", "MOTION_SCROLLRIGHT": "scrolla a destra di %1", "MOTION_SCROLLUP": "scrolla in alto di %1", "MOTION_ALIGNSCENE": "allinea la scena %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "in basso a sinistra", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "in basso a destra", "MOTION_ALIGNSCENE_MIDDLE": "in mezzo", "MOTION_ALIGNSCENE_TOPLEFT": "in alto a sinistra", "MOTION_ALIGNSCENE_TOPRIGHT": "in alto a destra", "MOTION_XSCROLL": "posizione x dello scroll", "MOTION_YSCROLL": "posizione y dello scroll", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "numero a caso tra %1 e %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 e %2", "OPERATORS_OR": "%1 o %2", "OPERATORS_NOT": "non %1", "OPERATORS_JOIN": "unione di %1 e %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "lettera %1 di %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "lunghezza di %1", "OPERATORS_CONTAINS": "%1 contiene %2?", "OPERATORS_MOD": "resto della divisione di %1 diviso %2", "OPERATORS_ROUND": "arrotonda %1", "OPERATORS_MATHOP": "%1 di %2", "OPERATORS_MATHOP_ABS": "valore assoluto", "OPERATORS_MATHOP_FLOOR": "intero inferiore", "OPERATORS_MATHOP_CEILING": "intero superiore", "OPERATORS_MATHOP_SQRT": "radice quadrata", "OPERATORS_MATHOP_SIN": "sen", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "arcsen", "OPERATORS_MATHOP_ACOS": "arccos", "OPERATORS_MATHOP_ATAN": "arctan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "definisci %1", "SENSING_TOUCHINGOBJECT": "sta toccando %1", "SENSING_TOUCHINGOBJECT_POINTER": "puntatore del mouse", "SENSING_TOUCHINGOBJECT_EDGE": "bordo", "SENSING_TOUCHINGCOLOR": "sta toccando il colore %1?", "SENSING_COLORISTOUCHINGCOLOR": "il colore %1 sta toccando il colore %2?", "SENSING_DISTANCETO": "distanza da %1", "SENSING_DISTANCETO_POINTER": "puntatore del mouse", "SENSING_ASKANDWAIT": "chiedi %1 e attendi", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "risposta", "SENSING_KEYPRESSED": "tasto %1 premuto?", "SENSING_MOUSEDOWN": "pulsante del mouse premuto?", "SENSING_MOUSEX": "x del mouse", "SENSING_MOUSEY": "y del mouse", "SENSING_SETDRAGMODE": "rendi lo sprite %1", "SENSING_SETDRAGMODE_DRAGGABLE": "trascinabile", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "non trascinabile", "SENSING_LOUDNESS": "volume microfono", "SENSING_LOUD": "volume alto?", "SENSING_TIMER": "cronometro", "SENSING_RESETTIMER": "azzera cronometro", "SENSING_OF": "%1 di %2", "SENSING_OF_XPOSITION": "posizione x", "SENSING_OF_YPOSITION": "posizione y", "SENSING_OF_DIRECTION": "direzione", "SENSING_OF_COSTUMENUMBER": "numero del costume", "SENSING_OF_COSTUMENAME": "nome del costume", "SENSING_OF_SIZE": "dimensione", "SENSING_OF_VOLUME": "volume", "SENSING_OF_BACKDROPNUMBER": "numero dello sfondo", "SENSING_OF_BACKDROPNAME": "nome dello sfondo", "SENSING_OF_STAGE": "Palco", "SENSING_CURRENT": "%1 attuale", "SENSING_CURRENT_YEAR": "anno", "SENSING_CURRENT_MONTH": "mese", "SENSING_CURRENT_DATE": "data", "SENSING_CURRENT_DAYOFWEEK": "giorno della settimana", "SENSING_CURRENT_HOUR": "ora", "SENSING_CURRENT_MINUTE": "minuto", "SENSING_CURRENT_SECOND": "secondo", "SENSING_DAYSSINCE2000": "giorni trascorsi dal 2000", "SENSING_USERNAME": "username", "SENSING_USERID": "user id", "SOUND_PLAY": "avvia suono %1", "SOUND_PLAYUNTILDONE": "riproduci suono %1 e attendi la fine", "SOUND_STOPALLSOUNDS": "ferma tutti i suoni", "SOUND_SETEFFECTO": "porta effetto %1 a %2", "SOUND_CHANGEEFFECTBY": "cambia effetto %1 di %2", "SOUND_CLEAREFFECTS": "rimuovi effetti audio", "SOUND_EFFECTS_PITCH": "frequenza", "SOUND_EFFECTS_PAN": "panning sinistra/destra", "SOUND_CHANGEVOLUMEBY": "cambia volume di %1", "SOUND_SETVOLUMETO": "porta volume a %1%", "SOUND_VOLUME": "volume", "CATEGORY_MOTION": "Movimento", "CATEGORY_LOOKS": "Aspetto", "CATEGORY_SOUND": "Suono", "CATEGORY_EVENTS": "Situazioni", "CATEGORY_CONTROL": "Controllo", "CATEGORY_SENSING": "Sensori", "CATEGORY_OPERATORS": "Operatori", "CATEGORY_VARIABLES": "Variabili", "CATEGORY_MYBLOCKS": "I Miei Blocchi", "DUPLICATE": "Duplica", "DELETE": "Cancella", "ADD_COMMENT": "Aggiungi commento", "REMOVE_COMMENT": "Rimuovi commento", "DELETE_BLOCK": "Cancella questo Blocco", "DELETE_X_BLOCKS": "Cancella %1 Blocchi", "DELETE_ALL_BLOCKS": "Cancellare i %1 blocchi?", "CLEAN_UP": "Riordina i Blocchi", "HELP": "Aiuto", "UNDO": "Annulla", "REDO": "Ripristina", "EDIT_PROCEDURE": "Modifica", "SHOW_PROCEDURE_DEFINITION": "Vai alla definizione", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Dì qualcosa...", "COLOUR_HUE_LABEL": "Colore", "COLOUR_SATURATION_LABEL": "Saturazione", "COLOUR_BRIGHTNESS_LABEL": "Luminosità", "CHANGE_VALUE_TITLE": "Cambia il valore:", "RENAME_VARIABLE": "Rinomina la variabile", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Rinomina la Variabile", "NEW_VARIABLE": "Crea una Variabile", "NEW_VARIABLE_TITLE": "Nome della nuova variabile:", "VARIABLE_MODAL_TITLE": "Nuova Variabile", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Crea un Blocco", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Crea una Lista", "NEW_LIST_TITLE": "Nome della nuova lista:", "LIST_MODAL_TITLE": "Nuova Lista", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Rinomina la Lista", "NEW_BROADCAST_MESSAGE": "Nuovo messaggio", "NEW_BROADCAST_MESSAGE_TITLE": "Nome del nuovo messaggio:", "BROADCAST_MODAL_TITLE": "Nuovo Messaggio", "DEFAULT_BROADCAST_MESSAGE_NAME": "messaggio1" }; Blockly.ScratchMsgs.locales["ja-Hira"] = { "CONTROL_FOREVER": "ずっと", "CONTROL_REPEAT": "%1 かいくりかえす", "CONTROL_IF": "もし %1 なら", "CONTROL_ELSE": "でなければ", "CONTROL_STOP": "とめる", "CONTROL_STOP_ALL": "すべて", "CONTROL_STOP_THIS": "このスクリプト", "CONTROL_STOP_OTHER": "スプライトのほかのスクリプト", "CONTROL_WAIT": "%1 びょうまつ", "CONTROL_WAITUNTIL": "%1 までまつ", "CONTROL_REPEATUNTIL": "%1 までくりかえす", "CONTROL_WHILE": "%1 のあいだくりかえす", "CONTROL_FOREACH": "%2 のようそを %1 にいれてくりかえす", "CONTROL_STARTASCLONE": "クローンされたとき", "CONTROL_CREATECLONEOF": "%1 のクローンをつくる", "CONTROL_CREATECLONEOF_MYSELF": "じぶんじしん", "CONTROL_DELETETHISCLONE": "このクローンをさくじょする", "CONTROL_COUNTER": "カウンター", "CONTROL_INCRCOUNTER": "カウンターにたす", "CONTROL_CLEARCOUNTER": "カウンターをクリアする", "CONTROL_ALLATONCE": "all at once", "DATA_SETVARIABLETO": "%1 を %2 にする", "DATA_CHANGEVARIABLEBY": "%1 を %2 ずつかえる", "DATA_SHOWVARIABLE": "へんすう %1 をひょうじする", "DATA_HIDEVARIABLE": "へんすう %1 をかくす", "DATA_ADDTOLIST": "%1 を %2 についかする", "DATA_DELETEOFLIST": "%2 の %1 ばんめをさくじょする", "DATA_INSERTATLIST": "%3 の %2 ばんめに %1 をそうにゅうする", "DATA_REPLACEITEMOFLIST": "%2 の %1 を %3 でおきかえる", "DATA_ITEMOFLIST": "%2 の %1 ばんめ", "DATA_LENGTHOFLIST": "%1 のながさ", "DATA_LISTCONTAINSITEM": "%1 に %2 がふくまれる", "DATA_SHOWLIST": "リスト %1 をひょうじする", "DATA_HIDELIST": "リスト %1 をかくす", "DATA_INDEX_ALL": "すべて", "DATA_INDEX_LAST": "さいご", "DATA_INDEX_RANDOM": "らんすう", "EVENT_WHENFLAGCLICKED": "%1 がクリックされたとき", "EVENT_WHENTHISSPRITECLICKED": "このスプライトがクリックされたとき", "EVENT_WHENSTAGECLICKED": "ステージがクリックされたとき", "EVENT_WHENTOUCHINGOBJECT": "when this sprite touches %1", "EVENT_WHENBROADCASTRECEIVED": "%1 をうけとったとき", "EVENT_WHENBACKDROPSWITCHESTO": "はいけいが %1 になったとき", "EVENT_WHENGREATERTHAN": "%1 > %2 のとき", "EVENT_WHENGREATERTHAN_TIMER": "タイマー", "EVENT_BROADCAST": "%1 をおくる", "EVENT_BROADCASTANDWAIT": "%1 をおくってまつ", "EVENT_WHENKEYPRESSED": "%1 キーがおされたとき", "EVENT_WHENKEYPRESSED_SPACE": "スペース", "EVENT_WHENKEYPRESSED_LEFT": "ひだりむきやじるし", "EVENT_WHENKEYPRESSED_RIGHT": "みぎむきやじるし", "EVENT_WHENKEYPRESSED_DOWN": "したむきやじるし", "EVENT_WHENKEYPRESSED_UP": "うわむきやじるし", "EVENT_WHENKEYPRESSED_ANY": "どれかの", "LOOKS_SAYFORSECS": "%1 と %2 びょういう", "LOOKS_SAY": "%1 という", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "%1 と %2 びょうかんがえる", "LOOKS_THINK": "%1 とかんがえる", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "ひょうじする", "LOOKS_HIDE": "かくす", "LOOKS_HIDEALLSPRITES": "hide all sprites", "LOOKS_EFFECT_COLOR": "いろ", "LOOKS_EFFECT_FISHEYE": "ぎょがんレンズ", "LOOKS_EFFECT_WHIRL": "うずまき", "LOOKS_EFFECT_PIXELATE": "ピクセルか", "LOOKS_EFFECT_MOSAIC": "モザイク", "LOOKS_EFFECT_BRIGHTNESS": "あかるさ", "LOOKS_EFFECT_GHOST": "ゆうれい", "LOOKS_CHANGEEFFECTBY": "%1 のこうかを %2 ずつかえる", "LOOKS_SETEFFECTTO": "%1 のこうかを %2 にする", "LOOKS_CLEARGRAPHICEFFECTS": "がぞうこうかをなくす", "LOOKS_CHANGESIZEBY": "おおきさを %1 ずつかえる", "LOOKS_SETSIZETO": "おおきさを %1 %にする", "LOOKS_SIZE": "おおきさ", "LOOKS_CHANGESTRETCHBY": "change stretch by %1", "LOOKS_SETSTRETCHTO": "set stretch to %1 %", "LOOKS_SWITCHCOSTUMETO": "コスチュームを %1 にする", "LOOKS_NEXTCOSTUME": "つぎのコスチュームにする", "LOOKS_SWITCHBACKDROPTO": "はいけいを %1 にする", "LOOKS_GOTOFRONTBACK": "%1 へいどうする ", "LOOKS_GOTOFRONTBACK_FRONT": "さいぜんめん", "LOOKS_GOTOFRONTBACK_BACK": "さいはいめん", "LOOKS_GOFORWARDBACKWARDLAYERS": "%2 そう %1 ", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "てまえにだす ", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "おくにさげる ", "LOOKS_BACKDROPNUMBERNAME": "はいけいの %1 ", "LOOKS_COSTUMENUMBERNAME": "コスチュームの %1 ", "LOOKS_NUMBERNAME_NUMBER": "ばんごう ", "LOOKS_NUMBERNAME_NAME": "なまえ ", "LOOKS_SWITCHBACKDROPTOANDWAIT": "はいけいを %1 にしてまつ", "LOOKS_NEXTBACKDROP": "つぎのはいけい ", "LOOKS_PREVIOUSBACKDROP": "まえのはいけい", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "%1 ほうごかす", "MOTION_TURNLEFT": "%1 %2 たびまわす", "MOTION_TURNRIGHT": "%1 %2 たびまわす", "MOTION_POINTINDIRECTION": "%1 たびにむける", "MOTION_POINTTOWARDS": "%1 へむける", "MOTION_POINTTOWARDS_POINTER": "マウスのポインター", "MOTION_GOTO": "%1 へいく", "MOTION_GOTO_POINTER": "マウスのポインター", "MOTION_GOTO_RANDOM": "ランダムなばしょ", "MOTION_GOTOXY": "xざひょうを %1 、yざひょうを %2 にする", "MOTION_GLIDESECSTOXY": "%1 びょうでxざひょうを %2 に、yざひょうを %3 にかえる", "MOTION_GLIDETO": "%1 びょうで %2 へいく ", "MOTION_GLIDETO_POINTER": "マウスのポインター", "MOTION_GLIDETO_RANDOM": "どこかのばしょ", "MOTION_CHANGEXBY": "xざひょうを %1 ずつかえる", "MOTION_SETX": "xざひょうを %1 にする", "MOTION_CHANGEYBY": "yざひょうを %1 ずつかえる", "MOTION_SETY": "yざひょうを %1 にする", "MOTION_IFONEDGEBOUNCE": "もしはしについたら、はねかえる", "MOTION_SETROTATIONSTYLE": "かいてんほうほうを %1 にする", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "さゆうのみ", "MOTION_SETROTATIONSTYLE_DONTROTATE": "かいてんしない", "MOTION_SETROTATIONSTYLE_ALLAROUND": "じゆうにかいてん", "MOTION_XPOSITION": "xざひょう", "MOTION_YPOSITION": "yざひょう", "MOTION_DIRECTION": "むき", "MOTION_SCROLLRIGHT": "scroll right %1", "MOTION_SCROLLUP": "scroll up %1", "MOTION_ALIGNSCENE": "align scene %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "bottom-left", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "bottom-right", "MOTION_ALIGNSCENE_MIDDLE": "middle", "MOTION_ALIGNSCENE_TOPLEFT": "top-left", "MOTION_ALIGNSCENE_TOPRIGHT": "top-right", "MOTION_XSCROLL": "x scroll", "MOTION_YSCROLL": "y scroll", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "%1 から %2 までのらんすう", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 かつ %2", "OPERATORS_OR": "%1 または %2", "OPERATORS_NOT": "%1 ではない", "OPERATORS_JOIN": "%1 と %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "%2 の %1 ばんめのもじ ", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "%1 のながさ", "OPERATORS_CONTAINS": "%1 に %2 がふくまれる", "OPERATORS_MOD": "%1 を %2 でわったあまり", "OPERATORS_ROUND": "%1 をししゃごにゅう", "OPERATORS_MATHOP": "%2 の %1 ", "OPERATORS_MATHOP_ABS": "ぜったいち", "OPERATORS_MATHOP_FLOOR": "きりすて", "OPERATORS_MATHOP_CEILING": "きりあげ", "OPERATORS_MATHOP_SQRT": "へいほうこん", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "ていぎ %1", "SENSING_TOUCHINGOBJECT": "%1 にふれた", "SENSING_TOUCHINGOBJECT_POINTER": "マウスのポインター", "SENSING_TOUCHINGOBJECT_EDGE": "はし", "SENSING_TOUCHINGCOLOR": "%1 いろにふれた", "SENSING_COLORISTOUCHINGCOLOR": "%1 いろが %2 いろにふれた", "SENSING_DISTANCETO": "%1 までのきょり", "SENSING_DISTANCETO_POINTER": "マウスのポインター", "SENSING_ASKANDWAIT": "%1 ときいてまつ", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "こたえ", "SENSING_KEYPRESSED": "%1 キーがおされた", "SENSING_MOUSEDOWN": "マウスがおされた", "SENSING_MOUSEX": "マウスのxざひょう", "SENSING_MOUSEY": "マウスのyざひょう", "SENSING_SETDRAGMODE": "ドラッグ %1 ようにする ", "SENSING_SETDRAGMODE_DRAGGABLE": "できる", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "できない", "SENSING_LOUDNESS": "おんりょう", "SENSING_LOUD": "loud?", "SENSING_TIMER": "タイマー", "SENSING_RESETTIMER": "タイマーをリセット", "SENSING_OF": "%2 の %1 ", "SENSING_OF_XPOSITION": "xざひょう", "SENSING_OF_YPOSITION": "yざひょう", "SENSING_OF_DIRECTION": "むき", "SENSING_OF_COSTUMENUMBER": "コスチューム #", "SENSING_OF_COSTUMENAME": "コスチュームめい", "SENSING_OF_SIZE": "おおきさ", "SENSING_OF_VOLUME": "おんりょう", "SENSING_OF_BACKDROPNUMBER": "はいけい #", "SENSING_OF_BACKDROPNAME": "はいけいのなまえ", "SENSING_OF_STAGE": "ステージ", "SENSING_CURRENT": "げんざいの %1", "SENSING_CURRENT_YEAR": "とし", "SENSING_CURRENT_MONTH": "つき", "SENSING_CURRENT_DATE": "ひ", "SENSING_CURRENT_DAYOFWEEK": "ようび", "SENSING_CURRENT_HOUR": "とき", "SENSING_CURRENT_MINUTE": "ぶん", "SENSING_CURRENT_SECOND": "びょう", "SENSING_DAYSSINCE2000": "2000ねんからのにっすう", "SENSING_USERNAME": "ユーザーめい", "SENSING_USERID": "user id", "SOUND_PLAY": "%1 のおとをならす", "SOUND_PLAYUNTILDONE": "おわるまで %1 のおとをならす", "SOUND_STOPALLSOUNDS": "すべてのおとをとめる", "SOUND_SETEFFECTO": "%1 のこうかを %2 にする ", "SOUND_CHANGEEFFECTBY": "%1 のこうかを %2 ずつかえる", "SOUND_CLEAREFFECTS": "おとのこうかをなくす", "SOUND_EFFECTS_PITCH": "ピッチ ", "SOUND_EFFECTS_PAN": "さゆうのパン ", "SOUND_CHANGEVOLUMEBY": "おんりょうを %1 ずつかえる", "SOUND_SETVOLUMETO": "おんりょうを %1 %にする", "SOUND_VOLUME": "おんりょう", "CATEGORY_MOTION": "うごき", "CATEGORY_LOOKS": "みため", "CATEGORY_SOUND": "おと", "CATEGORY_EVENTS": "イベント", "CATEGORY_CONTROL": "せいぎょ", "CATEGORY_SENSING": "しらべる", "CATEGORY_OPERATORS": "えんざん", "CATEGORY_VARIABLES": "Variables", "CATEGORY_MYBLOCKS": "My Blocks", "DUPLICATE": "ふくせい", "DELETE": "さくじょ", "ADD_COMMENT": "Add Comment", "REMOVE_COMMENT": "Remove Comment", "DELETE_BLOCK": "Delete Block", "DELETE_X_BLOCKS": "Delete %1 Blocks", "DELETE_ALL_BLOCKS": "Delete all %1 blocks?", "CLEAN_UP": "Clean up Blocks", "HELP": "ヘルプ", "UNDO": "とりけし", "REDO": "やりなおし", "EDIT_PROCEDURE": "へんしゅう", "SHOW_PROCEDURE_DEFINITION": "Go to definition", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Say something...", "COLOUR_HUE_LABEL": "いろ", "COLOUR_SATURATION_LABEL": "あざやかさ", "COLOUR_BRIGHTNESS_LABEL": "あかるさ", "CHANGE_VALUE_TITLE": "Change value:", "RENAME_VARIABLE": "Rename variable", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Rename Variable", "NEW_VARIABLE": "へんすうをつくる", "NEW_VARIABLE_TITLE": "New variable name:", "VARIABLE_MODAL_TITLE": "あたらしいへんすう", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "ブロックをつくる", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "リストをつくる", "NEW_LIST_TITLE": "New list name:", "LIST_MODAL_TITLE": "あたらしいリスト", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Rename List", "NEW_BROADCAST_MESSAGE": "New message", "NEW_BROADCAST_MESSAGE_TITLE": "New message name:", "BROADCAST_MODAL_TITLE": "あたらしいメッセージ", "DEFAULT_BROADCAST_MESSAGE_NAME": "メッセージ1" }; Blockly.ScratchMsgs.locales["ja"] = { "CONTROL_FOREVER": "ずっと", "CONTROL_REPEAT": "%1 回繰り返す", "CONTROL_IF": "もし %1 なら", "CONTROL_ELSE": "でなければ", "CONTROL_STOP": "止める", "CONTROL_STOP_ALL": "すべて", "CONTROL_STOP_THIS": "このスクリプト", "CONTROL_STOP_OTHER": "スプライトの他のスクリプト", "CONTROL_WAIT": "%1 秒待つ", "CONTROL_WAITUNTIL": "%1 まで待つ", "CONTROL_REPEATUNTIL": "%1 まで繰り返す", "CONTROL_WHILE": "%1 の間繰り返す", "CONTROL_FOREACH": "%2 の要素を %1 に入れて繰り返す", "CONTROL_STARTASCLONE": "クローンされたとき", "CONTROL_CREATECLONEOF": "%1 のクローンを作る", "CONTROL_CREATECLONEOF_MYSELF": "自分自身", "CONTROL_DELETETHISCLONE": "このクローンを削除する", "CONTROL_COUNTER": "カウンター", "CONTROL_INCRCOUNTER": "カウンターに足す", "CONTROL_CLEARCOUNTER": "カウンターをクリアする", "CONTROL_ALLATONCE": "一斉に", "DATA_SETVARIABLETO": "%1 を %2 にする", "DATA_CHANGEVARIABLEBY": "%1 を %2 ずつ変える", "DATA_SHOWVARIABLE": "変数 %1 を表示する", "DATA_HIDEVARIABLE": "変数 %1 を隠す", "DATA_ADDTOLIST": "%1 を %2 に追加する", "DATA_DELETEOFLIST": "%2 の %1 番目を削除する", "DATA_INSERTATLIST": "%3 の %2 番目に %1 を挿入する", "DATA_REPLACEITEMOFLIST": "%2 の %1 を %3 で置き換える", "DATA_ITEMOFLIST": "%2 の %1 番目", "DATA_LENGTHOFLIST": "%1 の長さ", "DATA_LISTCONTAINSITEM": "%1 に %2 が含まれる", "DATA_SHOWLIST": "リスト %1 を表示する", "DATA_HIDELIST": "リスト %1 を隠す", "DATA_INDEX_ALL": "すべて", "DATA_INDEX_LAST": "最後", "DATA_INDEX_RANDOM": "乱数", "EVENT_WHENFLAGCLICKED": "%1 がクリックされたとき", "EVENT_WHENTHISSPRITECLICKED": "このスプライトがクリックされたとき", "EVENT_WHENSTAGECLICKED": "ステージがクリックされたとき", "EVENT_WHENTOUCHINGOBJECT": "このスプライトが %1 に触れたとき", "EVENT_WHENBROADCASTRECEIVED": "%1 を受け取ったとき", "EVENT_WHENBACKDROPSWITCHESTO": "背景が %1 になったとき", "EVENT_WHENGREATERTHAN": "%1 > %2 のとき", "EVENT_WHENGREATERTHAN_TIMER": "タイマー", "EVENT_BROADCAST": "%1 を送る", "EVENT_BROADCASTANDWAIT": "%1 を送って待つ", "EVENT_WHENKEYPRESSED": "%1 キーが押されたとき", "EVENT_WHENKEYPRESSED_SPACE": "スペース", "EVENT_WHENKEYPRESSED_LEFT": "左向き矢印", "EVENT_WHENKEYPRESSED_RIGHT": "右向き矢印", "EVENT_WHENKEYPRESSED_DOWN": "下向き矢印", "EVENT_WHENKEYPRESSED_UP": "上向き矢印", "EVENT_WHENKEYPRESSED_ANY": "どれかの", "LOOKS_SAYFORSECS": "%1 と %2 秒言う", "LOOKS_SAY": "%1 と言う", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "%1 と %2 秒考える", "LOOKS_THINK": "%1 と考える", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "表示する", "LOOKS_HIDE": "隠す", "LOOKS_HIDEALLSPRITES": "すべてのスプライトを隠す", "LOOKS_EFFECT_COLOR": "色", "LOOKS_EFFECT_FISHEYE": "魚眼レンズ", "LOOKS_EFFECT_WHIRL": "渦巻き", "LOOKS_EFFECT_PIXELATE": "ピクセル化", "LOOKS_EFFECT_MOSAIC": "モザイク", "LOOKS_EFFECT_BRIGHTNESS": "明るさ", "LOOKS_EFFECT_GHOST": "幽霊", "LOOKS_CHANGEEFFECTBY": "%1 の効果を %2 ずつ変える", "LOOKS_SETEFFECTTO": "%1 の効果を %2 にする", "LOOKS_CLEARGRAPHICEFFECTS": "画像効果をなくす", "LOOKS_CHANGESIZEBY": "大きさを %1 ずつ変える", "LOOKS_SETSIZETO": "大きさを %1 %にする", "LOOKS_SIZE": "大きさ", "LOOKS_CHANGESTRETCHBY": "伸びを %1 ずつ変える", "LOOKS_SETSTRETCHTO": "伸びを %1 %にする", "LOOKS_SWITCHCOSTUMETO": "コスチュームを %1 にする", "LOOKS_NEXTCOSTUME": "次のコスチュームにする", "LOOKS_SWITCHBACKDROPTO": "背景を %1 にする", "LOOKS_GOTOFRONTBACK": "%1 へ移動する ", "LOOKS_GOTOFRONTBACK_FRONT": "最前面", "LOOKS_GOTOFRONTBACK_BACK": "最背面", "LOOKS_GOFORWARDBACKWARDLAYERS": "%2 層 %1 ", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "手前に出す ", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "奥に下げる ", "LOOKS_BACKDROPNUMBERNAME": "背景の %1 ", "LOOKS_COSTUMENUMBERNAME": "コスチュームの %1 ", "LOOKS_NUMBERNAME_NUMBER": "番号 ", "LOOKS_NUMBERNAME_NAME": "名前 ", "LOOKS_SWITCHBACKDROPTOANDWAIT": "背景を %1 にして待つ", "LOOKS_NEXTBACKDROP": "次の背景 ", "LOOKS_PREVIOUSBACKDROP": "前の背景", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "%1 歩動かす", "MOTION_TURNLEFT": "%1 %2 度回す", "MOTION_TURNRIGHT": "%1 %2 度回す", "MOTION_POINTINDIRECTION": "%1 度に向ける", "MOTION_POINTTOWARDS": "%1 へ向ける", "MOTION_POINTTOWARDS_POINTER": "マウスのポインター", "MOTION_GOTO": "%1 へ行く", "MOTION_GOTO_POINTER": "マウスのポインター", "MOTION_GOTO_RANDOM": "ランダムな場所", "MOTION_GOTOXY": "x座標を %1 、y座標を %2 にする", "MOTION_GLIDESECSTOXY": "%1 秒でx座標を %2 に、y座標を %3 に変える", "MOTION_GLIDETO": "%1 秒で %2 へ行く ", "MOTION_GLIDETO_POINTER": "マウスのポインター", "MOTION_GLIDETO_RANDOM": "どこかの場所", "MOTION_CHANGEXBY": "x座標を %1 ずつ変える", "MOTION_SETX": "x座標を %1 にする", "MOTION_CHANGEYBY": "y座標を %1 ずつ変える", "MOTION_SETY": "y座標を %1 にする", "MOTION_IFONEDGEBOUNCE": "もし端に着いたら、跳ね返る", "MOTION_SETROTATIONSTYLE": "回転方法を %1 にする", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "左右のみ", "MOTION_SETROTATIONSTYLE_DONTROTATE": "回転しない", "MOTION_SETROTATIONSTYLE_ALLAROUND": "自由に回転", "MOTION_XPOSITION": "x座標", "MOTION_YPOSITION": "y座標", "MOTION_DIRECTION": "向き", "MOTION_SCROLLRIGHT": "右に %1 スクロールする", "MOTION_SCROLLUP": "上に %1 スクロールする", "MOTION_ALIGNSCENE": "スクロール位置を %1 にする", "MOTION_ALIGNSCENE_BOTTOMLEFT": "左下", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "右下", "MOTION_ALIGNSCENE_MIDDLE": "中央", "MOTION_ALIGNSCENE_TOPLEFT": "左上", "MOTION_ALIGNSCENE_TOPRIGHT": "右上", "MOTION_XSCROLL": "x方向のスクロール量", "MOTION_YSCROLL": "y方向のスクロール方向", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "%1 から %2 までの乱数", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 かつ %2", "OPERATORS_OR": "%1 または %2", "OPERATORS_NOT": "%1 ではない", "OPERATORS_JOIN": "%1 と %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "%2 の %1 番目の文字 ", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "%1 の長さ", "OPERATORS_CONTAINS": "%1 に %2 が含まれる", "OPERATORS_MOD": "%1 を %2 で割った余り", "OPERATORS_ROUND": "%1 を四捨五入", "OPERATORS_MATHOP": "%2 の %1 ", "OPERATORS_MATHOP_ABS": "絶対値", "OPERATORS_MATHOP_FLOOR": "切り下げ", "OPERATORS_MATHOP_CEILING": "切り上げ", "OPERATORS_MATHOP_SQRT": "平方根", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "定義 %1", "SENSING_TOUCHINGOBJECT": "%1 に触れた", "SENSING_TOUCHINGOBJECT_POINTER": "マウスのポインター", "SENSING_TOUCHINGOBJECT_EDGE": "端", "SENSING_TOUCHINGCOLOR": "%1 色に触れた", "SENSING_COLORISTOUCHINGCOLOR": "%1 色が %2 色に触れた", "SENSING_DISTANCETO": "%1 までの距離", "SENSING_DISTANCETO_POINTER": "マウスのポインター", "SENSING_ASKANDWAIT": "%1 と聞いて待つ", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "答え", "SENSING_KEYPRESSED": "%1 キーが押された", "SENSING_MOUSEDOWN": "マウスが押された", "SENSING_MOUSEX": "マウスのx座標", "SENSING_MOUSEY": "マウスのy座標", "SENSING_SETDRAGMODE": "ドラッグ %1 ようにする ", "SENSING_SETDRAGMODE_DRAGGABLE": "できる", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "できない", "SENSING_LOUDNESS": "音量", "SENSING_LOUD": "うるさい", "SENSING_TIMER": "タイマー", "SENSING_RESETTIMER": "タイマーをリセット", "SENSING_OF": "%2 の %1 ", "SENSING_OF_XPOSITION": "x座標", "SENSING_OF_YPOSITION": "y座標", "SENSING_OF_DIRECTION": "向き", "SENSING_OF_COSTUMENUMBER": "コスチューム #", "SENSING_OF_COSTUMENAME": "コスチューム名", "SENSING_OF_SIZE": "大きさ", "SENSING_OF_VOLUME": "音量", "SENSING_OF_BACKDROPNUMBER": "背景 #", "SENSING_OF_BACKDROPNAME": "背景の名前", "SENSING_OF_STAGE": "ステージ", "SENSING_CURRENT": "現在の %1", "SENSING_CURRENT_YEAR": "年", "SENSING_CURRENT_MONTH": "月", "SENSING_CURRENT_DATE": "日", "SENSING_CURRENT_DAYOFWEEK": "曜日", "SENSING_CURRENT_HOUR": "時", "SENSING_CURRENT_MINUTE": "分", "SENSING_CURRENT_SECOND": "秒", "SENSING_DAYSSINCE2000": "2000年からの日数", "SENSING_USERNAME": "ユーザー名", "SENSING_USERID": "ユーザーID", "SOUND_PLAY": "%1 の音を鳴らす", "SOUND_PLAYUNTILDONE": "終わるまで %1 の音を鳴らす", "SOUND_STOPALLSOUNDS": "すべての音を止める", "SOUND_SETEFFECTO": "%1 の効果を %2 にする ", "SOUND_CHANGEEFFECTBY": "%1 の効果を %2 ずつ変える", "SOUND_CLEAREFFECTS": "音の効果をなくす", "SOUND_EFFECTS_PITCH": "ピッチ ", "SOUND_EFFECTS_PAN": "左右のパン ", "SOUND_CHANGEVOLUMEBY": "音量を %1 ずつ変える", "SOUND_SETVOLUMETO": "音量を %1 %にする", "SOUND_VOLUME": "音量", "CATEGORY_MOTION": "動き", "CATEGORY_LOOKS": "見た目", "CATEGORY_SOUND": "音", "CATEGORY_EVENTS": "イベント", "CATEGORY_CONTROL": "制御", "CATEGORY_SENSING": "調べる", "CATEGORY_OPERATORS": "演算", "CATEGORY_VARIABLES": "変数", "CATEGORY_MYBLOCKS": "自分のブロック", "DUPLICATE": "複製", "DELETE": "削除", "ADD_COMMENT": "コメントを追加", "REMOVE_COMMENT": "コメントを削除", "DELETE_BLOCK": "ブロックを削除", "DELETE_X_BLOCKS": "%1 ブロックを削除", "DELETE_ALL_BLOCKS": "%1 個のブロックをすべて削除しますか?", "CLEAN_UP": "きれいにする", "HELP": "ヘルプ", "UNDO": "取り消し", "REDO": "やり直し", "EDIT_PROCEDURE": "編集", "SHOW_PROCEDURE_DEFINITION": "定義へ行く", "WORKSPACE_COMMENT_DEFAULT_TEXT": "何かを言う...", "COLOUR_HUE_LABEL": "色", "COLOUR_SATURATION_LABEL": "鮮やかさ", "COLOUR_BRIGHTNESS_LABEL": "明るさ", "CHANGE_VALUE_TITLE": "値を変える:", "RENAME_VARIABLE": "変数の名前を変更", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "変数の名前を変更", "NEW_VARIABLE": "変数を作る", "NEW_VARIABLE_TITLE": "新しい変数の名前:", "VARIABLE_MODAL_TITLE": "新しい変数", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "ブロックを作る", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "リストを作る", "NEW_LIST_TITLE": "新しいリスト名:", "LIST_MODAL_TITLE": "新しいリスト", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "リストの名前を変更", "NEW_BROADCAST_MESSAGE": "新しいメッセージ", "NEW_BROADCAST_MESSAGE_TITLE": "新しいメッセージ名:", "BROADCAST_MODAL_TITLE": "新しいメッセージ", "DEFAULT_BROADCAST_MESSAGE_NAME": "メッセージ1" }; Blockly.ScratchMsgs.locales["ko"] = { "CONTROL_FOREVER": "무한 반복하기", "CONTROL_REPEAT": "%1 번 반복하기", "CONTROL_IF": "만약 %1 (이)라면", "CONTROL_ELSE": "아니면", "CONTROL_STOP": "멈추기", "CONTROL_STOP_ALL": "모두", "CONTROL_STOP_THIS": "이 스크립트", "CONTROL_STOP_OTHER": "이 스프라이트에 있는 다른 스크립트", "CONTROL_WAIT": "%1 초 기다리기", "CONTROL_WAITUNTIL": "%1 까지 기다리기", "CONTROL_REPEATUNTIL": "%1 까지 반복하기", "CONTROL_WHILE": "%1 동안 반복하기", "CONTROL_FOREACH": "%1 변수로 %2 번 반복하기", "CONTROL_STARTASCLONE": "복제되었을 때", "CONTROL_CREATECLONEOF": "%1 복제하기", "CONTROL_CREATECLONEOF_MYSELF": "나 자신", "CONTROL_DELETETHISCLONE": "이 복제본 삭제하기", "CONTROL_COUNTER": "카운터", "CONTROL_INCRCOUNTER": "카운터 증가하기", "CONTROL_CLEARCOUNTER": "카운터 초기화", "CONTROL_ALLATONCE": "한 번에 실행하기", "DATA_SETVARIABLETO": "%1 을(를) %2 로 정하기", "DATA_CHANGEVARIABLEBY": "%1 을(를) %2 만큼 바꾸기", "DATA_SHOWVARIABLE": "%1 변수 보이기", "DATA_HIDEVARIABLE": "%1 변수 숨기기", "DATA_ADDTOLIST": "%1 을(를) %2 에 추가하기", "DATA_DELETEOFLIST": "%1 번째 항목을 %2 에서 삭제하기", "DATA_INSERTATLIST": "%1 을(를) %3 리스트의 %2 번째에 넣기", "DATA_REPLACEITEMOFLIST": "%2 리스트의 %1 번째 항목을 %3 으로 바꾸기", "DATA_ITEMOFLIST": "%2 리스트의 %1 번째 항목", "DATA_LENGTHOFLIST": "%1 의 길이", "DATA_LISTCONTAINSITEM": "%1 이(가) %2 을(를) 포함하는가?", "DATA_SHOWLIST": "%1 리스트 보이기", "DATA_HIDELIST": "%1 리스트 숨기기", "DATA_INDEX_ALL": "모두", "DATA_INDEX_LAST": "마지막", "DATA_INDEX_RANDOM": "랜덤", "EVENT_WHENFLAGCLICKED": "%1 을(를) 클릭했을 때", "EVENT_WHENTHISSPRITECLICKED": "이 스프라이트를 클릭했을 때", "EVENT_WHENSTAGECLICKED": "무대를 클릭했을 때", "EVENT_WHENTOUCHINGOBJECT": "이 스프라이트가 %1 에 닿을 때", "EVENT_WHENBROADCASTRECEIVED": "%1 받았을 때", "EVENT_WHENBACKDROPSWITCHESTO": "배경이 %1 (으)로 바뀌었을 때", "EVENT_WHENGREATERTHAN": "%1 > %2 일 때", "EVENT_WHENGREATERTHAN_TIMER": "타이머", "EVENT_BROADCAST": "%1 방송하기", "EVENT_BROADCASTANDWAIT": "%1 방송하고 기다리기", "EVENT_WHENKEYPRESSED": "%1 키를 눌렀을 때", "EVENT_WHENKEYPRESSED_SPACE": "스페이스", "EVENT_WHENKEYPRESSED_LEFT": "왼쪽 화살표", "EVENT_WHENKEYPRESSED_RIGHT": "오른쪽 화살표", "EVENT_WHENKEYPRESSED_DOWN": "아래쪽 화살표", "EVENT_WHENKEYPRESSED_UP": "위쪽 화살표", "EVENT_WHENKEYPRESSED_ANY": "아무", "LOOKS_SAYFORSECS": "%1 을(를) %2 초 동안 말하기", "LOOKS_SAY": "%1 말하기", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "%1 을(를) %2 초 동안 생각하기", "LOOKS_THINK": "%1 생각하기", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "보이기", "LOOKS_HIDE": "숨기기", "LOOKS_HIDEALLSPRITES": "모든 스프라이트 숨기기", "LOOKS_EFFECT_COLOR": "색깔", "LOOKS_EFFECT_FISHEYE": "어안 렌즈", "LOOKS_EFFECT_WHIRL": "소용돌이", "LOOKS_EFFECT_PIXELATE": "픽셀화", "LOOKS_EFFECT_MOSAIC": "모자이크", "LOOKS_EFFECT_BRIGHTNESS": "밝기", "LOOKS_EFFECT_GHOST": "투명도", "LOOKS_CHANGEEFFECTBY": "%1 효과를 %2 만큼 바꾸기", "LOOKS_SETEFFECTTO": "%1 효과를 %2 (으)로 정하기", "LOOKS_CLEARGRAPHICEFFECTS": "그래픽 효과 지우기", "LOOKS_CHANGESIZEBY": "크기를 %1 만큼 바꾸기", "LOOKS_SETSIZETO": "크기를 %1 %로 정하기", "LOOKS_SIZE": "크기", "LOOKS_CHANGESTRETCHBY": "너비를 %1 만큼 바꾸기", "LOOKS_SETSTRETCHTO": "너비를 %1 %로 정하기", "LOOKS_SWITCHCOSTUMETO": "모양을 %1 (으)로 바꾸기", "LOOKS_NEXTCOSTUME": "다음 모양으로 바꾸기", "LOOKS_SWITCHBACKDROPTO": "배경을 %1 (으)로 바꾸기", "LOOKS_GOTOFRONTBACK": "%1 으로 순서 바꾸기", "LOOKS_GOTOFRONTBACK_FRONT": "맨 앞쪽", "LOOKS_GOTOFRONTBACK_BACK": "맨 뒤쪽", "LOOKS_GOFORWARDBACKWARDLAYERS": "%1 %2 단계 보내기", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "앞으로", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "뒤로", "LOOKS_BACKDROPNUMBERNAME": "배경 %1", "LOOKS_COSTUMENUMBERNAME": "모양 %1", "LOOKS_NUMBERNAME_NUMBER": "번호", "LOOKS_NUMBERNAME_NAME": "이름", "LOOKS_SWITCHBACKDROPTOANDWAIT": "배경을 %1 (으)로 바꾸고 기다리기", "LOOKS_NEXTBACKDROP": "다음 배경으로 바꾸기", "LOOKS_PREVIOUSBACKDROP": "이전 배경으로 바꾸기", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "%1 만큼 움직이기", "MOTION_TURNLEFT": "%1 방향으로 %2 도 돌기", "MOTION_TURNRIGHT": "%1 방향으로 %2 도 돌기", "MOTION_POINTINDIRECTION": "%1 도 방향 보기", "MOTION_POINTTOWARDS": "%1 쪽 보기", "MOTION_POINTTOWARDS_POINTER": "마우스 포인터", "MOTION_GOTO": "%1 (으)로 이동하기", "MOTION_GOTO_POINTER": "마우스 포인터", "MOTION_GOTO_RANDOM": "랜덤 위치", "MOTION_GOTOXY": "x: %1 y: %2 (으)로 이동하기", "MOTION_GLIDESECSTOXY": "%1 초 동안 x: %2 y: %3 (으)로 이동하기", "MOTION_GLIDETO": "%1 초 동안 %2 (으)로 이동하기", "MOTION_GLIDETO_POINTER": "마우스 포인터", "MOTION_GLIDETO_RANDOM": "랜덤 위치", "MOTION_CHANGEXBY": "x 좌표를 %1 만큼 바꾸기", "MOTION_SETX": "x 좌표를 %1 (으)로 정하기", "MOTION_CHANGEYBY": "y 좌표를 %1 만큼 바꾸기", "MOTION_SETY": "y 좌표를 %1 (으)로 정하기", "MOTION_IFONEDGEBOUNCE": "벽에 닿으면 튕기기", "MOTION_SETROTATIONSTYLE": "회전 방식을 %1 (으)로 정하기", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "왼쪽-오른쪽", "MOTION_SETROTATIONSTYLE_DONTROTATE": "회전하지 않기", "MOTION_SETROTATIONSTYLE_ALLAROUND": "회전하기", "MOTION_XPOSITION": "x좌표", "MOTION_YPOSITION": "y좌표", "MOTION_DIRECTION": "방향", "MOTION_SCROLLRIGHT": "오른쪽으로 %1 만큼 스크롤하기", "MOTION_SCROLLUP": "위쪽으로 %1 만큼 스크롤하기", "MOTION_ALIGNSCENE": "화면을 %1 로 정렬하기", "MOTION_ALIGNSCENE_BOTTOMLEFT": "왼쪽 아래", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "오른쪽 아래", "MOTION_ALIGNSCENE_MIDDLE": "가운데", "MOTION_ALIGNSCENE_TOPLEFT": "왼쪽 위", "MOTION_ALIGNSCENE_TOPRIGHT": "오른쪽 위", "MOTION_XSCROLL": "x 스크롤", "MOTION_YSCROLL": "y 스크롤", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 × %2", "OPERATORS_DIVIDE": "%1 ÷ %2", "OPERATORS_RANDOM": "%1 부터 %2 사이의 난수", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 그리고 %2", "OPERATORS_OR": "%1 또는 %2", "OPERATORS_NOT": "%1 이(가) 아니다", "OPERATORS_JOIN": "%1 와(과) %2 결합하기", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "%2 의 %1 번째 글자", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "%1 의 길이", "OPERATORS_CONTAINS": "%1 이(가) %2 을(를) 포함하는가?", "OPERATORS_MOD": "%1 나누기 %2 의 나머지", "OPERATORS_ROUND": "%1 의 반올림", "OPERATORS_MATHOP": "%1 ( %2 )", "OPERATORS_MATHOP_ABS": "절댓값", "OPERATORS_MATHOP_FLOOR": "버림", "OPERATORS_MATHOP_CEILING": "올림", "OPERATORS_MATHOP_SQRT": "제곱근", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "%1 정의하기", "SENSING_TOUCHINGOBJECT": "%1 에 닿았는가?", "SENSING_TOUCHINGOBJECT_POINTER": "마우스 포인터", "SENSING_TOUCHINGOBJECT_EDGE": "벽", "SENSING_TOUCHINGCOLOR": "%1 색에 닿았는가?", "SENSING_COLORISTOUCHINGCOLOR": "%1 색이 %2 색에 닿았는가?", "SENSING_DISTANCETO": "%1 까지의 거리", "SENSING_DISTANCETO_POINTER": "마우스 포인터", "SENSING_ASKANDWAIT": "%1 라고 묻고 기다리기", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "대답", "SENSING_KEYPRESSED": "%1 키를 눌렸는가?", "SENSING_MOUSEDOWN": "마우스를 클릭했는가?", "SENSING_MOUSEX": "마우스의 x좌표", "SENSING_MOUSEY": "마우스의 y좌표", "SENSING_SETDRAGMODE": "드래그 모드를 %1 상태로 정하기", "SENSING_SETDRAGMODE_DRAGGABLE": "드래그 할 수 있는", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "드래그 할 수 없는", "SENSING_LOUDNESS": "음량", "SENSING_LOUD": "소리가 큰가?", "SENSING_TIMER": "타이머", "SENSING_RESETTIMER": "타이머 초기화", "SENSING_OF": "%2 의 %1", "SENSING_OF_XPOSITION": "x좌표", "SENSING_OF_YPOSITION": "y좌표", "SENSING_OF_DIRECTION": "방향", "SENSING_OF_COSTUMENUMBER": "모양 번호", "SENSING_OF_COSTUMENAME": "모양 이름", "SENSING_OF_SIZE": "크기", "SENSING_OF_VOLUME": "음량", "SENSING_OF_BACKDROPNUMBER": "배경 번호", "SENSING_OF_BACKDROPNAME": "배경 이름", "SENSING_OF_STAGE": "무대", "SENSING_CURRENT": "현재 %1", "SENSING_CURRENT_YEAR": "년", "SENSING_CURRENT_MONTH": "월", "SENSING_CURRENT_DATE": "일", "SENSING_CURRENT_DAYOFWEEK": "요일", "SENSING_CURRENT_HOUR": "시", "SENSING_CURRENT_MINUTE": "분", "SENSING_CURRENT_SECOND": "초", "SENSING_DAYSSINCE2000": "2000년 이후 현재까지 날짜 수", "SENSING_USERNAME": "사용자 이름", "SENSING_USERID": "사용자 번호", "SOUND_PLAY": "%1 재생하기", "SOUND_PLAYUNTILDONE": "%1 끝까지 재생하기", "SOUND_STOPALLSOUNDS": "모든 소리 끄기", "SOUND_SETEFFECTO": "%1 효과를 %2 로 정하기", "SOUND_CHANGEEFFECTBY": "%1 효과를 %2 만큼 바꾸기", "SOUND_CLEAREFFECTS": "소리 효과 지우기", "SOUND_EFFECTS_PITCH": "음 높이", "SOUND_EFFECTS_PAN": "음향 위치 왼쪽/오른쪽", "SOUND_CHANGEVOLUMEBY": "음량을 %1 만큼 바꾸기", "SOUND_SETVOLUMETO": "음량을 %1% 로 정하기", "SOUND_VOLUME": "음량", "CATEGORY_MOTION": "동작", "CATEGORY_LOOKS": "형태", "CATEGORY_SOUND": "소리", "CATEGORY_EVENTS": "이벤트", "CATEGORY_CONTROL": "제어", "CATEGORY_SENSING": "감지", "CATEGORY_OPERATORS": "연산", "CATEGORY_VARIABLES": "변수", "CATEGORY_MYBLOCKS": "나만의 블록", "DUPLICATE": "복사하기", "DELETE": "삭제하기", "ADD_COMMENT": "주석 넣기", "REMOVE_COMMENT": "주석 지우기", "DELETE_BLOCK": "블록 삭제하기", "DELETE_X_BLOCKS": "블록 %1개 삭제하기", "DELETE_ALL_BLOCKS": " %1개의 블록을 모두 삭제할까요?", "CLEAN_UP": "블록 정리하기", "HELP": "도움말", "UNDO": "되돌리기", "REDO": "재시도", "EDIT_PROCEDURE": "편집", "SHOW_PROCEDURE_DEFINITION": "정의로 이동하기", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Say something...", "COLOUR_HUE_LABEL": "색상", "COLOUR_SATURATION_LABEL": "채도", "COLOUR_BRIGHTNESS_LABEL": "명도", "CHANGE_VALUE_TITLE": "값 바꾸기:", "RENAME_VARIABLE": "변수 이름 수정하기", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "변수 이름 수정하기", "NEW_VARIABLE": "변수 만들기", "NEW_VARIABLE_TITLE": "새로운 변수 이름:", "VARIABLE_MODAL_TITLE": "새로운 변수", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "블록 만들기", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "리스트 만들기", "NEW_LIST_TITLE": "새로운 리스트 이름:", "LIST_MODAL_TITLE": "새로운 리스트", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "리스트 이름 수정하기", "NEW_BROADCAST_MESSAGE": "새로운 메시지", "NEW_BROADCAST_MESSAGE_TITLE": "새로운 메시지 이름:", "BROADCAST_MODAL_TITLE": "새로운 메시지", "DEFAULT_BROADCAST_MESSAGE_NAME": "메시지1" }; Blockly.ScratchMsgs.locales["mi"] = { "CONTROL_FOREVER": "mō ake, ake mahia", "CONTROL_REPEAT": "tōaitia %1", "CONTROL_IF": "mēnā %1 mahia", "CONTROL_ELSE": "kē atu", "CONTROL_STOP": "katia", "CONTROL_STOP_ALL": "katoa", "CONTROL_STOP_THIS": "tēnei hōtuhi", "CONTROL_STOP_OTHER": "hōtuhi kē i roto i te parehe", "CONTROL_WAIT": "tatari kia %1 hēkona", "CONTROL_WAITUNTIL": "tatari kia %1", "CONTROL_REPEATUNTIL": "tōaitia tonutia kia %1", "CONTROL_WHILE": "tōaitia tonutia mēnā %1", "CONTROL_FOREACH": "mō ia %1 o roto i te %2", "CONTROL_STARTASCLONE": "ina ka tīmata mai ahau hei tārua", "CONTROL_CREATECLONEOF": "whakapūruatia %1", "CONTROL_CREATECLONEOF_MYSELF": "ahau anō", "CONTROL_DELETETHISCLONE": "mukua tēnei tāruarua", "CONTROL_COUNTER": "pūtatau", "CONTROL_INCRCOUNTER": "tāpiri tahi ki te pūtatau", "CONTROL_CLEARCOUNTER": "ūkui pūtatau", "CONTROL_ALLATONCE": "te katoa i te wā kotahi", "DATA_SETVARIABLETO": "tautuhia %1 ki te %2", "DATA_CHANGEVARIABLEBY": "panonitia %1 mā te %2", "DATA_SHOWVARIABLE": "whakaaturia te taurangi %1", "DATA_HIDEVARIABLE": "hunaia te taurangi %1", "DATA_ADDTOLIST": "tāpiritia te %1 ki te %2", "DATA_DELETEOFLIST": "mukua %1 i a %2", "DATA_INSERTATLIST": "whakaurua te %1 hei %2 o %3", "DATA_REPLACEITEMOFLIST": "whakakapia te tūemi %1 o %2, ki %3", "DATA_ITEMOFLIST": "te tūemi %1 o %2", "DATA_LENGTHOFLIST": "te roanga o te %1", "DATA_LISTCONTAINSITEM": "kei roto i %1 te %2?", "DATA_SHOWLIST": "whakaaturia te rārangi %1", "DATA_HIDELIST": "hunāia te rārangi %1", "DATA_INDEX_ALL": "katoa", "DATA_INDEX_LAST": "whakamutunga", "DATA_INDEX_RANDOM": "matapōkere", "EVENT_WHENFLAGCLICKED": "ina pāwhiria te %1", "EVENT_WHENTHISSPRITECLICKED": "ina pāwhiria tēnei parehe", "EVENT_WHENSTAGECLICKED": "ina pāwhiria te Atamira", "EVENT_WHENTOUCHINGOBJECT": "ka pā tēnei parehe i te %1", "EVENT_WHENBROADCASTRECEIVED": "ina ka riro mai te %1", "EVENT_WHENBACKDROPSWITCHESTO": "ina hurihia te ārai tuarongo kia %1", "EVENT_WHENGREATERTHAN": "mēnā %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "taima", "EVENT_BROADCAST": "whakapaoho %1", "EVENT_BROADCASTANDWAIT": "whakapaoho %1, kātahi tatari", "EVENT_WHENKEYPRESSED": "ina pēhia te pātuhi %1", "EVENT_WHENKEYPRESSED_SPACE": "mokowā", "EVENT_WHENKEYPRESSED_LEFT": "pere mauī", "EVENT_WHENKEYPRESSED_RIGHT": "pere katau", "EVENT_WHENKEYPRESSED_DOWN": "pere whakararo", "EVENT_WHENKEYPRESSED_UP": "pere whakarunga", "EVENT_WHENKEYPRESSED_ANY": "noa", "LOOKS_SAYFORSECS": "kīia %1 mō ngā hēkona %2", "LOOKS_SAY": "kīia %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "whakaarohia te %1 mō ngā hēkona %2", "LOOKS_THINK": "whakaarohia te %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "whakaatu", "LOOKS_HIDE": "huna", "LOOKS_HIDEALLSPRITES": "hunaia ngā parehe katoa", "LOOKS_EFFECT_COLOR": "tae", "LOOKS_EFFECT_FISHEYE": "karu ika", "LOOKS_EFFECT_WHIRL": "kōriporipo", "LOOKS_EFFECT_PIXELATE": "whakatongitongi", "LOOKS_EFFECT_MOSAIC": "toi rōpinepine", "LOOKS_EFFECT_BRIGHTNESS": "pīataata", "LOOKS_EFFECT_GHOST": "kēhua", "LOOKS_CHANGEEFFECTBY": "panonitia te rākeitanga %1 mā te %2", "LOOKS_SETEFFECTTO": "panonitia te rākeitanga %1 ki te %2", "LOOKS_CLEARGRAPHICEFFECTS": "ūkui rākeitanga whakairoiro", "LOOKS_CHANGESIZEBY": "panonitia te nui mā te %1", "LOOKS_SETSIZETO": "tautuhia te rahi kia %1 %", "LOOKS_SIZE": "rahi", "LOOKS_CHANGESTRETCHBY": "panonitia te toronga mā te %1", "LOOKS_SETSTRETCHTO": "tautuhia te toronga kia %1 %", "LOOKS_SWITCHCOSTUMETO": "panonitia te kākahu kia %1", "LOOKS_NEXTCOSTUME": "kākahu panuku", "LOOKS_SWITCHBACKDROPTO": "panonitia te ārai tuarongo kia %1", "LOOKS_GOTOFRONTBACK": "haere ki te apa %1", "LOOKS_GOTOFRONTBACK_FRONT": "mua", "LOOKS_GOTOFRONTBACK_BACK": "muri", "LOOKS_GOFORWARDBACKWARDLAYERS": "nekehia %1, kia %2 ngā apaapa", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ki mua", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "ki muri", "LOOKS_BACKDROPNUMBERNAME": "ārai tuarongo %1", "LOOKS_COSTUMENUMBERNAME": "kākahu %1", "LOOKS_NUMBERNAME_NUMBER": "nama", "LOOKS_NUMBERNAME_NAME": "ingoa", "LOOKS_SWITCHBACKDROPTOANDWAIT": "panonitia te ārai tuarongo kia %1, kātahi, tatari", "LOOKS_NEXTBACKDROP": "ārai tuarongo panuku", "LOOKS_PREVIOUSBACKDROP": "ārai tuarongo o mua", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "nekehia kia %1 ngā takahanga", "MOTION_TURNLEFT": "hurihia %1, kia %2 putu", "MOTION_TURNRIGHT": "hurihia %1, kia %2 putu", "MOTION_POINTINDIRECTION": "atatohua ki %1", "MOTION_POINTTOWARDS": "atatohua ki %1", "MOTION_POINTTOWARDS_POINTER": "atatohu-kiore", "MOTION_GOTO": "neke ki %1", "MOTION_GOTO_POINTER": "atatohu-kiore", "MOTION_GOTO_RANDOM": "tūnga matapōkere", "MOTION_GOTOXY": "neke ki x: %1 y: %2", "MOTION_GLIDESECSTOXY": "wania kia %1 hēkona ki x: %2 y: %3", "MOTION_GLIDETO": "wania kia %1 hēkona ki %2", "MOTION_GLIDETO_POINTER": "atatohu-kiore", "MOTION_GLIDETO_RANDOM": "tūnga matapōkere", "MOTION_CHANGEXBY": "panonitia x mā te %1", "MOTION_SETX": "tāutuhia te x kia %1", "MOTION_CHANGEYBY": "panonitia y mā te %1", "MOTION_SETY": "tāutuhia te y kia %1", "MOTION_IFONEDGEBOUNCE": "mēnā kei te taitapa, tupanatia", "MOTION_SETROTATIONSTYLE": "tautuhia te momo huringa kia %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "mauī-ki-katau", "MOTION_SETROTATIONSTYLE_DONTROTATE": "kaua e takahuri", "MOTION_SETROTATIONSTYLE_ALLAROUND": "huri noa", "MOTION_XPOSITION": "tūnga x", "MOTION_YPOSITION": "tūnga y", "MOTION_DIRECTION": "ahunga", "MOTION_SCROLLRIGHT": "panuku whakatekatau %1", "MOTION_SCROLLUP": "panuku whakarunga %1", "MOTION_ALIGNSCENE": "tīaro kāpeka %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "taha mauī o raro", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "taha katau o raro", "MOTION_ALIGNSCENE_MIDDLE": "waenga", "MOTION_ALIGNSCENE_TOPLEFT": "taha mauī o runga", "MOTION_ALIGNSCENE_TOPRIGHT": "taha katau o runga", "MOTION_XSCROLL": "panuku x", "MOTION_YSCROLL": "panuku y", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "kōwhiria matapōkere %1 ki te %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 me %2", "OPERATORS_OR": "%1, %2 rānei", "OPERATORS_NOT": "ehara ko te %1", "OPERATORS_JOIN": "tāpiritia te %1, %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "te pū %1 o te %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "te roanga o te %1", "OPERATORS_CONTAINS": "kei roto i a %1 : %2?", "OPERATORS_MOD": "%1 % %2", "OPERATORS_ROUND": "whakaawhiwhi %1", "OPERATORS_MATHOP": "%1 o te %2", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "papa", "OPERATORS_MATHOP_CEILING": "tuanui", "OPERATORS_MATHOP_SQRT": "sqrt", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "tāutu %1", "SENSING_TOUCHINGOBJECT": "kei te pā ki te %1?", "SENSING_TOUCHINGOBJECT_POINTER": "atatohu-kiore", "SENSING_TOUCHINGOBJECT_EDGE": "taitapa", "SENSING_TOUCHINGCOLOR": "kei te pā ki te tae %1?", "SENSING_COLORISTOUCHINGCOLOR": "ka pā te tae %1 i te %2?", "SENSING_DISTANCETO": "tawhiti ki %1", "SENSING_DISTANCETO_POINTER": "atatohu-kiore", "SENSING_ASKANDWAIT": "pātai %1, kātahi, tatari", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "whakautu", "SENSING_KEYPRESSED": "kua pēhia te pātuhi %1?", "SENSING_MOUSEDOWN": "pāwhiri kiore?", "SENSING_MOUSEX": "x kiore", "SENSING_MOUSEY": "y kiore", "SENSING_SETDRAGMODE": "tautuhia te aratau tō kia %1", "SENSING_SETDRAGMODE_DRAGGABLE": "ka taea te tō", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "kāore e taea te tō", "SENSING_LOUDNESS": "hoihoi", "SENSING_LOUD": "hoihoi?", "SENSING_TIMER": "taima", "SENSING_RESETTIMER": "tautuhia anōtia te taima", "SENSING_OF": "%1 o %2", "SENSING_OF_XPOSITION": "tūnga x", "SENSING_OF_YPOSITION": "tūnga y", "SENSING_OF_DIRECTION": "ahunga", "SENSING_OF_COSTUMENUMBER": "kākahu #", "SENSING_OF_COSTUMENAME": "ingoa kākahu", "SENSING_OF_SIZE": "rahi", "SENSING_OF_VOLUME": "kahaoro", "SENSING_OF_BACKDROPNUMBER": "ārai tuarongo #", "SENSING_OF_BACKDROPNAME": "ingoa ārai tuarongo", "SENSING_OF_STAGE": "Atamira", "SENSING_CURRENT": "%1 o nāianei", "SENSING_CURRENT_YEAR": "tau", "SENSING_CURRENT_MONTH": "marama", "SENSING_CURRENT_DATE": "te rā", "SENSING_CURRENT_DAYOFWEEK": "te rangi o te wiki", "SENSING_CURRENT_HOUR": "haora", "SENSING_CURRENT_MINUTE": "miniti", "SENSING_CURRENT_SECOND": "hēkona", "SENSING_DAYSSINCE2000": "ngā rā mai i 2000", "SENSING_USERNAME": "ingoa kaiwhakamahi", "SENSING_USERID": "tohu tuakiri", "SOUND_PLAY": "tīmatahia te whakatangi i te oro %1", "SOUND_PLAYUNTILDONE": "whakatangihia te oro %1 kia mutu rawa", "SOUND_STOPALLSOUNDS": "katia ngā oro katoa", "SOUND_SETEFFECTO": "tautuhia te rākeitanga %1 kia %2", "SOUND_CHANGEEFFECTBY": "panonitia te rākeitanga %1 mā te %2", "SOUND_CLEAREFFECTS": "ūkui rākeitanga orotaunaki", "SOUND_EFFECTS_PITCH": "hauoro", "SOUND_EFFECTS_PAN": "huri whakatemauī/whakatekatau", "SOUND_CHANGEVOLUMEBY": "panonitia te kahaoro mā te %1", "SOUND_SETVOLUMETO": "tautuhia te kahaoro kia %1%", "SOUND_VOLUME": "kahaoro", "CATEGORY_MOTION": "Nekehanga", "CATEGORY_LOOKS": "Āhua", "CATEGORY_SOUND": "Oro", "CATEGORY_EVENTS": "Takahanga", "CATEGORY_CONTROL": "Whakatina", "CATEGORY_SENSING": "Paerongo", "CATEGORY_OPERATORS": "Tohutūmahi", "CATEGORY_VARIABLES": "Ngā Taurangi", "CATEGORY_MYBLOCKS": "Aku Paraka", "DUPLICATE": "Tāruatia", "DELETE": "Mukua", "ADD_COMMENT": "Tāpiri Tākupu", "REMOVE_COMMENT": "Mukua te Tākupu", "DELETE_BLOCK": "Mukua te Paraka", "DELETE_X_BLOCKS": "Mukua %1 Paraka", "DELETE_ALL_BLOCKS": "Mukua te katoa o ngā paraka e %1 ?", "CLEAN_UP": "Whakatikatika i ngā Paraka", "HELP": "Āwhina", "UNDO": "Wetekia", "REDO": "Mahia anōtia", "EDIT_PROCEDURE": "Whakatikaina", "SHOW_PROCEDURE_DEFINITION": "Haere ki te tautuhinga", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Kīia tētahi mea...", "COLOUR_HUE_LABEL": "Tae", "COLOUR_SATURATION_LABEL": "Waiwai", "COLOUR_BRIGHTNESS_LABEL": "Pīataata", "CHANGE_VALUE_TITLE": "Panonitia te uara:", "RENAME_VARIABLE": "Tapaina anōtia te taurangi", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Tapaina anōtia te Taurangi", "NEW_VARIABLE": "Hangaia tētahi taurangi", "NEW_VARIABLE_TITLE": "Ingoa taurangi hou:", "VARIABLE_MODAL_TITLE": "Taurangi Hou", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Hangaia tētahi Paraka", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Hangaia tētahi Rārangi", "NEW_LIST_TITLE": "Ingoa rārangi hou:", "LIST_MODAL_TITLE": "Rārangi Hou", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Tapaina te Rārangi", "NEW_BROADCAST_MESSAGE": "Karere hou", "NEW_BROADCAST_MESSAGE_TITLE": "Ingoa karere hou:", "BROADCAST_MODAL_TITLE": "Karere Hou", "DEFAULT_BROADCAST_MESSAGE_NAME": "karere1" }; Blockly.ScratchMsgs.locales["nb"] = { "CONTROL_FOREVER": "gjenta for alltid", "CONTROL_REPEAT": "gjenta %1 ganger", "CONTROL_IF": "hvis %1", "CONTROL_ELSE": "ellers", "CONTROL_STOP": "stopp", "CONTROL_STOP_ALL": "alle", "CONTROL_STOP_THIS": "dette skriptet", "CONTROL_STOP_OTHER": "andre skript i figuren", "CONTROL_WAIT": "vent %1 sekunder", "CONTROL_WAITUNTIL": "vent til %1", "CONTROL_REPEATUNTIL": "gjenta til %1", "CONTROL_WHILE": "gjenta hvis %1", "CONTROL_FOREACH": "for hver %1 i %2", "CONTROL_STARTASCLONE": "når jeg starter som klon", "CONTROL_CREATECLONEOF": "lag klon av %1", "CONTROL_CREATECLONEOF_MYSELF": "meg", "CONTROL_DELETETHISCLONE": "slett denne klonen", "CONTROL_COUNTER": "teller", "CONTROL_INCRCOUNTER": "tell opp med 1", "CONTROL_CLEARCOUNTER": "nullstill telleren", "CONTROL_ALLATONCE": "kjør fort", "DATA_SETVARIABLETO": "sett %1 til %2", "DATA_CHANGEVARIABLEBY": "endre %1 med %2", "DATA_SHOWVARIABLE": "vis variabel %1", "DATA_HIDEVARIABLE": "skjul variabel %1", "DATA_ADDTOLIST": "legg til %1 i %2", "DATA_DELETEOFLIST": "slett element %1 i %2", "DATA_INSERTATLIST": "sett inn %1 på plass %2 i %3", "DATA_REPLACEITEMOFLIST": "erstatt element %1 i %2 med %3", "DATA_ITEMOFLIST": "element %1 i %2", "DATA_LENGTHOFLIST": "lengden av %1", "DATA_LISTCONTAINSITEM": "%1 inneholder %2?", "DATA_SHOWLIST": "vis liste %1", "DATA_HIDELIST": "skjul liste %1", "DATA_INDEX_ALL": "alle", "DATA_INDEX_LAST": "siste", "DATA_INDEX_RANDOM": "tilfeldig", "EVENT_WHENFLAGCLICKED": "når %1 klikkes", "EVENT_WHENTHISSPRITECLICKED": "når denne figuren klikkes", "EVENT_WHENSTAGECLICKED": "når scenen klikkes", "EVENT_WHENTOUCHINGOBJECT": "når denne figuren berører %1", "EVENT_WHENBROADCASTRECEIVED": "når jeg mottar %1", "EVENT_WHENBACKDROPSWITCHESTO": "når bakgrunn bytter til %1", "EVENT_WHENGREATERTHAN": "når %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "sekundklokke", "EVENT_BROADCAST": "send melding %1", "EVENT_BROADCASTANDWAIT": "send melding %1 og vent", "EVENT_WHENKEYPRESSED": "når %1 trykkes", "EVENT_WHENKEYPRESSED_SPACE": "mellomrom", "EVENT_WHENKEYPRESSED_LEFT": "pil venstre", "EVENT_WHENKEYPRESSED_RIGHT": "pil høyre", "EVENT_WHENKEYPRESSED_DOWN": "pil ned", "EVENT_WHENKEYPRESSED_UP": "pil opp", "EVENT_WHENKEYPRESSED_ANY": "hvilken som helst", "LOOKS_SAYFORSECS": "si %1 i %2 sekunder", "LOOKS_SAY": "si %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "tenk %1 i %2 sekunder", "LOOKS_THINK": "tenk %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "vis", "LOOKS_HIDE": "skjul", "LOOKS_HIDEALLSPRITES": "skjul alle figurer", "LOOKS_EFFECT_COLOR": "farge", "LOOKS_EFFECT_FISHEYE": "fiskeøye", "LOOKS_EFFECT_WHIRL": "virvel", "LOOKS_EFFECT_PIXELATE": "piksel", "LOOKS_EFFECT_MOSAIC": "mosaikk", "LOOKS_EFFECT_BRIGHTNESS": "lysstyrke", "LOOKS_EFFECT_GHOST": "gjennomsiktig", "LOOKS_CHANGEEFFECTBY": "endre %1 effekt med %2", "LOOKS_SETEFFECTTO": "sett %1 effekt til %2", "LOOKS_CLEARGRAPHICEFFECTS": "fjern grafiske effekter", "LOOKS_CHANGESIZEBY": "endre størrelse med %1", "LOOKS_SETSIZETO": "sett størrelse til %1 %", "LOOKS_SIZE": "størrelse", "LOOKS_CHANGESTRETCHBY": "endre strekk med %1", "LOOKS_SETSTRETCHTO": "sett strekk til %1 %", "LOOKS_SWITCHCOSTUMETO": "bytt drakt til %1", "LOOKS_NEXTCOSTUME": "neste drakt", "LOOKS_SWITCHBACKDROPTO": "bytt bakgrunn til %1", "LOOKS_GOTOFRONTBACK": "legg %1", "LOOKS_GOTOFRONTBACK_FRONT": "foran alt", "LOOKS_GOTOFRONTBACK_BACK": "bakerst", "LOOKS_GOFORWARDBACKWARDLAYERS": "gå %1 %2 lag", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "forover", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "bakover", "LOOKS_BACKDROPNUMBERNAME": "bakgrunn %1", "LOOKS_COSTUMENUMBERNAME": "drakt %1", "LOOKS_NUMBERNAME_NUMBER": "nummer", "LOOKS_NUMBERNAME_NAME": "navn", "LOOKS_SWITCHBACKDROPTOANDWAIT": "bytt bakgrunn til %1 og vent", "LOOKS_NEXTBACKDROP": "neste bakgrunn", "LOOKS_PREVIOUSBACKDROP": "forrige bakgrunn", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "gå %1 steg", "MOTION_TURNLEFT": "snu %1 %2 grader", "MOTION_TURNRIGHT": "snu %1 %2 grader", "MOTION_POINTINDIRECTION": "pek i retning %1", "MOTION_POINTTOWARDS": "pek mot %1", "MOTION_POINTTOWARDS_POINTER": "musepeker", "MOTION_GOTO": "gå til %1", "MOTION_GOTO_POINTER": "musepeker", "MOTION_GOTO_RANDOM": "tilfeldig sted", "MOTION_GOTOXY": "gå til x: %1 y: %2", "MOTION_GLIDESECSTOXY": "gli %1 sekunder til x: %2 y: %3", "MOTION_GLIDETO": "gli %1 sekunder til %2", "MOTION_GLIDETO_POINTER": "musepeker", "MOTION_GLIDETO_RANDOM": "tilfeldig sted", "MOTION_CHANGEXBY": "endre x med %1", "MOTION_SETX": "sett x til %1", "MOTION_CHANGEYBY": "endre y med %1", "MOTION_SETY": "sett y til %1", "MOTION_IFONEDGEBOUNCE": "sprett tilbake ved kanten", "MOTION_SETROTATIONSTYLE": "begrens rotasjon %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "vend sideveis", "MOTION_SETROTATIONSTYLE_DONTROTATE": "ikke roter", "MOTION_SETROTATIONSTYLE_ALLAROUND": "fri rotasjon", "MOTION_XPOSITION": "x-posisjon", "MOTION_YPOSITION": "y-posisjon", "MOTION_DIRECTION": "retning", "MOTION_SCROLLRIGHT": "rull høyre %1", "MOTION_SCROLLUP": "rull opp %1", "MOTION_ALIGNSCENE": "flytt bakgrunn %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "nederst til venstre", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "nederst til høyre", "MOTION_ALIGNSCENE_MIDDLE": "i midten", "MOTION_ALIGNSCENE_TOPLEFT": "øverst til venstre", "MOTION_ALIGNSCENE_TOPRIGHT": "øverst til høyre", "MOTION_XSCROLL": "rull x", "MOTION_YSCROLL": "rull y", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "tilfeldig tall fra %1 til %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 og %2", "OPERATORS_OR": "%1 eller %2", "OPERATORS_NOT": "ikke %1", "OPERATORS_JOIN": "sett sammen %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "bokstav %1 i %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "lengden av %1", "OPERATORS_CONTAINS": "%1 inneholder %2?", "OPERATORS_MOD": "%1 mod %2", "OPERATORS_ROUND": "avrund %1", "OPERATORS_MATHOP": "%1 av %2", "OPERATORS_MATHOP_ABS": "absoluttverdi", "OPERATORS_MATHOP_FLOOR": "avrund ned", "OPERATORS_MATHOP_CEILING": "avrund opp", "OPERATORS_MATHOP_SQRT": "kvadratrot", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "arcsin", "OPERATORS_MATHOP_ACOS": "arccos", "OPERATORS_MATHOP_ATAN": "arctan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "definer %1", "SENSING_TOUCHINGOBJECT": "berører %1?", "SENSING_TOUCHINGOBJECT_POINTER": "musepeker", "SENSING_TOUCHINGOBJECT_EDGE": "kant", "SENSING_TOUCHINGCOLOR": "berører fargen %1?", "SENSING_COLORISTOUCHINGCOLOR": "farge %1 berører %2?", "SENSING_DISTANCETO": "avstand til %1", "SENSING_DISTANCETO_POINTER": "musepeker", "SENSING_ASKANDWAIT": "spør %1 og vent", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "svar", "SENSING_KEYPRESSED": "tast %1 trykket?", "SENSING_MOUSEDOWN": "museknappen er trykket?", "SENSING_MOUSEX": "mus x", "SENSING_MOUSEY": "mus y", "SENSING_SETDRAGMODE": "%1 å dra med musen", "SENSING_SETDRAGMODE_DRAGGABLE": "tillat", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "ikke tillat", "SENSING_LOUDNESS": "lydnivå", "SENSING_LOUD": "høy lyd?", "SENSING_TIMER": "sekundklokke", "SENSING_RESETTIMER": "nullstill klokken", "SENSING_OF": "%1 av %2", "SENSING_OF_XPOSITION": "x-posisjon", "SENSING_OF_YPOSITION": "y-posisjon", "SENSING_OF_DIRECTION": "retning", "SENSING_OF_COSTUMENUMBER": "drakt nr.", "SENSING_OF_COSTUMENAME": "draktnavn", "SENSING_OF_SIZE": "størrelse", "SENSING_OF_VOLUME": "volum", "SENSING_OF_BACKDROPNUMBER": "bakgrunn nr.", "SENSING_OF_BACKDROPNAME": "navn på bakgrunn", "SENSING_OF_STAGE": "Scene", "SENSING_CURRENT": "%1 nå", "SENSING_CURRENT_YEAR": "år", "SENSING_CURRENT_MONTH": "måned", "SENSING_CURRENT_DATE": "dato", "SENSING_CURRENT_DAYOFWEEK": "ukedag", "SENSING_CURRENT_HOUR": "time", "SENSING_CURRENT_MINUTE": "minutt", "SENSING_CURRENT_SECOND": "sekund", "SENSING_DAYSSINCE2000": "dager siden 2000", "SENSING_USERNAME": "brukernavn", "SENSING_USERID": "brukernavn", "SOUND_PLAY": "start lyden %1", "SOUND_PLAYUNTILDONE": "spill lyden %1 til den er ferdig", "SOUND_STOPALLSOUNDS": "stopp alle lyder", "SOUND_SETEFFECTO": "sett %1 effekt til %2", "SOUND_CHANGEEFFECTBY": "endre %1 effekt med %2", "SOUND_CLEAREFFECTS": "fjern lydeffekter", "SOUND_EFFECTS_PITCH": "tonehøyde", "SOUND_EFFECTS_PAN": "retning", "SOUND_CHANGEVOLUMEBY": "endre volum med %1", "SOUND_SETVOLUMETO": "sett volum %1%", "SOUND_VOLUME": "volum", "CATEGORY_MOTION": "Bevegelse", "CATEGORY_LOOKS": "Utseende", "CATEGORY_SOUND": "Lyd", "CATEGORY_EVENTS": "Hendelser", "CATEGORY_CONTROL": "Styring", "CATEGORY_SENSING": "Sansing", "CATEGORY_OPERATORS": "Operatorer", "CATEGORY_VARIABLES": "Variabler", "CATEGORY_MYBLOCKS": "Mine klosser", "DUPLICATE": "Lag en kopi", "DELETE": "Slett", "ADD_COMMENT": "Skriv en kommentar", "REMOVE_COMMENT": "Fjern kommentar", "DELETE_BLOCK": "Slett kloss", "DELETE_X_BLOCKS": "Slett %1 klosser", "DELETE_ALL_BLOCKS": "Slette disse %1 klossene?", "CLEAN_UP": "Rydd opp klossene", "HELP": "Hjelp", "UNDO": "Angre", "REDO": "Gjør igjen", "EDIT_PROCEDURE": "Rediger", "SHOW_PROCEDURE_DEFINITION": "Gå til definisjonen", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Si noe...", "COLOUR_HUE_LABEL": "Farge", "COLOUR_SATURATION_LABEL": "Fargemetning", "COLOUR_BRIGHTNESS_LABEL": "Lysstyrke", "CHANGE_VALUE_TITLE": "Endre verdi:", "RENAME_VARIABLE": "Endre navn på variabel", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Endre navn på variabel", "NEW_VARIABLE": "Lag en variabel", "NEW_VARIABLE_TITLE": "Nytt variabelnavn:", "VARIABLE_MODAL_TITLE": "Ny variabel", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Lag en kloss", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Lag en Liste", "NEW_LIST_TITLE": "Nytt navn på listen:", "LIST_MODAL_TITLE": "Ny liste", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Gi listen et annet navn", "NEW_BROADCAST_MESSAGE": "Ny melding", "NEW_BROADCAST_MESSAGE_TITLE": "Skriv ny melding:", "BROADCAST_MODAL_TITLE": "Ny melding", "DEFAULT_BROADCAST_MESSAGE_NAME": "melding1" }; Blockly.ScratchMsgs.locales["nl"] = { "CONTROL_FOREVER": "herhaal", "CONTROL_REPEAT": "herhaal %1", "CONTROL_IF": "als %1 dan", "CONTROL_ELSE": "anders", "CONTROL_STOP": "stop", "CONTROL_STOP_ALL": "alle", "CONTROL_STOP_THIS": "dit script", "CONTROL_STOP_OTHER": "andere scripts in sprite", "CONTROL_WAIT": "wacht %1 sec.", "CONTROL_WAITUNTIL": "wacht tot %1", "CONTROL_REPEATUNTIL": "herhaal tot %1", "CONTROL_WHILE": "zolang %1", "CONTROL_FOREACH": "voor elke %1 in %2", "CONTROL_STARTASCLONE": "wanneer ik als kloon start", "CONTROL_CREATECLONEOF": "maak een kloon van %1", "CONTROL_CREATECLONEOF_MYSELF": "mijzelf", "CONTROL_DELETETHISCLONE": "verwijder deze kloon", "CONTROL_COUNTER": "teller", "CONTROL_INCRCOUNTER": "verhoog teller", "CONTROL_CLEARCOUNTER": "zet teller op 0", "CONTROL_ALLATONCE": "alles in een keer", "DATA_SETVARIABLETO": "maak %1 %2", "DATA_CHANGEVARIABLEBY": "verander %1 met %2", "DATA_SHOWVARIABLE": "toon variabele %1", "DATA_HIDEVARIABLE": "verberg variabele %1", "DATA_ADDTOLIST": "voeg %1 toe aan %2", "DATA_DELETEOFLIST": "verwijder %1 van %2", "DATA_INSERTATLIST": "voeg %1 toe op %2 van %3", "DATA_REPLACEITEMOFLIST": "vervang item %1 van %2 door %3", "DATA_ITEMOFLIST": "item %1 van %2", "DATA_LENGTHOFLIST": "lengte van %1", "DATA_LISTCONTAINSITEM": "%1 bevat %2?", "DATA_SHOWLIST": "toon lijst %1", "DATA_HIDELIST": "verberg lijst %1", "DATA_INDEX_ALL": "alle", "DATA_INDEX_LAST": "laatste", "DATA_INDEX_RANDOM": "willekeurig", "EVENT_WHENFLAGCLICKED": "wanneer op %1 wordt geklikt", "EVENT_WHENTHISSPRITECLICKED": "wanneer op deze sprite wordt geklikt", "EVENT_WHENSTAGECLICKED": "wanneer op het speelveld wordt geklikt", "EVENT_WHENTOUCHINGOBJECT": "wanneer deze sprite %1 raakt", "EVENT_WHENBROADCASTRECEIVED": "wanneer ik signaal %1 ontvang", "EVENT_WHENBACKDROPSWITCHESTO": "wanneer achtergrond verandert naar %1", "EVENT_WHENGREATERTHAN": "wanneer %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "klok", "EVENT_BROADCAST": "zend signaal %1", "EVENT_BROADCASTANDWAIT": "zend signaal %1 en wacht", "EVENT_WHENKEYPRESSED": "wanneer %1 is ingedrukt", "EVENT_WHENKEYPRESSED_SPACE": "spatiebalk", "EVENT_WHENKEYPRESSED_LEFT": "pijltje links", "EVENT_WHENKEYPRESSED_RIGHT": "pijltje rechts", "EVENT_WHENKEYPRESSED_DOWN": "pijltje omlaag", "EVENT_WHENKEYPRESSED_UP": "pijltje omhoog", "EVENT_WHENKEYPRESSED_ANY": "willekeurig", "LOOKS_SAYFORSECS": "zeg %1 %2 sec.", "LOOKS_SAY": "zeg %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "denk %1 %2 sec.", "LOOKS_THINK": "denk %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "verschijn", "LOOKS_HIDE": "verdwijn", "LOOKS_HIDEALLSPRITES": "verberg alle sprites", "LOOKS_EFFECT_COLOR": "kleur", "LOOKS_EFFECT_FISHEYE": "vissenoog", "LOOKS_EFFECT_WHIRL": "draaikolk", "LOOKS_EFFECT_PIXELATE": "pixeleren", "LOOKS_EFFECT_MOSAIC": "mozaïek", "LOOKS_EFFECT_BRIGHTNESS": "helderheid", "LOOKS_EFFECT_GHOST": "geest", "LOOKS_CHANGEEFFECTBY": "verander %1 effect met %2", "LOOKS_SETEFFECTTO": "zet %1 effect op %2", "LOOKS_CLEARGRAPHICEFFECTS": "zet alle effecten uit", "LOOKS_CHANGESIZEBY": "verander grootte met %1", "LOOKS_SETSIZETO": "maak grootte %1 %", "LOOKS_SIZE": "grootte", "LOOKS_CHANGESTRETCHBY": "verander stretch met %1", "LOOKS_SETSTRETCHTO": "maak stretch %1 %", "LOOKS_SWITCHCOSTUMETO": "verander uiterlijk naar %1", "LOOKS_NEXTCOSTUME": "volgend uiterlijk", "LOOKS_SWITCHBACKDROPTO": "verander achtergrond naar %1", "LOOKS_GOTOFRONTBACK": "ga naar laag %1", "LOOKS_GOTOFRONTBACK_FRONT": "voorgrond", "LOOKS_GOTOFRONTBACK_BACK": "achtergrond", "LOOKS_GOFORWARDBACKWARDLAYERS": "ga %1 %2 lagen", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "naar voren", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "naar achteren", "LOOKS_BACKDROPNUMBERNAME": "achtergrond %1", "LOOKS_COSTUMENUMBERNAME": "uiterlijk %1", "LOOKS_NUMBERNAME_NUMBER": "nummer", "LOOKS_NUMBERNAME_NAME": "naam", "LOOKS_SWITCHBACKDROPTOANDWAIT": "verander achtergrond naar %1 en wacht", "LOOKS_NEXTBACKDROP": "volgende achtergrond", "LOOKS_PREVIOUSBACKDROP": "vorige achtergrond", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "neem %1 stappen", "MOTION_TURNLEFT": "draai %1 %2 graden", "MOTION_TURNRIGHT": "draai %1 %2 graden", "MOTION_POINTINDIRECTION": "richt naar %1 graden", "MOTION_POINTTOWARDS": "richt naar %1", "MOTION_POINTTOWARDS_POINTER": "muisaanwijzer", "MOTION_GOTO": "ga naar %1", "MOTION_GOTO_POINTER": "muisaanwijzer", "MOTION_GOTO_RANDOM": "willekeurige positie", "MOTION_GOTOXY": "ga naar x: %1 y: %2", "MOTION_GLIDESECSTOXY": "schuif in %1 sec. naar x: %2 y: %3", "MOTION_GLIDETO": "schuif in %1 sec. naar %2", "MOTION_GLIDETO_POINTER": "muisaanwijzer", "MOTION_GLIDETO_RANDOM": "willekeurige positie", "MOTION_CHANGEXBY": "verander x met %1", "MOTION_SETX": "maak x %1", "MOTION_CHANGEYBY": "verander y met %1", "MOTION_SETY": "maak y %1", "MOTION_IFONEDGEBOUNCE": "keer om aan de rand", "MOTION_SETROTATIONSTYLE": "maak draaistijl %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "links-rechts", "MOTION_SETROTATIONSTYLE_DONTROTATE": "niet draaien", "MOTION_SETROTATIONSTYLE_ALLAROUND": "helemaal rond", "MOTION_XPOSITION": "x-positie", "MOTION_YPOSITION": "y-positie", "MOTION_DIRECTION": "richting", "MOTION_SCROLLRIGHT": "rechts scrollen %1", "MOTION_SCROLLUP": "omhoog scrollen %1", "MOTION_ALIGNSCENE": "scène uitlijnen %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "linksonder", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "rechtsonder", "MOTION_ALIGNSCENE_MIDDLE": "midden", "MOTION_ALIGNSCENE_TOPLEFT": "linksboven", "MOTION_ALIGNSCENE_TOPRIGHT": "rechtsboven", "MOTION_XSCROLL": "x scroll", "MOTION_YSCROLL": "y scroll", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "willekeurig getal tussen %1 en %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 en %2", "OPERATORS_OR": "%1 of %2", "OPERATORS_NOT": "niet %1", "OPERATORS_JOIN": "voeg %1 en %2 samen", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "letter %1 van %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "lengte van %1", "OPERATORS_CONTAINS": "%1 bevat %2?", "OPERATORS_MOD": "%1 modulo %2", "OPERATORS_ROUND": "afgerond %1", "OPERATORS_MATHOP": "%1 van %2", "OPERATORS_MATHOP_ABS": "absoluut", "OPERATORS_MATHOP_FLOOR": "beneden", "OPERATORS_MATHOP_CEILING": "boven", "OPERATORS_MATHOP_SQRT": "wortel", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "arcsin", "OPERATORS_MATHOP_ACOS": "arccos", "OPERATORS_MATHOP_ATAN": "arctan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "definieer %1", "SENSING_TOUCHINGOBJECT": "raak ik %1?", "SENSING_TOUCHINGOBJECT_POINTER": "muisaanwijzer", "SENSING_TOUCHINGOBJECT_EDGE": "rand", "SENSING_TOUCHINGCOLOR": "raak ik kleur %1?", "SENSING_COLORISTOUCHINGCOLOR": "raakt kleur %1 kleur %2?", "SENSING_DISTANCETO": "afstand tot %1", "SENSING_DISTANCETO_POINTER": "muisaanwijzer", "SENSING_ASKANDWAIT": "vraag %1 en wacht", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "antwoord", "SENSING_KEYPRESSED": "toets %1 ingedrukt?", "SENSING_MOUSEDOWN": "muis ingedrukt?", "SENSING_MOUSEX": "muis x", "SENSING_MOUSEY": "muis y", "SENSING_SETDRAGMODE": "zet sleepbaar op %1", "SENSING_SETDRAGMODE_DRAGGABLE": "sleepbaar", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "niet sleepbaar", "SENSING_LOUDNESS": "volume", "SENSING_LOUD": "luid?", "SENSING_TIMER": "klok", "SENSING_RESETTIMER": "zet klok op 0", "SENSING_OF": "%1 van %2", "SENSING_OF_XPOSITION": "x-positie", "SENSING_OF_YPOSITION": "y-positie", "SENSING_OF_DIRECTION": "richting", "SENSING_OF_COSTUMENUMBER": "uiterlijk #", "SENSING_OF_COSTUMENAME": "naam uiterlijk", "SENSING_OF_SIZE": "grootte", "SENSING_OF_VOLUME": "volume", "SENSING_OF_BACKDROPNUMBER": "achtergrond #", "SENSING_OF_BACKDROPNAME": "achtergrond naam", "SENSING_OF_STAGE": "Speelveld", "SENSING_CURRENT": "huidige %1", "SENSING_CURRENT_YEAR": "jaar", "SENSING_CURRENT_MONTH": "maand", "SENSING_CURRENT_DATE": "datum", "SENSING_CURRENT_DAYOFWEEK": "dag van de week", "SENSING_CURRENT_HOUR": "uur", "SENSING_CURRENT_MINUTE": "minuut", "SENSING_CURRENT_SECOND": "seconde", "SENSING_DAYSSINCE2000": "dagen sinds 2000", "SENSING_USERNAME": "gebruikersnaam", "SENSING_USERID": "gebruiker id", "SOUND_PLAY": "start geluid %1", "SOUND_PLAYUNTILDONE": "start geluid %1 en wacht", "SOUND_STOPALLSOUNDS": "stop alle geluiden", "SOUND_SETEFFECTO": "zet effect %1 op %2", "SOUND_CHANGEEFFECTBY": "verander %1-effect met %2", "SOUND_CLEAREFFECTS": "zet alle effecten uit", "SOUND_EFFECTS_PITCH": "toonhoogte", "SOUND_EFFECTS_PAN": "kanaal links/rechts", "SOUND_CHANGEVOLUMEBY": "verander volume met %1", "SOUND_SETVOLUMETO": "zet volume op %1%", "SOUND_VOLUME": "volume", "CATEGORY_MOTION": "Beweging", "CATEGORY_LOOKS": "Uiterlijken", "CATEGORY_SOUND": "Geluid", "CATEGORY_EVENTS": "Gebeurtenissen", "CATEGORY_CONTROL": "Besturen", "CATEGORY_SENSING": "Waarnemen", "CATEGORY_OPERATORS": "Functies", "CATEGORY_VARIABLES": "Variabelen", "CATEGORY_MYBLOCKS": "Mijn blokken", "DUPLICATE": "Kopie maken", "DELETE": "Verwijderen", "ADD_COMMENT": "Commentaar toevoegen", "REMOVE_COMMENT": "Commentaar verwijderen", "DELETE_BLOCK": "Blok verwijderen", "DELETE_X_BLOCKS": "Verwijder %1 blokken", "DELETE_ALL_BLOCKS": "Verwijder alle %1 blokken?", "CLEAN_UP": "Blokken opruimen", "HELP": "Help", "UNDO": "Ongedaan maken", "REDO": "Opnieuw", "EDIT_PROCEDURE": "Bewerk", "SHOW_PROCEDURE_DEFINITION": "Ga naar definitie", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Zeg iets...", "COLOUR_HUE_LABEL": "Kleur", "COLOUR_SATURATION_LABEL": "Verzadiging", "COLOUR_BRIGHTNESS_LABEL": "Helderheid", "CHANGE_VALUE_TITLE": "Verander waarde:", "RENAME_VARIABLE": "Variabele hernoemen", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Variabele hernoemen", "NEW_VARIABLE": "Maak een variabele", "NEW_VARIABLE_TITLE": "Nieuwe variabelenaam:", "VARIABLE_MODAL_TITLE": "Nieuwe variabele", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Maak een blok", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Maak een lijst", "NEW_LIST_TITLE": "Nieuwe lijstnaam:", "LIST_MODAL_TITLE": "Nieuwe lijst", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Lijst hernoemen", "NEW_BROADCAST_MESSAGE": "Nieuw bericht", "NEW_BROADCAST_MESSAGE_TITLE": "Nieuwe berichtnaam:", "BROADCAST_MODAL_TITLE": "Nieuw bericht", "DEFAULT_BROADCAST_MESSAGE_NAME": "bericht1" }; Blockly.ScratchMsgs.locales["pt-br"] = { "CONTROL_FOREVER": "sempre", "CONTROL_REPEAT": "repita %1", "CONTROL_IF": "se %1 então", "CONTROL_ELSE": "senão", "CONTROL_STOP": "pare", "CONTROL_STOP_ALL": "todos", "CONTROL_STOP_THIS": "este script", "CONTROL_STOP_OTHER": "outros scripts no ator", "CONTROL_WAIT": "aguarde %1 segundos", "CONTROL_WAITUNTIL": "aguarde até %1", "CONTROL_REPEATUNTIL": "repita até %1", "CONTROL_WHILE": "enquanto %1", "CONTROL_FOREACH": "para cada %1 em %2", "CONTROL_STARTASCLONE": "quando eu iniciar como um clone", "CONTROL_CREATECLONEOF": "criar clone de %1", "CONTROL_CREATECLONEOF_MYSELF": "este ator", "CONTROL_DELETETHISCLONE": "apagar este clone", "CONTROL_COUNTER": "contador", "CONTROL_INCRCOUNTER": "incremente contador", "CONTROL_CLEARCOUNTER": "limpar contador", "CONTROL_ALLATONCE": "todos de uma vez", "DATA_SETVARIABLETO": "ponha %1 para %2", "DATA_CHANGEVARIABLEBY": "mude %1 por %2", "DATA_SHOWVARIABLE": "mostre variável %1", "DATA_HIDEVARIABLE": "esconda variável %1", "DATA_ADDTOLIST": "adicione %1 a %2", "DATA_DELETEOFLIST": "apague %1 de %2", "DATA_INSERTATLIST": "insira %1 a %2 de %3", "DATA_REPLACEITEMOFLIST": "substituir item %1 de %2 com %3", "DATA_ITEMOFLIST": "item %1 de %2", "DATA_LENGTHOFLIST": "comprimento de %1", "DATA_LISTCONTAINSITEM": "%1 contém %2", "DATA_SHOWLIST": "mostre lista %1", "DATA_HIDELIST": "esconda lista %1", "DATA_INDEX_ALL": "todos", "DATA_INDEX_LAST": "último", "DATA_INDEX_RANDOM": "aleatório", "EVENT_WHENFLAGCLICKED": "quando %1 clicado", "EVENT_WHENTHISSPRITECLICKED": "quando este ator clicado", "EVENT_WHENSTAGECLICKED": "quando palco clicado", "EVENT_WHENTOUCHINGOBJECT": "quando este ator tocar %1", "EVENT_WHENBROADCASTRECEIVED": "quando eu receber %1", "EVENT_WHENBACKDROPSWITCHESTO": "quando pano de fundo mudar para %1", "EVENT_WHENGREATERTHAN": "quando %1 >%2", "EVENT_WHENGREATERTHAN_TIMER": "cronômetro", "EVENT_BROADCAST": "transmita %1", "EVENT_BROADCASTANDWAIT": "transmita %1 e espere", "EVENT_WHENKEYPRESSED": "quando tecla %1 pressionada", "EVENT_WHENKEYPRESSED_SPACE": "espaço", "EVENT_WHENKEYPRESSED_LEFT": "seta esquerda", "EVENT_WHENKEYPRESSED_RIGHT": "seta direita", "EVENT_WHENKEYPRESSED_DOWN": "seta para baixo", "EVENT_WHENKEYPRESSED_UP": "seta para cima", "EVENT_WHENKEYPRESSED_ANY": "qualquer", "LOOKS_SAYFORSECS": "diga %1 por %2 segundos", "LOOKS_SAY": "diga %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "pense %1 por %2 segundos", "LOOKS_THINK": "pense %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "mostre", "LOOKS_HIDE": "esconda", "LOOKS_HIDEALLSPRITES": "ocultar todos", "LOOKS_EFFECT_COLOR": "cor", "LOOKS_EFFECT_FISHEYE": "olho de peixe", "LOOKS_EFFECT_WHIRL": "turbilhão", "LOOKS_EFFECT_PIXELATE": "pixelizada", "LOOKS_EFFECT_MOSAIC": "mosaico", "LOOKS_EFFECT_BRIGHTNESS": "brilho", "LOOKS_EFFECT_GHOST": "fantasma", "LOOKS_CHANGEEFFECTBY": "mude efeito %1 para %2", "LOOKS_SETEFFECTTO": "defina efeito %1 para %2", "LOOKS_CLEARGRAPHICEFFECTS": "limpe efeitos gráficos", "LOOKS_CHANGESIZEBY": "mude tamanho por %1", "LOOKS_SETSIZETO": "fixe tamanho para %1 %", "LOOKS_SIZE": "tamanho", "LOOKS_CHANGESTRETCHBY": "mude trajeto por %1", "LOOKS_SETSTRETCHTO": "ajuste curso para %1 %", "LOOKS_SWITCHCOSTUMETO": "mude traje para %1", "LOOKS_NEXTCOSTUME": "próximo traje", "LOOKS_SWITCHBACKDROPTO": "mude pano de fundo para %1", "LOOKS_GOTOFRONTBACK": "vá para %1 camada", "LOOKS_GOTOFRONTBACK_FRONT": "frente", "LOOKS_GOTOFRONTBACK_BACK": "trás", "LOOKS_GOFORWARDBACKWARDLAYERS": "vá para %1 %2 camadas", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "para frente", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "para trás", "LOOKS_BACKDROPNUMBERNAME": "pano de fundo %1", "LOOKS_COSTUMENUMBERNAME": "traje %1", "LOOKS_NUMBERNAME_NUMBER": "número", "LOOKS_NUMBERNAME_NAME": "nome", "LOOKS_SWITCHBACKDROPTOANDWAIT": "mudo pano de fundo para %1 e espere", "LOOKS_NEXTBACKDROP": "próximo pano de fundo", "LOOKS_PREVIOUSBACKDROP": "cenário anterior", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "mova %1 passos", "MOTION_TURNLEFT": "gire %1 %2 graus", "MOTION_TURNRIGHT": "gire %1 %2 graus", "MOTION_POINTINDIRECTION": "aponte na direção %1", "MOTION_POINTTOWARDS": "aponte para a direção %1", "MOTION_POINTTOWARDS_POINTER": "ponteiro do mouse", "MOTION_GOTO": "vá para %1", "MOTION_GOTO_POINTER": "ponteiro do mouse", "MOTION_GOTO_RANDOM": "posição aleatória", "MOTION_GOTOXY": "vá para x: %1 y: %2", "MOTION_GLIDESECSTOXY": "deslizar %1 segs para x: %2 y: %3", "MOTION_GLIDETO": "deslizar %1 segs para %2", "MOTION_GLIDETO_POINTER": "ponteiro do mouse", "MOTION_GLIDETO_RANDOM": "posição aleatória", "MOTION_CHANGEXBY": "mude x por %1", "MOTION_SETX": "fixe x para %1", "MOTION_CHANGEYBY": "mude y por %1", "MOTION_SETY": "fixe y para %1", "MOTION_IFONEDGEBOUNCE": "se tocar na borda, volte", "MOTION_SETROTATIONSTYLE": "ajuste rotação para estilo %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "esquerda-direita", "MOTION_SETROTATIONSTYLE_DONTROTATE": "não rotacionar", "MOTION_SETROTATIONSTYLE_ALLAROUND": "tudo a volta", "MOTION_XPOSITION": "posição x", "MOTION_YPOSITION": "posição y", "MOTION_DIRECTION": "direção", "MOTION_SCROLLRIGHT": "rolar para direita %1 %", "MOTION_SCROLLUP": "rolar para cima %1", "MOTION_ALIGNSCENE": "alinhar cena %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "inferior esquerda", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "inferior direita", "MOTION_ALIGNSCENE_MIDDLE": "meio", "MOTION_ALIGNSCENE_TOPLEFT": "superior esquerdo", "MOTION_ALIGNSCENE_TOPRIGHT": "superior direita", "MOTION_XSCROLL": "rolagem eixo x", "MOTION_YSCROLL": "rolagem eixo y", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "número aleatório entre %1 e %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 e %2", "OPERATORS_OR": "%1 ou %2", "OPERATORS_NOT": "não %1", "OPERATORS_JOIN": "junte %1 com %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "letra %1 de %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "tamanho de %1", "OPERATORS_CONTAINS": "%1 contém %2", "OPERATORS_MOD": "%1 mod %2", "OPERATORS_ROUND": "arredonde %1", "OPERATORS_MATHOP": "%1 de %2", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "piso", "OPERATORS_MATHOP_CEILING": "teto", "OPERATORS_MATHOP_SQRT": "raiz", "OPERATORS_MATHOP_SIN": "seno", "OPERATORS_MATHOP_COS": "cosseno", "OPERATORS_MATHOP_TAN": "tangente", "OPERATORS_MATHOP_ASIN": "arcoseno", "OPERATORS_MATHOP_ACOS": "arcocosseno", "OPERATORS_MATHOP_ATAN": "arcotangente", "OPERATORS_MATHOP_LN": "Em", "OPERATORS_MATHOP_LOG": "logaritmo", "OPERATORS_MATHOP_EEXP": "base elevada à potência", "OPERATORS_MATHOP_10EXP": "10 elevado à potência", "PROCEDURES_DEFINITION": "defina %1", "SENSING_TOUCHINGOBJECT": "tocando %1?", "SENSING_TOUCHINGOBJECT_POINTER": "Ponteiro do mouse", "SENSING_TOUCHINGOBJECT_EDGE": "borda", "SENSING_TOUCHINGCOLOR": "Tocando na cor %1?", "SENSING_COLORISTOUCHINGCOLOR": "cor %1 está tocando %2?", "SENSING_DISTANCETO": "distância %1", "SENSING_DISTANCETO_POINTER": "ponteiro do mouse", "SENSING_ASKANDWAIT": "pergunte %1 e espere", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "resposta", "SENSING_KEYPRESSED": "quando a tecla %1 for pressionada", "SENSING_MOUSEDOWN": "mouse pressionado?", "SENSING_MOUSEX": "mouse x", "SENSING_MOUSEY": "mouse y", "SENSING_SETDRAGMODE": "arraste para %1", "SENSING_SETDRAGMODE_DRAGGABLE": "arrastável", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "não arrastável", "SENSING_LOUDNESS": "ruído", "SENSING_LOUD": "alto?", "SENSING_TIMER": "cronômetro", "SENSING_RESETTIMER": "reiniciar o tempo", "SENSING_OF": "%1 de %2", "SENSING_OF_XPOSITION": "posição x", "SENSING_OF_YPOSITION": "posição y", "SENSING_OF_DIRECTION": "direção", "SENSING_OF_COSTUMENUMBER": "traje%1", "SENSING_OF_COSTUMENAME": "nome do traje/ nome da fantasia", "SENSING_OF_SIZE": "tamanho", "SENSING_OF_VOLUME": "volume", "SENSING_OF_BACKDROPNUMBER": "pano de fundo#", "SENSING_OF_BACKDROPNAME": "nome do pano de fundo", "SENSING_OF_STAGE": "Palco", "SENSING_CURRENT": "atual %1", "SENSING_CURRENT_YEAR": "ano", "SENSING_CURRENT_MONTH": "mês", "SENSING_CURRENT_DATE": "data", "SENSING_CURRENT_DAYOFWEEK": "dia da semana", "SENSING_CURRENT_HOUR": "hora", "SENSING_CURRENT_MINUTE": "minuto", "SENSING_CURRENT_SECOND": "segundo", "SENSING_DAYSSINCE2000": "dias desde 2000", "SENSING_USERNAME": "nome de usuário", "SENSING_USERID": "id do usuário", "SOUND_PLAY": "iniciar o som%1", "SOUND_PLAYUNTILDONE": "tocar o som %1 até que esteja completo/pronto", "SOUND_STOPALLSOUNDS": "parar todos os sons", "SOUND_SETEFFECTO": "definir %1 efeito para %2", "SOUND_CHANGEEFFECTBY": "mudar efeito %1 por %2", "SOUND_CLEAREFFECTS": "limpar os efeitos de som ", "SOUND_EFFECTS_PITCH": "passo", "SOUND_EFFECTS_PAN": "balanço esquerda/direita", "SOUND_CHANGEVOLUMEBY": "mudar o volume por %1", "SOUND_SETVOLUMETO": "fixar o volume para %1%", "SOUND_VOLUME": "volume", "CATEGORY_MOTION": "Movimento", "CATEGORY_LOOKS": "Aparência", "CATEGORY_SOUND": "Som", "CATEGORY_EVENTS": "Eventos", "CATEGORY_CONTROL": "Controle", "CATEGORY_SENSING": "Sensores", "CATEGORY_OPERATORS": "Operadores", "CATEGORY_VARIABLES": "Variáveis", "CATEGORY_MYBLOCKS": "Meus Blocos", "DUPLICATE": "Duplicar", "DELETE": "Apagar", "ADD_COMMENT": "Comentar", "REMOVE_COMMENT": "Remover Comentário", "DELETE_BLOCK": "Deletar Bloco", "DELETE_X_BLOCKS": "Deletar %1 Blocos", "DELETE_ALL_BLOCKS": "Deletar todos %1 blocos?", "CLEAN_UP": "Limpar Blocos", "HELP": "Ajuda", "UNDO": "Desfazer", "REDO": "Refazer", "EDIT_PROCEDURE": "Editar", "SHOW_PROCEDURE_DEFINITION": "Vá para definição", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Diga algo...", "COLOUR_HUE_LABEL": "cor", "COLOUR_SATURATION_LABEL": "saturação", "COLOUR_BRIGHTNESS_LABEL": "Brilho", "CHANGE_VALUE_TITLE": "Mudar valor:", "RENAME_VARIABLE": "Renomear variável", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Renomear variável", "NEW_VARIABLE": "Criar uma Variável", "NEW_VARIABLE_TITLE": "Novo nome para variável:", "VARIABLE_MODAL_TITLE": "Nova Variável", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Criar um bloco", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Criar uma lista", "NEW_LIST_TITLE": "Novo nome de lista:", "LIST_MODAL_TITLE": "Nova Lista", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Renomear Lista", "NEW_BROADCAST_MESSAGE": "Nova mensagem", "NEW_BROADCAST_MESSAGE_TITLE": "Novo nome de mensagem:", "BROADCAST_MODAL_TITLE": "Nova Mensagem", "DEFAULT_BROADCAST_MESSAGE_NAME": "mensagem 1" }; Blockly.ScratchMsgs.locales["pt"] = { "CONTROL_FOREVER": "repete para sempre", "CONTROL_REPEAT": "repete %1 vezes", "CONTROL_IF": "se %1 , então", "CONTROL_ELSE": "senão,", "CONTROL_STOP": "pára", "CONTROL_STOP_ALL": "tudo", "CONTROL_STOP_THIS": "este guião", "CONTROL_STOP_OTHER": "os teus outros guiões", "CONTROL_WAIT": "espera %1 s", "CONTROL_WAITUNTIL": "espera até que %1", "CONTROL_REPEATUNTIL": "até que %1 , repete", "CONTROL_WHILE": "enquanto %1", "CONTROL_FOREACH": "para cada %1 em %2", "CONTROL_STARTASCLONE": "Quando fores criado como um clone", "CONTROL_CREATECLONEOF": "cria um clone de %1", "CONTROL_CREATECLONEOF_MYSELF": "ti mesmo", "CONTROL_DELETETHISCLONE": "remove-te como clone", "CONTROL_COUNTER": "contador", "CONTROL_INCRCOUNTER": "incrementa o contador", "CONTROL_CLEARCOUNTER": "põe o contador a zero", "CONTROL_ALLATONCE": "executa tudo de uma vez", "DATA_SETVARIABLETO": "altera %1 para %2", "DATA_CHANGEVARIABLEBY": "adiciona a %1 o valor %2", "DATA_SHOWVARIABLE": "mostra a variável %1", "DATA_HIDEVARIABLE": "esconde a variável %1", "DATA_ADDTOLIST": "acrescenta %1 a %2", "DATA_DELETEOFLIST": "remove %1 de %2", "DATA_INSERTATLIST": "insere %1 como %2 de %3", "DATA_REPLACEITEMOFLIST": "substitui %1 de %2 por %3", "DATA_ITEMOFLIST": "%1 de %2", "DATA_LENGTHOFLIST": "o comprimento de %1", "DATA_LISTCONTAINSITEM": "%1 contém %2", "DATA_SHOWLIST": "mostra a lista %1", "DATA_HIDELIST": "esconde a lista %1", "DATA_INDEX_ALL": "tudo", "DATA_INDEX_LAST": "o último item", "DATA_INDEX_RANDOM": "um item ao acaso", "EVENT_WHENFLAGCLICKED": "Quando alguém clicar em %1", "EVENT_WHENTHISSPRITECLICKED": "Quando alguém clicar em ti", "EVENT_WHENSTAGECLICKED": "Quando alguém clicar no palco", "EVENT_WHENTOUCHINGOBJECT": "Quando tocares em %1", "EVENT_WHENBROADCASTRECEIVED": "Quando receberes a mensagem %1", "EVENT_WHENBACKDROPSWITCHESTO": "Quando o cenário mudar para %1", "EVENT_WHENGREATERTHAN": "Quando o valor do sensor %1 exceder %2", "EVENT_WHENGREATERTHAN_TIMER": "o valor do cronómetro", "EVENT_BROADCAST": "difunde a mensagem %1", "EVENT_BROADCASTANDWAIT": "difunde a mensagem %1 e espera", "EVENT_WHENKEYPRESSED": "Quando alguém pressionar a tecla %1", "EVENT_WHENKEYPRESSED_SPACE": "espaço", "EVENT_WHENKEYPRESSED_LEFT": "seta para a esquerda", "EVENT_WHENKEYPRESSED_RIGHT": "seta para a direita", "EVENT_WHENKEYPRESSED_DOWN": "seta para baixo", "EVENT_WHENKEYPRESSED_UP": "seta para cima", "EVENT_WHENKEYPRESSED_ANY": "qualquer", "LOOKS_SAYFORSECS": "diz %1 durante %2 s", "LOOKS_SAY": "diz %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "pensa %1 durante %2 s", "LOOKS_THINK": "pensa %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "mostra-te", "LOOKS_HIDE": "esconde-te", "LOOKS_HIDEALLSPRITES": "esconde todos os actores", "LOOKS_EFFECT_COLOR": "cor", "LOOKS_EFFECT_FISHEYE": "olho de peixe", "LOOKS_EFFECT_WHIRL": "remoinho", "LOOKS_EFFECT_PIXELATE": "pixelização", "LOOKS_EFFECT_MOSAIC": "mosaico", "LOOKS_EFFECT_BRIGHTNESS": "brilho", "LOOKS_EFFECT_GHOST": "fantasma", "LOOKS_CHANGEEFFECTBY": "adiciona ao teu efeito %1 o valor %2", "LOOKS_SETEFFECTTO": "altera o teu efeito %1 para %2", "LOOKS_CLEARGRAPHICEFFECTS": "cancela os teus efeitos gráficos", "LOOKS_CHANGESIZEBY": "adiciona %1 ao teu tamanho", "LOOKS_SETSIZETO": "altera o teu tamanho para %1 %", "LOOKS_SIZE": "o tamanho", "LOOKS_CHANGESTRETCHBY": "adiciona %1 % ao esticamento", "LOOKS_SETSTRETCHTO": "altera o esticamento para %1 %", "LOOKS_SWITCHCOSTUMETO": "muda o teu traje para %1", "LOOKS_NEXTCOSTUME": "passa para o teu próximo traje", "LOOKS_SWITCHBACKDROPTO": "muda o cenário para %1", "LOOKS_GOTOFRONTBACK": "vai para a camada %1", "LOOKS_GOTOFRONTBACK_FRONT": "frontal", "LOOKS_GOTOFRONTBACK_BACK": "traseira", "LOOKS_GOFORWARDBACKWARDLAYERS": "%1 %2 camadas", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "avança", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "recua", "LOOKS_BACKDROPNUMBERNAME": "%1 do cenário", "LOOKS_COSTUMENUMBERNAME": "%1 to traje", "LOOKS_NUMBERNAME_NUMBER": "o número", "LOOKS_NUMBERNAME_NAME": "o nome", "LOOKS_SWITCHBACKDROPTOANDWAIT": "muda o cenário para %1 e espera", "LOOKS_NEXTBACKDROP": "passa para o teu próximo cenário", "LOOKS_PREVIOUSBACKDROP": "o cenário anterior", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "anda %1 passos", "MOTION_TURNLEFT": "gira %1 %2 °", "MOTION_TURNRIGHT": "gira %1 %2 °", "MOTION_POINTINDIRECTION": "altera a tua direcção para %1 °", "MOTION_POINTTOWARDS": "aponta em direcção a %1", "MOTION_POINTTOWARDS_POINTER": "ponteiro do rato", "MOTION_GOTO": "vai para %1", "MOTION_GOTO_POINTER": "o ponteiro do rato", "MOTION_GOTO_RANDOM": "uma posição ao acaso", "MOTION_GOTOXY": "vai para as coordenadas (x:%1 , y:%2 )", "MOTION_GLIDESECSTOXY": "desliza em %1 s para as coordenadas (x:%2 , y:%3 )", "MOTION_GLIDETO": "desliza em %1 s em direcção a%2", "MOTION_GLIDETO_POINTER": "o ponteiro do rato", "MOTION_GLIDETO_RANDOM": "uma posição ao acaso", "MOTION_CHANGEXBY": "adiciona %1 à tua coordenada x", "MOTION_SETX": "altera a tua coordenada x para %1", "MOTION_CHANGEYBY": "adiciona %1 à tua coordenada y", "MOTION_SETY": "altera a tua coordenada y para %1", "MOTION_IFONEDGEBOUNCE": "se estiveres a bater na borda, ressalta", "MOTION_SETROTATIONSTYLE": "altera o teu estilo de rotação para %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "olha apenas para a esquerda e para a direita", "MOTION_SETROTATIONSTYLE_DONTROTATE": "não gires", "MOTION_SETROTATIONSTYLE_ALLAROUND": "gira a toda a volta", "MOTION_XPOSITION": "a coordenada x da posição", "MOTION_YPOSITION": "a coordenada y da posição", "MOTION_DIRECTION": "a direcção", "MOTION_SCROLLRIGHT": "rola %1 para a direita", "MOTION_SCROLLUP": "rola %1 para cima", "MOTION_ALIGNSCENE": "alinha a cena %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "ao fundo e à esquerda", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "ao fundo e à direita", "MOTION_ALIGNSCENE_MIDDLE": "a meio", "MOTION_ALIGNSCENE_TOPLEFT": "no topo e à esquerda", "MOTION_ALIGNSCENE_TOPRIGHT": "no topo e à direita", "MOTION_XSCROLL": "o rolamento em x", "MOTION_YSCROLL": "o rolamento em y", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 − %2", "OPERATORS_MULTIPLY": "%1 × %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "um valor ao acaso entre %1 e %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 e %2", "OPERATORS_OR": "%1 ou %2", "OPERATORS_NOT": "é falso que %1", "OPERATORS_JOIN": "a junção de %1 com %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "o caractere %1 de %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "o comprimento de %1", "OPERATORS_CONTAINS": "%1 contém %2", "OPERATORS_MOD": "o resto de %1 a dividir por %2", "OPERATORS_ROUND": "o arredondamento de %1", "OPERATORS_MATHOP": "%1 de %2", "OPERATORS_MATHOP_ABS": "o valor absoluto", "OPERATORS_MATHOP_FLOOR": "o chão (o maior inteiro não superior)", "OPERATORS_MATHOP_CEILING": "o tecto (menor inteiro não inferior)", "OPERATORS_MATHOP_SQRT": "a raiz quadrada", "OPERATORS_MATHOP_SIN": "o seno", "OPERATORS_MATHOP_COS": "o cosseno", "OPERATORS_MATHOP_TAN": "a tangente", "OPERATORS_MATHOP_ASIN": "o arco-seno", "OPERATORS_MATHOP_ACOS": "o arco-cosseno", "OPERATORS_MATHOP_ATAN": "o arco-tangente", "OPERATORS_MATHOP_LN": "o logaritmo natural", "OPERATORS_MATHOP_LOG": "o logaritmo", "OPERATORS_MATHOP_EEXP": "a exponencial", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "define %1", "SENSING_TOUCHINGOBJECT": "estás a tocar em %1", "SENSING_TOUCHINGOBJECT_POINTER": "o ponteiro do rato", "SENSING_TOUCHINGOBJECT_EDGE": "a borda", "SENSING_TOUCHINGCOLOR": "estás a tocar na cor %1", "SENSING_COLORISTOUCHINGCOLOR": "a cor %1 está a tocar na cor %2", "SENSING_DISTANCETO": "a distância até %1", "SENSING_DISTANCETO_POINTER": "o ponteiro do rato", "SENSING_ASKANDWAIT": "pergunta %1 e espera pela resposta", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "a resposta", "SENSING_KEYPRESSED": "a tecla %1 está a ser pressionada", "SENSING_MOUSEDOWN": "o botão do rato está pressionado", "SENSING_MOUSEX": "a coordenada x do rato", "SENSING_MOUSEY": "a coordenada y do rato", "SENSING_SETDRAGMODE": "altera o modo de arrasto para %1", "SENSING_SETDRAGMODE_DRAGGABLE": "arrastável", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "não arrastável", "SENSING_LOUDNESS": "o volume", "SENSING_LOUD": "o som é forte", "SENSING_TIMER": "o valor do cronómetro", "SENSING_RESETTIMER": "reinicia o cronómetro", "SENSING_OF": "%1 de %2", "SENSING_OF_XPOSITION": "a coordenada x da posição", "SENSING_OF_YPOSITION": "a coordenada y da posição", "SENSING_OF_DIRECTION": "a direcção", "SENSING_OF_COSTUMENUMBER": "o número do traje", "SENSING_OF_COSTUMENAME": "o nome do traje", "SENSING_OF_SIZE": "o tamanho", "SENSING_OF_VOLUME": "o volume", "SENSING_OF_BACKDROPNUMBER": "o número do cenário", "SENSING_OF_BACKDROPNAME": "o nome do cenário", "SENSING_OF_STAGE": "Palco", "SENSING_CURRENT": "%1 actual", "SENSING_CURRENT_YEAR": "o ano", "SENSING_CURRENT_MONTH": "o mês", "SENSING_CURRENT_DATE": "a data", "SENSING_CURRENT_DAYOFWEEK": "o dia da semana", "SENSING_CURRENT_HOUR": "a hora", "SENSING_CURRENT_MINUTE": "o minuto", "SENSING_CURRENT_SECOND": "o segundo", "SENSING_DAYSSINCE2000": "o número de dias desde 2000", "SENSING_USERNAME": "o nome de utilizador", "SENSING_USERID": "o ID de utilizador", "SOUND_PLAY": "toca o som %1", "SOUND_PLAYUNTILDONE": "toca o som %1 até terminar", "SOUND_STOPALLSOUNDS": "pára todos os sons", "SOUND_SETEFFECTO": "altera o teu efeito %1 para %2", "SOUND_CHANGEEFFECTBY": "adiciona ao teu efeito %1 o valor %2", "SOUND_CLEAREFFECTS": "cancela todos os teus efeitos sonoros", "SOUND_EFFECTS_PITCH": "tom", "SOUND_EFFECTS_PAN": "canal esquerdo/direito", "SOUND_CHANGEVOLUMEBY": "adiciona %1 % ao teu volume", "SOUND_SETVOLUMETO": "altera o teu volume para %1%", "SOUND_VOLUME": "o volume", "CATEGORY_MOTION": "Movimento", "CATEGORY_LOOKS": "Aparência", "CATEGORY_SOUND": "Som", "CATEGORY_EVENTS": "Eventos", "CATEGORY_CONTROL": "Controlo", "CATEGORY_SENSING": "Sensores", "CATEGORY_OPERATORS": "Operadores", "CATEGORY_VARIABLES": "Variáveis", "CATEGORY_MYBLOCKS": "Os Meus Blocos", "DUPLICATE": "Duplicar", "DELETE": "Remover", "ADD_COMMENT": "Adicionar Comentário", "REMOVE_COMMENT": "Remover Comentário", "DELETE_BLOCK": "Remover Bloco", "DELETE_X_BLOCKS": "Remover %1 Blocos", "DELETE_ALL_BLOCKS": "Remover todos os %1 blocos?", "CLEAN_UP": "Arrumar Blocos", "HELP": "Ajuda", "UNDO": "Desfazer", "REDO": "Refazer", "EDIT_PROCEDURE": "Editar", "SHOW_PROCEDURE_DEFINITION": "Ir para a definição", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Diga qualquer coisa…", "COLOUR_HUE_LABEL": "Matiz", "COLOUR_SATURATION_LABEL": "Saturação", "COLOUR_BRIGHTNESS_LABEL": "Brilho", "CHANGE_VALUE_TITLE": "Alterar o valor:", "RENAME_VARIABLE": "Renomear variável", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Renomear Variável", "NEW_VARIABLE": "Criar uma Variável", "NEW_VARIABLE_TITLE": "Novo nome da variável:", "VARIABLE_MODAL_TITLE": "Nova Variável", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Criar um Bloco", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Criar uma Lista", "NEW_LIST_TITLE": "Nome da nova lista:", "LIST_MODAL_TITLE": "Nova Lista", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Renomear Lista", "NEW_BROADCAST_MESSAGE": "Nova mensagem", "NEW_BROADCAST_MESSAGE_TITLE": "Nome da nova mensagem:", "BROADCAST_MODAL_TITLE": "Nova Mensagem", "DEFAULT_BROADCAST_MESSAGE_NAME": "a mensagem 1" }; Blockly.ScratchMsgs.locales["sl"] = { "CONTROL_FOREVER": "ponavljaj", "CONTROL_REPEAT": "ponovi %1", "CONTROL_IF": "če %1 potem", "CONTROL_ELSE": "sicer", "CONTROL_STOP": "ustavi", "CONTROL_STOP_ALL": "vse", "CONTROL_STOP_THIS": "te ukaze", "CONTROL_STOP_OTHER": "ostale ukaze za to figuro", "CONTROL_WAIT": "počakaj %1 sekund", "CONTROL_WAITUNTIL": "počakaj dokler %1", "CONTROL_REPEATUNTIL": "ponavljaj, dokler ne bo %1", "CONTROL_WHILE": "dokler %1", "CONTROL_FOREACH": "za vsak %1 v %2", "CONTROL_STARTASCLONE": "ko začnem kot klon", "CONTROL_CREATECLONEOF": "ustvari klon %1", "CONTROL_CREATECLONEOF_MYSELF": "sebe", "CONTROL_DELETETHISCLONE": "zbriši ta klon", "CONTROL_COUNTER": "števec", "CONTROL_INCRCOUNTER": "povečaj števec", "CONTROL_CLEARCOUNTER": "počisti števec", "CONTROL_ALLATONCE": "vse hkrati", "DATA_SETVARIABLETO": "nastavi %1 na %2", "DATA_CHANGEVARIABLEBY": "spremeni %1 za %2", "DATA_SHOWVARIABLE": "pokaži spremenljivko %1", "DATA_HIDEVARIABLE": "skrij spremenljivko %1", "DATA_ADDTOLIST": "dodaj %1 k %2", "DATA_DELETEOFLIST": "zbriši %1 v %2", "DATA_INSERTATLIST": "vstavi %1 na %2 v %3", "DATA_REPLACEITEMOFLIST": "zamenjaj %1 v %2 z %3", "DATA_ITEMOFLIST": "element %1 v %2", "DATA_LENGTHOFLIST": "dolžina %1", "DATA_LISTCONTAINSITEM": "Ali %1 vsebuje %2?", "DATA_SHOWLIST": "pokaži seznam %1", "DATA_HIDELIST": "skrij seznam %1", "DATA_INDEX_ALL": "vse", "DATA_INDEX_LAST": "zadnji", "DATA_INDEX_RANDOM": "naključno", "EVENT_WHENFLAGCLICKED": "ko kliknemo na %1", "EVENT_WHENTHISSPRITECLICKED": "ko kliknemo to figuro", "EVENT_WHENSTAGECLICKED": "ko kliknemo na oder", "EVENT_WHENTOUCHINGOBJECT": "ko se ta figura dotika %1", "EVENT_WHENBROADCASTRECEIVED": "ko prejmem %1", "EVENT_WHENBACKDROPSWITCHESTO": "ko se ozadje zamenja na %1", "EVENT_WHENGREATERTHAN": "ko je %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "štoparica", "EVENT_BROADCAST": "objavi %1", "EVENT_BROADCASTANDWAIT": "objavi %1 in čakaj", "EVENT_WHENKEYPRESSED": "ko je pritisnjena tipka %1 ", "EVENT_WHENKEYPRESSED_SPACE": "presledek", "EVENT_WHENKEYPRESSED_LEFT": "puščica levo", "EVENT_WHENKEYPRESSED_RIGHT": "puščica desno", "EVENT_WHENKEYPRESSED_DOWN": "puščica dol", "EVENT_WHENKEYPRESSED_UP": "puščica gor", "EVENT_WHENKEYPRESSED_ANY": "poljubna", "LOOKS_SAYFORSECS": "reci %1 za %2 sekund", "LOOKS_SAY": "reci %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "pomisli %1 za %2 sekund", "LOOKS_THINK": "pomisli %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "pokaži", "LOOKS_HIDE": "skrij", "LOOKS_HIDEALLSPRITES": "skrij vse figure", "LOOKS_EFFECT_COLOR": "barva", "LOOKS_EFFECT_FISHEYE": "ribje oko", "LOOKS_EFFECT_WHIRL": "vrtinec", "LOOKS_EFFECT_PIXELATE": "pikčasto", "LOOKS_EFFECT_MOSAIC": "mozaik", "LOOKS_EFFECT_BRIGHTNESS": "svetlost", "LOOKS_EFFECT_GHOST": "duh", "LOOKS_CHANGEEFFECTBY": "spremeni učinek %1 za %2", "LOOKS_SETEFFECTTO": "nastavi učinek %1 na %2", "LOOKS_CLEARGRAPHICEFFECTS": "odstrani slikovne učinke", "LOOKS_CHANGESIZEBY": "spremeni velikost za %1", "LOOKS_SETSIZETO": "nastavi velikost na %1 %", "LOOKS_SIZE": "velikost", "LOOKS_CHANGESTRETCHBY": "spremeni razteg za %1", "LOOKS_SETSTRETCHTO": "nastavi razteg na %1 %", "LOOKS_SWITCHCOSTUMETO": "zamenjaj videz na %1", "LOOKS_NEXTCOSTUME": "naslednji videz", "LOOKS_SWITCHBACKDROPTO": "zamenjaj ozadje na %1", "LOOKS_GOTOFRONTBACK": "pojdi na %1 plast", "LOOKS_GOTOFRONTBACK_FRONT": "spredaj", "LOOKS_GOTOFRONTBACK_BACK": "zadaj", "LOOKS_GOFORWARDBACKWARDLAYERS": "pojdi %1 %2 plasti", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "naprej", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "nazaj", "LOOKS_BACKDROPNUMBERNAME": "ozadje %1", "LOOKS_COSTUMENUMBERNAME": "videz %1", "LOOKS_NUMBERNAME_NUMBER": "število", "LOOKS_NUMBERNAME_NAME": "ime", "LOOKS_SWITCHBACKDROPTOANDWAIT": "zamenjaj ozadje na %1 in počakaj", "LOOKS_NEXTBACKDROP": "naslednje ozadje", "LOOKS_PREVIOUSBACKDROP": "prejšnje ozadje", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "pojdi %1 korakov", "MOTION_TURNLEFT": "obrni se za %1 %2 stopinj", "MOTION_TURNRIGHT": "obrni se za %1 %2 stopinj", "MOTION_POINTINDIRECTION": "obrni se v smer %1", "MOTION_POINTTOWARDS": "obrni se proti %1", "MOTION_POINTTOWARDS_POINTER": "kazalcu miške", "MOTION_GOTO": "pojdi na %1", "MOTION_GOTO_POINTER": "kazalcu miške", "MOTION_GOTO_RANDOM": "naključnemu mestu", "MOTION_GOTOXY": "pojdi na x: %1 y: %2", "MOTION_GLIDESECSTOXY": "drsi %1 sekund do x: %2 y: %3", "MOTION_GLIDETO": "drsi %1 sekund do %2", "MOTION_GLIDETO_POINTER": "kazalca miške", "MOTION_GLIDETO_RANDOM": "naključnega mesta", "MOTION_CHANGEXBY": "spremeni x za %1", "MOTION_SETX": "nastavi x na %1", "MOTION_CHANGEYBY": "spremeni y za %1", "MOTION_SETY": "nastavi y na %1", "MOTION_IFONEDGEBOUNCE": "odbij se, če si na robu", "MOTION_SETROTATIONSTYLE": "nastavi način vrtenja %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "levo-desno", "MOTION_SETROTATIONSTYLE_DONTROTATE": "ne zasukaj", "MOTION_SETROTATIONSTYLE_ALLAROUND": "na vse strani", "MOTION_XPOSITION": "položaj x", "MOTION_YPOSITION": "položaj y", "MOTION_DIRECTION": "smer", "MOTION_SCROLLRIGHT": "premik desno %1", "MOTION_SCROLLUP": "premik gor%1", "MOTION_ALIGNSCENE": "poravnaj sceno %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "levo spodaj", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "desno spodaj", "MOTION_ALIGNSCENE_MIDDLE": "sredina", "MOTION_ALIGNSCENE_TOPLEFT": "levo zgoraj", "MOTION_ALIGNSCENE_TOPRIGHT": "desno zgoraj", "MOTION_XSCROLL": "premik v smeri x", "MOTION_YSCROLL": "premik v smeri y", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "naključno število med %1 in %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 in %2", "OPERATORS_OR": "%1 ali %2", "OPERATORS_NOT": "ne %1", "OPERATORS_JOIN": "združi %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "%1 črka v %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "dolžina %1", "OPERATORS_CONTAINS": "ali %1 vsebuje %2?", "OPERATORS_MOD": "%1 mod %2", "OPERATORS_ROUND": "zaokroži %1", "OPERATORS_MATHOP": "%1 od %2", "OPERATORS_MATHOP_ABS": "absolutna vrednost", "OPERATORS_MATHOP_FLOOR": "zaokroži navzdol", "OPERATORS_MATHOP_CEILING": "zaokroži navzgor", "OPERATORS_MATHOP_SQRT": "kvadratni koren ", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tg", "OPERATORS_MATHOP_ASIN": "arcsin", "OPERATORS_MATHOP_ACOS": "arccos", "OPERATORS_MATHOP_ATAN": "arctg", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "definiraj %1", "SENSING_TOUCHINGOBJECT": "se dotika %1?", "SENSING_TOUCHINGOBJECT_POINTER": "kazalca miške", "SENSING_TOUCHINGOBJECT_EDGE": "roba", "SENSING_TOUCHINGCOLOR": "se dotika barve %1?", "SENSING_COLORISTOUCHINGCOLOR": "se barva %1 dotika %2?", "SENSING_DISTANCETO": "razdalja do %1", "SENSING_DISTANCETO_POINTER": "kazalca miške", "SENSING_ASKANDWAIT": "vprašaj %1 in počakaj", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "odgovor", "SENSING_KEYPRESSED": "je pritisnjena tipka %1?", "SENSING_MOUSEDOWN": "je miška kliknjena?", "SENSING_MOUSEX": "miška x", "SENSING_MOUSEY": "miška y", "SENSING_SETDRAGMODE": "nastavi način drsenja %1 ", "SENSING_SETDRAGMODE_DRAGGABLE": "drseče", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "ne drseče", "SENSING_LOUDNESS": "glasnost", "SENSING_LOUD": "glasno?", "SENSING_TIMER": "štoparica", "SENSING_RESETTIMER": "ponastavi štoparico", "SENSING_OF": "%1 od %2", "SENSING_OF_XPOSITION": "položaj x", "SENSING_OF_YPOSITION": "položaj y", "SENSING_OF_DIRECTION": "smer", "SENSING_OF_COSTUMENUMBER": "videz #", "SENSING_OF_COSTUMENAME": "ime videza", "SENSING_OF_SIZE": "velikost", "SENSING_OF_VOLUME": "glasnost", "SENSING_OF_BACKDROPNUMBER": "ozadje #", "SENSING_OF_BACKDROPNAME": "ime ozadja", "SENSING_OF_STAGE": "Oder", "SENSING_CURRENT": "trenutni %1", "SENSING_CURRENT_YEAR": "leto", "SENSING_CURRENT_MONTH": "mesec", "SENSING_CURRENT_DATE": "datum", "SENSING_CURRENT_DAYOFWEEK": "dan v tednu", "SENSING_CURRENT_HOUR": "ura", "SENSING_CURRENT_MINUTE": "minuta", "SENSING_CURRENT_SECOND": "sekunda", "SENSING_DAYSSINCE2000": "dni od leta 2000", "SENSING_USERNAME": "uporabniško ime", "SENSING_USERID": "uporabnikova številka", "SOUND_PLAY": "predvajaj zvok %1", "SOUND_PLAYUNTILDONE": "predvajaj zvok %1 do konca", "SOUND_STOPALLSOUNDS": "ustavi vse zvoke", "SOUND_SETEFFECTO": "nastavi učinek %1 na %2", "SOUND_CHANGEEFFECTBY": "spremeni učinek %1 za %2", "SOUND_CLEAREFFECTS": "izbriši zvočne učinke", "SOUND_EFFECTS_PITCH": "višina tona", "SOUND_EFFECTS_PAN": "premik levo/desno", "SOUND_CHANGEVOLUMEBY": "spremeni glasnost za %1", "SOUND_SETVOLUMETO": "nastavi glasnost na %1", "SOUND_VOLUME": "glasnost", "CATEGORY_MOTION": "Gibanje", "CATEGORY_LOOKS": "Videzi", "CATEGORY_SOUND": "Zvok", "CATEGORY_EVENTS": "Dogodki", "CATEGORY_CONTROL": "Krmiljenje", "CATEGORY_SENSING": "Zaznavanje", "CATEGORY_OPERATORS": "Operatorji", "CATEGORY_VARIABLES": "Spremenljivke", "CATEGORY_MYBLOCKS": "Moji bloki", "DUPLICATE": "Podvoji", "DELETE": "Izbriši", "ADD_COMMENT": "Dodaj komentar", "REMOVE_COMMENT": "Odstrani komentar", "DELETE_BLOCK": "Izbriši blok", "DELETE_X_BLOCKS": "Izbriši %1 blokov", "DELETE_ALL_BLOCKS": "Izbrisati vseh %1 blokov?", "CLEAN_UP": "Počisti bloke", "HELP": "Pomoč", "UNDO": "Razveljavi", "REDO": "Uveljavi", "EDIT_PROCEDURE": "Uredi", "SHOW_PROCEDURE_DEFINITION": "Pojdi na definicijo", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Reci kaj ...", "COLOUR_HUE_LABEL": "Barva", "COLOUR_SATURATION_LABEL": "Nasičenost", "COLOUR_BRIGHTNESS_LABEL": "Svetlost", "CHANGE_VALUE_TITLE": "Spremeni vrednost: ", "RENAME_VARIABLE": "Preimenuj spremenljivko", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Preimenuj spremenljivko", "NEW_VARIABLE": "Ustvari spremenljivko", "NEW_VARIABLE_TITLE": "Novo ime spremenljivke:", "VARIABLE_MODAL_TITLE": "Nova spremenljivka", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Ustvari blok", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Ustvari seznam", "NEW_LIST_TITLE": "Novi ime seznama:", "LIST_MODAL_TITLE": "Nov seznam", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Preimenuj seznam", "NEW_BROADCAST_MESSAGE": "Novo sporočilo", "NEW_BROADCAST_MESSAGE_TITLE": "Ime novega sporočila:", "BROADCAST_MODAL_TITLE": "Novo sporočilo", "DEFAULT_BROADCAST_MESSAGE_NAME": "sporočilo1" }; Blockly.ScratchMsgs.locales["sr"] = { "CONTROL_FOREVER": "понављај заувек", "CONTROL_REPEAT": "понови %1", "CONTROL_IF": "ако је %1 онда", "CONTROL_ELSE": "у супротном", "CONTROL_STOP": "заустави", "CONTROL_STOP_ALL": "све", "CONTROL_STOP_THIS": "овај програм", "CONTROL_STOP_OTHER": "друге програме лика", "CONTROL_WAIT": "чекај %1 секунду", "CONTROL_WAITUNTIL": "чекај док не %1", "CONTROL_REPEATUNTIL": "понављај док не %1", "CONTROL_WHILE": "док је %1", "CONTROL_FOREACH": "за сваки %1 у %2", "CONTROL_STARTASCLONE": "када се појавим као умножак", "CONTROL_CREATECLONEOF": "направи умножак од %1", "CONTROL_CREATECLONEOF_MYSELF": "мене", "CONTROL_DELETETHISCLONE": "обриши овај умножак", "CONTROL_COUNTER": "бројач", "CONTROL_INCRCOUNTER": "увећај бројач", "CONTROL_CLEARCOUNTER": "обриши бројач", "CONTROL_ALLATONCE": "све одједном", "DATA_SETVARIABLETO": "нека %1 буде %2", "DATA_CHANGEVARIABLEBY": "промени %1 за %2", "DATA_SHOWVARIABLE": "прикажи променљиву %1", "DATA_HIDEVARIABLE": "сакриј променљиву %1", "DATA_ADDTOLIST": "додај %1 у %2", "DATA_DELETEOFLIST": "обриши %1 из %2", "DATA_INSERTATLIST": "убаци %1 на %2 у %3", "DATA_REPLACEITEMOFLIST": "замени елемент %1 у %2 са %3", "DATA_ITEMOFLIST": "елемент %1 из %2", "DATA_LENGTHOFLIST": "дужина %1", "DATA_LISTCONTAINSITEM": "да ли %1 садржи %2?", "DATA_SHOWLIST": "прикажи листу %1", "DATA_HIDELIST": "сакриј листу %1", "DATA_INDEX_ALL": "све", "DATA_INDEX_LAST": "последњи", "DATA_INDEX_RANDOM": "насумичан", "EVENT_WHENFLAGCLICKED": "када је кликнуто на %1", "EVENT_WHENTHISSPRITECLICKED": "када је кликнуто на овај лик", "EVENT_WHENSTAGECLICKED": "када је кликнуто на позорницу", "EVENT_WHENTOUCHINGOBJECT": "када овај лик додирне %1", "EVENT_WHENBROADCASTRECEIVED": "када примим %1", "EVENT_WHENBACKDROPSWITCHESTO": "када се позадина промени у %1", "EVENT_WHENGREATERTHAN": "када је %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "тајмер", "EVENT_BROADCAST": "разгласи %1", "EVENT_BROADCASTANDWAIT": "разгласи %1 и чекај", "EVENT_WHENKEYPRESSED": "када је дирка %1 притиснута", "EVENT_WHENKEYPRESSED_SPACE": "размак", "EVENT_WHENKEYPRESSED_LEFT": "стрелица лево", "EVENT_WHENKEYPRESSED_RIGHT": "стрелица десно", "EVENT_WHENKEYPRESSED_DOWN": "стрелица доле", "EVENT_WHENKEYPRESSED_UP": "стрелица горе", "EVENT_WHENKEYPRESSED_ANY": "било који", "LOOKS_SAYFORSECS": "изговори %1 током %2 секунде", "LOOKS_SAY": "изговори %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "замисли %1 током %2 секунде", "LOOKS_THINK": "замисли %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "прикажи", "LOOKS_HIDE": "сакриј", "LOOKS_HIDEALLSPRITES": "сакриј све ликове", "LOOKS_EFFECT_COLOR": "боја", "LOOKS_EFFECT_FISHEYE": "рибље око", "LOOKS_EFFECT_WHIRL": "вртлог", "LOOKS_EFFECT_PIXELATE": "позрнати", "LOOKS_EFFECT_MOSAIC": "мозаик", "LOOKS_EFFECT_BRIGHTNESS": "осветљеност", "LOOKS_EFFECT_GHOST": "дух", "LOOKS_CHANGEEFFECTBY": "промени ефекат %1 за %2", "LOOKS_SETEFFECTTO": "нека ефекат %1 буде %2", "LOOKS_CLEARGRAPHICEFFECTS": "уклони графичке ефекте", "LOOKS_CHANGESIZEBY": "промени величину за %1", "LOOKS_SETSIZETO": "нека величина буде %1 %", "LOOKS_SIZE": "величина", "LOOKS_CHANGESTRETCHBY": "промени увећање за %1", "LOOKS_SETSTRETCHTO": "нека увећање буде %1 %", "LOOKS_SWITCHCOSTUMETO": "замени костим са %1", "LOOKS_NEXTCOSTUME": "следећи костим", "LOOKS_SWITCHBACKDROPTO": "промени позадину у %1", "LOOKS_GOTOFRONTBACK": "иди на %1 слој", "LOOKS_GOTOFRONTBACK_FRONT": "напред", "LOOKS_GOTOFRONTBACK_BACK": "назад", "LOOKS_GOFORWARDBACKWARDLAYERS": "иди %1 %2 слоја", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "проследи", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "уназад", "LOOKS_BACKDROPNUMBERNAME": "позадина %1", "LOOKS_COSTUMENUMBERNAME": "костим %1", "LOOKS_NUMBERNAME_NUMBER": "број", "LOOKS_NUMBERNAME_NAME": "име", "LOOKS_SWITCHBACKDROPTOANDWAIT": "промени позадину у %1 и чекај", "LOOKS_NEXTBACKDROP": "следећа позадина", "LOOKS_PREVIOUSBACKDROP": "претходна позадина", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "иди %1 корака", "MOTION_TURNLEFT": "окрет %1 за %2 степени", "MOTION_TURNRIGHT": "окрет %1 за %2 степени", "MOTION_POINTINDIRECTION": "усмери се ка %1", "MOTION_POINTTOWARDS": "усмери се ка %1", "MOTION_POINTTOWARDS_POINTER": "показивач миша", "MOTION_GOTO": "иди до %1", "MOTION_GOTO_POINTER": "показивач миша", "MOTION_GOTO_RANDOM": "случајан положај", "MOTION_GOTOXY": "иди до x: %1 y: %2", "MOTION_GLIDESECSTOXY": "клизи %1 секунди до x: %2 y: %3", "MOTION_GLIDETO": "клизи %1 секунди до %2", "MOTION_GLIDETO_POINTER": "показивач миша", "MOTION_GLIDETO_RANDOM": "случајан положај", "MOTION_CHANGEXBY": "промени x за %1", "MOTION_SETX": "нека x буде %1", "MOTION_CHANGEYBY": "промени y за %1", "MOTION_SETY": "нека y буде %1", "MOTION_IFONEDGEBOUNCE": "ако си на рубу, окрени се", "MOTION_SETROTATIONSTYLE": "подеси начин окретања %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "лево-десно", "MOTION_SETROTATIONSTYLE_DONTROTATE": "без окретања", "MOTION_SETROTATIONSTYLE_ALLAROUND": "на све стране", "MOTION_XPOSITION": "место х", "MOTION_YPOSITION": "место у", "MOTION_DIRECTION": "смер", "MOTION_SCROLLRIGHT": "клизи у десно %1", "MOTION_SCROLLUP": "клизи горе %1", "MOTION_ALIGNSCENE": "поравнај сцену %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "доле-лево", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "доле-десно", "MOTION_ALIGNSCENE_MIDDLE": "средина", "MOTION_ALIGNSCENE_TOPLEFT": "горе-лево", "MOTION_ALIGNSCENE_TOPRIGHT": "горе-десно", "MOTION_XSCROLL": "x клизање", "MOTION_YSCROLL": "y клизање", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "случајан број од %1 до %2 ", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 и %2", "OPERATORS_OR": "%1 или %2", "OPERATORS_NOT": "није %1", "OPERATORS_JOIN": "споји %1 и %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "%1 слово од %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "дужина %1", "OPERATORS_CONTAINS": "%1 садржи %2", "OPERATORS_MOD": "%1 мод %2", "OPERATORS_ROUND": "заокружи %1", "OPERATORS_MATHOP": "%1 од %2", "OPERATORS_MATHOP_ABS": "абс", "OPERATORS_MATHOP_FLOOR": "цео део", "OPERATORS_MATHOP_CEILING": "цео+1", "OPERATORS_MATHOP_SQRT": "корен", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tg", "OPERATORS_MATHOP_ASIN": "arcsin", "OPERATORS_MATHOP_ACOS": "arccos", "OPERATORS_MATHOP_ATAN": "arctan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "дефиниши %1", "SENSING_TOUCHINGOBJECT": "додирује ли %1?", "SENSING_TOUCHINGOBJECT_POINTER": "показивач миша", "SENSING_TOUCHINGOBJECT_EDGE": "ивица", "SENSING_TOUCHINGCOLOR": "додирује ли боју %1?", "SENSING_COLORISTOUCHINGCOLOR": "боја %1 додирује %2?", "SENSING_DISTANCETO": "удаљеност од %1", "SENSING_DISTANCETO_POINTER": "показивач миша", "SENSING_ASKANDWAIT": "питај %1 и чекај", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "одговор", "SENSING_KEYPRESSED": "дугме %1 је притиснуто?", "SENSING_MOUSEDOWN": "миш притиснут?", "SENSING_MOUSEX": "миш x", "SENSING_MOUSEY": "миш y", "SENSING_SETDRAGMODE": "нека начин превлачења буде %1", "SENSING_SETDRAGMODE_DRAGGABLE": "превлачиво", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "није превлачиво", "SENSING_LOUDNESS": "јачина звука", "SENSING_LOUD": "гласно?", "SENSING_TIMER": "тајмер", "SENSING_RESETTIMER": "постави тајмер на 0", "SENSING_OF": "%1 од %2", "SENSING_OF_XPOSITION": "x положај", "SENSING_OF_YPOSITION": "y положај", "SENSING_OF_DIRECTION": "смер", "SENSING_OF_COSTUMENUMBER": "број костима", "SENSING_OF_COSTUMENAME": "име костима", "SENSING_OF_SIZE": "величина", "SENSING_OF_VOLUME": "јачина звука", "SENSING_OF_BACKDROPNUMBER": "број позадине", "SENSING_OF_BACKDROPNAME": "име позадине", "SENSING_OF_STAGE": "Позорница", "SENSING_CURRENT": "тренутно %1", "SENSING_CURRENT_YEAR": "година", "SENSING_CURRENT_MONTH": "месец", "SENSING_CURRENT_DATE": "датум", "SENSING_CURRENT_DAYOFWEEK": "дан у недељи", "SENSING_CURRENT_HOUR": "сат", "SENSING_CURRENT_MINUTE": "минут", "SENSING_CURRENT_SECOND": "секунда", "SENSING_DAYSSINCE2000": "дана после 2000", "SENSING_USERNAME": "корисничко име", "SENSING_USERID": "Корисников ид", "SOUND_PLAY": "покрени звук %1", "SOUND_PLAYUNTILDONE": "репродукуј звук %1 до краја", "SOUND_STOPALLSOUNDS": "заустави све звукове", "SOUND_SETEFFECTO": "нека ефекат %1 буде %2", "SOUND_CHANGEEFFECTBY": "промени ефекат %1 за %2", "SOUND_CLEAREFFECTS": "уклони звучне ефекте", "SOUND_EFFECTS_PITCH": "висина тона", "SOUND_EFFECTS_PAN": "кретање лево/десно", "SOUND_CHANGEVOLUMEBY": "промени јачину звука за %1", "SOUND_SETVOLUMETO": "нека јачина звука буде %1%", "SOUND_VOLUME": "јачина звука", "CATEGORY_MOTION": "Кретање", "CATEGORY_LOOKS": "Изглед", "CATEGORY_SOUND": "Звук", "CATEGORY_EVENTS": "Догађаји", "CATEGORY_CONTROL": "Управљање", "CATEGORY_SENSING": "Осећаји", "CATEGORY_OPERATORS": "Операције", "CATEGORY_VARIABLES": "Променљиве", "CATEGORY_MYBLOCKS": "Моји блокови", "DUPLICATE": "Умножи", "DELETE": "Обриши", "ADD_COMMENT": "Додај коментар", "REMOVE_COMMENT": "Уклони коментар", "DELETE_BLOCK": "Обриши блок", "DELETE_X_BLOCKS": "Обриши %1 блокова", "DELETE_ALL_BLOCKS": "Обрисати свих %1 блокова?", "CLEAN_UP": "Поспреми блокове", "HELP": "Помоћ", "UNDO": "Опозови", "REDO": "Понови", "EDIT_PROCEDURE": "Уреди", "SHOW_PROCEDURE_DEFINITION": "Иди до дефиниције", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Кажи нешто...", "COLOUR_HUE_LABEL": "Боја", "COLOUR_SATURATION_LABEL": "Засићење", "COLOUR_BRIGHTNESS_LABEL": "Осветљеност", "CHANGE_VALUE_TITLE": "Промени вредност:", "RENAME_VARIABLE": "Преименуј променљиву", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Преименуј променљиву", "NEW_VARIABLE": "Направи променљиву", "NEW_VARIABLE_TITLE": "Ново име променљиве:", "VARIABLE_MODAL_TITLE": "Нова променљива", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Направи блок", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Направи листу", "NEW_LIST_TITLE": "Ново име листе:", "LIST_MODAL_TITLE": "Нова листа", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Преименуј листу", "NEW_BROADCAST_MESSAGE": "Нова порука", "NEW_BROADCAST_MESSAGE_TITLE": "Име нове поруке:", "BROADCAST_MODAL_TITLE": "Нова порука", "DEFAULT_BROADCAST_MESSAGE_NAME": "порука1" }; Blockly.ScratchMsgs.locales["sv"] = { "CONTROL_FOREVER": "för alltid", "CONTROL_REPEAT": "repetera %1", "CONTROL_IF": "om %1 då", "CONTROL_ELSE": "annars", "CONTROL_STOP": "stoppa", "CONTROL_STOP_ALL": "alla", "CONTROL_STOP_THIS": "detta skript", "CONTROL_STOP_OTHER": "andra skript i sprajten", "CONTROL_WAIT": "vänta %1 sekunder", "CONTROL_WAITUNTIL": "vänta tills %1", "CONTROL_REPEATUNTIL": "repetera tills %1", "CONTROL_WHILE": "medan %1", "CONTROL_FOREACH": "för varje %1 i %2", "CONTROL_STARTASCLONE": "när jag startar som klon", "CONTROL_CREATECLONEOF": "skapa klon av %1", "CONTROL_CREATECLONEOF_MYSELF": "mig själv", "CONTROL_DELETETHISCLONE": "radera klonen", "CONTROL_COUNTER": "räknare", "CONTROL_INCRCOUNTER": "öka räknare", "CONTROL_CLEARCOUNTER": "nollställ räknare", "CONTROL_ALLATONCE": "alla samtidig", "DATA_SETVARIABLETO": "sätt %1 till %2", "DATA_CHANGEVARIABLEBY": "ändra %1 med %2", "DATA_SHOWVARIABLE": "visa variabel %1", "DATA_HIDEVARIABLE": "göm variabel %1", "DATA_ADDTOLIST": "lägg till %1 i %2", "DATA_DELETEOFLIST": "ta bort %1 från %2", "DATA_INSERTATLIST": "infoga %1 vid %2 i %3", "DATA_REPLACEITEMOFLIST": "ersätt posten %1 i %2 med %3", "DATA_ITEMOFLIST": "post %1 i %2", "DATA_LENGTHOFLIST": "längden av %1", "DATA_LISTCONTAINSITEM": "%1 innehåller %2", "DATA_SHOWLIST": "visa listan %1", "DATA_HIDELIST": "göm listan %1", "DATA_INDEX_ALL": "alla", "DATA_INDEX_LAST": "sista", "DATA_INDEX_RANDOM": "slumpmässig", "EVENT_WHENFLAGCLICKED": "när %1 klickas på", "EVENT_WHENTHISSPRITECLICKED": "när denna sprite klickas på", "EVENT_WHENSTAGECLICKED": "när scenen klickas på", "EVENT_WHENTOUCHINGOBJECT": "när denna sprajt rör %1", "EVENT_WHENBROADCASTRECEIVED": "när jag tar emot %1", "EVENT_WHENBACKDROPSWITCHESTO": "när bakgrunden växlar till %1", "EVENT_WHENGREATERTHAN": "när %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "timer", "EVENT_BROADCAST": "skicka %1", "EVENT_BROADCASTANDWAIT": "skicka %1 och vänta", "EVENT_WHENKEYPRESSED": "när %1 tangenten trycks ned", "EVENT_WHENKEYPRESSED_SPACE": "mellanslag", "EVENT_WHENKEYPRESSED_LEFT": "vänsterpil", "EVENT_WHENKEYPRESSED_RIGHT": "högerpil", "EVENT_WHENKEYPRESSED_DOWN": "nedåtpil", "EVENT_WHENKEYPRESSED_UP": "uppåtpil", "EVENT_WHENKEYPRESSED_ANY": "någon", "LOOKS_SAYFORSECS": "säg %1 i %2 sekunder", "LOOKS_SAY": "säg %1", "LOOKS_HELLO": "Hej!", "LOOKS_THINKFORSECS": "tänk %1 i %2 sekunder", "LOOKS_THINK": "tänk %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "visa", "LOOKS_HIDE": "göm", "LOOKS_HIDEALLSPRITES": "göm alla sprajtar", "LOOKS_EFFECT_COLOR": "färg ", "LOOKS_EFFECT_FISHEYE": "fisheye", "LOOKS_EFFECT_WHIRL": "virvel", "LOOKS_EFFECT_PIXELATE": "pixla", "LOOKS_EFFECT_MOSAIC": "mosaik", "LOOKS_EFFECT_BRIGHTNESS": "ljusstyrka", "LOOKS_EFFECT_GHOST": "genomskinlighet", "LOOKS_CHANGEEFFECTBY": "ändra %1 effekten med %2", "LOOKS_SETEFFECTTO": "sätt %1 effekten till %2", "LOOKS_CLEARGRAPHICEFFECTS": "ta bort grafisk effekt", "LOOKS_CHANGESIZEBY": "ändra storlek med %1", "LOOKS_SETSIZETO": "sätt storleken till %1 %", "LOOKS_SIZE": "Storlek", "LOOKS_CHANGESTRETCHBY": "ändra töjning med %1", "LOOKS_SETSTRETCHTO": "sätt töjning till %1 %", "LOOKS_SWITCHCOSTUMETO": "ändra klädsel till %1", "LOOKS_NEXTCOSTUME": "nästa klädsel", "LOOKS_SWITCHBACKDROPTO": "växla bakgrund till %1", "LOOKS_GOTOFRONTBACK": "gå till %1 lagret", "LOOKS_GOTOFRONTBACK_FRONT": "placera längst fram", "LOOKS_GOTOFRONTBACK_BACK": "tillbaka", "LOOKS_GOFORWARDBACKWARDLAYERS": "gå %1 %2 lager", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "framåt ", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "bakåt ", "LOOKS_BACKDROPNUMBERNAME": "bakgrund %1", "LOOKS_COSTUMENUMBERNAME": "klädsel %1", "LOOKS_NUMBERNAME_NUMBER": "nummer", "LOOKS_NUMBERNAME_NAME": "namn ", "LOOKS_SWITCHBACKDROPTOANDWAIT": "byt bakgrund till %1 och vänta", "LOOKS_NEXTBACKDROP": "nästa bakgrund", "LOOKS_PREVIOUSBACKDROP": "föregående bakgrund", "LOOKS_RANDOMBACKDROP": "slumpvis bakgrund", "MOTION_MOVESTEPS": "gå %1 steg", "MOTION_TURNLEFT": "rotera %1 %2 grader", "MOTION_TURNRIGHT": "rotera %1 %2 grader", "MOTION_POINTINDIRECTION": "peka i riktning %1", "MOTION_POINTTOWARDS": "peka mot %1", "MOTION_POINTTOWARDS_POINTER": "muspekare ", "MOTION_GOTO": "gå till %1", "MOTION_GOTO_POINTER": "muspekare ", "MOTION_GOTO_RANDOM": "slumpmässig position", "MOTION_GOTOXY": "gå till x: %1 y: %2", "MOTION_GLIDESECSTOXY": "glid %1 sek till x: %2 y: %3", "MOTION_GLIDETO": "glid %1 sekunder till %2", "MOTION_GLIDETO_POINTER": "muspekare ", "MOTION_GLIDETO_RANDOM": "slumpmässig position", "MOTION_CHANGEXBY": "ändra x med %1", "MOTION_SETX": "sätt x till %1", "MOTION_CHANGEYBY": "ändra y med %1", "MOTION_SETY": "sätt y till %1", "MOTION_IFONEDGEBOUNCE": "om vid kanten, studsa", "MOTION_SETROTATIONSTYLE": "sätt rotationsstil %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "vänster-höger", "MOTION_SETROTATIONSTYLE_DONTROTATE": "rotera inte", "MOTION_SETROTATIONSTYLE_ALLAROUND": "rotera", "MOTION_XPOSITION": "x position", "MOTION_YPOSITION": "y position", "MOTION_DIRECTION": "riktning", "MOTION_SCROLLRIGHT": "skrolla höger %1", "MOTION_SCROLLUP": "skrolla upp %1", "MOTION_ALIGNSCENE": "arrangera scen %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "nedre-vänster", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "nedre-höger", "MOTION_ALIGNSCENE_MIDDLE": "mitten", "MOTION_ALIGNSCENE_TOPLEFT": "övre-vänster", "MOTION_ALIGNSCENE_TOPRIGHT": "övre-höger", "MOTION_XSCROLL": "x scroll", "MOTION_YSCROLL": "y scroll", "MOTION_STAGE_SELECTED": "Scen vald: inga rörelseblock", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "välj slumptal %1 till %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 och %2", "OPERATORS_OR": "%1 eller %2", "OPERATORS_NOT": "inte %1", "OPERATORS_JOIN": "sammanfoga %1 %2", "OPERATORS_JOIN_APPLE": "äpple", "OPERATORS_JOIN_BANANA": "banan", "OPERATORS_LETTEROF": "bokstav %1 av %2", "OPERATORS_LETTEROF_APPLE": "ä", "OPERATORS_LENGTH": "längden av %1", "OPERATORS_CONTAINS": "%1 innehåller %2", "OPERATORS_MOD": "%1 mod %2", "OPERATORS_ROUND": "avrunda %1", "OPERATORS_MATHOP": "%1 av %2", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "Golv", "OPERATORS_MATHOP_CEILING": "Tak", "OPERATORS_MATHOP_SQRT": "sqrt", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "definiera %1", "SENSING_TOUCHINGOBJECT": "rör vid %1?", "SENSING_TOUCHINGOBJECT_POINTER": "muspekare ", "SENSING_TOUCHINGOBJECT_EDGE": "kant", "SENSING_TOUCHINGCOLOR": "rör vid färgen %1?", "SENSING_COLORISTOUCHINGCOLOR": "rör färgen %1 vid %2?", "SENSING_DISTANCETO": "avstånd till %1", "SENSING_DISTANCETO_POINTER": "muspekare ", "SENSING_ASKANDWAIT": "fråga %1 och vänta", "SENSING_ASK_TEXT": "Vad heter du?", "SENSING_ANSWER": "svar", "SENSING_KEYPRESSED": "tangent %1 nedtryckt?", "SENSING_MOUSEDOWN": "musknappen?", "SENSING_MOUSEX": "mus x", "SENSING_MOUSEY": "mus y", "SENSING_SETDRAGMODE": "sätt dragläge %1", "SENSING_SETDRAGMODE_DRAGGABLE": "dragbar", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "inte dragbar", "SENSING_LOUDNESS": "ljudstyrka", "SENSING_LOUD": "högt ljud?", "SENSING_TIMER": "timer", "SENSING_RESETTIMER": "nollställ timer", "SENSING_OF": "%1 av %2", "SENSING_OF_XPOSITION": "x position", "SENSING_OF_YPOSITION": "y position", "SENSING_OF_DIRECTION": "riktning", "SENSING_OF_COSTUMENUMBER": "klädselnummer", "SENSING_OF_COSTUMENAME": "klädselnamn", "SENSING_OF_SIZE": "Storlek", "SENSING_OF_VOLUME": "volym ", "SENSING_OF_BACKDROPNUMBER": "bakgrundsnummer", "SENSING_OF_BACKDROPNAME": "bakgrundsnamn", "SENSING_OF_STAGE": "Scen", "SENSING_CURRENT": "aktuell %1", "SENSING_CURRENT_YEAR": "år ", "SENSING_CURRENT_MONTH": "månad ", "SENSING_CURRENT_DATE": "dag ", "SENSING_CURRENT_DAYOFWEEK": "veckodag ", "SENSING_CURRENT_HOUR": "timmar ", "SENSING_CURRENT_MINUTE": "minuter ", "SENSING_CURRENT_SECOND": "sekunder ", "SENSING_DAYSSINCE2000": "dagar sedan år 2000", "SENSING_USERNAME": "användarnamn ", "SENSING_USERID": "användarnamn", "SOUND_PLAY": "starta ljud %1", "SOUND_PLAYUNTILDONE": "spela ljudet %1 tills färdigt", "SOUND_STOPALLSOUNDS": "stoppa alla ljud", "SOUND_SETEFFECTO": "sätt %1 effekten till %2", "SOUND_CHANGEEFFECTBY": "ändra %1 effekten med %2", "SOUND_CLEAREFFECTS": "ta bort ljudeffekter", "SOUND_EFFECTS_PITCH": "tonhöjd", "SOUND_EFFECTS_PAN": "panorera vänster/höger", "SOUND_CHANGEVOLUMEBY": "ändra volymen med %1", "SOUND_SETVOLUMETO": "sätt volymen till %1%", "SOUND_VOLUME": "volym ", "CATEGORY_MOTION": "Rörelse", "CATEGORY_LOOKS": "Utseende", "CATEGORY_SOUND": "Ljud", "CATEGORY_EVENTS": "Händelser", "CATEGORY_CONTROL": "Kontroll", "CATEGORY_SENSING": "Känna av", "CATEGORY_OPERATORS": "Operatorer", "CATEGORY_VARIABLES": "Variabler", "CATEGORY_MYBLOCKS": "Mina block", "DUPLICATE": "Kopiera", "DELETE": "Radera", "ADD_COMMENT": "Lägg till kommentar", "REMOVE_COMMENT": "Ta bort kommentar", "DELETE_BLOCK": "Ta bort block", "DELETE_X_BLOCKS": "Ta bort %1 block", "DELETE_ALL_BLOCKS": "Ta bort alla %1 block?", "CLEAN_UP": "Rensa block", "HELP": "Hjälp", "UNDO": "Ångra", "REDO": "Gör om", "EDIT_PROCEDURE": "Redigera", "SHOW_PROCEDURE_DEFINITION": "Gå till definition", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Säg något...", "COLOUR_HUE_LABEL": "Färg", "COLOUR_SATURATION_LABEL": "Mättnad", "COLOUR_BRIGHTNESS_LABEL": "Ljusstyrka", "CHANGE_VALUE_TITLE": "Ändra värde:", "RENAME_VARIABLE": "Döp om variabeln", "RENAME_VARIABLE_TITLE": "Döp om alla \"%1\" variabler till:", "RENAME_VARIABLE_MODAL_TITLE": "Döp om variabel", "NEW_VARIABLE": "Gör en variabel", "NEW_VARIABLE_TITLE": "Nytt variabelnamn:", "VARIABLE_MODAL_TITLE": "Ny variabel", "VARIABLE_ALREADY_EXISTS": "En variabel \"%1\" finns redan.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "En variabel \"%1\" finns redan för en annan variabel av typ \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Ta bort %1 användningar av variabeln \"%2\"?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Kan inte ta bort variabel \"%1\" för att den är en del av definitionen av funktionen \"%2\"", "DELETE_VARIABLE": "Ta bort \"%1\" variabeln", "NEW_PROCEDURE": "Skapa ett Block", "PROCEDURE_ALREADY_EXISTS": "En funktion \"%1\" finns redan.", "NEW_LIST": "Gör en lista", "NEW_LIST_TITLE": "Nytt listnamn:", "LIST_MODAL_TITLE": "Ny lista", "LIST_ALREADY_EXISTS": "En lista \"%1\" finns redan.", "RENAME_LIST_TITLE": "Döp om alla \"%1\" listor till:", "RENAME_LIST_MODAL_TITLE": "Döp om lista", "NEW_BROADCAST_MESSAGE": "Nytt meddelande", "NEW_BROADCAST_MESSAGE_TITLE": "Nytt namn på meddelande:", "BROADCAST_MODAL_TITLE": "Nytt meddelande", "DEFAULT_BROADCAST_MESSAGE_NAME": "meddelande1" }; Blockly.ScratchMsgs.locales["th"] = { "CONTROL_FOREVER": "วนซ้ำตลอด", "CONTROL_REPEAT": "ทำซ้ำ %1", "CONTROL_IF": "ถ้า %1 แล้ว", "CONTROL_ELSE": "มิฉะนั้น", "CONTROL_STOP": "หยุด", "CONTROL_STOP_ALL": "ทั้งหมด", "CONTROL_STOP_THIS": "สคริปต์นี้", "CONTROL_STOP_OTHER": "สริปต์อื่นในตัวละคร", "CONTROL_WAIT": "รอ %1 วินาที", "CONTROL_WAITUNTIL": "รอจนกระทั่ง %1", "CONTROL_REPEATUNTIL": "ทำซ้ำจน %1", "CONTROL_WHILE": "ขณะที่ %1", "CONTROL_FOREACH": "สำหรับแต่ละ %1 ใน %2", "CONTROL_STARTASCLONE": "เมื่อฉันเริ่มในฐานะโคลน", "CONTROL_CREATECLONEOF": "สร้าง โคลน ของ %1", "CONTROL_CREATECLONEOF_MYSELF": "ตัวฉันเอง", "CONTROL_DELETETHISCLONE": "ลบโคลนตัวนี้", "CONTROL_COUNTER": "ตัวนับ", "CONTROL_INCRCOUNTER": "ตัวนับเพิ่ม", "CONTROL_CLEARCOUNTER": "ล้างตัวนับ", "CONTROL_ALLATONCE": "ทั้งหมดในครั้งเดียว", "DATA_SETVARIABLETO": "ตั้งค่า %1 เป็น %2", "DATA_CHANGEVARIABLEBY": "เปลี่ยน %1 ทีละ %2", "DATA_SHOWVARIABLE": "แสดงตัวแปร %1", "DATA_HIDEVARIABLE": "ซ่อนตัวแปร %1", "DATA_ADDTOLIST": "เพิ่ม %1 ไปยัง %2", "DATA_DELETEOFLIST": "ลบ %1 ออกจาก %2", "DATA_INSERTATLIST": "แทรก %1 ที่ %2 ของ %3", "DATA_REPLACEITEMOFLIST": "แทนที่รายการ %1 ของ %2 ด้วย %3", "DATA_ITEMOFLIST": "รายการ %1 ของ %2", "DATA_LENGTHOFLIST": "จำนวนของ %1", "DATA_LISTCONTAINSITEM": "%1 มี %2?", "DATA_SHOWLIST": "แสดงรายการ %1", "DATA_HIDELIST": "ซ่อนรายการ %1", "DATA_INDEX_ALL": "ทั้งหมด", "DATA_INDEX_LAST": "สุดท้าย", "DATA_INDEX_RANDOM": "สุ่ม", "EVENT_WHENFLAGCLICKED": "เมื่อคลิก %1", "EVENT_WHENTHISSPRITECLICKED": "เมื่อตัวละครนี้ถูกคลิก", "EVENT_WHENSTAGECLICKED": "เมื่อคลิกเวที", "EVENT_WHENTOUCHINGOBJECT": "เมื่อสไปรต์นี้แตะ %1", "EVENT_WHENBROADCASTRECEIVED": "เมื่อฉันได้รับ %1", "EVENT_WHENBACKDROPSWITCHESTO": "เมื่อฉากหลังเปลี่ยนเป็น %1", "EVENT_WHENGREATERTHAN": "เมื่อ %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "ตัวจับเวลา", "EVENT_BROADCAST": "กระจาย %1", "EVENT_BROADCASTANDWAIT": "กระจาย %1 และรอ", "EVENT_WHENKEYPRESSED": "เมื่อกดปุ่ม %1", "EVENT_WHENKEYPRESSED_SPACE": "สเปซบาร์", "EVENT_WHENKEYPRESSED_LEFT": "ลูกศรชี้ทางซ้าย", "EVENT_WHENKEYPRESSED_RIGHT": "ลูกศรชี้ขวา", "EVENT_WHENKEYPRESSED_DOWN": "ลูกศรชี้ลง", "EVENT_WHENKEYPRESSED_UP": "ลูกศรขึ้น", "EVENT_WHENKEYPRESSED_ANY": "อะไรก็ได้", "LOOKS_SAYFORSECS": "พูด %1 %2 วินาที", "LOOKS_SAY": "พูด %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "คิด %1 %2 วินาที", "LOOKS_THINK": "คิด %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "แสดง", "LOOKS_HIDE": "ซ่อน", "LOOKS_HIDEALLSPRITES": "ซ่อนสไปรต์ทั้งหมด", "LOOKS_EFFECT_COLOR": "สี", "LOOKS_EFFECT_FISHEYE": "ตาปลา", "LOOKS_EFFECT_WHIRL": "หมุนวน", "LOOKS_EFFECT_PIXELATE": "แยกพิกเซล", "LOOKS_EFFECT_MOSAIC": "โมเสก", "LOOKS_EFFECT_BRIGHTNESS": "ความสว่าง", "LOOKS_EFFECT_GHOST": "ล่องหน", "LOOKS_CHANGEEFFECTBY": "เปลี่ยนเอฟเฟกต์ %1 ทีละ %2", "LOOKS_SETEFFECTTO": "ตั้งค่าเอฟเฟกต์ %1 เป็น %2", "LOOKS_CLEARGRAPHICEFFECTS": "ล้างเอฟเฟคภาพ", "LOOKS_CHANGESIZEBY": "เปลี่ยนขนาดทีละ %1", "LOOKS_SETSIZETO": "กำหนดขนาดเป็น %1 %", "LOOKS_SIZE": "ขนาด", "LOOKS_CHANGESTRETCHBY": "เปลี่ยนความยืดทีละ %1", "LOOKS_SETSTRETCHTO": "ตั้งค่าความยืดเป็น %1 %", "LOOKS_SWITCHCOSTUMETO": "เปลี่ยนคอสตูมเป็น %1", "LOOKS_NEXTCOSTUME": "ชุดถัดไป", "LOOKS_SWITCHBACKDROPTO": "เปลี่ยนฉากหลังเป็น %1", "LOOKS_GOTOFRONTBACK": "ไปที่ระดับ %1 ", "LOOKS_GOTOFRONTBACK_FRONT": "หน้าสุด", "LOOKS_GOTOFRONTBACK_BACK": "หลังสุด", "LOOKS_GOFORWARDBACKWARDLAYERS": "ไป %1 %2 ระดับ", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ด้านหน้า", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "ด้านหลัง", "LOOKS_BACKDROPNUMBERNAME": "ฉากหลัง %1", "LOOKS_COSTUMENUMBERNAME": "คอสตูม %1", "LOOKS_NUMBERNAME_NUMBER": "หมายเลข", "LOOKS_NUMBERNAME_NAME": "ชื่อ", "LOOKS_SWITCHBACKDROPTOANDWAIT": "เปลี่ยนฉากหลังเป็น %1 และรอ", "LOOKS_NEXTBACKDROP": "ฉากหลังต่อไป", "LOOKS_PREVIOUSBACKDROP": "ฉากหลังก่อนหน้า", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "เคลื่อนที่ %1 ก้าว", "MOTION_TURNLEFT": "หมุน %1 %2 องศา", "MOTION_TURNRIGHT": "หมุน %1 %2 องศา", "MOTION_POINTINDIRECTION": "หันในแนว %1", "MOTION_POINTTOWARDS": "หันไปทาง %1", "MOTION_POINTTOWARDS_POINTER": "ตัวชี้เมาส์", "MOTION_GOTO": "ไปที่ %1", "MOTION_GOTO_POINTER": "ตัวชี้เมาส์", "MOTION_GOTO_RANDOM": "ตำแหน่งสุ่ม", "MOTION_GOTOXY": "ไปที่ x: %1 y: %2", "MOTION_GLIDESECSTOXY": "เหิน %1 วินาที ไปยัง x: %2 y: %3", "MOTION_GLIDETO": "เหิน %1 วินาที ไปยัง %2", "MOTION_GLIDETO_POINTER": "ตัวชี้เมาส์", "MOTION_GLIDETO_RANDOM": "ตำแหน่งสุ่ม", "MOTION_CHANGEXBY": "เปลี่ยน x ทีละ %1", "MOTION_SETX": "ตั้งค่า x เป็น %1", "MOTION_CHANGEYBY": "เปลี่ยน y ทีละ %1", "MOTION_SETY": "ตั้งค่า y เป็น %1", "MOTION_IFONEDGEBOUNCE": "ถ้าชนขอบให้สะท้อนกลับ", "MOTION_SETROTATIONSTYLE": "ตั้งรูปแบบการหมุนเป็น %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "ซ้าย-ขวา", "MOTION_SETROTATIONSTYLE_DONTROTATE": "ห้ามหมุน", "MOTION_SETROTATIONSTYLE_ALLAROUND": "รอบด้าน", "MOTION_XPOSITION": "ตำแหน่ง x ", "MOTION_YPOSITION": "ตำแหน่ง y", "MOTION_DIRECTION": "ทิศทาง", "MOTION_SCROLLRIGHT": "เลื่อนขวา %1", "MOTION_SCROLLUP": "เลื่อนขึ้น %1", "MOTION_ALIGNSCENE": "แนวฉาก %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "ล่างซ้าย", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "ล่างขวา", "MOTION_ALIGNSCENE_MIDDLE": "กึ่งกลาง", "MOTION_ALIGNSCENE_TOPLEFT": "บนซ้าย", "MOTION_ALIGNSCENE_TOPRIGHT": "บนขวา", "MOTION_XSCROLL": "x เลื่อน", "MOTION_YSCROLL": "y เลื่อน", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "เลือกสุ่มจาก %1 ถึง %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 และ %2", "OPERATORS_OR": "%1 หรือ %2", "OPERATORS_NOT": "ไม่ %1", "OPERATORS_JOIN": "ต่อ %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "อักษรที่ %1 ของ %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "ความยาวของ %1", "OPERATORS_CONTAINS": "%1 มี %2?", "OPERATORS_MOD": "%1 หารเอาเศษ %2", "OPERATORS_ROUND": "ปัดเศษ %1", "OPERATORS_MATHOP": "%1 ของ %2", "OPERATORS_MATHOP_ABS": "ค่าสัมบูรณ์", "OPERATORS_MATHOP_FLOOR": "พื้น", "OPERATORS_MATHOP_CEILING": "เพดาน", "OPERATORS_MATHOP_SQRT": "รากที่สอง", "OPERATORS_MATHOP_SIN": "ไซน์", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ใน", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "กำหนด %1", "SENSING_TOUCHINGOBJECT": "แตะ %1?", "SENSING_TOUCHINGOBJECT_POINTER": "ตัวชี้เมาส์", "SENSING_TOUCHINGOBJECT_EDGE": "ขอบ", "SENSING_TOUCHINGCOLOR": "แตะสี %1?", "SENSING_COLORISTOUCHINGCOLOR": "สี %1 แตะกับสี %2?", "SENSING_DISTANCETO": "ระยะห่างไปยัง %1", "SENSING_DISTANCETO_POINTER": "ตัวชี้เมาส์", "SENSING_ASKANDWAIT": "ถาม %1 และรอ", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "คำตอบ", "SENSING_KEYPRESSED": "ปุ่ม %1 ถูกกด?", "SENSING_MOUSEDOWN": "เมาส์ถูกกด?", "SENSING_MOUSEX": "ตำแหน่ง x ของเมาส์", "SENSING_MOUSEY": "ตำแหน่ง y ของเมาส์", "SENSING_SETDRAGMODE": "ตั้งค่าโหมดลาก %1", "SENSING_SETDRAGMODE_DRAGGABLE": "ลากได้", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "ลากไม่ได้", "SENSING_LOUDNESS": "ระดับความดัง", "SENSING_LOUD": "เสียงดัง?", "SENSING_TIMER": "จับเวลา", "SENSING_RESETTIMER": "จับเวลาใหม่", "SENSING_OF": "%1 ของ %2", "SENSING_OF_XPOSITION": "ตำแหน่ง x ", "SENSING_OF_YPOSITION": "ตำแหน่ง y", "SENSING_OF_DIRECTION": "ทิศทาง", "SENSING_OF_COSTUMENUMBER": "คอสตูม #", "SENSING_OF_COSTUMENAME": "ชื่อคอสตูม", "SENSING_OF_SIZE": "ขนาด", "SENSING_OF_VOLUME": "ระดับเสียง", "SENSING_OF_BACKDROPNUMBER": "ฉากหลัง #", "SENSING_OF_BACKDROPNAME": "ชื่อฉากหลัง", "SENSING_OF_STAGE": "เวที", "SENSING_CURRENT": "%1 ปัจจุบัน", "SENSING_CURRENT_YEAR": "ปี", "SENSING_CURRENT_MONTH": "เดือน", "SENSING_CURRENT_DATE": "วันที่", "SENSING_CURRENT_DAYOFWEEK": "วันของสัปดาห์", "SENSING_CURRENT_HOUR": "ชั่วโมง", "SENSING_CURRENT_MINUTE": "นาที", "SENSING_CURRENT_SECOND": "วินาที", "SENSING_DAYSSINCE2000": "จำนวนวันตั้งแต่ปี ค.ศ 2000", "SENSING_USERNAME": "ชื่อผู้ใช้", "SENSING_USERID": "รหัสผู้ใช้", "SOUND_PLAY": "เริ่มเสียง %1", "SOUND_PLAYUNTILDONE": "เล่นเสียง %1 จนจบ", "SOUND_STOPALLSOUNDS": "หยุดเสียงทั้งหมด", "SOUND_SETEFFECTO": "ตั้งค่าเอฟเฟกต์ %1 เป็น %2", "SOUND_CHANGEEFFECTBY": "เปลี่ยนเอฟเฟกต์ %1 ทีละ %2", "SOUND_CLEAREFFECTS": "ล้างเอฟเฟกต์เสียง", "SOUND_EFFECTS_PITCH": "เสียงสูงต่ำ", "SOUND_EFFECTS_PAN": "แพนเสียงซ้าย/ขวา", "SOUND_CHANGEVOLUMEBY": "เปลี่ยนระดับเสียงทีละ %1", "SOUND_SETVOLUMETO": "ตั้งระดับเสียงเป็น %1%", "SOUND_VOLUME": "ระดับเสียง", "CATEGORY_MOTION": "เคลื่อนที่", "CATEGORY_LOOKS": "รูปร่าง", "CATEGORY_SOUND": "เสียง", "CATEGORY_EVENTS": "เหตุการณ์", "CATEGORY_CONTROL": "ควบคุม", "CATEGORY_SENSING": "ตรวจจับ", "CATEGORY_OPERATORS": "ตัวดำเนินการ", "CATEGORY_VARIABLES": "ตัวแปร", "CATEGORY_MYBLOCKS": "บล็อกของฉัน", "DUPLICATE": "ทำซ้ำ", "DELETE": "ลบ", "ADD_COMMENT": "เพิ่มคำอธิบาย", "REMOVE_COMMENT": "ลบคำอธิบาย", "DELETE_BLOCK": "ลบบล็อก", "DELETE_X_BLOCKS": "ลบ %1 บล็อก", "DELETE_ALL_BLOCKS": "ลบทั้งหมด %1 บล็อก?", "CLEAN_UP": "จัดระเบียบบล็อก", "HELP": "ช่วยเหลือ", "UNDO": "ย้อนกลับ", "REDO": "ทำซ้ำ", "EDIT_PROCEDURE": "แก้ไข", "SHOW_PROCEDURE_DEFINITION": "ไปยังตัวกำหนด", "WORKSPACE_COMMENT_DEFAULT_TEXT": "พูดอะไรสักอย่าง...", "COLOUR_HUE_LABEL": "สี", "COLOUR_SATURATION_LABEL": "ความอิ่มตัว", "COLOUR_BRIGHTNESS_LABEL": "ความสว่าง", "CHANGE_VALUE_TITLE": "เปลี่ยนค่า:", "RENAME_VARIABLE": "เปลี่ยนชื่อตัวแปร", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "เปลี่ยนชื่อตัวแปร", "NEW_VARIABLE": "สร้างตัวแปร", "NEW_VARIABLE_TITLE": "ชื่อตัวแปรใหม่:", "VARIABLE_MODAL_TITLE": "ตัวแปรใหม่", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "สร้างบล็อกใหม่", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "สร้างรายการ", "NEW_LIST_TITLE": "ชื่อรายการ:", "LIST_MODAL_TITLE": "รายการใหม่", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "เปลี่ยนชื่อรายการ", "NEW_BROADCAST_MESSAGE": "ข้อความใหม่", "NEW_BROADCAST_MESSAGE_TITLE": "ชื่อข้อความใหม่:", "BROADCAST_MODAL_TITLE": "ข้อความใหม่", "DEFAULT_BROADCAST_MESSAGE_NAME": "ข้อความ1" }; Blockly.ScratchMsgs.locales["tr"] = { "CONTROL_FOREVER": "sürekli tekrarla", "CONTROL_REPEAT": "%1 defa tekrarla", "CONTROL_IF": "eğer %1 ise", "CONTROL_ELSE": "değilse", "CONTROL_STOP": "durdur", "CONTROL_STOP_ALL": "tümü", "CONTROL_STOP_THIS": "bu diziyi", "CONTROL_STOP_OTHER": "kuklanın diğer dizilerini", "CONTROL_WAIT": "%1 saniye bekle", "CONTROL_WAITUNTIL": "%1 olana kadar bekle", "CONTROL_REPEATUNTIL": "%1 olana kadar tekrarla", "CONTROL_WHILE": "%1 olana kadar tekrarla", "CONTROL_FOREACH": "%2 deki her %1 için", "CONTROL_STARTASCLONE": "ikiz olarak başladığımda", "CONTROL_CREATECLONEOF": "%1'in ikizini yarat", "CONTROL_CREATECLONEOF_MYSELF": "kendim", "CONTROL_DELETETHISCLONE": "bu ikizi sil", "CONTROL_COUNTER": "sayaç", "CONTROL_INCRCOUNTER": "sayacı artır", "CONTROL_CLEARCOUNTER": "sayacı sıfırla", "CONTROL_ALLATONCE": "tümü tek seferde", "DATA_SETVARIABLETO": "%1 i %2 ye ayarla", "DATA_CHANGEVARIABLEBY": "%1 i %2 kadar değiştir", "DATA_SHOWVARIABLE": "%1 değişkenini göster", "DATA_HIDEVARIABLE": "%1 değişkenini gizle", "DATA_ADDTOLIST": "%1 i %2 ye ekle", "DATA_DELETEOFLIST": "%2 nin %1 ini sil", "DATA_INSERTATLIST": "%1 i %3 ün %2 pozisyonuna ekle", "DATA_REPLACEITEMOFLIST": "%2 öğesinin %1 öğe yerine %3 koy", "DATA_ITEMOFLIST": "%2 nin %1 öğesi", "DATA_LENGTHOFLIST": "%1'in uzunluğu", "DATA_LISTCONTAINSITEM": "%1'de %2 içeriyor mu? ", "DATA_SHOWLIST": "%1 listesini göster", "DATA_HIDELIST": "%1 listesini gizle", "DATA_INDEX_ALL": "tümü", "DATA_INDEX_LAST": "son", "DATA_INDEX_RANDOM": "rastgele", "EVENT_WHENFLAGCLICKED": "%1 tıklandığında", "EVENT_WHENTHISSPRITECLICKED": "bu kukla tıklandığında", "EVENT_WHENSTAGECLICKED": "sahne tıklandığında", "EVENT_WHENTOUCHINGOBJECT": "bu kukla %1 e dokunduğunda", "EVENT_WHENBROADCASTRECEIVED": "%1 haberi gelince", "EVENT_WHENBACKDROPSWITCHESTO": "dekor %1 olduğunda", "EVENT_WHENGREATERTHAN": "%1 > %2 olduğunda", "EVENT_WHENGREATERTHAN_TIMER": "kronometre", "EVENT_BROADCAST": "%1 haberini sal", "EVENT_BROADCASTANDWAIT": "%1 haberini sal ve bekle", "EVENT_WHENKEYPRESSED": "%1 tuşuna basılınca", "EVENT_WHENKEYPRESSED_SPACE": "boşluk", "EVENT_WHENKEYPRESSED_LEFT": "sol ok", "EVENT_WHENKEYPRESSED_RIGHT": "sağ ok", "EVENT_WHENKEYPRESSED_DOWN": "aşağı ok", "EVENT_WHENKEYPRESSED_UP": "yukarı ok", "EVENT_WHENKEYPRESSED_ANY": "herhangi", "LOOKS_SAYFORSECS": "%2 saniye boyunca %1 de ", "LOOKS_SAY": "%1 de", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "%2 saniye boyunca %1 diye düşün", "LOOKS_THINK": "%1 diye düşün", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "göster", "LOOKS_HIDE": "gizle", "LOOKS_HIDEALLSPRITES": "tüm kuklaları gizle", "LOOKS_EFFECT_COLOR": "renk", "LOOKS_EFFECT_FISHEYE": "balık gözü", "LOOKS_EFFECT_WHIRL": "fırılda", "LOOKS_EFFECT_PIXELATE": "benekleştir", "LOOKS_EFFECT_MOSAIC": "mozaik", "LOOKS_EFFECT_BRIGHTNESS": "parlaklık", "LOOKS_EFFECT_GHOST": "hayalet", "LOOKS_CHANGEEFFECTBY": "%1 etkisini %2 değiştir", "LOOKS_SETEFFECTTO": "%1 etkisi %2 olsun", "LOOKS_CLEARGRAPHICEFFECTS": "görsel etkileri temizle", "LOOKS_CHANGESIZEBY": "boyutu %1 birim büyüt", "LOOKS_SETSIZETO": "boyutu %1 % e ayarla", "LOOKS_SIZE": "büyüklük", "LOOKS_CHANGESTRETCHBY": "esnekliği %1 kadar değiştir", "LOOKS_SETSTRETCHTO": "esnekliği %1 e ayarla", "LOOKS_SWITCHCOSTUMETO": "%1 kılığına geç", "LOOKS_NEXTCOSTUME": "sonraki kostüm", "LOOKS_SWITCHBACKDROPTO": "%1 dekoruna geç", "LOOKS_GOTOFRONTBACK": "%1 katmanına git", "LOOKS_GOTOFRONTBACK_FRONT": "ön", "LOOKS_GOTOFRONTBACK_BACK": "arka", "LOOKS_GOFORWARDBACKWARDLAYERS": "%1 %2 katmanına git", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ileri", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "geri", "LOOKS_BACKDROPNUMBERNAME": "dekor %1", "LOOKS_COSTUMENUMBERNAME": "kostüm %1", "LOOKS_NUMBERNAME_NUMBER": "sayı", "LOOKS_NUMBERNAME_NAME": "isim", "LOOKS_SWITCHBACKDROPTOANDWAIT": "%1 dekoruna geç ve bekle", "LOOKS_NEXTBACKDROP": "sonraki dekor", "LOOKS_PREVIOUSBACKDROP": "önceki dekor", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "%1 adım git", "MOTION_TURNLEFT": "%1 %2 derece dön", "MOTION_TURNRIGHT": "%1 %2 derece dön", "MOTION_POINTINDIRECTION": "%1 yönüne dön", "MOTION_POINTTOWARDS": "%1'na doğru dön", "MOTION_POINTTOWARDS_POINTER": "fare oku", "MOTION_GOTO": "%1'na git", "MOTION_GOTO_POINTER": "fare oku", "MOTION_GOTO_RANDOM": "rastgele pozisyon", "MOTION_GOTOXY": "x: %1 y: %2 konumuna git", "MOTION_GLIDESECSTOXY": "%1 sn.de x: %2 y: %3'a süzül", "MOTION_GLIDETO": "%1 saniyede %2 noktasına süzül", "MOTION_GLIDETO_POINTER": "fare oku", "MOTION_GLIDETO_RANDOM": "rastgele konum", "MOTION_CHANGEXBY": "x konumunu %1 artır", "MOTION_SETX": "x konumunu %1 yap", "MOTION_CHANGEYBY": "y konumunu %1 artır", "MOTION_SETY": "y konumunu %1 yap", "MOTION_IFONEDGEBOUNCE": "kenara geldiyse sektir", "MOTION_SETROTATIONSTYLE": "dönüş stilini %1 yap", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "sol-sağ", "MOTION_SETROTATIONSTYLE_DONTROTATE": "döndürme", "MOTION_SETROTATIONSTYLE_ALLAROUND": "tüm yönlere", "MOTION_XPOSITION": "x konumu", "MOTION_YPOSITION": "y konumu", "MOTION_DIRECTION": "yön", "MOTION_SCROLLRIGHT": "sağa %1 kaydır", "MOTION_SCROLLUP": "yukarı %1 kaydır", "MOTION_ALIGNSCENE": "%1 görüntüsünü hizala", "MOTION_ALIGNSCENE_BOTTOMLEFT": "alt-sol", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "alt-sağ", "MOTION_ALIGNSCENE_MIDDLE": "orta", "MOTION_ALIGNSCENE_TOPLEFT": "sol üst", "MOTION_ALIGNSCENE_TOPRIGHT": "sağ üst", "MOTION_XSCROLL": "x ekseninde kaydır", "MOTION_YSCROLL": "y ekseninde kaydır", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "%1 ile %2 arasında rastgele sayı tut", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 ve %2", "OPERATORS_OR": "%1 veya %2", "OPERATORS_NOT": "%1 değil", "OPERATORS_JOIN": "birleştir %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "%2 in %1. harfi", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "%1'in uzunluğu", "OPERATORS_CONTAINS": "%1'de %2 içeriyor mu?", "OPERATORS_MOD": "%1 mod %2", "OPERATORS_ROUND": "%1'i yuvarla", "OPERATORS_MATHOP": "%2 nin %1 i", "OPERATORS_MATHOP_ABS": "mutlak değer", "OPERATORS_MATHOP_FLOOR": "aşağı yuvarla", "OPERATORS_MATHOP_CEILING": "yukarı yuvarla", "OPERATORS_MATHOP_SQRT": "karekök", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "%1 tanımla", "SENSING_TOUCHINGOBJECT": "%1'a değdi mi?", "SENSING_TOUCHINGOBJECT_POINTER": "fare oku", "SENSING_TOUCHINGOBJECT_EDGE": "kenar", "SENSING_TOUCHINGCOLOR": "%1 rengine dokundu mu?", "SENSING_COLORISTOUCHINGCOLOR": "%1 rengi %2 rengine değdi mi?", "SENSING_DISTANCETO": "%1'e mesafe", "SENSING_DISTANCETO_POINTER": "fare oku", "SENSING_ASKANDWAIT": "%1 diye sor ve bekle", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "cevap", "SENSING_KEYPRESSED": "%1 tuşuna basıldı mı?", "SENSING_MOUSEDOWN": "fareye basılı mı?", "SENSING_MOUSEX": "farenin x'i", "SENSING_MOUSEY": "farenin y'si", "SENSING_SETDRAGMODE": "sürükleme modunu %1 yap", "SENSING_SETDRAGMODE_DRAGGABLE": "sürüklenebilir", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "sürüklenemez", "SENSING_LOUDNESS": "ses şiddeti", "SENSING_LOUD": "yükses ses?", "SENSING_TIMER": "kronometre", "SENSING_RESETTIMER": "kronometreyi sıfırla", "SENSING_OF": "%2 nin %1 i", "SENSING_OF_XPOSITION": "x konumu", "SENSING_OF_YPOSITION": "y konumu", "SENSING_OF_DIRECTION": "yönü", "SENSING_OF_COSTUMENUMBER": "kostüm #", "SENSING_OF_COSTUMENAME": "kostüm ismi", "SENSING_OF_SIZE": "büyüklük", "SENSING_OF_VOLUME": "ses düzeyi", "SENSING_OF_BACKDROPNUMBER": "dekor #", "SENSING_OF_BACKDROPNAME": "dekorun adı", "SENSING_OF_STAGE": "Sahne", "SENSING_CURRENT": "şimdiki %1", "SENSING_CURRENT_YEAR": "yıl", "SENSING_CURRENT_MONTH": "ay", "SENSING_CURRENT_DATE": "tarih", "SENSING_CURRENT_DAYOFWEEK": "haftanın günü", "SENSING_CURRENT_HOUR": "saat", "SENSING_CURRENT_MINUTE": "dakika", "SENSING_CURRENT_SECOND": "saniye", "SENSING_DAYSSINCE2000": "2000'den beri geçen gün", "SENSING_USERNAME": "kullanıcı adı", "SENSING_USERID": "kullanıcı kimliği", "SOUND_PLAY": "%1 sesini çal", "SOUND_PLAYUNTILDONE": "%1 sesini bitene kadar çal", "SOUND_STOPALLSOUNDS": "tüm sesleri durdur", "SOUND_SETEFFECTO": "%1 etkisi %2 olsun", "SOUND_CHANGEEFFECTBY": "%1 etkisini %2 artır", "SOUND_CLEAREFFECTS": "ses etkilerini temizle", "SOUND_EFFECTS_PITCH": "ses perdesi", "SOUND_EFFECTS_PAN": "sağa-sola dönebilsin", "SOUND_CHANGEVOLUMEBY": "ses şiddetini %1 artır", "SOUND_SETVOLUMETO": "ses şiddetini %1% yap", "SOUND_VOLUME": "ses düzeyi", "CATEGORY_MOTION": "Hareket", "CATEGORY_LOOKS": "Görünüm", "CATEGORY_SOUND": "Ses", "CATEGORY_EVENTS": "Olaylar", "CATEGORY_CONTROL": "Kontrol", "CATEGORY_SENSING": "Algılama", "CATEGORY_OPERATORS": "İşlemler", "CATEGORY_VARIABLES": "Değişkenler", "CATEGORY_MYBLOCKS": "Bloklarım", "DUPLICATE": "Kopyasını çıkart", "DELETE": "Sil", "ADD_COMMENT": "Yorum Ekle", "REMOVE_COMMENT": "Yorumu Sil", "DELETE_BLOCK": "Bloğu Sil", "DELETE_X_BLOCKS": "%1 bloğu sil", "DELETE_ALL_BLOCKS": "Tüm %1 blokları sil", "CLEAN_UP": "Blokları düzenle", "HELP": "Yardım", "UNDO": "Geri Al", "REDO": "İleri Al", "EDIT_PROCEDURE": "Düzenle", "SHOW_PROCEDURE_DEFINITION": "Tanımlamaya git", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Birşey söyle", "COLOUR_HUE_LABEL": "Renk", "COLOUR_SATURATION_LABEL": "Doygunluk", "COLOUR_BRIGHTNESS_LABEL": "Parlaklık", "CHANGE_VALUE_TITLE": "Değeri değiştir", "RENAME_VARIABLE": "Değişkeni adlandır", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Değişkeni Yeniden Adlandır", "NEW_VARIABLE": "Bir Değişken Oluştur", "NEW_VARIABLE_TITLE": "Yeni değişken ismi:", "VARIABLE_MODAL_TITLE": "Yeni Değişken", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Bir Blok Oluştur", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Bir Liste Oluştur", "NEW_LIST_TITLE": "Yeni liste ismi:", "LIST_MODAL_TITLE": "Yeni Liste", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Listeyi Adlandır", "NEW_BROADCAST_MESSAGE": "Yeni haber", "NEW_BROADCAST_MESSAGE_TITLE": "Yeni haber ismi:", "BROADCAST_MODAL_TITLE": "Yeni Haber", "DEFAULT_BROADCAST_MESSAGE_NAME": "haber1" }; Blockly.ScratchMsgs.locales["uk"] = { "CONTROL_FOREVER": "завжди", "CONTROL_REPEAT": "повторити %1", "CONTROL_IF": "якщо %1 то", "CONTROL_ELSE": "інакше", "CONTROL_STOP": "зупинити", "CONTROL_STOP_ALL": "все", "CONTROL_STOP_THIS": "цей скрипт", "CONTROL_STOP_OTHER": "інші скрипти цього спрайту", "CONTROL_WAIT": "чекати %1 секунд", "CONTROL_WAITUNTIL": "чекати поки %1", "CONTROL_REPEATUNTIL": "повторити поки не %1", "CONTROL_WHILE": "поки %1", "CONTROL_FOREACH": "для кожного %1 в %2", "CONTROL_STARTASCLONE": "коли я починаю як клон", "CONTROL_CREATECLONEOF": "створити клон з %1", "CONTROL_CREATECLONEOF_MYSELF": "сам", "CONTROL_DELETETHISCLONE": "вилучити цей клон", "CONTROL_COUNTER": "лічильник", "CONTROL_INCRCOUNTER": "збільшити лічильник", "CONTROL_CLEARCOUNTER": "очистити лічильник", "CONTROL_ALLATONCE": "всі одночасно", "DATA_SETVARIABLETO": "задати значення %1 для %2", "DATA_CHANGEVARIABLEBY": "змінити %1 на %2", "DATA_SHOWVARIABLE": "показати змінну %1", "DATA_HIDEVARIABLE": "сховати змінну %1", "DATA_ADDTOLIST": "додати %1 до %2", "DATA_DELETEOFLIST": "вилучити %1 з %2", "DATA_INSERTATLIST": "вставити %1 в %2 з %3", "DATA_REPLACEITEMOFLIST": "замінити елемент %1 в %2 на %3", "DATA_ITEMOFLIST": "елемент %1 з %2", "DATA_LENGTHOFLIST": "довжина %1", "DATA_LISTCONTAINSITEM": "%1 містить %2?", "DATA_SHOWLIST": "показати список %1", "DATA_HIDELIST": "сховати список %1", "DATA_INDEX_ALL": "все", "DATA_INDEX_LAST": "останні", "DATA_INDEX_RANDOM": "випадково", "EVENT_WHENFLAGCLICKED": "коли %1 натиснуто", "EVENT_WHENTHISSPRITECLICKED": "коли спрайт натиснуто", "EVENT_WHENSTAGECLICKED": "коли сцену натиснуто", "EVENT_WHENTOUCHINGOBJECT": "коли цей спрай доторкнеться %1", "EVENT_WHENBROADCASTRECEIVED": "коли я отримую %1", "EVENT_WHENBACKDROPSWITCHESTO": "коли тло змінится на %1", "EVENT_WHENGREATERTHAN": "доки %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "таймер", "EVENT_BROADCAST": "оповістити %1", "EVENT_BROADCASTANDWAIT": "оповістити %1 і чекати", "EVENT_WHENKEYPRESSED": "доки клавішу %1 натиснуто ", "EVENT_WHENKEYPRESSED_SPACE": "пропуск", "EVENT_WHENKEYPRESSED_LEFT": "стрілка ліворуч", "EVENT_WHENKEYPRESSED_RIGHT": "стрілка праворуч", "EVENT_WHENKEYPRESSED_DOWN": "стрілка вниз", "EVENT_WHENKEYPRESSED_UP": "стрілка вгору", "EVENT_WHENKEYPRESSED_ANY": "будь-яка", "LOOKS_SAYFORSECS": "говорити %1 %2 сек", "LOOKS_SAY": "говорити %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "подумати %1 %2 сек", "LOOKS_THINK": "подумати %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "показати", "LOOKS_HIDE": "сховати", "LOOKS_HIDEALLSPRITES": "сховати усі спрайти", "LOOKS_EFFECT_COLOR": "колір", "LOOKS_EFFECT_FISHEYE": "роздуття", "LOOKS_EFFECT_WHIRL": "закручування", "LOOKS_EFFECT_PIXELATE": "пікселями", "LOOKS_EFFECT_MOSAIC": "мозаїка", "LOOKS_EFFECT_BRIGHTNESS": "яскравість", "LOOKS_EFFECT_GHOST": "привид", "LOOKS_CHANGEEFFECTBY": "змінити ефект %1 на %2", "LOOKS_SETEFFECTTO": "встановити ефект %1 в %2", "LOOKS_CLEARGRAPHICEFFECTS": "очистити графічні ефекти", "LOOKS_CHANGESIZEBY": "змінити розмір на %1", "LOOKS_SETSIZETO": "задати розмір %1", "LOOKS_SIZE": "розмір", "LOOKS_CHANGESTRETCHBY": "змінити розтяг на %1", "LOOKS_SETSTRETCHTO": "задати розтяг %1 %", "LOOKS_SWITCHCOSTUMETO": "змінити образ на %1", "LOOKS_NEXTCOSTUME": "наступний образ", "LOOKS_SWITCHBACKDROPTO": "змінити тло на %1", "LOOKS_GOTOFRONTBACK": "помістити на %1 план", "LOOKS_GOTOFRONTBACK_FRONT": "передній", "LOOKS_GOTOFRONTBACK_BACK": "задній", "LOOKS_GOFORWARDBACKWARDLAYERS": "перемістити %1 на %2 шар", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "вперед", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "назад", "LOOKS_BACKDROPNUMBERNAME": "тло %1", "LOOKS_COSTUMENUMBERNAME": "образ %1", "LOOKS_NUMBERNAME_NUMBER": "номер", "LOOKS_NUMBERNAME_NAME": "назва", "LOOKS_SWITCHBACKDROPTOANDWAIT": "змінити тло на %1 та чекати", "LOOKS_NEXTBACKDROP": "наступне тло", "LOOKS_PREVIOUSBACKDROP": "попереднє тло", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "перемістити на %1 кроків", "MOTION_TURNLEFT": "поворот %1 на %2 градусів", "MOTION_TURNRIGHT": "поворот %1 на %2 градусів", "MOTION_POINTINDIRECTION": "повернути в напрямку %1", "MOTION_POINTTOWARDS": "слідувати за %1", "MOTION_POINTTOWARDS_POINTER": "вказівник", "MOTION_GOTO": "перейти до %1", "MOTION_GOTO_POINTER": "вказівник", "MOTION_GOTO_RANDOM": "випадкова позиція", "MOTION_GOTOXY": "перемістити в x: %1 y: %2", "MOTION_GLIDESECSTOXY": "ковзати %1 сек до x: %2 y: %3", "MOTION_GLIDETO": "ковзати %1 сек до %2", "MOTION_GLIDETO_POINTER": "вказівник", "MOTION_GLIDETO_RANDOM": "випадкова позиція", "MOTION_CHANGEXBY": "змінити x на %1", "MOTION_SETX": "задати x %1", "MOTION_CHANGEYBY": "змінити y на %1", "MOTION_SETY": "задати y %1", "MOTION_IFONEDGEBOUNCE": "якщо на межі, відбити", "MOTION_SETROTATIONSTYLE": "стиль обертання %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "зліва-направо", "MOTION_SETROTATIONSTYLE_DONTROTATE": "не обертати", "MOTION_SETROTATIONSTYLE_ALLAROUND": "навколо", "MOTION_XPOSITION": "значення x", "MOTION_YPOSITION": "значення y", "MOTION_DIRECTION": "напрям", "MOTION_SCROLLRIGHT": "прокрутити праворуч %1", "MOTION_SCROLLUP": "прокрутити вгору %1", "MOTION_ALIGNSCENE": "вирівняти сцену %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "внизу-ліворуч", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "вниз-праворуч", "MOTION_ALIGNSCENE_MIDDLE": "посередині", "MOTION_ALIGNSCENE_TOPLEFT": "зверху-ліворуч", "MOTION_ALIGNSCENE_TOPRIGHT": "зверху-праворуч", "MOTION_XSCROLL": "x прокрутка", "MOTION_YSCROLL": "y прокрутка", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "випадкове від %1 до %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 і %2", "OPERATORS_OR": "%1 або %2", "OPERATORS_NOT": "не %1", "OPERATORS_JOIN": "з'єднати %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "символ %1 у %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "довжина %1", "OPERATORS_CONTAINS": "%1 містить %2?", "OPERATORS_MOD": "остача %1 на %2", "OPERATORS_ROUND": "округлити %1", "OPERATORS_MATHOP": "%1 з %2", "OPERATORS_MATHOP_ABS": "abs", "OPERATORS_MATHOP_FLOOR": "менше ціле", "OPERATORS_MATHOP_CEILING": "більше ціле", "OPERATORS_MATHOP_SQRT": "sqrt", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "визначити %1", "SENSING_TOUCHINGOBJECT": "доторкається %1?", "SENSING_TOUCHINGOBJECT_POINTER": "вказівник", "SENSING_TOUCHINGOBJECT_EDGE": "межа", "SENSING_TOUCHINGCOLOR": "доторкається кольору %1?", "SENSING_COLORISTOUCHINGCOLOR": "колір %1 торкається %2?", "SENSING_DISTANCETO": "відстань до %1", "SENSING_DISTANCETO_POINTER": "вказівник", "SENSING_ASKANDWAIT": "запитати %1 і чекати", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "відповідь", "SENSING_KEYPRESSED": "клавішу %1 натиснуто?", "SENSING_MOUSEDOWN": "мишку натиснуто?", "SENSING_MOUSEX": "мишка x", "SENSING_MOUSEY": "мишка y", "SENSING_SETDRAGMODE": "перетягувати %1", "SENSING_SETDRAGMODE_DRAGGABLE": "дозволено", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "не дозволено", "SENSING_LOUDNESS": "гучність", "SENSING_LOUD": "гучно?", "SENSING_TIMER": "таймер", "SENSING_RESETTIMER": "перезапустити таймер", "SENSING_OF": "%1 з %2", "SENSING_OF_XPOSITION": "значення x", "SENSING_OF_YPOSITION": "значення y", "SENSING_OF_DIRECTION": "напрям", "SENSING_OF_COSTUMENUMBER": "образ #", "SENSING_OF_COSTUMENAME": "ім’я образу", "SENSING_OF_SIZE": "розмір", "SENSING_OF_VOLUME": "гучність", "SENSING_OF_BACKDROPNUMBER": "тло #", "SENSING_OF_BACKDROPNAME": "ім’я тла", "SENSING_OF_STAGE": "Сцена", "SENSING_CURRENT": "сьогодні %1", "SENSING_CURRENT_YEAR": "рік", "SENSING_CURRENT_MONTH": "місяць", "SENSING_CURRENT_DATE": "дата", "SENSING_CURRENT_DAYOFWEEK": "день тижня", "SENSING_CURRENT_HOUR": "година", "SENSING_CURRENT_MINUTE": "хвилина ", "SENSING_CURRENT_SECOND": "секунда", "SENSING_DAYSSINCE2000": "днів після 2000", "SENSING_USERNAME": "користувач", "SENSING_USERID": "користувач ID", "SOUND_PLAY": "відтворити звук %1", "SOUND_PLAYUNTILDONE": "відтворити звук %1 до кінця", "SOUND_STOPALLSOUNDS": "зупини всі звуки", "SOUND_SETEFFECTO": "встановити ефект %1 в %2", "SOUND_CHANGEEFFECTBY": "змінити ефект %1 на %2", "SOUND_CLEAREFFECTS": "очистити звукові ефекти", "SOUND_EFFECTS_PITCH": "висота", "SOUND_EFFECTS_PAN": "панорама", "SOUND_CHANGEVOLUMEBY": "змінити гучність на %1", "SOUND_SETVOLUMETO": "встановити гучність %1%", "SOUND_VOLUME": "гучність", "CATEGORY_MOTION": "Рух", "CATEGORY_LOOKS": "Вигляд", "CATEGORY_SOUND": "Звук", "CATEGORY_EVENTS": "Події", "CATEGORY_CONTROL": "Керувати", "CATEGORY_SENSING": "Датчики", "CATEGORY_OPERATORS": "Оператори", "CATEGORY_VARIABLES": "Змінні", "CATEGORY_MYBLOCKS": "Мої блоки", "DUPLICATE": "Дублювати", "DELETE": "Вилучити", "ADD_COMMENT": "Додати коментар", "REMOVE_COMMENT": "Вилучити коментар", "DELETE_BLOCK": "Вилучити блок", "DELETE_X_BLOCKS": "Вилучити %1 блоки", "DELETE_ALL_BLOCKS": "Вилучити всі %1 блоки?", "CLEAN_UP": "Впорядкувати блоки", "HELP": "Допомога", "UNDO": "Скасувати", "REDO": "Повернути", "EDIT_PROCEDURE": "Правка", "SHOW_PROCEDURE_DEFINITION": "Перейти до визначення", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Скажіть щось...", "COLOUR_HUE_LABEL": "Колір", "COLOUR_SATURATION_LABEL": "Насиченість", "COLOUR_BRIGHTNESS_LABEL": "Яскравість", "CHANGE_VALUE_TITLE": "Змінити значення:", "RENAME_VARIABLE": "Перейменувати змінну", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Перейменувати змінну", "NEW_VARIABLE": "Створити змінну", "NEW_VARIABLE_TITLE": "Нове ім'я змінної:", "VARIABLE_MODAL_TITLE": "Нова змінна", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Створити блок", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Створити список", "NEW_LIST_TITLE": "Нове ім’я списку:", "LIST_MODAL_TITLE": "Новий список", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Перейменувати список", "NEW_BROADCAST_MESSAGE": "Нове повідомлення", "NEW_BROADCAST_MESSAGE_TITLE": "Нове ім’я повідомлення:", "BROADCAST_MODAL_TITLE": "Нове повідомлення", "DEFAULT_BROADCAST_MESSAGE_NAME": "повідомлення1" }; Blockly.ScratchMsgs.locales["vi"] = { "CONTROL_FOREVER": "mãi mãi", "CONTROL_REPEAT": "lặp lại %1", "CONTROL_IF": "nếu %1 thì", "CONTROL_ELSE": "nếu không thì ", "CONTROL_STOP": "dừng lại", "CONTROL_STOP_ALL": "tất cả", "CONTROL_STOP_THIS": "kịch bản này", "CONTROL_STOP_OTHER": "các kịch bản khác cho đối tượng ", "CONTROL_WAIT": "đợi %1 giây", "CONTROL_WAITUNTIL": "đợi đến khi %1", "CONTROL_REPEATUNTIL": "lặp lại cho đến khi %1", "CONTROL_WHILE": "trong khi %1", "CONTROL_FOREACH": "với mỗi %1 trong %2", "CONTROL_STARTASCLONE": "khi tôi bắt đầu là một bản sao", "CONTROL_CREATECLONEOF": "tạo bản sao của %1", "CONTROL_CREATECLONEOF_MYSELF": "bản thân tôi", "CONTROL_DELETETHISCLONE": "xóa bản sao này", "CONTROL_COUNTER": "bộ đếm", "CONTROL_INCRCOUNTER": "bộ đếm tăng dần", "CONTROL_CLEARCOUNTER": "xóa bộ đếm", "CONTROL_ALLATONCE": "tất cả cùng một lúc", "DATA_SETVARIABLETO": "đặt %1 thành %2", "DATA_CHANGEVARIABLEBY": "đổi %1 thành %2", "DATA_SHOWVARIABLE": "hiện biến số %1", "DATA_HIDEVARIABLE": "ẩn biến số %1", "DATA_ADDTOLIST": "thêm %1 vào %2", "DATA_DELETEOFLIST": "xóa %1 từ %2", "DATA_INSERTATLIST": "chèn %1 tại %2 của %3", "DATA_REPLACEITEMOFLIST": "thay phần tử %1 của %2 bằng %3", "DATA_ITEMOFLIST": "phần tử %1 của %2", "DATA_LENGTHOFLIST": "độ dày của %1", "DATA_LISTCONTAINSITEM": "%1 chứa %2?", "DATA_SHOWLIST": "hiện danh sách %1", "DATA_HIDELIST": "ăn danh sách %1", "DATA_INDEX_ALL": "tất cả", "DATA_INDEX_LAST": "cuối cùng", "DATA_INDEX_RANDOM": "ngẫu nhiên", "EVENT_WHENFLAGCLICKED": "Khi bấm vào %1", "EVENT_WHENTHISSPRITECLICKED": "Khi bấm vào đối tượng này", "EVENT_WHENSTAGECLICKED": "khi bấm vào phông nền", "EVENT_WHENTOUCHINGOBJECT": "Khi đối tượng này chạm vào %1", "EVENT_WHENBROADCASTRECEIVED": "khi tôi nhận %1", "EVENT_WHENBACKDROPSWITCHESTO": "khi phông nền chuyển thành %1", "EVENT_WHENGREATERTHAN": "khi %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "đồng hồ bấm giờ", "EVENT_BROADCAST": "phát tin %1", "EVENT_BROADCASTANDWAIT": "phát tin %1 và đợi", "EVENT_WHENKEYPRESSED": "khi bấm phím %1", "EVENT_WHENKEYPRESSED_SPACE": "khoảng cách", "EVENT_WHENKEYPRESSED_LEFT": "mũi tên bên trái", "EVENT_WHENKEYPRESSED_RIGHT": "mũi tên sang phải", "EVENT_WHENKEYPRESSED_DOWN": "mũi tên xuống", "EVENT_WHENKEYPRESSED_UP": "mũi tên lên", "EVENT_WHENKEYPRESSED_ANY": "bất kỳ", "LOOKS_SAYFORSECS": "nói %1 trong %2 giây", "LOOKS_SAY": "nói %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "nghĩ %1 trong %2 giây", "LOOKS_THINK": "nghĩ %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "hiển thị", "LOOKS_HIDE": "ẩn", "LOOKS_HIDEALLSPRITES": "ẩn tất cả đối tượng", "LOOKS_EFFECT_COLOR": "màu", "LOOKS_EFFECT_FISHEYE": "gương cầu", "LOOKS_EFFECT_WHIRL": "xoay", "LOOKS_EFFECT_PIXELATE": "nhòe", "LOOKS_EFFECT_MOSAIC": "khảm", "LOOKS_EFFECT_BRIGHTNESS": "độ sáng", "LOOKS_EFFECT_GHOST": "bóng ma", "LOOKS_CHANGEEFFECTBY": "đổi hiệu ứng %1 thành %2", "LOOKS_SETEFFECTTO": "đặt hiệu ứng %1 thành %2", "LOOKS_CLEARGRAPHICEFFECTS": "bỏ các hiệu ứng đồ họa", "LOOKS_CHANGESIZEBY": "đổi kích thước thành %1", "LOOKS_SETSIZETO": "đặt kích thước bằng %1 %", "LOOKS_SIZE": "kích thước", "LOOKS_CHANGESTRETCHBY": "đổi kéo căng bằng %1", "LOOKS_SETSTRETCHTO": "đặt kéo căng thành %1 %", "LOOKS_SWITCHCOSTUMETO": "đổi trang phục thành %1", "LOOKS_NEXTCOSTUME": "trang phục kế tiếp", "LOOKS_SWITCHBACKDROPTO": "đổi phông nền thành %1", "LOOKS_GOTOFRONTBACK": "đi tới layer %1", "LOOKS_GOTOFRONTBACK_FRONT": "mặt trước", "LOOKS_GOTOFRONTBACK_BACK": "mặt sau", "LOOKS_GOFORWARDBACKWARDLAYERS": "đi %1 %2 lớp", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "tới", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "lùi", "LOOKS_BACKDROPNUMBERNAME": "phông nền %1", "LOOKS_COSTUMENUMBERNAME": "trang phục %1", "LOOKS_NUMBERNAME_NUMBER": "số", "LOOKS_NUMBERNAME_NAME": "tên", "LOOKS_SWITCHBACKDROPTOANDWAIT": "đổi phông nền thành %1 và đợi", "LOOKS_NEXTBACKDROP": "phông nền tiếp theo", "LOOKS_PREVIOUSBACKDROP": "phông nền trước", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "di chuyển %1 bước", "MOTION_TURNLEFT": "xoay %1 %2 độ", "MOTION_TURNRIGHT": "xoay %1 %2 độ", "MOTION_POINTINDIRECTION": "hướng về phía %1", "MOTION_POINTTOWARDS": "hướng về %1", "MOTION_POINTTOWARDS_POINTER": "con trỏ chuột", "MOTION_GOTO": "đi tới %1", "MOTION_GOTO_POINTER": "con trỏ chuột", "MOTION_GOTO_RANDOM": "vị trí ngẫu nhiên", "MOTION_GOTOXY": "đi tới điểm x: %1 y: %2", "MOTION_GLIDESECSTOXY": "lướt trong %1 giây tới điểm x: %2 y: %3", "MOTION_GLIDETO": "lướt trong %1 giây tới %2", "MOTION_GLIDETO_POINTER": "con trỏ chuột", "MOTION_GLIDETO_RANDOM": "vị trí ngẫu nhiên", "MOTION_CHANGEXBY": "đổi x bằng %1", "MOTION_SETX": "đặt x bằng %1", "MOTION_CHANGEYBY": "đổi y bằng %1", "MOTION_SETY": "đặt y bằng %1", "MOTION_IFONEDGEBOUNCE": "nếu tiếp xúc với cạnh, bật lại", "MOTION_SETROTATIONSTYLE": "đặt kiểu xoay %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "trái - phải", "MOTION_SETROTATIONSTYLE_DONTROTATE": "không xoay", "MOTION_SETROTATIONSTYLE_ALLAROUND": "tất cả xung quanh", "MOTION_XPOSITION": "hoành độ", "MOTION_YPOSITION": "tung độ", "MOTION_DIRECTION": "hướng", "MOTION_SCROLLRIGHT": "cuộn phải %1", "MOTION_SCROLLUP": "cuộn lên %1", "MOTION_ALIGNSCENE": "căn chỉnh phân cảnh %1", "MOTION_ALIGNSCENE_BOTTOMLEFT": "góc trái dưới", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "góc phải dưới", "MOTION_ALIGNSCENE_MIDDLE": "giữa", "MOTION_ALIGNSCENE_TOPLEFT": "góc trái trên", "MOTION_ALIGNSCENE_TOPRIGHT": "góc phải trên", "MOTION_XSCROLL": "cuộn x", "MOTION_YSCROLL": "cuộn y", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "lấy ngẫu nhiên từ %1 đến %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 và %2", "OPERATORS_OR": "%1 hoặc %2", "OPERATORS_NOT": "không phải %1", "OPERATORS_JOIN": "kết hợp %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "ký tự %1 của %2", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "độ dài của %1", "OPERATORS_CONTAINS": "%1 chứa %2?", "OPERATORS_MOD": "%1 chia lấy dư %2", "OPERATORS_ROUND": "làm tròn %1", "OPERATORS_MATHOP": "%1 của %2", "OPERATORS_MATHOP_ABS": "giá trị tuyệt đối", "OPERATORS_MATHOP_FLOOR": "làm tròn xuống", "OPERATORS_MATHOP_CEILING": "trần", "OPERATORS_MATHOP_SQRT": "căn bậc hai", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "trong", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "định nghĩa %1", "SENSING_TOUCHINGOBJECT": "đang chạm %1?", "SENSING_TOUCHINGOBJECT_POINTER": "con trỏ chuột", "SENSING_TOUCHINGOBJECT_EDGE": "cạnh", "SENSING_TOUCHINGCOLOR": "đang chạm màu %1?", "SENSING_COLORISTOUCHINGCOLOR": "màu %1 đang chạm %2?", "SENSING_DISTANCETO": "khoảng cách đến %1", "SENSING_DISTANCETO_POINTER": "con trỏ chuột", "SENSING_ASKANDWAIT": "hỏi %1 và đợi", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "trả lời", "SENSING_KEYPRESSED": "phím %1 được bấm?", "SENSING_MOUSEDOWN": "chuột được nhấn?", "SENSING_MOUSEX": "hoành độ con trỏ chuột", "SENSING_MOUSEY": "tung độ con trỏ chuột", "SENSING_SETDRAGMODE": "đặt chế độ kéo %1", "SENSING_SETDRAGMODE_DRAGGABLE": "kéo thả được", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "không kéo thả được", "SENSING_LOUDNESS": "độ ồn", "SENSING_LOUD": "tiếng to?", "SENSING_TIMER": "đồng hồ bấm giờ", "SENSING_RESETTIMER": "đặt lại đống hồ bấm giờ", "SENSING_OF": "%1 của %2", "SENSING_OF_XPOSITION": "hoành độ", "SENSING_OF_YPOSITION": "tung độ", "SENSING_OF_DIRECTION": "hướng", "SENSING_OF_COSTUMENUMBER": "trang phục #", "SENSING_OF_COSTUMENAME": "tên trang phục", "SENSING_OF_SIZE": "kích thước", "SENSING_OF_VOLUME": "âm lượng", "SENSING_OF_BACKDROPNUMBER": "phông nền #", "SENSING_OF_BACKDROPNAME": "tên phông nền", "SENSING_OF_STAGE": "Sân khấu", "SENSING_CURRENT": "dòng %1", "SENSING_CURRENT_YEAR": "năm", "SENSING_CURRENT_MONTH": "tháng", "SENSING_CURRENT_DATE": "ngày", "SENSING_CURRENT_DAYOFWEEK": "ngày trong tuần", "SENSING_CURRENT_HOUR": "giờ", "SENSING_CURRENT_MINUTE": "phút", "SENSING_CURRENT_SECOND": "giây", "SENSING_DAYSSINCE2000": "ngày từ năm 2000", "SENSING_USERNAME": "tên đăng nhập", "SENSING_USERID": "id người dùng", "SOUND_PLAY": "bắt đầu âm thanh %1", "SOUND_PLAYUNTILDONE": "phát âm thanh %1 đến hết", "SOUND_STOPALLSOUNDS": "ngừng mọi âm thanh", "SOUND_SETEFFECTO": "đặt hiệu ứng %1 là %2", "SOUND_CHANGEEFFECTBY": "đổi hiệu ứng %1 bằng %2", "SOUND_CLEAREFFECTS": "xóa hiệu ứng âm thanh", "SOUND_EFFECTS_PITCH": "cao độ", "SOUND_EFFECTS_PAN": "pan trái/phải", "SOUND_CHANGEVOLUMEBY": "đổi âm lượng %1", "SOUND_SETVOLUMETO": "đặt âm lượng %1%", "SOUND_VOLUME": "âm lượng", "CATEGORY_MOTION": "Chuyển động", "CATEGORY_LOOKS": "Hiển thị", "CATEGORY_SOUND": "Âm thanh", "CATEGORY_EVENTS": "Sự kiện", "CATEGORY_CONTROL": "Điều khiển", "CATEGORY_SENSING": "Cảm biến", "CATEGORY_OPERATORS": "Các phép toán", "CATEGORY_VARIABLES": "Các biến số", "CATEGORY_MYBLOCKS": "My Blocks", "DUPLICATE": "Nhân bản", "DELETE": "Xóa", "ADD_COMMENT": "Thêm chú thích", "REMOVE_COMMENT": "Xóa chú thích", "DELETE_BLOCK": "Xóa khối", "DELETE_X_BLOCKS": "Xóa %1 khối", "DELETE_ALL_BLOCKS": "Delete all %1 blocks?", "CLEAN_UP": "Clean up Blocks", "HELP": "Trợ giúp", "UNDO": "Hoàn tác", "REDO": "Làm lại ", "EDIT_PROCEDURE": "Chỉnh sửa", "SHOW_PROCEDURE_DEFINITION": "Go to definition", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Nói gì đó...", "COLOUR_HUE_LABEL": "Màu sắc", "COLOUR_SATURATION_LABEL": "Độ bão hòa", "COLOUR_BRIGHTNESS_LABEL": "Độ sáng", "CHANGE_VALUE_TITLE": "Thay đổi giá trị:", "RENAME_VARIABLE": "Đặt tên cho biến", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "Đặt tên biến", "NEW_VARIABLE": "Tạo một biến", "NEW_VARIABLE_TITLE": "Tên biến mới:", "VARIABLE_MODAL_TITLE": "Biến số mới", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "Tạo một mảnh ghép", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "Tạo một Danh sách", "NEW_LIST_TITLE": "Tên danh sách mới:", "LIST_MODAL_TITLE": "Danh sách mới", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "Đặt tên danh sách", "NEW_BROADCAST_MESSAGE": "Thông báo mới", "NEW_BROADCAST_MESSAGE_TITLE": "Tên thông báo mới:", "BROADCAST_MODAL_TITLE": "Tin nhắn mới", "DEFAULT_BROADCAST_MESSAGE_NAME": "tin nhắn 1" }; Blockly.ScratchMsgs.locales["zh-cn"] = { "CONTROL_FOREVER": "重复执行", "CONTROL_REPEAT": "重复执行 %1 次", "CONTROL_IF": "如果 %1 那么", "CONTROL_ELSE": "否则", "CONTROL_STOP": "停止", "CONTROL_STOP_ALL": "全部脚本", "CONTROL_STOP_THIS": "这个脚本", "CONTROL_STOP_OTHER": "该角色的其他脚本", "CONTROL_WAIT": "等待 %1 秒", "CONTROL_WAITUNTIL": "等待 %1", "CONTROL_REPEATUNTIL": "重复执行直到 %1", "CONTROL_WHILE": "当 %1 重复执行", "CONTROL_FOREACH": "对于 %2 中的每个 %1", "CONTROL_STARTASCLONE": "当作为克隆体启动时", "CONTROL_CREATECLONEOF": "克隆 %1", "CONTROL_CREATECLONEOF_MYSELF": "自己", "CONTROL_DELETETHISCLONE": "删除此克隆体", "CONTROL_COUNTER": "计数器", "CONTROL_INCRCOUNTER": "计数器加一", "CONTROL_CLEARCOUNTER": "计数器归零", "CONTROL_ALLATONCE": "所有脚本", "DATA_SETVARIABLETO": "将 %1 设为 %2", "DATA_CHANGEVARIABLEBY": "将 %1 增加 %2", "DATA_SHOWVARIABLE": "显示变量 %1", "DATA_HIDEVARIABLE": "隐藏变量 %1", "DATA_ADDTOLIST": "将 %1 加入 %2", "DATA_DELETEOFLIST": "删除 %2 的第 %1 项", "DATA_INSERTATLIST": "在 %3 的第 %2 项插入 %1", "DATA_REPLACEITEMOFLIST": "将 %2 的第 %1 项替换为 %3", "DATA_ITEMOFLIST": "%2 的第 %1 项", "DATA_LENGTHOFLIST": "%1 的项目数", "DATA_LISTCONTAINSITEM": "%1 包含 %2 ?", "DATA_SHOWLIST": "显示列表 %1", "DATA_HIDELIST": "隐藏列表 %1", "DATA_INDEX_ALL": "全部", "DATA_INDEX_LAST": "末尾", "DATA_INDEX_RANDOM": "随机", "EVENT_WHENFLAGCLICKED": "当 %1 被点击", "EVENT_WHENTHISSPRITECLICKED": "当角色被点击", "EVENT_WHENSTAGECLICKED": "当舞台被点击", "EVENT_WHENTOUCHINGOBJECT": "当该角色碰到 %1", "EVENT_WHENBROADCASTRECEIVED": "当接收到 %1", "EVENT_WHENBACKDROPSWITCHESTO": "当背景换成 %1", "EVENT_WHENGREATERTHAN": "当 %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "计时器", "EVENT_BROADCAST": "广播 %1", "EVENT_BROADCASTANDWAIT": "广播 %1 并等待", "EVENT_WHENKEYPRESSED": "当按下 %1 键", "EVENT_WHENKEYPRESSED_SPACE": "空格", "EVENT_WHENKEYPRESSED_LEFT": "←", "EVENT_WHENKEYPRESSED_RIGHT": "→", "EVENT_WHENKEYPRESSED_DOWN": "↓", "EVENT_WHENKEYPRESSED_UP": "↑", "EVENT_WHENKEYPRESSED_ANY": "任意", "LOOKS_SAYFORSECS": "说 %1 %2 秒", "LOOKS_SAY": "说 %1", "LOOKS_HELLO": "你好!", "LOOKS_THINKFORSECS": "思考 %1 %2 秒", "LOOKS_THINK": "思考 %1", "LOOKS_HMM": "嗯……", "LOOKS_SHOW": "显示", "LOOKS_HIDE": "隐藏", "LOOKS_HIDEALLSPRITES": "隐藏所有角色", "LOOKS_EFFECT_COLOR": "颜色", "LOOKS_EFFECT_FISHEYE": "鱼眼", "LOOKS_EFFECT_WHIRL": "漩涡", "LOOKS_EFFECT_PIXELATE": "像素化", "LOOKS_EFFECT_MOSAIC": "马赛克", "LOOKS_EFFECT_BRIGHTNESS": "亮度", "LOOKS_EFFECT_GHOST": "虚像", "LOOKS_CHANGEEFFECTBY": "将 %1 特效增加 %2", "LOOKS_SETEFFECTTO": "将 %1 特效设定为 %2", "LOOKS_CLEARGRAPHICEFFECTS": "清除图形特效", "LOOKS_CHANGESIZEBY": "将大小增加 %1", "LOOKS_SETSIZETO": "将大小设为 %1", "LOOKS_SIZE": "大小", "LOOKS_CHANGESTRETCHBY": "伸缩%1", "LOOKS_SETSTRETCHTO": "设置伸缩为%1 %", "LOOKS_SWITCHCOSTUMETO": "换成 %1 造型", "LOOKS_NEXTCOSTUME": "下一个造型", "LOOKS_SWITCHBACKDROPTO": "换成 %1 背景", "LOOKS_GOTOFRONTBACK": "移到最 %1 ", "LOOKS_GOTOFRONTBACK_FRONT": "前面", "LOOKS_GOTOFRONTBACK_BACK": "后面", "LOOKS_GOFORWARDBACKWARDLAYERS": "%1 %2 层", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "前移", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "后移", "LOOKS_BACKDROPNUMBERNAME": "背景 %1", "LOOKS_COSTUMENUMBERNAME": "造型 %1", "LOOKS_NUMBERNAME_NUMBER": "编号", "LOOKS_NUMBERNAME_NAME": "名称", "LOOKS_SWITCHBACKDROPTOANDWAIT": "换成 %1 背景并等待", "LOOKS_NEXTBACKDROP": "下一个背景", "LOOKS_PREVIOUSBACKDROP": "上一个背景", "LOOKS_RANDOMBACKDROP": "随机背景", "MOTION_MOVESTEPS": "移动 %1 步", "MOTION_TURNLEFT": "左转 %1 %2 度", "MOTION_TURNRIGHT": "右转 %1 %2 度", "MOTION_POINTINDIRECTION": "面向 %1 方向", "MOTION_POINTTOWARDS": "面向 %1", "MOTION_POINTTOWARDS_POINTER": "鼠标指针", "MOTION_GOTO": "移到 %1", "MOTION_GOTO_POINTER": "鼠标指针", "MOTION_GOTO_RANDOM": "随机位置", "MOTION_GOTOXY": "移到x: %1 y: %2", "MOTION_GLIDESECSTOXY": "在 %1 秒内滑行到x: %2 y: %3", "MOTION_GLIDETO": "在 %1 秒内滑行到 %2", "MOTION_GLIDETO_POINTER": "鼠标指针", "MOTION_GLIDETO_RANDOM": "随机位置", "MOTION_CHANGEXBY": "将x坐标增加 %1", "MOTION_SETX": "将x坐标设为 %1", "MOTION_CHANGEYBY": "将y坐标增加 %1", "MOTION_SETY": "将y坐标设为 %1", "MOTION_IFONEDGEBOUNCE": "碰到边缘就反弹", "MOTION_SETROTATIONSTYLE": "将旋转方式设为 %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "左右翻转", "MOTION_SETROTATIONSTYLE_DONTROTATE": "不可旋转", "MOTION_SETROTATIONSTYLE_ALLAROUND": "任意旋转", "MOTION_XPOSITION": "x 坐标", "MOTION_YPOSITION": "y 坐标", "MOTION_DIRECTION": "方向", "MOTION_SCROLLRIGHT": "向右滚动到 %1 的位置", "MOTION_SCROLLUP": "向上滚动到 %1 的位置", "MOTION_ALIGNSCENE": "和场景 %1 对齐", "MOTION_ALIGNSCENE_BOTTOMLEFT": "左下角", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "右下角", "MOTION_ALIGNSCENE_MIDDLE": "中间", "MOTION_ALIGNSCENE_TOPLEFT": "左上角", "MOTION_ALIGNSCENE_TOPRIGHT": "右上角", "MOTION_XSCROLL": "x滚动位置", "MOTION_YSCROLL": "y滚动位置", "MOTION_STAGE_SELECTED": "选中了舞台:不可使用运动类积木", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "在 %1 和 %2 之间取随机数", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 和 %2", "OPERATORS_OR": "%1 或 %2", "OPERATORS_NOT": "%1 不成立", "OPERATORS_JOIN": "连接 %1 和 %2", "OPERATORS_JOIN_APPLE": "苹果", "OPERATORS_JOIN_BANANA": "香蕉", "OPERATORS_LETTEROF": "%2 的第 %1 个字符", "OPERATORS_LETTEROF_APPLE": "果", "OPERATORS_LENGTH": "%1 的字符数", "OPERATORS_CONTAINS": "%1 包含 %2 ?", "OPERATORS_MOD": "%1 除以 %2 的余数", "OPERATORS_ROUND": "四舍五入 %1", "OPERATORS_MATHOP": "%1 %2", "OPERATORS_MATHOP_ABS": "绝对值", "OPERATORS_MATHOP_FLOOR": "向下取整", "OPERATORS_MATHOP_CEILING": "向上取整", "OPERATORS_MATHOP_SQRT": "平方根", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "定义 %1", "SENSING_TOUCHINGOBJECT": "碰到 %1 ?", "SENSING_TOUCHINGOBJECT_POINTER": "鼠标指针", "SENSING_TOUCHINGOBJECT_EDGE": "舞台边缘", "SENSING_TOUCHINGCOLOR": "碰到颜色 %1 ?", "SENSING_COLORISTOUCHINGCOLOR": "颜色 %1 碰到 %2 ?", "SENSING_DISTANCETO": "到 %1 的距离", "SENSING_DISTANCETO_POINTER": "鼠标指针", "SENSING_ASKANDWAIT": "询问 %1 并等待", "SENSING_ASK_TEXT": "你叫什么名字?", "SENSING_ANSWER": "回答", "SENSING_KEYPRESSED": "按下 %1 键?", "SENSING_MOUSEDOWN": "按下鼠标?", "SENSING_MOUSEX": "鼠标的x坐标", "SENSING_MOUSEY": "鼠标的y坐标", "SENSING_SETDRAGMODE": "将拖动模式设为 %1", "SENSING_SETDRAGMODE_DRAGGABLE": "可拖动", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "不可拖动", "SENSING_LOUDNESS": "响度", "SENSING_LOUD": "响声?", "SENSING_TIMER": "计时器", "SENSING_RESETTIMER": "计时器归零", "SENSING_OF": "%2 的 %1", "SENSING_OF_XPOSITION": "x 坐标", "SENSING_OF_YPOSITION": "y 坐标", "SENSING_OF_DIRECTION": "方向", "SENSING_OF_COSTUMENUMBER": "造型编号", "SENSING_OF_COSTUMENAME": "造型名称", "SENSING_OF_SIZE": "大小", "SENSING_OF_VOLUME": "音量", "SENSING_OF_BACKDROPNUMBER": "背景编号", "SENSING_OF_BACKDROPNAME": "背景名称", "SENSING_OF_STAGE": "舞台", "SENSING_CURRENT": "当前时间的 %1", "SENSING_CURRENT_YEAR": "年", "SENSING_CURRENT_MONTH": "月", "SENSING_CURRENT_DATE": "日", "SENSING_CURRENT_DAYOFWEEK": "星期", "SENSING_CURRENT_HOUR": "时", "SENSING_CURRENT_MINUTE": "分", "SENSING_CURRENT_SECOND": "秒", "SENSING_DAYSSINCE2000": "2000年至今的天数", "SENSING_USERNAME": "用户名", "SENSING_USERID": "用户id", "SOUND_PLAY": "播放声音 %1", "SOUND_PLAYUNTILDONE": "播放声音 %1 等待播完", "SOUND_STOPALLSOUNDS": "停止所有声音", "SOUND_SETEFFECTO": "将 %1 音效设为 %2", "SOUND_CHANGEEFFECTBY": "将 %1 音效增加 %2", "SOUND_CLEAREFFECTS": "停止播放所有声音", "SOUND_EFFECTS_PITCH": "音调", "SOUND_EFFECTS_PAN": "左右平衡", "SOUND_CHANGEVOLUMEBY": "将音量增加 %1", "SOUND_SETVOLUMETO": "将音量设为 %1%", "SOUND_VOLUME": "音量", "CATEGORY_MOTION": "运动", "CATEGORY_LOOKS": "外观", "CATEGORY_SOUND": "声音", "CATEGORY_EVENTS": "事件", "CATEGORY_CONTROL": "控制", "CATEGORY_SENSING": "侦测", "CATEGORY_OPERATORS": "运算", "CATEGORY_VARIABLES": "变量", "CATEGORY_MYBLOCKS": "自定义积木", "DUPLICATE": "复制", "DELETE": "删除", "ADD_COMMENT": "添加注释", "REMOVE_COMMENT": "删除注释", "DELETE_BLOCK": "删除", "DELETE_X_BLOCKS": "删除 %1 积木", "DELETE_ALL_BLOCKS": "删除全部 %1 积木?", "CLEAN_UP": "整理积木", "HELP": "帮助", "UNDO": "撤销", "REDO": "重做", "EDIT_PROCEDURE": "编辑", "SHOW_PROCEDURE_DEFINITION": "查看定义", "WORKSPACE_COMMENT_DEFAULT_TEXT": "说些什么……", "COLOUR_HUE_LABEL": "颜色", "COLOUR_SATURATION_LABEL": "饱和度", "COLOUR_BRIGHTNESS_LABEL": "亮度", "CHANGE_VALUE_TITLE": "更改变量:", "RENAME_VARIABLE": "修改变量名", "RENAME_VARIABLE_TITLE": "将所有的「%1」变量名改为:", "RENAME_VARIABLE_MODAL_TITLE": "修改变量名", "NEW_VARIABLE": "建立一个变量", "NEW_VARIABLE_TITLE": "新变量名:", "VARIABLE_MODAL_TITLE": "新建变量", "VARIABLE_ALREADY_EXISTS": "已经存在名为「%1」的变量。", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "已经存在一个名为「%1」的变量,其类型为「%2」。", "DELETE_VARIABLE_CONFIRMATION": "删除%1处「%2」变量吗?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "无法删除变量「%1」,因为函数「%2」的定义中用到了它", "DELETE_VARIABLE": "删除变量「%1」", "NEW_PROCEDURE": "制作新的积木", "PROCEDURE_ALREADY_EXISTS": "已经存在名为「%1」的程序。", "NEW_LIST": "建立一个列表", "NEW_LIST_TITLE": "新的列表名:", "LIST_MODAL_TITLE": "新建列表", "LIST_ALREADY_EXISTS": "名为 「%1」 的列表已存在。", "RENAME_LIST_TITLE": "将所有的「%1」的列表名改为:", "RENAME_LIST_MODAL_TITLE": "修改列表名", "NEW_BROADCAST_MESSAGE": "新消息", "NEW_BROADCAST_MESSAGE_TITLE": "新消息的名称:", "BROADCAST_MODAL_TITLE": "新消息", "DEFAULT_BROADCAST_MESSAGE_NAME": "消息1" }; Blockly.ScratchMsgs.locales["zh-tw"] = { "CONTROL_FOREVER": "重複無限次", "CONTROL_REPEAT": "重複 %1 次", "CONTROL_IF": "如果 %1 那麼", "CONTROL_ELSE": "否則", "CONTROL_STOP": "停止", "CONTROL_STOP_ALL": "全部", "CONTROL_STOP_THIS": "這個程式", "CONTROL_STOP_OTHER": "角色的其它程式", "CONTROL_WAIT": "等待 %1 秒", "CONTROL_WAITUNTIL": "等待直到 %1", "CONTROL_REPEATUNTIL": "重複直到 %1", "CONTROL_WHILE": "當 %1", "CONTROL_FOREACH": "計數 %1 於 %2", "CONTROL_STARTASCLONE": "當分身產生", "CONTROL_CREATECLONEOF": "建立 %1 的分身", "CONTROL_CREATECLONEOF_MYSELF": "自己", "CONTROL_DELETETHISCLONE": "分身刪除", "CONTROL_COUNTER": "計數器", "CONTROL_INCRCOUNTER": "計數器累計", "CONTROL_CLEARCOUNTER": "計數器重置", "CONTROL_ALLATONCE": "全部一起", "DATA_SETVARIABLETO": "%1 設為 %2", "DATA_CHANGEVARIABLEBY": "%1 改變 %2", "DATA_SHOWVARIABLE": "變數 %1 顯示", "DATA_HIDEVARIABLE": "變數 %1 隱藏", "DATA_ADDTOLIST": "添加 %1 到 %2", "DATA_DELETEOFLIST": "刪除 %2 的第 %1 項", "DATA_INSERTATLIST": "插入 %1 到 %3 的第 %2 項", "DATA_REPLACEITEMOFLIST": "替換 %2 的第 %1 項為 %3", "DATA_ITEMOFLIST": "%2 的第 %1 項", "DATA_LENGTHOFLIST": "清單 %1 的長度", "DATA_LISTCONTAINSITEM": "清單 %1 包含 %2?", "DATA_SHOWLIST": "清單 %1 顯示", "DATA_HIDELIST": "清單 %1 隱藏", "DATA_INDEX_ALL": "全部", "DATA_INDEX_LAST": "末", "DATA_INDEX_RANDOM": "隨機", "EVENT_WHENFLAGCLICKED": "當 %1 被點擊", "EVENT_WHENTHISSPRITECLICKED": "當角色被點擊", "EVENT_WHENSTAGECLICKED": "當舞台被點擊", "EVENT_WHENTOUCHINGOBJECT": "當角色碰到 %1", "EVENT_WHENBROADCASTRECEIVED": "當收到訊息 %1", "EVENT_WHENBACKDROPSWITCHESTO": "當背景換成 %1", "EVENT_WHENGREATERTHAN": "當 %1 > %2", "EVENT_WHENGREATERTHAN_TIMER": "計時器", "EVENT_BROADCAST": "廣播訊息 %1", "EVENT_BROADCASTANDWAIT": "廣播訊息 %1 並等待", "EVENT_WHENKEYPRESSED": "當 %1 鍵被按下", "EVENT_WHENKEYPRESSED_SPACE": "空白", "EVENT_WHENKEYPRESSED_LEFT": "向左", "EVENT_WHENKEYPRESSED_RIGHT": "向右", "EVENT_WHENKEYPRESSED_DOWN": "向下", "EVENT_WHENKEYPRESSED_UP": "向上", "EVENT_WHENKEYPRESSED_ANY": "任何", "LOOKS_SAYFORSECS": "說出 %1 %2 秒", "LOOKS_SAY": "說出 %1", "LOOKS_HELLO": "Hello!", "LOOKS_THINKFORSECS": "想著 %1 %2 秒", "LOOKS_THINK": "想著 %1", "LOOKS_HMM": "Hmm...", "LOOKS_SHOW": "顯示", "LOOKS_HIDE": "隱藏", "LOOKS_HIDEALLSPRITES": "隱藏所有角色", "LOOKS_EFFECT_COLOR": "顏色", "LOOKS_EFFECT_FISHEYE": "魚眼", "LOOKS_EFFECT_WHIRL": "漩渦", "LOOKS_EFFECT_PIXELATE": "像素化", "LOOKS_EFFECT_MOSAIC": "馬賽克", "LOOKS_EFFECT_BRIGHTNESS": "亮度", "LOOKS_EFFECT_GHOST": "幻影", "LOOKS_CHANGEEFFECTBY": "圖像效果 %1 改變 %2", "LOOKS_SETEFFECTTO": "圖像效果 %1 設為 %2", "LOOKS_CLEARGRAPHICEFFECTS": "圖像效果清除", "LOOKS_CHANGESIZEBY": "尺寸改變 %1", "LOOKS_SETSIZETO": "尺寸設為 %1 %", "LOOKS_SIZE": "尺寸", "LOOKS_CHANGESTRETCHBY": "伸縮改變 %1", "LOOKS_SETSTRETCHTO": "伸縮設為 %1 %", "LOOKS_SWITCHCOSTUMETO": "造型換成 %1", "LOOKS_NEXTCOSTUME": "下一個造型", "LOOKS_SWITCHBACKDROPTO": "背景換成 %1", "LOOKS_GOTOFRONTBACK": "圖層移到 %1 層", "LOOKS_GOTOFRONTBACK_FRONT": "最上", "LOOKS_GOTOFRONTBACK_BACK": "最下", "LOOKS_GOFORWARDBACKWARDLAYERS": "圖層 %1 移 %2 層", "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "上", "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "下", "LOOKS_BACKDROPNUMBERNAME": "背景 %1", "LOOKS_COSTUMENUMBERNAME": "造型 %1", "LOOKS_NUMBERNAME_NUMBER": "編號", "LOOKS_NUMBERNAME_NAME": "名稱", "LOOKS_SWITCHBACKDROPTOANDWAIT": "背景換成 %1 並等待", "LOOKS_NEXTBACKDROP": "下一個背景", "LOOKS_PREVIOUSBACKDROP": "上一個背景", "LOOKS_RANDOMBACKDROP": "random backdrop", "MOTION_MOVESTEPS": "移動 %1 點", "MOTION_TURNLEFT": "左轉 %1 %2 度", "MOTION_TURNRIGHT": "右轉 %1 %2 度", "MOTION_POINTINDIRECTION": "面朝 %1 度", "MOTION_POINTTOWARDS": "面朝 %1 向", "MOTION_POINTTOWARDS_POINTER": "鼠標", "MOTION_GOTO": "定位到 %1 位置", "MOTION_GOTO_POINTER": "鼠標", "MOTION_GOTO_RANDOM": "隨機", "MOTION_GOTOXY": "定位到 x:%1 y:%2", "MOTION_GLIDESECSTOXY": "滑行 %1 秒到 x:%2 y:%3", "MOTION_GLIDETO": "滑行 %1 秒到 %2 位置", "MOTION_GLIDETO_POINTER": "鼠標", "MOTION_GLIDETO_RANDOM": "隨機", "MOTION_CHANGEXBY": "x 改變 %1", "MOTION_SETX": "x 設為 %1", "MOTION_CHANGEYBY": "y 改變 %1", "MOTION_SETY": "y 設為 %1", "MOTION_IFONEDGEBOUNCE": "碰到邊緣就反彈", "MOTION_SETROTATIONSTYLE": "迴轉方式設為 %1", "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "左-右", "MOTION_SETROTATIONSTYLE_DONTROTATE": "不旋轉", "MOTION_SETROTATIONSTYLE_ALLAROUND": "不設限", "MOTION_XPOSITION": "x 座標", "MOTION_YPOSITION": "y 座標", "MOTION_DIRECTION": "方向", "MOTION_SCROLLRIGHT": "滾動向右 %1", "MOTION_SCROLLUP": "滾動向上 %1", "MOTION_ALIGNSCENE": "場景 %1 對齊", "MOTION_ALIGNSCENE_BOTTOMLEFT": "左下", "MOTION_ALIGNSCENE_BOTTOMRIGHT": "右下", "MOTION_ALIGNSCENE_MIDDLE": "中間", "MOTION_ALIGNSCENE_TOPLEFT": "左上", "MOTION_ALIGNSCENE_TOPRIGHT": "右上", "MOTION_XSCROLL": "x 捲軸", "MOTION_YSCROLL": "y 捲軸", "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", "OPERATORS_ADD": "%1 + %2", "OPERATORS_SUBTRACT": "%1 - %2", "OPERATORS_MULTIPLY": "%1 * %2", "OPERATORS_DIVIDE": "%1 / %2", "OPERATORS_RANDOM": "隨機取數 %1 到 %2", "OPERATORS_GT": "%1 > %2", "OPERATORS_LT": "%1 < %2", "OPERATORS_EQUALS": "%1 = %2", "OPERATORS_AND": "%1 且 %2", "OPERATORS_OR": "%1 或 %2", "OPERATORS_NOT": "%1 不成立", "OPERATORS_JOIN": "字串組合 %1 %2", "OPERATORS_JOIN_APPLE": "apple", "OPERATORS_JOIN_BANANA": "banana", "OPERATORS_LETTEROF": "字串 %2 的第 %1 字", "OPERATORS_LETTEROF_APPLE": "a", "OPERATORS_LENGTH": "字串 %1 的長度", "OPERATORS_CONTAINS": "字串 %1 包含 %2?", "OPERATORS_MOD": "%1 除以 %2 的餘數", "OPERATORS_ROUND": "四捨五入數值 %1", "OPERATORS_MATHOP": "%1 數值 %2", "OPERATORS_MATHOP_ABS": "絕對值", "OPERATORS_MATHOP_FLOOR": "無條件捨去", "OPERATORS_MATHOP_CEILING": "無條件進位", "OPERATORS_MATHOP_SQRT": "平方根", "OPERATORS_MATHOP_SIN": "sin", "OPERATORS_MATHOP_COS": "cos", "OPERATORS_MATHOP_TAN": "tan", "OPERATORS_MATHOP_ASIN": "asin", "OPERATORS_MATHOP_ACOS": "acos", "OPERATORS_MATHOP_ATAN": "atan", "OPERATORS_MATHOP_LN": "ln", "OPERATORS_MATHOP_LOG": "log", "OPERATORS_MATHOP_EEXP": "e ^", "OPERATORS_MATHOP_10EXP": "10 ^", "PROCEDURES_DEFINITION": "定義 %1", "SENSING_TOUCHINGOBJECT": "碰到 %1?", "SENSING_TOUCHINGOBJECT_POINTER": "鼠標", "SENSING_TOUCHINGOBJECT_EDGE": "邊緣", "SENSING_TOUCHINGCOLOR": "碰到顏色 %1?", "SENSING_COLORISTOUCHINGCOLOR": "顏色 %1 碰到 顏色 %2?", "SENSING_DISTANCETO": "與 %1 的間距", "SENSING_DISTANCETO_POINTER": "鼠標", "SENSING_ASKANDWAIT": "詢問 %1 並等待", "SENSING_ASK_TEXT": "What's your name?", "SENSING_ANSWER": "詢問的答案", "SENSING_KEYPRESSED": "%1 鍵被按下?", "SENSING_MOUSEDOWN": "滑鼠鍵被按下?", "SENSING_MOUSEX": "鼠標的 x", "SENSING_MOUSEY": "鼠標的 y", "SENSING_SETDRAGMODE": "拖曳方式設為 %1", "SENSING_SETDRAGMODE_DRAGGABLE": "可拖曳", "SENSING_SETDRAGMODE_NOTDRAGGABLE": "不可拖曳", "SENSING_LOUDNESS": "聲音響度", "SENSING_LOUD": "大聲?", "SENSING_TIMER": "計時器", "SENSING_RESETTIMER": "計時器重置", "SENSING_OF": "%2 的 %1", "SENSING_OF_XPOSITION": "x 座標", "SENSING_OF_YPOSITION": "y 座標", "SENSING_OF_DIRECTION": "方向", "SENSING_OF_COSTUMENUMBER": "造型編號", "SENSING_OF_COSTUMENAME": "造型名稱", "SENSING_OF_SIZE": "尺寸", "SENSING_OF_VOLUME": "音量", "SENSING_OF_BACKDROPNUMBER": "背景編號", "SENSING_OF_BACKDROPNAME": "背景名稱", "SENSING_OF_STAGE": "舞台", "SENSING_CURRENT": "目前時間的 %1", "SENSING_CURRENT_YEAR": "年", "SENSING_CURRENT_MONTH": "月", "SENSING_CURRENT_DATE": "日", "SENSING_CURRENT_DAYOFWEEK": "週", "SENSING_CURRENT_HOUR": "時", "SENSING_CURRENT_MINUTE": "分", "SENSING_CURRENT_SECOND": "秒", "SENSING_DAYSSINCE2000": "2000年迄今日數", "SENSING_USERNAME": "用戶名稱", "SENSING_USERID": "用戶 ID", "SOUND_PLAY": "播放音效 %1", "SOUND_PLAYUNTILDONE": "播放音效 %1 直到結束", "SOUND_STOPALLSOUNDS": "停播所有音效", "SOUND_SETEFFECTO": "聲音效果 %1 設為 %2", "SOUND_CHANGEEFFECTBY": "聲音效果 %1 改變 %2", "SOUND_CLEAREFFECTS": "聲音效果清除", "SOUND_EFFECTS_PITCH": "音高", "SOUND_EFFECTS_PAN": "聲道左/右", "SOUND_CHANGEVOLUMEBY": "音量改變 %1", "SOUND_SETVOLUMETO": "音量設為 %1%", "SOUND_VOLUME": "音量", "CATEGORY_MOTION": "動作", "CATEGORY_LOOKS": "外觀", "CATEGORY_SOUND": "音效", "CATEGORY_EVENTS": "事件", "CATEGORY_CONTROL": "控制", "CATEGORY_SENSING": "偵測", "CATEGORY_OPERATORS": "運算", "CATEGORY_VARIABLES": "變數", "CATEGORY_MYBLOCKS": "函式積木", "DUPLICATE": "複製", "DELETE": "刪除", "ADD_COMMENT": "添加註解", "REMOVE_COMMENT": "移除註解", "DELETE_BLOCK": "刪除積木", "DELETE_X_BLOCKS": "刪除 %1 個積木", "DELETE_ALL_BLOCKS": "要刪除全部(%1 個)積木?", "CLEAN_UP": "整理積木", "HELP": "求助", "UNDO": "復原", "REDO": "重做", "EDIT_PROCEDURE": "編輯", "SHOW_PROCEDURE_DEFINITION": "移至定義", "WORKSPACE_COMMENT_DEFAULT_TEXT": "說些什麼…", "COLOUR_HUE_LABEL": "顏色", "COLOUR_SATURATION_LABEL": "彩度", "COLOUR_BRIGHTNESS_LABEL": "亮度", "CHANGE_VALUE_TITLE": "改成:", "RENAME_VARIABLE": "重新命名變數", "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", "RENAME_VARIABLE_MODAL_TITLE": "重新命名變數", "NEW_VARIABLE": "建立一個變數", "NEW_VARIABLE_TITLE": "新變數的名稱", "VARIABLE_MODAL_TITLE": "新的變數", "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", "DELETE_VARIABLE": "Delete the \"%1\" variable", "NEW_PROCEDURE": "建立一個積木", "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", "NEW_LIST": "建立一個清單", "NEW_LIST_TITLE": "新清單的名稱:", "LIST_MODAL_TITLE": "新的清單", "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", "RENAME_LIST_MODAL_TITLE": "重新命名清單", "NEW_BROADCAST_MESSAGE": "新的訊息", "NEW_BROADCAST_MESSAGE_TITLE": "新訊息的名稱:", "BROADCAST_MODAL_TITLE": "新的訊息", "DEFAULT_BROADCAST_MESSAGE_NAME": "訊息1" }; /*** EXPORTS FROM exports-loader ***/ module.exports = Blockly; /***/ }), /* 68 */ /***/ (function(module, exports, __webpack_require__) { /*** IMPORTS FROM imports-loader ***/ var Blockly = __webpack_require__(72); // Do not edit this file; automatically generated by build.py. 'use strict'; /* Visual Blocks Editor Copyright 2016 Massachusetts Institute of Technology All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ Blockly.Colours={motion:{primary:"#4C97FF",secondary:"#4280D7",tertiary:"#3373CC"},looks:{primary:"#9966FF",secondary:"#855CD6",tertiary:"#774DCB"},sounds:{primary:"#CF63CF",secondary:"#C94FC9",tertiary:"#BD42BD"},control:{primary:"#FFAB19",secondary:"#EC9C13",tertiary:"#CF8B17"},event:{primary:"#FFBF00",secondary:"#E6AC00",tertiary:"#CC9900"},sensing:{primary:"#5CB1D6",secondary:"#47A8D1",tertiary:"#2E8EB8"},pen:{primary:"#0fBD8C",secondary:"#0DA57A",tertiary:"#0B8E69"},operators:{primary:"#59C059", secondary:"#46B946",tertiary:"#389438"},data:{primary:"#FF8C1A",secondary:"#FF8000",tertiary:"#DB6E00"},data_lists:{primary:"#FF661A",secondary:"#FF5500",tertiary:"#E64D00"},more:{primary:"#FF6680",secondary:"#FF4D6A",tertiary:"#FF3355"},text:"#575E75",workspace:"#F9F9F9",toolboxHover:"#4C97FF",toolboxSelected:"#e9eef2",toolboxText:"#575E75",toolbox:"#FFFFFF",flyout:"#F9F9F9",scrollbar:"#CECDCE",scrollbarHover:"#CECDCE",textField:"#FFFFFF",insertionMarker:"#000000",insertionMarkerOpacity:.2,dragShadowOpacity:.3, stackGlow:"#FFF200",stackGlowSize:4,stackGlowOpacity:1,replacementGlow:"#FFFFFF",replacementGlowSize:2,replacementGlowOpacity:1,colourPickerStroke:"#FFFFFF",fieldShadow:"rgba(0,0,0,0.1)",dropDownShadow:"rgba(0, 0, 0, .3)",numPadBackground:"#547AB2",numPadBorder:"#435F91",numPadActiveBackground:"#435F91",numPadText:"#FFFFFF",valueReportBackground:"#FFFFFF",valueReportBorder:"#AAAAAA"}; Blockly.constants={};Blockly.DRAG_RADIUS=3;Blockly.FLYOUT_DRAG_RADIUS=10;Blockly.SNAP_RADIUS=48;Blockly.CONNECTING_SNAP_RADIUS=68;Blockly.CURRENT_CONNECTION_PREFERENCE=20;Blockly.BUMP_DELAY=0;Blockly.COLLAPSE_CHARS=30;Blockly.LONGPRESS=750;Blockly.SOUND_LIMIT=100;Blockly.DRAG_STACK=!0;Blockly.HSV_SATURATION=.45;Blockly.HSV_VALUE=.65;Blockly.SPRITE={width:96,height:124,url:"sprites.png"};Blockly.SVG_NS="http://www.w3.org/2000/svg";Blockly.HTML_NS="http://www.w3.org/1999/xhtml"; Blockly.INPUT_VALUE=1;Blockly.OUTPUT_VALUE=2;Blockly.NEXT_STATEMENT=3;Blockly.PREVIOUS_STATEMENT=4;Blockly.DUMMY_INPUT=5;Blockly.ALIGN_LEFT=-1;Blockly.ALIGN_CENTRE=0;Blockly.ALIGN_RIGHT=1;Blockly.DRAG_NONE=0;Blockly.DRAG_STICKY=1;Blockly.DRAG_BEGIN=1;Blockly.DRAG_FREE=2;Blockly.OPPOSITE_TYPE=[];Blockly.OPPOSITE_TYPE[Blockly.INPUT_VALUE]=Blockly.OUTPUT_VALUE;Blockly.OPPOSITE_TYPE[Blockly.OUTPUT_VALUE]=Blockly.INPUT_VALUE;Blockly.OPPOSITE_TYPE[Blockly.NEXT_STATEMENT]=Blockly.PREVIOUS_STATEMENT; Blockly.OPPOSITE_TYPE[Blockly.PREVIOUS_STATEMENT]=Blockly.NEXT_STATEMENT;Blockly.TOOLBOX_AT_TOP=0;Blockly.TOOLBOX_AT_BOTTOM=1;Blockly.TOOLBOX_AT_LEFT=2;Blockly.TOOLBOX_AT_RIGHT=3;Blockly.OUTPUT_SHAPE_HEXAGONAL=1;Blockly.OUTPUT_SHAPE_ROUND=2;Blockly.OUTPUT_SHAPE_SQUARE=3;Blockly.Categories={motion:"motion",looks:"looks",sound:"sounds",pen:"pen",data:"data",dataLists:"data-lists",event:"events",control:"control",sensing:"sensing",operators:"operators",more:"more"};Blockly.DELETE_AREA_NONE=null; Blockly.DELETE_AREA_TRASH=1;Blockly.DELETE_AREA_TOOLBOX=2;Blockly.VARIABLE_CATEGORY_NAME="VARIABLE";Blockly.PROCEDURE_CATEGORY_NAME="PROCEDURE";Blockly.RENAME_VARIABLE_ID="RENAME_VARIABLE_ID";Blockly.DELETE_VARIABLE_ID="DELETE_VARIABLE_ID";Blockly.NEW_BROADCAST_MESSAGE_ID="NEW_BROADCAST_MESSAGE_ID";Blockly.BROADCAST_MESSAGE_VARIABLE_TYPE="broadcast_msg";Blockly.LIST_VARIABLE_TYPE="list";Blockly.SCALAR_VARIABLE_TYPE="";Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE="procedures_definition"; Blockly.PROCEDURES_PROTOTYPE_BLOCK_TYPE="procedures_prototype";Blockly.PROCEDURES_CALL_BLOCK_TYPE="procedures_call";Blockly.StatusButtonState={READY:"ready",NOT_READY:"not ready"}; Blockly.Blocks.math={};Blockly.Blocks.math_number={init:function(){this.jsonInit({message0:"%1",args0:[{type:"field_number",name:"NUM",value:"0"}],output:"Number",outputShape:Blockly.OUTPUT_SHAPE_ROUND,colour:Blockly.Colours.textField,colourSecondary:Blockly.Colours.textField,colourTertiary:Blockly.Colours.textField})}}; Blockly.Blocks.math_integer={init:function(){this.jsonInit({message0:"%1",args0:[{type:"field_number",name:"NUM",precision:1}],output:"Number",outputShape:Blockly.OUTPUT_SHAPE_ROUND,colour:Blockly.Colours.textField,colourSecondary:Blockly.Colours.textField,colourTertiary:Blockly.Colours.textField})}}; Blockly.Blocks.math_whole_number={init:function(){this.jsonInit({message0:"%1",args0:[{type:"field_number",name:"NUM",min:0,precision:1}],output:"Number",outputShape:Blockly.OUTPUT_SHAPE_ROUND,colour:Blockly.Colours.textField,colourSecondary:Blockly.Colours.textField,colourTertiary:Blockly.Colours.textField})}}; Blockly.Blocks.math_positive_number={init:function(){this.jsonInit({message0:"%1",args0:[{type:"field_number",name:"NUM",min:0}],output:"Number",outputShape:Blockly.OUTPUT_SHAPE_ROUND,colour:Blockly.Colours.textField,colourSecondary:Blockly.Colours.textField,colourTertiary:Blockly.Colours.textField})}}; Blockly.Blocks.math_angle={init:function(){this.jsonInit({message0:"%1",args0:[{type:"field_angle",name:"NUM",value:90}],output:"Number",outputShape:Blockly.OUTPUT_SHAPE_ROUND,colour:Blockly.Colours.textField,colourSecondary:Blockly.Colours.textField,colourTertiary:Blockly.Colours.textField})}};Blockly.Blocks.colour={};function randomColour(){return"#"+("00000"+Math.floor(Math.random()*Math.pow(2,24)).toString(16)).substr(-6)}Blockly.Blocks.colour_picker={init:function(){this.jsonInit({message0:"%1",args0:[{type:"field_colour_slider",name:"COLOUR",colour:randomColour()}],outputShape:Blockly.OUTPUT_SHAPE_ROUND,output:"Colour"})}};Blockly.Blocks.texts={};Blockly.Blocks.text={init:function(){this.jsonInit({message0:"%1",args0:[{type:"field_input",name:"TEXT"}],output:"String",outputShape:Blockly.OUTPUT_SHAPE_ROUND,colour:Blockly.Colours.textField,colourSecondary:Blockly.Colours.textField,colourTertiary:Blockly.Colours.textField})}}; /*** EXPORTS FROM exports-loader ***/ module.exports = Blockly; /***/ }), /* 69 */ /***/ (function(module, exports, __webpack_require__) { /*** IMPORTS FROM imports-loader ***/ var goog = __webpack_require__(30); var Blockly = __webpack_require__(71); // Do not edit this file; automatically generated by build.py. 'use strict'; /* Visual Blocks Editor Copyright 2016 Massachusetts Institute of Technology All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ Blockly.Colours={motion:{primary:"#4C97FF",secondary:"#4280D7",tertiary:"#3373CC"},looks:{primary:"#9966FF",secondary:"#855CD6",tertiary:"#774DCB"},sounds:{primary:"#CF63CF",secondary:"#C94FC9",tertiary:"#BD42BD"},control:{primary:"#FFAB19",secondary:"#EC9C13",tertiary:"#CF8B17"},event:{primary:"#FFBF00",secondary:"#E6AC00",tertiary:"#CC9900"},sensing:{primary:"#5CB1D6",secondary:"#47A8D1",tertiary:"#2E8EB8"},pen:{primary:"#0fBD8C",secondary:"#0DA57A",tertiary:"#0B8E69"},operators:{primary:"#59C059", secondary:"#46B946",tertiary:"#389438"},data:{primary:"#FF8C1A",secondary:"#FF8000",tertiary:"#DB6E00"},data_lists:{primary:"#FF661A",secondary:"#FF5500",tertiary:"#E64D00"},more:{primary:"#FF6680",secondary:"#FF4D6A",tertiary:"#FF3355"},text:"#575E75",workspace:"#F9F9F9",toolboxHover:"#4C97FF",toolboxSelected:"#e9eef2",toolboxText:"#575E75",toolbox:"#FFFFFF",flyout:"#F9F9F9",scrollbar:"#CECDCE",scrollbarHover:"#CECDCE",textField:"#FFFFFF",insertionMarker:"#000000",insertionMarkerOpacity:.2,dragShadowOpacity:.3, stackGlow:"#FFF200",stackGlowSize:4,stackGlowOpacity:1,replacementGlow:"#FFFFFF",replacementGlowSize:2,replacementGlowOpacity:1,colourPickerStroke:"#FFFFFF",fieldShadow:"rgba(0,0,0,0.1)",dropDownShadow:"rgba(0, 0, 0, .3)",numPadBackground:"#547AB2",numPadBorder:"#435F91",numPadActiveBackground:"#435F91",numPadText:"#FFFFFF",valueReportBackground:"#FFFFFF",valueReportBorder:"#AAAAAA"}; Blockly.constants={};Blockly.DRAG_RADIUS=3;Blockly.FLYOUT_DRAG_RADIUS=10;Blockly.SNAP_RADIUS=48;Blockly.CONNECTING_SNAP_RADIUS=68;Blockly.CURRENT_CONNECTION_PREFERENCE=20;Blockly.BUMP_DELAY=0;Blockly.COLLAPSE_CHARS=30;Blockly.LONGPRESS=750;Blockly.SOUND_LIMIT=100;Blockly.DRAG_STACK=!0;Blockly.HSV_SATURATION=.45;Blockly.HSV_VALUE=.65;Blockly.SPRITE={width:96,height:124,url:"sprites.png"};Blockly.SVG_NS="http://www.w3.org/2000/svg";Blockly.HTML_NS="http://www.w3.org/1999/xhtml"; Blockly.INPUT_VALUE=1;Blockly.OUTPUT_VALUE=2;Blockly.NEXT_STATEMENT=3;Blockly.PREVIOUS_STATEMENT=4;Blockly.DUMMY_INPUT=5;Blockly.ALIGN_LEFT=-1;Blockly.ALIGN_CENTRE=0;Blockly.ALIGN_RIGHT=1;Blockly.DRAG_NONE=0;Blockly.DRAG_STICKY=1;Blockly.DRAG_BEGIN=1;Blockly.DRAG_FREE=2;Blockly.OPPOSITE_TYPE=[];Blockly.OPPOSITE_TYPE[Blockly.INPUT_VALUE]=Blockly.OUTPUT_VALUE;Blockly.OPPOSITE_TYPE[Blockly.OUTPUT_VALUE]=Blockly.INPUT_VALUE;Blockly.OPPOSITE_TYPE[Blockly.NEXT_STATEMENT]=Blockly.PREVIOUS_STATEMENT; Blockly.OPPOSITE_TYPE[Blockly.PREVIOUS_STATEMENT]=Blockly.NEXT_STATEMENT;Blockly.TOOLBOX_AT_TOP=0;Blockly.TOOLBOX_AT_BOTTOM=1;Blockly.TOOLBOX_AT_LEFT=2;Blockly.TOOLBOX_AT_RIGHT=3;Blockly.OUTPUT_SHAPE_HEXAGONAL=1;Blockly.OUTPUT_SHAPE_ROUND=2;Blockly.OUTPUT_SHAPE_SQUARE=3;Blockly.Categories={motion:"motion",looks:"looks",sound:"sounds",pen:"pen",data:"data",dataLists:"data-lists",event:"events",control:"control",sensing:"sensing",operators:"operators",more:"more"};Blockly.DELETE_AREA_NONE=null; Blockly.DELETE_AREA_TRASH=1;Blockly.DELETE_AREA_TOOLBOX=2;Blockly.VARIABLE_CATEGORY_NAME="VARIABLE";Blockly.PROCEDURE_CATEGORY_NAME="PROCEDURE";Blockly.RENAME_VARIABLE_ID="RENAME_VARIABLE_ID";Blockly.DELETE_VARIABLE_ID="DELETE_VARIABLE_ID";Blockly.NEW_BROADCAST_MESSAGE_ID="NEW_BROADCAST_MESSAGE_ID";Blockly.BROADCAST_MESSAGE_VARIABLE_TYPE="broadcast_msg";Blockly.LIST_VARIABLE_TYPE="list";Blockly.SCALAR_VARIABLE_TYPE="";Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE="procedures_definition"; Blockly.PROCEDURES_PROTOTYPE_BLOCK_TYPE="procedures_prototype";Blockly.PROCEDURES_CALL_BLOCK_TYPE="procedures_call";Blockly.StatusButtonState={READY:"ready",NOT_READY:"not ready"}; Blockly.ScratchBlocks={};Blockly.ScratchBlocks.VerticalExtensions={};Blockly.ScratchBlocks.VerticalExtensions.colourHelper=function(a){var b=Blockly.Colours[a];if(!(b&&b.primary&&b.secondary&&b.tertiary))throw Error('Could not find colours for category "'+a+'"');return function(){this.setColourFromRawValues_(b.primary,b.secondary,b.tertiary)}};Blockly.ScratchBlocks.VerticalExtensions.COLOUR_TEXTFIELD=function(){this.setColourFromRawValues_(Blockly.Colours.textField,Blockly.Colours.textField,Blockly.Colours.textField)}; Blockly.ScratchBlocks.VerticalExtensions.SHAPE_STATEMENT=function(){this.setInputsInline(!0);this.setPreviousStatement(!0,null);this.setNextStatement(!0,null)};Blockly.ScratchBlocks.VerticalExtensions.SHAPE_HAT=function(){this.setInputsInline(!0);this.setNextStatement(!0,null)};Blockly.ScratchBlocks.VerticalExtensions.SHAPE_END=function(){this.setInputsInline(!0);this.setPreviousStatement(!0,null)}; Blockly.ScratchBlocks.VerticalExtensions.OUTPUT_NUMBER=function(){this.setInputsInline(!0);this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);this.setOutput(!0,"Number")};Blockly.ScratchBlocks.VerticalExtensions.OUTPUT_STRING=function(){this.setInputsInline(!0);this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);this.setOutput(!0,"String")};Blockly.ScratchBlocks.VerticalExtensions.OUTPUT_BOOLEAN=function(){this.setInputsInline(!0);this.setOutputShape(Blockly.OUTPUT_SHAPE_HEXAGONAL);this.setOutput(!0,"Boolean")}; Blockly.ScratchBlocks.VerticalExtensions.PROCEDURE_DEF_CONTEXTMENU={customContextMenu:function(a){a.push(Blockly.Procedures.makeEditOption(this));for(var b=0,c;c=a[b];b++)if(c.text==Blockly.Msg.DELETE_BLOCK){var d=this.getInput("custom_block");if(d&&d.connection&&d.connection.targetBlock())var e=d.connection.targetBlock().getProcCode();else return;var f=this;c.callback=function(){Blockly.Procedures.deleteProcedureDefCallback(e,f)||alert("To delete a block definition, first remove all uses of the block")}}for(b= 0;c=a[b];b++)if(c.text==Blockly.Msg.DUPLICATE){a.splice(b,1);break}}};Blockly.ScratchBlocks.VerticalExtensions.PROCEDURE_CALL_CONTEXTMENU={customContextMenu:function(a){a.push(Blockly.Procedures.makeEditOption(this))}};Blockly.ScratchBlocks.VerticalExtensions.SCRATCH_EXTENSION=function(){this.isScratchExtension=!0}; Blockly.ScratchBlocks.VerticalExtensions.registerAll=function(){for(var a="control data data_lists sounds motion looks event sensing pen operators more".split(" "),b=0;b