summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/ci.yml1
-rw-r--r--CHANGELOG.md15
-rw-r--r--CONTRIBUTING.md2
-rw-r--r--README.md2
-rw-r--r--docs/designers/language-basic-syntax/language-syntax-operators.md114
-rw-r--r--docs/designers/language-builtin-functions/language-function-include.md12
-rw-r--r--docs/designers/language-variables/language-assigned-variables.md87
-rw-r--r--docs/features.md2
-rw-r--r--docs/getting-started.md2
-rw-r--r--docs/index.md19
-rw-r--r--src/Cacheresource/File.php10
-rw-r--r--src/Compile/AttributeCompiler.php144
-rw-r--r--src/Compile/Base.php84
-rw-r--r--src/Compile/FunctionCallCompiler.php30
-rw-r--r--src/FunctionHandler/AttributeBase.php77
-rw-r--r--src/FunctionHandler/AttributeFunctionHandlerInterface.php15
-rw-r--r--src/Lexer/TemplateLexer.php82
-rw-r--r--src/Lexer/TemplateLexer.plex5
-rw-r--r--src/Parser/TemplateParser.php2302
-rw-r--r--src/Parser/TemplateParser.y36
-rw-r--r--src/Smarty.php10
-rw-r--r--src/Template/Compiled.php2
-rw-r--r--src/TemplateBase.php2
-rw-r--r--tests/PHPUnit_Smarty.php6
-rw-r--r--tests/UnitTests/CacheResourceTests/Apc/CacheResourceCustomApcTest.php31
-rw-r--r--tests/UnitTests/CacheResourceTests/_shared/PHPunitplugins/cacheresource.apctest.php33
-rw-r--r--tests/UnitTests/Compile/AttributeCompilerTest.php193
-rw-r--r--tests/UnitTests/Compile/FunctionCallCompilerTest.php62
-rw-r--r--tests/UnitTests/TemplateSource/StaticClass/StaticClassAccessTest.php19
-rw-r--r--tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/FunctionObjectChainTest.php208
-rw-r--r--tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/templates/test_function_chain.tpl4
-rw-r--r--tests/UnitTests/TemplateSource/ValueTests/Operators/MatchesOperatorTest.php118
-rw-r--r--tests/UnitTests/__shared/cacheresources/cacheresource.apc.php73
-rw-r--r--utilities/testrunners/php85/Dockerfile10
34 files changed, 2394 insertions, 1418 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 0a6e63be..47c4aab4 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -34,6 +34,7 @@ jobs:
- "8.2"
- "8.3"
- "8.4"
+ - "8.5"
compiler:
- default
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4ee214ba..da75ec2a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+## [5.8.0] - 2026-02-15
+- Added support for Backed Enums for php versions >= 8.1 [#1171](https://github.com/smarty-php/smarty/pull/1171)
+- Added support for new 'matches' operator doing regex matching [#1169](https://github.com/smarty-php/smarty/pull/1169)
+- Update documentation to clarify that include inline is currently not implemented in Smarty v5 [#1152](https://github.com/smarty-php/smarty/issues/1152)
+- Support for Laravel Collections style object chaining for objects return from function calls implemented as modifiers [#1151](https://github.com/smarty-php/smarty/issues/1151)
+
+
+## [5.7.0] - 2025-11-19
+- PHP 8.5 support
+
+
+## [5.6.0] - 2025-10-03
+- Added support for shorttags in functions [#1005](https://github.com/smarty-php/smarty/issues/1005)
+
+
## [5.5.2] - 2025-08-26
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8dfdf32b..9cba3624 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -115,5 +115,7 @@ If you are a maintainer, you can publish the document using [mike](https://githu
mike deploy 5.x
```
+Then, push the `gh-pages` branch.
+
## Attribution
This guide is based on the **contributing.md**. [Make your own](https://contributing.md/)!
diff --git a/README.md b/README.md
index 1b44172d..3c6edc29 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@ Smarty is a template engine for PHP, facilitating the separation of presentation
Read the [documentation](https://smarty-php.github.io/smarty/) to find out how to use it.
## Requirements
-Smarty v5 can be run with PHP 7.2 to PHP 8.4.
+Smarty v5 can be run with PHP 7.2 to PHP 8.5.
## Installation
Smarty versions 3.1.11 or later can be installed with [Composer](https://getcomposer.org/).
diff --git a/docs/designers/language-basic-syntax/language-syntax-operators.md b/docs/designers/language-basic-syntax/language-syntax-operators.md
index 98a56538..965327c3 100644
--- a/docs/designers/language-basic-syntax/language-syntax-operators.md
+++ b/docs/designers/language-basic-syntax/language-syntax-operators.md
@@ -50,6 +50,120 @@ separated from surrounding elements by spaces. Note that items listed in
| is \[not\] odd by | | $a is not odd by $b | \[not\] an odd grouping | ($a / $b) % 2 != 0 |
| is in | | $a is in $b | exists in array | in_array($a, $b) |
| is \[not\] in | | $a is not in $b | does not exist in array | !in_array($a, $b) |
+| matches | | $a matches $b | regex pattern match | preg_match($b, $a) |
+
+## Regex Matching Operator
+
+The `matches` operator allows you to test if a string matches a regular expression pattern.
+
+### Basic Usage
+
+```smarty
+{if "hello" matches "/^[a-z]+$/"}
+ String matches the pattern!
+{/if}
+
+{if $email matches "/^[^@]+@[^@]+\.[^@]+$/"}
+ Valid email format
+{else}
+ Invalid email format
+{/if}
+```
+
+### Using Variables
+
+```smarty
+{$pattern = '/^[a-zA-Z0-9]{8,}$/'}
+{if $password matches $pattern}
+ Password meets requirements
+{else}
+ Password must be at least 8 alphanumeric characters
+{/if}
+```
+
+### Pattern Modifiers
+
+The `matches` operator supports all standard PHP regex modifiers:
+
+```smarty
+{* Case insensitive matching *}
+{if "HELLO" matches "/hello/i"}
+ Matches (case insensitive)
+{/if}
+
+{* Multiline mode *}
+{if "line1\nline2" matches "/line2$/m"}
+ Matches in multiline mode
+{/if}
+
+{* Dot matches newlines *}
+{if "hello\nworld" matches "/hello.world/s"}
+ Matches with dotall modifier
+{/if}
+```
+
+### Complex Conditions
+
+The `matches` operator can be combined with other operators:
+
+```smarty
+{if $username matches "/^[a-z]+$/" && $username|length > 3}
+ Valid username
+{else}
+ Username must be lowercase letters and at least 4 characters
+{/if}
+
+{if $input matches "/^[0-9]+$/" || $input matches "/^[a-z]+$/"}
+ Input is either numeric or lowercase letters
+{else}
+ Invalid input format
+{/if}
+```
+
+### Practical Examples
+
+**Email Validation:**
+```smarty
+{if $email matches "/^[^@\s]+@[^@\s]+\.[^@\s]+$/"}
+ Valid email address
+{else}
+ Please enter a valid email address
+{/if}
+```
+
+**Password Strength:**
+```smarty
+{if $password matches "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/"}
+ Strong password
+{else}
+ Password must contain uppercase, lowercase, numbers and be at least 8 characters
+{/if}
+```
+
+**URL Validation:**
+```smarty
+{if $url matches "/^https?:\/\/(www\.)?[a-z0-9\-]+(\.[a-z]{2,})+/i"}
+ Valid URL format
+{else}
+ Please enter a valid URL
+{/if}
+```
+
+**Numeric Validation:**
+```smarty
+{if $input matches "/^[0-9]+$/"}
+ Valid numeric input
+{else}
+ Please enter numbers only
+{/if}
+```
+
+### Notes
+
+- The `matches` operator uses PHP's `preg_match()` function internally
+- Pattern delimiters must be valid regex delimiters (typically `/`)
+- Invalid patterns will cause PHP warnings but won't break template execution
+- For complex regex patterns, consider using variables for better readability
## Ternary
You can use the `?:` (or ternary) operator to test one expression and present the value
diff --git a/docs/designers/language-builtin-functions/language-function-include.md b/docs/designers/language-builtin-functions/language-function-include.md
index 0710db7d..28d208e4 100644
--- a/docs/designers/language-builtin-functions/language-function-include.md
+++ b/docs/designers/language-builtin-functions/language-function-include.md
@@ -47,11 +47,13 @@ available within the included template.
## Option Flags
-| Name | Description |
-|---------|--------------------------------------------------------------------------------------|
-| nocache | Disables caching of this subtemplate |
-| caching | Enable caching of this subtemplate |
-| inline | If set, merge the compile-code of the subtemplate into the compiled calling template |
+| Name | Description |
+|-----------|--------------------------------------------------------------------------------------|
+| nocache | Disables caching of this subtemplate |
+| caching | Enable caching of this subtemplate |
+| inline \* | If set, merge the compile-code of the subtemplate into the compiled calling template |
+
+\* The `inline` option flag is currently not implemented in Smarty v5. Using it will not trigger an error, however.
## Examples
```smarty
diff --git a/docs/designers/language-variables/language-assigned-variables.md b/docs/designers/language-variables/language-assigned-variables.md
index 9465a89c..5dfa3648 100644
--- a/docs/designers/language-variables/language-assigned-variables.md
+++ b/docs/designers/language-variables/language-assigned-variables.md
@@ -123,4 +123,89 @@ this will output:
```html
name: Zaphod Beeblebrox<br />
email: zaphod@slartibartfast.example.com<br />
-``` \ No newline at end of file
+```
+
+## Backed Enums (PHP 8.1+)
+
+Smarty supports accessing properties of [backed enums](https://www.php.net/manual/en/language.enumerations.backed.php) introduced in PHP 8.1.
+
+### Accessing Enum Properties
+
+You can access the `name` and `value` properties of backed enum cases:
+
+```smarty
+{* Access enum case properties *}
+<option id="{MyEnum::Foo->name}">{MyEnum::Foo->value}</option>
+```
+
+### Complete Example
+
+```php
+<?php
+use Smarty\Smarty;
+
+// Define a backed enum
+enum Status: string {
+ case Active = 'active';
+ case Inactive = 'inactive';
+ case Pending = 'pending';
+}
+
+$smarty = new Smarty();
+$smarty->assign('currentStatus', Status::Active);
+$smarty->display('template.tpl');
+```
+
+`template.tpl`:
+
+```smarty
+{* Display enum properties *}
+Current status: {$currentStatus->name} (value: {$currentStatus->value})
+
+{* Use in HTML attributes *}
+<select name="status">
+ <option value="{Status::Active->value}" {if $currentStatus->name === 'Active'}selected{/if}>Active</option>
+ <option value="{Status::Inactive->value}" {if $currentStatus->name === 'Inactive'}selected{/if}>Inactive</option>
+ <option value="{Status::Pending->value}" {if $currentStatus->name === 'Pending'}selected{/if}>Pending</option>
+</select>
+```
+
+This would output:
+
+```html
+Current status: Active (value: active)
+
+<select name="status">
+ <option value="active" selected>Active</option>
+ <option value="inactive">Inactive</option>
+ <option value="pending">Pending</option>
+</select>
+```
+
+### Integer-backed Enums
+
+Integer-backed enums work the same way:
+
+```php
+<?php
+enum Priority: int {
+ case Low = 1;
+ case Medium = 2;
+ case High = 3;
+}
+
+$smarty->assign('priority', Priority::High);
+```
+
+```smarty
+{* Access integer enum properties *}
+Priority level: {$priority->value} ({$priority->name})
+```
+
+Output:
+
+```html
+Priority level: 3 (High)
+```
+
+> **Note**: Backed enum support requires PHP 8.1 or higher. The enum must be registered or available in the current namespace. \ No newline at end of file
diff --git a/docs/features.md b/docs/features.md
index f9a873be..bab9cd1e 100644
--- a/docs/features.md
+++ b/docs/features.md
@@ -22,6 +22,8 @@ Some of Smarty's features:
- [Template Inheritance](api/inheritance.md) for
easy management of template content.
- [Plugin](api/extending/introduction.md) architecture
+- Regex pattern matching with the [`matches`](designers/language-basic-syntax/language-syntax-operators.md#regex-matching-operator) operator
+- Support for PHP 8.1+ [backed enums](designers/language-variables/language-assigned-variables.md#backed-enums-php-81)
## Separation of presentation from application code
- This means templates can certainly contain logic under the condition
diff --git a/docs/getting-started.md b/docs/getting-started.md
index 1ea927e9..17a0042b 100644
--- a/docs/getting-started.md
+++ b/docs/getting-started.md
@@ -1,7 +1,7 @@
# Getting started
## Requirements
-Smarty can be run with PHP 7.2 to PHP 8.4.
+Smarty can be run with PHP 7.2 to PHP 8.5.
## Installation
Smarty can be installed with [Composer](https://getcomposer.org/).
diff --git a/docs/index.md b/docs/index.md
index e187ffbe..63cf15e0 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -8,6 +8,25 @@ It allows you to write **templates**, using **variables**, **modifiers**, **func
<p>
The number of pixels is: {math equation="x * y" x=$height y=$width}.
</p>
+
+<p>
+ {if $email matches "/^[^@]+@[^@]+\.[^@]+$/"}
+ Valid email address
+ {else}
+ Please enter a valid email
+ {/if}
+</p>
+```
+```html
+<h1>Hello world</h1>
+
+<p>
+ The number of pixels is: 307200.
+</p>
+
+<p>
+ Valid email address
+</p>
```
When this template is rendered, with the value "Hello world" for the variable $title, 640 for $width,
diff --git a/src/Cacheresource/File.php b/src/Cacheresource/File.php
index 4b4198ec..3cb09b5e 100644
--- a/src/Cacheresource/File.php
+++ b/src/Cacheresource/File.php
@@ -127,8 +127,6 @@ class File extends Base
&& (!function_exists('ini_get') || strlen(ini_get('opcache.restrict_api'))) < 1
) {
opcache_invalidate($_template->getCached()->filepath, true);
- } elseif (function_exists('apc_compile_file')) {
- apc_compile_file($_template->getCached()->filepath);
}
$cached = $_template->getCached();
$cached->timestamp = $cached->exists = is_file($cached->filepath);
@@ -223,10 +221,8 @@ class File extends Base
$_filepath = (string)$_file;
// directory ?
if ($_file->isDir()) {
- if (!$_cache->isDot()) {
- // delete folder if empty
- @rmdir($_file->getPathname());
- }
+ // delete folder if empty
+ @rmdir($_file->getPathname());
} else {
// delete only php files
if (substr($_filepath, -4) !== '.php') {
@@ -279,8 +275,6 @@ class File extends Base
&& (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1)
) {
opcache_invalidate($_filepath, true);
- } elseif (function_exists('apc_delete_file')) {
- apc_delete_file($_filepath);
}
}
}
diff --git a/src/Compile/AttributeCompiler.php b/src/Compile/AttributeCompiler.php
new file mode 100644
index 00000000..077c4cfc
--- /dev/null
+++ b/src/Compile/AttributeCompiler.php
@@ -0,0 +1,144 @@
+<?php
+
+namespace Smarty\Compile;
+
+/**
+ * This class handles compiling the attributes.
+ */
+class AttributeCompiler
+{
+ /**
+ * Array of names of required attributes required by tag
+ *
+ * @var array
+ */
+ protected $required_attributes = [];
+
+ /**
+ * Array of names of optional attribute required by tag
+ * use array('_any') if there is no restriction of attributes names
+ *
+ * @var array
+ */
+ protected $optional_attributes = [];
+
+ /**
+ * Shorttag attribute order defined by its names
+ *
+ * @var array
+ */
+ protected $shorttag_order = [];
+
+ /**
+ * Array of names of valid option flags
+ *
+ * @var array
+ */
+ protected $option_flags = [];
+
+ public function __construct(
+ array $required_attributes = [],
+ array $optional_attributes = [],
+ array $shorttag_order = [],
+ array $option_flags = []
+ ) {
+ $this->required_attributes = $required_attributes;
+ $this->optional_attributes = $optional_attributes;
+ $this->shorttag_order = $shorttag_order;
+ $this->option_flags = $option_flags;
+ }
+
+ /**
+ * This function checks if the attributes passed are valid
+ * The attributes passed for the tag to compile are checked against the list of required and
+ * optional attributes. Required attributes must be present. Optional attributes are check against
+ * the corresponding list. The keyword '_any' specifies that any attribute will be accepted
+ * as valid
+ *
+ * @param object $compiler compiler object
+ * @param array $attributes attributes applied to the tag
+ *
+ * @return array of mapped attributes for further processing
+ */
+ public function getAttributes($compiler, $attributes)
+ {
+ $_indexed_attr = [];
+ $options = array_fill_keys($this->option_flags, true);
+ foreach ($attributes as $key => $mixed) {
+ // shorthand ?
+ if (!is_array($mixed)) {
+ // options flag ?
+ if (isset($options[trim($mixed, '\'"')])) {
+ $_indexed_attr[trim($mixed, '\'"')] = true;
+ // shorthand attribute ?
+ } elseif (isset($this->shorttag_order[$key])) {
+ $_indexed_attr[$this->shorttag_order[$key]] = $mixed;
+ } else {
+ // too many shorthands
+ $compiler->trigger_template_error('too many shorthand attributes', null, true);
+ }
+ // named attribute
+ } else {
+ foreach ($mixed as $k => $v) {
+ // options flag?
+ if (isset($options[$k])) {
+ if (is_bool($v)) {
+ $_indexed_attr[$k] = $v;
+ } else {
+ if (is_string($v)) {
+ $v = trim($v, '\'" ');
+ }
+
+ // Mapping array for boolean option value
+ static $optionMap = [1 => true, 0 => false, 'true' => true, 'false' => false];
+
+ if (isset($optionMap[$v])) {
+ $_indexed_attr[$k] = $optionMap[$v];
+ } else {
+ $compiler->trigger_template_error(
+ "illegal value '" . var_export($v, true) .
+ "' for options flag '{$k}'",
+ null,
+ true
+ );
+ }
+ }
+ // must be named attribute
+ } else {
+ $_indexed_attr[$k] = $v;
+ }
+ }
+ }
+ }
+ // check if all required attributes present
+ foreach ($this->required_attributes as $attr) {
+ if (!isset($_indexed_attr[$attr])) {
+ $compiler->trigger_template_error("missing '{$attr}' attribute", null, true);
+ }
+ }
+ // check for not allowed attributes
+ if ($this->optional_attributes !== ['_any']) {
+ $allowedAttributes = array_fill_keys(
+ array_merge(
+ $this->required_attributes,
+ $this->optional_attributes,
+ $this->option_flags
+ ),
+ true
+ );
+ foreach ($_indexed_attr as $key => $dummy) {
+ if (!isset($allowedAttributes[$key]) && $key !== 0) {
+ $compiler->trigger_template_error("unexpected '{$key}' attribute", null, true);
+ }
+ }
+ }
+ // default 'false' for all options flags not set
+ foreach ($this->option_flags as $flag) {
+ if (!isset($_indexed_attr[$flag])) {
+ $_indexed_attr[$flag] = false;
+ }
+ }
+
+ return $_indexed_attr;
+ }
+}
diff --git a/src/Compile/Base.php b/src/Compile/Base.php
index 2d5c0c0e..10153501 100644
--- a/src/Compile/Base.php
+++ b/src/Compile/Base.php
@@ -82,84 +82,12 @@ abstract class Base implements CompilerInterface {
* @return array of mapped attributes for further processing
*/
protected function getAttributes($compiler, $attributes) {
- $_indexed_attr = [];
- $options = array_fill_keys($this->option_flags, true);
- foreach ($attributes as $key => $mixed) {
- // shorthand ?
- if (!is_array($mixed)) {
- // options flag ?
- if (isset($options[trim($mixed, '\'"')])) {
- $_indexed_attr[trim($mixed, '\'"')] = true;
- // shorthand attribute ?
- } elseif (isset($this->shorttag_order[$key])) {
- $_indexed_attr[$this->shorttag_order[$key]] = $mixed;
- } else {
- // too many shorthands
- $compiler->trigger_template_error('too many shorthand attributes', null, true);
- }
- // named attribute
- } else {
- foreach ($mixed as $k => $v) {
- // options flag?
- if (isset($options[$k])) {
- if (is_bool($v)) {
- $_indexed_attr[$k] = $v;
- } else {
- if (is_string($v)) {
- $v = trim($v, '\'" ');
- }
-
- // Mapping array for boolean option value
- static $optionMap = [1 => true, 0 => false, 'true' => true, 'false' => false];
-
- if (isset($optionMap[$v])) {
- $_indexed_attr[$k] = $optionMap[$v];
- } else {
- $compiler->trigger_template_error(
- "illegal value '" . var_export($v, true) .
- "' for options flag '{$k}'",
- null,
- true
- );
- }
- }
- // must be named attribute
- } else {
- $_indexed_attr[$k] = $v;
- }
- }
- }
- }
- // check if all required attributes present
- foreach ($this->required_attributes as $attr) {
- if (!isset($_indexed_attr[$attr])) {
- $compiler->trigger_template_error("missing '{$attr}' attribute", null, true);
- }
- }
- // check for not allowed attributes
- if ($this->optional_attributes !== ['_any']) {
- $allowedAttributes = array_fill_keys(
- array_merge(
- $this->required_attributes,
- $this->optional_attributes,
- $this->option_flags
- ),
- true
- );
- foreach ($_indexed_attr as $key => $dummy) {
- if (!isset($allowedAttributes[$key]) && $key !== 0) {
- $compiler->trigger_template_error("unexpected '{$key}' attribute", null, true);
- }
- }
- }
- // default 'false' for all options flags not set
- foreach ($this->option_flags as $flag) {
- if (!isset($_indexed_attr[$flag])) {
- $_indexed_attr[$flag] = false;
- }
- }
-
- return $_indexed_attr;
+ return (new AttributeCompiler(
+ $this->required_attributes,
+ $this->optional_attributes,
+ $this->shorttag_order,
+ $this->option_flags
+ ))->getAttributes($compiler, $attributes);
}
/**
diff --git a/src/Compile/FunctionCallCompiler.php b/src/Compile/FunctionCallCompiler.php
index 107dd98b..3ce50da2 100644
--- a/src/Compile/FunctionCallCompiler.php
+++ b/src/Compile/FunctionCallCompiler.php
@@ -3,24 +3,18 @@
* Smarty Internal Plugin Compile Registered Function
* Compiles code for the execution of a registered function
*
-
-
* @author Uwe Tews
*/
namespace Smarty\Compile;
use Smarty\Compiler\Template;
-use Smarty\CompilerException;
+use Smarty\FunctionHandler\AttributeFunctionHandlerInterface;
/**
* Smarty Internal Plugin Compile Registered Function Class
- *
-
-
*/
class FunctionCallCompiler extends Base {
-
/**
* Attribute definition: Overwrites base class.
*
@@ -51,16 +45,26 @@ class FunctionCallCompiler extends Base {
*/
public function compile($args, Template $compiler, $parameter = [], $tag = null, $function = null): string
{
+ if ($functionHandler = $compiler->getSmarty()->getFunctionHandler($function)) {
- // check and get attributes
- $_attr = $this->getAttributes($compiler, $args);
- unset($_attr['nocache']);
+ $attribute_overrides = [];
- $_paramsArray = $this->formatParamsArray($_attr);
- $_params = 'array(' . implode(',', $_paramsArray) . ')';
+ if ($functionHandler instanceof AttributeFunctionHandlerInterface) {
+ $attribute_overrides = $functionHandler->getSupportedAttributes();
+ }
+ // check and get attributes
+ $_attr = (new AttributeCompiler(
+ $attribute_overrides['required_attributes'] ?? $this->required_attributes,
+ $attribute_overrides['optional_attributes'] ?? $this->optional_attributes,
+ $attribute_overrides['shorttag_order'] ?? $this->shorttag_order,
+ $attribute_overrides['option_flags'] ?? $this->option_flags
+ ))->getAttributes($compiler, $args);
- if ($functionHandler = $compiler->getSmarty()->getFunctionHandler($function)) {
+ unset($_attr['nocache']);
+
+ $_paramsArray = $this->formatParamsArray($_attr);
+ $_params = 'array(' . implode(',', $_paramsArray) . ')';
// not cacheable?
$compiler->tag_nocache = $compiler->tag_nocache || !$functionHandler->isCacheable();
diff --git a/src/FunctionHandler/AttributeBase.php b/src/FunctionHandler/AttributeBase.php
new file mode 100644
index 00000000..71a035dc
--- /dev/null
+++ b/src/FunctionHandler/AttributeBase.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Smarty\FunctionHandler;
+
+use Smarty\Template;
+
+/**
+ * Abstract implementation for function handlers which support custom attributes
+ */
+abstract class AttributeBase implements AttributeFunctionHandlerInterface
+{
+ /**
+ * Array of names of required attribute required by tag
+ *
+ * @var array
+ */
+ protected array $required_attributes = [];
+
+ /**
+ * Array of names of optional attribute required by tag
+ * use array('_any') if there is no restriction of attributes names
+ *
+ * @var array
+ */
+ protected array $optional_attributes = [];
+
+ /**
+ * Shorttag attribute order defined by its names
+ *
+ * @var array
+ */
+ protected array $shorttag_order = [];
+
+ /**
+ * Array of names of valid option flags
+ *
+ * @var array
+ */
+ protected array $option_flags = [];
+
+ /**
+ * Return whether the output is cacheable.
+ * @var bool
+ */
+ protected bool $cacheable = true;
+
+ /**
+ * Return whether the output is cacheable.
+ * @return bool
+ */
+ public function isCacheable(): bool
+ {
+ return $this->cacheable;
+ }
+
+ /**
+ * Function body
+ * @param mixed $params The supplied parameters.
+ * @param Smarty\Template $template
+ * @return mixed
+ */
+ abstract public function handle($params, Template $template): ?string;
+
+ /**
+ * Return the support attributes for this function.
+ * @return array<string, array>
+ */
+ public function getSupportedAttributes(): array
+ {
+ return [
+ 'required_attributes' => $this->required_attributes,
+ 'optional_attributes' => $this->optional_attributes,
+ 'shorttag_order' => $this->shorttag_order,
+ 'option_flags' => $this->option_flags,
+ ];
+ }
+}
diff --git a/src/FunctionHandler/AttributeFunctionHandlerInterface.php b/src/FunctionHandler/AttributeFunctionHandlerInterface.php
new file mode 100644
index 00000000..f76259ec
--- /dev/null
+++ b/src/FunctionHandler/AttributeFunctionHandlerInterface.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Smarty\FunctionHandler;
+
+/**
+ * Function handler interface with support for specifying supported properties
+ */
+interface AttributeFunctionHandlerInterface extends FunctionHandlerInterface
+{
+ /**
+ * Returns an array with the supported attributes, flags, and shorttags
+ * @return array<string, array>
+ */
+ public function getSupportedAttributes(): array;
+}
diff --git a/src/Lexer/TemplateLexer.php b/src/Lexer/TemplateLexer.php
index 2e7f3305..8c28448e 100644
--- a/src/Lexer/TemplateLexer.php
+++ b/src/Lexer/TemplateLexer.php
@@ -160,6 +160,7 @@ class TemplateLexer
'LOGOP' => '"<", "==" ... logical operator',
'TLOGOP' => '"lt", "eq" ... logical operator; "is div by" ... if condition',
'SCOND' => '"is even" ... if condition',
+ 'MATCHES' => '"matches" regex operator',
);
/**
@@ -567,7 +568,7 @@ class TemplateLexer
public function yylex3()
{
if (!isset($this->yy_global_pattern3)) {
- $this->yy_global_pattern3 = $this->replace("/\G(\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal)|\G([\"])|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(\\s+is\\s+(not\\s+)?in\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*([!=][=]{1,2}|[<][=>]?|[>][=]?|[&|]{2})\\s*)|\G(\\s+(eq|ne|neq|gt|ge|gte|lt|le|lte|mod|and|or|xor)\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even|div)\\s+by\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even))|\G([!]\\s*|not\\s+)|\G([(](int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)[)]\\s*)|\G(\\s*[(]\\s*)|\G(\\s*[)])|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*[-][>]\\s*)|\G(\\s*[=][>]\\s*)|\G(\\s*[=]\\s*)|\G(([+]|[-]){2})|\G(\\s*([+]|[-])\\s*)|\G(\\s*([*]{1,2}|[%\/^&]|[<>]{2})\\s*)|\G([@])|\G(array\\s*[(]\\s*)|\G([#])|\G(\\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\\s*[=]\\s*)|\G(([0-9]*[a-zA-Z_]\\w*)?(\\\\[0-9]*[a-zA-Z_]\\w*)+)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G([`])|\G([|][@]?)|\G([.])|\G(\\s*[,]\\s*)|\G(\\s*[;]\\s*)|\G([:]{2})|\G(\\s*[:]\\s*)|\G(\\s*[?]\\s*)|\G(0[xX][0-9a-fA-F]+)|\G(\\s+)|\G([\S\s])/isS");
+ $this->yy_global_pattern3 = $this->replace("/\G(\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal)|\G([\"])|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(\\s+is\\s+(not\\s+)?in\\s+)|\G(\\s+matches\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*([!=][=]{1,2}|[<][=>]?|[>][=]?|[&|]{2})\\s*)|\G(\\s+(eq|ne|neq|gt|ge|gte|lt|le|lte|mod|and|or|xor)\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even|div)\\s+by\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even))|\G([!]\\s*|not\\s+)|\G([(](int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)[)]\\s*)|\G(\\s*[(]\\s*)|\G(\\s*[)])|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*[-][>]\\s*)|\G(\\s*[=][>]\\s*)|\G(\\s*[=]\\s*)|\G(([+]|[-]){2})|\G(\\s*([+]|[-])\\s*)|\G(\\s*([*]{1,2}|[%\/^&]|[<>]{2})\\s*)|\G([@])|\G(array\\s*[(]\\s*)|\G([#])|\G(\\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\\s*[=]\\s*)|\G(([0-9]*[a-zA-Z_]\\w*)?(\\\\[0-9]*[a-zA-Z_]\\w*)+)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G([`])|\G([|][@]?)|\G([.])|\G(\\s*[,]\\s*)|\G(\\s*[;]\\s*)|\G([:]{2})|\G(\\s*[:]\\s*)|\G(\\s*[?]\\s*)|\G(0[xX][0-9a-fA-F]+)|\G(\\s+)|\G([\S\s])/isS");
}
if (!isset($this->dataLength)) {
$this->dataLength = strlen($this->data);
@@ -662,119 +663,124 @@ class TemplateLexer
public function yy_r3_10()
{
- $this->token = \Smarty\Parser\TemplateParser::TP_AS;
+ $this->token = \Smarty\Parser\TemplateParser::TP_MATCHES;
}
public function yy_r3_11()
{
- $this->token = \Smarty\Parser\TemplateParser::TP_TO;
+ $this->token = \Smarty\Parser\TemplateParser::TP_AS;
}
public function yy_r3_12()
{
- $this->token = \Smarty\Parser\TemplateParser::TP_STEP;
+ $this->token = \Smarty\Parser\TemplateParser::TP_TO;
}
public function yy_r3_13()
{
- $this->token = \Smarty\Parser\TemplateParser::TP_INSTANCEOF;
+ $this->token = \Smarty\Parser\TemplateParser::TP_STEP;
}
public function yy_r3_14()
{
+ $this->token = \Smarty\Parser\TemplateParser::TP_INSTANCEOF;
+ }
+ public function yy_r3_15()
+ {
+
$this->token = \Smarty\Parser\TemplateParser::TP_LOGOP;
}
- public function yy_r3_16()
+ public function yy_r3_17()
{
$this->token = \Smarty\Parser\TemplateParser::TP_SLOGOP;
}
- public function yy_r3_18()
+ public function yy_r3_19()
{
$this->token = \Smarty\Parser\TemplateParser::TP_TLOGOP;
}
- public function yy_r3_21()
+ public function yy_r3_22()
{
$this->token = \Smarty\Parser\TemplateParser::TP_SINGLECOND;
}
- public function yy_r3_24()
+ public function yy_r3_25()
{
$this->token = \Smarty\Parser\TemplateParser::TP_NOT;
}
- public function yy_r3_25()
+ public function yy_r3_26()
{
$this->token = \Smarty\Parser\TemplateParser::TP_TYPECAST;
}
- public function yy_r3_29()
+ public function yy_r3_30()
{
$this->token = \Smarty\Parser\TemplateParser::TP_OPENP;
}
- public function yy_r3_30()
+ public function yy_r3_31()
{
$this->token = \Smarty\Parser\TemplateParser::TP_CLOSEP;
}
- public function yy_r3_31()
+ public function yy_r3_32()
{
$this->token = \Smarty\Parser\TemplateParser::TP_OPENB;
}
- public function yy_r3_32()
+ public function yy_r3_33()
{
$this->token = \Smarty\Parser\TemplateParser::TP_CLOSEB;
}
- public function yy_r3_33()
+ public function yy_r3_34()
{
$this->token = \Smarty\Parser\TemplateParser::TP_PTR;
}
- public function yy_r3_34()
+ public function yy_r3_35()
{
$this->token = \Smarty\Parser\TemplateParser::TP_APTR;
}
- public function yy_r3_35()
+ public function yy_r3_36()
{
$this->token = \Smarty\Parser\TemplateParser::TP_EQUAL;
}
- public function yy_r3_36()
+ public function yy_r3_37()
{
$this->token = \Smarty\Parser\TemplateParser::TP_INCDEC;
}
- public function yy_r3_38()
+ public function yy_r3_39()
{
$this->token = \Smarty\Parser\TemplateParser::TP_UNIMATH;
}
- public function yy_r3_40()
+ public function yy_r3_41()
{
$this->token = \Smarty\Parser\TemplateParser::TP_MATH;
}
- public function yy_r3_42()
+ public function yy_r3_43()
{
$this->token = \Smarty\Parser\TemplateParser::TP_AT;
}
- public function yy_r3_43()
+ public function yy_r3_44()
{
$this->token = \Smarty\Parser\TemplateParser::TP_ARRAYOPEN;
}
- public function yy_r3_44()
+ public function yy_r3_45()
{
$this->token = \Smarty\Parser\TemplateParser::TP_HATCH;
}
- public function yy_r3_45()
+ public function yy_r3_46()
{
// resolve conflicts with shorttag and right_delimiter starting with '='
@@ -786,73 +792,73 @@ class TemplateLexer
$this->token = \Smarty\Parser\TemplateParser::TP_ATTR;
}
}
- public function yy_r3_46()
+ public function yy_r3_47()
{
$this->token = \Smarty\Parser\TemplateParser::TP_NAMESPACE;
}
- public function yy_r3_49()
+ public function yy_r3_50()
{
$this->token = \Smarty\Parser\TemplateParser::TP_ID;
}
- public function yy_r3_50()
+ public function yy_r3_51()
{
$this->token = \Smarty\Parser\TemplateParser::TP_INTEGER;
}
- public function yy_r3_51()
+ public function yy_r3_52()
{
$this->token = \Smarty\Parser\TemplateParser::TP_BACKTICK;
$this->yypopstate();
}
- public function yy_r3_52()
+ public function yy_r3_53()
{
$this->token = \Smarty\Parser\TemplateParser::TP_VERT;
}
- public function yy_r3_53()
+ public function yy_r3_54()
{
$this->token = \Smarty\Parser\TemplateParser::TP_DOT;
}
- public function yy_r3_54()
+ public function yy_r3_55()
{
$this->token = \Smarty\Parser\TemplateParser::TP_COMMA;
}
- public function yy_r3_55()
+ public function yy_r3_56()
{
$this->token = \Smarty\Parser\TemplateParser::TP_SEMICOLON;
}
- public function yy_r3_56()
+ public function yy_r3_57()
{
$this->token = \Smarty\Parser\TemplateParser::TP_DOUBLECOLON;
}
- public function yy_r3_57()
+ public function yy_r3_58()
{
$this->token = \Smarty\Parser\TemplateParser::TP_COLON;
}
- public function yy_r3_58()
+ public function yy_r3_59()
{
$this->token = \Smarty\Parser\TemplateParser::TP_QMARK;
}
- public function yy_r3_59()
+ public function yy_r3_60()
{
$this->token = \Smarty\Parser\TemplateParser::TP_HEX;
}
- public function yy_r3_60()
+ public function yy_r3_61()
{
$this->token = \Smarty\Parser\TemplateParser::TP_SPACE;
}
- public function yy_r3_61()
+ public function yy_r3_62()
{
$this->token = \Smarty\Parser\TemplateParser::TP_TEXT;
diff --git a/src/Lexer/TemplateLexer.plex b/src/Lexer/TemplateLexer.plex
index 282a99cf..c3d01600 100644
--- a/src/Lexer/TemplateLexer.plex
+++ b/src/Lexer/TemplateLexer.plex
@@ -160,6 +160,7 @@ class TemplateLexer
'LOGOP' => '"<", "==" ... logical operator',
'TLOGOP' => '"lt", "eq" ... logical operator; "is div by" ... if condition',
'SCOND' => '"is even" ... if condition',
+ 'MATCHES' => '"matches" regex operator',
);
/**
@@ -325,6 +326,7 @@ class TemplateLexer
tlop = ~\s+is\s+(not\s+)?(odd|even|div)\s+by\s+~
scond = ~\s+is\s+(not\s+)?(odd|even)~
isin = ~\s+is\s+(not\s+)?in\s+~
+ matches = ~\s+matches\s+~
as = ~\s+as\s+~
to = ~\s+to\s+~
step = ~\s+step\s+~
@@ -469,6 +471,9 @@ class TemplateLexer
isin {
$this->token = \Smarty\Parser\TemplateParser::TP_ISIN;
}
+ matches {
+ $this->token = \Smarty\Parser\TemplateParser::TP_MATCHES;
+ }
as {
$this->token = \Smarty\Parser\TemplateParser::TP_AS;
}
diff --git a/src/Parser/TemplateParser.php b/src/Parser/TemplateParser.php
index 772df98d..6414d502 100644
--- a/src/Parser/TemplateParser.php
+++ b/src/Parser/TemplateParser.php
@@ -260,674 +260,710 @@ class TemplateParser
const TP_SLOGOP = 54;
const TP_TLOGOP = 55;
const TP_SINGLECOND = 56;
- const TP_ARRAYOPEN = 57;
- const TP_QUOTE = 58;
- const TP_BACKTICK = 59;
- const YY_NO_ACTION = 542;
- const YY_ACCEPT_ACTION = 541;
- const YY_ERROR_ACTION = 540;
+ const TP_MATCHES = 57;
+ const TP_ARRAYOPEN = 58;
+ const TP_QUOTE = 59;
+ const TP_BACKTICK = 60;
+ const YY_NO_ACTION = 553;
+ const YY_ACCEPT_ACTION = 552;
+ const YY_ERROR_ACTION = 551;
- const YY_SZ_ACTTAB = 2565;
+ const YY_SZ_ACTTAB = 2723;
public static $yy_action = array(
- 33, 106, 269, 306, 179, 305, 200, 247, 248, 249,
- 1, 264, 138, 237, 202, 361, 6, 87, 284, 222,
- 338, 361, 112, 107, 400, 321, 217, 261, 218, 130,
- 224, 400, 21, 400, 49, 44, 400, 32, 45, 46,
- 278, 226, 400, 282, 400, 203, 400, 53, 4, 139,
- 302, 231, 28, 102, 225, 5, 54, 247, 248, 249,
- 1, 20, 135, 192, 193, 271, 6, 87, 246, 222,
- 216, 29, 112, 229, 7, 159, 217, 261, 218, 140,
- 208, 272, 21, 509, 53, 44, 13, 302, 45, 46,
- 278, 226, 149, 235, 153, 203, 257, 53, 4, 328,
- 302, 302, 256, 304, 143, 5, 54, 247, 248, 249,
- 1, 302, 100, 394, 86, 236, 6, 87, 3, 222,
- 102, 257, 112, 144, 97, 394, 217, 261, 218, 102,
- 224, 394, 21, 256, 446, 44, 178, 305, 45, 46,
- 278, 226, 302, 282, 200, 203, 446, 53, 4, 115,
- 302, 47, 22, 285, 41, 5, 54, 247, 248, 249,
- 1, 139, 137, 267, 202, 141, 6, 87, 14, 222,
- 541, 99, 112, 151, 15, 446, 217, 261, 218, 314,
- 224, 216, 21, 256, 233, 44, 9, 446, 45, 46,
- 278, 226, 325, 282, 268, 203, 53, 53, 4, 302,
- 302, 152, 257, 361, 320, 5, 54, 247, 248, 249,
- 1, 264, 137, 102, 194, 361, 6, 87, 37, 222,
- 102, 361, 112, 257, 89, 316, 217, 261, 218, 314,
- 224, 216, 21, 36, 49, 44, 200, 40, 45, 46,
- 278, 226, 115, 282, 237, 203, 14, 53, 4, 115,
- 302, 238, 15, 155, 107, 5, 54, 247, 248, 249,
- 1, 466, 136, 256, 202, 200, 6, 87, 466, 222,
- 255, 171, 112, 264, 446, 310, 217, 261, 218, 158,
- 224, 257, 11, 142, 157, 44, 446, 183, 45, 46,
- 278, 226, 26, 282, 256, 203, 49, 53, 4, 446,
- 302, 184, 260, 323, 176, 5, 54, 247, 248, 249,
- 1, 446, 137, 264, 189, 291, 6, 87, 183, 222,
- 200, 302, 112, 253, 178, 305, 217, 261, 218, 263,
- 213, 18, 21, 200, 184, 44, 49, 15, 45, 46,
- 278, 226, 146, 282, 269, 203, 25, 53, 4, 220,
- 302, 312, 107, 152, 290, 5, 54, 247, 248, 249,
- 1, 219, 137, 147, 187, 130, 6, 87, 259, 222,
- 16, 19, 112, 256, 167, 258, 217, 261, 218, 111,
- 224, 173, 21, 96, 256, 44, 200, 23, 45, 46,
- 278, 226, 177, 282, 227, 203, 335, 53, 4, 174,
- 302, 180, 305, 170, 90, 5, 54, 247, 248, 249,
- 1, 184, 137, 256, 202, 91, 6, 87, 482, 222,
- 160, 482, 112, 214, 197, 482, 217, 261, 218, 184,
- 188, 181, 21, 245, 302, 44, 164, 140, 45, 46,
- 278, 226, 466, 282, 13, 203, 166, 53, 4, 466,
- 302, 42, 43, 286, 12, 5, 54, 247, 248, 249,
- 1, 264, 139, 447, 202, 40, 6, 87, 293, 294,
- 295, 296, 112, 17, 311, 447, 217, 261, 218, 337,
- 224, 183, 21, 260, 49, 48, 244, 245, 45, 46,
- 278, 226, 24, 282, 303, 203, 8, 53, 4, 92,
- 302, 42, 43, 286, 12, 5, 54, 247, 248, 249,
- 1, 10, 139, 9, 202, 317, 6, 87, 293, 294,
- 295, 296, 112, 116, 299, 35, 217, 261, 218, 225,
- 224, 198, 21, 98, 34, 44, 329, 324, 45, 46,
- 278, 226, 448, 282, 448, 203, 161, 53, 4, 172,
- 302, 129, 175, 225, 232, 5, 54, 288, 215, 216,
- 252, 101, 93, 109, 243, 191, 103, 85, 450, 162,
- 450, 24, 101, 330, 182, 273, 274, 300, 298, 301,
- 250, 251, 281, 204, 283, 113, 289, 262, 300, 298,
- 301, 121, 288, 215, 216, 252, 270, 93, 109, 275,
- 190, 103, 60, 277, 279, 225, 237, 101, 280, 297,
- 273, 274, 129, 239, 199, 266, 107, 281, 204, 283,
- 7, 289, 101, 300, 298, 301, 288, 88, 216, 254,
- 163, 114, 109, 265, 191, 103, 85, 200, 300, 298,
- 301, 101, 200, 259, 273, 274, 19, 165, 326, 362,
- 258, 281, 204, 283, 396, 289, 234, 300, 298, 301,
- 288, 362, 216, 327, 200, 114, 396, 362, 201, 119,
- 72, 336, 396, 37, 259, 101, 393, 19, 273, 274,
- 154, 258, 228, 339, 94, 281, 204, 283, 393, 289,
- 256, 300, 298, 301, 393, 38, 314, 288, 314, 216,
- 314, 314, 114, 207, 319, 201, 119, 72, 314, 314,
- 314, 314, 101, 221, 184, 273, 274, 156, 314, 314,
- 314, 95, 281, 204, 283, 314, 289, 256, 300, 298,
- 301, 314, 314, 314, 288, 314, 216, 314, 314, 108,
- 206, 319, 201, 122, 51, 314, 120, 314, 314, 101,
- 314, 184, 273, 274, 314, 314, 314, 314, 314, 281,
- 204, 283, 314, 289, 314, 300, 298, 301, 288, 314,
- 216, 314, 314, 114, 314, 314, 201, 122, 67, 314,
- 314, 314, 314, 101, 314, 314, 273, 274, 314, 314,
- 314, 314, 314, 281, 204, 283, 314, 289, 314, 300,
- 298, 301, 288, 314, 216, 314, 314, 114, 212, 314,
- 201, 122, 67, 314, 314, 314, 314, 101, 314, 314,
- 273, 274, 314, 314, 314, 314, 314, 281, 204, 283,
- 314, 289, 314, 300, 298, 301, 288, 314, 216, 314,
- 314, 114, 205, 314, 201, 119, 72, 314, 314, 314,
- 314, 101, 314, 314, 273, 274, 314, 314, 314, 314,
- 314, 281, 204, 283, 314, 289, 314, 300, 298, 301,
- 314, 314, 314, 288, 314, 216, 314, 314, 114, 314,
- 318, 201, 122, 78, 314, 314, 314, 314, 101, 314,
- 482, 273, 274, 482, 314, 314, 314, 482, 281, 204,
- 283, 314, 289, 209, 211, 298, 301, 288, 314, 216,
- 314, 314, 108, 314, 314, 201, 122, 58, 314, 238,
- 314, 314, 101, 314, 314, 273, 274, 314, 314, 482,
- 314, 314, 281, 204, 283, 314, 289, 314, 300, 298,
- 301, 288, 314, 216, 314, 314, 114, 314, 314, 201,
- 118, 64, 314, 314, 314, 314, 101, 314, 314, 273,
- 274, 314, 314, 314, 314, 314, 281, 204, 283, 314,
- 289, 314, 300, 298, 301, 288, 314, 216, 314, 314,
- 114, 314, 314, 196, 117, 59, 314, 314, 314, 314,
- 101, 314, 314, 273, 274, 314, 314, 314, 314, 314,
- 281, 204, 283, 314, 289, 314, 300, 298, 301, 288,
- 314, 216, 314, 314, 114, 314, 314, 201, 104, 84,
- 314, 314, 314, 314, 101, 314, 314, 273, 274, 314,
- 314, 314, 314, 314, 281, 204, 283, 314, 289, 314,
- 300, 298, 301, 288, 314, 216, 314, 314, 114, 314,
- 314, 201, 105, 83, 314, 314, 314, 314, 101, 314,
- 314, 273, 274, 314, 314, 314, 314, 314, 281, 204,
- 283, 314, 289, 314, 300, 298, 301, 288, 314, 216,
- 314, 314, 114, 314, 314, 201, 122, 55, 314, 314,
- 314, 314, 101, 314, 314, 273, 274, 314, 314, 314,
- 314, 314, 281, 204, 283, 314, 289, 314, 300, 298,
- 301, 288, 314, 216, 314, 314, 114, 314, 314, 201,
- 122, 66, 314, 314, 314, 314, 101, 314, 314, 273,
- 274, 314, 314, 314, 314, 314, 281, 204, 283, 314,
- 289, 314, 300, 298, 301, 288, 314, 216, 314, 314,
- 114, 314, 314, 201, 104, 56, 314, 314, 314, 314,
- 101, 314, 314, 273, 274, 314, 314, 314, 314, 314,
- 281, 204, 283, 314, 289, 314, 300, 298, 301, 288,
- 314, 216, 314, 314, 114, 314, 314, 201, 122, 65,
- 314, 314, 314, 314, 101, 314, 314, 273, 274, 314,
- 314, 314, 314, 314, 281, 204, 283, 314, 289, 314,
- 300, 298, 301, 288, 314, 216, 314, 314, 114, 314,
- 314, 201, 122, 57, 314, 314, 314, 314, 101, 314,
- 314, 273, 274, 314, 314, 314, 314, 314, 281, 204,
- 283, 314, 289, 314, 300, 298, 301, 288, 314, 216,
- 314, 314, 114, 314, 314, 201, 122, 58, 314, 314,
- 314, 314, 101, 314, 314, 273, 274, 314, 314, 314,
- 314, 314, 281, 204, 283, 314, 289, 314, 300, 298,
- 301, 288, 314, 216, 314, 314, 114, 314, 314, 201,
- 122, 68, 314, 314, 314, 314, 101, 314, 314, 273,
- 274, 314, 314, 314, 314, 314, 281, 204, 283, 314,
- 289, 314, 300, 298, 301, 288, 314, 216, 314, 314,
- 114, 314, 314, 201, 122, 69, 314, 314, 314, 314,
- 101, 314, 314, 273, 274, 314, 314, 314, 314, 314,
- 281, 204, 283, 314, 289, 314, 300, 298, 301, 288,
- 314, 216, 314, 314, 114, 314, 314, 201, 122, 70,
- 314, 314, 314, 314, 101, 314, 314, 273, 274, 314,
- 314, 314, 314, 314, 281, 204, 283, 314, 289, 314,
- 300, 298, 301, 288, 314, 216, 314, 314, 114, 314,
- 314, 201, 122, 71, 314, 314, 314, 314, 101, 314,
- 314, 273, 274, 314, 314, 314, 314, 314, 281, 204,
- 283, 314, 289, 314, 300, 298, 301, 288, 314, 216,
- 314, 314, 114, 314, 314, 201, 122, 73, 314, 314,
- 314, 314, 101, 314, 314, 273, 274, 314, 314, 314,
- 314, 314, 281, 204, 283, 314, 289, 314, 300, 298,
- 301, 288, 314, 216, 314, 314, 114, 314, 314, 195,
- 122, 61, 314, 314, 314, 314, 101, 314, 314, 273,
- 274, 314, 314, 314, 314, 314, 281, 204, 283, 314,
- 289, 314, 300, 298, 301, 288, 314, 216, 314, 314,
- 114, 314, 314, 201, 122, 62, 314, 314, 314, 314,
- 101, 314, 314, 273, 274, 314, 314, 314, 314, 314,
- 281, 204, 283, 314, 289, 314, 300, 298, 301, 288,
- 314, 216, 314, 314, 114, 314, 314, 201, 122, 63,
- 314, 314, 314, 314, 101, 314, 314, 273, 274, 314,
- 314, 314, 314, 314, 281, 204, 283, 314, 289, 314,
- 300, 298, 301, 288, 314, 216, 314, 314, 114, 314,
- 314, 201, 122, 74, 314, 314, 314, 314, 101, 314,
- 314, 273, 274, 314, 314, 314, 314, 314, 281, 204,
- 283, 314, 289, 314, 300, 298, 301, 288, 314, 216,
- 314, 314, 114, 314, 314, 201, 122, 75, 314, 314,
- 314, 314, 101, 314, 314, 273, 274, 314, 314, 314,
- 314, 314, 281, 204, 283, 314, 289, 314, 300, 298,
- 301, 288, 314, 216, 314, 314, 114, 314, 314, 201,
- 122, 76, 314, 314, 314, 314, 101, 314, 314, 273,
- 274, 314, 314, 314, 314, 314, 281, 204, 283, 314,
- 289, 314, 300, 298, 301, 288, 314, 216, 314, 314,
- 114, 314, 314, 201, 122, 77, 314, 314, 314, 314,
- 101, 314, 314, 273, 274, 314, 314, 314, 314, 314,
- 281, 204, 283, 314, 289, 314, 300, 298, 301, 288,
- 314, 216, 314, 314, 114, 314, 314, 201, 122, 79,
- 314, 314, 314, 314, 101, 314, 314, 273, 274, 314,
- 314, 314, 314, 314, 281, 204, 283, 314, 289, 314,
- 210, 298, 301, 288, 314, 216, 314, 314, 114, 314,
- 314, 201, 122, 80, 314, 314, 314, 314, 101, 314,
- 314, 273, 274, 314, 314, 314, 314, 314, 281, 204,
- 283, 314, 289, 314, 300, 298, 301, 288, 314, 216,
- 314, 314, 114, 314, 314, 201, 122, 81, 314, 314,
- 314, 314, 101, 314, 314, 273, 274, 314, 314, 314,
- 314, 314, 281, 204, 283, 314, 289, 314, 300, 298,
- 301, 288, 314, 216, 314, 314, 114, 314, 314, 201,
- 122, 82, 314, 314, 314, 314, 101, 314, 314, 273,
- 274, 314, 314, 314, 314, 314, 281, 204, 283, 314,
- 289, 314, 300, 298, 301, 288, 314, 216, 314, 314,
- 114, 314, 314, 201, 122, 50, 314, 314, 314, 314,
- 101, 314, 314, 273, 274, 314, 314, 314, 314, 314,
- 281, 204, 283, 314, 289, 314, 300, 298, 301, 288,
- 314, 216, 314, 314, 114, 314, 314, 201, 122, 52,
- 314, 314, 314, 314, 101, 314, 314, 273, 274, 314,
- 314, 314, 314, 314, 281, 204, 283, 314, 289, 314,
- 300, 298, 301, 288, 314, 216, 168, 314, 114, 314,
- 314, 201, 134, 314, 314, 314, 256, 314, 101, 47,
- 22, 285, 41, 314, 314, 314, 314, 333, 281, 204,
- 283, 314, 289, 314, 300, 298, 301, 288, 314, 216,
- 145, 314, 114, 314, 314, 201, 128, 314, 314, 314,
- 256, 314, 101, 47, 22, 285, 41, 314, 314, 314,
- 314, 287, 281, 204, 283, 315, 289, 314, 300, 298,
- 301, 247, 248, 249, 2, 314, 313, 314, 314, 314,
- 6, 87, 259, 314, 314, 19, 112, 314, 14, 258,
- 217, 261, 218, 314, 15, 39, 314, 14, 14, 42,
- 43, 286, 12, 15, 15, 314, 314, 314, 42, 43,
- 286, 12, 314, 314, 314, 314, 293, 294, 295, 296,
- 308, 27, 314, 314, 315, 293, 294, 295, 296, 314,
- 247, 248, 249, 2, 314, 313, 314, 110, 314, 6,
- 87, 314, 314, 314, 314, 112, 314, 314, 148, 217,
- 261, 218, 314, 42, 43, 286, 12, 314, 42, 43,
- 286, 12, 314, 314, 314, 314, 314, 314, 314, 314,
- 293, 294, 295, 296, 314, 293, 294, 295, 296, 309,
- 27, 314, 314, 240, 241, 242, 133, 223, 314, 247,
- 248, 249, 1, 314, 482, 314, 314, 482, 6, 87,
- 3, 482, 466, 314, 112, 314, 276, 314, 217, 261,
- 218, 288, 314, 216, 314, 314, 114, 314, 314, 201,
- 132, 314, 314, 314, 314, 314, 101, 314, 466, 314,
- 314, 466, 314, 482, 314, 466, 281, 204, 283, 314,
- 289, 314, 300, 298, 301, 314, 288, 314, 216, 314,
- 200, 114, 314, 314, 201, 123, 314, 314, 314, 314,
- 314, 101, 365, 314, 314, 314, 230, 314, 314, 314,
- 314, 281, 204, 283, 14, 289, 314, 300, 298, 301,
- 15, 314, 288, 446, 216, 314, 169, 114, 314, 314,
- 201, 124, 314, 314, 314, 446, 256, 101, 314, 47,
- 22, 285, 41, 314, 314, 314, 314, 281, 204, 283,
- 314, 289, 314, 300, 298, 301, 314, 288, 314, 216,
- 314, 314, 114, 314, 314, 201, 125, 314, 314, 314,
- 314, 314, 101, 314, 314, 314, 314, 314, 314, 314,
- 314, 314, 281, 204, 283, 314, 289, 314, 300, 298,
- 301, 314, 314, 288, 314, 216, 314, 314, 114, 314,
- 314, 201, 126, 314, 314, 314, 314, 314, 101, 314,
- 314, 314, 314, 314, 314, 314, 314, 314, 281, 204,
- 283, 314, 289, 314, 300, 298, 301, 314, 288, 314,
- 216, 314, 314, 114, 314, 314, 201, 127, 314, 314,
- 314, 314, 314, 101, 314, 314, 314, 314, 314, 314,
- 314, 314, 314, 281, 204, 283, 314, 289, 314, 300,
- 298, 301, 314, 314, 288, 314, 216, 223, 314, 114,
- 314, 314, 201, 131, 482, 314, 314, 482, 314, 101,
- 314, 482, 466, 314, 314, 314, 276, 314, 314, 281,
- 204, 283, 314, 289, 314, 300, 298, 301, 314, 314,
- 409, 314, 314, 314, 314, 314, 314, 314, 466, 314,
- 314, 466, 314, 482, 223, 466, 292, 314, 314, 314,
- 314, 482, 314, 314, 482, 314, 314, 36, 482, 466,
- 314, 223, 446, 276, 409, 409, 409, 409, 482, 314,
- 314, 482, 314, 314, 446, 482, 466, 314, 314, 30,
- 276, 409, 409, 409, 409, 466, 482, 314, 466, 482,
- 482, 314, 466, 482, 466, 314, 314, 314, 276, 314,
- 314, 314, 466, 314, 314, 466, 332, 482, 314, 466,
- 314, 314, 314, 314, 314, 331, 42, 43, 286, 12,
- 466, 314, 314, 466, 314, 482, 314, 466, 314, 42,
- 43, 286, 12, 293, 294, 295, 296, 307, 314, 42,
- 43, 286, 12, 185, 314, 314, 293, 294, 295, 296,
- 186, 314, 314, 314, 322, 314, 293, 294, 295, 296,
- 42, 43, 286, 12, 31, 314, 42, 43, 286, 12,
- 314, 334, 314, 42, 43, 286, 12, 293, 294, 295,
- 296, 314, 314, 293, 294, 295, 296, 314, 314, 314,
- 293, 294, 295, 296, 42, 43, 286, 12, 42, 43,
- 286, 12, 482, 314, 314, 482, 314, 314, 314, 482,
- 466, 293, 294, 295, 296, 293, 294, 295, 296, 314,
- 314, 314, 259, 314, 314, 19, 314, 314, 314, 258,
- 314, 314, 314, 314, 314, 314, 466, 314, 14, 466,
- 150, 482, 314, 466, 15,
+ 30, 47, 22, 292, 41, 14, 48, 252, 253, 254,
+ 1, 15, 142, 242, 208, 206, 6, 88, 206, 228,
+ 244, 205, 114, 109, 406, 206, 223, 266, 224, 103,
+ 230, 406, 21, 406, 226, 44, 406, 29, 45, 46,
+ 283, 232, 406, 287, 406, 209, 406, 54, 4, 14,
+ 304, 186, 333, 290, 231, 15, 5, 86, 252, 253,
+ 254, 1, 103, 139, 400, 199, 241, 6, 88, 518,
+ 228, 552, 101, 114, 153, 258, 400, 223, 266, 224,
+ 144, 213, 400, 21, 261, 453, 44, 13, 144, 45,
+ 46, 283, 232, 206, 240, 13, 209, 453, 54, 4,
+ 332, 304, 206, 40, 262, 368, 156, 5, 86, 252,
+ 253, 254, 1, 143, 102, 272, 87, 368, 6, 88,
+ 310, 228, 103, 368, 114, 319, 156, 222, 223, 266,
+ 224, 274, 230, 184, 21, 290, 143, 44, 235, 10,
+ 45, 46, 283, 232, 175, 287, 273, 209, 54, 54,
+ 4, 304, 304, 251, 183, 222, 290, 180, 5, 86,
+ 252, 253, 254, 1, 20, 141, 198, 208, 276, 6,
+ 88, 54, 228, 315, 304, 114, 190, 265, 453, 223,
+ 266, 224, 206, 230, 277, 21, 147, 238, 44, 190,
+ 453, 45, 46, 283, 232, 329, 287, 3, 209, 103,
+ 54, 4, 146, 304, 304, 289, 98, 311, 23, 5,
+ 86, 252, 253, 254, 1, 269, 141, 134, 200, 367,
+ 6, 88, 25, 228, 304, 367, 114, 108, 117, 453,
+ 223, 266, 224, 34, 230, 233, 21, 167, 53, 44,
+ 304, 453, 45, 46, 283, 232, 103, 287, 37, 209,
+ 103, 54, 4, 336, 304, 157, 206, 262, 367, 145,
+ 5, 86, 252, 253, 254, 1, 269, 140, 402, 208,
+ 367, 6, 88, 304, 228, 117, 367, 114, 155, 117,
+ 402, 223, 266, 224, 260, 230, 402, 11, 261, 53,
+ 44, 206, 24, 45, 46, 283, 232, 206, 287, 166,
+ 209, 262, 54, 4, 183, 304, 290, 163, 262, 399,
+ 262, 5, 86, 252, 253, 254, 1, 261, 141, 165,
+ 195, 399, 6, 88, 36, 228, 274, 399, 114, 261,
+ 242, 113, 223, 266, 224, 91, 219, 344, 21, 341,
+ 109, 44, 18, 189, 45, 46, 283, 232, 15, 287,
+ 242, 209, 473, 54, 4, 189, 304, 243, 269, 473,
+ 109, 177, 5, 86, 252, 253, 254, 1, 33, 141,
+ 148, 193, 92, 6, 88, 264, 228, 304, 19, 114,
+ 261, 53, 263, 223, 266, 224, 159, 230, 327, 21,
+ 10, 150, 44, 190, 206, 45, 46, 283, 232, 151,
+ 287, 109, 209, 161, 54, 4, 269, 304, 182, 261,
+ 118, 171, 168, 5, 86, 252, 253, 254, 1, 16,
+ 141, 261, 208, 8, 6, 88, 181, 228, 290, 53,
+ 114, 319, 97, 222, 223, 266, 224, 185, 194, 290,
+ 21, 325, 297, 44, 298, 317, 45, 46, 283, 232,
+ 174, 287, 473, 209, 134, 54, 4, 189, 304, 473,
+ 261, 178, 220, 203, 5, 86, 252, 253, 254, 1,
+ 187, 143, 250, 208, 40, 6, 88, 489, 90, 321,
+ 489, 114, 17, 265, 489, 223, 266, 224, 343, 230,
+ 269, 21, 291, 190, 49, 249, 250, 45, 46, 283,
+ 232, 268, 287, 8, 209, 322, 54, 4, 7, 304,
+ 204, 453, 31, 53, 100, 5, 86, 252, 253, 254,
+ 1, 93, 143, 453, 208, 162, 6, 88, 455, 95,
+ 455, 454, 114, 225, 9, 261, 223, 266, 224, 231,
+ 230, 99, 21, 454, 176, 44, 119, 328, 45, 46,
+ 283, 232, 457, 287, 457, 209, 169, 54, 4, 170,
+ 304, 190, 32, 32, 334, 335, 5, 86, 179, 295,
+ 221, 222, 257, 248, 94, 111, 255, 197, 105, 85,
+ 35, 256, 231, 188, 104, 115, 267, 278, 279, 284,
+ 164, 124, 275, 280, 96, 286, 210, 288, 282, 296,
+ 261, 302, 301, 303, 295, 221, 222, 257, 231, 94,
+ 111, 300, 196, 105, 60, 285, 89, 239, 342, 104,
+ 158, 160, 278, 279, 37, 330, 190, 345, 331, 38,
+ 286, 210, 288, 322, 296, 322, 302, 301, 303, 295,
+ 322, 222, 259, 322, 116, 111, 322, 197, 105, 85,
+ 322, 322, 264, 322, 104, 19, 322, 278, 279, 263,
+ 322, 322, 322, 322, 322, 286, 210, 288, 322, 296,
+ 322, 302, 301, 303, 295, 322, 222, 322, 112, 116,
+ 322, 322, 207, 121, 71, 322, 322, 322, 322, 104,
+ 322, 234, 278, 279, 42, 43, 293, 12, 322, 322,
+ 286, 210, 288, 322, 296, 322, 302, 301, 303, 322,
+ 322, 305, 306, 307, 308, 309, 295, 322, 222, 212,
+ 324, 116, 322, 322, 207, 121, 71, 14, 322, 489,
+ 322, 104, 489, 15, 278, 279, 489, 473, 42, 43,
+ 293, 12, 286, 210, 288, 322, 296, 322, 302, 301,
+ 303, 322, 322, 322, 322, 305, 306, 307, 308, 309,
+ 322, 211, 324, 473, 322, 322, 473, 295, 489, 222,
+ 473, 322, 110, 322, 322, 207, 125, 51, 322, 123,
+ 264, 322, 104, 19, 322, 278, 279, 263, 322, 322,
+ 322, 322, 322, 286, 210, 288, 322, 296, 322, 302,
+ 301, 303, 295, 322, 222, 322, 322, 116, 322, 322,
+ 207, 125, 67, 133, 322, 322, 236, 104, 322, 227,
+ 278, 279, 322, 104, 322, 322, 322, 322, 286, 210,
+ 288, 322, 296, 322, 302, 301, 303, 322, 322, 322,
+ 302, 301, 303, 295, 217, 222, 322, 322, 116, 322,
+ 322, 207, 121, 71, 322, 322, 322, 322, 104, 322,
+ 322, 278, 279, 322, 322, 322, 322, 322, 322, 286,
+ 210, 288, 322, 296, 322, 302, 301, 303, 295, 322,
+ 222, 322, 322, 116, 322, 322, 207, 125, 77, 323,
+ 322, 322, 322, 104, 322, 322, 278, 279, 322, 322,
+ 322, 322, 322, 322, 286, 210, 288, 322, 296, 214,
+ 216, 301, 303, 322, 322, 295, 322, 222, 322, 322,
+ 116, 322, 322, 207, 125, 67, 322, 322, 322, 322,
+ 104, 322, 322, 278, 279, 322, 322, 322, 322, 322,
+ 322, 286, 210, 288, 322, 296, 322, 302, 301, 303,
+ 295, 322, 222, 322, 322, 110, 322, 218, 207, 125,
+ 58, 322, 243, 322, 322, 104, 322, 322, 278, 279,
+ 322, 322, 264, 322, 322, 19, 286, 210, 288, 263,
+ 296, 322, 302, 301, 303, 322, 322, 295, 14, 222,
+ 154, 322, 116, 322, 15, 207, 122, 62, 322, 322,
+ 489, 322, 104, 489, 322, 278, 279, 489, 322, 322,
+ 322, 322, 322, 286, 210, 288, 322, 296, 322, 302,
+ 301, 303, 295, 322, 222, 322, 322, 116, 322, 322,
+ 202, 120, 59, 322, 322, 322, 322, 104, 322, 489,
+ 278, 279, 322, 322, 322, 322, 322, 322, 286, 210,
+ 288, 322, 296, 322, 302, 301, 303, 322, 322, 295,
+ 322, 222, 322, 322, 116, 322, 322, 207, 106, 84,
+ 322, 322, 322, 322, 104, 322, 322, 278, 279, 322,
+ 322, 322, 322, 322, 322, 286, 210, 288, 322, 296,
+ 322, 302, 301, 303, 295, 322, 222, 322, 322, 116,
+ 322, 322, 207, 107, 83, 322, 322, 322, 322, 104,
+ 322, 322, 278, 279, 322, 322, 322, 322, 322, 322,
+ 286, 210, 288, 322, 296, 322, 302, 301, 303, 322,
+ 322, 295, 322, 222, 322, 322, 116, 322, 322, 207,
+ 125, 55, 322, 322, 322, 322, 104, 322, 322, 278,
+ 279, 322, 322, 322, 322, 322, 322, 286, 210, 288,
+ 322, 296, 322, 302, 301, 303, 295, 322, 222, 322,
+ 322, 116, 322, 322, 207, 125, 66, 322, 322, 322,
+ 322, 104, 322, 322, 278, 279, 322, 322, 322, 322,
+ 322, 322, 286, 210, 288, 322, 296, 322, 302, 301,
+ 303, 322, 322, 295, 322, 222, 322, 322, 116, 322,
+ 322, 207, 106, 56, 322, 322, 322, 322, 104, 322,
+ 322, 278, 279, 322, 322, 322, 322, 322, 322, 286,
+ 210, 288, 322, 296, 322, 302, 301, 303, 295, 322,
+ 222, 322, 322, 116, 322, 322, 207, 125, 65, 322,
+ 322, 322, 322, 104, 322, 322, 278, 279, 322, 322,
+ 322, 322, 322, 322, 286, 210, 288, 322, 296, 322,
+ 302, 301, 303, 322, 322, 295, 322, 222, 322, 322,
+ 116, 322, 322, 207, 125, 57, 322, 322, 322, 322,
+ 104, 322, 322, 278, 279, 322, 322, 322, 322, 322,
+ 322, 286, 210, 288, 322, 296, 322, 302, 301, 303,
+ 295, 322, 222, 322, 322, 116, 322, 322, 207, 125,
+ 58, 322, 322, 322, 322, 104, 322, 322, 278, 279,
+ 322, 322, 322, 322, 322, 322, 286, 210, 288, 322,
+ 296, 322, 302, 301, 303, 322, 322, 295, 322, 222,
+ 322, 322, 116, 322, 322, 207, 125, 68, 322, 322,
+ 322, 322, 104, 322, 322, 278, 279, 322, 322, 322,
+ 322, 322, 322, 286, 210, 288, 322, 296, 322, 302,
+ 301, 303, 295, 322, 222, 322, 322, 116, 322, 322,
+ 207, 125, 69, 322, 322, 322, 322, 104, 322, 322,
+ 278, 279, 322, 322, 322, 322, 322, 322, 286, 210,
+ 288, 322, 296, 322, 302, 301, 303, 322, 322, 295,
+ 322, 222, 322, 322, 116, 322, 322, 207, 125, 70,
+ 322, 322, 322, 322, 104, 322, 322, 278, 279, 322,
+ 322, 322, 322, 322, 322, 286, 210, 288, 322, 296,
+ 322, 302, 301, 303, 295, 322, 222, 322, 322, 116,
+ 322, 322, 207, 125, 72, 322, 322, 322, 322, 104,
+ 322, 322, 278, 279, 322, 322, 322, 322, 322, 322,
+ 286, 210, 288, 322, 296, 322, 302, 301, 303, 322,
+ 322, 295, 322, 222, 322, 322, 116, 322, 322, 201,
+ 125, 61, 322, 322, 322, 322, 104, 322, 322, 278,
+ 279, 322, 322, 322, 322, 322, 322, 286, 210, 288,
+ 322, 296, 322, 302, 301, 303, 295, 322, 222, 322,
+ 322, 116, 322, 322, 207, 125, 73, 322, 322, 322,
+ 322, 104, 322, 322, 278, 279, 322, 322, 322, 322,
+ 322, 322, 286, 210, 288, 322, 296, 322, 302, 301,
+ 303, 322, 322, 295, 322, 222, 322, 322, 116, 322,
+ 322, 207, 125, 74, 322, 322, 322, 322, 104, 322,
+ 322, 278, 279, 322, 322, 322, 322, 322, 322, 286,
+ 210, 288, 322, 296, 322, 302, 301, 303, 295, 322,
+ 222, 322, 322, 116, 322, 322, 207, 125, 75, 322,
+ 322, 322, 322, 104, 322, 322, 278, 279, 322, 322,
+ 322, 322, 322, 322, 286, 210, 288, 322, 296, 322,
+ 302, 301, 303, 322, 322, 295, 322, 222, 322, 322,
+ 116, 322, 322, 207, 125, 76, 322, 322, 322, 322,
+ 104, 322, 322, 278, 279, 322, 322, 322, 322, 322,
+ 322, 286, 210, 288, 322, 296, 322, 302, 301, 303,
+ 295, 322, 222, 322, 322, 116, 322, 322, 207, 125,
+ 78, 322, 322, 322, 322, 104, 322, 322, 278, 279,
+ 322, 322, 322, 322, 322, 322, 286, 210, 288, 322,
+ 296, 322, 215, 301, 303, 322, 322, 295, 322, 222,
+ 322, 322, 116, 322, 322, 207, 125, 79, 322, 322,
+ 322, 322, 104, 322, 322, 278, 279, 322, 322, 322,
+ 322, 322, 322, 286, 210, 288, 322, 296, 322, 302,
+ 301, 303, 295, 322, 222, 322, 322, 116, 322, 322,
+ 207, 125, 63, 322, 322, 322, 322, 104, 322, 322,
+ 278, 279, 322, 322, 322, 322, 322, 322, 286, 210,
+ 288, 322, 296, 322, 302, 301, 303, 322, 322, 295,
+ 322, 222, 322, 322, 116, 322, 322, 207, 125, 64,
+ 322, 322, 322, 322, 104, 322, 322, 278, 279, 322,
+ 322, 322, 322, 322, 322, 286, 210, 288, 322, 296,
+ 322, 302, 301, 303, 295, 322, 222, 322, 322, 116,
+ 322, 322, 207, 125, 80, 322, 322, 322, 322, 104,
+ 322, 322, 278, 279, 322, 322, 322, 322, 322, 322,
+ 286, 210, 288, 322, 296, 322, 302, 301, 303, 322,
+ 322, 295, 322, 222, 322, 322, 116, 322, 322, 207,
+ 125, 81, 322, 322, 322, 322, 104, 322, 322, 278,
+ 279, 322, 322, 322, 322, 322, 322, 286, 210, 288,
+ 322, 296, 322, 302, 301, 303, 295, 322, 222, 322,
+ 322, 116, 322, 322, 207, 125, 82, 322, 322, 322,
+ 322, 104, 322, 322, 278, 279, 322, 322, 322, 322,
+ 322, 322, 286, 210, 288, 322, 296, 322, 302, 301,
+ 303, 322, 322, 295, 322, 222, 322, 322, 116, 322,
+ 322, 207, 125, 50, 322, 322, 322, 322, 104, 322,
+ 322, 278, 279, 322, 322, 322, 322, 322, 322, 286,
+ 210, 288, 322, 296, 322, 302, 301, 303, 295, 322,
+ 222, 322, 322, 116, 322, 322, 207, 125, 52, 322,
+ 322, 322, 322, 104, 322, 322, 278, 279, 322, 322,
+ 322, 322, 322, 322, 286, 210, 288, 322, 296, 322,
+ 302, 301, 303, 322, 322, 295, 322, 222, 322, 322,
+ 116, 322, 322, 207, 138, 322, 322, 322, 322, 295,
+ 104, 222, 322, 322, 116, 322, 322, 207, 131, 339,
+ 322, 286, 210, 288, 104, 296, 322, 302, 301, 303,
+ 322, 322, 322, 294, 322, 286, 210, 288, 322, 296,
+ 320, 302, 301, 303, 322, 322, 252, 253, 254, 2,
+ 322, 318, 322, 322, 322, 6, 88, 322, 322, 322,
+ 322, 114, 322, 322, 152, 223, 266, 224, 322, 322,
+ 322, 39, 322, 14, 42, 43, 293, 12, 322, 15,
+ 322, 322, 322, 322, 42, 43, 293, 12, 322, 322,
+ 322, 305, 306, 307, 308, 309, 313, 26, 322, 322,
+ 320, 305, 306, 307, 308, 309, 252, 253, 254, 2,
+ 322, 318, 322, 322, 322, 6, 88, 264, 322, 322,
+ 19, 114, 322, 322, 263, 223, 266, 224, 337, 42,
+ 43, 293, 12, 14, 42, 43, 293, 12, 322, 15,
+ 322, 322, 322, 322, 322, 322, 305, 306, 307, 308,
+ 309, 305, 306, 307, 308, 309, 314, 26, 316, 322,
+ 245, 246, 247, 137, 229, 322, 252, 253, 254, 1,
+ 322, 489, 322, 322, 489, 6, 88, 3, 489, 473,
+ 322, 114, 322, 281, 322, 223, 266, 224, 295, 322,
+ 222, 322, 322, 116, 322, 322, 207, 136, 322, 322,
+ 322, 322, 322, 104, 322, 473, 322, 322, 473, 322,
+ 489, 322, 473, 322, 286, 210, 288, 322, 296, 322,
+ 302, 301, 303, 322, 295, 322, 222, 172, 322, 116,
+ 322, 322, 207, 126, 322, 322, 322, 261, 322, 104,
+ 47, 22, 292, 41, 322, 48, 322, 322, 322, 322,
+ 286, 210, 288, 322, 296, 322, 302, 301, 303, 322,
+ 295, 322, 222, 322, 149, 116, 322, 322, 207, 127,
+ 322, 322, 322, 322, 261, 104, 322, 47, 22, 292,
+ 41, 322, 48, 322, 322, 322, 286, 210, 288, 322,
+ 296, 322, 302, 301, 303, 322, 295, 322, 222, 322,
+ 173, 116, 322, 322, 207, 128, 322, 322, 322, 322,
+ 261, 104, 322, 47, 22, 292, 41, 133, 48, 322,
+ 271, 322, 286, 210, 288, 322, 296, 104, 302, 301,
+ 303, 322, 295, 322, 222, 322, 322, 116, 322, 270,
+ 207, 129, 322, 322, 302, 301, 303, 104, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322, 286, 210,
+ 288, 322, 296, 322, 302, 301, 303, 322, 295, 322,
+ 222, 322, 322, 116, 322, 322, 207, 130, 322, 322,
+ 322, 322, 322, 104, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 286, 210, 288, 322, 296, 322,
+ 302, 301, 303, 322, 295, 322, 222, 322, 322, 116,
+ 322, 206, 207, 132, 322, 322, 322, 322, 322, 104,
+ 322, 322, 322, 371, 322, 322, 322, 237, 322, 322,
+ 286, 210, 288, 322, 296, 14, 302, 301, 303, 322,
+ 295, 15, 222, 415, 453, 116, 322, 322, 207, 135,
+ 322, 322, 322, 322, 322, 104, 453, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 286, 210, 288, 322,
+ 296, 322, 302, 301, 303, 453, 322, 415, 415, 415,
+ 415, 322, 322, 322, 322, 322, 322, 453, 322, 322,
+ 322, 322, 322, 322, 415, 415, 415, 415, 415, 229,
+ 322, 322, 322, 322, 322, 322, 489, 322, 322, 489,
+ 322, 322, 229, 489, 473, 322, 322, 322, 281, 489,
+ 322, 322, 489, 322, 322, 36, 489, 473, 322, 322,
+ 322, 281, 322, 322, 322, 322, 322, 322, 322, 338,
+ 473, 322, 322, 473, 322, 489, 322, 473, 299, 322,
+ 322, 322, 322, 473, 322, 322, 473, 322, 489, 322,
+ 473, 28, 42, 43, 293, 12, 322, 312, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322, 322, 305,
+ 306, 307, 308, 309, 42, 43, 293, 12, 322, 322,
+ 42, 43, 293, 12, 191, 42, 43, 293, 12, 326,
+ 192, 305, 306, 307, 308, 309, 340, 305, 306, 307,
+ 308, 309, 305, 306, 307, 308, 309, 42, 43, 293,
+ 12, 322, 322, 42, 43, 293, 12, 322, 322, 42,
+ 43, 293, 12, 322, 305, 306, 307, 308, 309, 322,
+ 305, 306, 307, 308, 309, 229, 305, 306, 307, 308,
+ 309, 27, 489, 322, 322, 489, 322, 322, 489, 489,
+ 473, 489, 322, 322, 281, 489, 473, 322, 322, 322,
+ 281, 322, 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 473, 322, 322, 473,
+ 322, 489, 473, 473, 322, 473, 322, 489, 322, 473,
+ 322, 42, 43, 293, 12, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322, 305, 306,
+ 307, 308, 309,
);
public static $yy_lookahead = array(
- 2, 80, 100, 13, 102, 103, 1, 9, 10, 11,
- 12, 21, 14, 70, 16, 25, 18, 19, 93, 21,
- 77, 31, 24, 80, 13, 104, 28, 29, 30, 104,
- 32, 20, 34, 22, 44, 37, 25, 39, 40, 41,
- 42, 43, 31, 45, 33, 47, 35, 49, 50, 14,
- 52, 16, 12, 17, 43, 57, 58, 9, 10, 11,
- 12, 12, 14, 14, 16, 16, 18, 19, 65, 21,
- 67, 12, 24, 14, 34, 16, 28, 29, 30, 43,
- 32, 32, 34, 1, 49, 37, 50, 52, 40, 41,
- 42, 43, 72, 45, 99, 47, 101, 49, 50, 51,
- 52, 52, 82, 69, 14, 57, 58, 9, 10, 11,
- 12, 52, 14, 13, 16, 15, 18, 19, 15, 21,
- 17, 101, 24, 72, 34, 25, 28, 29, 30, 17,
- 32, 31, 34, 82, 34, 37, 102, 103, 40, 41,
- 42, 43, 52, 45, 1, 47, 46, 49, 50, 46,
- 52, 85, 86, 87, 88, 57, 58, 9, 10, 11,
- 12, 14, 14, 16, 16, 80, 18, 19, 25, 21,
- 61, 62, 24, 72, 31, 34, 28, 29, 30, 65,
- 32, 67, 34, 82, 43, 37, 33, 46, 40, 41,
- 42, 43, 51, 45, 47, 47, 49, 49, 50, 52,
- 52, 99, 101, 13, 51, 57, 58, 9, 10, 11,
- 12, 21, 14, 17, 16, 25, 18, 19, 15, 21,
- 17, 31, 24, 101, 110, 111, 28, 29, 30, 65,
- 32, 67, 34, 15, 44, 37, 1, 2, 40, 41,
- 42, 43, 46, 45, 70, 47, 25, 49, 50, 46,
- 52, 77, 31, 72, 80, 57, 58, 9, 10, 11,
- 12, 43, 14, 82, 16, 1, 18, 19, 50, 21,
- 82, 76, 24, 21, 34, 111, 28, 29, 30, 99,
- 32, 101, 34, 14, 72, 37, 46, 106, 40, 41,
- 42, 43, 27, 45, 82, 47, 44, 49, 50, 34,
- 52, 106, 107, 51, 76, 57, 58, 9, 10, 11,
- 12, 46, 14, 21, 16, 51, 18, 19, 106, 21,
- 1, 52, 24, 69, 102, 103, 28, 29, 30, 16,
- 32, 25, 34, 1, 106, 37, 44, 31, 40, 41,
- 42, 43, 70, 45, 100, 47, 27, 49, 50, 17,
- 52, 59, 80, 99, 93, 57, 58, 9, 10, 11,
- 12, 48, 14, 72, 16, 104, 18, 19, 9, 21,
- 20, 12, 24, 82, 72, 16, 28, 29, 30, 79,
- 32, 76, 34, 33, 82, 37, 1, 2, 40, 41,
- 42, 43, 14, 45, 16, 47, 14, 49, 50, 76,
- 52, 102, 103, 72, 80, 57, 58, 9, 10, 11,
- 12, 106, 14, 82, 16, 80, 18, 19, 9, 21,
- 99, 12, 24, 63, 64, 16, 28, 29, 30, 106,
- 32, 6, 34, 8, 52, 37, 99, 43, 40, 41,
- 42, 43, 43, 45, 50, 47, 99, 49, 50, 50,
- 52, 36, 37, 38, 39, 57, 58, 9, 10, 11,
- 12, 21, 14, 34, 16, 2, 18, 19, 53, 54,
- 55, 56, 24, 15, 59, 46, 28, 29, 30, 21,
- 32, 106, 34, 107, 44, 37, 7, 8, 40, 41,
- 42, 43, 33, 45, 35, 47, 34, 49, 50, 99,
- 52, 36, 37, 38, 39, 57, 58, 9, 10, 11,
- 12, 34, 14, 33, 16, 35, 18, 19, 53, 54,
- 55, 56, 24, 46, 103, 15, 28, 29, 30, 43,
- 32, 64, 34, 81, 33, 37, 35, 51, 40, 41,
- 42, 43, 33, 45, 35, 47, 99, 49, 50, 81,
- 52, 70, 81, 43, 73, 57, 58, 65, 66, 67,
- 68, 80, 70, 71, 7, 73, 74, 75, 33, 99,
- 35, 33, 80, 35, 16, 83, 84, 96, 97, 98,
- 13, 13, 90, 91, 92, 16, 94, 16, 96, 97,
- 98, 16, 65, 66, 67, 68, 16, 70, 71, 14,
- 73, 74, 75, 16, 32, 43, 70, 80, 32, 16,
- 83, 84, 70, 77, 78, 73, 80, 90, 91, 92,
- 34, 94, 80, 96, 97, 98, 65, 16, 67, 68,
- 49, 70, 71, 91, 73, 74, 75, 1, 96, 97,
- 98, 80, 1, 9, 83, 84, 12, 49, 51, 13,
- 16, 90, 91, 92, 13, 94, 16, 96, 97, 98,
- 65, 25, 67, 51, 1, 70, 25, 31, 73, 74,
- 75, 16, 31, 15, 9, 80, 13, 12, 83, 84,
- 72, 16, 48, 35, 76, 90, 91, 92, 25, 94,
- 82, 96, 97, 98, 31, 22, 112, 65, 112, 67,
- 112, 112, 70, 108, 109, 73, 74, 75, 112, 112,
- 112, 112, 80, 48, 106, 83, 84, 72, 112, 112,
- 112, 76, 90, 91, 92, 112, 94, 82, 96, 97,
- 98, 112, 112, 112, 65, 112, 67, 112, 112, 70,
- 108, 109, 73, 74, 75, 112, 77, 112, 112, 80,
- 112, 106, 83, 84, 112, 112, 112, 112, 112, 90,
- 91, 92, 112, 94, 112, 96, 97, 98, 65, 112,
- 67, 112, 112, 70, 112, 112, 73, 74, 75, 112,
- 112, 112, 112, 80, 112, 112, 83, 84, 112, 112,
- 112, 112, 112, 90, 91, 92, 112, 94, 112, 96,
- 97, 98, 65, 112, 67, 112, 112, 70, 105, 112,
- 73, 74, 75, 112, 112, 112, 112, 80, 112, 112,
- 83, 84, 112, 112, 112, 112, 112, 90, 91, 92,
- 112, 94, 112, 96, 97, 98, 65, 112, 67, 112,
- 112, 70, 105, 112, 73, 74, 75, 112, 112, 112,
- 112, 80, 112, 112, 83, 84, 112, 112, 112, 112,
- 112, 90, 91, 92, 112, 94, 112, 96, 97, 98,
- 112, 112, 112, 65, 112, 67, 112, 112, 70, 112,
- 109, 73, 74, 75, 112, 112, 112, 112, 80, 112,
- 9, 83, 84, 12, 112, 112, 112, 16, 90, 91,
- 92, 112, 94, 95, 96, 97, 98, 65, 112, 67,
- 112, 112, 70, 112, 112, 73, 74, 75, 112, 77,
- 112, 112, 80, 112, 112, 83, 84, 112, 112, 48,
- 112, 112, 90, 91, 92, 112, 94, 112, 96, 97,
- 98, 65, 112, 67, 112, 112, 70, 112, 112, 73,
- 74, 75, 112, 112, 112, 112, 80, 112, 112, 83,
- 84, 112, 112, 112, 112, 112, 90, 91, 92, 112,
- 94, 112, 96, 97, 98, 65, 112, 67, 112, 112,
- 70, 112, 112, 73, 74, 75, 112, 112, 112, 112,
- 80, 112, 112, 83, 84, 112, 112, 112, 112, 112,
- 90, 91, 92, 112, 94, 112, 96, 97, 98, 65,
- 112, 67, 112, 112, 70, 112, 112, 73, 74, 75,
- 112, 112, 112, 112, 80, 112, 112, 83, 84, 112,
- 112, 112, 112, 112, 90, 91, 92, 112, 94, 112,
- 96, 97, 98, 65, 112, 67, 112, 112, 70, 112,
- 112, 73, 74, 75, 112, 112, 112, 112, 80, 112,
- 112, 83, 84, 112, 112, 112, 112, 112, 90, 91,
- 92, 112, 94, 112, 96, 97, 98, 65, 112, 67,
- 112, 112, 70, 112, 112, 73, 74, 75, 112, 112,
- 112, 112, 80, 112, 112, 83, 84, 112, 112, 112,
- 112, 112, 90, 91, 92, 112, 94, 112, 96, 97,
- 98, 65, 112, 67, 112, 112, 70, 112, 112, 73,
- 74, 75, 112, 112, 112, 112, 80, 112, 112, 83,
- 84, 112, 112, 112, 112, 112, 90, 91, 92, 112,
- 94, 112, 96, 97, 98, 65, 112, 67, 112, 112,
- 70, 112, 112, 73, 74, 75, 112, 112, 112, 112,
- 80, 112, 112, 83, 84, 112, 112, 112, 112, 112,
- 90, 91, 92, 112, 94, 112, 96, 97, 98, 65,
- 112, 67, 112, 112, 70, 112, 112, 73, 74, 75,
- 112, 112, 112, 112, 80, 112, 112, 83, 84, 112,
- 112, 112, 112, 112, 90, 91, 92, 112, 94, 112,
- 96, 97, 98, 65, 112, 67, 112, 112, 70, 112,
- 112, 73, 74, 75, 112, 112, 112, 112, 80, 112,
- 112, 83, 84, 112, 112, 112, 112, 112, 90, 91,
- 92, 112, 94, 112, 96, 97, 98, 65, 112, 67,
- 112, 112, 70, 112, 112, 73, 74, 75, 112, 112,
- 112, 112, 80, 112, 112, 83, 84, 112, 112, 112,
- 112, 112, 90, 91, 92, 112, 94, 112, 96, 97,
- 98, 65, 112, 67, 112, 112, 70, 112, 112, 73,
- 74, 75, 112, 112, 112, 112, 80, 112, 112, 83,
- 84, 112, 112, 112, 112, 112, 90, 91, 92, 112,
- 94, 112, 96, 97, 98, 65, 112, 67, 112, 112,
- 70, 112, 112, 73, 74, 75, 112, 112, 112, 112,
- 80, 112, 112, 83, 84, 112, 112, 112, 112, 112,
- 90, 91, 92, 112, 94, 112, 96, 97, 98, 65,
- 112, 67, 112, 112, 70, 112, 112, 73, 74, 75,
- 112, 112, 112, 112, 80, 112, 112, 83, 84, 112,
- 112, 112, 112, 112, 90, 91, 92, 112, 94, 112,
- 96, 97, 98, 65, 112, 67, 112, 112, 70, 112,
- 112, 73, 74, 75, 112, 112, 112, 112, 80, 112,
- 112, 83, 84, 112, 112, 112, 112, 112, 90, 91,
- 92, 112, 94, 112, 96, 97, 98, 65, 112, 67,
- 112, 112, 70, 112, 112, 73, 74, 75, 112, 112,
- 112, 112, 80, 112, 112, 83, 84, 112, 112, 112,
- 112, 112, 90, 91, 92, 112, 94, 112, 96, 97,
- 98, 65, 112, 67, 112, 112, 70, 112, 112, 73,
- 74, 75, 112, 112, 112, 112, 80, 112, 112, 83,
- 84, 112, 112, 112, 112, 112, 90, 91, 92, 112,
- 94, 112, 96, 97, 98, 65, 112, 67, 112, 112,
- 70, 112, 112, 73, 74, 75, 112, 112, 112, 112,
- 80, 112, 112, 83, 84, 112, 112, 112, 112, 112,
- 90, 91, 92, 112, 94, 112, 96, 97, 98, 65,
- 112, 67, 112, 112, 70, 112, 112, 73, 74, 75,
- 112, 112, 112, 112, 80, 112, 112, 83, 84, 112,
- 112, 112, 112, 112, 90, 91, 92, 112, 94, 112,
- 96, 97, 98, 65, 112, 67, 112, 112, 70, 112,
- 112, 73, 74, 75, 112, 112, 112, 112, 80, 112,
- 112, 83, 84, 112, 112, 112, 112, 112, 90, 91,
- 92, 112, 94, 112, 96, 97, 98, 65, 112, 67,
- 112, 112, 70, 112, 112, 73, 74, 75, 112, 112,
- 112, 112, 80, 112, 112, 83, 84, 112, 112, 112,
- 112, 112, 90, 91, 92, 112, 94, 112, 96, 97,
- 98, 65, 112, 67, 112, 112, 70, 112, 112, 73,
- 74, 75, 112, 112, 112, 112, 80, 112, 112, 83,
- 84, 112, 112, 112, 112, 112, 90, 91, 92, 112,
- 94, 112, 96, 97, 98, 65, 112, 67, 112, 112,
- 70, 112, 112, 73, 74, 75, 112, 112, 112, 112,
- 80, 112, 112, 83, 84, 112, 112, 112, 112, 112,
- 90, 91, 92, 112, 94, 112, 96, 97, 98, 65,
- 112, 67, 112, 112, 70, 112, 112, 73, 74, 75,
- 112, 112, 112, 112, 80, 112, 112, 83, 84, 112,
- 112, 112, 112, 112, 90, 91, 92, 112, 94, 112,
- 96, 97, 98, 65, 112, 67, 112, 112, 70, 112,
- 112, 73, 74, 75, 112, 112, 112, 112, 80, 112,
- 112, 83, 84, 112, 112, 112, 112, 112, 90, 91,
- 92, 112, 94, 112, 96, 97, 98, 65, 112, 67,
- 112, 112, 70, 112, 112, 73, 74, 75, 112, 112,
- 112, 112, 80, 112, 112, 83, 84, 112, 112, 112,
- 112, 112, 90, 91, 92, 112, 94, 112, 96, 97,
- 98, 65, 112, 67, 112, 112, 70, 112, 112, 73,
- 74, 75, 112, 112, 112, 112, 80, 112, 112, 83,
- 84, 112, 112, 112, 112, 112, 90, 91, 92, 112,
- 94, 112, 96, 97, 98, 65, 112, 67, 112, 112,
- 70, 112, 112, 73, 74, 75, 112, 112, 112, 112,
- 80, 112, 112, 83, 84, 112, 112, 112, 112, 112,
- 90, 91, 92, 112, 94, 112, 96, 97, 98, 65,
- 112, 67, 112, 112, 70, 112, 112, 73, 74, 75,
- 112, 112, 112, 112, 80, 112, 112, 83, 84, 112,
- 112, 112, 112, 112, 90, 91, 92, 112, 94, 112,
- 96, 97, 98, 65, 112, 67, 72, 112, 70, 112,
- 112, 73, 74, 112, 112, 112, 82, 112, 80, 85,
- 86, 87, 88, 112, 112, 112, 112, 89, 90, 91,
- 92, 112, 94, 112, 96, 97, 98, 65, 112, 67,
- 72, 112, 70, 112, 112, 73, 74, 112, 112, 112,
- 82, 112, 80, 85, 86, 87, 88, 112, 112, 112,
- 112, 89, 90, 91, 92, 3, 94, 112, 96, 97,
- 98, 9, 10, 11, 12, 112, 14, 112, 112, 112,
- 18, 19, 9, 112, 112, 12, 24, 112, 25, 16,
- 28, 29, 30, 112, 31, 23, 112, 25, 25, 36,
- 37, 38, 39, 31, 31, 112, 112, 112, 36, 37,
- 38, 39, 112, 112, 112, 112, 53, 54, 55, 56,
- 58, 59, 112, 112, 3, 53, 54, 55, 56, 112,
- 9, 10, 11, 12, 112, 14, 112, 20, 112, 18,
- 19, 112, 112, 112, 112, 24, 112, 112, 26, 28,
- 29, 30, 112, 36, 37, 38, 39, 112, 36, 37,
- 38, 39, 112, 112, 112, 112, 112, 112, 112, 112,
- 53, 54, 55, 56, 112, 53, 54, 55, 56, 58,
- 59, 112, 112, 3, 4, 5, 6, 2, 112, 9,
- 10, 11, 12, 112, 9, 112, 112, 12, 18, 19,
- 15, 16, 17, 112, 24, 112, 21, 112, 28, 29,
- 30, 65, 112, 67, 112, 112, 70, 112, 112, 73,
- 74, 112, 112, 112, 112, 112, 80, 112, 43, 112,
- 112, 46, 112, 48, 112, 50, 90, 91, 92, 112,
- 94, 112, 96, 97, 98, 112, 65, 112, 67, 112,
- 1, 70, 112, 112, 73, 74, 112, 112, 112, 112,
- 112, 80, 13, 112, 112, 112, 17, 112, 112, 112,
- 112, 90, 91, 92, 25, 94, 112, 96, 97, 98,
- 31, 112, 65, 34, 67, 112, 72, 70, 112, 112,
- 73, 74, 112, 112, 112, 46, 82, 80, 112, 85,
- 86, 87, 88, 112, 112, 112, 112, 90, 91, 92,
- 112, 94, 112, 96, 97, 98, 112, 65, 112, 67,
- 112, 112, 70, 112, 112, 73, 74, 112, 112, 112,
- 112, 112, 80, 112, 112, 112, 112, 112, 112, 112,
- 112, 112, 90, 91, 92, 112, 94, 112, 96, 97,
- 98, 112, 112, 65, 112, 67, 112, 112, 70, 112,
- 112, 73, 74, 112, 112, 112, 112, 112, 80, 112,
- 112, 112, 112, 112, 112, 112, 112, 112, 90, 91,
- 92, 112, 94, 112, 96, 97, 98, 112, 65, 112,
- 67, 112, 112, 70, 112, 112, 73, 74, 112, 112,
- 112, 112, 112, 80, 112, 112, 112, 112, 112, 112,
- 112, 112, 112, 90, 91, 92, 112, 94, 112, 96,
- 97, 98, 112, 112, 65, 112, 67, 2, 112, 70,
- 112, 112, 73, 74, 9, 112, 112, 12, 112, 80,
- 112, 16, 17, 112, 112, 112, 21, 112, 112, 90,
- 91, 92, 112, 94, 112, 96, 97, 98, 112, 112,
- 2, 112, 112, 112, 112, 112, 112, 112, 43, 112,
- 112, 46, 112, 48, 2, 50, 51, 112, 112, 112,
- 112, 9, 112, 112, 12, 112, 112, 15, 16, 17,
- 112, 2, 34, 21, 36, 37, 38, 39, 9, 112,
- 112, 12, 112, 112, 46, 16, 17, 112, 112, 2,
- 21, 53, 54, 55, 56, 43, 9, 112, 46, 12,
- 48, 112, 50, 16, 17, 112, 112, 112, 21, 112,
- 112, 112, 43, 112, 112, 46, 13, 48, 112, 50,
- 112, 112, 112, 112, 112, 35, 36, 37, 38, 39,
- 43, 112, 112, 46, 112, 48, 112, 50, 112, 36,
- 37, 38, 39, 53, 54, 55, 56, 13, 112, 36,
- 37, 38, 39, 13, 112, 112, 53, 54, 55, 56,
- 13, 112, 112, 112, 51, 112, 53, 54, 55, 56,
- 36, 37, 38, 39, 2, 112, 36, 37, 38, 39,
- 112, 13, 112, 36, 37, 38, 39, 53, 54, 55,
- 56, 112, 112, 53, 54, 55, 56, 112, 112, 112,
- 53, 54, 55, 56, 36, 37, 38, 39, 36, 37,
- 38, 39, 9, 112, 112, 12, 112, 112, 112, 16,
- 17, 53, 54, 55, 56, 53, 54, 55, 56, 112,
- 112, 112, 9, 112, 112, 12, 112, 112, 112, 16,
- 112, 112, 112, 112, 112, 112, 43, 112, 25, 46,
- 27, 48, 112, 50, 31,
+ 2, 86, 87, 88, 89, 25, 91, 9, 10, 11,
+ 12, 31, 14, 71, 16, 1, 18, 19, 1, 21,
+ 78, 79, 24, 81, 13, 1, 28, 29, 30, 17,
+ 32, 20, 34, 22, 17, 37, 25, 39, 40, 41,
+ 42, 43, 31, 45, 33, 47, 35, 49, 50, 25,
+ 52, 104, 105, 106, 43, 31, 58, 59, 9, 10,
+ 11, 12, 17, 14, 13, 16, 15, 18, 19, 1,
+ 21, 62, 63, 24, 73, 70, 25, 28, 29, 30,
+ 43, 32, 31, 34, 83, 34, 37, 50, 43, 40,
+ 41, 42, 43, 1, 45, 50, 47, 46, 49, 50,
+ 51, 52, 1, 2, 103, 13, 101, 58, 59, 9,
+ 10, 11, 12, 14, 14, 16, 16, 25, 18, 19,
+ 70, 21, 17, 31, 24, 66, 101, 68, 28, 29,
+ 30, 102, 32, 104, 34, 106, 14, 37, 16, 34,
+ 40, 41, 42, 43, 77, 45, 47, 47, 49, 49,
+ 50, 52, 52, 66, 104, 68, 106, 77, 58, 59,
+ 9, 10, 11, 12, 12, 14, 14, 16, 16, 18,
+ 19, 49, 21, 114, 52, 24, 109, 110, 34, 28,
+ 29, 30, 1, 32, 32, 34, 14, 43, 37, 109,
+ 46, 40, 41, 42, 43, 51, 45, 15, 47, 17,
+ 49, 50, 14, 52, 52, 95, 34, 13, 27, 58,
+ 59, 9, 10, 11, 12, 21, 14, 107, 16, 25,
+ 18, 19, 27, 21, 52, 31, 24, 81, 46, 34,
+ 28, 29, 30, 12, 32, 14, 34, 16, 44, 37,
+ 52, 46, 40, 41, 42, 43, 17, 45, 15, 47,
+ 17, 49, 50, 107, 52, 101, 1, 103, 13, 81,
+ 58, 59, 9, 10, 11, 12, 21, 14, 13, 16,
+ 25, 18, 19, 52, 21, 46, 31, 24, 73, 46,
+ 25, 28, 29, 30, 83, 32, 31, 34, 83, 44,
+ 37, 1, 2, 40, 41, 42, 43, 1, 45, 101,
+ 47, 103, 49, 50, 104, 52, 106, 73, 103, 13,
+ 103, 58, 59, 9, 10, 11, 12, 83, 14, 73,
+ 16, 25, 18, 19, 15, 21, 102, 31, 24, 83,
+ 71, 80, 28, 29, 30, 81, 32, 78, 34, 14,
+ 81, 37, 25, 109, 40, 41, 42, 43, 31, 45,
+ 71, 47, 43, 49, 50, 109, 52, 78, 21, 50,
+ 81, 77, 58, 59, 9, 10, 11, 12, 12, 14,
+ 73, 16, 81, 18, 19, 9, 21, 52, 12, 24,
+ 83, 44, 16, 28, 29, 30, 101, 32, 51, 34,
+ 34, 71, 37, 109, 1, 40, 41, 42, 43, 73,
+ 45, 81, 47, 101, 49, 50, 21, 52, 14, 83,
+ 16, 73, 101, 58, 59, 9, 10, 11, 12, 20,
+ 14, 83, 16, 33, 18, 19, 104, 21, 106, 44,
+ 24, 66, 33, 68, 28, 29, 30, 104, 32, 106,
+ 34, 51, 95, 37, 51, 60, 40, 41, 42, 43,
+ 73, 45, 43, 47, 107, 49, 50, 109, 52, 50,
+ 83, 77, 64, 65, 58, 59, 9, 10, 11, 12,
+ 6, 14, 8, 16, 2, 18, 19, 9, 113, 114,
+ 12, 24, 15, 110, 16, 28, 29, 30, 21, 32,
+ 21, 34, 106, 109, 37, 7, 8, 40, 41, 42,
+ 43, 16, 45, 33, 47, 35, 49, 50, 34, 52,
+ 65, 34, 33, 44, 35, 58, 59, 9, 10, 11,
+ 12, 101, 14, 46, 16, 73, 18, 19, 33, 77,
+ 35, 34, 24, 48, 34, 83, 28, 29, 30, 43,
+ 32, 82, 34, 46, 82, 37, 46, 51, 40, 41,
+ 42, 43, 33, 45, 35, 47, 101, 49, 50, 101,
+ 52, 109, 33, 33, 35, 35, 58, 59, 82, 66,
+ 67, 68, 69, 7, 71, 72, 13, 74, 75, 76,
+ 15, 13, 43, 16, 81, 16, 16, 84, 85, 32,
+ 73, 16, 16, 14, 77, 92, 93, 94, 16, 96,
+ 83, 98, 99, 100, 66, 67, 68, 69, 43, 71,
+ 72, 16, 74, 75, 76, 32, 16, 16, 16, 81,
+ 49, 49, 84, 85, 15, 51, 109, 35, 51, 22,
+ 92, 93, 94, 115, 96, 115, 98, 99, 100, 66,
+ 115, 68, 69, 115, 71, 72, 115, 74, 75, 76,
+ 115, 115, 9, 115, 81, 12, 115, 84, 85, 16,
+ 115, 115, 115, 115, 115, 92, 93, 94, 115, 96,
+ 115, 98, 99, 100, 66, 115, 68, 115, 20, 71,
+ 115, 115, 74, 75, 76, 115, 115, 115, 115, 81,
+ 115, 48, 84, 85, 36, 37, 38, 39, 115, 115,
+ 92, 93, 94, 115, 96, 115, 98, 99, 100, 115,
+ 115, 53, 54, 55, 56, 57, 66, 115, 68, 111,
+ 112, 71, 115, 115, 74, 75, 76, 25, 115, 9,
+ 115, 81, 12, 31, 84, 85, 16, 17, 36, 37,
+ 38, 39, 92, 93, 94, 115, 96, 115, 98, 99,
+ 100, 115, 115, 115, 115, 53, 54, 55, 56, 57,
+ 115, 111, 112, 43, 115, 115, 46, 66, 48, 68,
+ 50, 115, 71, 115, 115, 74, 75, 76, 115, 78,
+ 9, 115, 81, 12, 115, 84, 85, 16, 115, 115,
+ 115, 115, 115, 92, 93, 94, 115, 96, 115, 98,
+ 99, 100, 66, 115, 68, 115, 115, 71, 115, 115,
+ 74, 75, 76, 71, 115, 115, 74, 81, 115, 48,
+ 84, 85, 115, 81, 115, 115, 115, 115, 92, 93,
+ 94, 115, 96, 115, 98, 99, 100, 115, 115, 115,
+ 98, 99, 100, 66, 108, 68, 115, 115, 71, 115,
+ 115, 74, 75, 76, 115, 115, 115, 115, 81, 115,
+ 115, 84, 85, 115, 115, 115, 115, 115, 115, 92,
+ 93, 94, 115, 96, 115, 98, 99, 100, 66, 115,
+ 68, 115, 115, 71, 115, 115, 74, 75, 76, 112,
+ 115, 115, 115, 81, 115, 115, 84, 85, 115, 115,
+ 115, 115, 115, 115, 92, 93, 94, 115, 96, 97,
+ 98, 99, 100, 115, 115, 66, 115, 68, 115, 115,
+ 71, 115, 115, 74, 75, 76, 115, 115, 115, 115,
+ 81, 115, 115, 84, 85, 115, 115, 115, 115, 115,
+ 115, 92, 93, 94, 115, 96, 115, 98, 99, 100,
+ 66, 115, 68, 115, 115, 71, 115, 108, 74, 75,
+ 76, 115, 78, 115, 115, 81, 115, 115, 84, 85,
+ 115, 115, 9, 115, 115, 12, 92, 93, 94, 16,
+ 96, 115, 98, 99, 100, 115, 115, 66, 25, 68,
+ 27, 115, 71, 115, 31, 74, 75, 76, 115, 115,
+ 9, 115, 81, 12, 115, 84, 85, 16, 115, 115,
+ 115, 115, 115, 92, 93, 94, 115, 96, 115, 98,
+ 99, 100, 66, 115, 68, 115, 115, 71, 115, 115,
+ 74, 75, 76, 115, 115, 115, 115, 81, 115, 48,
+ 84, 85, 115, 115, 115, 115, 115, 115, 92, 93,
+ 94, 115, 96, 115, 98, 99, 100, 115, 115, 66,
+ 115, 68, 115, 115, 71, 115, 115, 74, 75, 76,
+ 115, 115, 115, 115, 81, 115, 115, 84, 85, 115,
+ 115, 115, 115, 115, 115, 92, 93, 94, 115, 96,
+ 115, 98, 99, 100, 66, 115, 68, 115, 115, 71,
+ 115, 115, 74, 75, 76, 115, 115, 115, 115, 81,
+ 115, 115, 84, 85, 115, 115, 115, 115, 115, 115,
+ 92, 93, 94, 115, 96, 115, 98, 99, 100, 115,
+ 115, 66, 115, 68, 115, 115, 71, 115, 115, 74,
+ 75, 76, 115, 115, 115, 115, 81, 115, 115, 84,
+ 85, 115, 115, 115, 115, 115, 115, 92, 93, 94,
+ 115, 96, 115, 98, 99, 100, 66, 115, 68, 115,
+ 115, 71, 115, 115, 74, 75, 76, 115, 115, 115,
+ 115, 81, 115, 115, 84, 85, 115, 115, 115, 115,
+ 115, 115, 92, 93, 94, 115, 96, 115, 98, 99,
+ 100, 115, 115, 66, 115, 68, 115, 115, 71, 115,
+ 115, 74, 75, 76, 115, 115, 115, 115, 81, 115,
+ 115, 84, 85, 115, 115, 115, 115, 115, 115, 92,
+ 93, 94, 115, 96, 115, 98, 99, 100, 66, 115,
+ 68, 115, 115, 71, 115, 115, 74, 75, 76, 115,
+ 115, 115, 115, 81, 115, 115, 84, 85, 115, 115,
+ 115, 115, 115, 115, 92, 93, 94, 115, 96, 115,
+ 98, 99, 100, 115, 115, 66, 115, 68, 115, 115,
+ 71, 115, 115, 74, 75, 76, 115, 115, 115, 115,
+ 81, 115, 115, 84, 85, 115, 115, 115, 115, 115,
+ 115, 92, 93, 94, 115, 96, 115, 98, 99, 100,
+ 66, 115, 68, 115, 115, 71, 115, 115, 74, 75,
+ 76, 115, 115, 115, 115, 81, 115, 115, 84, 85,
+ 115, 115, 115, 115, 115, 115, 92, 93, 94, 115,
+ 96, 115, 98, 99, 100, 115, 115, 66, 115, 68,
+ 115, 115, 71, 115, 115, 74, 75, 76, 115, 115,
+ 115, 115, 81, 115, 115, 84, 85, 115, 115, 115,
+ 115, 115, 115, 92, 93, 94, 115, 96, 115, 98,
+ 99, 100, 66, 115, 68, 115, 115, 71, 115, 115,
+ 74, 75, 76, 115, 115, 115, 115, 81, 115, 115,
+ 84, 85, 115, 115, 115, 115, 115, 115, 92, 93,
+ 94, 115, 96, 115, 98, 99, 100, 115, 115, 66,
+ 115, 68, 115, 115, 71, 115, 115, 74, 75, 76,
+ 115, 115, 115, 115, 81, 115, 115, 84, 85, 115,
+ 115, 115, 115, 115, 115, 92, 93, 94, 115, 96,
+ 115, 98, 99, 100, 66, 115, 68, 115, 115, 71,
+ 115, 115, 74, 75, 76, 115, 115, 115, 115, 81,
+ 115, 115, 84, 85, 115, 115, 115, 115, 115, 115,
+ 92, 93, 94, 115, 96, 115, 98, 99, 100, 115,
+ 115, 66, 115, 68, 115, 115, 71, 115, 115, 74,
+ 75, 76, 115, 115, 115, 115, 81, 115, 115, 84,
+ 85, 115, 115, 115, 115, 115, 115, 92, 93, 94,
+ 115, 96, 115, 98, 99, 100, 66, 115, 68, 115,
+ 115, 71, 115, 115, 74, 75, 76, 115, 115, 115,
+ 115, 81, 115, 115, 84, 85, 115, 115, 115, 115,
+ 115, 115, 92, 93, 94, 115, 96, 115, 98, 99,
+ 100, 115, 115, 66, 115, 68, 115, 115, 71, 115,
+ 115, 74, 75, 76, 115, 115, 115, 115, 81, 115,
+ 115, 84, 85, 115, 115, 115, 115, 115, 115, 92,
+ 93, 94, 115, 96, 115, 98, 99, 100, 66, 115,
+ 68, 115, 115, 71, 115, 115, 74, 75, 76, 115,
+ 115, 115, 115, 81, 115, 115, 84, 85, 115, 115,
+ 115, 115, 115, 115, 92, 93, 94, 115, 96, 115,
+ 98, 99, 100, 115, 115, 66, 115, 68, 115, 115,
+ 71, 115, 115, 74, 75, 76, 115, 115, 115, 115,
+ 81, 115, 115, 84, 85, 115, 115, 115, 115, 115,
+ 115, 92, 93, 94, 115, 96, 115, 98, 99, 100,
+ 66, 115, 68, 115, 115, 71, 115, 115, 74, 75,
+ 76, 115, 115, 115, 115, 81, 115, 115, 84, 85,
+ 115, 115, 115, 115, 115, 115, 92, 93, 94, 115,
+ 96, 115, 98, 99, 100, 115, 115, 66, 115, 68,
+ 115, 115, 71, 115, 115, 74, 75, 76, 115, 115,
+ 115, 115, 81, 115, 115, 84, 85, 115, 115, 115,
+ 115, 115, 115, 92, 93, 94, 115, 96, 115, 98,
+ 99, 100, 66, 115, 68, 115, 115, 71, 115, 115,
+ 74, 75, 76, 115, 115, 115, 115, 81, 115, 115,
+ 84, 85, 115, 115, 115, 115, 115, 115, 92, 93,
+ 94, 115, 96, 115, 98, 99, 100, 115, 115, 66,
+ 115, 68, 115, 115, 71, 115, 115, 74, 75, 76,
+ 115, 115, 115, 115, 81, 115, 115, 84, 85, 115,
+ 115, 115, 115, 115, 115, 92, 93, 94, 115, 96,
+ 115, 98, 99, 100, 66, 115, 68, 115, 115, 71,
+ 115, 115, 74, 75, 76, 115, 115, 115, 115, 81,
+ 115, 115, 84, 85, 115, 115, 115, 115, 115, 115,
+ 92, 93, 94, 115, 96, 115, 98, 99, 100, 115,
+ 115, 66, 115, 68, 115, 115, 71, 115, 115, 74,
+ 75, 76, 115, 115, 115, 115, 81, 115, 115, 84,
+ 85, 115, 115, 115, 115, 115, 115, 92, 93, 94,
+ 115, 96, 115, 98, 99, 100, 66, 115, 68, 115,
+ 115, 71, 115, 115, 74, 75, 76, 115, 115, 115,
+ 115, 81, 115, 115, 84, 85, 115, 115, 115, 115,
+ 115, 115, 92, 93, 94, 115, 96, 115, 98, 99,
+ 100, 115, 115, 66, 115, 68, 115, 115, 71, 115,
+ 115, 74, 75, 76, 115, 115, 115, 115, 81, 115,
+ 115, 84, 85, 115, 115, 115, 115, 115, 115, 92,
+ 93, 94, 115, 96, 115, 98, 99, 100, 66, 115,
+ 68, 115, 115, 71, 115, 115, 74, 75, 76, 115,
+ 115, 115, 115, 81, 115, 115, 84, 85, 115, 115,
+ 115, 115, 115, 115, 92, 93, 94, 115, 96, 115,
+ 98, 99, 100, 115, 115, 66, 115, 68, 115, 115,
+ 71, 115, 115, 74, 75, 115, 115, 115, 115, 66,
+ 81, 68, 115, 115, 71, 115, 115, 74, 75, 90,
+ 115, 92, 93, 94, 81, 96, 115, 98, 99, 100,
+ 115, 115, 115, 90, 115, 92, 93, 94, 115, 96,
+ 3, 98, 99, 100, 115, 115, 9, 10, 11, 12,
+ 115, 14, 115, 115, 115, 18, 19, 115, 115, 115,
+ 115, 24, 115, 115, 26, 28, 29, 30, 115, 115,
+ 115, 23, 115, 25, 36, 37, 38, 39, 115, 31,
+ 115, 115, 115, 115, 36, 37, 38, 39, 115, 115,
+ 115, 53, 54, 55, 56, 57, 59, 60, 115, 115,
+ 3, 53, 54, 55, 56, 57, 9, 10, 11, 12,
+ 115, 14, 115, 115, 115, 18, 19, 9, 115, 115,
+ 12, 24, 115, 115, 16, 28, 29, 30, 35, 36,
+ 37, 38, 39, 25, 36, 37, 38, 39, 115, 31,
+ 115, 115, 115, 115, 115, 115, 53, 54, 55, 56,
+ 57, 53, 54, 55, 56, 57, 59, 60, 60, 115,
+ 3, 4, 5, 6, 2, 115, 9, 10, 11, 12,
+ 115, 9, 115, 115, 12, 18, 19, 15, 16, 17,
+ 115, 24, 115, 21, 115, 28, 29, 30, 66, 115,
+ 68, 115, 115, 71, 115, 115, 74, 75, 115, 115,
+ 115, 115, 115, 81, 115, 43, 115, 115, 46, 115,
+ 48, 115, 50, 115, 92, 93, 94, 115, 96, 115,
+ 98, 99, 100, 115, 66, 115, 68, 73, 115, 71,
+ 115, 115, 74, 75, 115, 115, 115, 83, 115, 81,
+ 86, 87, 88, 89, 115, 91, 115, 115, 115, 115,
+ 92, 93, 94, 115, 96, 115, 98, 99, 100, 115,
+ 66, 115, 68, 115, 73, 71, 115, 115, 74, 75,
+ 115, 115, 115, 115, 83, 81, 115, 86, 87, 88,
+ 89, 115, 91, 115, 115, 115, 92, 93, 94, 115,
+ 96, 115, 98, 99, 100, 115, 66, 115, 68, 115,
+ 73, 71, 115, 115, 74, 75, 115, 115, 115, 115,
+ 83, 81, 115, 86, 87, 88, 89, 71, 91, 115,
+ 74, 115, 92, 93, 94, 115, 96, 81, 98, 99,
+ 100, 115, 66, 115, 68, 115, 115, 71, 115, 93,
+ 74, 75, 115, 115, 98, 99, 100, 81, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115, 92, 93,
+ 94, 115, 96, 115, 98, 99, 100, 115, 66, 115,
+ 68, 115, 115, 71, 115, 115, 74, 75, 115, 115,
+ 115, 115, 115, 81, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 92, 93, 94, 115, 96, 115,
+ 98, 99, 100, 115, 66, 115, 68, 115, 115, 71,
+ 115, 1, 74, 75, 115, 115, 115, 115, 115, 81,
+ 115, 115, 115, 13, 115, 115, 115, 17, 115, 115,
+ 92, 93, 94, 115, 96, 25, 98, 99, 100, 115,
+ 66, 31, 68, 2, 34, 71, 115, 115, 74, 75,
+ 115, 115, 115, 115, 115, 81, 46, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 92, 93, 94, 115,
+ 96, 115, 98, 99, 100, 34, 115, 36, 37, 38,
+ 39, 115, 115, 115, 115, 115, 115, 46, 115, 115,
+ 115, 115, 115, 115, 53, 54, 55, 56, 57, 2,
+ 115, 115, 115, 115, 115, 115, 9, 115, 115, 12,
+ 115, 115, 2, 16, 17, 115, 115, 115, 21, 9,
+ 115, 115, 12, 115, 115, 15, 16, 17, 115, 115,
+ 115, 21, 115, 115, 115, 115, 115, 115, 115, 13,
+ 43, 115, 115, 46, 115, 48, 115, 50, 51, 115,
+ 115, 115, 115, 43, 115, 115, 46, 115, 48, 115,
+ 50, 2, 36, 37, 38, 39, 115, 13, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115, 115, 53,
+ 54, 55, 56, 57, 36, 37, 38, 39, 115, 115,
+ 36, 37, 38, 39, 13, 36, 37, 38, 39, 51,
+ 13, 53, 54, 55, 56, 57, 13, 53, 54, 55,
+ 56, 57, 53, 54, 55, 56, 57, 36, 37, 38,
+ 39, 115, 115, 36, 37, 38, 39, 115, 115, 36,
+ 37, 38, 39, 115, 53, 54, 55, 56, 57, 115,
+ 53, 54, 55, 56, 57, 2, 53, 54, 55, 56,
+ 57, 2, 9, 115, 115, 12, 115, 115, 9, 16,
+ 17, 12, 115, 115, 21, 16, 17, 115, 115, 115,
+ 21, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 43, 115, 115, 46,
+ 115, 48, 43, 50, 115, 46, 115, 48, 115, 50,
+ 115, 36, 37, 38, 39, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115, 53, 54,
+ 55, 56, 57,
);
- const YY_SHIFT_USE_DFLT = -11;
- const YY_SHIFT_MAX = 239;
+ const YY_SHIFT_USE_DFLT = -21;
+ const YY_SHIFT_MAX = 244;
public static $yy_shift_ofst = array(
- -11, 98, 98, 148, 198, 198, 248, 148, 148, 198,
- 148, 248, -2, 48, 298, 148, 148, 148, 298, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
- 348, 148, 148, 148, 148, 148, 398, 148, 148, 148,
- 448, 498, 498, 498, 498, 498, 498, 498, 498, 147,
- 1962, 1953, 1953, 35, 1952, 2007, 2012, 2413, 2400, 2423,
- 2444, 415, 2450, 2457, 2482, 2478, 465, 465, 465, 465,
- 465, 465, 465, 465, 465, 465, 465, 465, 465, 465,
- 465, 465, 465, 465, 465, 465, 2139, 90, 143, 2011,
- 2533, 1963, 36, 103, 143, 143, 90, 90, 235, 2070,
- 2075, 634, 59, 636, 641, 663, 359, 359, 203, 221,
- 269, 221, 306, 332, 196, 378, 378, 264, 385, 319,
- 221, 5, 5, 5, 5, 5, 5, 5, 5, 112,
- 112, 82, 5, -11, -11, 2315, 2362, 2379, 2397, 2513,
- 49, 665, 409, 218, 221, 221, 458, 221, 382, 221,
- 382, 221, 394, 394, 221, 221, 221, 221, 394, 40,
- 394, 394, 394, 399, 394, 399, 394, 221, 221, 221,
- 221, 5, 463, 5, 5, 463, 5, 462, 112, 112,
- 112, -11, -11, -11, -11, -11, -11, 2348, 11, 100,
- -10, 190, 881, 141, 265, 292, 252, 425, 479, 350,
- 313, 440, 240, 429, 477, 459, 480, 153, 486, 501,
- 509, 535, 538, 510, 557, 567, 568, 558, 569, 571,
- 575, 580, 585, 587, 562, 572, 576, 586, 593, 462,
- 611, 581, 598, 640, 597, 612, 655, 658, 648, 673,
+ -21, 100, 100, 151, 202, 202, 253, 151, 202, 151,
+ 151, 253, -2, 49, 304, 151, 151, 151, 304, 151,
+ 151, 151, 151, 151, 151, 151, 151, 355, 151, 151,
+ 151, 151, 151, 151, 151, 151, 406, 151, 151, 151,
+ 457, 508, 508, 508, 508, 508, 508, 508, 508, 508,
+ 2048, 702, 702, 99, 122, 658, 2038, 2526, 2093, 2548,
+ 2554, 2098, 2559, 2581, 2587, 2593, 2665, 2665, 2665, 2665,
+ 2665, 2665, 2665, 2665, 2665, 2665, 2665, 2665, 2665, 2665,
+ 2665, 2665, 2665, 2665, 2665, 2665, 2037, 2410, 172, 24,
+ 2097, 963, 2108, 45, 182, 24, 24, 172, 172, 101,
+ 12, 2157, 2162, 221, 643, 92, 255, 296, 366, 366,
+ 233, -20, 188, -20, 317, 17, 229, 394, 105, 394,
+ 393, 181, 290, -20, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 12, 12, 68, 14, -21, -21, 2497,
+ 2510, 2643, 2649, 720, 152, 771, 468, 309, -20, -20,
+ 467, -20, 325, -20, 325, -20, 37, 37, 409, 37,
+ 409, 37, -20, -20, -20, -20, 37, 356, 37, 37,
+ 37, -20, -20, -20, -20, 14, 472, 14, 14, 472,
+ 14, 12, 474, 12, 12, 12, 12, -21, -21, -21,
+ -21, -21, -21, 2441, 11, 51, 194, 245, 991, 144,
+ 195, 385, 337, 464, 488, 399, 485, 469, 477, 497,
+ 500, 470, 390, 496, 479, 495, 519, 529, 530, 565,
+ 566, 563, 568, 567, 569, 570, 575, 576, 579, 582,
+ 539, 557, 583, 474, 595, 571, 572, 600, 601, 574,
+ 577, 602, 609, 592, 607,
);
- const YY_REDUCE_USE_DFLT = -99;
- const YY_REDUCE_MAX = 186;
+ const YY_REDUCE_USE_DFLT = -86;
+ const YY_REDUCE_MAX = 192;
public static $yy_reduce_ofst = array(
- 109, 492, 527, 561, 595, 632, 669, 703, 737, 771,
- 808, 842, 876, 910, 944, 978, 1012, 1046, 1080, 1114,
- 1148, 1182, 1216, 1250, 1284, 1318, 1352, 1386, 1420, 1454,
- 1488, 1522, 1556, 1590, 1624, 1658, 1692, 1726, 1760, 1794,
- 1828, 1862, 2036, 2071, 2107, 2142, 2178, 2213, 2249, 542,
- 1824, 1858, 2104, 481, 114, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 608, 536, 645, 164,
- 20, 101, -98, 34, 181, 212, -57, 174, 195, 3,
- 254, -5, -79, 228, 228, 228, 180, -5, 222, 51,
- 272, 291, 302, 305, 222, -75, 261, 228, 228, 228,
- 331, 323, 228, 228, 228, 228, 228, 228, 228, 222,
- 299, 228, 228, 360, 228, 102, 102, 102, 102, 102,
- 85, 122, 102, 102, 188, 188, 300, 188, 324, 188,
- 335, 188, 244, 244, 188, 188, 188, 188, 244, 321,
- 244, 244, 244, 337, 244, 347, 244, 188, 188, 188,
- 188, 375, 376, 375, 375, 376, 375, 400, 421, 421,
- 421, 467, 452, 468, 471, 447, 470,
+ 9, 503, 538, 573, 608, 650, 701, 736, 777, 812,
+ 849, 884, 921, 956, 993, 1028, 1065, 1100, 1137, 1172,
+ 1209, 1244, 1281, 1316, 1353, 1388, 1425, 1460, 1497, 1532,
+ 1569, 1604, 1641, 1676, 1713, 1748, 1785, 1820, 1857, 1892,
+ 1929, 1943, 2122, 2158, 2194, 2230, 2266, 2302, 2338, 2374,
+ 2154, 2191, 2227, 2246, 742, -85, -85, -85, -85, -85,
+ -85, -85, -85, -85, -85, -85, -85, -85, -85, -85,
+ -85, -85, -85, -85, -85, -85, -85, -85, -85, -85,
+ -85, -85, -85, -85, -85, -85, 365, 452, -58, 517,
+ 59, 1, 205, 29, 50, 234, 246, 259, 279, 67,
+ -53, 87, 5, 146, 154, 80, 80, 80, 198, 154,
+ 200, 297, 320, 326, 338, 284, 200, 110, 322, 347,
+ 80, 80, 80, 377, 384, 80, 80, 80, 80, 80,
+ 80, 80, 80, 200, 333, 80, 80, 398, 80, 25,
+ 25, 25, 25, 25, 178, 207, 25, 25, 201, 201,
+ 251, 201, 254, 201, 291, 201, 224, 224, 285, 224,
+ 302, 224, 201, 201, 201, 201, 224, 311, 224, 224,
+ 224, 201, 201, 201, 201, 348, 373, 348, 348, 373,
+ 348, 386, 420, 386, 386, 386, 386, 445, 459, 462,
+ 486, 455, 458,
);
public static $yyExpectedTokens = array(
array(),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(2, 9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 39, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 51, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
- array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(2, 9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 39, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 51, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ),
+ array(23, 25, 31, 36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(25, 31, 36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(25, 31, 36, 37, 38, 39, 53, 54, 55, 56, 57, ),
array(14, 16, 47, 49, 52, ),
- array(23, 25, 31, 36, 37, 38, 39, 53, 54, 55, 56, ),
- array(25, 31, 36, 37, 38, 39, 53, 54, 55, 56, ),
- array(25, 31, 36, 37, 38, 39, 53, 54, 55, 56, ),
array(14, 16, 49, 52, ),
- array(3, 9, 10, 11, 12, 14, 18, 19, 24, 28, 29, 30, 58, 59, ),
- array(20, 36, 37, 38, 39, 53, 54, 55, 56, ),
- array(26, 36, 37, 38, 39, 53, 54, 55, 56, ),
- array(13, 36, 37, 38, 39, 53, 54, 55, 56, ),
- array(35, 36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 51, 53, 54, 55, 56, ),
- array(13, 36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, 59, ),
- array(13, 36, 37, 38, 39, 53, 54, 55, 56, ),
- array(13, 36, 37, 38, 39, 53, 54, 55, 56, ),
- array(2, 36, 37, 38, 39, 53, 54, 55, 56, ),
- array(13, 36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
- array(36, 37, 38, 39, 53, 54, 55, 56, ),
+ array(20, 36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(26, 36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(13, 36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(35, 36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 51, 53, 54, 55, 56, 57, ),
+ array(13, 36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, 60, ),
+ array(2, 36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(13, 36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(13, 36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(13, 36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(36, 37, 38, 39, 53, 54, 55, 56, 57, ),
+ array(3, 9, 10, 11, 12, 14, 18, 19, 24, 28, 29, 30, 59, 60, ),
array(1, 13, 17, 25, 31, 34, 46, ),
array(14, 34, 52, ),
array(1, 25, 31, ),
- array(3, 9, 10, 11, 12, 14, 18, 19, 24, 28, 29, 30, 58, 59, ),
+ array(3, 9, 10, 11, 12, 14, 18, 19, 24, 28, 29, 30, 59, 60, ),
array(9, 12, 16, 25, 27, 31, ),
array(9, 12, 16, 25, 31, ),
array(17, 43, 50, ),
@@ -937,10 +973,11 @@ public static $yy_action = array(
array(14, 34, 52, ),
array(14, 34, 52, ),
array(1, 2, ),
+ array(17, ),
array(3, 4, 5, 6, 9, 10, 11, 12, 18, 19, 24, 28, 29, 30, ),
array(2, 9, 12, 15, 16, 17, 21, 43, 46, 48, 50, ),
- array(9, 12, 16, 48, ),
array(12, 14, 16, 52, ),
+ array(9, 12, 16, 48, ),
array(1, 13, 25, 31, ),
array(1, 13, 25, 31, ),
array(1, 13, 25, 31, ),
@@ -954,10 +991,11 @@ public static $yy_action = array(
array(1, 17, ),
array(17, 46, ),
array(14, 16, ),
+ array(17, 34, ),
array(14, 16, ),
array(1, 51, ),
- array(1, 2, ),
array(1, 27, ),
+ array(1, 2, ),
array(25, 31, ),
array(1, ),
array(1, ),
@@ -967,6 +1005,7 @@ public static $yy_action = array(
array(1, ),
array(1, ),
array(1, ),
+ array(1, ),
array(17, ),
array(17, ),
array(1, ),
@@ -992,6 +1031,10 @@ public static $yy_action = array(
array(25, 31, ),
array(43, 50, ),
array(43, 50, ),
+ array(43, 50, ),
+ array(43, 50, ),
+ array(43, 50, ),
+ array(43, 50, ),
array(25, 31, ),
array(25, 31, ),
array(25, 31, ),
@@ -1001,10 +1044,6 @@ public static $yy_action = array(
array(43, 50, ),
array(43, 50, ),
array(43, 50, ),
- array(43, 50, ),
- array(43, 50, ),
- array(43, 50, ),
- array(43, 50, ),
array(25, 31, ),
array(25, 31, ),
array(25, 31, ),
@@ -1015,17 +1054,19 @@ public static $yy_action = array(
array(1, ),
array(2, ),
array(1, ),
+ array(17, ),
array(34, ),
array(17, ),
array(17, ),
array(17, ),
+ array(17, ),
array(),
array(),
array(),
array(),
array(),
array(),
- array(2, 34, 36, 37, 38, 39, 46, 53, 54, 55, 56, ),
+ array(2, 34, 36, 37, 38, 39, 46, 53, 54, 55, 56, 57, ),
array(13, 20, 22, 25, 31, 33, 35, 43, ),
array(13, 15, 25, 31, 34, 46, ),
array(13, 21, 25, 31, 44, ),
@@ -1033,7 +1074,7 @@ public static $yy_action = array(
array(9, 12, 16, 48, ),
array(34, 43, 46, 51, ),
array(27, 34, 46, ),
- array(21, 44, 59, ),
+ array(21, 44, 60, ),
array(21, 44, 51, ),
array(6, 8, ),
array(7, 8, ),
@@ -1044,13 +1085,13 @@ public static $yy_action = array(
array(34, 46, ),
array(34, 46, ),
array(33, 35, ),
- array(33, 35, ),
array(33, 51, ),
array(43, 51, ),
array(33, 35, ),
array(33, 35, ),
array(33, 35, ),
array(33, 35, ),
+ array(33, 35, ),
array(15, 43, ),
array(7, ),
array(13, ),
@@ -1067,11 +1108,10 @@ public static $yy_action = array(
array(32, ),
array(34, ),
array(16, ),
- array(34, ),
- array(16, ),
array(49, ),
array(49, ),
array(16, ),
+ array(16, ),
array(51, ),
array(51, ),
array(16, ),
@@ -1178,48 +1218,50 @@ public static $yy_action = array(
array(),
array(),
array(),
+ array(),
);
public static $yy_default = array(
- 350, 540, 540, 540, 525, 525, 540, 501, 501, 524,
- 452, 540, 540, 540, 540, 540, 540, 540, 540, 540,
- 540, 540, 540, 540, 540, 540, 540, 540, 540, 540,
- 540, 540, 540, 540, 540, 540, 540, 540, 540, 540,
- 540, 540, 540, 540, 540, 540, 540, 540, 540, 540,
- 390, 369, 390, 540, 540, 540, 395, 540, 540, 540,
- 363, 540, 540, 540, 540, 540, 374, 500, 413, 420,
- 499, 526, 528, 527, 419, 421, 418, 422, 451, 449,
- 397, 401, 402, 392, 395, 363, 433, 540, 390, 540,
- 390, 390, 514, 454, 390, 390, 540, 540, 381, 340,
- 453, 466, 540, 404, 404, 404, 466, 466, 454, 390,
- 540, 390, 390, 384, 454, 540, 540, 404, 404, 404,
- 371, 386, 404, 411, 424, 425, 426, 412, 417, 454,
- 511, 424, 410, 348, 508, 453, 453, 453, 453, 453,
- 540, 468, 466, 482, 360, 370, 540, 373, 540, 378,
- 540, 379, 463, 464, 364, 366, 367, 368, 492, 466,
- 491, 494, 493, 457, 458, 459, 460, 380, 376, 377,
- 372, 382, 502, 385, 387, 503, 442, 466, 488, 515,
- 512, 348, 507, 507, 507, 466, 466, 433, 429, 433,
- 423, 423, 467, 433, 433, 423, 423, 346, 540, 540,
- 540, 423, 433, 443, 540, 540, 540, 540, 429, 540,
- 461, 461, 540, 429, 540, 540, 540, 540, 540, 540,
- 540, 540, 540, 540, 429, 431, 540, 513, 540, 482,
- 540, 540, 540, 540, 540, 438, 540, 540, 540, 398,
- 341, 342, 343, 344, 345, 347, 349, 351, 352, 353,
- 354, 355, 356, 357, 359, 388, 389, 484, 485, 486,
- 506, 383, 504, 505, 427, 436, 437, 446, 447, 465,
- 469, 470, 471, 405, 406, 407, 408, 409, 428, 430,
- 432, 434, 438, 439, 440, 414, 415, 416, 441, 444,
- 445, 479, 477, 516, 517, 518, 519, 455, 456, 490,
- 461, 462, 483, 498, 358, 489, 536, 537, 529, 530,
- 531, 534, 533, 535, 538, 539, 532, 521, 523, 522,
- 520, 495, 480, 478, 476, 473, 474, 475, 481, 496,
- 497, 435, 472, 510, 487, 482, 391, 375, 399, 403,
+ 356, 551, 551, 551, 536, 536, 551, 510, 535, 459,
+ 510, 551, 551, 551, 551, 551, 551, 551, 551, 551,
+ 551, 551, 551, 551, 551, 551, 551, 551, 551, 551,
+ 551, 551, 551, 551, 551, 551, 551, 551, 551, 551,
+ 551, 551, 551, 551, 551, 551, 551, 551, 551, 551,
+ 396, 375, 396, 551, 551, 551, 401, 551, 551, 551,
+ 369, 551, 551, 551, 551, 551, 380, 509, 419, 537,
+ 427, 539, 538, 426, 428, 425, 429, 458, 456, 508,
+ 403, 407, 408, 398, 401, 369, 551, 440, 551, 396,
+ 551, 396, 396, 524, 461, 396, 396, 551, 551, 387,
+ 496, 346, 460, 551, 473, 410, 410, 410, 473, 473,
+ 461, 396, 551, 396, 396, 390, 461, 551, 522, 551,
+ 410, 410, 410, 377, 392, 410, 417, 431, 432, 433,
+ 418, 423, 424, 461, 520, 431, 416, 354, 517, 460,
+ 460, 460, 460, 460, 551, 475, 473, 489, 366, 376,
+ 551, 379, 551, 384, 551, 385, 470, 471, 464, 465,
+ 466, 467, 370, 372, 373, 374, 501, 473, 500, 503,
+ 502, 386, 382, 383, 378, 388, 511, 391, 393, 512,
+ 449, 523, 473, 495, 525, 521, 497, 354, 516, 516,
+ 516, 473, 473, 440, 436, 440, 430, 430, 474, 440,
+ 440, 430, 430, 352, 551, 551, 551, 430, 440, 450,
+ 551, 551, 551, 436, 551, 468, 468, 551, 551, 436,
+ 551, 551, 551, 551, 551, 551, 551, 551, 551, 551,
+ 436, 438, 551, 489, 551, 551, 551, 551, 551, 551,
+ 445, 551, 551, 551, 404, 347, 348, 349, 350, 351,
+ 353, 355, 357, 358, 359, 360, 361, 362, 363, 365,
+ 394, 395, 491, 492, 493, 515, 389, 513, 514, 434,
+ 443, 444, 453, 454, 472, 476, 477, 478, 411, 412,
+ 413, 414, 415, 435, 437, 439, 441, 445, 446, 447,
+ 498, 499, 420, 421, 422, 448, 451, 452, 486, 484,
+ 462, 463, 468, 469, 490, 526, 527, 528, 529, 530,
+ 364, 547, 548, 540, 541, 542, 545, 544, 546, 549,
+ 550, 543, 532, 534, 533, 531, 487, 485, 483, 480,
+ 481, 482, 488, 505, 507, 506, 504, 442, 479, 519,
+ 494, 489, 397, 381, 405, 409,
);
- const YYNOCODE = 113;
+ const YYNOCODE = 116;
const YYSTACKDEPTH = 500;
- const YYNSTATE = 340;
- const YYNRULE = 200;
- const YYERRORSYMBOL = 60;
+ const YYNSTATE = 346;
+ const YYNRULE = 205;
+ const YYERRORSYMBOL = 61;
const YYERRSYMDT = 'yy0';
const YYFALLBACK = 0;
public static $yyFallback = array(
@@ -1262,20 +1304,21 @@ public static $yy_action = array(
'INSTANCEOF', 'SINGLEQUOTESTRING', 'DOUBLECOLON', 'NAMESPACE',
'AT', 'HATCH', 'OPENB', 'CLOSEB',
'DOLLAR', 'LOGOP', 'SLOGOP', 'TLOGOP',
- 'SINGLECOND', 'ARRAYOPEN', 'QUOTE', 'BACKTICK',
- 'error', 'start', 'template', 'literal_e2',
- 'literal_e1', 'smartytag', 'tagbody', 'tag',
- 'outattr', 'eqoutattr', 'varindexed', 'output',
- 'attributes', 'variablevalue', 'value', 'expr',
- 'modifierlist', 'statement', 'statements', 'foraction',
- 'varvar', 'modparameters', 'attribute', 'nullcoalescing',
- 'ternary', 'tlop', 'lop', 'scond',
- 'isin', 'array', 'function', 'ns1',
- 'doublequoted_with_quotes', 'static_class_access', 'arraydef', 'variablelist',
- 'variable', 'object', 'configvariable', 'arrayindex',
- 'indexdef', 'varvarele', 'objectchain', 'objectelement',
- 'method', 'params', 'modifier', 'modparameter',
- 'arrayelements', 'arrayelement', 'doublequoted', 'doublequotedcontent',
+ 'SINGLECOND', 'MATCHES', 'ARRAYOPEN', 'QUOTE',
+ 'BACKTICK', 'error', 'start', 'template',
+ 'literal_e2', 'literal_e1', 'smartytag', 'tagbody',
+ 'tag', 'outattr', 'eqoutattr', 'varindexed',
+ 'output', 'attributes', 'variablevalue', 'value',
+ 'expr', 'modifierlist', 'statement', 'statements',
+ 'foraction', 'varvar', 'modparameters', 'attribute',
+ 'nullcoalescing', 'ternary', 'tlop', 'lop',
+ 'scond', 'isin', 'array', 'matchop',
+ 'function', 'ns1', 'doublequoted_with_quotes', 'static_class_access',
+ 'arraydef', 'variablelist', 'variable', 'object',
+ 'configvariable', 'arrayindex', 'indexdef', 'varvarele',
+ 'objectchain', 'optobjectchain', 'objectelement', 'method',
+ 'params', 'modifier', 'modparameter', 'arrayelements',
+ 'arrayelement', 'doublequoted', 'doublequotedcontent',
);
public static $yyRuleName = array(
@@ -1357,6 +1400,7 @@ public static $yy_action = array(
'isin ::= ISIN',
'expr ::= expr isin array',
'expr ::= expr isin value',
+ 'expr ::= expr matchop value',
'nullcoalescing ::= expr QMARK QMARK expr',
'ternary ::= expr QMARK DOLLARID COLON expr',
'ternary ::= expr QMARK value COLON expr',
@@ -1428,6 +1472,8 @@ public static $yy_action = array(
'varvarele ::= SIMPELOUTPUT',
'varvarele ::= LDEL expr RDEL',
'object ::= varindexed objectchain',
+ 'optobjectchain ::=',
+ 'optobjectchain ::= objectchain',
'objectchain ::= objectelement',
'objectchain ::= objectchain objectelement',
'objectelement ::= PTR ID arrayindex',
@@ -1435,7 +1481,7 @@ public static $yy_action = array(
'objectelement ::= PTR LDEL expr RDEL arrayindex',
'objectelement ::= PTR ID LDEL expr RDEL arrayindex',
'objectelement ::= PTR method',
- 'function ::= ns1 OPENP variablelist CLOSEP',
+ 'function ::= ns1 OPENP variablelist CLOSEP optobjectchain',
'method ::= ID OPENP params CLOSEP',
'method ::= DOLLARID OPENP params CLOSEP',
'params ::= params COMMA expr',
@@ -1453,12 +1499,14 @@ public static $yy_action = array(
'static_class_access ::= method',
'static_class_access ::= method objectchain',
'static_class_access ::= ID',
+ 'static_class_access ::= ID objectchain',
'static_class_access ::= DOLLARID arrayindex',
'static_class_access ::= DOLLARID arrayindex objectchain',
'lop ::= LOGOP',
'lop ::= SLOGOP',
'tlop ::= TLOGOP',
'scond ::= SINGLECOND',
+ 'matchop ::= MATCHES',
'arraydef ::= OPENB arrayelements CLOSEB',
'arraydef ::= ARRAYOPEN arrayelements CLOSEP',
'arrayelements ::= arrayelement',
@@ -1794,206 +1842,211 @@ public static $yy_action = array(
}
public static $yyRuleInfo = array(
- array( 0 => 61, 1 => 1 ),
- array( 0 => 62, 1 => 2 ),
- array( 0 => 62, 1 => 2 ),
- array( 0 => 62, 1 => 2 ),
- array( 0 => 62, 1 => 4 ),
+ array( 0 => 62, 1 => 1 ),
+ array( 0 => 63, 1 => 2 ),
+ array( 0 => 63, 1 => 2 ),
+ array( 0 => 63, 1 => 2 ),
array( 0 => 63, 1 => 4 ),
- array( 0 => 63, 1 => 1 ),
- array( 0 => 64, 1 => 2 ),
- array( 0 => 64, 1 => 0 ),
- array( 0 => 62, 1 => 2 ),
- array( 0 => 62, 1 => 0 ),
- array( 0 => 65, 1 => 1 ),
- array( 0 => 65, 1 => 1 ),
- array( 0 => 65, 1 => 1 ),
- array( 0 => 65, 1 => 3 ),
+ array( 0 => 64, 1 => 4 ),
+ array( 0 => 64, 1 => 1 ),
array( 0 => 65, 1 => 2 ),
+ array( 0 => 65, 1 => 0 ),
+ array( 0 => 63, 1 => 2 ),
+ array( 0 => 63, 1 => 0 ),
array( 0 => 66, 1 => 1 ),
+ array( 0 => 66, 1 => 1 ),
+ array( 0 => 66, 1 => 1 ),
+ array( 0 => 66, 1 => 3 ),
array( 0 => 66, 1 => 2 ),
- array( 0 => 66, 1 => 2 ),
- array( 0 => 69, 1 => 2 ),
- array( 0 => 68, 1 => 2 ),
- array( 0 => 71, 1 => 1 ),
- array( 0 => 71, 1 => 1 ),
- array( 0 => 71, 1 => 1 ),
- array( 0 => 67, 1 => 3 ),
- array( 0 => 67, 1 => 2 ),
- array( 0 => 67, 1 => 4 ),
- array( 0 => 67, 1 => 5 ),
- array( 0 => 67, 1 => 6 ),
- array( 0 => 67, 1 => 2 ),
- array( 0 => 67, 1 => 3 ),
- array( 0 => 67, 1 => 2 ),
- array( 0 => 67, 1 => 3 ),
- array( 0 => 67, 1 => 8 ),
- array( 0 => 79, 1 => 2 ),
- array( 0 => 79, 1 => 1 ),
- array( 0 => 67, 1 => 5 ),
- array( 0 => 67, 1 => 7 ),
- array( 0 => 67, 1 => 6 ),
- array( 0 => 67, 1 => 8 ),
+ array( 0 => 67, 1 => 1 ),
array( 0 => 67, 1 => 2 ),
- array( 0 => 67, 1 => 3 ),
- array( 0 => 67, 1 => 4 ),
- array( 0 => 65, 1 => 1 ),
array( 0 => 67, 1 => 2 ),
- array( 0 => 67, 1 => 3 ),
- array( 0 => 67, 1 => 4 ),
- array( 0 => 67, 1 => 5 ),
- array( 0 => 72, 1 => 2 ),
+ array( 0 => 70, 1 => 2 ),
+ array( 0 => 69, 1 => 2 ),
array( 0 => 72, 1 => 1 ),
- array( 0 => 72, 1 => 0 ),
- array( 0 => 82, 1 => 4 ),
- array( 0 => 82, 1 => 2 ),
- array( 0 => 82, 1 => 2 ),
- array( 0 => 82, 1 => 2 ),
- array( 0 => 82, 1 => 2 ),
- array( 0 => 82, 1 => 2 ),
- array( 0 => 82, 1 => 4 ),
- array( 0 => 78, 1 => 1 ),
+ array( 0 => 72, 1 => 1 ),
+ array( 0 => 72, 1 => 1 ),
+ array( 0 => 68, 1 => 3 ),
+ array( 0 => 68, 1 => 2 ),
+ array( 0 => 68, 1 => 4 ),
+ array( 0 => 68, 1 => 5 ),
+ array( 0 => 68, 1 => 6 ),
+ array( 0 => 68, 1 => 2 ),
+ array( 0 => 68, 1 => 3 ),
+ array( 0 => 68, 1 => 2 ),
+ array( 0 => 68, 1 => 3 ),
+ array( 0 => 68, 1 => 8 ),
+ array( 0 => 80, 1 => 2 ),
+ array( 0 => 80, 1 => 1 ),
+ array( 0 => 68, 1 => 5 ),
+ array( 0 => 68, 1 => 7 ),
+ array( 0 => 68, 1 => 6 ),
+ array( 0 => 68, 1 => 8 ),
+ array( 0 => 68, 1 => 2 ),
+ array( 0 => 68, 1 => 3 ),
+ array( 0 => 68, 1 => 4 ),
+ array( 0 => 66, 1 => 1 ),
+ array( 0 => 68, 1 => 2 ),
+ array( 0 => 68, 1 => 3 ),
+ array( 0 => 68, 1 => 4 ),
+ array( 0 => 68, 1 => 5 ),
+ array( 0 => 73, 1 => 2 ),
+ array( 0 => 73, 1 => 1 ),
+ array( 0 => 73, 1 => 0 ),
+ array( 0 => 83, 1 => 4 ),
+ array( 0 => 83, 1 => 2 ),
+ array( 0 => 83, 1 => 2 ),
+ array( 0 => 83, 1 => 2 ),
+ array( 0 => 83, 1 => 2 ),
+ array( 0 => 83, 1 => 2 ),
+ array( 0 => 83, 1 => 4 ),
+ array( 0 => 79, 1 => 1 ),
+ array( 0 => 79, 1 => 3 ),
array( 0 => 78, 1 => 3 ),
- array( 0 => 77, 1 => 3 ),
- array( 0 => 77, 1 => 3 ),
- array( 0 => 77, 1 => 3 ),
- array( 0 => 77, 1 => 3 ),
+ array( 0 => 78, 1 => 3 ),
+ array( 0 => 78, 1 => 3 ),
+ array( 0 => 78, 1 => 3 ),
+ array( 0 => 76, 1 => 1 ),
+ array( 0 => 76, 1 => 1 ),
+ array( 0 => 76, 1 => 1 ),
+ array( 0 => 76, 1 => 2 ),
+ array( 0 => 76, 1 => 2 ),
+ array( 0 => 76, 1 => 3 ),
+ array( 0 => 76, 1 => 3 ),
+ array( 0 => 76, 1 => 3 ),
+ array( 0 => 76, 1 => 3 ),
+ array( 0 => 76, 1 => 3 ),
+ array( 0 => 76, 1 => 2 ),
+ array( 0 => 89, 1 => 1 ),
+ array( 0 => 76, 1 => 3 ),
+ array( 0 => 76, 1 => 3 ),
+ array( 0 => 76, 1 => 3 ),
+ array( 0 => 84, 1 => 4 ),
+ array( 0 => 85, 1 => 5 ),
+ array( 0 => 85, 1 => 5 ),
+ array( 0 => 85, 1 => 5 ),
+ array( 0 => 85, 1 => 4 ),
array( 0 => 75, 1 => 1 ),
+ array( 0 => 75, 1 => 2 ),
+ array( 0 => 75, 1 => 2 ),
+ array( 0 => 75, 1 => 2 ),
+ array( 0 => 75, 1 => 2 ),
array( 0 => 75, 1 => 1 ),
array( 0 => 75, 1 => 1 ),
+ array( 0 => 75, 1 => 3 ),
array( 0 => 75, 1 => 2 ),
array( 0 => 75, 1 => 2 ),
+ array( 0 => 75, 1 => 1 ),
+ array( 0 => 75, 1 => 1 ),
array( 0 => 75, 1 => 3 ),
array( 0 => 75, 1 => 3 ),
array( 0 => 75, 1 => 3 ),
+ array( 0 => 75, 1 => 1 ),
+ array( 0 => 75, 1 => 1 ),
array( 0 => 75, 1 => 3 ),
- array( 0 => 75, 1 => 3 ),
+ array( 0 => 75, 1 => 1 ),
array( 0 => 75, 1 => 2 ),
- array( 0 => 88, 1 => 1 ),
- array( 0 => 75, 1 => 3 ),
+ array( 0 => 75, 1 => 1 ),
+ array( 0 => 75, 1 => 1 ),
array( 0 => 75, 1 => 3 ),
- array( 0 => 83, 1 => 4 ),
- array( 0 => 84, 1 => 5 ),
- array( 0 => 84, 1 => 5 ),
- array( 0 => 84, 1 => 5 ),
- array( 0 => 84, 1 => 4 ),
- array( 0 => 74, 1 => 1 ),
- array( 0 => 74, 1 => 2 ),
- array( 0 => 74, 1 => 2 ),
- array( 0 => 74, 1 => 2 ),
- array( 0 => 74, 1 => 2 ),
- array( 0 => 74, 1 => 1 ),
- array( 0 => 74, 1 => 1 ),
- array( 0 => 74, 1 => 3 ),
- array( 0 => 74, 1 => 2 ),
- array( 0 => 74, 1 => 2 ),
- array( 0 => 74, 1 => 1 ),
- array( 0 => 74, 1 => 1 ),
- array( 0 => 74, 1 => 3 ),
- array( 0 => 74, 1 => 3 ),
- array( 0 => 74, 1 => 3 ),
- array( 0 => 74, 1 => 1 ),
- array( 0 => 74, 1 => 1 ),
- array( 0 => 74, 1 => 3 ),
- array( 0 => 74, 1 => 1 ),
- array( 0 => 74, 1 => 2 ),
- array( 0 => 74, 1 => 1 ),
- array( 0 => 74, 1 => 1 ),
- array( 0 => 74, 1 => 3 ),
- array( 0 => 91, 1 => 1 ),
- array( 0 => 91, 1 => 1 ),
- array( 0 => 95, 1 => 3 ),
- array( 0 => 95, 1 => 3 ),
- array( 0 => 95, 1 => 1 ),
- array( 0 => 95, 1 => 1 ),
- array( 0 => 95, 1 => 0 ),
- array( 0 => 96, 1 => 1 ),
- array( 0 => 96, 1 => 1 ),
- array( 0 => 96, 1 => 3 ),
- array( 0 => 96, 1 => 1 ),
- array( 0 => 98, 1 => 3 ),
- array( 0 => 98, 1 => 4 ),
+ array( 0 => 93, 1 => 1 ),
+ array( 0 => 93, 1 => 1 ),
+ array( 0 => 97, 1 => 3 ),
+ array( 0 => 97, 1 => 3 ),
+ array( 0 => 97, 1 => 1 ),
+ array( 0 => 97, 1 => 1 ),
+ array( 0 => 97, 1 => 0 ),
+ array( 0 => 98, 1 => 1 ),
+ array( 0 => 98, 1 => 1 ),
array( 0 => 98, 1 => 3 ),
- array( 0 => 98, 1 => 4 ),
- array( 0 => 73, 1 => 1 ),
- array( 0 => 73, 1 => 1 ),
- array( 0 => 70, 1 => 2 ),
- array( 0 => 70, 1 => 2 ),
- array( 0 => 99, 1 => 2 ),
- array( 0 => 99, 1 => 0 ),
- array( 0 => 100, 1 => 2 ),
- array( 0 => 100, 1 => 2 ),
- array( 0 => 100, 1 => 4 ),
- array( 0 => 100, 1 => 2 ),
- array( 0 => 100, 1 => 2 ),
- array( 0 => 100, 1 => 4 ),
- array( 0 => 100, 1 => 3 ),
- array( 0 => 100, 1 => 5 ),
- array( 0 => 100, 1 => 3 ),
- array( 0 => 100, 1 => 3 ),
- array( 0 => 100, 1 => 3 ),
- array( 0 => 100, 1 => 3 ),
+ array( 0 => 98, 1 => 1 ),
array( 0 => 100, 1 => 3 ),
+ array( 0 => 100, 1 => 4 ),
array( 0 => 100, 1 => 3 ),
- array( 0 => 100, 1 => 2 ),
- array( 0 => 80, 1 => 1 ),
- array( 0 => 80, 1 => 1 ),
- array( 0 => 80, 1 => 2 ),
- array( 0 => 101, 1 => 1 ),
- array( 0 => 101, 1 => 1 ),
- array( 0 => 101, 1 => 3 ),
- array( 0 => 97, 1 => 2 ),
- array( 0 => 102, 1 => 1 ),
+ array( 0 => 100, 1 => 4 ),
+ array( 0 => 74, 1 => 1 ),
+ array( 0 => 74, 1 => 1 ),
+ array( 0 => 71, 1 => 2 ),
+ array( 0 => 71, 1 => 2 ),
+ array( 0 => 101, 1 => 2 ),
+ array( 0 => 101, 1 => 0 ),
array( 0 => 102, 1 => 2 ),
+ array( 0 => 102, 1 => 2 ),
+ array( 0 => 102, 1 => 4 ),
+ array( 0 => 102, 1 => 2 ),
+ array( 0 => 102, 1 => 2 ),
+ array( 0 => 102, 1 => 4 ),
+ array( 0 => 102, 1 => 3 ),
+ array( 0 => 102, 1 => 5 ),
+ array( 0 => 102, 1 => 3 ),
+ array( 0 => 102, 1 => 3 ),
+ array( 0 => 102, 1 => 3 ),
+ array( 0 => 102, 1 => 3 ),
+ array( 0 => 102, 1 => 3 ),
+ array( 0 => 102, 1 => 3 ),
+ array( 0 => 102, 1 => 2 ),
+ array( 0 => 81, 1 => 1 ),
+ array( 0 => 81, 1 => 1 ),
+ array( 0 => 81, 1 => 2 ),
+ array( 0 => 103, 1 => 1 ),
+ array( 0 => 103, 1 => 1 ),
array( 0 => 103, 1 => 3 ),
- array( 0 => 103, 1 => 3 ),
- array( 0 => 103, 1 => 5 ),
- array( 0 => 103, 1 => 6 ),
- array( 0 => 103, 1 => 2 ),
- array( 0 => 90, 1 => 4 ),
- array( 0 => 104, 1 => 4 ),
- array( 0 => 104, 1 => 4 ),
- array( 0 => 105, 1 => 3 ),
- array( 0 => 105, 1 => 1 ),
+ array( 0 => 99, 1 => 2 ),
array( 0 => 105, 1 => 0 ),
- array( 0 => 76, 1 => 3 ),
- array( 0 => 76, 1 => 2 ),
+ array( 0 => 105, 1 => 1 ),
+ array( 0 => 104, 1 => 1 ),
+ array( 0 => 104, 1 => 2 ),
array( 0 => 106, 1 => 3 ),
+ array( 0 => 106, 1 => 3 ),
+ array( 0 => 106, 1 => 5 ),
+ array( 0 => 106, 1 => 6 ),
array( 0 => 106, 1 => 2 ),
- array( 0 => 81, 1 => 2 ),
- array( 0 => 81, 1 => 0 ),
- array( 0 => 107, 1 => 2 ),
- array( 0 => 107, 1 => 3 ),
- array( 0 => 107, 1 => 2 ),
- array( 0 => 93, 1 => 1 ),
- array( 0 => 93, 1 => 2 ),
- array( 0 => 93, 1 => 1 ),
- array( 0 => 93, 1 => 2 ),
- array( 0 => 93, 1 => 3 ),
- array( 0 => 86, 1 => 1 ),
- array( 0 => 86, 1 => 1 ),
- array( 0 => 85, 1 => 1 ),
- array( 0 => 87, 1 => 1 ),
- array( 0 => 94, 1 => 3 ),
- array( 0 => 94, 1 => 3 ),
- array( 0 => 108, 1 => 1 ),
+ array( 0 => 92, 1 => 5 ),
+ array( 0 => 107, 1 => 4 ),
+ array( 0 => 107, 1 => 4 ),
array( 0 => 108, 1 => 3 ),
- array( 0 => 108, 1 => 2 ),
+ array( 0 => 108, 1 => 1 ),
array( 0 => 108, 1 => 0 ),
+ array( 0 => 77, 1 => 3 ),
+ array( 0 => 77, 1 => 2 ),
array( 0 => 109, 1 => 3 ),
- array( 0 => 109, 1 => 3 ),
- array( 0 => 109, 1 => 1 ),
- array( 0 => 92, 1 => 2 ),
- array( 0 => 92, 1 => 3 ),
+ array( 0 => 109, 1 => 2 ),
+ array( 0 => 82, 1 => 2 ),
+ array( 0 => 82, 1 => 0 ),
array( 0 => 110, 1 => 2 ),
- array( 0 => 110, 1 => 1 ),
- array( 0 => 111, 1 => 3 ),
- array( 0 => 111, 1 => 3 ),
+ array( 0 => 110, 1 => 3 ),
+ array( 0 => 110, 1 => 2 ),
+ array( 0 => 95, 1 => 1 ),
+ array( 0 => 95, 1 => 2 ),
+ array( 0 => 95, 1 => 1 ),
+ array( 0 => 95, 1 => 2 ),
+ array( 0 => 95, 1 => 2 ),
+ array( 0 => 95, 1 => 3 ),
+ array( 0 => 87, 1 => 1 ),
+ array( 0 => 87, 1 => 1 ),
+ array( 0 => 86, 1 => 1 ),
+ array( 0 => 88, 1 => 1 ),
+ array( 0 => 91, 1 => 1 ),
+ array( 0 => 96, 1 => 3 ),
+ array( 0 => 96, 1 => 3 ),
array( 0 => 111, 1 => 1 ),
array( 0 => 111, 1 => 3 ),
- array( 0 => 111, 1 => 3 ),
- array( 0 => 111, 1 => 1 ),
- array( 0 => 111, 1 => 1 ),
+ array( 0 => 111, 1 => 2 ),
+ array( 0 => 111, 1 => 0 ),
+ array( 0 => 112, 1 => 3 ),
+ array( 0 => 112, 1 => 3 ),
+ array( 0 => 112, 1 => 1 ),
+ array( 0 => 94, 1 => 2 ),
+ array( 0 => 94, 1 => 3 ),
+ array( 0 => 113, 1 => 2 ),
+ array( 0 => 113, 1 => 1 ),
+ array( 0 => 114, 1 => 3 ),
+ array( 0 => 114, 1 => 3 ),
+ array( 0 => 114, 1 => 1 ),
+ array( 0 => 114, 1 => 3 ),
+ array( 0 => 114, 1 => 3 ),
+ array( 0 => 114, 1 => 1 ),
+ array( 0 => 114, 1 => 1 ),
);
public static $yyReduceMap = array(
@@ -2013,20 +2066,22 @@ public static $yy_action = array(
64 => 6,
65 => 6,
66 => 6,
- 83 => 6,
- 88 => 6,
+ 84 => 6,
89 => 6,
- 94 => 6,
- 98 => 6,
+ 90 => 6,
+ 95 => 6,
99 => 6,
- 103 => 6,
+ 100 => 6,
104 => 6,
- 106 => 6,
- 122 => 6,
- 182 => 6,
- 188 => 6,
+ 105 => 6,
+ 107 => 6,
+ 123 => 6,
+ 151 => 6,
+ 187 => 6,
+ 193 => 6,
7 => 7,
8 => 8,
+ 150 => 8,
9 => 9,
11 => 11,
12 => 12,
@@ -2064,21 +2119,21 @@ public static $yy_action = array(
48 => 48,
49 => 49,
58 => 49,
- 110 => 49,
111 => 49,
- 160 => 49,
- 164 => 49,
- 168 => 49,
- 170 => 49,
+ 112 => 49,
+ 163 => 49,
+ 167 => 49,
+ 171 => 49,
+ 173 => 49,
50 => 50,
- 112 => 50,
- 161 => 50,
- 167 => 50,
+ 113 => 50,
+ 164 => 50,
+ 170 => 50,
51 => 51,
52 => 52,
53 => 52,
54 => 54,
- 145 => 54,
+ 146 => 54,
57 => 57,
59 => 59,
60 => 60,
@@ -2099,29 +2154,29 @@ public static $yy_action = array(
78 => 78,
79 => 79,
80 => 80,
- 81 => 80,
- 82 => 82,
- 84 => 84,
- 86 => 84,
- 87 => 84,
- 125 => 84,
+ 81 => 81,
+ 82 => 81,
+ 83 => 83,
85 => 85,
- 90 => 90,
+ 87 => 85,
+ 88 => 85,
+ 126 => 85,
+ 86 => 86,
91 => 91,
92 => 92,
93 => 93,
- 95 => 95,
+ 94 => 94,
96 => 96,
- 97 => 96,
- 100 => 100,
+ 97 => 97,
+ 98 => 97,
101 => 101,
102 => 102,
- 105 => 105,
- 107 => 107,
+ 103 => 103,
+ 106 => 106,
108 => 108,
- 109 => 108,
- 159 => 108,
- 113 => 113,
+ 109 => 109,
+ 110 => 109,
+ 162 => 109,
114 => 114,
115 => 115,
116 => 116,
@@ -2130,35 +2185,33 @@ public static $yy_action = array(
119 => 119,
120 => 120,
121 => 121,
- 123 => 123,
+ 122 => 122,
124 => 124,
- 126 => 126,
- 185 => 126,
+ 125 => 125,
127 => 127,
+ 190 => 127,
128 => 128,
129 => 129,
130 => 130,
131 => 131,
132 => 132,
- 140 => 132,
133 => 133,
+ 141 => 133,
134 => 134,
135 => 135,
- 136 => 135,
- 138 => 135,
- 139 => 135,
- 137 => 137,
- 141 => 141,
+ 136 => 136,
+ 137 => 136,
+ 139 => 136,
+ 140 => 136,
+ 138 => 138,
142 => 142,
143 => 143,
- 189 => 143,
144 => 144,
- 146 => 146,
+ 194 => 144,
+ 145 => 145,
147 => 147,
148 => 148,
149 => 149,
- 150 => 150,
- 151 => 151,
152 => 152,
153 => 153,
154 => 154,
@@ -2166,14 +2219,14 @@ public static $yy_action = array(
156 => 156,
157 => 157,
158 => 158,
- 162 => 162,
- 163 => 163,
+ 159 => 159,
+ 160 => 160,
+ 161 => 161,
165 => 165,
166 => 166,
+ 168 => 168,
169 => 169,
- 171 => 171,
172 => 172,
- 173 => 173,
174 => 174,
175 => 175,
176 => 176,
@@ -2181,21 +2234,26 @@ public static $yy_action = array(
178 => 178,
179 => 179,
180 => 180,
- 181 => 180,
+ 181 => 181,
+ 182 => 182,
183 => 183,
184 => 184,
- 186 => 186,
- 187 => 187,
- 190 => 190,
+ 185 => 185,
+ 186 => 185,
+ 188 => 188,
+ 189 => 189,
191 => 191,
192 => 192,
- 193 => 193,
- 196 => 193,
- 194 => 194,
- 197 => 194,
195 => 195,
+ 196 => 196,
+ 197 => 197,
198 => 198,
+ 201 => 198,
199 => 199,
+ 202 => 199,
+ 200 => 200,
+ 203 => 203,
+ 204 => 204,
);
// line 245 "src/Parser/TemplateParser.y"
public function yy_r0(){
@@ -2537,43 +2595,47 @@ public static $yy_action = array(
}
// line 685 "src/Parser/TemplateParser.y"
public function yy_r78(){
- $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor.' ?? '.$this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor . $this->yystack[$this->yyidx + 0]->minor . ',' . $this->yystack[$this->yyidx + -2]->minor . ') ';
}
-// line 692 "src/Parser/TemplateParser.y"
+// line 690 "src/Parser/TemplateParser.y"
public function yy_r79(){
- $this->compiler->triggerTagNoCache(substr($this->yystack[$this->yyidx + -2]->minor,1));
- $this->_retvalue = $this->yystack[$this->yyidx + -4]->minor.' ? $_smarty_tpl->getValue(\''.substr($this->yystack[$this->yyidx + -2]->minor,1).'\') : '.$this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor.' ?? '.$this->yystack[$this->yyidx + 0]->minor;
}
// line 697 "src/Parser/TemplateParser.y"
public function yy_r80(){
+ $this->compiler->triggerTagNoCache(substr($this->yystack[$this->yyidx + -2]->minor,1));
+ $this->_retvalue = $this->yystack[$this->yyidx + -4]->minor.' ? $_smarty_tpl->getValue(\''.substr($this->yystack[$this->yyidx + -2]->minor,1).'\') : '.$this->yystack[$this->yyidx + 0]->minor;
+ }
+// line 702 "src/Parser/TemplateParser.y"
+ public function yy_r81(){
$this->_retvalue = $this->yystack[$this->yyidx + -4]->minor.' ? '.$this->yystack[$this->yyidx + -2]->minor.' : '.$this->yystack[$this->yyidx + 0]->minor;
}
-// line 706 "src/Parser/TemplateParser.y"
- public function yy_r82(){
+// line 711 "src/Parser/TemplateParser.y"
+ public function yy_r83(){
$this->_retvalue = $this->yystack[$this->yyidx + -3]->minor.' ?: '.$this->yystack[$this->yyidx + 0]->minor;
}
-// line 716 "src/Parser/TemplateParser.y"
- public function yy_r84(){
- $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
- }
// line 721 "src/Parser/TemplateParser.y"
public function yy_r85(){
- $this->_retvalue = '!'.$this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
}
-// line 742 "src/Parser/TemplateParser.y"
- public function yy_r90(){
- $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor;
+// line 726 "src/Parser/TemplateParser.y"
+ public function yy_r86(){
+ $this->_retvalue = '!'.$this->yystack[$this->yyidx + 0]->minor;
}
-// line 746 "src/Parser/TemplateParser.y"
+// line 747 "src/Parser/TemplateParser.y"
public function yy_r91(){
- $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.';
+ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor;
}
-// line 750 "src/Parser/TemplateParser.y"
+// line 751 "src/Parser/TemplateParser.y"
public function yy_r92(){
- $this->_retvalue = '.'.$this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.';
}
// line 755 "src/Parser/TemplateParser.y"
public function yy_r93(){
+ $this->_retvalue = '.'.$this->yystack[$this->yyidx + 0]->minor;
+ }
+// line 760 "src/Parser/TemplateParser.y"
+ public function yy_r94(){
if (defined($this->yystack[$this->yyidx + 0]->minor)) {
if ($this->security) {
$this->security->isTrustedConstant($this->yystack[$this->yyidx + 0]->minor, $this->compiler);
@@ -2583,16 +2645,16 @@ public static $yy_action = array(
$this->_retvalue = '\''.$this->yystack[$this->yyidx + 0]->minor.'\'';
}
}
-// line 772 "src/Parser/TemplateParser.y"
- public function yy_r95(){
+// line 777 "src/Parser/TemplateParser.y"
+ public function yy_r96(){
$this->_retvalue = '('. $this->yystack[$this->yyidx + -1]->minor .')';
}
-// line 776 "src/Parser/TemplateParser.y"
- public function yy_r96(){
+// line 781 "src/Parser/TemplateParser.y"
+ public function yy_r97(){
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
}
-// line 794 "src/Parser/TemplateParser.y"
- public function yy_r100(){
+// line 799 "src/Parser/TemplateParser.y"
+ public function yy_r101(){
if ($this->security && $this->security->static_classes !== array()) {
$this->compiler->trigger_template_error('dynamic static class not allowed by security setting');
}
@@ -2605,19 +2667,19 @@ public static $yy_action = array(
}
$this->_retvalue = $prefixVar .'::'.$this->yystack[$this->yyidx + 0]->minor[0].$this->yystack[$this->yyidx + 0]->minor[1];
}
-// line 809 "src/Parser/TemplateParser.y"
- public function yy_r101(){
+// line 814 "src/Parser/TemplateParser.y"
+ public function yy_r102(){
$prefixVar = $this->compiler->getNewPrefixVariable();
$tmp = $this->compiler->appendCode('<?php ob_start();?>', (string) $this->yystack[$this->yyidx + 0]->minor);
$this->compiler->appendPrefixCode($this->compiler->appendCode($tmp, "<?php {$prefixVar} = ob_get_clean();?>"));
$this->_retvalue = $prefixVar;
}
-// line 816 "src/Parser/TemplateParser.y"
- public function yy_r102(){
+// line 821 "src/Parser/TemplateParser.y"
+ public function yy_r103(){
$this->_retvalue = $this->compiler->compileModifier($this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor);
}
-// line 829 "src/Parser/TemplateParser.y"
- public function yy_r105(){
+// line 834 "src/Parser/TemplateParser.y"
+ public function yy_r106(){
if (!in_array(strtolower($this->yystack[$this->yyidx + -2]->minor), array('self', 'parent')) && (!$this->security || $this->security->isTrustedStaticClassAccess($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->compiler))) {
if (isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor])) {
$this->_retvalue = $this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor].'::'.$this->yystack[$this->yyidx + 0]->minor[0].$this->yystack[$this->yyidx + 0]->minor[1];
@@ -2628,21 +2690,21 @@ public static $yy_action = array(
$this->compiler->trigger_template_error ('static class \''.$this->yystack[$this->yyidx + -2]->minor.'\' is undefined or not allowed by security setting');
}
}
-// line 848 "src/Parser/TemplateParser.y"
- public function yy_r107(){
+// line 853 "src/Parser/TemplateParser.y"
+ public function yy_r108(){
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
}
-// line 856 "src/Parser/TemplateParser.y"
- public function yy_r108(){
+// line 861 "src/Parser/TemplateParser.y"
+ public function yy_r109(){
$this->_retvalue = array_merge($this->yystack[$this->yyidx + -2]->minor,array($this->yystack[$this->yyidx + 0]->minor));
}
-// line 883 "src/Parser/TemplateParser.y"
- public function yy_r113(){
+// line 888 "src/Parser/TemplateParser.y"
+ public function yy_r114(){
$this->compiler->triggerTagNoCache(substr($this->yystack[$this->yyidx + 0]->minor,1));
$this->_retvalue = array('$_smarty_tpl->hasVariable(\''.substr($this->yystack[$this->yyidx + 0]->minor,1).'\')','$_smarty_tpl->getValue(\''.substr($this->yystack[$this->yyidx + 0]->minor,1).'\')');
}
-// line 887 "src/Parser/TemplateParser.y"
- public function yy_r114(){
+// line 892 "src/Parser/TemplateParser.y"
+ public function yy_r115(){
if ($this->yystack[$this->yyidx + 0]->minor['var'] === '\'smarty\'') {
$smarty_var = (new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index']);
$this->_retvalue = array('true', $smarty_var);
@@ -2654,118 +2716,118 @@ public static $yy_action = array(
$this->_retvalue = array('true', '$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + 0]->minor['var'] . ')'.$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index']);
}
}
-// line 901 "src/Parser/TemplateParser.y"
- public function yy_r115(){
- $this->_retvalue = array('true', '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -2]->minor .')->'.$this->yystack[$this->yyidx + 0]->minor);
- }
// line 906 "src/Parser/TemplateParser.y"
public function yy_r116(){
- $this->_retvalue = array('true', $this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = array('true', '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -2]->minor .')->'.$this->yystack[$this->yyidx + 0]->minor);
}
// line 911 "src/Parser/TemplateParser.y"
public function yy_r117(){
- $this->_retvalue = $this->compiler->compileConfigVariable('\'' . $this->yystack[$this->yyidx + -1]->minor . '\'');
+ $this->_retvalue = array('true', $this->yystack[$this->yyidx + 0]->minor);
}
-// line 915 "src/Parser/TemplateParser.y"
+// line 916 "src/Parser/TemplateParser.y"
public function yy_r118(){
- $this->_retvalue = '(is_array($tmp = ' . $this->compiler->compileConfigVariable('\'' . $this->yystack[$this->yyidx + -2]->minor . '\'') . ') ? $tmp'.$this->yystack[$this->yyidx + 0]->minor.' :null)';
+ $this->_retvalue = $this->compiler->compileConfigVariable('\'' . $this->yystack[$this->yyidx + -1]->minor . '\'');
}
-// line 919 "src/Parser/TemplateParser.y"
+// line 920 "src/Parser/TemplateParser.y"
public function yy_r119(){
- $this->_retvalue = $this->compiler->compileConfigVariable($this->yystack[$this->yyidx + -1]->minor);
+ $this->_retvalue = '(is_array($tmp = ' . $this->compiler->compileConfigVariable('\'' . $this->yystack[$this->yyidx + -2]->minor . '\'') . ') ? $tmp'.$this->yystack[$this->yyidx + 0]->minor.' :null)';
}
-// line 923 "src/Parser/TemplateParser.y"
+// line 924 "src/Parser/TemplateParser.y"
public function yy_r120(){
- $this->_retvalue = '(is_array($tmp = ' . $this->compiler->compileConfigVariable($this->yystack[$this->yyidx + -2]->minor) . ') ? $tmp'.$this->yystack[$this->yyidx + 0]->minor.' : null)';
+ $this->_retvalue = $this->compiler->compileConfigVariable($this->yystack[$this->yyidx + -1]->minor);
}
-// line 927 "src/Parser/TemplateParser.y"
+// line 928 "src/Parser/TemplateParser.y"
public function yy_r121(){
+ $this->_retvalue = '(is_array($tmp = ' . $this->compiler->compileConfigVariable($this->yystack[$this->yyidx + -2]->minor) . ') ? $tmp'.$this->yystack[$this->yyidx + 0]->minor.' : null)';
+ }
+// line 932 "src/Parser/TemplateParser.y"
+ public function yy_r122(){
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor[1];
}
-// line 935 "src/Parser/TemplateParser.y"
- public function yy_r123(){
+// line 940 "src/Parser/TemplateParser.y"
+ public function yy_r124(){
$this->_retvalue = array('var'=>'\''.substr($this->yystack[$this->yyidx + -1]->minor,1).'\'', 'smarty_internal_index'=>$this->yystack[$this->yyidx + 0]->minor);
}
-// line 938 "src/Parser/TemplateParser.y"
- public function yy_r124(){
+// line 943 "src/Parser/TemplateParser.y"
+ public function yy_r125(){
$this->_retvalue = array('var'=>$this->yystack[$this->yyidx + -1]->minor, 'smarty_internal_index'=>$this->yystack[$this->yyidx + 0]->minor);
}
-// line 951 "src/Parser/TemplateParser.y"
- public function yy_r126(){
+// line 956 "src/Parser/TemplateParser.y"
+ public function yy_r127(){
return;
}
-// line 957 "src/Parser/TemplateParser.y"
- public function yy_r127(){
+// line 962 "src/Parser/TemplateParser.y"
+ public function yy_r128(){
$this->compiler->triggerTagNoCache(substr($this->yystack[$this->yyidx + 0]->minor,1));
$this->_retvalue = '[$_smarty_tpl->getValue(\''.substr($this->yystack[$this->yyidx + 0]->minor,1).'\')]';
}
-// line 961 "src/Parser/TemplateParser.y"
- public function yy_r128(){
- $this->compiler->triggerTagNoCache($this->yystack[$this->yyidx + 0]->minor);
- $this->_retvalue = '[$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + 0]->minor . ')]';
- }
// line 966 "src/Parser/TemplateParser.y"
public function yy_r129(){
- $this->compiler->triggerTagNoCache($this->yystack[$this->yyidx + -2]->minor);
- $this->_retvalue = '[$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + -2]->minor . ')->'.$this->yystack[$this->yyidx + 0]->minor.']';
+ $this->compiler->triggerTagNoCache($this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = '[$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + 0]->minor . ')]';
}
// line 971 "src/Parser/TemplateParser.y"
public function yy_r130(){
- $this->_retvalue = '[\''. $this->yystack[$this->yyidx + 0]->minor .'\']';
+ $this->compiler->triggerTagNoCache($this->yystack[$this->yyidx + -2]->minor);
+ $this->_retvalue = '[$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + -2]->minor . ')->'.$this->yystack[$this->yyidx + 0]->minor.']';
}
-// line 975 "src/Parser/TemplateParser.y"
+// line 976 "src/Parser/TemplateParser.y"
public function yy_r131(){
- $this->_retvalue = '['. $this->yystack[$this->yyidx + 0]->minor .']';
+ $this->_retvalue = '[\''. $this->yystack[$this->yyidx + 0]->minor .'\']';
}
// line 980 "src/Parser/TemplateParser.y"
public function yy_r132(){
- $this->_retvalue = '['. $this->yystack[$this->yyidx + -1]->minor .']';
+ $this->_retvalue = '['. $this->yystack[$this->yyidx + 0]->minor .']';
}
// line 985 "src/Parser/TemplateParser.y"
public function yy_r133(){
- $this->_retvalue = '['.(new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,'[\'section\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\'][\'index\']').']';
+ $this->_retvalue = '['. $this->yystack[$this->yyidx + -1]->minor .']';
}
-// line 989 "src/Parser/TemplateParser.y"
+// line 990 "src/Parser/TemplateParser.y"
public function yy_r134(){
- $this->_retvalue = '['.(new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,'[\'section\'][\''.$this->yystack[$this->yyidx + -3]->minor.'\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\']').']';
+ $this->_retvalue = '['.(new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,'[\'section\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\'][\'index\']').']';
}
-// line 992 "src/Parser/TemplateParser.y"
+// line 994 "src/Parser/TemplateParser.y"
public function yy_r135(){
+ $this->_retvalue = '['.(new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,'[\'section\'][\''.$this->yystack[$this->yyidx + -3]->minor.'\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\']').']';
+ }
+// line 997 "src/Parser/TemplateParser.y"
+ public function yy_r136(){
$this->_retvalue = '['.$this->yystack[$this->yyidx + -1]->minor.']';
}
-// line 998 "src/Parser/TemplateParser.y"
- public function yy_r137(){
+// line 1003 "src/Parser/TemplateParser.y"
+ public function yy_r138(){
$this->compiler->triggerTagNoCache(substr($this->yystack[$this->yyidx + -1]->minor,1));
$this->_retvalue = '[$_smarty_tpl->getValue(\''.substr($this->yystack[$this->yyidx + -1]->minor,1).'\')]';
}
-// line 1015 "src/Parser/TemplateParser.y"
- public function yy_r141(){
- $this->_retvalue = '[]';
- }
-// line 1025 "src/Parser/TemplateParser.y"
+// line 1020 "src/Parser/TemplateParser.y"
public function yy_r142(){
- $this->_retvalue = '\''.substr($this->yystack[$this->yyidx + 0]->minor,1).'\'';
+ $this->_retvalue = '[]';
}
-// line 1029 "src/Parser/TemplateParser.y"
+// line 1030 "src/Parser/TemplateParser.y"
public function yy_r143(){
- $this->_retvalue = '\'\'';
+ $this->_retvalue = '\''.substr($this->yystack[$this->yyidx + 0]->minor,1).'\'';
}
// line 1034 "src/Parser/TemplateParser.y"
public function yy_r144(){
+ $this->_retvalue = '\'\'';
+ }
+// line 1039 "src/Parser/TemplateParser.y"
+ public function yy_r145(){
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor;
}
-// line 1042 "src/Parser/TemplateParser.y"
- public function yy_r146(){
+// line 1047 "src/Parser/TemplateParser.y"
+ public function yy_r147(){
$var = trim(substr($this->yystack[$this->yyidx + 0]->minor, $this->compiler->getLdelLength(), -$this->compiler->getRdelLength()), ' $');
$this->compiler->triggerTagNoCache($var);
$this->_retvalue = '$_smarty_tpl->getValue(\''.$var.'\')';
}
-// line 1049 "src/Parser/TemplateParser.y"
- public function yy_r147(){
+// line 1054 "src/Parser/TemplateParser.y"
+ public function yy_r148(){
$this->_retvalue = '('.$this->yystack[$this->yyidx + -1]->minor.')';
}
-// line 1056 "src/Parser/TemplateParser.y"
- public function yy_r148(){
+// line 1061 "src/Parser/TemplateParser.y"
+ public function yy_r149(){
if ($this->yystack[$this->yyidx + -1]->minor['var'] === '\'smarty\'') {
$this->_retvalue = (new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index']).$this->yystack[$this->yyidx + 0]->minor;
} else {
@@ -2773,93 +2835,93 @@ public static $yy_action = array(
$this->_retvalue = '$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + -1]->minor['var'] . ')'.$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index'].$this->yystack[$this->yyidx + 0]->minor;
}
}
-// line 1066 "src/Parser/TemplateParser.y"
- public function yy_r149(){
+// line 1081 "src/Parser/TemplateParser.y"
+ public function yy_r152(){
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
}
-// line 1071 "src/Parser/TemplateParser.y"
- public function yy_r150(){
+// line 1086 "src/Parser/TemplateParser.y"
+ public function yy_r153(){
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
}
-// line 1076 "src/Parser/TemplateParser.y"
- public function yy_r151(){
+// line 1091 "src/Parser/TemplateParser.y"
+ public function yy_r154(){
if ($this->security && substr($this->yystack[$this->yyidx + -1]->minor,0,1) === '_') {
$this->compiler->trigger_template_error (self::ERR1);
}
$this->_retvalue = '->'.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
}
-// line 1083 "src/Parser/TemplateParser.y"
- public function yy_r152(){
+// line 1098 "src/Parser/TemplateParser.y"
+ public function yy_r155(){
if ($this->security) {
$this->compiler->trigger_template_error (self::ERR2);
}
$this->compiler->triggerTagNoCache($this->yystack[$this->yyidx + -1]->minor);
$this->_retvalue = '->{$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + -1]->minor . ')'.$this->yystack[$this->yyidx + 0]->minor.'}';
}
-// line 1091 "src/Parser/TemplateParser.y"
- public function yy_r153(){
+// line 1106 "src/Parser/TemplateParser.y"
+ public function yy_r156(){
if ($this->security) {
$this->compiler->trigger_template_error (self::ERR2);
}
$this->_retvalue = '->{'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + 0]->minor.'}';
}
-// line 1098 "src/Parser/TemplateParser.y"
- public function yy_r154(){
+// line 1113 "src/Parser/TemplateParser.y"
+ public function yy_r157(){
if ($this->security) {
$this->compiler->trigger_template_error (self::ERR2);
}
$this->_retvalue = '->{\''.$this->yystack[$this->yyidx + -4]->minor.'\'.'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + 0]->minor.'}';
}
-// line 1106 "src/Parser/TemplateParser.y"
- public function yy_r155(){
+// line 1121 "src/Parser/TemplateParser.y"
+ public function yy_r158(){
$this->_retvalue = '->'.$this->yystack[$this->yyidx + 0]->minor;
}
-// line 1114 "src/Parser/TemplateParser.y"
- public function yy_r156(){
+// line 1129 "src/Parser/TemplateParser.y"
+ public function yy_r159(){
- if ($this->yystack[$this->yyidx + -3]->minor == 'isset') {
+ if ($this->yystack[$this->yyidx + -4]->minor == 'isset') {
$this->_retvalue = '(true';
- if (count($this->yystack[$this->yyidx + -1]->minor) == 0) {
+ if (count($this->yystack[$this->yyidx + -2]->minor) == 0) {
throw new CompilerException("Invalid number of arguments for isset. isset expects at least one parameter.");
}
- foreach ($this->yystack[$this->yyidx + -1]->minor as $value) {
+ foreach ($this->yystack[$this->yyidx + -2]->minor as $value) {
if (is_array($value)) {
$this->_retvalue .= ' && (' . $value[0] . ' && null !== (' . $value[1] . ' ?? null))';
} else {
$this->_retvalue .= ' && (' . $value . ' !== null)';
}
}
- $this->_retvalue .= ')';
- } elseif ($this->yystack[$this->yyidx + -3]->minor == 'empty') {
- if (count($this->yystack[$this->yyidx + -1]->minor) != 1) {
+ $this->_retvalue .= ')' . $this->yystack[$this->yyidx + 0]->minor;
+ } elseif ($this->yystack[$this->yyidx + -4]->minor == 'empty') {
+ if (count($this->yystack[$this->yyidx + -2]->minor) != 1) {
throw new CompilerException("Invalid number of arguments for empty. empty expects at exactly one parameter.");
}
- if (is_array($this->yystack[$this->yyidx + -1]->minor[0])) {
- $this->_retvalue .= '( !' . $this->yystack[$this->yyidx + -1]->minor[0][0] . ' || empty(' . $this->yystack[$this->yyidx + -1]->minor[0][1] . '))';
+ if (is_array($this->yystack[$this->yyidx + -2]->minor[0])) {
+ $this->_retvalue = '( !' . $this->yystack[$this->yyidx + -2]->minor[0][0] . ' || empty(' . $this->yystack[$this->yyidx + -2]->minor[0][1] . '))' . $this->yystack[$this->yyidx + 0]->minor;
} else {
- $this->_retvalue = 'false == ' . $this->yystack[$this->yyidx + -1]->minor[0];
+ $this->_retvalue = 'false == ' . $this->yystack[$this->yyidx + -2]->minor[0] . $this->yystack[$this->yyidx + 0]->minor;
}
} else {
$p = array();
- foreach ($this->yystack[$this->yyidx + -1]->minor as $value) {
+ foreach ($this->yystack[$this->yyidx + -2]->minor as $value) {
if (is_array($value)) {
$p[] = $value[1];
} else {
$p[] = $value;
}
}
- $this->_retvalue = $this->compiler->compileModifierInExpression($this->yystack[$this->yyidx + -3]->minor, $p);
+ $this->_retvalue = $this->compiler->compileModifierInExpression($this->yystack[$this->yyidx + -4]->minor, $p) . $this->yystack[$this->yyidx + 0]->minor;
}
}
-// line 1155 "src/Parser/TemplateParser.y"
- public function yy_r157(){
+// line 1170 "src/Parser/TemplateParser.y"
+ public function yy_r160(){
if ($this->security && substr($this->yystack[$this->yyidx + -3]->minor,0,1) === '_') {
$this->compiler->trigger_template_error (self::ERR1);
}
$this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . '('. implode(',',$this->yystack[$this->yyidx + -1]->minor) .')';
}
-// line 1162 "src/Parser/TemplateParser.y"
- public function yy_r158(){
+// line 1177 "src/Parser/TemplateParser.y"
+ public function yy_r161(){
if ($this->security) {
$this->compiler->trigger_template_error (self::ERR2);
}
@@ -2868,52 +2930,56 @@ public static $yy_action = array(
$this->compiler->appendPrefixCode("<?php {$prefixVar} = \$_smarty_tpl->getValue('".substr($this->yystack[$this->yyidx + -3]->minor,1).'\')'.';?>');
$this->_retvalue = $prefixVar .'('. implode(',',$this->yystack[$this->yyidx + -1]->minor) .')';
}
-// line 1191 "src/Parser/TemplateParser.y"
- public function yy_r162(){
+// line 1206 "src/Parser/TemplateParser.y"
+ public function yy_r165(){
$this->_retvalue = array_merge($this->yystack[$this->yyidx + -2]->minor,array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor)));
}
-// line 1195 "src/Parser/TemplateParser.y"
- public function yy_r163(){
+// line 1210 "src/Parser/TemplateParser.y"
+ public function yy_r166(){
$this->_retvalue = array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor));
}
-// line 1203 "src/Parser/TemplateParser.y"
- public function yy_r165(){
+// line 1218 "src/Parser/TemplateParser.y"
+ public function yy_r168(){
$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);
}
-// line 1211 "src/Parser/TemplateParser.y"
- public function yy_r166(){
+// line 1226 "src/Parser/TemplateParser.y"
+ public function yy_r169(){
$this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor);
}
-// line 1224 "src/Parser/TemplateParser.y"
- public function yy_r169(){
+// line 1239 "src/Parser/TemplateParser.y"
+ public function yy_r172(){
$this->_retvalue = array(trim($this->yystack[$this->yyidx + -1]->minor).$this->yystack[$this->yyidx + 0]->minor);
}
-// line 1233 "src/Parser/TemplateParser.y"
- public function yy_r171(){
+// line 1248 "src/Parser/TemplateParser.y"
+ public function yy_r174(){
$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor, '', 'method');
}
-// line 1238 "src/Parser/TemplateParser.y"
- public function yy_r172(){
+// line 1253 "src/Parser/TemplateParser.y"
+ public function yy_r175(){
$this->_retvalue = array($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor, 'method');
}
-// line 1243 "src/Parser/TemplateParser.y"
- public function yy_r173(){
+// line 1258 "src/Parser/TemplateParser.y"
+ public function yy_r176(){
$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor, '');
}
-// line 1248 "src/Parser/TemplateParser.y"
- public function yy_r174(){
+// line 1263 "src/Parser/TemplateParser.y"
+ public function yy_r177(){
+ $this->_retvalue = array($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor);
+ }
+// line 1268 "src/Parser/TemplateParser.y"
+ public function yy_r178(){
$this->_retvalue = array($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor, 'property');
}
-// line 1253 "src/Parser/TemplateParser.y"
- public function yy_r175(){
+// line 1273 "src/Parser/TemplateParser.y"
+ public function yy_r179(){
$this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor, 'property');
}
-// line 1259 "src/Parser/TemplateParser.y"
- public function yy_r176(){
+// line 1279 "src/Parser/TemplateParser.y"
+ public function yy_r180(){
$this->_retvalue = ' '. trim($this->yystack[$this->yyidx + 0]->minor) . ' ';
}
-// line 1263 "src/Parser/TemplateParser.y"
- public function yy_r177(){
+// line 1283 "src/Parser/TemplateParser.y"
+ public function yy_r181(){
static $lops = array(
'eq' => ' == ',
'ne' => ' != ',
@@ -2932,8 +2998,8 @@ public static $yy_action = array(
$op = strtolower(preg_replace('/\s*/', '', $this->yystack[$this->yyidx + 0]->minor));
$this->_retvalue = $lops[$op];
}
-// line 1282 "src/Parser/TemplateParser.y"
- public function yy_r178(){
+// line 1302 "src/Parser/TemplateParser.y"
+ public function yy_r182(){
static $tlops = array(
'isdivby' => array('op' => ' % ', 'pre' => '!('),
'isnotdivby' => array('op' => ' % ', 'pre' => '('),
@@ -2945,8 +3011,8 @@ public static $yy_action = array(
$op = strtolower(preg_replace('/\s*/', '', $this->yystack[$this->yyidx + 0]->minor));
$this->_retvalue = $tlops[$op];
}
-// line 1295 "src/Parser/TemplateParser.y"
- public function yy_r179(){
+// line 1315 "src/Parser/TemplateParser.y"
+ public function yy_r183(){
static $scond = array (
'iseven' => '!(1 & ',
'isnoteven' => '(1 & ',
@@ -2956,58 +3022,62 @@ public static $yy_action = array(
$op = strtolower(str_replace(' ', '', $this->yystack[$this->yyidx + 0]->minor));
$this->_retvalue = $scond[$op];
}
-// line 1309 "src/Parser/TemplateParser.y"
- public function yy_r180(){
+// line 1326 "src/Parser/TemplateParser.y"
+ public function yy_r184(){
+ $this->_retvalue = 'preg_match(';
+ }
+// line 1333 "src/Parser/TemplateParser.y"
+ public function yy_r185(){
$this->_retvalue = 'array('.$this->yystack[$this->yyidx + -1]->minor.')';
}
-// line 1320 "src/Parser/TemplateParser.y"
- public function yy_r183(){
+// line 1344 "src/Parser/TemplateParser.y"
+ public function yy_r188(){
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor;
}
-// line 1324 "src/Parser/TemplateParser.y"
- public function yy_r184(){
+// line 1348 "src/Parser/TemplateParser.y"
+ public function yy_r189(){
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.',';
}
-// line 1332 "src/Parser/TemplateParser.y"
- public function yy_r186(){
+// line 1356 "src/Parser/TemplateParser.y"
+ public function yy_r191(){
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'=>'.$this->yystack[$this->yyidx + 0]->minor;
}
-// line 1336 "src/Parser/TemplateParser.y"
- public function yy_r187(){
+// line 1360 "src/Parser/TemplateParser.y"
+ public function yy_r192(){
$this->_retvalue = '\''.$this->yystack[$this->yyidx + -2]->minor.'\'=>'.$this->yystack[$this->yyidx + 0]->minor;
}
-// line 1352 "src/Parser/TemplateParser.y"
- public function yy_r190(){
+// line 1376 "src/Parser/TemplateParser.y"
+ public function yy_r195(){
$this->compiler->leaveDoubleQuote();
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor->to_smarty_php($this);
}
-// line 1358 "src/Parser/TemplateParser.y"
- public function yy_r191(){
+// line 1382 "src/Parser/TemplateParser.y"
+ public function yy_r196(){
$this->yystack[$this->yyidx + -1]->minor->append_subtree($this, $this->yystack[$this->yyidx + 0]->minor);
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
}
-// line 1363 "src/Parser/TemplateParser.y"
- public function yy_r192(){
+// line 1387 "src/Parser/TemplateParser.y"
+ public function yy_r197(){
$this->_retvalue = new Dq($this, $this->yystack[$this->yyidx + 0]->minor);
}
-// line 1367 "src/Parser/TemplateParser.y"
- public function yy_r193(){
+// line 1391 "src/Parser/TemplateParser.y"
+ public function yy_r198(){
$this->_retvalue = new Code('(string)'.$this->yystack[$this->yyidx + -1]->minor);
}
-// line 1371 "src/Parser/TemplateParser.y"
- public function yy_r194(){
+// line 1395 "src/Parser/TemplateParser.y"
+ public function yy_r199(){
$this->_retvalue = new Code('(string)('.$this->yystack[$this->yyidx + -1]->minor.')');
}
-// line 1375 "src/Parser/TemplateParser.y"
- public function yy_r195(){
+// line 1399 "src/Parser/TemplateParser.y"
+ public function yy_r200(){
$this->_retvalue = new Code('(string)$_smarty_tpl->getValue(\''. substr($this->yystack[$this->yyidx + 0]->minor,1) .'\')');
}
-// line 1387 "src/Parser/TemplateParser.y"
- public function yy_r198(){
+// line 1411 "src/Parser/TemplateParser.y"
+ public function yy_r203(){
$this->_retvalue = new Tag($this, $this->yystack[$this->yyidx + 0]->minor);
}
-// line 1391 "src/Parser/TemplateParser.y"
- public function yy_r199(){
+// line 1415 "src/Parser/TemplateParser.y"
+ public function yy_r204(){
$this->_retvalue = new DqContent($this->yystack[$this->yyidx + 0]->minor);
}
diff --git a/src/Parser/TemplateParser.y b/src/Parser/TemplateParser.y
index 544148f1..fecd247d 100644
--- a/src/Parser/TemplateParser.y
+++ b/src/Parser/TemplateParser.y
@@ -681,6 +681,11 @@ expr(res) ::= expr(e1) isin(c) value(v). {
res = c . e1.',(array)'.v.')';
}
+ // regex matching
+ expr(res) ::= expr(e1) matchop(c) value(e2). {
+ res = c . e2 . ',' . e1 . ') ';
+}
+
// null coalescing
nullcoalescing(res) ::= expr(v) QMARK QMARK expr(e2). {
res = v.' ?? '.e2;
@@ -1062,12 +1067,22 @@ object(res) ::= varindexed(vi) objectchain(oc). {
}
}
+ // optional objectchain - empty
+optobjectchain(res) ::= . {
+ res = '';
+}
+
+ // optional objectchain - present
+optobjectchain(res) ::= objectchain(oc). {
+ res = oc;
+}
+
// single element
objectchain(res) ::= objectelement(oe). {
res = oe;
}
- // chain of elements
+ // chain of elements
objectchain(res) ::= objectchain(oc) objectelement(oe). {
res = oc.oe;
}
@@ -1111,7 +1126,7 @@ objectelement(res)::= PTR method(f). {
//
// function
//
-function(res) ::= ns1(f) OPENP variablelist(v) CLOSEP. {
+function(res) ::= ns1(f) OPENP variablelist(v) CLOSEP optobjectchain(oc). {
if (f == 'isset') {
res = '(true';
@@ -1125,15 +1140,15 @@ function(res) ::= ns1(f) OPENP variablelist(v) CLOSEP. {
res .= ' && (' . $value . ' !== null)';
}
}
- res .= ')';
+ res .= ')' . oc;
} elseif (f == 'empty') {
if (count(v) != 1) {
throw new CompilerException("Invalid number of arguments for empty. empty expects at exactly one parameter.");
}
if (is_array(v[0])) {
- res .= '( !' . v[0][0] . ' || empty(' . v[0][1] . '))';
+ res = '( !' . v[0][0] . ' || empty(' . v[0][1] . '))' . oc;
} else {
- res = 'false == ' . v[0];
+ res = 'false == ' . v[0] . oc;
}
} else {
$p = array();
@@ -1144,7 +1159,7 @@ function(res) ::= ns1(f) OPENP variablelist(v) CLOSEP. {
$p[] = $value;
}
}
- res = $this->compiler->compileModifierInExpression(f, $p);
+ res = $this->compiler->compileModifierInExpression(f, $p) . oc;
}
}
@@ -1244,6 +1259,11 @@ static_class_access(res) ::= ID(v). {
res = array(v, '');
}
+ // static class constant with object chain
+static_class_access(res) ::= ID(v) objectchain(oc). {
+ res = array(v, oc);
+}
+
// static class variables
static_class_access(res) ::= DOLLARID(v) arrayindex(a). {
res = array(v, a, 'property');
@@ -1303,6 +1323,10 @@ scond(res) ::= SINGLECOND(o). {
res = $scond[$op];
}
+matchop(res) ::= MATCHES(o). {
+ res = 'preg_match(';
+}
+
//
// ARRAY element assignment
//
diff --git a/src/Smarty.php b/src/Smarty.php
index efad0c1d..5665ff45 100644
--- a/src/Smarty.php
+++ b/src/Smarty.php
@@ -54,7 +54,7 @@ class Smarty extends \Smarty\TemplateBase {
/**
* smarty version
*/
- const SMARTY_VERSION = '5.5.2';
+ const SMARTY_VERSION = '5.8.0';
/**
* define caching modes
@@ -1344,10 +1344,8 @@ class Smarty extends \Smarty\TemplateBase {
}
$_filepath = (string)$_file;
if ($_file->isDir()) {
- if (!$_compile->isDot()) {
- // delete folder if empty
- @rmdir($_file->getPathname());
- }
+ // delete folder if empty
+ @rmdir($_file->getPathname());
} else {
// delete only php files
if (substr($_filepath, -4) !== '.php') {
@@ -1385,8 +1383,6 @@ class Smarty extends \Smarty\TemplateBase {
&& (!function_exists('ini_get') || strlen(ini_get('opcache.restrict_api')) < 1)
) {
opcache_invalidate($_filepath, true);
- } elseif (function_exists('apc_delete_file')) {
- apc_delete_file($_filepath);
}
}
}
diff --git a/src/Template/Compiled.php b/src/Template/Compiled.php
index 5a07db0e..e5e2aec7 100644
--- a/src/Template/Compiled.php
+++ b/src/Template/Compiled.php
@@ -251,8 +251,6 @@ class Compiled extends GeneratedPhpFile {
&& (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1)
) {
opcache_invalidate($this->filepath, true);
- } elseif (function_exists('apc_compile_file')) {
- apc_compile_file($this->filepath);
}
}
if (defined('HHVM_VERSION')) {
diff --git a/src/TemplateBase.php b/src/TemplateBase.php
index f01d1107..e06b5917 100644
--- a/src/TemplateBase.php
+++ b/src/TemplateBase.php
@@ -104,7 +104,7 @@ abstract class TemplateBase extends Data {
}
// register the object
$smarty->registered_objects[$object_name] =
- [$object, (array)$allowed_methods_properties, (boolean)$format, (array)$block_methods];
+ [$object, (array)$allowed_methods_properties, (bool)$format, (array)$block_methods];
return $this;
}
diff --git a/tests/PHPUnit_Smarty.php b/tests/PHPUnit_Smarty.php
index 029c8f90..39663c1f 100644
--- a/tests/PHPUnit_Smarty.php
+++ b/tests/PHPUnit_Smarty.php
@@ -291,10 +291,8 @@ KEY `name` (`name`)
}
// directory ?
if ($file->isDir()) {
- if (!$ri->isDot()) {
- // delete folder if empty
- @rmdir($file->getPathname());
- }
+ // delete folder if empty
+ @rmdir($file->getPathname());
} else {
unlink($file->getPathname());
}
diff --git a/tests/UnitTests/CacheResourceTests/Apc/CacheResourceCustomApcTest.php b/tests/UnitTests/CacheResourceTests/Apc/CacheResourceCustomApcTest.php
deleted file mode 100644
index d75382d0..00000000
--- a/tests/UnitTests/CacheResourceTests/Apc/CacheResourceCustomApcTest.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-/**
- * Smarty PHPunit tests for cache resource Apc
- *
-
- * @author Uwe Tews
- */
-include_once __DIR__ . '/../Memcache/CacheResourceCustomMemcacheTest.php';
-include_once __DIR__ . '/../_shared/PHPunitplugins/cacheresource.apctest.php';
-
-/**
- * class for cache resource file tests
- *
- *
- * @preserveGlobalState disabled
- *
- */
-class CacheResourceCustomApcTest extends CacheResourceCustomMemcacheTest
-{
- public function setUp(): void
- {
- if (!function_exists('apc_cache_info') || ini_get('apc.enable_cli')) {
- $this->markTestSkipped('APC cache not available');
- }
- $this->setUpSmarty(__DIR__);
- parent::setUp();
- $this->smarty->setCachingType('apc');
- $this->smarty->registerCacheResource('apc', new Smarty_CacheResource_Apctest());
- }
-}
-
diff --git a/tests/UnitTests/CacheResourceTests/_shared/PHPunitplugins/cacheresource.apctest.php b/tests/UnitTests/CacheResourceTests/_shared/PHPunitplugins/cacheresource.apctest.php
deleted file mode 100644
index 38b061dc..00000000
--- a/tests/UnitTests/CacheResourceTests/_shared/PHPunitplugins/cacheresource.apctest.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-use Smarty\Smarty;
-use Smarty\Template;
-use Smarty\Template\Cached;
-
-require_once __DIR__ . '/../../../__shared/cacheresources/cacheresource.apc.php';
-
-class Smarty_CacheResource_Apctest extends Smarty_CacheResource_Apc
-{
- public $lockTime = 0;
-
- public function hasLock(Smarty $smarty, Cached $cached)
- {
- if ($this->lockTime) {
- $this->lockTime--;
- if (!$this->lockTime) {
- $this->releaseLock($smarty, $cached);
- }
- }
- return parent::hasLock($smarty, $cached);
- }
-
- public function get(Template $_template)
- {
- $this->contents = array();
- $this->timestamps = array();
- $t = $this->getContent($_template);
-
- return $t ? $t : null;
- }
-
-}
diff --git a/tests/UnitTests/Compile/AttributeCompilerTest.php b/tests/UnitTests/Compile/AttributeCompilerTest.php
new file mode 100644
index 00000000..9a8fbf98
--- /dev/null
+++ b/tests/UnitTests/Compile/AttributeCompilerTest.php
@@ -0,0 +1,193 @@
+<?php
+
+use Smarty\Compile\AttributeCompiler;
+use Smarty\Compiler\Template;
+
+class AttributeCompilerTest extends PHPUnit\Framework\TestCase
+{
+ /**
+ * The template compiler.
+ */
+ private $template_compiler;
+
+ /**
+ * The attributes
+ */
+ private $attributes = [];
+
+ /**
+ * @inheritDoc
+ * Set up attribute compiler class
+ */
+ protected function setUp(): void
+ {
+ $this->template_compiler = $this->createMock(Template::class);
+
+ // reset attributes to empty arrays
+ $this->attributes = [
+ 'required_attributes' => [],
+ 'optional_attributes' => [],
+ 'shorttag_order' => [],
+ 'option_flags' => [],
+ ];
+ }
+
+ /**
+ * Create the attribute compiler for testing.
+ */
+ private function createAttributeCompiler() {
+ return new AttributeCompiler(
+ $this->attributes['required_attributes'],
+ $this->attributes['optional_attributes'],
+ $this->attributes['shorttag_order'],
+ $this->attributes['option_flags']
+ );
+ }
+
+ /**
+ * Tests shorthand attribute compiling.
+ */
+ public function testAttributeCompiler(): void
+ {
+ $this->attributes['shorttag_order'] = ['shorttag'];
+ $this->attributes['required_attributes'] = ['required'];
+ $this->attributes['option_flags'] = ['option', 'option_two'];
+
+ $payload = [
+ 0 => 'shorttag value',
+ 1 => [
+ 'required' => 'required_value'
+ ],
+ 2 => 'option',
+ ];
+
+ $this->assertEquals(
+ $this->createAttributeCompiler()
+ ->getAttributes($this->template_compiler, $payload),
+ [
+ 'shorttag' => 'shorttag value',
+ 'required' => 'required_value',
+ 'option' => true,
+ 'option_two' => false,
+ ]
+ );
+ }
+
+ /**
+ * Tests normal optional attribute compiling.
+ */
+ public function testAttributeCompilerOptionalArguments(): void
+ {
+ $this->attributes['optional_attributes'] = ['optional'];
+
+ $payload = [
+ 0 => [
+ 'optional' => 'optional value'
+ ],
+ ];
+
+ $this->assertEquals(
+ $this->createAttributeCompiler()
+ ->getAttributes($this->template_compiler, $payload),
+ [
+ 'optional' => 'optional value',
+ ]
+ );
+
+ $this->assertEquals(
+ $this->createAttributeCompiler()
+ ->getAttributes($this->template_compiler, []),
+ []
+ );
+ }
+
+ /**
+ * Tests any attribute compiling.
+ */
+ public function testAttributeCompilerAnyOptionalArguments(): void
+ {
+ $this->attributes['optional_attributes'] = ['_any'];
+
+ $payload = [
+ 0 => [
+ 'optional' => 'optional value'
+ ],
+ 1 => [
+ 'optional_two' => 'optional value two'
+ ],
+ ];
+
+ $this->assertEquals(
+ $this->createAttributeCompiler()
+ ->getAttributes($this->template_compiler, $payload),
+ [
+ 'optional' => 'optional value',
+ 'optional_two' => 'optional value two',
+ ]
+ );
+ }
+
+ /**
+ * Test if the attribute compiler tries to throw a too many shorthand attributes error.
+ */
+ public function testAttributeCompilerTooManyShorthands(): void
+ {
+ $payload = [
+ 0 => 'option one',
+ ];
+
+ $this->template_compiler
+ ->expects(self::once())
+ ->method('trigger_template_error')
+ ->with('too many shorthand attributes', null, true);
+
+ $this->createAttributeCompiler()
+ ->getAttributes($this->template_compiler, $payload);
+ }
+
+ /**
+ * Test if the attribute compiler tries to throw a missing required attribute error.
+ */
+ public function testAttributeCompilerWithMissingRequiredAttributes(): void
+ {
+ $this->attributes['required_attributes'] = ['required'];
+
+ $this->template_compiler
+ ->expects(self::once())
+ ->method('trigger_template_error')
+ ->with('missing \'required\' attribute', null, true);
+
+ $this->createAttributeCompiler()
+ ->getAttributes($this->template_compiler, []);
+ }
+
+ /**
+ * Test if the attribute compiler tries to throw a illegal value template error.
+ */
+ public function testAttributeCompilerWithInvalidOptionAttribute(): void
+ {
+ $this->attributes['option_flags'] = ['option'];
+
+ $this->template_compiler
+ ->expects(self::once())
+ ->method('trigger_template_error')
+ ->with('illegal value \'\'foo\'\' for options flag \'option\'', null, true);
+
+ $this->createAttributeCompiler()
+ ->getAttributes($this->template_compiler, [0 => ['option' => 'foo']]);
+ }
+
+ /**
+ * Test if the attribute compiler tries to throw an unexpected attribute error.
+ */
+ public function testAttributeCompilerWithInvalidUnexpectedAttribute(): void
+ {
+ $this->template_compiler
+ ->expects(self::once())
+ ->method('trigger_template_error')
+ ->with('unexpected \'unexpected\' attribute', null, true);
+
+ $this->createAttributeCompiler()
+ ->getAttributes($this->template_compiler, [0 => ['unexpected' => 'bar']]);
+ }
+}
diff --git a/tests/UnitTests/Compile/FunctionCallCompilerTest.php b/tests/UnitTests/Compile/FunctionCallCompilerTest.php
new file mode 100644
index 00000000..2eb0e5a1
--- /dev/null
+++ b/tests/UnitTests/Compile/FunctionCallCompilerTest.php
@@ -0,0 +1,62 @@
+<?php
+
+use Smarty\Compile\FunctionCallCompiler;
+use Smarty\Compiler\Template;
+use Smarty\FunctionHandler\AttributeFunctionHandlerInterface;
+use Smarty\Smarty;
+
+class FunctionCallCompilerTest extends PHPUnit\Framework\TestCase
+{
+ /**
+ * @inheritDoc
+ * Set up attribute compiler class
+ */
+ protected function setUp(): void
+ {
+ $this->smarty = $this->createMock(Smarty::class);
+ $this->template_compiler = $this->createMock(Template::class);
+ $this->template_compiler
+ ->expects(self::once())
+ ->method('getSmarty')
+ ->willReturn($this->smarty);
+ }
+
+ public function testAttributeFunctionHandlerInterface(): void
+ {
+ $attribute_function_handler = $this->createMock(AttributeFunctionHandlerInterface::class);
+
+ $attribute_function_handler
+ ->expects(self::once())
+ ->method('getSupportedAttributes')
+ ->willReturn([
+ 'required_attributes' => ['required'],
+ 'optional_attributes' => ['optional'],
+ 'shorttag_order' => ['short'],
+ 'option_flags' => ['option'],
+ ]);
+
+ $args = [
+ 0 => 'short',
+ 1 => 'option',
+ 2 => [
+ 'optional' => 'optional',
+ ],
+ 3 => [
+ 'required' => 'required',
+ ],
+ ];
+
+ $this->smarty
+ ->expects(self::once())
+ ->method('getFunctionHandler')
+ ->with('method')
+ ->willReturn($attribute_function_handler);
+
+ $function_call_compiler = new FunctionCallCompiler();
+
+ $this->assertEquals(
+ $function_call_compiler->compile($args, $this->template_compiler, [], null, 'method'),
+ '$_smarty_tpl->getSmarty()->getFunctionHandler(\'method\')->handle(array(\'short\'=>short,\'option\'=>1,\'optional\'=>optional,\'required\'=>required), $_smarty_tpl)'
+ );
+ }
+}
diff --git a/tests/UnitTests/TemplateSource/StaticClass/StaticClassAccessTest.php b/tests/UnitTests/TemplateSource/StaticClass/StaticClassAccessTest.php
index 7836172c..b3c231ac 100644
--- a/tests/UnitTests/TemplateSource/StaticClass/StaticClassAccessTest.php
+++ b/tests/UnitTests/TemplateSource/StaticClass/StaticClassAccessTest.php
@@ -64,6 +64,21 @@ class StaticClassAccessTest extends PHPUnit_Smarty
$this->assertEquals('3', $this->smarty->fetch($tpl));
}
+ /**
+ * test static class constant chain
+ */
+ public function testRegisteredBackedEnum()
+ {
+ if (PHP_VERSION_ID < 80100) {
+ $this->markTestSkipped('Enums only available after PHP >= 8.1');
+ return;
+ } else {
+ $this->smarty->registerClass('RegisteredBackedEnum', MyBackedEnum::class);
+ $tpl = $this->smarty->createTemplate('eval:{RegisteredBackedEnum::A->value}');
+ $this->assertEquals('3', $this->smarty->fetch($tpl));
+ }
+ }
+
/**
* test static class method
*/
@@ -134,3 +149,7 @@ class mystaticclass
return $i * $i;
}
}
+
+if (PHP_VERSION_ID >= 80100) {
+ eval('enum MyBackedEnum: int { case A = 3; }');
+} \ No newline at end of file
diff --git a/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/FunctionObjectChainTest.php b/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/FunctionObjectChainTest.php
new file mode 100644
index 00000000..c1e34bdd
--- /dev/null
+++ b/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/FunctionObjectChainTest.php
@@ -0,0 +1,208 @@
+<?php
+/**
+ * Smarty PHPunit tests for object chain functionality after function calls
+ * Tests the new feature: {$x = collect($data)->filter()->values()->toJson()}
+ *
+ * @author Smarty Vibe
+ */
+
+/**
+ * Helper class to simulate a chainable collection object
+ */
+class ChainableCollection
+{
+ private $data;
+
+ public function __construct($data)
+ {
+ $this->data = $data;
+ }
+
+ public function filter()
+ {
+ $this->data = array_filter($this->data);
+ return $this;
+ }
+
+ public function values()
+ {
+ $this->data = array_values($this->data);
+ return $this;
+ }
+
+ public function toJson()
+ {
+ return json_encode($this->data);
+ }
+
+ public function toArray()
+ {
+ return $this->data;
+ }
+
+ public function count()
+ {
+ return count($this->data);
+ }
+}
+
+/**
+ * Modifier plugin that returns a chainable object (simulates collect())
+ */
+function smarty_modifier_collect($data)
+{
+ return new ChainableCollection($data);
+}
+
+/**
+ * Modifier plugin that returns an object with methods
+ */
+function smarty_modifier_create_object($value = null)
+{
+ return new class {
+ public function getName() {
+ return 'TestObject';
+ }
+
+ public function getNext() {
+ return new class {
+ public function getValue() {
+ return 'ChainedValue';
+ }
+ };
+ }
+ };
+}
+
+/**
+ * class for function object chain tests
+ *
+ * @preserveGlobalState disabled
+ *
+ */
+class FunctionObjectChainTest extends PHPUnit_Smarty
+{
+ public function setUp(): void
+ {
+ $this->setUpSmarty(__DIR__);
+
+ // Register modifier plugins that return chainable objects
+ // These are called like functions: {collect($data)}
+ $this->smarty->registerPlugin(\Smarty\Smarty::PLUGIN_MODIFIER, 'collect', 'smarty_modifier_collect');
+ $this->smarty->registerPlugin(\Smarty\Smarty::PLUGIN_MODIFIER, 'create_object', 'smarty_modifier_create_object');
+ }
+
+ public function testInit()
+ {
+ $this->cleanDirs();
+ }
+
+ /**
+ * Test the NEW feature: function call followed by method chain
+ * This is the core test for: {$x = collect($data)->filter()->values()->toJson()}
+ */
+ public function testFunctionCallWithMethodChain()
+ {
+ $data = [1, 2, 0, 3, null, 4, '', 5];
+ $this->smarty->assign('data', $data);
+
+ // Test the new syntax: function()->method()->method()->method()
+ $result = $this->smarty->fetch('string:{collect($data)->filter()->values()->toJson()}');
+ $this->assertEquals('[1,2,3,4,5]', $result);
+ }
+
+ /**
+ * Test function call with method chain assigned to a variable
+ * This tests: {$x = collect($data)->filter()->values()->toJson()}
+ */
+ public function testFunctionCallWithMethodChainAssignment()
+ {
+ $data = ['a', 'b', '', 'c', null, 'd'];
+ $this->smarty->assign('data', $data);
+
+ // Test assignment with chained methods
+ $result = $this->smarty->fetch('string:{$result = collect($data)->filter()->values()->toJson()}{$result}');
+ $this->assertEquals('["a","b","c","d"]', $result);
+ }
+
+ /**
+ * Test function call with single method chain
+ */
+ public function testFunctionCallWithSingleMethod()
+ {
+ $data = [1, 2, 3];
+ $this->smarty->assign('data', $data);
+
+ $result = $this->smarty->fetch('string:{collect($data)->count()}');
+ $this->assertEquals('3', $result);
+ }
+
+ /**
+ * Test function call with nested method chains
+ */
+ public function testFunctionCallWithNestedChain()
+ {
+ $result = $this->smarty->fetch('string:{create_object("")->getNext()->getValue()}');
+ $this->assertEquals('ChainedValue', $result);
+ }
+
+ /**
+ * Test that old syntax still works (two-step process)
+ */
+ public function testOldSyntaxStillWorks()
+ {
+ $data = [1, 2, 0, 3];
+ $this->smarty->assign('data', $data);
+
+ // Old syntax: assign to variable first, then chain
+ $result = $this->smarty->fetch('string:{$x = collect($data)}{$x->filter()->values()->toJson()}');
+ $this->assertEquals('[1,2,3]', $result);
+ }
+
+ /**
+ * Test object chain functionality using template file
+ */
+ public function testFunctionObjectChainFromTemplateFile()
+ {
+ $data = ['foo', '', 'bar', null, 'baz'];
+ $this->smarty->assign('data', $data);
+
+ $result = $this->smarty->fetch('test_function_chain.tpl');
+ // Expected: JSON of filtered array and count
+ $this->assertStringContainsString('["foo","bar","baz"]', $result);
+ $this->assertStringContainsString('3', $result);
+ }
+
+ /**
+ * Test complex chaining with multiple operations
+ * This demonstrates the power of the new feature
+ */
+ public function testComplexChaining()
+ {
+ $data = [1, 2, 0, 3, '', 4, null, 5, false, 6];
+ $this->smarty->assign('data', $data);
+
+ // Complex chain: collect -> filter -> values -> toArray
+ $result = $this->smarty->fetch('string:{$filtered = collect($data)->filter()->values()->toArray()}{$filtered|@json_encode}');
+ $this->assertEquals('[1,2,3,4,5,6]', $result);
+ }
+
+ /**
+ * Test that demonstrates the benefit: one line vs multiple lines
+ */
+ public function testNewSyntaxVsOldSyntax()
+ {
+ $data = [10, 20, 0, 30];
+ $this->smarty->assign('data', $data);
+
+ // NEW syntax (single line)
+ $new = $this->smarty->fetch('string:{collect($data)->filter()->count()}');
+
+ // OLD syntax (multiple steps)
+ $old = $this->smarty->fetch('string:{$temp = collect($data)}{$temp = $temp->filter()}{$temp->count()}');
+
+ // Both should produce the same result
+ $this->assertEquals('3', $new);
+ $this->assertEquals($new, $old);
+ }
+} \ No newline at end of file
diff --git a/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/templates/test_function_chain.tpl b/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/templates/test_function_chain.tpl
new file mode 100644
index 00000000..5d576834
--- /dev/null
+++ b/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/templates/test_function_chain.tpl
@@ -0,0 +1,4 @@
+{* Test template for NEW function object chain feature *}
+{* Test: function()->method()->method()->method() *}
+{collect($data)->filter()->values()->toJson()}
+{collect($data)->filter()->count()} \ No newline at end of file
diff --git a/tests/UnitTests/TemplateSource/ValueTests/Operators/MatchesOperatorTest.php b/tests/UnitTests/TemplateSource/ValueTests/Operators/MatchesOperatorTest.php
new file mode 100644
index 00000000..206b67ce
--- /dev/null
+++ b/tests/UnitTests/TemplateSource/ValueTests/Operators/MatchesOperatorTest.php
@@ -0,0 +1,118 @@
+<?php
+
+require_once __DIR__ . '/../../../../Bootstrap.php';
+
+class MatchesOperatorTest extends PHPUnit_Smarty {
+ public function setUp(): void
+ {
+ $this->setUpSmarty(__DIR__);
+ }
+
+ public function testInit()
+ {
+ $this->cleanDirs();
+ }
+
+ /**
+ * Test basic regex matching functionality
+ */
+ public function testBasicMatches() {
+ // Test string matching pattern
+ $this->assertEquals('Match!', $this->smarty->fetch('string:{if "hello" matches "/^[a-z]+$/"}Match!{else}No match{/if}'));
+
+ // Test no match
+ $this->assertEquals('No match', $this->smarty->fetch('string:{if "123" matches "/^[a-z]+$/"}Match!{else}No match{/if}'));
+
+ // Test with variables
+ $this->smarty->assign('name', 'hello');
+ $this->smarty->assign('pattern', '/^[a-z]+$/');
+ $this->assertEquals('Match!', $this->smarty->fetch('string:{if $name matches $pattern}Match!{else}No match{/if}'));
+
+ // Test no match with variables
+ $this->smarty->assign('number', '123');
+ $this->assertEquals('No match', $this->smarty->fetch('string:{if $number matches $pattern}Match!{else}No match{/if}'));
+ }
+
+ /**
+ * Test different regex patterns
+ */
+ public function testDifferentPatterns() {
+ // Test numeric pattern
+ $this->assertEquals('Match!', $this->smarty->fetch('string:{if "123" matches "/^[0-9]+$/"}Match!{else}No match{/if}'));
+
+ // Test email pattern
+ $this->assertEquals('Match!', $this->smarty->fetch('string:{if "test@example.com" matches "/^[^@]+@[^@]+\.[^@]+$/"}Match!{else}No match{/if}'));
+
+ // Test case insensitive pattern
+ $this->assertEquals('Match!', $this->smarty->fetch('string:{if "Hello" matches "/hello/i"}Match!{else}No match{/if}'));
+
+ // Test pattern with special characters
+ $this->assertEquals('Match!', $this->smarty->fetch('string:{if "hello-world" matches "/^[a-z-]+$/"}Match!{else}No match{/if}'));
+ }
+
+ /**
+ * Test regex patterns with modifiers
+ */
+ public function testPatternModifiers() {
+ // Test case insensitive modifier
+ $this->assertEquals('Match!', $this->smarty->fetch('string:{if "HELLO" matches "/hello/i"}Match!{else}No match{/if}'));
+
+ // Test multiline modifier
+ $this->assertEquals('Match!', $this->smarty->fetch('string:{if "hello\nworld" matches "/world$/m"}Match!{else}No match{/if}'));
+
+ // Test dotall modifier
+ $this->assertEquals('Match!', $this->smarty->fetch('string:{if "hello\nworld" matches "/hello.world/s"}Match!{else}No match{/if}'));
+ }
+
+ /**
+ * Test complex expressions with matches operator
+ */
+ public function testComplexExpressions() {
+ // Test with logical AND
+ $this->smarty->assign('name', 'hello');
+ $this->smarty->assign('pattern', '/^[a-z]+$/');
+ $this->smarty->assign('length', 5);
+ $this->assertEquals('Valid!', $this->smarty->fetch('string:{if $name matches $pattern && $length > 3}Valid!{else}Invalid{/if}'));
+
+ // Test with logical OR
+ $this->assertEquals('Valid!', $this->smarty->fetch('string:{if $name matches $pattern || $length < 3}Valid!{else}Invalid{/if}'));
+
+ // Test in elseif
+ $this->assertEquals('ElseIf!', $this->smarty->fetch('string:{if $name matches "/^[0-9]+$/"}No{elseif $name matches $pattern}ElseIf!{else}Else{/if}'));
+
+ // Test in while loop condition (should work with constant patterns)
+ $result = $this->smarty->fetch('string:{assign var="i" value=0}{while $i < 2 && "test" matches "/test/"}{$i}{assign var="i" value=$i+1}{/while}');
+ $this->assertEquals('01', $result);
+ }
+
+ /**
+ * Test edge cases and error handling
+ */
+ public function testEdgeCases() {
+ // Test with empty string
+ $this->assertEquals('No match', $this->smarty->fetch('string:{if "" matches "/.+/"}Match!{else}No match{/if}'));
+
+ // Test with complex pattern
+ $this->assertEquals('Match!', $this->smarty->fetch('string:{if "abc123" matches "/^[a-z]+[0-9]+$/"}Match!{else}No match{/if}'));
+
+ // Test with single character pattern
+ $this->assertEquals('Match!', $this->smarty->fetch('string:{if "a" matches "/a/"}Match!{else}No match{/if}'));
+ }
+
+ /**
+ * Test that invalid patterns still work (they will cause PHP warnings but not break the template)
+ * Note: This test is commented out because invalid patterns cause PHP warnings that fail the test
+ * In production, invalid patterns would cause warnings but the template would still execute
+ */
+ /*
+ public function testInvalidPatterns() {
+ // This will cause a PHP warning but should not break the template execution
+ $this->smarty->assign('invalid_pattern', 'not-a-valid-pattern');
+ $this->smarty->assign('name', 'hello');
+
+ // The template should execute and reach the else branch due to the invalid pattern
+ $result = $this->smarty->fetch('string:{if $name matches $invalid_pattern}Match!{else}No match{/if}');
+ $this->assertEquals('No match', $result);
+ }
+ */
+} \ No newline at end of file
diff --git a/tests/UnitTests/__shared/cacheresources/cacheresource.apc.php b/tests/UnitTests/__shared/cacheresources/cacheresource.apc.php
deleted file mode 100644
index 3f437888..00000000
--- a/tests/UnitTests/__shared/cacheresources/cacheresource.apc.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-/**
- * APC CacheResource
- * CacheResource Implementation based on the KeyValueStore API to use
- * memcache as the storage resource for Smarty's output caching.
- * *
- *
-
- * @author Uwe Tews
- */
-class Smarty_CacheResource_Apc extends \Smarty\Cacheresource\KeyValueStore
-{
-
- /**
- * Read values for a set of keys from cache
- *
- * @param array $keys list of keys to fetch
- *
- * @return array list of values with the given keys used as indexes
- * @return boolean true on success, false on failure
- */
- protected function read(array $keys)
- {
- $_res = array();
- $res = apc_fetch($keys);
- foreach ($res as $k => $v) {
- $_res[ $k ] = $v;
- }
- return $_res;
- }
-
- /**
- * Save values for a set of keys to cache
- *
- * @param array $keys list of values to save
- * @param int $expire expiration time
- *
- * @return boolean true on success, false on failure
- */
- protected function write(array $keys, $expire = null)
- {
- foreach ($keys as $k => $v) {
- apc_store($k, $v, $expire);
- }
- return true;
- }
-
- /**
- * Remove values from cache
- *
- * @param array $keys list of keys to delete
- *
- * @return boolean true on success, false on failure
- */
- protected function delete(array $keys)
- {
- foreach ($keys as $k) {
- apc_delete($k);
- }
- return true;
- }
-
- /**
- * Remove *all* values from cache
- *
- * @return boolean true on success, false on failure
- */
- protected function purge()
- {
- return apc_clear_cache('user');
- }
-}
diff --git a/utilities/testrunners/php85/Dockerfile b/utilities/testrunners/php85/Dockerfile
new file mode 100644
index 00000000..46bde811
--- /dev/null
+++ b/utilities/testrunners/php85/Dockerfile
@@ -0,0 +1,10 @@
+FROM php:8.5-rc-cli-bullseye
+
+## Basic utilities
+RUN apt-get update -yqq && apt-get install -y curl apt-utils git zip unzip
+
+## Composer
+COPY ./utilities/testrunners/shared/install-composer.sh /root/install-composer.sh
+WORKDIR /root
+RUN sh ./install-composer.sh
+RUN mv ./composer.phar /usr/local/bin/composer