From 637085afcec3db941e2c3764491f86db908e4fd6 Mon Sep 17 00:00:00 2001 From: anperederi Date: Tue, 28 Nov 2023 09:24:00 +0100 Subject: [PATCH 01/48] update app and diagrams --- .../DiagrammeDeClasses/README_accesDonnees.md | 2 +- Sources/composer.json | 6 +- Sources/public/css/styles2.css | 11162 ++++++++++++++++ Sources/public/js/script2.js | 34 + .../src/app/controller/AthleteController.php | 1 + Sources/src/app/controller/AuthController.php | 50 +- Sources/src/app/controller/Controller.php | 93 +- Sources/src/app/controller/UserController.php | 21 +- .../app/views/Templates/authbase.html.twig | 124 +- .../src/app/views/Templates/base.html.twig | 6 +- .../src/app/views/Templates/page/index.html | 293 +- .../app/views/Templates/page/login.html.twig | 6 +- .../views/Templates/page/password.html.twig | 2 +- .../views/Templates/page/register.html.twig | 4 +- .../src/data/core/database/ActiviteEntity.php | 2 +- .../src/data/model/manager/UserManager.php | 1 - 16 files changed, 11677 insertions(+), 130 deletions(-) create mode 100644 Sources/public/css/styles2.css create mode 100644 Sources/public/js/script2.js diff --git a/Documents/Diagramme/DiagrammeDeClasses/README_accesDonnees.md b/Documents/Diagramme/DiagrammeDeClasses/README_accesDonnees.md index 7e2f6e13..c580460f 100644 --- a/Documents/Diagramme/DiagrammeDeClasses/README_accesDonnees.md +++ b/Documents/Diagramme/DiagrammeDeClasses/README_accesDonnees.md @@ -36,7 +36,7 @@ abstract class IGenericRepository { + addItem(item) : void + deleteItem(item) : bool } -abstract class IUserRepository extends IGenericRepository { +interface IUserRepository extends IGenericRepository { } interface INotificationRepository extends IGenericRepository { } diff --git a/Sources/composer.json b/Sources/composer.json index b39f0d97..251c6129 100755 --- a/Sources/composer.json +++ b/Sources/composer.json @@ -24,7 +24,7 @@ "Shared\\Exception\\": "src/shared/exception", "Shared\\Attributes\\": "src/shared/attributes", "App\\Views\\Directives\\" : "src/app/views/directives", - "Data\\Core\\": "src/data/core/" + "Data\\Core\\": "src/data/core/" } }, "require": { @@ -32,7 +32,9 @@ "altorouter/altorouter": "1.1.0", "vlucas/phpdotenv": "^5.5", "psr/container": "^2.0", - "adriangibbons/php-fit-file-analysis": "^3.2.0" + "adriangibbons/php-fit-file-analysis": "^3.2.0", + "ext-couchbase": "*", + "ext-pdo": "*" }, "require-dev": { "phpunit/phpunit": "*" diff --git a/Sources/public/css/styles2.css b/Sources/public/css/styles2.css new file mode 100644 index 00000000..43819597 --- /dev/null +++ b/Sources/public/css/styles2.css @@ -0,0 +1,11162 @@ +@charset "UTF-8"; +/*! +* Start Bootstrap - New Age v6.0.7 (https://startbootstrap.com/theme/new-age) +* Copyright 2013-2023 Start Bootstrap +* Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-new-age/blob/master/LICENSE) +*/ +/*! + * Bootstrap v5.2.3 (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors + * Copyright 2011-2022 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root { + --bs-blue: #2937f0; + --bs-indigo: #6610f2; + --bs-purple: #9f1ae2; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-black: #000; + --bs-white: #fff; + --bs-gray: #6c757d; + --bs-gray-dark: #343a40; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #6c757d; + --bs-gray-700: #495057; + --bs-gray-800: #343a40; + --bs-gray-900: #212529; + --bs-primary: #2937f0; + --bs-secondary: #9f1ae2; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + --bs-light: #f8f9fa; + --bs-dark: #212529; + --bs-primary-rgb: 41, 55, 240; + --bs-secondary-rgb: 159, 26, 226; + --bs-success-rgb: 25, 135, 84; + --bs-info-rgb: 13, 202, 240; + --bs-warning-rgb: 255, 193, 7; + --bs-danger-rgb: 220, 53, 69; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 33, 37, 41; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-body-color-rgb: 33, 37, 41; + --bs-body-bg-rgb: 255, 255, 255; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --bs-body-font-family: Mulish, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; + --bs-body-font-size: 1rem; + --bs-body-font-weight: 500; + --bs-body-line-height: 1.5; + --bs-body-color: #212529; + --bs-body-bg: #fff; + --bs-border-width: 1px; + --bs-border-style: solid; + --bs-border-color: #dee2e6; + --bs-border-color-translucent: rgba(0, 0, 0, 0.175); + --bs-border-radius: 0.375rem; + --bs-border-radius-sm: 0.25rem; + --bs-border-radius-lg: 0.5rem; + --bs-border-radius-xl: 1rem; + --bs-border-radius-2xl: 2rem; + --bs-border-radius-pill: 50rem; + --bs-link-color: #2937f0; + --bs-link-hover-color: #212cc0; + --bs-code-color: #d63384; + --bs-highlight-bg: #fff3cd; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth; + } +} + +body { + margin: 0; + font-family: var(--bs-body-font-family); + font-size: var(--bs-body-font-size); + font-weight: var(--bs-body-font-weight); + line-height: var(--bs-body-line-height); + color: var(--bs-body-color); + text-align: var(--bs-body-text-align); + background-color: var(--bs-body-bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +hr { + margin: 1rem 0; + color: inherit; + border: 0; + border-top: 1px solid; + opacity: 0.25; +} + +h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { + margin-top: 0; + margin-bottom: 0.5rem; + font-family: "Newsreader", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-weight: 600; + line-height: 1.2; +} + +h1, .h1 { + font-size: calc(1.375rem + 1.5vw); +} +@media (min-width: 1200px) { + h1, .h1 { + font-size: 2.5rem; + } +} + +h2, .h2 { + font-size: calc(1.325rem + 0.9vw); +} +@media (min-width: 1200px) { + h2, .h2 { + font-size: 2rem; + } +} + +h3, .h3 { + font-size: calc(1.3rem + 0.6vw); +} +@media (min-width: 1200px) { + h3, .h3 { + font-size: 1.75rem; + } +} + +h4, .h4 { + font-size: calc(1.275rem + 0.3vw); +} +@media (min-width: 1200px) { + h4, .h4 { + font-size: 1.5rem; + } +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul { + padding-left: 2rem; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small, .small { + font-size: 0.875em; +} + +mark, .mark { + padding: 0.1875em; + background-color: var(--bs-highlight-bg); +} + +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +a { + color: var(--bs-link-color); + text-decoration: underline; +} +a:hover { + color: var(--bs-link-hover-color); +} + +a:not([href]):not([class]), a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} + +pre, +code, +kbd, +samp { + font-family: var(--bs-font-monospace); + font-size: 1em; +} + +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +code { + font-size: 0.875em; + color: var(--bs-code-color); + word-wrap: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.1875rem 0.375rem; + font-size: 0.875em; + color: var(--bs-body-bg); + background-color: var(--bs-body-color); + border-radius: 0.25rem; +} +kbd kbd { + padding: 0; + font-size: 1em; +} + +figure { + margin: 0 0 1rem; +} + +img, +svg { + vertical-align: middle; +} + +table { + caption-side: bottom; + border-collapse: collapse; +} + +caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: #6c757d; + text-align: left; +} + +th { + text-align: inherit; + text-align: -webkit-match-parent; +} + +thead, +tbody, +tfoot, +tr, +td, +th { + border-color: inherit; + border-style: solid; + border-width: 0; +} + +label { + display: inline-block; +} + +button { + border-radius: 0; +} + +button:focus:not(:focus-visible) { + outline: 0; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +select { + text-transform: none; +} + +[role=button] { + cursor: pointer; +} + +select { + word-wrap: normal; +} +select:disabled { + opacity: 1; +} + +[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator { + display: none !important; +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} +button:not(:disabled), +[type=button]:not(:disabled), +[type=reset]:not(:disabled), +[type=submit]:not(:disabled) { + cursor: pointer; +} + +::-moz-focus-inner { + padding: 0; + border-style: none; +} + +textarea { + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + float: left; + width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: calc(1.275rem + 0.3vw); + line-height: inherit; +} +@media (min-width: 1200px) { + legend { + font-size: 1.5rem; + } +} +legend + * { + clear: left; +} + +::-webkit-datetime-edit-fields-wrapper, +::-webkit-datetime-edit-text, +::-webkit-datetime-edit-minute, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-year-field { + padding: 0; +} + +::-webkit-inner-spin-button { + height: auto; +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: textfield; +} + +/* rtl:raw: +[type="tel"], +[type="url"], +[type="email"], +[type="number"] { + direction: ltr; +} +*/ +::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-color-swatch-wrapper { + padding: 0; +} + +::file-selector-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +iframe { + border: 0; +} + +summary { + display: list-item; + cursor: pointer; +} + +progress { + vertical-align: baseline; +} + +[hidden] { + display: none !important; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: calc(1.625rem + 4.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-1 { + font-size: 5rem; + } +} + +.display-2 { + font-size: calc(1.575rem + 3.9vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-2 { + font-size: 4.5rem; + } +} + +.display-3 { + font-size: calc(1.525rem + 3.3vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-3 { + font-size: 4rem; + } +} + +.display-4 { + font-size: calc(1.475rem + 2.7vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-4 { + font-size: 3.5rem; + } +} + +.display-5 { + font-size: calc(1.425rem + 2.1vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-5 { + font-size: 3rem; + } +} + +.display-6 { + font-size: calc(1.375rem + 1.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-6 { + font-size: 2.5rem; + } +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 0.875em; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} +.blockquote > :last-child { + margin-bottom: 0; +} + +.blockquote-footer { + margin-top: -1rem; + margin-bottom: 1rem; + font-size: 0.875em; + color: #6c757d; +} +.blockquote-footer::before { + content: "— "; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid var(--bs-border-color); + border-radius: 0.375rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 0.875em; + color: #6c757d; +} + +.container, +.container-fluid, +.container-xxl, +.container-xl, +.container-lg, +.container-md, +.container-sm { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container-sm, .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container-md, .container-sm, .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container-lg, .container-md, .container-sm, .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1140px; + } +} +@media (min-width: 1400px) { + .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1320px; + } +} +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(-1 * var(--bs-gutter-y)); + margin-right: calc(-0.5 * var(--bs-gutter-x)); + margin-left: calc(-0.5 * var(--bs-gutter-x)); +} +.row > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-top: var(--bs-gutter-y); +} + +.col { + flex: 1 0 0%; +} + +.row-cols-auto > * { + flex: 0 0 auto; + width: auto; +} + +.row-cols-1 > * { + flex: 0 0 auto; + width: 100%; +} + +.row-cols-2 > * { + flex: 0 0 auto; + width: 50%; +} + +.row-cols-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; +} + +.row-cols-4 > * { + flex: 0 0 auto; + width: 25%; +} + +.row-cols-5 > * { + flex: 0 0 auto; + width: 20%; +} + +.row-cols-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; +} + +.col-1 { + flex: 0 0 auto; + width: 8.33333333%; +} + +.col-2 { + flex: 0 0 auto; + width: 16.66666667%; +} + +.col-3 { + flex: 0 0 auto; + width: 25%; +} + +.col-4 { + flex: 0 0 auto; + width: 33.33333333%; +} + +.col-5 { + flex: 0 0 auto; + width: 41.66666667%; +} + +.col-6 { + flex: 0 0 auto; + width: 50%; +} + +.col-7 { + flex: 0 0 auto; + width: 58.33333333%; +} + +.col-8 { + flex: 0 0 auto; + width: 66.66666667%; +} + +.col-9 { + flex: 0 0 auto; + width: 75%; +} + +.col-10 { + flex: 0 0 auto; + width: 83.33333333%; +} + +.col-11 { + flex: 0 0 auto; + width: 91.66666667%; +} + +.col-12 { + flex: 0 0 auto; + width: 100%; +} + +.offset-1 { + margin-left: 8.33333333%; +} + +.offset-2 { + margin-left: 16.66666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.33333333%; +} + +.offset-5 { + margin-left: 41.66666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.33333333%; +} + +.offset-8 { + margin-left: 66.66666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.33333333%; +} + +.offset-11 { + margin-left: 91.66666667%; +} + +.g-0, +.gx-0 { + --bs-gutter-x: 0; +} + +.g-0, +.gy-0 { + --bs-gutter-y: 0; +} + +.g-1, +.gx-1 { + --bs-gutter-x: 0.25rem; +} + +.g-1, +.gy-1 { + --bs-gutter-y: 0.25rem; +} + +.g-2, +.gx-2 { + --bs-gutter-x: 0.5rem; +} + +.g-2, +.gy-2 { + --bs-gutter-y: 0.5rem; +} + +.g-3, +.gx-3 { + --bs-gutter-x: 1rem; +} + +.g-3, +.gy-3 { + --bs-gutter-y: 1rem; +} + +.g-4, +.gx-4 { + --bs-gutter-x: 1.5rem; +} + +.g-4, +.gy-4 { + --bs-gutter-y: 1.5rem; +} + +.g-5, +.gx-5 { + --bs-gutter-x: 3rem; +} + +.g-5, +.gy-5 { + --bs-gutter-y: 3rem; +} + +@media (min-width: 576px) { + .col-sm { + flex: 1 0 0%; + } + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-sm-auto { + flex: 0 0 auto; + width: auto; + } + .col-sm-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-sm-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-sm-3 { + flex: 0 0 auto; + width: 25%; + } + .col-sm-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-sm-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-sm-6 { + flex: 0 0 auto; + width: 50%; + } + .col-sm-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-sm-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-sm-9 { + flex: 0 0 auto; + width: 75%; + } + .col-sm-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-sm-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-sm-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.33333333%; + } + .offset-sm-2 { + margin-left: 16.66666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.33333333%; + } + .offset-sm-5 { + margin-left: 41.66666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.33333333%; + } + .offset-sm-8 { + margin-left: 66.66666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.33333333%; + } + .offset-sm-11 { + margin-left: 91.66666667%; + } + .g-sm-0, + .gx-sm-0 { + --bs-gutter-x: 0; + } + .g-sm-0, + .gy-sm-0 { + --bs-gutter-y: 0; + } + .g-sm-1, + .gx-sm-1 { + --bs-gutter-x: 0.25rem; + } + .g-sm-1, + .gy-sm-1 { + --bs-gutter-y: 0.25rem; + } + .g-sm-2, + .gx-sm-2 { + --bs-gutter-x: 0.5rem; + } + .g-sm-2, + .gy-sm-2 { + --bs-gutter-y: 0.5rem; + } + .g-sm-3, + .gx-sm-3 { + --bs-gutter-x: 1rem; + } + .g-sm-3, + .gy-sm-3 { + --bs-gutter-y: 1rem; + } + .g-sm-4, + .gx-sm-4 { + --bs-gutter-x: 1.5rem; + } + .g-sm-4, + .gy-sm-4 { + --bs-gutter-y: 1.5rem; + } + .g-sm-5, + .gx-sm-5 { + --bs-gutter-x: 3rem; + } + .g-sm-5, + .gy-sm-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 768px) { + .col-md { + flex: 1 0 0%; + } + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-md-auto { + flex: 0 0 auto; + width: auto; + } + .col-md-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-md-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-md-3 { + flex: 0 0 auto; + width: 25%; + } + .col-md-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-md-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-md-6 { + flex: 0 0 auto; + width: 50%; + } + .col-md-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-md-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-md-9 { + flex: 0 0 auto; + width: 75%; + } + .col-md-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-md-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-md-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.33333333%; + } + .offset-md-2 { + margin-left: 16.66666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.33333333%; + } + .offset-md-5 { + margin-left: 41.66666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.33333333%; + } + .offset-md-8 { + margin-left: 66.66666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.33333333%; + } + .offset-md-11 { + margin-left: 91.66666667%; + } + .g-md-0, + .gx-md-0 { + --bs-gutter-x: 0; + } + .g-md-0, + .gy-md-0 { + --bs-gutter-y: 0; + } + .g-md-1, + .gx-md-1 { + --bs-gutter-x: 0.25rem; + } + .g-md-1, + .gy-md-1 { + --bs-gutter-y: 0.25rem; + } + .g-md-2, + .gx-md-2 { + --bs-gutter-x: 0.5rem; + } + .g-md-2, + .gy-md-2 { + --bs-gutter-y: 0.5rem; + } + .g-md-3, + .gx-md-3 { + --bs-gutter-x: 1rem; + } + .g-md-3, + .gy-md-3 { + --bs-gutter-y: 1rem; + } + .g-md-4, + .gx-md-4 { + --bs-gutter-x: 1.5rem; + } + .g-md-4, + .gy-md-4 { + --bs-gutter-y: 1.5rem; + } + .g-md-5, + .gx-md-5 { + --bs-gutter-x: 3rem; + } + .g-md-5, + .gy-md-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 992px) { + .col-lg { + flex: 1 0 0%; + } + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-lg-auto { + flex: 0 0 auto; + width: auto; + } + .col-lg-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-lg-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-lg-3 { + flex: 0 0 auto; + width: 25%; + } + .col-lg-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-lg-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-lg-6 { + flex: 0 0 auto; + width: 50%; + } + .col-lg-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-lg-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-lg-9 { + flex: 0 0 auto; + width: 75%; + } + .col-lg-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-lg-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-lg-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.33333333%; + } + .offset-lg-2 { + margin-left: 16.66666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.33333333%; + } + .offset-lg-5 { + margin-left: 41.66666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.33333333%; + } + .offset-lg-8 { + margin-left: 66.66666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.33333333%; + } + .offset-lg-11 { + margin-left: 91.66666667%; + } + .g-lg-0, + .gx-lg-0 { + --bs-gutter-x: 0; + } + .g-lg-0, + .gy-lg-0 { + --bs-gutter-y: 0; + } + .g-lg-1, + .gx-lg-1 { + --bs-gutter-x: 0.25rem; + } + .g-lg-1, + .gy-lg-1 { + --bs-gutter-y: 0.25rem; + } + .g-lg-2, + .gx-lg-2 { + --bs-gutter-x: 0.5rem; + } + .g-lg-2, + .gy-lg-2 { + --bs-gutter-y: 0.5rem; + } + .g-lg-3, + .gx-lg-3 { + --bs-gutter-x: 1rem; + } + .g-lg-3, + .gy-lg-3 { + --bs-gutter-y: 1rem; + } + .g-lg-4, + .gx-lg-4 { + --bs-gutter-x: 1.5rem; + } + .g-lg-4, + .gy-lg-4 { + --bs-gutter-y: 1.5rem; + } + .g-lg-5, + .gx-lg-5 { + --bs-gutter-x: 3rem; + } + .g-lg-5, + .gy-lg-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1200px) { + .col-xl { + flex: 1 0 0%; + } + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-xl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.33333333%; + } + .offset-xl-2 { + margin-left: 16.66666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.33333333%; + } + .offset-xl-5 { + margin-left: 41.66666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.33333333%; + } + .offset-xl-8 { + margin-left: 66.66666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.33333333%; + } + .offset-xl-11 { + margin-left: 91.66666667%; + } + .g-xl-0, + .gx-xl-0 { + --bs-gutter-x: 0; + } + .g-xl-0, + .gy-xl-0 { + --bs-gutter-y: 0; + } + .g-xl-1, + .gx-xl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xl-1, + .gy-xl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xl-2, + .gx-xl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xl-2, + .gy-xl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xl-3, + .gx-xl-3 { + --bs-gutter-x: 1rem; + } + .g-xl-3, + .gy-xl-3 { + --bs-gutter-y: 1rem; + } + .g-xl-4, + .gx-xl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xl-4, + .gy-xl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xl-5, + .gx-xl-5 { + --bs-gutter-x: 3rem; + } + .g-xl-5, + .gy-xl-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1400px) { + .col-xxl { + flex: 1 0 0%; + } + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xxl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xxl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xxl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xxl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xxl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xxl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xxl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xxl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xxl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xxl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xxl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xxl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xxl-0 { + margin-left: 0; + } + .offset-xxl-1 { + margin-left: 8.33333333%; + } + .offset-xxl-2 { + margin-left: 16.66666667%; + } + .offset-xxl-3 { + margin-left: 25%; + } + .offset-xxl-4 { + margin-left: 33.33333333%; + } + .offset-xxl-5 { + margin-left: 41.66666667%; + } + .offset-xxl-6 { + margin-left: 50%; + } + .offset-xxl-7 { + margin-left: 58.33333333%; + } + .offset-xxl-8 { + margin-left: 66.66666667%; + } + .offset-xxl-9 { + margin-left: 75%; + } + .offset-xxl-10 { + margin-left: 83.33333333%; + } + .offset-xxl-11 { + margin-left: 91.66666667%; + } + .g-xxl-0, + .gx-xxl-0 { + --bs-gutter-x: 0; + } + .g-xxl-0, + .gy-xxl-0 { + --bs-gutter-y: 0; + } + .g-xxl-1, + .gx-xxl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xxl-1, + .gy-xxl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xxl-2, + .gx-xxl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xxl-2, + .gy-xxl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xxl-3, + .gx-xxl-3 { + --bs-gutter-x: 1rem; + } + .g-xxl-3, + .gy-xxl-3 { + --bs-gutter-y: 1rem; + } + .g-xxl-4, + .gx-xxl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xxl-4, + .gy-xxl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xxl-5, + .gx-xxl-5 { + --bs-gutter-x: 3rem; + } + .g-xxl-5, + .gy-xxl-5 { + --bs-gutter-y: 3rem; + } +} +.table { + --bs-table-color: var(--bs-body-color); + --bs-table-bg: transparent; + --bs-table-border-color: var(--bs-border-color); + --bs-table-accent-bg: transparent; + --bs-table-striped-color: var(--bs-body-color); + --bs-table-striped-bg: rgba(0, 0, 0, 0.05); + --bs-table-active-color: var(--bs-body-color); + --bs-table-active-bg: rgba(0, 0, 0, 0.1); + --bs-table-hover-color: var(--bs-body-color); + --bs-table-hover-bg: rgba(0, 0, 0, 0.075); + width: 100%; + margin-bottom: 1rem; + color: var(--bs-table-color); + vertical-align: top; + border-color: var(--bs-table-border-color); +} +.table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + background-color: var(--bs-table-bg); + border-bottom-width: 1px; + box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); +} +.table > tbody { + vertical-align: inherit; +} +.table > thead { + vertical-align: bottom; +} + +.table-group-divider { + border-top: 2px solid currentcolor; +} + +.caption-top { + caption-side: top; +} + +.table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; +} + +.table-bordered > :not(caption) > * { + border-width: 1px 0; +} +.table-bordered > :not(caption) > * > * { + border-width: 0 1px; +} + +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0; +} +.table-borderless > :not(:first-child) { + border-top-width: 0; +} + +.table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color); +} + +.table-striped-columns > :not(caption) > tr > :nth-child(even) { + --bs-table-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color); +} + +.table-active { + --bs-table-accent-bg: var(--bs-table-active-bg); + color: var(--bs-table-active-color); +} + +.table-hover > tbody > tr:hover > * { + --bs-table-accent-bg: var(--bs-table-hover-bg); + color: var(--bs-table-hover-color); +} + +.table-primary { + --bs-table-color: #000; + --bs-table-bg: #d4d7fc; + --bs-table-border-color: #bfc2e3; + --bs-table-striped-bg: #c9ccef; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bfc2e3; + --bs-table-active-color: #000; + --bs-table-hover-bg: #c4c7e9; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-secondary { + --bs-table-color: #000; + --bs-table-bg: #ecd1f9; + --bs-table-border-color: #d4bce0; + --bs-table-striped-bg: #e0c7ed; + --bs-table-striped-color: #000; + --bs-table-active-bg: #d4bce0; + --bs-table-active-color: #000; + --bs-table-hover-bg: #dac1e6; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-success { + --bs-table-color: #000; + --bs-table-bg: #d1e7dd; + --bs-table-border-color: #bcd0c7; + --bs-table-striped-bg: #c7dbd2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bcd0c7; + --bs-table-active-color: #000; + --bs-table-hover-bg: #c1d6cc; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-info { + --bs-table-color: #000; + --bs-table-bg: #cff4fc; + --bs-table-border-color: #badce3; + --bs-table-striped-bg: #c5e8ef; + --bs-table-striped-color: #000; + --bs-table-active-bg: #badce3; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfe2e9; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-warning { + --bs-table-color: #000; + --bs-table-bg: #fff3cd; + --bs-table-border-color: #e6dbb9; + --bs-table-striped-bg: #f2e7c3; + --bs-table-striped-color: #000; + --bs-table-active-bg: #e6dbb9; + --bs-table-active-color: #000; + --bs-table-hover-bg: #ece1be; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-danger { + --bs-table-color: #000; + --bs-table-bg: #f8d7da; + --bs-table-border-color: #dfc2c4; + --bs-table-striped-bg: #eccccf; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfc2c4; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5c7ca; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-light { + --bs-table-color: #000; + --bs-table-bg: #f8f9fa; + --bs-table-border-color: #dfe0e1; + --bs-table-striped-bg: #ecedee; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfe0e1; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5e6e7; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-dark { + --bs-table-color: #fff; + --bs-table-bg: #212529; + --bs-table-border-color: #373b3e; + --bs-table-striped-bg: #2c3034; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #373b3e; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #323539; + --bs-table-hover-color: #fff; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-responsive { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1399.98px) { + .table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +.form-label { + margin-bottom: 0.5rem; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; +} + +.form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: #6c757d; +} + +.form-control { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 500; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 0.375rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control[type=file] { + overflow: hidden; +} +.form-control[type=file]:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control:focus { + color: #212529; + background-color: #fff; + border-color: #949bf8; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(41, 55, 240, 0.25); +} +.form-control::-webkit-date-and-time-value { + height: 1.5em; +} +.form-control::-moz-placeholder { + color: #6c757d; + opacity: 1; +} +.form-control::placeholder { + color: #6c757d; + opacity: 1; +} +.form-control:disabled { + background-color: #e9ecef; + opacity: 1; +} +.form-control::file-selector-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::file-selector-button { + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: #dde0e3; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} +.form-control-plaintext:focus { + outline: 0; +} +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.25rem; +} +.form-control-sm::file-selector-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} + +.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.5rem; +} +.form-control-lg::file-selector-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} + +textarea.form-control { + min-height: calc(1.5em + 0.75rem + 2px); +} +textarea.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); +} +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); +} + +.form-control-color { + width: 3rem; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + border: 0 !important; + border-radius: 0.375rem; +} +.form-control-color::-webkit-color-swatch { + border-radius: 0.375rem; +} +.form-control-color.form-control-sm { + height: calc(1.5em + 0.5rem + 2px); +} +.form-control-color.form-control-lg { + height: calc(1.5em + 1rem + 2px); +} + +.form-select { + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + -moz-padding-start: calc(0.75rem - 3px); + font-size: 1rem; + font-weight: 500; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: 1px solid #ced4da; + border-radius: 0.375rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-select { + transition: none; + } +} +.form-select:focus { + border-color: #949bf8; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(41, 55, 240, 0.25); +} +.form-select[multiple], .form-select[size]:not([size="1"]) { + padding-right: 0.75rem; + background-image: none; +} +.form-select:disabled { + background-color: #e9ecef; +} +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #212529; +} + +.form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; + border-radius: 0.25rem; +} + +.form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; + border-radius: 0.5rem; +} + +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} + +.form-check-reverse { + padding-right: 1.5em; + padding-left: 0; + text-align: right; +} +.form-check-reverse .form-check-input { + float: right; + margin-right: -1.5em; + margin-left: 0; +} + +.form-check-input { + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + background-color: #fff; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: 1px solid rgba(0, 0, 0, 0.25); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; +} +.form-check-input[type=checkbox] { + border-radius: 0.25em; +} +.form-check-input[type=radio] { + border-radius: 50%; +} +.form-check-input:active { + filter: brightness(90%); +} +.form-check-input:focus { + border-color: #949bf8; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(41, 55, 240, 0.25); +} +.form-check-input:checked { + background-color: #2937f0; + border-color: #2937f0; +} +.form-check-input:checked[type=checkbox] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type=radio] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-input[type=checkbox]:indeterminate { + background-color: #2937f0; + border-color: #2937f0; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} +.form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: 0.5; +} +.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { + cursor: default; + opacity: 0.5; +} + +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + width: 2em; + margin-left: -2.5em; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + background-position: left center; + border-radius: 2em; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none; + } +} +.form-switch .form-check-input:focus { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23949bf8'/%3e%3c/svg%3e"); +} +.form-switch .form-check-input:checked { + background-position: right center; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-switch.form-check-reverse { + padding-right: 2.5em; + padding-left: 0; +} +.form-switch.form-check-reverse .form-check-input { + margin-right: -2.5em; + margin-left: 0; +} + +.form-check-inline { + display: inline-block; + margin-right: 1rem; +} + +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.btn-check[disabled] + .btn, .btn-check:disabled + .btn { + pointer-events: none; + filter: none; + opacity: 0.65; +} + +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.form-range:focus { + outline: 0; +} +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(41, 55, 240, 0.25); +} +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(41, 55, 240, 0.25); +} +.form-range::-moz-focus-outer { + border: 0; +} +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #2937f0; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none; + } +} +.form-range::-webkit-slider-thumb:active { + background-color: #bfc3fb; +} +.form-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #2937f0; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none; + } +} +.form-range::-moz-range-thumb:active { + background-color: #bfc3fb; +} +.form-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range:disabled { + pointer-events: none; +} +.form-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; +} +.form-range:disabled::-moz-range-thumb { + background-color: #adb5bd; +} + +.form-floating { + position: relative; +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext, +.form-floating > .form-select { + height: calc(3.5rem + 2px); + line-height: 1.25; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + padding: 1rem 0.75rem; + overflow: hidden; + text-align: start; + text-overflow: ellipsis; + white-space: nowrap; + pointer-events: none; + border: 1px solid transparent; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none; + } +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext { + padding: 1rem 0.75rem; +} +.form-floating > .form-control::-moz-placeholder, .form-floating > .form-control-plaintext::-moz-placeholder { + color: transparent; +} +.form-floating > .form-control::placeholder, +.form-floating > .form-control-plaintext::placeholder { + color: transparent; +} +.form-floating > .form-control:not(:-moz-placeholder-shown), .form-floating > .form-control-plaintext:not(:-moz-placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown), +.form-floating > .form-control-plaintext:focus, +.form-floating > .form-control-plaintext:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:-webkit-autofill, +.form-floating > .form-control-plaintext:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-control-plaintext ~ label, +.form-floating > .form-select ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:-webkit-autofill ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control-plaintext ~ label { + border-width: 1px 0; +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-select, +.input-group > .form-floating { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, +.input-group > .form-select:focus, +.input-group > .form-floating:focus-within { + z-index: 5; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 5; +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 500; + line-height: 1.5; + color: #212529; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 0.375rem; +} + +.input-group-lg > .form-control, +.input-group-lg > .form-select, +.input-group-lg > .input-group-text, +.input-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.5rem; +} + +.input-group-sm > .form-control, +.input-group-sm > .form-select, +.input-group-sm > .input-group-text, +.input-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.25rem; +} + +.input-group-lg > .form-select, +.input-group-sm > .form-select { + padding-right: 3rem; +} + +.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3), +.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, +.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), +.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4), +.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control, +.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { + margin-left: -1px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .form-floating:not(:first-child) > .form-control, +.input-group > .form-floating:not(:first-child) > .form-select { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #198754; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(25, 135, 84, 0.9); + border-radius: 0.375rem; +} + +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #198754; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #198754; + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:valid, .form-select.is-valid { + border-color: #198754; +} +.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:valid:focus, .form-select.is-valid:focus { + border-color: #198754; + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} + +.was-validated .form-control-color:valid, .form-control-color.is-valid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} + +.was-validated .form-check-input:valid, .form-check-input.is-valid { + border-color: #198754; +} +.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { + background-color: #198754; +} +.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #198754; +} + +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid, +.was-validated .input-group > .form-select:not(:focus):valid, +.input-group > .form-select:not(:focus).is-valid, +.was-validated .input-group > .form-floating:not(:focus-within):valid, +.input-group > .form-floating:not(:focus-within).is-valid { + z-index: 3; +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #dc3545; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(220, 53, 69, 0.9); + border-radius: 0.375rem; +} + +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:invalid, .form-select.is-invalid { + border-color: #dc3545; +} +.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} + +.was-validated .form-control-color:invalid, .form-control-color.is-invalid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} + +.was-validated .form-check-input:invalid, .form-check-input.is-invalid { + border-color: #dc3545; +} +.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { + background-color: #dc3545; +} +.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} + +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid, +.was-validated .input-group > .form-select:not(:focus):invalid, +.input-group > .form-select:not(:focus).is-invalid, +.was-validated .input-group > .form-floating:not(:focus-within):invalid, +.input-group > .form-floating:not(:focus-within).is-invalid { + z-index: 4; +} + +.btn { + --bs-btn-padding-x: 0.75rem; + --bs-btn-padding-y: 0.375rem; + --bs-btn-font-family: ; + --bs-btn-font-size: 1rem; + --bs-btn-font-weight: 500; + --bs-btn-line-height: 1.5; + --bs-btn-color: #212529; + --bs-btn-bg: transparent; + --bs-btn-border-width: 1px; + --bs-btn-border-color: transparent; + --bs-btn-border-radius: 0.375rem; + --bs-btn-hover-border-color: transparent; + --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + --bs-btn-disabled-opacity: 0.65; + --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5); + display: inline-block; + padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); + font-family: var(--bs-btn-font-family); + font-size: var(--bs-btn-font-size); + font-weight: var(--bs-btn-font-weight); + line-height: var(--bs-btn-line-height); + color: var(--bs-btn-color); + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); + border-radius: var(--bs-btn-border-radius); + background-color: var(--bs-btn-bg); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); +} +.btn-check + .btn:hover { + color: var(--bs-btn-color); + background-color: var(--bs-btn-bg); + border-color: var(--bs-btn-border-color); +} +.btn:focus-visible { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:focus-visible + .btn { + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show { + color: var(--bs-btn-active-color); + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color); +} +.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible { + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn:disabled, .btn.disabled, fieldset:disabled .btn { + color: var(--bs-btn-disabled-color); + pointer-events: none; + background-color: var(--bs-btn-disabled-bg); + border-color: var(--bs-btn-disabled-border-color); + opacity: var(--bs-btn-disabled-opacity); +} + +.btn-primary { + --bs-btn-color: #fff; + --bs-btn-bg: #2937f0; + --bs-btn-border-color: #2937f0; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #232fcc; + --bs-btn-hover-border-color: #212cc0; + --bs-btn-focus-shadow-rgb: 73, 85, 242; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #212cc0; + --bs-btn-active-border-color: #1f29b4; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #2937f0; + --bs-btn-disabled-border-color: #2937f0; +} + +.btn-secondary { + --bs-btn-color: #fff; + --bs-btn-bg: #9f1ae2; + --bs-btn-border-color: #9f1ae2; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #8716c0; + --bs-btn-hover-border-color: #7f15b5; + --bs-btn-focus-shadow-rgb: 173, 60, 230; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #7f15b5; + --bs-btn-active-border-color: #7714aa; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #9f1ae2; + --bs-btn-disabled-border-color: #9f1ae2; +} + +.btn-success { + --bs-btn-color: #fff; + --bs-btn-bg: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #157347; + --bs-btn-hover-border-color: #146c43; + --bs-btn-focus-shadow-rgb: 60, 153, 110; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #146c43; + --bs-btn-active-border-color: #13653f; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #198754; + --bs-btn-disabled-border-color: #198754; +} + +.btn-info { + --bs-btn-color: #000; + --bs-btn-bg: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #31d2f2; + --bs-btn-hover-border-color: #25cff2; + --bs-btn-focus-shadow-rgb: 11, 172, 204; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #3dd5f3; + --bs-btn-active-border-color: #25cff2; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #0dcaf0; + --bs-btn-disabled-border-color: #0dcaf0; +} + +.btn-warning { + --bs-btn-color: #000; + --bs-btn-bg: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffca2c; + --bs-btn-hover-border-color: #ffc720; + --bs-btn-focus-shadow-rgb: 217, 164, 6; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffcd39; + --bs-btn-active-border-color: #ffc720; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #ffc107; + --bs-btn-disabled-border-color: #ffc107; +} + +.btn-danger { + --bs-btn-color: #fff; + --bs-btn-bg: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #bb2d3b; + --bs-btn-hover-border-color: #b02a37; + --bs-btn-focus-shadow-rgb: 225, 83, 97; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #b02a37; + --bs-btn-active-border-color: #a52834; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #dc3545; + --bs-btn-disabled-border-color: #dc3545; +} + +.btn-light { + --bs-btn-color: #000; + --bs-btn-bg: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #d3d4d5; + --bs-btn-hover-border-color: #c6c7c8; + --bs-btn-focus-shadow-rgb: 211, 212, 213; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #c6c7c8; + --bs-btn-active-border-color: #babbbc; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #f8f9fa; + --bs-btn-disabled-border-color: #f8f9fa; +} + +.btn-dark { + --bs-btn-color: #fff; + --bs-btn-bg: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #424649; + --bs-btn-hover-border-color: #373b3e; + --bs-btn-focus-shadow-rgb: 66, 70, 73; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #4d5154; + --bs-btn-active-border-color: #373b3e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #212529; + --bs-btn-disabled-border-color: #212529; +} + +.btn-outline-primary { + --bs-btn-color: #2937f0; + --bs-btn-border-color: #2937f0; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #2937f0; + --bs-btn-hover-border-color: #2937f0; + --bs-btn-focus-shadow-rgb: 41, 55, 240; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #2937f0; + --bs-btn-active-border-color: #2937f0; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #2937f0; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #2937f0; + --bs-gradient: none; +} + +.btn-outline-secondary { + --bs-btn-color: #9f1ae2; + --bs-btn-border-color: #9f1ae2; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #9f1ae2; + --bs-btn-hover-border-color: #9f1ae2; + --bs-btn-focus-shadow-rgb: 159, 26, 226; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #9f1ae2; + --bs-btn-active-border-color: #9f1ae2; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #9f1ae2; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #9f1ae2; + --bs-gradient: none; +} + +.btn-outline-success { + --bs-btn-color: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #198754; + --bs-btn-hover-border-color: #198754; + --bs-btn-focus-shadow-rgb: 25, 135, 84; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #198754; + --bs-btn-active-border-color: #198754; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #198754; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #198754; + --bs-gradient: none; +} + +.btn-outline-info { + --bs-btn-color: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #0dcaf0; + --bs-btn-hover-border-color: #0dcaf0; + --bs-btn-focus-shadow-rgb: 13, 202, 240; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #0dcaf0; + --bs-btn-active-border-color: #0dcaf0; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0dcaf0; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0dcaf0; + --bs-gradient: none; +} + +.btn-outline-warning { + --bs-btn-color: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffc107; + --bs-btn-hover-border-color: #ffc107; + --bs-btn-focus-shadow-rgb: 255, 193, 7; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffc107; + --bs-btn-active-border-color: #ffc107; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #ffc107; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #ffc107; + --bs-gradient: none; +} + +.btn-outline-danger { + --bs-btn-color: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #dc3545; + --bs-btn-hover-border-color: #dc3545; + --bs-btn-focus-shadow-rgb: 220, 53, 69; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #dc3545; + --bs-btn-active-border-color: #dc3545; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #dc3545; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #dc3545; + --bs-gradient: none; +} + +.btn-outline-light { + --bs-btn-color: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #f8f9fa; + --bs-btn-hover-border-color: #f8f9fa; + --bs-btn-focus-shadow-rgb: 248, 249, 250; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #f8f9fa; + --bs-btn-active-border-color: #f8f9fa; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #f8f9fa; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #f8f9fa; + --bs-gradient: none; +} + +.btn-outline-dark { + --bs-btn-color: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #212529; + --bs-btn-hover-border-color: #212529; + --bs-btn-focus-shadow-rgb: 33, 37, 41; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #212529; + --bs-btn-active-border-color: #212529; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #212529; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #212529; + --bs-gradient: none; +} + +.btn-link { + --bs-btn-font-weight: 500; + --bs-btn-color: var(--bs-link-color); + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-hover-color: var(--bs-link-hover-color); + --bs-btn-hover-border-color: transparent; + --bs-btn-active-color: var(--bs-link-hover-color); + --bs-btn-active-border-color: transparent; + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-border-color: transparent; + --bs-btn-box-shadow: none; + --bs-btn-focus-shadow-rgb: 73, 85, 242; + text-decoration: underline; +} +.btn-link:focus-visible { + color: var(--bs-btn-color); +} +.btn-link:hover { + color: var(--bs-btn-hover-color); +} + +.btn-lg, .btn-group-lg > .btn { + --bs-btn-padding-y: 0.5rem; + --bs-btn-padding-x: 1rem; + --bs-btn-font-size: 1.25rem; + --bs-btn-border-radius: 0.5rem; +} + +.btn-sm, .btn-group-sm > .btn { + --bs-btn-padding-y: 0.25rem; + --bs-btn-padding-x: 0.5rem; + --bs-btn-font-size: 0.875rem; + --bs-btn-border-radius: 0.25rem; +} + +.fade { + transition: opacity 0.15s linear; +} +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} +.collapsing.collapse-horizontal { + width: 0; + height: auto; + transition: width 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + transition: none; + } +} + +.dropup, +.dropend, +.dropdown, +.dropstart, +.dropup-center, +.dropdown-center { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + --bs-dropdown-zindex: 1000; + --bs-dropdown-min-width: 10rem; + --bs-dropdown-padding-x: 0; + --bs-dropdown-padding-y: 0.5rem; + --bs-dropdown-spacer: 0.125rem; + --bs-dropdown-font-size: 1rem; + --bs-dropdown-color: #212529; + --bs-dropdown-bg: #fff; + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-border-radius: 0.375rem; + --bs-dropdown-border-width: 1px; + --bs-dropdown-inner-border-radius: calc(0.375rem - 1px); + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-divider-margin-y: 0.5rem; + --bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-dropdown-link-color: #212529; + --bs-dropdown-link-hover-color: #1e2125; + --bs-dropdown-link-hover-bg: #e9ecef; + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #2937f0; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-item-padding-x: 1rem; + --bs-dropdown-item-padding-y: 0.25rem; + --bs-dropdown-header-color: #6c757d; + --bs-dropdown-header-padding-x: 1rem; + --bs-dropdown-header-padding-y: 0.5rem; + position: absolute; + z-index: var(--bs-dropdown-zindex); + display: none; + min-width: var(--bs-dropdown-min-width); + padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); + margin: 0; + font-size: var(--bs-dropdown-font-size); + color: var(--bs-dropdown-color); + text-align: left; + list-style: none; + background-color: var(--bs-dropdown-bg); + background-clip: padding-box; + border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); + border-radius: var(--bs-dropdown-border-radius); +} +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--bs-dropdown-spacer); +} + +.dropdown-menu-start { + --bs-position: start; +} +.dropdown-menu-start[data-bs-popper] { + right: auto; + left: 0; +} + +.dropdown-menu-end { + --bs-position: end; +} +.dropdown-menu-end[data-bs-popper] { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start; + } + .dropdown-menu-sm-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-sm-end { + --bs-position: end; + } + .dropdown-menu-sm-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start; + } + .dropdown-menu-md-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-md-end { + --bs-position: end; + } + .dropdown-menu-md-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start; + } + .dropdown-menu-lg-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-lg-end { + --bs-position: end; + } + .dropdown-menu-lg-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start; + } + .dropdown-menu-xl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xl-end { + --bs-position: end; + } + .dropdown-menu-xl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start; + } + .dropdown-menu-xxl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xxl-end { + --bs-position: end; + } + .dropdown-menu-xxl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +.dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: var(--bs-dropdown-spacer); +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: var(--bs-dropdown-spacer); +} +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropend .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropend .dropdown-toggle::after { + vertical-align: 0; +} + +.dropstart .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: var(--bs-dropdown-spacer); +} +.dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropstart .dropdown-toggle::after { + display: none; +} +.dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropstart .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropstart .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-divider { + height: 0; + margin: var(--bs-dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--bs-dropdown-divider-bg); + opacity: 1; +} + +.dropdown-item { + display: block; + width: 100%; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + clear: both; + font-weight: 500; + color: var(--bs-dropdown-link-color); + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.dropdown-item:hover, .dropdown-item:focus { + color: var(--bs-dropdown-link-hover-color); + background-color: var(--bs-dropdown-link-hover-bg); +} +.dropdown-item.active, .dropdown-item:active { + color: var(--bs-dropdown-link-active-color); + text-decoration: none; + background-color: var(--bs-dropdown-link-active-bg); +} +.dropdown-item.disabled, .dropdown-item:disabled { + color: var(--bs-dropdown-link-disabled-color); + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x); + margin-bottom: 0; + font-size: 0.875rem; + color: var(--bs-dropdown-header-color); + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + color: var(--bs-dropdown-link-color); +} + +.dropdown-menu-dark { + --bs-dropdown-color: #dee2e6; + --bs-dropdown-bg: #343a40; + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-box-shadow: ; + --bs-dropdown-link-color: #dee2e6; + --bs-dropdown-link-hover-color: #fff; + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #2937f0; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-header-color: #adb5bd; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group > .btn-check:checked + .btn, +.btn-group > .btn-check:focus + .btn, +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn-check:checked + .btn, +.btn-group-vertical > .btn-check:focus + .btn, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group { + border-radius: 0.375rem; +} +.btn-group > :not(.btn-check:first-child) + .btn, +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn.dropdown-toggle-split:first-child, +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:nth-child(n+3), +.btn-group > :not(.btn-check) + .btn, +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { + margin-left: 0; +} +.dropstart .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn ~ .btn, +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav { + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-link-color); + --bs-nav-link-hover-color: var(--bs-link-hover-color); + --bs-nav-link-disabled-color: #6c757d; + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); + font-size: var(--bs-nav-link-font-size); + font-weight: var(--bs-nav-link-font-weight); + color: var(--bs-nav-link-color); + text-decoration: none; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none; + } +} +.nav-link:hover, .nav-link:focus { + color: var(--bs-nav-link-hover-color); +} +.nav-link.disabled { + color: var(--bs-nav-link-disabled-color); + pointer-events: none; + cursor: default; +} + +.nav-tabs { + --bs-nav-tabs-border-width: 1px; + --bs-nav-tabs-border-color: #dee2e6; + --bs-nav-tabs-border-radius: 0.375rem; + --bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6; + --bs-nav-tabs-link-active-color: #495057; + --bs-nav-tabs-link-active-bg: #fff; + --bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff; + border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color); +} +.nav-tabs .nav-link { + margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); + background: none; + border: var(--bs-nav-tabs-border-width) solid transparent; + border-top-left-radius: var(--bs-nav-tabs-border-radius); + border-top-right-radius: var(--bs-nav-tabs-border-radius); +} +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + isolation: isolate; + border-color: var(--bs-nav-tabs-link-hover-border-color); +} +.nav-tabs .nav-link.disabled, .nav-tabs .nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + background-color: transparent; + border-color: transparent; +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: var(--bs-nav-tabs-link-active-color); + background-color: var(--bs-nav-tabs-link-active-bg); + border-color: var(--bs-nav-tabs-link-active-border-color); +} +.nav-tabs .dropdown-menu { + margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills { + --bs-nav-pills-border-radius: 0.375rem; + --bs-nav-pills-link-active-color: #fff; + --bs-nav-pills-link-active-bg: #2937f0; +} +.nav-pills .nav-link { + background: none; + border: 0; + border-radius: var(--bs-nav-pills-border-radius); +} +.nav-pills .nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + background-color: transparent; + border-color: transparent; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: var(--bs-nav-pills-link-active-color); + background-color: var(--bs-nav-pills-link-active-bg); +} + +.nav-fill > .nav-link, +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified > .nav-link, +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.nav-fill .nav-item .nav-link, +.nav-justified .nav-item .nav-link { + width: 100%; +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.navbar { + --bs-navbar-padding-x: 0; + --bs-navbar-padding-y: 0.5rem; + --bs-navbar-color: rgba(0, 0, 0, 0.55); + --bs-navbar-hover-color: rgba(0, 0, 0, 0.7); + --bs-navbar-disabled-color: rgba(0, 0, 0, 0.3); + --bs-navbar-active-color: rgba(0, 0, 0, 0.9); + --bs-navbar-brand-padding-y: 0.3125rem; + --bs-navbar-brand-margin-end: 1rem; + --bs-navbar-brand-font-size: 1.25rem; + --bs-navbar-brand-color: rgba(0, 0, 0, 0.9); + --bs-navbar-brand-hover-color: rgba(0, 0, 0, 0.9); + --bs-navbar-nav-link-padding-x: 0.5rem; + --bs-navbar-toggler-padding-y: 0.25rem; + --bs-navbar-toggler-padding-x: 0.75rem; + --bs-navbar-toggler-font-size: 1.25rem; + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + --bs-navbar-toggler-border-color: rgba(0, 0, 0, 0.1); + --bs-navbar-toggler-border-radius: 0.375rem; + --bs-navbar-toggler-focus-width: 0.25rem; + --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); +} +.navbar > .container, +.navbar > .container-fluid, +.navbar > .container-sm, +.navbar > .container-md, +.navbar > .container-lg, +.navbar > .container-xl, +.navbar > .container-xxl { + display: flex; + flex-wrap: inherit; + align-items: center; + justify-content: space-between; +} +.navbar-brand { + padding-top: var(--bs-navbar-brand-padding-y); + padding-bottom: var(--bs-navbar-brand-padding-y); + margin-right: var(--bs-navbar-brand-margin-end); + font-size: var(--bs-navbar-brand-font-size); + color: var(--bs-navbar-brand-color); + text-decoration: none; + white-space: nowrap; +} +.navbar-brand:hover, .navbar-brand:focus { + color: var(--bs-navbar-brand-hover-color); +} + +.navbar-nav { + --bs-nav-link-padding-x: 0; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-navbar-color); + --bs-nav-link-hover-color: var(--bs-navbar-hover-color); + --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .show > .nav-link, +.navbar-nav .nav-link.active { + color: var(--bs-navbar-active-color); +} +.navbar-nav .dropdown-menu { + position: static; +} + +.navbar-text { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-navbar-color); +} +.navbar-text a, +.navbar-text a:hover, +.navbar-text a:focus { + color: var(--bs-navbar-active-color); +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} + +.navbar-toggler { + padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); + font-size: var(--bs-navbar-toggler-font-size); + line-height: 1; + color: var(--bs-navbar-color); + background-color: transparent; + border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); + border-radius: var(--bs-navbar-toggler-border-radius); + transition: var(--bs-navbar-toggler-transition); +} +@media (prefers-reduced-motion: reduce) { + .navbar-toggler { + transition: none; + } +} +.navbar-toggler:hover { + text-decoration: none; +} +.navbar-toggler:focus { + text-decoration: none; + outline: 0; + box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-image: var(--bs-navbar-toggler-icon-bg); + background-repeat: no-repeat; + background-position: center; + background-size: 100%; +} + +.navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto; +} + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } + .navbar-expand-sm .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-sm .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-sm .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } + .navbar-expand-md .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-md .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-md .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } + .navbar-expand-lg .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-lg .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-lg .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } + .navbar-expand-xl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1400px) { + .navbar-expand-xxl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xxl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xxl .navbar-toggler { + display: none; + } + .navbar-expand-xxl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +.navbar-expand { + flex-wrap: nowrap; + justify-content: flex-start; +} +.navbar-expand .navbar-nav { + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); +} +.navbar-expand .navbar-nav-scroll { + overflow: visible; +} +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} +.navbar-expand .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; +} +.navbar-expand .offcanvas .offcanvas-header { + display: none; +} +.navbar-expand .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; +} + +.navbar-dark { + --bs-navbar-color: rgba(255, 255, 255, 0.55); + --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); + --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); + --bs-navbar-active-color: #fff; + --bs-navbar-brand-color: #fff; + --bs-navbar-brand-hover-color: #fff; + --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.card { + --bs-card-spacer-y: 1rem; + --bs-card-spacer-x: 1rem; + --bs-card-title-spacer-y: 0.5rem; + --bs-card-border-width: 1px; + --bs-card-border-color: var(--bs-border-color-translucent); + --bs-card-border-radius: 0.375rem; + --bs-card-box-shadow: ; + --bs-card-inner-border-radius: calc(0.375rem - 1px); + --bs-card-cap-padding-y: 0.5rem; + --bs-card-cap-padding-x: 1rem; + --bs-card-cap-bg: rgba(0, 0, 0, 0.03); + --bs-card-cap-color: ; + --bs-card-height: ; + --bs-card-color: ; + --bs-card-bg: #fff; + --bs-card-img-overlay-padding: 1rem; + --bs-card-group-margin: 0.75rem; + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + height: var(--bs-card-height); + word-wrap: break-word; + background-color: var(--bs-card-bg); + background-clip: border-box; + border: var(--bs-card-border-width) solid var(--bs-card-border-color); + border-radius: var(--bs-card-border-radius); +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); +} +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} + +.card-body { + flex: 1 1 auto; + padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); + color: var(--bs-card-color); +} + +.card-title { + margin-bottom: var(--bs-card-title-spacer-y); +} + +.card-subtitle { + margin-top: calc(-0.5 * var(--bs-card-title-spacer-y)); + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link + .card-link { + margin-left: var(--bs-card-spacer-x); +} + +.card-header { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + margin-bottom: 0; + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-header:first-child { + border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0; +} + +.card-footer { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-footer:last-child { + border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius); +} + +.card-header-tabs { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); + border-bottom: 0; +} +.card-header-tabs .nav-link.active { + background-color: var(--bs-card-bg); + border-bottom-color: var(--bs-card-bg); +} + +.card-header-pills { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--bs-card-img-overlay-padding); + border-radius: var(--bs-card-inner-border-radius); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; +} + +.card-img, +.card-img-top { + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); +} + +.card-img, +.card-img-bottom { + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); +} + +.card-group > .card { + margin-bottom: var(--bs-card-group-margin); +} +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} + +.accordion { + --bs-accordion-color: #212529; + --bs-accordion-bg: #fff; + --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; + --bs-accordion-border-color: var(--bs-border-color); + --bs-accordion-border-width: 1px; + --bs-accordion-border-radius: 0.375rem; + --bs-accordion-inner-border-radius: calc(0.375rem - 1px); + --bs-accordion-btn-padding-x: 1.25rem; + --bs-accordion-btn-padding-y: 1rem; + --bs-accordion-btn-color: #212529; + --bs-accordion-btn-bg: var(--bs-accordion-bg); + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-icon-width: 1.25rem; + --bs-accordion-btn-icon-transform: rotate(-180deg); + --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232532d8'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-focus-border-color: #949bf8; + --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(41, 55, 240, 0.25); + --bs-accordion-body-padding-x: 1.25rem; + --bs-accordion-body-padding-y: 1rem; + --bs-accordion-active-color: #2532d8; + --bs-accordion-active-bg: #eaebfe; +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); + font-size: 1rem; + color: var(--bs-accordion-btn-color); + text-align: left; + background-color: var(--bs-accordion-btn-bg); + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: var(--bs-accordion-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none; + } +} +.accordion-button:not(.collapsed) { + color: var(--bs-accordion-active-color); + background-color: var(--bs-accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color); +} +.accordion-button:not(.collapsed)::after { + background-image: var(--bs-accordion-btn-active-icon); + transform: var(--bs-accordion-btn-icon-transform); +} +.accordion-button::after { + flex-shrink: 0; + width: var(--bs-accordion-btn-icon-width); + height: var(--bs-accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--bs-accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--bs-accordion-btn-icon-width); + transition: var(--bs-accordion-btn-icon-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none; + } +} +.accordion-button:hover { + z-index: 2; +} +.accordion-button:focus { + z-index: 3; + border-color: var(--bs-accordion-btn-focus-border-color); + outline: 0; + box-shadow: var(--bs-accordion-btn-focus-box-shadow); +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + color: var(--bs-accordion-color); + background-color: var(--bs-accordion-bg); + border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color); +} +.accordion-item:first-of-type { + border-top-left-radius: var(--bs-accordion-border-radius); + border-top-right-radius: var(--bs-accordion-border-radius); +} +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: var(--bs-accordion-inner-border-radius); + border-top-right-radius: var(--bs-accordion-inner-border-radius); +} +.accordion-item:not(:first-of-type) { + border-top: 0; +} +.accordion-item:last-of-type { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); +} +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: var(--bs-accordion-inner-border-radius); + border-bottom-left-radius: var(--bs-accordion-inner-border-radius); +} +.accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); +} + +.accordion-body { + padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x); +} + +.accordion-flush .accordion-collapse { + border-width: 0; +} +.accordion-flush .accordion-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.accordion-flush .accordion-item:first-child { + border-top: 0; +} +.accordion-flush .accordion-item:last-child { + border-bottom: 0; +} +.accordion-flush .accordion-item .accordion-button, .accordion-flush .accordion-item .accordion-button.collapsed { + border-radius: 0; +} + +.breadcrumb { + --bs-breadcrumb-padding-x: 0; + --bs-breadcrumb-padding-y: 0; + --bs-breadcrumb-margin-bottom: 1rem; + --bs-breadcrumb-bg: ; + --bs-breadcrumb-border-radius: ; + --bs-breadcrumb-divider-color: #6c757d; + --bs-breadcrumb-item-padding-x: 0.5rem; + --bs-breadcrumb-item-active-color: #6c757d; + display: flex; + flex-wrap: wrap; + padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); + margin-bottom: var(--bs-breadcrumb-margin-bottom); + font-size: var(--bs-breadcrumb-font-size); + list-style: none; + background-color: var(--bs-breadcrumb-bg); + border-radius: var(--bs-breadcrumb-border-radius); +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: var(--bs-breadcrumb-item-padding-x); +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: var(--bs-breadcrumb-item-padding-x); + color: var(--bs-breadcrumb-divider-color); + content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; +} +.breadcrumb-item.active { + color: var(--bs-breadcrumb-item-active-color); +} + +.pagination { + --bs-pagination-padding-x: 0.75rem; + --bs-pagination-padding-y: 0.375rem; + --bs-pagination-font-size: 1rem; + --bs-pagination-color: var(--bs-link-color); + --bs-pagination-bg: #fff; + --bs-pagination-border-width: 1px; + --bs-pagination-border-color: #dee2e6; + --bs-pagination-border-radius: 0.375rem; + --bs-pagination-hover-color: var(--bs-link-hover-color); + --bs-pagination-hover-bg: #e9ecef; + --bs-pagination-hover-border-color: #dee2e6; + --bs-pagination-focus-color: var(--bs-link-hover-color); + --bs-pagination-focus-bg: #e9ecef; + --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(41, 55, 240, 0.25); + --bs-pagination-active-color: #fff; + --bs-pagination-active-bg: #2937f0; + --bs-pagination-active-border-color: #2937f0; + --bs-pagination-disabled-color: #6c757d; + --bs-pagination-disabled-bg: #fff; + --bs-pagination-disabled-border-color: #dee2e6; + display: flex; + padding-left: 0; + list-style: none; +} + +.page-link { + position: relative; + display: block; + padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); + font-size: var(--bs-pagination-font-size); + color: var(--bs-pagination-color); + text-decoration: none; + background-color: var(--bs-pagination-bg); + border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .page-link { + transition: none; + } +} +.page-link:hover { + z-index: 2; + color: var(--bs-pagination-hover-color); + background-color: var(--bs-pagination-hover-bg); + border-color: var(--bs-pagination-hover-border-color); +} +.page-link:focus { + z-index: 3; + color: var(--bs-pagination-focus-color); + background-color: var(--bs-pagination-focus-bg); + outline: 0; + box-shadow: var(--bs-pagination-focus-box-shadow); +} +.page-link.active, .active > .page-link { + z-index: 3; + color: var(--bs-pagination-active-color); + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color); +} +.page-link.disabled, .disabled > .page-link { + color: var(--bs-pagination-disabled-color); + pointer-events: none; + background-color: var(--bs-pagination-disabled-bg); + border-color: var(--bs-pagination-disabled-border-color); +} + +.page-item:not(:first-child) .page-link { + margin-left: -1px; +} +.page-item:first-child .page-link { + border-top-left-radius: var(--bs-pagination-border-radius); + border-bottom-left-radius: var(--bs-pagination-border-radius); +} +.page-item:last-child .page-link { + border-top-right-radius: var(--bs-pagination-border-radius); + border-bottom-right-radius: var(--bs-pagination-border-radius); +} + +.pagination-lg { + --bs-pagination-padding-x: 1.5rem; + --bs-pagination-padding-y: 0.75rem; + --bs-pagination-font-size: 1.25rem; + --bs-pagination-border-radius: 0.5rem; +} + +.pagination-sm { + --bs-pagination-padding-x: 0.5rem; + --bs-pagination-padding-y: 0.25rem; + --bs-pagination-font-size: 0.875rem; + --bs-pagination-border-radius: 0.25rem; +} + +.badge { + --bs-badge-padding-x: 0.65em; + --bs-badge-padding-y: 0.35em; + --bs-badge-font-size: 0.75em; + --bs-badge-font-weight: 700; + --bs-badge-color: #fff; + --bs-badge-border-radius: 0.375rem; + display: inline-block; + padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); + font-size: var(--bs-badge-font-size); + font-weight: var(--bs-badge-font-weight); + line-height: 1; + color: var(--bs-badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: var(--bs-badge-border-radius); +} +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.alert { + --bs-alert-bg: transparent; + --bs-alert-padding-x: 1rem; + --bs-alert-padding-y: 1rem; + --bs-alert-margin-bottom: 1rem; + --bs-alert-color: inherit; + --bs-alert-border-color: transparent; + --bs-alert-border: 1px solid var(--bs-alert-border-color); + --bs-alert-border-radius: 0.375rem; + position: relative; + padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); + margin-bottom: var(--bs-alert-margin-bottom); + color: var(--bs-alert-color); + background-color: var(--bs-alert-bg); + border: var(--bs-alert-border); + border-radius: var(--bs-alert-border-radius); +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 3rem; +} +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; +} + +.alert-primary { + --bs-alert-color: #192190; + --bs-alert-bg: #d4d7fc; + --bs-alert-border-color: #bfc3fb; +} +.alert-primary .alert-link { + color: #141a73; +} + +.alert-secondary { + --bs-alert-color: #5f1088; + --bs-alert-bg: #ecd1f9; + --bs-alert-border-color: #e2baf6; +} +.alert-secondary .alert-link { + color: #4c0d6d; +} + +.alert-success { + --bs-alert-color: #0f5132; + --bs-alert-bg: #d1e7dd; + --bs-alert-border-color: #badbcc; +} +.alert-success .alert-link { + color: #0c4128; +} + +.alert-info { + --bs-alert-color: #055160; + --bs-alert-bg: #cff4fc; + --bs-alert-border-color: #b6effb; +} +.alert-info .alert-link { + color: #04414d; +} + +.alert-warning { + --bs-alert-color: #664d03; + --bs-alert-bg: #fff3cd; + --bs-alert-border-color: #ffecb5; +} +.alert-warning .alert-link { + color: #523e02; +} + +.alert-danger { + --bs-alert-color: #842029; + --bs-alert-bg: #f8d7da; + --bs-alert-border-color: #f5c2c7; +} +.alert-danger .alert-link { + color: #6a1a21; +} + +.alert-light { + --bs-alert-color: #636464; + --bs-alert-bg: #fefefe; + --bs-alert-border-color: #fdfdfe; +} +.alert-light .alert-link { + color: #4f5050; +} + +.alert-dark { + --bs-alert-color: #141619; + --bs-alert-bg: #d3d3d4; + --bs-alert-border-color: #bcbebf; +} +.alert-dark .alert-link { + color: #101214; +} + +@keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} +.progress { + --bs-progress-height: 1rem; + --bs-progress-font-size: 0.75rem; + --bs-progress-bg: #e9ecef; + --bs-progress-border-radius: 0.375rem; + --bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075); + --bs-progress-bar-color: #fff; + --bs-progress-bar-bg: #2937f0; + --bs-progress-bar-transition: width 0.6s ease; + display: flex; + height: var(--bs-progress-height); + overflow: hidden; + font-size: var(--bs-progress-font-size); + background-color: var(--bs-progress-bg); + border-radius: var(--bs-progress-border-radius); +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: var(--bs-progress-bar-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-progress-bar-bg); + transition: var(--bs-progress-bar-transition); +} +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: var(--bs-progress-height) var(--bs-progress-height); +} + +.progress-bar-animated { + animation: 1s linear infinite progress-bar-stripes; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none; + } +} + +.list-group { + --bs-list-group-color: #212529; + --bs-list-group-bg: #fff; + --bs-list-group-border-color: rgba(0, 0, 0, 0.125); + --bs-list-group-border-width: 1px; + --bs-list-group-border-radius: 0.375rem; + --bs-list-group-item-padding-x: 1rem; + --bs-list-group-item-padding-y: 0.5rem; + --bs-list-group-action-color: #495057; + --bs-list-group-action-hover-color: #495057; + --bs-list-group-action-hover-bg: #f8f9fa; + --bs-list-group-action-active-color: #212529; + --bs-list-group-action-active-bg: #e9ecef; + --bs-list-group-disabled-color: #6c757d; + --bs-list-group-disabled-bg: #fff; + --bs-list-group-active-color: #fff; + --bs-list-group-active-bg: #2937f0; + --bs-list-group-active-border-color: #2937f0; + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: var(--bs-list-group-border-radius); +} + +.list-group-numbered { + list-style-type: none; + counter-reset: section; +} +.list-group-numbered > .list-group-item::before { + content: counters(section, ".") ". "; + counter-increment: section; +} + +.list-group-item-action { + width: 100%; + color: var(--bs-list-group-action-color); + text-align: inherit; +} +.list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: var(--bs-list-group-action-hover-color); + text-decoration: none; + background-color: var(--bs-list-group-action-hover-bg); +} +.list-group-item-action:active { + color: var(--bs-list-group-action-active-color); + background-color: var(--bs-list-group-action-active-bg); +} + +.list-group-item { + position: relative; + display: block; + padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x); + color: var(--bs-list-group-color); + text-decoration: none; + background-color: var(--bs-list-group-bg); + border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color); +} +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} +.list-group-item.disabled, .list-group-item:disabled { + color: var(--bs-list-group-disabled-color); + pointer-events: none; + background-color: var(--bs-list-group-disabled-bg); +} +.list-group-item.active { + z-index: 2; + color: var(--bs-list-group-active-color); + background-color: var(--bs-list-group-active-bg); + border-color: var(--bs-list-group-active-border-color); +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: calc(-1 * var(--bs-list-group-border-width)); + border-top-width: var(--bs-list-group-border-width); +} + +.list-group-horizontal { + flex-direction: row; +} +.list-group-horizontal > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; +} +.list-group-horizontal > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; +} +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +.list-group-flush { + border-radius: 0; +} +.list-group-flush > .list-group-item { + border-width: 0 0 var(--bs-list-group-border-width); +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} + +.list-group-item-primary { + color: #192190; + background-color: #d4d7fc; +} +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #192190; + background-color: #bfc2e3; +} +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #192190; + border-color: #192190; +} + +.list-group-item-secondary { + color: #5f1088; + background-color: #ecd1f9; +} +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #5f1088; + background-color: #d4bce0; +} +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #5f1088; + border-color: #5f1088; +} + +.list-group-item-success { + color: #0f5132; + background-color: #d1e7dd; +} +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #0f5132; + background-color: #bcd0c7; +} +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #0f5132; + border-color: #0f5132; +} + +.list-group-item-info { + color: #055160; + background-color: #cff4fc; +} +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #055160; + background-color: #badce3; +} +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #055160; + border-color: #055160; +} + +.list-group-item-warning { + color: #664d03; + background-color: #fff3cd; +} +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #664d03; + background-color: #e6dbb9; +} +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #664d03; + border-color: #664d03; +} + +.list-group-item-danger { + color: #842029; + background-color: #f8d7da; +} +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #842029; + background-color: #dfc2c4; +} +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #842029; + border-color: #842029; +} + +.list-group-item-light { + color: #636464; + background-color: #fefefe; +} +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #636464; + background-color: #e5e5e5; +} +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #636464; + border-color: #636464; +} + +.list-group-item-dark { + color: #141619; + background-color: #d3d3d4; +} +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #141619; + background-color: #bebebf; +} +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #141619; + border-color: #141619; +} + +.btn-close { + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: #000; + background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat; + border: 0; + border-radius: 0.375rem; + opacity: 0.5; +} +.btn-close:hover { + color: #000; + text-decoration: none; + opacity: 0.75; +} +.btn-close:focus { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(41, 55, 240, 0.25); + opacity: 1; +} +.btn-close:disabled, .btn-close.disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + opacity: 0.25; +} + +.btn-close-white { + filter: invert(1) grayscale(100%) brightness(200%); +} + +.toast { + --bs-toast-zindex: 1090; + --bs-toast-padding-x: 0.75rem; + --bs-toast-padding-y: 0.5rem; + --bs-toast-spacing: 1.5rem; + --bs-toast-max-width: 350px; + --bs-toast-font-size: 0.875rem; + --bs-toast-color: ; + --bs-toast-bg: rgba(255, 255, 255, 0.85); + --bs-toast-border-width: 1px; + --bs-toast-border-color: var(--bs-border-color-translucent); + --bs-toast-border-radius: 0.375rem; + --bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-toast-header-color: #6c757d; + --bs-toast-header-bg: rgba(255, 255, 255, 0.85); + --bs-toast-header-border-color: rgba(0, 0, 0, 0.05); + width: var(--bs-toast-max-width); + max-width: 100%; + font-size: var(--bs-toast-font-size); + color: var(--bs-toast-color); + pointer-events: auto; + background-color: var(--bs-toast-bg); + background-clip: padding-box; + border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); + box-shadow: var(--bs-toast-box-shadow); + border-radius: var(--bs-toast-border-radius); +} +.toast.showing { + opacity: 0; +} +.toast:not(.show) { + display: none; +} + +.toast-container { + --bs-toast-zindex: 1090; + position: absolute; + z-index: var(--bs-toast-zindex); + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none; +} +.toast-container > :not(:last-child) { + margin-bottom: var(--bs-toast-spacing); +} + +.toast-header { + display: flex; + align-items: center; + padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); + color: var(--bs-toast-header-color); + background-color: var(--bs-toast-header-bg); + background-clip: padding-box; + border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color); + border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); + border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); +} +.toast-header .btn-close { + margin-right: calc(-0.5 * var(--bs-toast-padding-x)); + margin-left: var(--bs-toast-padding-x); +} + +.toast-body { + padding: var(--bs-toast-padding-x); + word-wrap: break-word; +} + +.modal { + --bs-modal-zindex: 1055; + --bs-modal-width: 500px; + --bs-modal-padding: 1rem; + --bs-modal-margin: 0.5rem; + --bs-modal-color: ; + --bs-modal-bg: #fff; + --bs-modal-border-color: var(--bs-border-color-translucent); + --bs-modal-border-width: 1px; + --bs-modal-border-radius: 0.5rem; + --bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-modal-inner-border-radius: calc(0.5rem - 1px); + --bs-modal-header-padding-x: 1rem; + --bs-modal-header-padding-y: 1rem; + --bs-modal-header-padding: 1rem 1rem; + --bs-modal-header-border-color: var(--bs-border-color); + --bs-modal-header-border-width: 1px; + --bs-modal-title-line-height: 1.5; + --bs-modal-footer-gap: 0.5rem; + --bs-modal-footer-bg: ; + --bs-modal-footer-border-color: var(--bs-border-color); + --bs-modal-footer-border-width: 1px; + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-modal-zindex); + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: var(--bs-modal-margin); + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + transform: none; +} +.modal.modal-static .modal-dialog { + transform: scale(1.02); +} + +.modal-dialog-scrollable { + height: calc(100% - var(--bs-modal-margin) * 2); +} +.modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden; +} +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - var(--bs-modal-margin) * 2); +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + color: var(--bs-modal-color); + pointer-events: auto; + background-color: var(--bs-modal-bg); + background-clip: padding-box; + border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); + border-radius: var(--bs-modal-border-radius); + outline: 0; +} + +.modal-backdrop { + --bs-backdrop-zindex: 1050; + --bs-backdrop-bg: #000; + --bs-backdrop-opacity: 0.5; + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-backdrop-zindex); + width: 100vw; + height: 100vh; + background-color: var(--bs-backdrop-bg); +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: var(--bs-backdrop-opacity); +} + +.modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: space-between; + padding: var(--bs-modal-header-padding); + border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); + border-top-left-radius: var(--bs-modal-inner-border-radius); + border-top-right-radius: var(--bs-modal-inner-border-radius); +} +.modal-header .btn-close { + padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5); + margin: calc(-0.5 * var(--bs-modal-header-padding-y)) calc(-0.5 * var(--bs-modal-header-padding-x)) calc(-0.5 * var(--bs-modal-header-padding-y)) auto; +} + +.modal-title { + margin-bottom: 0; + line-height: var(--bs-modal-title-line-height); +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: var(--bs-modal-padding); +} + +.modal-footer { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5); + background-color: var(--bs-modal-footer-bg); + border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); + border-bottom-right-radius: var(--bs-modal-inner-border-radius); + border-bottom-left-radius: var(--bs-modal-inner-border-radius); +} +.modal-footer > * { + margin: calc(var(--bs-modal-footer-gap) * 0.5); +} + +@media (min-width: 576px) { + .modal { + --bs-modal-margin: 1.75rem; + --bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + } + .modal-dialog { + max-width: var(--bs-modal-width); + margin-right: auto; + margin-left: auto; + } + .modal-sm { + --bs-modal-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + --bs-modal-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + --bs-modal-width: 1140px; + } +} +.modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; +} +.modal-fullscreen .modal-content { + height: 100%; + border: 0; + border-radius: 0; +} +.modal-fullscreen .modal-header, +.modal-fullscreen .modal-footer { + border-radius: 0; +} +.modal-fullscreen .modal-body { + overflow-y: auto; +} + +@media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-header, + .modal-fullscreen-sm-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 767.98px) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-md-down .modal-header, + .modal-fullscreen-md-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-header, + .modal-fullscreen-lg-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-header, + .modal-fullscreen-xl-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-header, + .modal-fullscreen-xxl-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } +} +.tooltip { + --bs-tooltip-zindex: 1080; + --bs-tooltip-max-width: 200px; + --bs-tooltip-padding-x: 0.5rem; + --bs-tooltip-padding-y: 0.25rem; + --bs-tooltip-margin: ; + --bs-tooltip-font-size: 0.875rem; + --bs-tooltip-color: #fff; + --bs-tooltip-bg: #000; + --bs-tooltip-border-radius: 0.375rem; + --bs-tooltip-opacity: 0.9; + --bs-tooltip-arrow-width: 0.8rem; + --bs-tooltip-arrow-height: 0.4rem; + z-index: var(--bs-tooltip-zindex); + display: block; + padding: var(--bs-tooltip-arrow-height); + margin: var(--bs-tooltip-margin); + font-family: "Mulish", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 500; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-tooltip-font-size); + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: var(--bs-tooltip-opacity); +} +.tooltip .tooltip-arrow { + display: block; + width: var(--bs-tooltip-arrow-width); + height: var(--bs-tooltip-arrow-height); +} +.tooltip .tooltip-arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow { + bottom: 0; +} +.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { + top: -1px; + border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-top-color: var(--bs-tooltip-bg); +} + +/* rtl:begin:ignore */ +.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { + left: 0; + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { + right: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-right-color: var(--bs-tooltip-bg); +} + +/* rtl:end:ignore */ +.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow { + top: 0; +} +.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { + bottom: -1px; + border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-bottom-color: var(--bs-tooltip-bg); +} + +/* rtl:begin:ignore */ +.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { + right: 0; + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { + left: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-left-color: var(--bs-tooltip-bg); +} + +/* rtl:end:ignore */ +.tooltip-inner { + max-width: var(--bs-tooltip-max-width); + padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); + color: var(--bs-tooltip-color); + text-align: center; + background-color: var(--bs-tooltip-bg); + border-radius: var(--bs-tooltip-border-radius); +} + +.popover { + --bs-popover-zindex: 1070; + --bs-popover-max-width: 276px; + --bs-popover-font-size: 0.875rem; + --bs-popover-bg: #fff; + --bs-popover-border-width: 1px; + --bs-popover-border-color: var(--bs-border-color-translucent); + --bs-popover-border-radius: 0.5rem; + --bs-popover-inner-border-radius: calc(0.5rem - 1px); + --bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-popover-header-padding-x: 1rem; + --bs-popover-header-padding-y: 0.5rem; + --bs-popover-header-font-size: 1rem; + --bs-popover-header-color: ; + --bs-popover-header-bg: #f0f0f0; + --bs-popover-body-padding-x: 1rem; + --bs-popover-body-padding-y: 1rem; + --bs-popover-body-color: #212529; + --bs-popover-arrow-width: 1rem; + --bs-popover-arrow-height: 0.5rem; + --bs-popover-arrow-border: var(--bs-popover-border-color); + z-index: var(--bs-popover-zindex); + display: block; + max-width: var(--bs-popover-max-width); + font-family: "Mulish", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 500; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-popover-font-size); + word-wrap: break-word; + background-color: var(--bs-popover-bg); + background-clip: padding-box; + border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-radius: var(--bs-popover-border-radius); +} +.popover .popover-arrow { + display: block; + width: var(--bs-popover-arrow-width); + height: var(--bs-popover-arrow-height); +} +.popover .popover-arrow::before, .popover .popover-arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; + border-width: 0; +} + +.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow { + bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +} +.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { + border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; +} +.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before { + bottom: 0; + border-top-color: var(--bs-popover-arrow-border); +} +.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { + bottom: var(--bs-popover-border-width); + border-top-color: var(--bs-popover-bg); +} + +/* rtl:begin:ignore */ +.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow { + left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; +} +.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before { + left: 0; + border-right-color: var(--bs-popover-arrow-border); +} +.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { + left: var(--bs-popover-border-width); + border-right-color: var(--bs-popover-bg); +} + +/* rtl:end:ignore */ +.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow { + top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +} +.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { + border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); +} +.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before { + top: 0; + border-bottom-color: var(--bs-popover-arrow-border); +} +.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { + top: var(--bs-popover-border-width); + border-bottom-color: var(--bs-popover-bg); +} +.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: var(--bs-popover-arrow-width); + margin-left: calc(-0.5 * var(--bs-popover-arrow-width)); + content: ""; + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg); +} + +/* rtl:begin:ignore */ +.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow { + right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); +} +.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before { + right: 0; + border-left-color: var(--bs-popover-arrow-border); +} +.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { + right: var(--bs-popover-border-width); + border-left-color: var(--bs-popover-bg); +} + +/* rtl:end:ignore */ +.popover-header { + padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x); + margin-bottom: 0; + font-size: var(--bs-popover-header-font-size); + color: var(--bs-popover-header-color); + background-color: var(--bs-popover-header-bg); + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-top-left-radius: var(--bs-popover-inner-border-radius); + border-top-right-radius: var(--bs-popover-inner-border-radius); +} +.popover-header:empty { + display: none; +} + +.popover-body { + padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); + color: var(--bs-popover-body-color); +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-start, +.carousel-fade .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; +} +.carousel-fade .active.carousel-item-start, +.carousel-fade .active.carousel-item-end { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-start, + .carousel-fade .active.carousel-item-end { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + padding: 0; + color: #fff; + text-align: center; + background: none; + border: 0; + opacity: 0.5; + transition: opacity 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; + } +} +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 2rem; + height: 2rem; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +/* rtl:options: { + "autoRename": true, + "stringMap":[ { + "name" : "prev-next", + "search" : "prev", + "replace" : "next" + } ] +} */ +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + margin-right: 15%; + margin-bottom: 1rem; + margin-left: 15%; + list-style: none; +} +.carousel-indicators [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + padding: 0; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-indicators [data-bs-target] { + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 1.25rem; + left: 15%; + padding-top: 1.25rem; + padding-bottom: 1.25rem; + color: #fff; + text-align: center; +} + +.carousel-dark .carousel-control-prev-icon, +.carousel-dark .carousel-control-next-icon { + filter: invert(1) grayscale(100); +} +.carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000; +} +.carousel-dark .carousel-caption { + color: #000; +} + +.spinner-grow, +.spinner-border { + display: inline-block; + width: var(--bs-spinner-width); + height: var(--bs-spinner-height); + vertical-align: var(--bs-spinner-vertical-align); + border-radius: 50%; + animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name); +} + +@keyframes spinner-border { + to { + transform: rotate(360deg) /* rtl:ignore */; + } +} +.spinner-border { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-border-width: 0.25em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-border; + border: var(--bs-spinner-border-width) solid currentcolor; + border-right-color: transparent; +} + +.spinner-border-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; + --bs-spinner-border-width: 0.2em; +} + +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} +.spinner-grow { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-grow; + background-color: currentcolor; + opacity: 0; +} + +.spinner-grow-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; +} + +@media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + --bs-spinner-animation-speed: 1.5s; + } +} +.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm { + --bs-offcanvas-zindex: 1045; + --bs-offcanvas-width: 400px; + --bs-offcanvas-height: 30vh; + --bs-offcanvas-padding-x: 1rem; + --bs-offcanvas-padding-y: 1rem; + --bs-offcanvas-color: ; + --bs-offcanvas-bg: #fff; + --bs-offcanvas-border-width: 1px; + --bs-offcanvas-border-color: var(--bs-border-color-translucent); + --bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); +} + +@media (max-width: 575.98px) { + .offcanvas-sm { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-sm { + transition: none; + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show { + visibility: visible; + } +} +@media (min-width: 576px) { + .offcanvas-sm { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-sm .offcanvas-header { + display: none; + } + .offcanvas-sm .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 767.98px) { + .offcanvas-md { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-md { + transition: none; + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 767.98px) { + .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 767.98px) { + .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show { + visibility: visible; + } +} +@media (min-width: 768px) { + .offcanvas-md { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-md .offcanvas-header { + display: none; + } + .offcanvas-md .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 991.98px) { + .offcanvas-lg { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-lg { + transition: none; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show { + visibility: visible; + } +} +@media (min-width: 992px) { + .offcanvas-lg { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-lg .offcanvas-header { + display: none; + } + .offcanvas-lg .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 1199.98px) { + .offcanvas-xl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xl { + transition: none; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show { + visibility: visible; + } +} +@media (min-width: 1200px) { + .offcanvas-xl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xl .offcanvas-header { + display: none; + } + .offcanvas-xl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 1399.98px) { + .offcanvas-xxl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xxl { + transition: none; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show { + visibility: visible; + } +} +@media (min-width: 1400px) { + .offcanvas-xxl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xxl .offcanvas-header { + display: none; + } + .offcanvas-xxl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +.offcanvas { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none; + } +} +.offcanvas.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); +} +.offcanvas.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); +} +.offcanvas.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); +} +.offcanvas.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); +} +.offcanvas.showing, .offcanvas.show:not(.hiding) { + transform: none; +} +.offcanvas.showing, .offcanvas.hiding, .offcanvas.show { + visibility: visible; +} + +.offcanvas-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} +.offcanvas-backdrop.fade { + opacity: 0; +} +.offcanvas-backdrop.show { + opacity: 0.5; +} + +.offcanvas-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); +} +.offcanvas-header .btn-close { + padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5); + margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y)); + margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x)); + margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y)); +} + +.offcanvas-title { + margin-bottom: 0; + line-height: 1.5; +} + +.offcanvas-body { + flex-grow: 1; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); + overflow-y: auto; +} + +.placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentcolor; + opacity: 0.5; +} +.placeholder.btn::before { + display: inline-block; + content: ""; +} + +.placeholder-xs { + min-height: 0.6em; +} + +.placeholder-sm { + min-height: 0.8em; +} + +.placeholder-lg { + min-height: 1.2em; +} + +.placeholder-glow .placeholder { + animation: placeholder-glow 2s ease-in-out infinite; +} + +@keyframes placeholder-glow { + 50% { + opacity: 0.2; + } +} +.placeholder-wave { + -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + -webkit-mask-size: 200% 100%; + mask-size: 200% 100%; + animation: placeholder-wave 2s linear infinite; +} + +@keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0%; + } +} +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.text-bg-primary { + color: #fff !important; + background-color: RGBA(41, 55, 240, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-secondary { + color: #fff !important; + background-color: RGBA(159, 26, 226, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-success { + color: #fff !important; + background-color: RGBA(25, 135, 84, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-info { + color: #000 !important; + background-color: RGBA(13, 202, 240, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-warning { + color: #000 !important; + background-color: RGBA(255, 193, 7, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-danger { + color: #fff !important; + background-color: RGBA(220, 53, 69, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-light { + color: #000 !important; + background-color: RGBA(248, 249, 250, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-dark { + color: #fff !important; + background-color: RGBA(33, 37, 41, var(--bs-bg-opacity, 1)) !important; +} + +.link-primary { + color: #2937f0 !important; +} +.link-primary:hover, .link-primary:focus { + color: #212cc0 !important; +} + +.link-secondary { + color: #9f1ae2 !important; +} +.link-secondary:hover, .link-secondary:focus { + color: #7f15b5 !important; +} + +.link-success { + color: #198754 !important; +} +.link-success:hover, .link-success:focus { + color: #146c43 !important; +} + +.link-info { + color: #0dcaf0 !important; +} +.link-info:hover, .link-info:focus { + color: #3dd5f3 !important; +} + +.link-warning { + color: #ffc107 !important; +} +.link-warning:hover, .link-warning:focus { + color: #ffcd39 !important; +} + +.link-danger { + color: #dc3545 !important; +} +.link-danger:hover, .link-danger:focus { + color: #b02a37 !important; +} + +.link-light { + color: #f8f9fa !important; +} +.link-light:hover, .link-light:focus { + color: #f9fafb !important; +} + +.link-dark { + color: #212529 !important; +} +.link-dark:hover, .link-dark:focus { + color: #1a1e21 !important; +} + +.ratio { + position: relative; + width: 100%; +} +.ratio::before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: ""; +} +.ratio > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.ratio-1x1 { + --bs-aspect-ratio: 100%; +} + +.ratio-4x3 { + --bs-aspect-ratio: 75%; +} + +.ratio-16x9 { + --bs-aspect-ratio: 56.25%; +} + +.ratio-21x9 { + --bs-aspect-ratio: 42.8571428571%; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +.sticky-top { + position: sticky; + top: 0; + z-index: 1020; +} + +.sticky-bottom { + position: sticky; + bottom: 0; + z-index: 1020; +} + +@media (min-width: 576px) { + .sticky-sm-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-sm-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 768px) { + .sticky-md-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-md-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 992px) { + .sticky-lg-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-lg-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1200px) { + .sticky-xl-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xl-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1400px) { + .sticky-xxl-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xxl-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +.hstack { + display: flex; + flex-direction: row; + align-items: center; + align-self: stretch; +} + +.vstack { + display: flex; + flex: 1 1 auto; + flex-direction: column; + align-self: stretch; +} + +.visually-hidden, +.visually-hidden-focusable:not(:focus):not(:focus-within) { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: ""; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.vr { + display: inline-block; + align-self: stretch; + width: 1px; + min-height: 1em; + background-color: currentcolor; + opacity: 0.25; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.float-start { + float: left !important; +} + +.float-end { + float: right !important; +} + +.float-none { + float: none !important; +} + +.opacity-0 { + opacity: 0 !important; +} + +.opacity-25 { + opacity: 0.25 !important; +} + +.opacity-50 { + opacity: 0.5 !important; +} + +.opacity-75 { + opacity: 0.75 !important; +} + +.opacity-100 { + opacity: 1 !important; +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.overflow-visible { + overflow: visible !important; +} + +.overflow-scroll { + overflow: scroll !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-grid { + display: grid !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +.d-none { + display: none !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: sticky !important; +} + +.top-0 { + top: 0 !important; +} + +.top-50 { + top: 50% !important; +} + +.top-100 { + top: 100% !important; +} + +.bottom-0 { + bottom: 0 !important; +} + +.bottom-50 { + bottom: 50% !important; +} + +.bottom-100 { + bottom: 100% !important; +} + +.start-0 { + left: 0 !important; +} + +.start-50 { + left: 50% !important; +} + +.start-100 { + left: 100% !important; +} + +.end-0 { + right: 0 !important; +} + +.end-50 { + right: 50% !important; +} + +.end-100 { + right: 100% !important; +} + +.translate-middle { + transform: translate(-50%, -50%) !important; +} + +.translate-middle-x { + transform: translateX(-50%) !important; +} + +.translate-middle-y { + transform: translateY(-50%) !important; +} + +.border { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top { + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-end { + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-end-0 { + border-right: 0 !important; +} + +.border-bottom { + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-start { + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-start-0 { + border-left: 0 !important; +} + +.border-primary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important; +} + +.border-secondary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important; +} + +.border-success { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important; +} + +.border-info { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; +} + +.border-warning { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important; +} + +.border-danger { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important; +} + +.border-light { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important; +} + +.border-dark { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; +} + +.border-white { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important; +} + +.border-1 { + --bs-border-width: 1px; +} + +.border-2 { + --bs-border-width: 2px; +} + +.border-3 { + --bs-border-width: 3px; +} + +.border-4 { + --bs-border-width: 4px; +} + +.border-5 { + --bs-border-width: 5px; +} + +.border-opacity-10 { + --bs-border-opacity: 0.1; +} + +.border-opacity-25 { + --bs-border-opacity: 0.25; +} + +.border-opacity-50 { + --bs-border-opacity: 0.5; +} + +.border-opacity-75 { + --bs-border-opacity: 0.75; +} + +.border-opacity-100 { + --bs-border-opacity: 1; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.vw-100 { + width: 100vw !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.vh-100 { + height: 100vh !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.justify-content-evenly { + justify-content: space-evenly !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +.order-first { + order: -1 !important; +} + +.order-0 { + order: 0 !important; +} + +.order-1 { + order: 1 !important; +} + +.order-2 { + order: 2 !important; +} + +.order-3 { + order: 3 !important; +} + +.order-4 { + order: 4 !important; +} + +.order-5 { + order: 5 !important; +} + +.order-last { + order: 6 !important; +} + +.m-0 { + margin: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mt-3 { + margin-top: 1rem !important; +} + +.mt-4 { + margin-top: 1.5rem !important; +} + +.mt-5 { + margin-top: 3rem !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.me-0 { + margin-right: 0 !important; +} + +.me-1 { + margin-right: 0.25rem !important; +} + +.me-2 { + margin-right: 0.5rem !important; +} + +.me-3 { + margin-right: 1rem !important; +} + +.me-4 { + margin-right: 1.5rem !important; +} + +.me-5 { + margin-right: 3rem !important; +} + +.me-auto { + margin-right: auto !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.mb-3 { + margin-bottom: 1rem !important; +} + +.mb-4 { + margin-bottom: 1.5rem !important; +} + +.mb-5 { + margin-bottom: 3rem !important; +} + +.mb-auto { + margin-bottom: auto !important; +} + +.ms-0 { + margin-left: 0 !important; +} + +.ms-1 { + margin-left: 0.25rem !important; +} + +.ms-2 { + margin-left: 0.5rem !important; +} + +.ms-3 { + margin-left: 1rem !important; +} + +.ms-4 { + margin-left: 1.5rem !important; +} + +.ms-5 { + margin-left: 3rem !important; +} + +.ms-auto { + margin-left: auto !important; +} + +.p-0 { + padding: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pt-3 { + padding-top: 1rem !important; +} + +.pt-4 { + padding-top: 1.5rem !important; +} + +.pt-5 { + padding-top: 3rem !important; +} + +.pe-0 { + padding-right: 0 !important; +} + +.pe-1 { + padding-right: 0.25rem !important; +} + +.pe-2 { + padding-right: 0.5rem !important; +} + +.pe-3 { + padding-right: 1rem !important; +} + +.pe-4 { + padding-right: 1.5rem !important; +} + +.pe-5 { + padding-right: 3rem !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pb-3 { + padding-bottom: 1rem !important; +} + +.pb-4 { + padding-bottom: 1.5rem !important; +} + +.pb-5 { + padding-bottom: 3rem !important; +} + +.ps-0 { + padding-left: 0 !important; +} + +.ps-1 { + padding-left: 0.25rem !important; +} + +.ps-2 { + padding-left: 0.5rem !important; +} + +.ps-3 { + padding-left: 1rem !important; +} + +.ps-4 { + padding-left: 1.5rem !important; +} + +.ps-5 { + padding-left: 3rem !important; +} + +.gap-0 { + gap: 0 !important; +} + +.gap-1 { + gap: 0.25rem !important; +} + +.gap-2 { + gap: 0.5rem !important; +} + +.gap-3 { + gap: 1rem !important; +} + +.gap-4 { + gap: 1.5rem !important; +} + +.gap-5 { + gap: 3rem !important; +} + +.font-monospace { + font-family: var(--bs-font-monospace) !important; +} + +.fs-1 { + font-size: calc(1.375rem + 1.5vw) !important; +} + +.fs-2 { + font-size: calc(1.325rem + 0.9vw) !important; +} + +.fs-3 { + font-size: calc(1.3rem + 0.6vw) !important; +} + +.fs-4 { + font-size: calc(1.275rem + 0.3vw) !important; +} + +.fs-5 { + font-size: 1.25rem !important; +} + +.fs-6 { + font-size: 1rem !important; +} + +.fst-italic { + font-style: italic !important; +} + +.fst-normal { + font-style: normal !important; +} + +.fw-light { + font-weight: 300 !important; +} + +.fw-lighter { + font-weight: lighter !important; +} + +.fw-normal { + font-weight: 500 !important; +} + +.fw-bold { + font-weight: 700 !important; +} + +.fw-semibold { + font-weight: 600 !important; +} + +.fw-bolder { + font-weight: bolder !important; +} + +.lh-1 { + line-height: 1 !important; +} + +.lh-sm { + line-height: 1.25 !important; +} + +.lh-base { + line-height: 1.5 !important; +} + +.lh-lg { + line-height: 2 !important; +} + +.text-start { + text-align: left !important; +} + +.text-end { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-decoration-underline { + text-decoration: underline !important; +} + +.text-decoration-line-through { + text-decoration: line-through !important; +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +/* rtl:begin:remove */ +.text-break { + word-wrap: break-word !important; + word-break: break-word !important; +} + +/* rtl:end:remove */ +.text-primary { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; +} + +.text-secondary { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; +} + +.text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; +} + +.text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; +} + +.text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; +} + +.text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; +} + +.text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; +} + +.text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; +} + +.text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; +} + +.text-white { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; +} + +.text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; +} + +.text-muted { + --bs-text-opacity: 1; + color: #6c757d !important; +} + +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-reset { + --bs-text-opacity: 1; + color: inherit !important; +} + +.text-opacity-25 { + --bs-text-opacity: 0.25; +} + +.text-opacity-50 { + --bs-text-opacity: 0.5; +} + +.text-opacity-75 { + --bs-text-opacity: 0.75; +} + +.text-opacity-100 { + --bs-text-opacity: 1; +} + +.bg-primary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-success { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-warning { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-danger { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-light { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-black { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-white { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-body { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important; +} + +.bg-opacity-10 { + --bs-bg-opacity: 0.1; +} + +.bg-opacity-25 { + --bs-bg-opacity: 0.25; +} + +.bg-opacity-50 { + --bs-bg-opacity: 0.5; +} + +.bg-opacity-75 { + --bs-bg-opacity: 0.75; +} + +.bg-opacity-100 { + --bs-bg-opacity: 1; +} + +.bg-gradient { + background-image: var(--bs-gradient) !important; +} + +.user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + user-select: all !important; +} + +.user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + user-select: auto !important; +} + +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + user-select: none !important; +} + +.pe-none { + pointer-events: none !important; +} + +.pe-auto { + pointer-events: auto !important; +} + +.rounded { + border-radius: var(--bs-border-radius) !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.rounded-1 { + border-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-2 { + border-radius: var(--bs-border-radius) !important; +} + +.rounded-3 { + border-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-4 { + border-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-5 { + border-radius: var(--bs-border-radius-2xl) !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: var(--bs-border-radius-pill) !important; +} + +.rounded-top { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} + +.rounded-end { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} + +.rounded-bottom { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} + +.rounded-start { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media (min-width: 576px) { + .float-sm-start { + float: left !important; + } + .float-sm-end { + float: right !important; + } + .float-sm-none { + float: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-grid { + display: grid !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline-flex { + display: inline-flex !important; + } + .d-sm-none { + display: none !important; + } + .flex-sm-fill { + flex: 1 1 auto !important; + } + .flex-sm-row { + flex-direction: row !important; + } + .flex-sm-column { + flex-direction: column !important; + } + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + .flex-sm-wrap { + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-sm-start { + justify-content: flex-start !important; + } + .justify-content-sm-end { + justify-content: flex-end !important; + } + .justify-content-sm-center { + justify-content: center !important; + } + .justify-content-sm-between { + justify-content: space-between !important; + } + .justify-content-sm-around { + justify-content: space-around !important; + } + .justify-content-sm-evenly { + justify-content: space-evenly !important; + } + .align-items-sm-start { + align-items: flex-start !important; + } + .align-items-sm-end { + align-items: flex-end !important; + } + .align-items-sm-center { + align-items: center !important; + } + .align-items-sm-baseline { + align-items: baseline !important; + } + .align-items-sm-stretch { + align-items: stretch !important; + } + .align-content-sm-start { + align-content: flex-start !important; + } + .align-content-sm-end { + align-content: flex-end !important; + } + .align-content-sm-center { + align-content: center !important; + } + .align-content-sm-between { + align-content: space-between !important; + } + .align-content-sm-around { + align-content: space-around !important; + } + .align-content-sm-stretch { + align-content: stretch !important; + } + .align-self-sm-auto { + align-self: auto !important; + } + .align-self-sm-start { + align-self: flex-start !important; + } + .align-self-sm-end { + align-self: flex-end !important; + } + .align-self-sm-center { + align-self: center !important; + } + .align-self-sm-baseline { + align-self: baseline !important; + } + .align-self-sm-stretch { + align-self: stretch !important; + } + .order-sm-first { + order: -1 !important; + } + .order-sm-0 { + order: 0 !important; + } + .order-sm-1 { + order: 1 !important; + } + .order-sm-2 { + order: 2 !important; + } + .order-sm-3 { + order: 3 !important; + } + .order-sm-4 { + order: 4 !important; + } + .order-sm-5 { + order: 5 !important; + } + .order-sm-last { + order: 6 !important; + } + .m-sm-0 { + margin: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-sm-0 { + margin-top: 0 !important; + } + .mt-sm-1 { + margin-top: 0.25rem !important; + } + .mt-sm-2 { + margin-top: 0.5rem !important; + } + .mt-sm-3 { + margin-top: 1rem !important; + } + .mt-sm-4 { + margin-top: 1.5rem !important; + } + .mt-sm-5 { + margin-top: 3rem !important; + } + .mt-sm-auto { + margin-top: auto !important; + } + .me-sm-0 { + margin-right: 0 !important; + } + .me-sm-1 { + margin-right: 0.25rem !important; + } + .me-sm-2 { + margin-right: 0.5rem !important; + } + .me-sm-3 { + margin-right: 1rem !important; + } + .me-sm-4 { + margin-right: 1.5rem !important; + } + .me-sm-5 { + margin-right: 3rem !important; + } + .me-sm-auto { + margin-right: auto !important; + } + .mb-sm-0 { + margin-bottom: 0 !important; + } + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + .mb-sm-3 { + margin-bottom: 1rem !important; + } + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + .mb-sm-5 { + margin-bottom: 3rem !important; + } + .mb-sm-auto { + margin-bottom: auto !important; + } + .ms-sm-0 { + margin-left: 0 !important; + } + .ms-sm-1 { + margin-left: 0.25rem !important; + } + .ms-sm-2 { + margin-left: 0.5rem !important; + } + .ms-sm-3 { + margin-left: 1rem !important; + } + .ms-sm-4 { + margin-left: 1.5rem !important; + } + .ms-sm-5 { + margin-left: 3rem !important; + } + .ms-sm-auto { + margin-left: auto !important; + } + .p-sm-0 { + padding: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-sm-0 { + padding-top: 0 !important; + } + .pt-sm-1 { + padding-top: 0.25rem !important; + } + .pt-sm-2 { + padding-top: 0.5rem !important; + } + .pt-sm-3 { + padding-top: 1rem !important; + } + .pt-sm-4 { + padding-top: 1.5rem !important; + } + .pt-sm-5 { + padding-top: 3rem !important; + } + .pe-sm-0 { + padding-right: 0 !important; + } + .pe-sm-1 { + padding-right: 0.25rem !important; + } + .pe-sm-2 { + padding-right: 0.5rem !important; + } + .pe-sm-3 { + padding-right: 1rem !important; + } + .pe-sm-4 { + padding-right: 1.5rem !important; + } + .pe-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-0 { + padding-bottom: 0 !important; + } + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + .pb-sm-3 { + padding-bottom: 1rem !important; + } + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + .pb-sm-5 { + padding-bottom: 3rem !important; + } + .ps-sm-0 { + padding-left: 0 !important; + } + .ps-sm-1 { + padding-left: 0.25rem !important; + } + .ps-sm-2 { + padding-left: 0.5rem !important; + } + .ps-sm-3 { + padding-left: 1rem !important; + } + .ps-sm-4 { + padding-left: 1.5rem !important; + } + .ps-sm-5 { + padding-left: 3rem !important; + } + .gap-sm-0 { + gap: 0 !important; + } + .gap-sm-1 { + gap: 0.25rem !important; + } + .gap-sm-2 { + gap: 0.5rem !important; + } + .gap-sm-3 { + gap: 1rem !important; + } + .gap-sm-4 { + gap: 1.5rem !important; + } + .gap-sm-5 { + gap: 3rem !important; + } + .text-sm-start { + text-align: left !important; + } + .text-sm-end { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .float-md-start { + float: left !important; + } + .float-md-end { + float: right !important; + } + .float-md-none { + float: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-grid { + display: grid !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline-flex { + display: inline-flex !important; + } + .d-md-none { + display: none !important; + } + .flex-md-fill { + flex: 1 1 auto !important; + } + .flex-md-row { + flex-direction: row !important; + } + .flex-md-column { + flex-direction: column !important; + } + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + .flex-md-grow-0 { + flex-grow: 0 !important; + } + .flex-md-grow-1 { + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + .flex-md-wrap { + flex-wrap: wrap !important; + } + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-md-start { + justify-content: flex-start !important; + } + .justify-content-md-end { + justify-content: flex-end !important; + } + .justify-content-md-center { + justify-content: center !important; + } + .justify-content-md-between { + justify-content: space-between !important; + } + .justify-content-md-around { + justify-content: space-around !important; + } + .justify-content-md-evenly { + justify-content: space-evenly !important; + } + .align-items-md-start { + align-items: flex-start !important; + } + .align-items-md-end { + align-items: flex-end !important; + } + .align-items-md-center { + align-items: center !important; + } + .align-items-md-baseline { + align-items: baseline !important; + } + .align-items-md-stretch { + align-items: stretch !important; + } + .align-content-md-start { + align-content: flex-start !important; + } + .align-content-md-end { + align-content: flex-end !important; + } + .align-content-md-center { + align-content: center !important; + } + .align-content-md-between { + align-content: space-between !important; + } + .align-content-md-around { + align-content: space-around !important; + } + .align-content-md-stretch { + align-content: stretch !important; + } + .align-self-md-auto { + align-self: auto !important; + } + .align-self-md-start { + align-self: flex-start !important; + } + .align-self-md-end { + align-self: flex-end !important; + } + .align-self-md-center { + align-self: center !important; + } + .align-self-md-baseline { + align-self: baseline !important; + } + .align-self-md-stretch { + align-self: stretch !important; + } + .order-md-first { + order: -1 !important; + } + .order-md-0 { + order: 0 !important; + } + .order-md-1 { + order: 1 !important; + } + .order-md-2 { + order: 2 !important; + } + .order-md-3 { + order: 3 !important; + } + .order-md-4 { + order: 4 !important; + } + .order-md-5 { + order: 5 !important; + } + .order-md-last { + order: 6 !important; + } + .m-md-0 { + margin: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-md-0 { + margin-top: 0 !important; + } + .mt-md-1 { + margin-top: 0.25rem !important; + } + .mt-md-2 { + margin-top: 0.5rem !important; + } + .mt-md-3 { + margin-top: 1rem !important; + } + .mt-md-4 { + margin-top: 1.5rem !important; + } + .mt-md-5 { + margin-top: 3rem !important; + } + .mt-md-auto { + margin-top: auto !important; + } + .me-md-0 { + margin-right: 0 !important; + } + .me-md-1 { + margin-right: 0.25rem !important; + } + .me-md-2 { + margin-right: 0.5rem !important; + } + .me-md-3 { + margin-right: 1rem !important; + } + .me-md-4 { + margin-right: 1.5rem !important; + } + .me-md-5 { + margin-right: 3rem !important; + } + .me-md-auto { + margin-right: auto !important; + } + .mb-md-0 { + margin-bottom: 0 !important; + } + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + .mb-md-3 { + margin-bottom: 1rem !important; + } + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + .mb-md-5 { + margin-bottom: 3rem !important; + } + .mb-md-auto { + margin-bottom: auto !important; + } + .ms-md-0 { + margin-left: 0 !important; + } + .ms-md-1 { + margin-left: 0.25rem !important; + } + .ms-md-2 { + margin-left: 0.5rem !important; + } + .ms-md-3 { + margin-left: 1rem !important; + } + .ms-md-4 { + margin-left: 1.5rem !important; + } + .ms-md-5 { + margin-left: 3rem !important; + } + .ms-md-auto { + margin-left: auto !important; + } + .p-md-0 { + padding: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-md-0 { + padding-top: 0 !important; + } + .pt-md-1 { + padding-top: 0.25rem !important; + } + .pt-md-2 { + padding-top: 0.5rem !important; + } + .pt-md-3 { + padding-top: 1rem !important; + } + .pt-md-4 { + padding-top: 1.5rem !important; + } + .pt-md-5 { + padding-top: 3rem !important; + } + .pe-md-0 { + padding-right: 0 !important; + } + .pe-md-1 { + padding-right: 0.25rem !important; + } + .pe-md-2 { + padding-right: 0.5rem !important; + } + .pe-md-3 { + padding-right: 1rem !important; + } + .pe-md-4 { + padding-right: 1.5rem !important; + } + .pe-md-5 { + padding-right: 3rem !important; + } + .pb-md-0 { + padding-bottom: 0 !important; + } + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + .pb-md-3 { + padding-bottom: 1rem !important; + } + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + .pb-md-5 { + padding-bottom: 3rem !important; + } + .ps-md-0 { + padding-left: 0 !important; + } + .ps-md-1 { + padding-left: 0.25rem !important; + } + .ps-md-2 { + padding-left: 0.5rem !important; + } + .ps-md-3 { + padding-left: 1rem !important; + } + .ps-md-4 { + padding-left: 1.5rem !important; + } + .ps-md-5 { + padding-left: 3rem !important; + } + .gap-md-0 { + gap: 0 !important; + } + .gap-md-1 { + gap: 0.25rem !important; + } + .gap-md-2 { + gap: 0.5rem !important; + } + .gap-md-3 { + gap: 1rem !important; + } + .gap-md-4 { + gap: 1.5rem !important; + } + .gap-md-5 { + gap: 3rem !important; + } + .text-md-start { + text-align: left !important; + } + .text-md-end { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .float-lg-start { + float: left !important; + } + .float-lg-end { + float: right !important; + } + .float-lg-none { + float: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-grid { + display: grid !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline-flex { + display: inline-flex !important; + } + .d-lg-none { + display: none !important; + } + .flex-lg-fill { + flex: 1 1 auto !important; + } + .flex-lg-row { + flex-direction: row !important; + } + .flex-lg-column { + flex-direction: column !important; + } + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + .flex-lg-wrap { + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-lg-start { + justify-content: flex-start !important; + } + .justify-content-lg-end { + justify-content: flex-end !important; + } + .justify-content-lg-center { + justify-content: center !important; + } + .justify-content-lg-between { + justify-content: space-between !important; + } + .justify-content-lg-around { + justify-content: space-around !important; + } + .justify-content-lg-evenly { + justify-content: space-evenly !important; + } + .align-items-lg-start { + align-items: flex-start !important; + } + .align-items-lg-end { + align-items: flex-end !important; + } + .align-items-lg-center { + align-items: center !important; + } + .align-items-lg-baseline { + align-items: baseline !important; + } + .align-items-lg-stretch { + align-items: stretch !important; + } + .align-content-lg-start { + align-content: flex-start !important; + } + .align-content-lg-end { + align-content: flex-end !important; + } + .align-content-lg-center { + align-content: center !important; + } + .align-content-lg-between { + align-content: space-between !important; + } + .align-content-lg-around { + align-content: space-around !important; + } + .align-content-lg-stretch { + align-content: stretch !important; + } + .align-self-lg-auto { + align-self: auto !important; + } + .align-self-lg-start { + align-self: flex-start !important; + } + .align-self-lg-end { + align-self: flex-end !important; + } + .align-self-lg-center { + align-self: center !important; + } + .align-self-lg-baseline { + align-self: baseline !important; + } + .align-self-lg-stretch { + align-self: stretch !important; + } + .order-lg-first { + order: -1 !important; + } + .order-lg-0 { + order: 0 !important; + } + .order-lg-1 { + order: 1 !important; + } + .order-lg-2 { + order: 2 !important; + } + .order-lg-3 { + order: 3 !important; + } + .order-lg-4 { + order: 4 !important; + } + .order-lg-5 { + order: 5 !important; + } + .order-lg-last { + order: 6 !important; + } + .m-lg-0 { + margin: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-lg-0 { + margin-top: 0 !important; + } + .mt-lg-1 { + margin-top: 0.25rem !important; + } + .mt-lg-2 { + margin-top: 0.5rem !important; + } + .mt-lg-3 { + margin-top: 1rem !important; + } + .mt-lg-4 { + margin-top: 1.5rem !important; + } + .mt-lg-5 { + margin-top: 3rem !important; + } + .mt-lg-auto { + margin-top: auto !important; + } + .me-lg-0 { + margin-right: 0 !important; + } + .me-lg-1 { + margin-right: 0.25rem !important; + } + .me-lg-2 { + margin-right: 0.5rem !important; + } + .me-lg-3 { + margin-right: 1rem !important; + } + .me-lg-4 { + margin-right: 1.5rem !important; + } + .me-lg-5 { + margin-right: 3rem !important; + } + .me-lg-auto { + margin-right: auto !important; + } + .mb-lg-0 { + margin-bottom: 0 !important; + } + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + .mb-lg-3 { + margin-bottom: 1rem !important; + } + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + .mb-lg-5 { + margin-bottom: 3rem !important; + } + .mb-lg-auto { + margin-bottom: auto !important; + } + .ms-lg-0 { + margin-left: 0 !important; + } + .ms-lg-1 { + margin-left: 0.25rem !important; + } + .ms-lg-2 { + margin-left: 0.5rem !important; + } + .ms-lg-3 { + margin-left: 1rem !important; + } + .ms-lg-4 { + margin-left: 1.5rem !important; + } + .ms-lg-5 { + margin-left: 3rem !important; + } + .ms-lg-auto { + margin-left: auto !important; + } + .p-lg-0 { + padding: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-lg-0 { + padding-top: 0 !important; + } + .pt-lg-1 { + padding-top: 0.25rem !important; + } + .pt-lg-2 { + padding-top: 0.5rem !important; + } + .pt-lg-3 { + padding-top: 1rem !important; + } + .pt-lg-4 { + padding-top: 1.5rem !important; + } + .pt-lg-5 { + padding-top: 3rem !important; + } + .pe-lg-0 { + padding-right: 0 !important; + } + .pe-lg-1 { + padding-right: 0.25rem !important; + } + .pe-lg-2 { + padding-right: 0.5rem !important; + } + .pe-lg-3 { + padding-right: 1rem !important; + } + .pe-lg-4 { + padding-right: 1.5rem !important; + } + .pe-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-0 { + padding-bottom: 0 !important; + } + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + .pb-lg-3 { + padding-bottom: 1rem !important; + } + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + .pb-lg-5 { + padding-bottom: 3rem !important; + } + .ps-lg-0 { + padding-left: 0 !important; + } + .ps-lg-1 { + padding-left: 0.25rem !important; + } + .ps-lg-2 { + padding-left: 0.5rem !important; + } + .ps-lg-3 { + padding-left: 1rem !important; + } + .ps-lg-4 { + padding-left: 1.5rem !important; + } + .ps-lg-5 { + padding-left: 3rem !important; + } + .gap-lg-0 { + gap: 0 !important; + } + .gap-lg-1 { + gap: 0.25rem !important; + } + .gap-lg-2 { + gap: 0.5rem !important; + } + .gap-lg-3 { + gap: 1rem !important; + } + .gap-lg-4 { + gap: 1.5rem !important; + } + .gap-lg-5 { + gap: 3rem !important; + } + .text-lg-start { + text-align: left !important; + } + .text-lg-end { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .float-xl-start { + float: left !important; + } + .float-xl-end { + float: right !important; + } + .float-xl-none { + float: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-grid { + display: grid !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline-flex { + display: inline-flex !important; + } + .d-xl-none { + display: none !important; + } + .flex-xl-fill { + flex: 1 1 auto !important; + } + .flex-xl-row { + flex-direction: row !important; + } + .flex-xl-column { + flex-direction: column !important; + } + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xl-wrap { + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xl-start { + justify-content: flex-start !important; + } + .justify-content-xl-end { + justify-content: flex-end !important; + } + .justify-content-xl-center { + justify-content: center !important; + } + .justify-content-xl-between { + justify-content: space-between !important; + } + .justify-content-xl-around { + justify-content: space-around !important; + } + .justify-content-xl-evenly { + justify-content: space-evenly !important; + } + .align-items-xl-start { + align-items: flex-start !important; + } + .align-items-xl-end { + align-items: flex-end !important; + } + .align-items-xl-center { + align-items: center !important; + } + .align-items-xl-baseline { + align-items: baseline !important; + } + .align-items-xl-stretch { + align-items: stretch !important; + } + .align-content-xl-start { + align-content: flex-start !important; + } + .align-content-xl-end { + align-content: flex-end !important; + } + .align-content-xl-center { + align-content: center !important; + } + .align-content-xl-between { + align-content: space-between !important; + } + .align-content-xl-around { + align-content: space-around !important; + } + .align-content-xl-stretch { + align-content: stretch !important; + } + .align-self-xl-auto { + align-self: auto !important; + } + .align-self-xl-start { + align-self: flex-start !important; + } + .align-self-xl-end { + align-self: flex-end !important; + } + .align-self-xl-center { + align-self: center !important; + } + .align-self-xl-baseline { + align-self: baseline !important; + } + .align-self-xl-stretch { + align-self: stretch !important; + } + .order-xl-first { + order: -1 !important; + } + .order-xl-0 { + order: 0 !important; + } + .order-xl-1 { + order: 1 !important; + } + .order-xl-2 { + order: 2 !important; + } + .order-xl-3 { + order: 3 !important; + } + .order-xl-4 { + order: 4 !important; + } + .order-xl-5 { + order: 5 !important; + } + .order-xl-last { + order: 6 !important; + } + .m-xl-0 { + margin: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xl-0 { + margin-top: 0 !important; + } + .mt-xl-1 { + margin-top: 0.25rem !important; + } + .mt-xl-2 { + margin-top: 0.5rem !important; + } + .mt-xl-3 { + margin-top: 1rem !important; + } + .mt-xl-4 { + margin-top: 1.5rem !important; + } + .mt-xl-5 { + margin-top: 3rem !important; + } + .mt-xl-auto { + margin-top: auto !important; + } + .me-xl-0 { + margin-right: 0 !important; + } + .me-xl-1 { + margin-right: 0.25rem !important; + } + .me-xl-2 { + margin-right: 0.5rem !important; + } + .me-xl-3 { + margin-right: 1rem !important; + } + .me-xl-4 { + margin-right: 1.5rem !important; + } + .me-xl-5 { + margin-right: 3rem !important; + } + .me-xl-auto { + margin-right: auto !important; + } + .mb-xl-0 { + margin-bottom: 0 !important; + } + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xl-3 { + margin-bottom: 1rem !important; + } + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xl-5 { + margin-bottom: 3rem !important; + } + .mb-xl-auto { + margin-bottom: auto !important; + } + .ms-xl-0 { + margin-left: 0 !important; + } + .ms-xl-1 { + margin-left: 0.25rem !important; + } + .ms-xl-2 { + margin-left: 0.5rem !important; + } + .ms-xl-3 { + margin-left: 1rem !important; + } + .ms-xl-4 { + margin-left: 1.5rem !important; + } + .ms-xl-5 { + margin-left: 3rem !important; + } + .ms-xl-auto { + margin-left: auto !important; + } + .p-xl-0 { + padding: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xl-0 { + padding-top: 0 !important; + } + .pt-xl-1 { + padding-top: 0.25rem !important; + } + .pt-xl-2 { + padding-top: 0.5rem !important; + } + .pt-xl-3 { + padding-top: 1rem !important; + } + .pt-xl-4 { + padding-top: 1.5rem !important; + } + .pt-xl-5 { + padding-top: 3rem !important; + } + .pe-xl-0 { + padding-right: 0 !important; + } + .pe-xl-1 { + padding-right: 0.25rem !important; + } + .pe-xl-2 { + padding-right: 0.5rem !important; + } + .pe-xl-3 { + padding-right: 1rem !important; + } + .pe-xl-4 { + padding-right: 1.5rem !important; + } + .pe-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-0 { + padding-bottom: 0 !important; + } + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xl-3 { + padding-bottom: 1rem !important; + } + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xl-5 { + padding-bottom: 3rem !important; + } + .ps-xl-0 { + padding-left: 0 !important; + } + .ps-xl-1 { + padding-left: 0.25rem !important; + } + .ps-xl-2 { + padding-left: 0.5rem !important; + } + .ps-xl-3 { + padding-left: 1rem !important; + } + .ps-xl-4 { + padding-left: 1.5rem !important; + } + .ps-xl-5 { + padding-left: 3rem !important; + } + .gap-xl-0 { + gap: 0 !important; + } + .gap-xl-1 { + gap: 0.25rem !important; + } + .gap-xl-2 { + gap: 0.5rem !important; + } + .gap-xl-3 { + gap: 1rem !important; + } + .gap-xl-4 { + gap: 1.5rem !important; + } + .gap-xl-5 { + gap: 3rem !important; + } + .text-xl-start { + text-align: left !important; + } + .text-xl-end { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} +@media (min-width: 1400px) { + .float-xxl-start { + float: left !important; + } + .float-xxl-end { + float: right !important; + } + .float-xxl-none { + float: none !important; + } + .d-xxl-inline { + display: inline !important; + } + .d-xxl-inline-block { + display: inline-block !important; + } + .d-xxl-block { + display: block !important; + } + .d-xxl-grid { + display: grid !important; + } + .d-xxl-table { + display: table !important; + } + .d-xxl-table-row { + display: table-row !important; + } + .d-xxl-table-cell { + display: table-cell !important; + } + .d-xxl-flex { + display: flex !important; + } + .d-xxl-inline-flex { + display: inline-flex !important; + } + .d-xxl-none { + display: none !important; + } + .flex-xxl-fill { + flex: 1 1 auto !important; + } + .flex-xxl-row { + flex-direction: row !important; + } + .flex-xxl-column { + flex-direction: column !important; + } + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xxl-grow-0 { + flex-grow: 0 !important; + } + .flex-xxl-grow-1 { + flex-grow: 1 !important; + } + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xxl-wrap { + flex-wrap: wrap !important; + } + .flex-xxl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xxl-start { + justify-content: flex-start !important; + } + .justify-content-xxl-end { + justify-content: flex-end !important; + } + .justify-content-xxl-center { + justify-content: center !important; + } + .justify-content-xxl-between { + justify-content: space-between !important; + } + .justify-content-xxl-around { + justify-content: space-around !important; + } + .justify-content-xxl-evenly { + justify-content: space-evenly !important; + } + .align-items-xxl-start { + align-items: flex-start !important; + } + .align-items-xxl-end { + align-items: flex-end !important; + } + .align-items-xxl-center { + align-items: center !important; + } + .align-items-xxl-baseline { + align-items: baseline !important; + } + .align-items-xxl-stretch { + align-items: stretch !important; + } + .align-content-xxl-start { + align-content: flex-start !important; + } + .align-content-xxl-end { + align-content: flex-end !important; + } + .align-content-xxl-center { + align-content: center !important; + } + .align-content-xxl-between { + align-content: space-between !important; + } + .align-content-xxl-around { + align-content: space-around !important; + } + .align-content-xxl-stretch { + align-content: stretch !important; + } + .align-self-xxl-auto { + align-self: auto !important; + } + .align-self-xxl-start { + align-self: flex-start !important; + } + .align-self-xxl-end { + align-self: flex-end !important; + } + .align-self-xxl-center { + align-self: center !important; + } + .align-self-xxl-baseline { + align-self: baseline !important; + } + .align-self-xxl-stretch { + align-self: stretch !important; + } + .order-xxl-first { + order: -1 !important; + } + .order-xxl-0 { + order: 0 !important; + } + .order-xxl-1 { + order: 1 !important; + } + .order-xxl-2 { + order: 2 !important; + } + .order-xxl-3 { + order: 3 !important; + } + .order-xxl-4 { + order: 4 !important; + } + .order-xxl-5 { + order: 5 !important; + } + .order-xxl-last { + order: 6 !important; + } + .m-xxl-0 { + margin: 0 !important; + } + .m-xxl-1 { + margin: 0.25rem !important; + } + .m-xxl-2 { + margin: 0.5rem !important; + } + .m-xxl-3 { + margin: 1rem !important; + } + .m-xxl-4 { + margin: 1.5rem !important; + } + .m-xxl-5 { + margin: 3rem !important; + } + .m-xxl-auto { + margin: auto !important; + } + .mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xxl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xxl-0 { + margin-top: 0 !important; + } + .mt-xxl-1 { + margin-top: 0.25rem !important; + } + .mt-xxl-2 { + margin-top: 0.5rem !important; + } + .mt-xxl-3 { + margin-top: 1rem !important; + } + .mt-xxl-4 { + margin-top: 1.5rem !important; + } + .mt-xxl-5 { + margin-top: 3rem !important; + } + .mt-xxl-auto { + margin-top: auto !important; + } + .me-xxl-0 { + margin-right: 0 !important; + } + .me-xxl-1 { + margin-right: 0.25rem !important; + } + .me-xxl-2 { + margin-right: 0.5rem !important; + } + .me-xxl-3 { + margin-right: 1rem !important; + } + .me-xxl-4 { + margin-right: 1.5rem !important; + } + .me-xxl-5 { + margin-right: 3rem !important; + } + .me-xxl-auto { + margin-right: auto !important; + } + .mb-xxl-0 { + margin-bottom: 0 !important; + } + .mb-xxl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xxl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xxl-3 { + margin-bottom: 1rem !important; + } + .mb-xxl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xxl-5 { + margin-bottom: 3rem !important; + } + .mb-xxl-auto { + margin-bottom: auto !important; + } + .ms-xxl-0 { + margin-left: 0 !important; + } + .ms-xxl-1 { + margin-left: 0.25rem !important; + } + .ms-xxl-2 { + margin-left: 0.5rem !important; + } + .ms-xxl-3 { + margin-left: 1rem !important; + } + .ms-xxl-4 { + margin-left: 1.5rem !important; + } + .ms-xxl-5 { + margin-left: 3rem !important; + } + .ms-xxl-auto { + margin-left: auto !important; + } + .p-xxl-0 { + padding: 0 !important; + } + .p-xxl-1 { + padding: 0.25rem !important; + } + .p-xxl-2 { + padding: 0.5rem !important; + } + .p-xxl-3 { + padding: 1rem !important; + } + .p-xxl-4 { + padding: 1.5rem !important; + } + .p-xxl-5 { + padding: 3rem !important; + } + .px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xxl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xxl-0 { + padding-top: 0 !important; + } + .pt-xxl-1 { + padding-top: 0.25rem !important; + } + .pt-xxl-2 { + padding-top: 0.5rem !important; + } + .pt-xxl-3 { + padding-top: 1rem !important; + } + .pt-xxl-4 { + padding-top: 1.5rem !important; + } + .pt-xxl-5 { + padding-top: 3rem !important; + } + .pe-xxl-0 { + padding-right: 0 !important; + } + .pe-xxl-1 { + padding-right: 0.25rem !important; + } + .pe-xxl-2 { + padding-right: 0.5rem !important; + } + .pe-xxl-3 { + padding-right: 1rem !important; + } + .pe-xxl-4 { + padding-right: 1.5rem !important; + } + .pe-xxl-5 { + padding-right: 3rem !important; + } + .pb-xxl-0 { + padding-bottom: 0 !important; + } + .pb-xxl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xxl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xxl-3 { + padding-bottom: 1rem !important; + } + .pb-xxl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xxl-5 { + padding-bottom: 3rem !important; + } + .ps-xxl-0 { + padding-left: 0 !important; + } + .ps-xxl-1 { + padding-left: 0.25rem !important; + } + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + .ps-xxl-3 { + padding-left: 1rem !important; + } + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + .ps-xxl-5 { + padding-left: 3rem !important; + } + .gap-xxl-0 { + gap: 0 !important; + } + .gap-xxl-1 { + gap: 0.25rem !important; + } + .gap-xxl-2 { + gap: 0.5rem !important; + } + .gap-xxl-3 { + gap: 1rem !important; + } + .gap-xxl-4 { + gap: 1.5rem !important; + } + .gap-xxl-5 { + gap: 3rem !important; + } + .text-xxl-start { + text-align: left !important; + } + .text-xxl-end { + text-align: right !important; + } + .text-xxl-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .fs-1 { + font-size: 2.5rem !important; + } + .fs-2 { + font-size: 2rem !important; + } + .fs-3 { + font-size: 1.75rem !important; + } + .fs-4 { + font-size: 1.5rem !important; + } +} +@media print { + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-grid { + display: grid !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: flex !important; + } + .d-print-inline-flex { + display: inline-flex !important; + } + .d-print-none { + display: none !important; + } +} +html { + scroll-padding-top: 4.5rem; +} + +.bg-black { + background-color: #000 !important; +} + +.bg-gradient-primary-to-secondary { + background: linear-gradient(45deg, #2937f0, #9f1ae2) !important; +} + +.font-alt { + font-family: "Kanit", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !important; +} + +.text-gradient { + background: -webkit-linear-gradient(#2937f0, #9f1ae2); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +aside, +section { + padding-top: 5rem; + padding-bottom: 5rem; +} + +.app-badge { + height: 3rem; +} + +#mainNav { + padding-top: 1rem; + padding-bottom: 1rem; + background-color: #fff; +} +#mainNav .navbar-brand { + font-family: "Kanit", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; +} +#mainNav .navbar-brand:hover, #mainNav .navbar-brand:active { + color: #2937f0; +} +#mainNav .navbar-toggler { + font-size: 0.875rem; + padding: 0.75rem 1rem; + color: #212529; +} +#mainNav .navbar-nav .nav-item .nav-link { + color: #212529; +} +#mainNav .navbar-nav .nav-item .nav-link:hover { + color: #6c757d; +} +#mainNav .navbar-nav .nav-item .nav-link.active { + color: #2937f0; +} + +/*! + * html5-device-mockups (https://github.com/pixelsign/html5-device-mockups) + * Copyright 2013 - 2017 pixelsign + * Licensed under MIT (https://github.com/pixelsign/html5-device-mockups/blob/master/LICENSE.txt) + * Last Build: Tue Nov 14 2017 12:40:57 + */ +.device-wrapper { + max-width: 300px; + width: 100%; +} + +.device { + position: relative; + background-size: cover; +} + +.device::after { + position: absolute; + background-size: cover; + width: 100%; + height: 100%; + pointer-events: none; +} + +.device .screen { + position: absolute; + background-size: cover; + pointer-events: auto; +} + +.device .button { + position: absolute; + cursor: pointer; +} + +.device[data-device=iPhoneX][data-orientation=portrait][data-color=black] { + padding-bottom: 198.898071625%; +} + +.device[data-device=iPhoneX][data-orientation=portrait][data-color=black] .screen { + top: 3.1855955679%; + left: 6.8870523416%; + width: 86.2258953168%; + height: 93.6288088643%; +} + +.device[data-device=iPhoneX][data-orientation=portrait][data-color=black]::after { + content: ""; + background-image: url("../assets/img/portrait_black.png"); +} + +.device[data-device=iPhoneX][data-orientation=portrait][data-color=black] .button { + display: none; + top: 0%; + left: 0%; + width: 100%; + height: 100%; +} + +section.cta { + position: relative; + padding: 15rem 0; + background-image: url("https://img.freepik.com/photos-gratuite/homme-senior-athletique-s-entrainant-gymnastique_23-2150809355.jpg?w=1380&t=st=1701079471~exp=1701080071~hmac=baeec48b8d3a4c25cbbd821371bc8dcca048ba9c61d122963c1c0089bce690b3"); + background-position: center; + background-size: cover; +} +section.cta .cta-content { + position: relative; + z-index: 1; +} +section.cta:before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); +} + +.icon-feature { + font-size: 4rem; +} + +.features-device-mockup { + display: flex; + align-items: center; + justify-content: center; + position: relative; +} +.features-device-mockup .circle { + position: absolute; + left: 0; + fill: url(#circleGradient); + width: 70%; + display: none; +} +.features-device-mockup .circle .gradient-start-color { + stop-color: #2937f0; +} +.features-device-mockup .circle .gradient-end-color { + stop-color: #9f1ae2; +} +.features-device-mockup .shape-1 { + position: absolute; + height: 1rem; + width: 1rem; + transform: rotate(10deg); + fill: #2937f0; + top: 15%; + right: 10%; +} +.features-device-mockup .shape-2 { + position: absolute; + height: 0.75rem; + width: 0.75rem; + fill: #2937f0; + bottom: 15%; + left: 10%; +} +.features-device-mockup .device-wrapper { + max-width: 10rem; +} + +@media (min-width: 576px) { + .features-device-mockup .circle { + width: 70%; + display: block; + left: auto; + } + .features-device-mockup .device-wrapper { + max-width: 12.5rem; + } +} +@media (min-width: 768px) { + .features-device-mockup .circle { + width: 60%; + left: auto; + } + .features-device-mockup .device-wrapper { + max-width: 15rem; + } +} +@media (min-width: 992px) { + .features-device-mockup .circle { + width: 90%; + left: -25%; + } + .features-device-mockup .shape-1 { + top: 5%; + right: -15%; + } + .features-device-mockup .shape-2 { + bottom: 10%; + left: -10%; + } + .features-device-mockup .device-wrapper { + max-width: 15rem; + margin-left: auto; + } +} +@media (min-width: 1200px) { + .features-device-mockup .circle { + width: 75%; + left: 0; + } + .features-device-mockup .shape-2 { + bottom: 15%; + left: 10%; + } + .features-device-mockup .device-wrapper { + max-width: 15rem; + } +} +@media (min-width: 1400px) { + .features-device-mockup .circle { + width: 80%; + left: 0; + } + .features-device-mockup .device-wrapper { + max-width: 17rem; + } +} +footer a { + color: rgba(255, 255, 255, 0.5); + text-decoration: none; +} +footer a:hover, footer a:active, footer a:focus { + color: rgba(255, 255, 255, 0.75); + text-decoration: underline; +} + +.masthead { + background-color: #f8f9fa; + padding-top: 9.5rem; + padding-bottom: 5rem; +} +.masthead .masthead-device-mockup { + display: flex; + align-items: center; + justify-content: center; + position: relative; +} +.masthead .masthead-device-mockup .circle { + position: absolute; + fill: url(#circleGradient); + width: 70%; + display: none; +} +.masthead .masthead-device-mockup .circle .gradient-start-color { + stop-color: #2937f0; +} +.masthead .masthead-device-mockup .circle .gradient-end-color { + stop-color: #9f1ae2; +} +.masthead .masthead-device-mockup .shape-1 { + position: absolute; + height: 1rem; + width: 1rem; + transform: rotate(-10deg); + fill: #2937f0; + bottom: 15%; + left: 10%; +} +.masthead .masthead-device-mockup .shape-2 { + position: absolute; + height: 0.75rem; + width: 0.75rem; + fill: #2937f0; + top: 15%; + right: 10%; +} +.masthead .masthead-device-mockup .device-wrapper { + max-width: 10rem; +} +@media (min-width: 576px) { + .masthead .masthead-device-mockup .circle { + width: 70%; + display: block; + } + .masthead .masthead-device-mockup .device-wrapper { + max-width: 12.5rem; + } +} +@media (min-width: 768px) { + .masthead .masthead-device-mockup .circle { + width: 60%; + } + .masthead .masthead-device-mockup .device-wrapper { + max-width: 15rem; + } +} +@media (min-width: 992px) { + .masthead .masthead-device-mockup .circle { + width: 90%; + } + .masthead .masthead-device-mockup .device-wrapper { + max-width: 15rem; + } +} +@media (min-width: 1200px) { + .masthead .masthead-device-mockup .circle { + width: 75%; + } + .masthead .masthead-device-mockup .device-wrapper { + max-width: 15rem; + } +} +@media (min-width: 1400px) { + .masthead .masthead-device-mockup .circle { + width: 70%; + } + .masthead .masthead-device-mockup .device-wrapper { + max-width: 17rem; + } +} \ No newline at end of file diff --git a/Sources/public/js/script2.js b/Sources/public/js/script2.js new file mode 100644 index 00000000..ab369326 --- /dev/null +++ b/Sources/public/js/script2.js @@ -0,0 +1,34 @@ +/*! +* Start Bootstrap - New Age v6.0.7 (https://startbootstrap.com/theme/new-age) +* Copyright 2013-2023 Start Bootstrap +* Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-new-age/blob/master/LICENSE) +*/ +// +// Scripts +// + +window.addEventListener('DOMContentLoaded', event => { + + // Activate Bootstrap scrollspy on the main nav element + const mainNav = document.body.querySelector('#mainNav'); + if (mainNav) { + new bootstrap.ScrollSpy(document.body, { + target: '#mainNav', + offset: 74, + }); + }; + + // Collapse responsive navbar when toggler is visible + const navbarToggler = document.body.querySelector('.navbar-toggler'); + const responsiveNavItems = [].slice.call( + document.querySelectorAll('#navbarResponsive .nav-link') + ); + responsiveNavItems.map(function (responsiveNavItem) { + responsiveNavItem.addEventListener('click', () => { + if (window.getComputedStyle(navbarToggler).display !== 'none') { + navbarToggler.click(); + } + }); + }); + +}); diff --git a/Sources/src/app/controller/AthleteController.php b/Sources/src/app/controller/AthleteController.php index 50567921..06c4c33f 100644 --- a/Sources/src/app/controller/AthleteController.php +++ b/Sources/src/app/controller/AthleteController.php @@ -76,6 +76,7 @@ class AthleteController extends BaseController } + #[Route(path: '/exercice', name: 'exercice', methods: ['GET'])] // 8 public function exercice(): Response { diff --git a/Sources/src/app/controller/AuthController.php b/Sources/src/app/controller/AuthController.php index c5469764..f3bb0490 100644 --- a/Sources/src/app/controller/AuthController.php +++ b/Sources/src/app/controller/AuthController.php @@ -30,12 +30,12 @@ class AuthController extends BaseController } if($this->container->get(UserManager::class)->login($log,$mdp)){ - return $this->redirectToRoute('/'); + return $this->redirectToRoute('/home'); } else{ - $error [] = "Erreur de connexion. Essayez encore"; + $error [] = "Erreur de connexion. Essayez encore"; } - return $this->render('./page/login.html.twig', ['error' => $error]); + return $this->render('./page/home.html.twig', ['error' => $error]); @@ -60,6 +60,46 @@ class AuthController extends BaseController } + #[Route('/logout', name: 'logout',methods: ['GET'])] + public function logout(IRequest $request): IResponse { + + return $this->render('./page/login.html.twig',[ + 'css' => $this->preference->getCookie(), + 'pp' => "test2", + 'user' => "Doe", + 'role' => "Athlète", + 'friendship' => [], + 'analyzes' => [], + 'mails' => [], + 'users' => [], + 'infoUser' => [], + 'exos' => [], + 'member' => [] + ]); + + } + + #[Route(path: '/regist', name: 'regist', methods: ['GET'])] + public function register2(): Response + { + + // CONFIRMER LES DONNESS !!!!! IMPORTANT + + return $this->render('./page/register.html.twig',[ + 'css' => $this->preference->getCookie(), + 'pp' => "test2", + 'user' => "Doe", + 'role' => "Athlète", + 'friendship' => [], + 'analyzes' => [], + 'mails' => [], + 'users' => [], + 'infoUser' => [], + 'exos' => [], + 'member' => [] + ]); + } + #[Route('/register', name: 'register' , methods:['GET'])] public function register(IRequest $request): IResponse { @@ -115,10 +155,10 @@ class AuthController extends BaseController } } - return $this->render('/register.html.twig'); + return $this->render('./page/register.html.twig'); } - #[Route(path: '/mdp', name: 'mdp', methods: ['POST'])] + #[Route(path: '/mdp', name: 'motdepasse', methods: ['POST'])] public function mdp(string $ancienMotDePasse,string $nouveauMotDePasse,string $confirmerMotDePasse, IRequest $req): Response { diff --git a/Sources/src/app/controller/Controller.php b/Sources/src/app/controller/Controller.php index b17efa74..0542e49b 100644 --- a/Sources/src/app/controller/Controller.php +++ b/Sources/src/app/controller/Controller.php @@ -22,7 +22,7 @@ class Controller extends BaseController $this->preference = new Preferences(); } - #[Route(path: '/', name: 'home', methods: ['GET'])] + /*#[Route(path: '/', name: 'home', methods: ['GET'])] public function index(): Response { return $this->render('./page/index.html',[ @@ -38,25 +38,25 @@ class Controller extends BaseController 'exos' => [], 'member' => [] ]); - } - - #[Route(path: '/analyses', name: 'analyses', methods: ['GET'])] - public function analyses(): Response - { - return $this->render('./page/analyze.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => [], - 'analyzes' => [], - 'mails' => [], - 'users' => [], - 'infoUser' => [], - 'exos' => [], - 'member' => [] - ]); - } + }*/ + +// #[Route(path: '/analyses', name: 'analyses', methods: ['GET'])] +// public function analyses(): Response +// { +// return $this->render('./page/analyze.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => [], +// 'analyzes' => [], +// 'mails' => [], +// 'users' => [], +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [] +// ]); +// } #[Route(path: '/activity', name: 'activity', methods: ['GET'])] public function activity(): Response @@ -435,7 +435,7 @@ class Controller extends BaseController } - #[Route(path: '/login', name: 'login', methods: ['POST'])] + /*#[Route(path: '/login', name: 'login', methods: ['POST'])] public function login(string $username,string $mdp, IRequest $req): Response { @@ -454,9 +454,9 @@ class Controller extends BaseController 'exos' => [], 'member' => [] ]); - } + }*/ - #[Route(path: '/log', name: 'log', methods: ['GET'])] + /*#[Route(path: '/log', name: 'log', methods: ['GET'])] public function login2(): Response { @@ -475,9 +475,9 @@ class Controller extends BaseController 'exos' => [], 'member' => [] ]); - } + }*/ - #[Route(path: '/register', name: 'register', methods: ['POST'])] + /*#[Route(path: '/register', name: 'register', methods: ['POST'])] public function register(string $username,string $mdp,string $confirmMdp,string $nom,string $prenom,string $dateNaissance,string $sexe,string $taille,string $poids, IRequest $req): Response { @@ -496,28 +496,29 @@ class Controller extends BaseController 'exos' => [], 'member' => [] ]); - } - - #[Route(path: '/regist', name: 'regist', methods: ['GET'])] - public function register2(): Response - { - - // CONFIRMER LES DONNESS !!!!! IMPORTANT + }*/ + +// #[Route(path: '/regist', name: 'regist', methods: ['GET'])] +// public function register2(): Response +// { +// +// // CONFIRMER LES DONNESS !!!!! IMPORTANT +// +// return $this->render('./page/register.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => [], +// 'analyzes' => [], +// 'mails' => [], +// 'users' => [], +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [] +// ]); +// } - return $this->render('./page/register.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => [], - 'analyzes' => [], - 'mails' => [], - 'users' => [], - 'infoUser' => [], - 'exos' => [], - 'member' => [] - ]); - } #[Route(path: '/pass', name: 'pass', methods: ['GET'])] public function pass(): Response diff --git a/Sources/src/app/controller/UserController.php b/Sources/src/app/controller/UserController.php index 371db47a..9c3f364d 100644 --- a/Sources/src/app/controller/UserController.php +++ b/Sources/src/app/controller/UserController.php @@ -14,10 +14,27 @@ class UserController extends BaseController { - #[Route(path: '/', name: 'home', methods: ['GET'])] + #[Route(path: '/', name: 'index', methods: ['GET'])] public function index(): Response { - + return $this->render('./page/index.html',[ + 'css' => $this->preference->getCookie(), + 'pp' => "test2", + 'user' => "Doe", + 'role' => "Athlète", + 'friendship' => [], + 'analyzes' => [], + 'mails' => [], + 'users' => [], + 'infoUser' => [], + 'exos' => [], + 'member' => [] + ]); + } + + #[Route(path: '/home', name: 'home', methods: ['GET'])] + public function home(): Response + { return $this->render('./page/home.html.twig',[ 'css' => $this->preference->getCookie(), 'pp' => "test2", diff --git a/Sources/src/app/views/Templates/authbase.html.twig b/Sources/src/app/views/Templates/authbase.html.twig index 7abf72f5..a8499ff3 100644 --- a/Sources/src/app/views/Templates/authbase.html.twig +++ b/Sources/src/app/views/Templates/authbase.html.twig @@ -1,71 +1,71 @@ - - - - - - - {% block title %}{% endblock %} - - - - -
-
-
- {% block main %} -
-
-
-
-

Connexion

-
-
-
- - -
-
- - -
-
- - -
- -
-
- + + + + + + + {% block title %}{% endblock %} + + + + +
+
+
+ {% block main %} +
+
+
+
+

Connexion

+
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
- {% endblock %} -
-
-
+
+
- - - - + + + + + + diff --git a/Sources/src/app/views/Templates/base.html.twig b/Sources/src/app/views/Templates/base.html.twig index f4ef8621..5c6177bb 100755 --- a/Sources/src/app/views/Templates/base.html.twig +++ b/Sources/src/app/views/Templates/base.html.twig @@ -8,7 +8,7 @@ {% block title %}{% endblock %} - + @@ -35,7 +35,7 @@
  • Profile
  • Paramètres
  • -
  • Déconnexion
  • +
  • Déconnexion
  • @@ -46,7 +46,7 @@
    diff --git a/Sources/src/app/views/Templates/page/password.html.twig b/Sources/src/app/views/Templates/page/password.html.twig index 07149fc5..903e4739 100644 --- a/Sources/src/app/views/Templates/page/password.html.twig +++ b/Sources/src/app/views/Templates/page/password.html.twig @@ -19,7 +19,7 @@
    Retour à la connexion -
    diff --git a/Sources/src/app/views/Templates/page/register.html.twig b/Sources/src/app/views/Templates/page/register.html.twig index 5fbf6cd2..309eeed5 100644 --- a/Sources/src/app/views/Templates/page/register.html.twig +++ b/Sources/src/app/views/Templates/page/register.html.twig @@ -81,12 +81,12 @@
    - +
    diff --git a/Sources/src/data/core/database/ActiviteEntity.php b/Sources/src/data/core/database/ActiviteEntity.php index a29a0a47..d392751e 100644 --- a/Sources/src/data/core/database/ActiviteEntity.php +++ b/Sources/src/data/core/database/ActiviteEntity.php @@ -71,7 +71,7 @@ class ActiviteEntity { } // Setters - public function setIdActivite($idActivite) { + public function setIdActivite($idActivity) { $this->idActivity = $idActivity; } diff --git a/Sources/src/data/model/manager/UserManager.php b/Sources/src/data/model/manager/UserManager.php index 12c19b58..c6e71e82 100644 --- a/Sources/src/data/model/manager/UserManager.php +++ b/Sources/src/data/model/manager/UserManager.php @@ -91,7 +91,6 @@ class UserManager if (in_array($newFriend, $this->currentUser->getRole()->getUsersList())) { throw new \Exception("Already friend"); } - var_dump("====================1========================="); if($this->relationshipService->sendRequest($this->currentUser, $newFriend)){ return true; }; From c0c7d6560fedcbc7a9bb44ef6dd5546831334783 Mon Sep 17 00:00:00 2001 From: "antoine.pinagot" Date: Tue, 28 Nov 2023 16:47:49 +0100 Subject: [PATCH 02/48] final page --- Sources/public/assets/img/bg1.png | Bin 0 -> 139251 bytes Sources/public/assets/img/demo-screen.mp4 | Bin 0 -> 772828 bytes Sources/public/assets/img/portrait_black.png | Bin 0 -> 100367 bytes Sources/public/css/styles2.css | 11162 ++++++++++++++++ Sources/public/js/scripts2.js | 34 + Sources/src/app/controller/Controller.php | 20 +- .../src/app/views/Templates/base.html.twig | 2 +- .../src/app/views/Templates/page/index.html | 293 +- 8 files changed, 11508 insertions(+), 3 deletions(-) create mode 100644 Sources/public/assets/img/bg1.png create mode 100644 Sources/public/assets/img/demo-screen.mp4 create mode 100644 Sources/public/assets/img/portrait_black.png create mode 100644 Sources/public/css/styles2.css create mode 100644 Sources/public/js/scripts2.js diff --git a/Sources/public/assets/img/bg1.png b/Sources/public/assets/img/bg1.png new file mode 100644 index 0000000000000000000000000000000000000000..3c6eeb4aa4b350a3ed8b3550096a2c068758e5ef GIT binary patch literal 139251 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 W#GZ8YnjjQ?lh}@7Hu+FWKmXYnSpyLO literal 0 HcmV?d00001 diff --git a/Sources/public/assets/img/demo-screen.mp4 b/Sources/public/assets/img/demo-screen.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9ab43610463017a5d829493006b57c4f00fd9533 GIT binary patch literal 772828 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

    55RaOUjI}g^}yAVB4bo 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 z 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�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

    ^6wZ~52P^BJs?Sv4y}h2Z?? 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

    @lNcqeS3#bi;e&W(-*ofEl z5y7DK-2kTo+}p@OkHCx0IZD*o$s8H?T88}fZNmlQ6a$mBwu_8-Z1AN$7vBgcezQp8 z%Tf-Z6)(OQ9J;TZ^*|^kq+r=!Wg^i^zXQyq(-cQWiFhcZS`=7$B{dH;neuga zphyFu#Y5V%$V3cuNpL`Cz`c@Ge2M8wP;nFexYKtEO-YRJ%xpG72sSo;8@i_)dT~*) z&1bBJL$HP#`vvGGrfGb;%s3J3H7}U1S}m zC2jUl!T=F09x%N!?%?5bl!m%Z#I;2)!x5;mXYd!htrh7y zfdH-lqi%04nU>rDBhDO#+O0;|Y0=@p8wz-!LMRJ!Y&yw6e(k~Tm`WqI@J9WkTR<*9 z3dz5lBH#oAlw^%SI4>PlH#eLBmUF5_m>$ldmWgq_Azt)a)Xx8v=A3PocT#UnwBx**l^as&1(l7$RJMe4$oz0Q z?vFk%BjImQ-2~)$9dn9R-!YQzE8l}4p;Rc~u6y_1Llz;Dw&iqo;9|#hzy?b}p1=60 z5om|IcMpjH&BZ#~j!i9O@(mU_RUPV#7Ng=dE5wK`jK%QFs6{5yRoN_OnZHRKnC@z> z_7m?^k$hB_j__nc#>%2{*V`nLa+yPvz8#UtJZQV5!{CR(1f695^Mj8R-}w? zswliber2)40~JwEv3L5ToR_4ef~svvzO-?lj-hK3%vf9-Kx5?LH|k2<&&+>*iAXh2 zXWVv=d_|(TFLOw+7KpyF?CA!FsBiLytvwZ0>s=u&s!k~TuEcsLVtamXqgluN-sh<6 zOy-{k>$g-)6%3tg{+RW7AI;3N3#VLZD&&DVXa>oWS{V{j%y>OU1NC)596mOMOi`ys zu}}bL8&2Z+1&K=GHU|N4rrdFz^e>)S@h3>O%e0>6nin_ny!LXoT$bEKrqO@<RME}i_&Kng>1hIT6^ro_9=)rZg={2@v!ca=4K0(Trw*wsI1BV)&2J5EZx$i1vY zuwAuKz*CI88d=Vq(xGXMDbd9q`n1Rmz3;%f6@LQCUm%@)`Y378NKt47fSPztg z{&Fn7zuGxi;+6R`?d)P`X^W>j6N9gFf(N?ibw+DC+h8ACa*#4M^)9)V!E9AgaBb&h zhDt+i$<$#^vkul9KL$W`eC6fRq9Yyto^r>}8lEhm>-9SKW%oNbdLEmfSFlOcZuGX> z2=jw#VqS%1{;1tyCDb-zK$4t?rXT`F;M@u5obm`D$|xpVUA|&IN%DWtE_bY>Nc8!n zoq_3te&%%i&F#x7NE5M!@++`5nm2JQ0XYfN3%^%a(gC~(HCjVBsvdZ?T_Tw}J(mcKWi*%b9<)Du5N9~h)zDE(28>q|2X zRi6!{W&-{?vwJ|gf-I0ngWt`f=CystJS0!h@`1pFTTYI!dQufQ^_S~%EEagIqmf(z z^nEzNF#AuYG0V_a;&{G2{CH66gN(ofo)e6&pW^u|2*f63GD6-)t>>Rnql) z#_&G$zm*Ol#$VpHcBvV@;9C1iN$y)w11rGp8%o&I*DUp=7O^#Vr)2v8jvgRSD&RZ? z-_}2bH!y)Ndo9!fEEBa@-S5yONKgi7ElHBjlA}iDdxrL%PkXGi=Cv7`LxSn=LqN$Iqu7v#SAXrC;`77YhqPD|M(R447aA9ZpGz zP8Tlsy@{gQV@LpEC!(@s9n%|sA=#dTe+X-emhyAJ(G~|#mROxfB+*dqsXK4NIXi1@ z6mF**Sk%ttBo)%TAkf z3*|q3a}{gt5OnbXd)HdD*`O=2l>W>;AK8o;?~1{$I~*<1mgINh%bXjQ3v|eIj{wEb z;ns8qam@bp{HqjZ#?Ond7p-T1JSvL3&fX+>+ZN^5s%V+|hs{$$GfQ%l{jll`nHWOt zDk$hl`Iim>fV&6RI@Wzm6rnO!@Otde%rJzfS)V>iKM#skeBEmo0hS4Nb4i$55L-vC z3FbaVYN=;!EfC{K1lFnX0ExONpU}r$UE|XNq8^a-#o9#ZZVN!7opE(v9u$-PMC4Sl zN%U9;(6@)W3WQJmm~^)%kx7?j^jByNu+6hSMV3_?bbUm!O%EEy%r#`6pQ*U$8;?KK zu?H=rqA`6Aw+McnW;t*+Cz1+P1KJ2GuSEQZwyYz zOR6ohswHP|E;mAJ@W$rzTrGQf~5uyjWIHTFvk@TW_#-eF20b;(s`i}&Tju_A>NR*3d~7Pilp~wHoYV7DGXnv zwG^XtvhICn)Gco5lQ){m8tpa15B4aIo7~7y89js)#5o;|9p&OE8bvS>k!ouBd%tBG zf$eJ=tCG9$(vtT2hXu>aj$vcy-mUslt+m3$Itwz$0004A0iMZfOaJpdFKzmsh-1OC zv3p0r@@(u>pTKbeWM6oljZj_^dIwLlUZ}I{$6nE?k#x=%64WV&?`PhBiyMQ|{$P~v zViOD$-dj2r-~NIfC)A!O@xaAKAxN&Z4N0g0!*8NZ7h+}%$oAops&T$uaUkq7Dq=k- zLCwFXc+aY%oFd!OiK@pNkdlW&AAcbwT-{;L;LNH2h5Rp2y5gH-3xxg$@WY~w&WWgn z#8C7rtT%>Pha%TohkHUvDB4IK)8vL~8HojtGWT~J66U=Xw4pQsVvfT~91>bjoL z=<45I+E@Vlq_PBq7|CV2EM93nE8X=yxv2yK9_ZUB!BC(nM;3^Dcd79d&t*7u#X-iT zCDzY&#!^M#F_8P*hT>B2&(a?CZZ9f@(ojDjQU*kr_>2}y5OI`N5;Nr=FHcS7lMDS|+Qqlu5(LpAtw=0m(Z;=s{? zQsfM2BK3t3b1{eA?}m{N1ov$cpnCZCm2kVD&1wa)!&mq2?>i5oc0>HVW~n>~U=2{# z+Ai88rI7=}J-f0dNT2H``T{ykb4Vl%DCovQ=HqukEe{Q>*Zp&3M;BUtKo3r1y2v30KoY`#T?3E%k^YnF73W(caRV?3ku!GXBo}?*AeC zcy`{@mNc~lFoiN1o@s8rawb4*@C_Wm78JzNyxVAjB&Wda5i@Wk>HM?GI|9xz83h$q zITb5Rua!iK>63o3?07o+%eA#)YD{m6f3c>{YyDR}Yx&a)e|}-qelUFKtWxPfNLn); z>hue0zzy7z?RvXFzb1BgMuBE0mlst7VPPUV9lB)=w|);P+cy5}&9VRwEL-2M;3@=; z)rihF<1Lqa5!|8S9VNB!OZCElt`(F5;-41;9OVa*wu*}Suf531np`$@cMB%a4%gFw zHQSyRu9Ns_2822A(qMf1^sOur2Z_XjzX~c!ePy#XJDEnE;#hWHm+6eLmfeIFjUBeH z#1a7aMNxRzicJcW!cxJM^Fu!}nku4NBS>=uninwc@qg=iez>D)tP#4LTB%WwZI?L7 zqbUR`MteXXnFpr%U7*w$MBbx;4|A-neLDY`?+OEy1kg`$Fb2^N3+Q^Au>tk2n<*fQo)#&t&-E{Wqky+UtMz9-2xP2^Fyl-7B*nKc+yc>uIm`D|5 zd?~IFY-(PMexJ(Wk6w7u9u+_`BO~7(thSI|1;jj!GnLVbbm~Gj1?4P@dCrcTnrwgN z{fwH|+F9@~YkF2s1Jv5I+w<6*fMN^@*Mu-19L2qT*u5b)3I6!)L#sW z@@oiPc6VQk!jw@WB;$aFVRVx&>$O(?I5tyKZnVuQUnzTvjxaJk@7`O3f+(k6K*q2K zh#w(FPh0yE231d6yCigew(y>wr`-Y?=Y6{&3s8uI24FCkv|{CzM5T0`cBZ%EDP2{ABA=F*vv+V%zx+de zxW)nyIYqrLUb!#M=Wp?0p*!itNq$WC(IW#s`(<9C<;aJlH`0fnXbjJ%UotTMXsle~ z@_cs}N)y%-r1t!u^FR?LGaQ_iGwJk6S*?nh-Dg&UvI=5Hx;2#-&(ojZGi$_+(nb!Z zloQm^1j(^QCj}A`gnC^BbzZq9MPKivOMjpRs4i(A4Itto7Wn+It*h6&KI1%J4Dmup zMke4H;=cI!H*e~jwMuls|MNz(vD+ZoLn8J4>#VAg($%d8(lTk2)(>|K+VHm7 zdQuG3k$T^R;_5rWCSnCigvXI@!kOJm$NaQ1J@gvf=Z|;#H$>Kal>fOU*bq_(vsDcv zN3?3?!?)n*YKxtB1 zgLwjvG#-S0L{ASK)?82Qhw1P|mv{|IwEOg=2+A)MfyZZssM^)ar#a{}cJC;tE3-pw zmApNLv~8Jhy5%KpH9{+Ogm!jB>x^_%YdwC{@#8k!(M!LLW{2e2etpT~mDDFC_z4v? zFUh9^p|UQ*`Vs+lxRmFPZ#@M^B{tW-VoYHYxgCQeh2L`lpg<#>PBf%ol&{8#j())x zjfta{Kd^*6HSKg=O~eDMjSXNt;pZ9ulx&c9ugUC2yXEQN+FsxwxpxRE?-N^qF zG+Wa6wII%X6KFHGD*fSQ|3%RMdsxzB!c|V8>6$%C)yv{4NRu^N6Pg|(^G^@&9d_`p zLiq957%3?^$0x^iu#bp%`sJCI$7yUA1E3(NIM*o47@{yCyYgN!Jgj3Sr@IK|*NdJ{ zwKi95E}i+n9Ud=6W1V<8v)Yz9V$t<4i<37fv)r>6BUaAz5!v4jB3*&|zC2W|*<$`@ z1=r7C&{{B-C^~%!ykIJ^RClyILaa8x`J_wCmHz7{tKn1AX^d7y@W@f>nDay->KcFG zw=UoJ1)uf$gefd;WiXwp8rR~70KYBlx*Na&gGrVC$^cDR^di-XMrwKCoYrzv@X$#q zJ6fJ8;HN7@5_AEF+H#cF*vpk);D1wd)Bvrb=zJJgDFp?a^S1R*P&Y$QMYnv2ogX(Q z@Q||n&l&H+M80*3E6rVUVgjzw93POf#4UtV$A-)Dk=Tw+=6u4%9MD(EC@YU~xD&*6X+doEhLV8PnCX0f!a%hSkoI0gni*_1vn zAKzFtW^VxZ8DWomZVA**lH@6%qb-f^I=lD88ZQ^R$0e z!|O&t#9RDJ*+~}1&Gvy^$UPNzZvJO*mmYlivvZS6-Rf+OF+~+5G>t3Pi|!k2O#7jVk!~uA$c2g>VJ`7AQ@iKX z&Ma;A47io&l$}H*oPZ|OAyR-y5vfsu!G#ikW?>?_P54&sf-EZf3TcdDsd(T(oTB;S z8yCBaGZRUfUeJDLD5(JuuCxm}TJj|-NZgAa(}K{$yIW1ZXRkq_$xpbj_V)D~gR%Y%}iyts+K;P4dU??~dz%{;|oaZRtc%5L4U61X8)>#`rY_DdA6 zBtC3QX{m7pXF9TYr0u>Vc1zad#+yc{q_SJ&(N=Nxmdypmo%cE>l_G~yuKjCBR*!(b z_Q0>X@!G4_0FHx6+0LOYaGxYE2erpTTx1I~CNKOCc9HF1DPzge7(nqo)e72gLf%>4 zloj>WEA5cf3qD~#|CyzhV-x#G-br!9nt#kX{?oJd-;PfUML_7}mw-WqN8Mx?B+a7^ z>J0@w$VdYbnuz>AM?I|RAku`i_*vamL|hj6D@E}3I-B9tt^u;;%kqaQJ)`$)C@mA^ z*uWsF4XCcEiW|NaDf)G_C3ooDvvzy6sbqC9MT1)$kbjN>8&cG70Ju%lRmf6h2T6ZO_ZI3gb`LGy(BT^ zZ;t!{_oF2;Rl->QStc3_^jyr1gUyo%nE(d#$G4~7z{f@eDQDpvZzr{5p#Sm)z_L&~ zVY01AcJ33brb{(H~YeWtI0!-bXucsQ;j;ihpUNyTEu zp!Fc(T9h_!Q}(=CRn+&Y{OrSAxk4e<9b$zgEQ@VG3sD!X#PiQb&1=DC6zet*4tWA5 zks}Z@N?cq>OILK~3k@ZOW;Z`UI8H5z;goAngyxhHcoLG4WJ#%=C6Q}moxwtl67=HI zK$pd_#Hsp3JetT11=ui%LU3=DYOPQk$e;7NXn@jN*gA3)<&Gm!Zj6=2~rN z39XwX1vMcgh|HiJ|2uWIA`x?s-?4kzY^k{ZDgt+W9*;N6cLDx;U#`5O>Odg(oQRT@ zI1Gd4KmY+)@8rd3oKZq-w_j{noN$=Nx-P5TMcSO35TQ849JX^=e2|OI`}Cz$SMF-J9mvp0z^z zxEXFb2(CD+O&+>A2ax8fcnUifOj7;JWCzhHCJ$TcX=;<@%@+ zwwJOZ{U^P_yc(uDp{NXF?P5}WNq3EGQp6>33+CAyK(-2QYUhzapE@ylRfB%j*92Nz zd)I58bB&~%S&>YdJe9@@gg~0c%>xf)I0TgQnXUz7OSKTV2bIaff$*)3ywGBvU?vFd z(5%%fL^874L+P%1$wtSf`OM&*LJy{A@O8}+IrPyQiOddNZ}Sh7VW*PuXElPDg>YFxZKw_AOHqLfebdTr)B&V0sCIJ%Ccvj^BI2d; zgM8tyQnZfBO9^dfEx_*e!Wdc|1BQ7Dpn#Jk!!V)DHZSF&OUxM9b$2(G1Yo3Q^;#ZR zudIPJV#^K1ru_WYD(9oy0t%Lmm#@txk|9O$8`i(-+#AnCL0tS8vn1-VB~lAQ!EC8^ z9PhNWB6c<%Cw)Bmue+9J(4~<9VXa?W2AC1v3lG+dV)2v_CMSeriCk$`eLB;a;N zAV>>@VUa6>hpdAZ2(_4Ib|xb|m~O(1`5bTTxKjDF2^cOCzd;%mICHw6j2Y+Zl`l;U z>Q%4%YW60YuG0d)WN#u?QQp73uDKE0Ea28|alOct;E9H=Q#FkhniFVE9BJ5?c9!QL z8=)fhp=TWAk_D}&i~&Z+&!b)}&ITtGbT~~-v$pL5;BMu;pcQFgeAL2UyujgH8MX*F z#|5n%omOp*m?J{)RJv_ncMYOJ-5%)ZaB@sVavhm24*aknaC|*h+-Cq!TZP+I0-15V ztW9s^AkJA-Ffe0r(%clIv-t=7I)s>KO`#+S-wkV#vJDZ=~USV)F?0hEiQ< zqsl*n`$kOz{Bh)>#5vInPV7- zWYpAc+%Hv2lfM=!ivV?zwwajG0@u9ieG;@ia$%frXGC#YpQSiGd$uJ+_uO8?D-cNQo8ZckgV2G@Hey$bu_cVa>S_zB>Y)Ri>e91k zH6U{YvjI0v3e_j;O=#-*Or6ccF+1V0^Z;5pu<_8=tQ~x8Y?yRrOoCz&Mo+pLds3Jx zc32r=ZDPS=IW51;ReUeE1{h*qkWezHYCpxI>>hFRFbHG4w&^;fN;8slEw#p^b5)p- z-Hkvk-ggLe7DtX2c=Z#TEx}c7H=SztlFyeF?+V_R3o9`fQty&U%n-~Xi6KCdrzH5A zzM_d^>JC@k-s(ZB{$KArf5Kexr(8YwH(3|F$w^k18aj#GvBEk-Ce@C^PZT)WSwDxC zfvdh`Lc!CzqO9mB9$=4CtGdX|_kRnBe2|=9u9f}n-zn{OXnv?@-St>e ztm>ds!Wwp4ywX}q1xxfW<9>oDZDONmN)SW+>gwJ*#k(Rdd_IjI&p$cPj=9Ow^xU6b z%rJjo5J*wX^K9G0?34<8aDVap*(Mk!GZ{@CG5-3Kf^7!*NZS%r^|rz>+t28P*KybS z=j!>CmoI83Q>`1lZ-N~wASbwuA;q`F`)(pM&J9K!b6Dhw?FKo?y;gT&@FQ1^eZvC_ zL?vGGju`sU0?P$Mba;GMJ8!vRAFYp+<`c)av%UD;7R+C-ywTJy?gSd&uwM-dSzJ%W zLkcVUG2NttX^bcE6rA?PpiSScdRfq%$A?#=%#lmeriT~)Mgj9Wt`_>yCiLAv&}H09 zHez?fVF}u@{eFfhcK~Q_U7SgM86B>nK86IZ|GWA-_Pq(YO*~SSIqU0n@I_ifKM!vI zsi9cDqvW%zAc{_UrCotlQ6oe^lYHmSn8k8`HvIyv0BbD)0ibB zp6AaMJZVR#CV2tO>E$v%c9p~(U_Xdm-ZlOTaTHEi1iDbmkwcso^O^JE1w#`SSj6)? z$w5BoGgGAX>P)aFD-C$yo)-w^8l_!A0OTFU-Zq0Xg72`6neFrgr?Vo>@ z@JxyM->$|2yk%@6@0Ygqn;@AnO&;dVU-c?n`(I;hDAC>()@lPMe|HPiUT7-vFJP(^ zbI^!X5;ZUj8^h=&?WQycl0f#wE$n#k%ylS}CE2I#wneA80RZD`jrNaU;D*696J}0> zDK?$`z;hO{^$l~-QM&2v>Uhr=XWT)b$Oem?=vxhc{6kfE14IJ0v3YWxX?V+ zs{xN9&VwV+8{QpbX5$p26SaW_+RVS3RWR56#JfRAxs;)E{jMNKew0pf$F*;@-+}(K ztfHJ1k_uFIdX_Lh;A}!-tB-!5w-pFus{{K;fs(GXX3!DLiRk6@9+!0kl-KtZ>aJcp zO+JAFry%}BwB^K*Jpn4A0~8)U4Y3lf)|0t6u<=ys#L#-_U|8B82oHuSNNA1x%sGe* zP2%GF<@Vb%1NJhF5^1M0U60EW0YLZ7ggs$hBZ18n*hw@}nui|-1U zoa=`XtliVvu*V@}tf)?3!wo|`pZ!MlWxXxxE|o51H=loF>ja7P+M1M`3M0tO*imXY z07W{}8X-Kp3;UObgAKf-{Dt_^C(1WvPlJBF{~D~6UXwLPkQFm87d>DT+;|_Bk!OvC z=#+tS@$wLGr}kviu``lZTF(C@K2^{`LpML#b`ZHY0IP>Eeqm*5O<3*4wul7+V|&Zm z6LX)KHrF=p5z3*7ut&Sb|CgsH%7ED#~L~gD*{s|+aIkK-gAh< zl=q1!kM-uAQk_qb-xRy(`0<4NT7aW^|L6-UeIQ5G{)5bz=b`9cxzMW3end_IR4{ef zZ=JqJ)r`?>fwT)lK#Vheb6XX9s+=bU9N)@+T)UnL-EZT-;$gk9Rg6~UmN?? zHfxo*OKWd={`XP3_UlOFR()#(thc{9wOl!4AnJt@$5#BU?v6awyW-BugQtAzMZJGoF~udy3~KGjW)3&*YhPVKVuCjD0v8w*({}3s4FLz~f<` zmClCf3ch0e8E=@iV=Nj~0m5)q3s6Fk49~eg{qP2Gpi2b{Hb_={=iKRU^VS}3w2mwO^GSKa;bJxr1G?LQKUYEKP(`-PBIXC7w6qT} zBkH*k@=^$+<-=H5$;F6ILxGTF&4xeMF(JXB2-3x2_Vc070r}vx36Z>+ODHYnRs-VE z3rL)+;F28D{yK4GhnT_E%?;@j=ioof%b@YVH9#?f_5UKcGQQPr;qV!KYFpUQfmBhWAjE;$W8xX{JlKUyK#3|~U(kI&WM;}5q3)7NON-7`p{L^1T!j_Fve7FHj& zC+8EbD(CDAhw^td_!{l)%#AC_JbbycKPBkp!m%fl=fb}hg`{5bU9VC`vGNTbAwLnk zMs+}L-j)s<9=ITGcX zY$wALJ=ZAeqR(DeE2I*vxD=TCWgI8KH7a11ysxN-L=49Xr-#>C5?Oz|6-%#_kpLT( zd(}R!bWJ6hYBF38jK%jitOYoIEO>4=24{b^;+01_QwX@hV6gTM+hdv)K(98>%av3E zu77dGRx&0-1Edfl8)TFaCg=@aAVV@_@0PQ1@AXNIINs=n*TMWEvYssnR6lHiTkBKxds-t)ag~1eDu5P#8)h4lW><6 zSH6>V=X9}g)s{~Qf$@s*Xmv=!jHuHzDH@m-uJ-P z(BTH`_YOOK&jb63;(v~x(Ts={F#Xyz8TBxf9=V}_ z#V(OiVO9!~{svv`V@L;KIq?C=DC;cLw2I(cuV5;&QKm_@^RRen4gmoRlVAn4%Y^_x z231zlxv*k?WpL*R2z?F3F2}7g;vmKeC)w!h3=h+FlTz<#nC0b@3i*4YpPx=t{L{SR z6IDP8mt12)U{O)#p^rjK3Gai24e};kmK`QQIs%A;hJK#ui3Qh%oN*i%3OxS=&yj?b z-wf&o^qq2=6(ZoQg9SViR_gnd&+|JmGh;0m56uUx!BxyWGEKpf5D@L3%7Q9yl^<(^L#JD!9kOm;1?Wc9@N=et= z!qE)+U5vNei`mB@H!&gnCSc+TH{982Rx~_!O$F2^^QByIAA1N}%J2*vypSSeE@M7D zQzprIe@um40qtY!hrPk_LYiBe2O)`EGdV%&uG-C$Z2Cl{iV&J)?`N3zPw}{_j%&CF zZvYd2!3WkV=`Y+hN-3?i3DMyoaoLbN(WIiLei7FTnx!ARC=TZNK(BzpA6MfZSKibJ z2E|Dcwr^kbROab1%wSgR1y68R7J8ZVO`mUc#u>5ho%`EL%!b|&Dho*WvGaecFE!nL zFUVoztPf;07iL?~pxH0sb=u?g4R%>&e$(r&^f4@rK2Q!aa-v5U37d0(P#kaq^bY=` zN-9aiR*q)!b)*Xd1=a7(X;~vbc^oZrc{T=_qHv}LQnHF%GE}}=Ci#03|D6i4Ed-zH zHR}h|U9kW9kzlmXdY_F}8Q7>A>pO>cO8Q>n7lIhst$7}qWQ$(tLz*N0bt#_Xz!PN2w^ec<;Em^ZNf^sjK>+#hXlw3Dle0^VnL_Pt*k_r!S8 z_cgL!@D3>c5O9_Bi6kK+zJGQ$;014nZf=J7DD@V)j~ z(4q(^bZP&lGmnUQ@i}Lv!PwKr6q5gbhAAmjcKqiwSvV&}dzu{hM%>vL=?!CPhUlDN z9Mh}Lj6x^xXBXYBp!_>h5|t+3Cs9DfkiAVsTV+G& zqme1}cNk#?gcQ0#a-?IgoGnO<H($jy8MU?NHt@*~wINe*iS}}6V5Z_$FI8Sv8p{GZA>hIh| z>#?rvF5=}y@6{OBUPD5HSKByLKQ}6K@k`k|!FhUOyrKC>7NkQTL72&Yh7x2#r48r#yKTm43G-|5z zNW6j_H)E*4#c6mw_K=3Of}?Q|j1w2TFO4K;+e-5XU~dES-U*7T#DMJ8Bl4Km81siw zMa1bDfofYh=a8s+VEK4f2dV#0r`h&}z`xk|G!fSAx_c7u-pK- zood-uAOL+XMZ%M3-V|Zi47X$%yXqqE-bXl+h7xICS zQ9u8V87ML)*_E+WX6NL`q;Kse^`EMHZ(5#7zo>?o4TOgD1>+5xRE@v4SdlD+CSZ!R z`=%qR-ZRGZNPG2YXo`rjMOjqEPIAcEMA;5@CvM${3lLbkJ&%V zR zii~5PPom_fw{b8_xoB5;5c3oZbThaYB9S9Ffr5a8LZY@5p!pd?zdewjDgY@(17{<) zz_bk4B751%xdbb-lx$yW>_1c=08`Rzf*3|KpZZ8tV&MOP1__@VSW;EsF63eK_ODo^ zEQZ!eV~KIZ$In#uwLso0Bv{O$nq&P^*+-^aR5gTM3++#}2s`*G>N}EZwYd84&(Gx` zCUd`T2ibQpWDM#5!&Ir+Y}l-f<)t7hb=gNmUsw27xz`1iV^{qj@vI}YiZCqU9eQVB z4@!^c?+U2b^1&;&fwWq1X`0y|;~^L%A{_Hx;UMmYn~_Yux$hYZHz)Ux_Xml=^QGz{ZiV|7 zQ_nt<@XDY-G)&eUNOn{}4GkIstk_dkyRBWKMd4=mTp9@nhCV?RHsv4W`>fp3Rfn`{ z6?JD6JAN1%0N|#nLgTPl-`Y7Oh4Z7t@2X^PTXX9G00DdfpABkD{}&2|BSV@<*3lTE zV-?!ba~A)U4UOmmXV70!9#CD9KQm=N=;2KVL%O&BrjC1M=^dj&o?*}0X-C=?I2 zU%oY#^LxXW`mTOcL~a+{%+30OPOpqcq3>p~%Fo;gc=64#+ZJM)Th>n6Xx=l8DvZ}C z+7~$z@xEC7%hXA)kcGU>T#v&D7WT)(<@?%C626y!3TN4|u%+K8@*&&Fg(=auv!O{An$Rad0N1ygNb#wkE6Y8q_0tmR%34Q;zfCG17JmUCDu z+XA>G(g$}YUE3u*D#l=~&85GZ-6IeqiO9|pJBjkpE{=&5KIKuc6#(gD1%c@E{B?|) z?{7nQHqEc$?v4Ic?KNs&!R8#xcb2b_dhnH?k<}Z(6&T!gDgjvZVZ?lq^!>PrdKE9g zwnRQkY1cI|IpqLQ*ZtG5bfVfLh6&!E#0YcCfGJ`$18?TW8_V=MPrf80^>u(yXo-%k zMOgohMyO!KMAC7e{OBR;sjkKHfQ9w!I$XBA8Ae#mRa>+HkU&*!7*~-vge|#owfv18oTG~QC zEr5+dk*LQ~sV>iT5(CZcM!I_Z#n{HYK!q|-Vyv6ZW8Ki{6zV!Vw9A`#J2#vB#Gbc3 z?Tc$q+XfKt^<|w<*zmE*A3^39&Y~Azo2y3w#Dqm_Co*n0^Y74hxYUX+7yp(R09Os{ z`;A@$8N|&OZqt|Yn*fxq_X@*81aL2&5KNbyEx{sR`3Y~@qz4D+ZLx7D^pXRGQnLac z(SKE&l~!TWD+5!K2JI5r$NFME`bhV!+`3GCAL)oFLn<3X4GWMCtU3|qX(e8|G`dYXw0toie?@}{x zA^BGcKG7JTN()dGPCHj50B1)keyPe9_v_%UzYCJB!kgL3nQGc^WVk#&a}3F;Z?7KA zYs?yiPq$+hEgcMehs>0jQtHV<_8#Z;|0i%|v3cOz;lx_ng49R6(9wbMnmdX}tNi?0 z+$7fA2%JVYlc1D>d;j&b#AbTh{Lvl1xTGGg%!zz#=m427qxblDG@l;;VVibiO@~0@ zr++KL9HEJo5jp_Seeo0&Xh{F1r#Vg$iLYDsQez`@d4U5gQ}65^qaAATAI1&CzEl4B zn45F;m5JJm?w9Zmf;sPo!rt%4x`WWv}78BAimh zGbKNGuM2kDGwQa+g>7)BP~Gw;bYDl@knE#1R}Qq3qGsOaTHJXv?%4p4URH%05(DRl zQ~No9so5&25MAvUC%OECSrw4=9j8iBnj%eIT)ahbU&zgiC6q4g;A{+@tz_NX7{(B#TV$h8z|5z*QiC81Xb?(lUzIuxC4q zExFSlImzM#vh6zV=8_BXbY_82kyDe`85ufSiip;;6aO>n+-zZjBb5Bte0b$8%Zipg z2lBq1D<5}2^?NS;%h%o*!N;X|wgTGD3_~6A71vH=y-VxT5AQUhK|<)I2QX$ZqK36@ z9@>LRCo=>-A{uHEDX2A6b@2-cQ~)YMLQ_z0V$H`aR;vDJ$|Zgl zlY+}jO{Rfdwx9?@Qw!Qg9kocC`4ila-*ze%#bY+P2tdItpBH`YV+*%Cc7PQi0L~o3+zD?7 z^a{ObBoEkcKGoAzmNpl;tL1FhS$O4pWHI3{PE}WFT4>kM<_XZTfgeba|6-pfk!}2= zq-qD^nD-PRlH-O`#24O+j9Z>);!$WF2Od6#o79H>Xwo{1G?8K z!;k`h%%Ef!K0VlvY}xdh(2VRcwq1=Jm{kZk4(1`c!5?^|wWW;~6n6x4qA4}^jz%KF ztQv`x)UkIa*Jm`Fj?!^p{(TEqD_LGDs#}6hHgpp~R9R*4!zlSqpSNG9SDfx(km-V_sVDGrhYR*r`Y zdv)#wDqw$MY(HYY6j%!1E^=!yVe^Dhpw_MxY7t9Z#QIWzY z#psY-ePdk~YOb5Z)4xz^f|HmPcxJ3VZvk@>bPpXalmWXQ2`8v(ef_&&a`zpD5qT8*TY4+OQzN{9w#we|x z8SW%+Io2Qluq(#oCQzD5Dxvl90TWOl4MVE!Ssc{#Oc^{g(AWI8cue2#Q?)q%l+=0} ze&N$k>FnBOtm+`B^%dgq%N-n|EZ50|2tZ%A$>ODC^J9IWDNO zt%UO?nal`H;Jl{wga5lrU8HrN;|6GqzIApbv4}D1bF-rSDBGchyM)KPD#Ok3=Nk7- z(NNO`F;)S^;bHKHpc@Q92)gK}a)mYHPLj5Du}lP~Rdh@3rRnEdZaybn_x)l?i#*bH zsB)IMzC|74_lqnScQG|5i#>cT%X(uM$%1xE@^1-sl@j|wKM;gISZry@1U8NKX2Va)x%`G8JJ;$vy3b2 zlTJ7JMAVu$8_4zu#f5wl?Eu49UxAnQP%OtGo|=(*MHf0Jp|vI3Uxc0}u`&^b0QWv1 zoV^g+xU0VnrmG^fvg{It@PjNP-7m{AHX>dFaelzBGC3(q;o5X`z3YZAAR3j4!ozn% z^Pd1Df15}g3hW;BXXs)OJDS8?<{TUd=8O2Ky_o8Q91Y_(a97ZjXzjWH1B5|nt*!xC z#y9ctaV)pLuq`)#i|pW6V8;4~!UjuE$hN6TSQ7M3(p1c-=8osi(_enclidsI{rW&%H*pMqGsXV?#B=KR~~+F719lJg$g+@(pqiCuj|n> zYq$v66|7loZ$Hi9VSb3WM*#B~!@Kx?Ok+2-P3z(bYsS&%WM zKzRY5ED>6{&vyAS{&CK%R^a+W9H#KXQjH?h7lPYzM77|!-q;H@l75*!ZeJdn3@F`t zP-b}{?OqTsGB~~R?$_~z&J|D`w6cLk<`m7X^f$CNqj(K9$N&9AE8tZ-Oi2aqqTfnfw`XicuYS>-M-cnt*@QDYOvXn z@xa-4FIILG34#8VvM9XW_mBMFN0T4alNiI9|NVsiONT76RpIqVXbxjr z3`=#JtG_2!CWigMsHAr$Xa?$sR~}E1jIyxt+fVH1BSmF+v5p-Ar@+)JW3kB;oa<@= zY$dMyGGH?2@yRHI5W-POlou|g{{zykKpTN)_l{GT0J%A(nJq9mAXK**eGxc??IM~1dCrpjF@{Q0{1GxAz2~j*;tN6fHL;LE zZsstAcg($*lV)}|BYu13r^GN;~jZev@@v7 zUKdwSnkpRK8cpP4O|d}3mIz<{TDim^h<Q(_R)4mHar8ZY97gWc;)R^8qu-q0^58 zk870IA3)+raG6;1Bs647GHDx<19RlYs|~lXcQu(cAFVm1MfPRexwZvA`;^4^F1#eq}$v%cB_k3Pi1uBCmvYu)f7M+gG_DI44M-Olk$yhGd z770j_LYMoSH-oq32id1yDyrc(J@>%J?{(5` z>TEU3f|VwGi(qcG-e%Z8r-Ai`ArIY=_QMC-Y;SWlhyb8uuAcrJ-WpAoL5vB!c-^z< z*(|>b9YcITkuZ1wG=9Nc@G(n-Y|7^K*}6MqTD&5b)W0ma`&)!3%gDv_krV%feD8{A z=;_va#wO1wf@o9$xT~6HRvCw(lan104Gc_7Fu;yP#>`-uq`+yKQm)=jV3uh*{-TJE zP_zOPWm7uJgcLP=Yy8^4VW=6&Sr9+2IoxL`6~s+WlTZ?p5a|b1*4`I##?B12cIgsmT{@5P&Da> zcJN^w;Rup=X6CM^X&B&!(kW0#1Rrf#;4s?mQSU%u3>6wSCC!^OR7rBT3=K_}=&AQr zdaqV<)`nvN#HSUPw+Lr+CLM$lX?;k)zt};_=3T5UBoMUgveW z4<7Cg1eW*EAF#hd^6!_+shxTz^A5o6t*$+V7suD2+1+29^>5kah(C zJSZQ`;Ax?}bL3d32e+9L8p9YPckmn&e~H?^gHqB@{r=^%L>1s;V{JSzvm58~kIU>s z(=E36z<;fF903WXRYiLIs|AaNolwWyP_Sw9=-}-clrbi@V|zj(oY%}5C!0IsWP;Fw1wZW8{1NEOuyN)l>lE+k;(U zd`6ntYc9_jcqJy4zLK)zB^kSUB`M}O1Txb{OiYH1+)%q;?#VieY3%Gf6igM0AzA=z zm!4gd?M_Sl05D%GD|(W{krjqN3$!;&^#)Af+jSrLcN6a~FCDv?gBzPswME?@U}34& z%kpO3S->%3L8{A~O(WS2p!HLD&gO=P#-g)|m7=kwSH zHFHE0T(fWx3K~nPNrC#{r$S=vxq$V2CrFHiJf_ny0Vv)y$=n6j(#MUaCi%tb)q)!! z9+!A#-}{w!1sZYJMZLKUM*7WL?l?X4$4*m3IWB6%87<2OArX4xwEP6aWpI?s7!W## zTcBlt2y+2AZ$7_<0Q5HSLnOZKF{QEPDIkUDU~2&a6FAw_b!C$KZpT^Ky?R_o{Ys+O zCy7K%N-U#Rnp$MU?kyZnJIRazDNKVn1ZME5vC^+o4Hxy{SV+|Kz|K?U$7qj44DfA2 z-Ayo`7^zk-=TK^%Uk|Autx$fMucY|%#pS{8%SqzSmx z5ve)od9o@5*?s-!iMd2;A}<_Be>t|~a{J6Ft}OZq;}AEhpeg=mOH6DQeN2wRn1j-G zZ~(bxc)dvca@r!T9wTu9BYJ;5rp=lSS=VGCPBBvH5+_)dnpYPZy@J2CsHS=_b$*2j z-gEH5GQj3jD zYS;csVRqdnLMvHDEWSF*?Hk+~w*Ro>K)Z8v;V?1vr&Gl;ljFE(4{FH4hShB024Bnd zx3W^D+Hk#GHR=&El{*iFwJ%%A`R41>ewrSty*t#ux^AKWjZE3)Ym&&81$DEe))VB$y$!q>NVc1~x=u z&|)?4sw)PJRxNHNTic3<&|MAP_+7h_!GvqE<{Ts6m@DN#PGBQw2OH|9o&*8(Kx4lkF#xWTg4L>(SZBhljJ)+K66 z#4~_lJ6f1%(vamA)d7qq5=KX=gouda3##Uv9DTiIpVAlz+hZ&ZBQ8~l?Z>|1E!IKz z0Cq=A6hKWL&;?r52$_kYj_&2lDY8*P+1`r2uMG2s!LU!H%XjuAk7f~7y5JY5_BD6( zpgd2B^c1vWl~T$HJ~c!Y_dUI25|0K_I!)L1dFJoZu|-y82Pq~RF1`p%YO^qJaN~JQ zp0XF5_(y6NV-TXnF$d39IqUugTGowNHNJ|{6G!^Agvl<9d}fg`HoUy8=nTWo#n$JP zGqr7s@}uF{;Be!`8}{-tJ>O6#`CRns1I-3<8#9#UrajIZjdRu+-8=$2nD@RFbeKj? zmcYr_eba?vQ2hs=B-}Og6jm29GEL-aZhNeVHA$E$cz%}zZF*BWCcM|42T1`PPeC80 zHuyF%6)s;CkDr#}w>}a{8&7n@P*2nL0MM%YzL7R53*N2Nm4|eP9^ef>KdwZZ`u{OI zL?lvDfYDOq7&ZQ0hD;Y{sJIzG(qcH&xI$o{c0UaQEovuR7XCEr{f;5~rSU?E2`|>@mch@YF|h4_#6b|4Z}- zI41g*8?HAKUCoro=sn<;GhUY44T90aK@6K62KA_Id#YSj?Va*^f6M`>sFSe)K7*q@ zRK*%7#3>2gTJE=}n<*du!HO*-)@qtcZJT4fbV!hqxO&|qgP8xSB$fxa6`qSr3%ObU zqs!(Il?$#6bX9KUJTL z>@@heu+b{fRaTF2)@qiLDJe)vHeTORzmQ5Sco~u0ZaA`9+#D@mYk0fw`X<@uoP#oI zjfHF{&F`l5JhYDW9WrMJ>g8YW->@!vI&1S)wZV-bio;#1N~%+_BBpU+z@C3RI*bmH|3{ybIFjNIFi#+W0m)_T{+|MrKZx>Y5yAbj{Ex=A7 zVy5l+!I#6Kavi<=4yPYOmN8b{ID$RHCWz_OF-qBpeh!uB5Ga_gQ+ z6L@&FQOPbWo+z!Y&-5ZnpdlI~(lJ@K-z!!%4loP(sSp

  • nL^F8J3Ij2cOT*Iv8M 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
    +
    + -

    {{responce}}

    + +{% endblock %} + +{% block script %} + + + + {% endblock %} \ No newline at end of file diff --git a/Sources/src/app/views/Templates/page/addfriend.html.twig b/Sources/src/app/views/Templates/page/addfriend.html.twig index 7a74ced4..507101a9 100644 --- a/Sources/src/app/views/Templates/page/addfriend.html.twig +++ b/Sources/src/app/views/Templates/page/addfriend.html.twig @@ -12,7 +12,7 @@

    Liste d'ami

    diff --git a/Sources/src/app/views/Templates/page/addmember.html.twig b/Sources/src/app/views/Templates/page/addmember.html.twig index 5d7689db..368687fe 100644 --- a/Sources/src/app/views/Templates/page/addmember.html.twig +++ b/Sources/src/app/views/Templates/page/addmember.html.twig @@ -12,7 +12,7 @@

    Coaching

    diff --git a/Sources/src/app/views/Templates/page/analyze.html.twig b/Sources/src/app/views/Templates/page/analyze.html.twig index 6adc09f2..f22c8801 100755 --- a/Sources/src/app/views/Templates/page/analyze.html.twig +++ b/Sources/src/app/views/Templates/page/analyze.html.twig @@ -4,63 +4,47 @@ {% block css %}{{css}}{% endblock %} -{% block title %}Analyses - HearthTrack{% endblock %} +{% block title %}Exercices - HearthTrack{% endblock %} {% block user %}{{user}} - {{role}}{% endblock %} {% block body %} -
    -

    Analyses

    +
    +

    Exercices

    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - {% for analyze in analyzes %} - - - - - - - - - {% endfor %} - -
    DateTypeBMPKM/HDistance
    DateTypeBPMKM/HDistance
    {{analyze.date}}{{analyze.type}}{{analyze.bpm}}{{analyze.kmh}} Km/H{{analyze.distance}} KmEn savoir plus
    -
    -
    -
    -
    -
    -{% endblock %} -{% block script %} - - - - +
    +
    +
    + Type : + Intensité : + Date : + +
    +
    + {% for analyze in analyzes %} + + {{analyze.date}} + {{analyze.heureDebut}} + {{analyze.heureFin}} + {{analyze.type}} + {{analyze.effortRessenti}} + {{analyze.variabilite}} + {{analyze.variance}} + {{analyze.ecartType}} + {{analyze.moyenne}} Bpm + {{analyze.max}} Bpm + {{analyze.min}} Bpm + {{analyze.temperature}} °C + En savoir plus + + {% endfor %} +
    +
    + + +

    {{responce}}

    {% endblock %} \ No newline at end of file diff --git a/Sources/src/app/views/Templates/page/coaching.html.twig b/Sources/src/app/views/Templates/page/coaching.html.twig index e1ada5ac..de35d6d6 100755 --- a/Sources/src/app/views/Templates/page/coaching.html.twig +++ b/Sources/src/app/views/Templates/page/coaching.html.twig @@ -13,7 +13,7 @@

    Coaching

    diff --git a/Sources/src/app/views/Templates/page/exercice.html.twig b/Sources/src/app/views/Templates/page/exercice.html.twig index 25e69e4e..371a3317 100755 --- a/Sources/src/app/views/Templates/page/exercice.html.twig +++ b/Sources/src/app/views/Templates/page/exercice.html.twig @@ -9,10 +9,11 @@ {% block user %}{{user}} - {{role}}{% endblock %} {% block body %} +

    Exercices

    @@ -31,12 +32,33 @@ + {% for exo in exos %} - {{exo.date}} - {{exo.description}} - {{exo.location}} - {{exo.feedback}} + {{ exo.date }} + {{ exo.description }} + +
    + + + {{ exo.feedback }} {% endfor %} diff --git a/Sources/src/app/views/Templates/page/friend.html.twig b/Sources/src/app/views/Templates/page/friend.html.twig index 0b95b7a4..03a5e4b7 100755 --- a/Sources/src/app/views/Templates/page/friend.html.twig +++ b/Sources/src/app/views/Templates/page/friend.html.twig @@ -12,7 +12,7 @@

    Liste d'ami

    diff --git a/Sources/src/app/views/Templates/page/notification.html.twig b/Sources/src/app/views/Templates/page/notification.html.twig index ee8c51c1..9f84ee37 100755 --- a/Sources/src/app/views/Templates/page/notification.html.twig +++ b/Sources/src/app/views/Templates/page/notification.html.twig @@ -23,14 +23,16 @@ Lu De: Description + Date {% for mail in mails %} - {{mail.urgence}} {{mail.statut}} + {{mail.idathlete}} {{mail.message}} + {{ mail.date }} {% endfor %} diff --git a/Sources/src/app/views/Templates/page/profile.html.twig b/Sources/src/app/views/Templates/page/profile.html.twig index 481842df..751feff0 100644 --- a/Sources/src/app/views/Templates/page/profile.html.twig +++ b/Sources/src/app/views/Templates/page/profile.html.twig @@ -12,7 +12,7 @@

    Profile

    diff --git a/Sources/src/app/views/Templates/page/settings.html.twig b/Sources/src/app/views/Templates/page/settings.html.twig index bcbe9a12..d27b6509 100644 --- a/Sources/src/app/views/Templates/page/settings.html.twig +++ b/Sources/src/app/views/Templates/page/settings.html.twig @@ -12,7 +12,7 @@

    Paramètres

    diff --git a/Sources/src/data/core/database/ActivityEntity.php b/Sources/src/data/core/database/ActivityEntity.php index 6eda351d..7f14956e 100644 --- a/Sources/src/data/core/database/ActivityEntity.php +++ b/Sources/src/data/core/database/ActivityEntity.php @@ -42,7 +42,7 @@ class ActivityEntity { return $this->effortRessenti; } - public function getVariabilite() { + public function getVariability() { return $this->variabilite; } diff --git a/Sources/src/data/core/database/ActivityMapper.php b/Sources/src/data/core/database/ActivityMapper.php index 52e5a872..296c03c8 100644 --- a/Sources/src/data/core/database/ActivityMapper.php +++ b/Sources/src/data/core/database/ActivityMapper.php @@ -1,7 +1,9 @@ setIdActivity($data['idActivity']); + if (isset($activityData['idactivite'])) { + $activity->setIdActivity($activityData['idactivite']); } if (isset($activityData['type'])) { - $activity->setType($data['type']); + $activity->setType($activityData['type']); } if (isset($activityData['date'])) { - $activity->setDate($data['date']); + $activity->setDate($activityData['date']); } - if (isset($activityData['heureDebut'])) { - $activity->setHeureDebut($data['heureDebut']); + if (isset($activityData['heurededebut'])) { + $activity->setHeureDebut($activityData['heurededebut']); } - if (isset($activityData['heureFin'])) { - $activity->setHeureFin($data['heureFin']); + if (isset($activityData['heuredefin'])) { + $activity->setHeureFin($activityData['heuredefin']); } - if (isset($activityData['effortRessenti'])) { - $activity->setEffortRessenti($data['effortRessenti']); + if (isset($activityData['effortressent'])) { + $activity->setEffortRessenti($activityData['effortressent']); } if (isset($activityData['variabilite'])) { - $activity->setVariabilite($data['variabilite']); + $activity->setVariabilite($activityData['variabilite']); } if (isset($activityData['variance'])) { - $activity->setVariance($data['variance']); + $activity->setVariance($activityData['variance']); } - if (isset($activityData['ecartType'])) { - $activity->setEcartType($data['ecartType']); + if (isset($activityData['ecarttype'])) { + $activity->setEcartType($activityData['ecarttype']); } if (isset($activityData['moyenne'])) { - $activity->setMoyenne($data['moyenne']); + $activity->setMoyenne($activityData['moyenne']); } if (isset($activityData['maximum'])) { - $activity->setMaximum($data['maximum']); + $activity->setMaximum($activityData['maximum']); } if (isset($activityData['minimum'])) { - $activity->setMinimum($data['minimum']); + $activity->setMinimum($activityData['minimum']); } - if (isset($activityData['temperatureMoyenne'])) { - $activity->setTemperatureMoyenne($data['temperatureMoyenne']); + if (isset($activityData['temperaturemoyenne'])) { + $activity->setTemperatureMoyenne($activityData['temperaturemoyenne']); } $activityEntities[] = $activity; } - return $activityEntities; } /** * @throws \Exception */ - public function ActivityEntityToModel(ActivityEntity $activiteEntity):Activity{ + public function ActivityEntityToModel(ActivityEntity $activiteEntity):Activity { + $date = new DateTime($activiteEntity->getDate()); + $heureDebut = new \DateTime($activiteEntity->getHeureDebut()); + $heureFin = new \DateTime($activiteEntity->getHeureFin()); + $effortRessenti = intval($activiteEntity->getEffortRessenti()); + $variability = floatval($activiteEntity->getVariability()); + $variance = floatval($activiteEntity->getVariance()); + $ecartType = floatval($activiteEntity->getEcartType()); $act = new Activity( $activiteEntity->getIdActivity(), $activiteEntity->getType(), - $activiteEntity->getDate(), - $activiteEntity->getHeureDebut(), - $activiteEntity->getHeureFin(), - $activiteEntity->getEffortRessenti(), - $activiteEntity->getVariabilite(), - $activiteEntity->getVariance(), - $activiteEntity->getEcartType(), + $date, + $heureDebut, + $heureFin, + $effortRessenti, + $variability, + $variance, + $ecartType, $activiteEntity->getMoyenne(), $activiteEntity->getMaximum(), $activiteEntity->getMinimum(), - $activiteEntity->getTemperatureMoyenne() + $activiteEntity->getTemperatureMoyenne(), + 'false' ); return $act; @@ -103,7 +112,7 @@ class ActivityMapper { $act->setHeureDebut($act->getHeureDebut()); $act->setHeureFin($act->getHeureFin()); $act->setEffortRessenti($act->getEffortRessenti()); - $act->setVariabilite($act->getVariabilite()); + $act->setVariabilite($act->getVariability()); $act->setVariance($act->getVariance()); $act->setEcartType($act->getEcartType()); $act->setMoyenne($act->getMoyenne()); diff --git a/Sources/src/data/core/database/AthleteEntity.php b/Sources/src/data/core/database/AthleteEntity.php index f9b809ac..6711b5c6 100644 --- a/Sources/src/data/core/database/AthleteEntity.php +++ b/Sources/src/data/core/database/AthleteEntity.php @@ -6,6 +6,7 @@ class AthleteEntity { private $idAthlete; private $nom; private $prenom; + private $username; private $email; private $sexe; private $taille; @@ -27,6 +28,10 @@ class AthleteEntity { return $this->prenom; } + public function getUsername(){ + return $this->username; + } + public function getEmail() { return $this->email; } @@ -55,6 +60,7 @@ class AthleteEntity { return $this->isCoach; } + // Setters public function setIdAthlete($idAthlete) { $this->idAthlete = $idAthlete; @@ -68,6 +74,10 @@ class AthleteEntity { $this->prenom = $prenom; } + public function setUsername($username){ + $this->username = $username; + } + public function setEmail($email) { $this->email = $email; } diff --git a/Sources/src/data/core/database/AthleteGateway.php b/Sources/src/data/core/database/AthleteGateway.php index 9a15d67b..22a78fbd 100644 --- a/Sources/src/data/core/database/AthleteGateway.php +++ b/Sources/src/data/core/database/AthleteGateway.php @@ -37,21 +37,21 @@ class AthleteGateway { public function getAthleteByFirstName(string $firstName): array { $query = "SELECT * FROM Athlete WHERE prenom = :firstName AND isCoach=FALSE"; - $params = [':firstName' => [$firstName, PDO::PARAM_STR]]; + $params = [':firstName' => $firstName]; return $this->connection->executeWithErrorHandling($query, $params); } public function getAthleteByEmail(string $email): array { $query = "SELECT * FROM Athlete WHERE email = :email AND isCoach=FALSE"; - $params = [':email' => [$email, PDO::PARAM_STR]]; + $params = [':email' => $email]; return $this->connection->executeWithErrorHandling($query, $params); } public function getAthleteByGender(string $gender): array { $query = "SELECT * FROM Athlete WHERE sexe = :gender AND isCoach=FALSE"; - $params = [':gender' => [$gender, PDO::PARAM_STR]]; + $params = [':gender' => $gender]; return $this->connection->executeWithErrorHandling($query, $params); } diff --git a/Sources/src/data/core/database/AthleteMapper.php b/Sources/src/data/core/database/AthleteMapper.php index 24d6eb6d..08b39822 100644 --- a/Sources/src/data/core/database/AthleteMapper.php +++ b/Sources/src/data/core/database/AthleteMapper.php @@ -26,6 +26,10 @@ class AthleteMapper { $athlete->setPrenom($athleteData['prenom']); } + if (isset($athleteData['username'])) { + $athlete->setUsername($athleteData['username']); + } + if (isset($athleteData['email'])) { $athlete->setEmail($athleteData['email']); } @@ -63,16 +67,19 @@ class AthleteMapper { public function athleteEntityToModel(AthleteEntity $athleteEntity): User { $role = new Athlete(); // Utilisez la classe Athlete $date = new DateTime($athleteEntity->getDateNaissance()); + $poids = floatval($athleteEntity->getPoids()); + $taille = floatval($athleteEntity->getTaille()); + $user = new User( $athleteEntity->getIdAthlete(), $athleteEntity->getNom(), $athleteEntity->getPrenom(), - "myUsername", + $athleteEntity->getUsername(), $athleteEntity->getEmail(), $athleteEntity->getMotDePasse(), $athleteEntity->getSexe(), - $athleteEntity->getTaille(), - $athleteEntity->getPoids(), + $taille, + $poids, $date, $role ); @@ -86,6 +93,7 @@ class AthleteMapper { $ath->setIdAthlete($user->getId()); $ath->setNom($user->getNom()); $ath->setPrenom($user->getPrenom()); + $ath->setUsername($user->getUsername()); $ath->setEmail($user->getEmail()); $ath->setSexe($user->getSexe()); $ath->setTaille($user->getTaille()); diff --git a/Sources/src/data/core/database/Connexion.php b/Sources/src/data/core/database/Connexion.php index 27e88aa9..1b3d898c 100644 --- a/Sources/src/data/core/database/Connexion.php +++ b/Sources/src/data/core/database/Connexion.php @@ -44,26 +44,7 @@ class Connexion extends \PDO { } public function getResults(): array { - $results = $this->stmt->fetchAll(\PDO::FETCH_ASSOC); - // Convertissez les colonnes "taille" et "poids" en nombres - foreach ($results as &$row) { - if($row['identrainement']) { - $row['identrainement'] = floatval(($row['identrainement'])); - } - if($row['latitude']) { - $row['latitude'] = floatval(($row['latitude'])); - } - if($row['longitude']) { - $row['longitude'] = floatval(($row['longitude'])); - } - if($row['taille']) { - $row['taille'] = floatval($row['taille']); - } - if($row['poids']) { - $row['poids'] = floatval($row['poids']); - } - } - return $results; + return $this->stmt->fetchAll(\PDO::FETCH_ASSOC); } } ?> \ No newline at end of file diff --git a/Sources/src/data/core/database/EntrainementMapper.php b/Sources/src/data/core/database/EntrainementMapper.php index 8f9f8afc..25911d7f 100644 --- a/Sources/src/data/core/database/EntrainementMapper.php +++ b/Sources/src/data/core/database/EntrainementMapper.php @@ -52,11 +52,15 @@ class EntrainementMapper public function entrainementEntityToModel(EntrainementEntity $entrainementEntity): Training { $date = new DateTime($entrainementEntity->getDate()); + $idTraining = intval($entrainementEntity->getIdEntrainement()); + $latitude = floatval($entrainementEntity->getLatitude()); + $longitude = floatval($entrainementEntity->getLongitude()); + return new Training( - $entrainementEntity->getIdEntrainement(), + $idTraining, $date, - $entrainementEntity->getLatitude(), - $entrainementEntity->getLongitude(), + $latitude, + $longitude, $entrainementEntity->getDescription(), $entrainementEntity->getFeedback() ); diff --git a/Sources/src/data/core/database/NotificationEntity.php b/Sources/src/data/core/database/NotificationEntity.php index 02b9ebf0..69ecfbf9 100644 --- a/Sources/src/data/core/database/NotificationEntity.php +++ b/Sources/src/data/core/database/NotificationEntity.php @@ -12,6 +12,7 @@ class NotificationEntity private $statut; private $urgence; private $idAthlete; + public function getIdNotif(): int { return $this->idNotif; diff --git a/Sources/src/data/core/database/NotificationGateway.php b/Sources/src/data/core/database/NotificationGateway.php index 19715e38..8ee36c5b 100644 --- a/Sources/src/data/core/database/NotificationGateway.php +++ b/Sources/src/data/core/database/NotificationGateway.php @@ -2,6 +2,8 @@ namespace Database; +use Shared\Log; + class NotificationGateway { private Connexion $connection; @@ -16,4 +18,10 @@ class NotificationGateway $res = $this->connection->executeWithErrorHandling($query); return $res; } + + public function addNotification(NotificationEntity $notif){ + $query = "INSERT INTO Notification (idnotif, message, date, statut, urgence, athleteid) VALUES (:idNotif, :message, :date, :statut, :urgence, :idAthlete)"; + $params = [':idNotif'=>$notif->getIdNotif(), ':message'=>$notif->getMessage(), ':date'=>$notif->getDate(), ':statut'=>$notif->getStatut(), ':urgence'=>$notif->getUrgence(), ':idAthlete'=>$notif->getIdAthlete()]; + return $this->connection->executeWithErrorHandling($query, $params); + } } \ No newline at end of file diff --git a/Sources/src/data/core/database/NotificationMapper.php b/Sources/src/data/core/database/NotificationMapper.php index 49b56160..51622e96 100644 --- a/Sources/src/data/core/database/NotificationMapper.php +++ b/Sources/src/data/core/database/NotificationMapper.php @@ -64,7 +64,7 @@ class NotificationMapper $notif = new NotificationEntity(); $notif->setIdNotif($notification->getId()); $notif->setMessage($notification->getMessage()); - $notif->setDate($notification->getDate()); + $notif->setDate($notification->getDate()->format('Y-m-d H:i:s')); $notif->setStatut($notification->getStatut()); $notif->setUrgence($notification->getUrgence()); $notif->setIdAthlete($notification->getToUserId()); diff --git a/Sources/src/data/model/Activity.php b/Sources/src/data/model/Activity.php index ec723b3b..29d47cde 100644 --- a/Sources/src/data/model/Activity.php +++ b/Sources/src/data/model/Activity.php @@ -53,6 +53,7 @@ class Activity * @throws \Exception Si l'effort ressenti n'est pas compris entre 0 et 5. */ public function __construct( + int $idActivity, String $type, \DateTime $date, \DateTime $heureDebut, @@ -67,7 +68,7 @@ class Activity float $avrTemperature, bool $hasPause ) { - $this->idActivity = self::generateId(); + $this->idActivity = $idActivity; $this->type = $type; $this->date = $date; $this->heureDebut = $heureDebut; diff --git a/Sources/src/data/model/Notification.php b/Sources/src/data/model/Notification.php index a3c66268..85dbfcaf 100644 --- a/Sources/src/data/model/Notification.php +++ b/Sources/src/data/model/Notification.php @@ -9,7 +9,7 @@ class Notification private int $idNotif; private string $message; private \DateTime $date; - private string $statut; + private bool $statut; private string $urgence; private int $toUserId; /** diff --git a/Sources/src/data/stub/repository/NotificationRepository.php b/Sources/src/data/stub/repository/NotificationRepository.php index e712a676..249e017d 100644 --- a/Sources/src/data/stub/repository/NotificationRepository.php +++ b/Sources/src/data/stub/repository/NotificationRepository.php @@ -2,6 +2,7 @@ namespace Stub; +use DateTime; use Repository\INotificationRepository; use Model\Notification; @@ -10,13 +11,13 @@ class NotificationRepository implements INotificationRepository private $notifications = []; // Array to store notifications public function __construct() { + $date = DateTime::createFromFormat('d/m/Y', date('d/m/Y')); // Initialize with some sample notifications for user IDs 1, 2, and 3 - $this->notifications[] = new Notification(1, 'info', 'Welcome to our service!'); - $this->notifications[] = new Notification(2, 'alert', 'Your subscription is about to expire.'); - $this->notifications[] = new Notification(3, 'info', 'New features available.'); - $this->notifications[] = new Notification(1, 'reminder', 'Don’t forget your upcoming appointment.'); - $this->notifications[] = new Notification(2, 'update', 'Service update completed.'); - // Add more notifications as needed + $this->notifications[] = new Notification(1, 'info', $date,'Welcome to our service!', '1', 1); + $this->notifications[] = new Notification(2, 'info', $date,'Welcome to our service!', '1', 1); + $this->notifications[] = new Notification(3, 'info', $date,'Welcome to our service!', '1', 1); + $this->notifications[] = new Notification(1, 'info', $date,'Welcome to our service!', '1', 1); + $this->notifications[] = new Notification(2, 'info', $date,'Welcome to our service!', '1', 1); } public function getItemById(int $id) { From ca3e2591f0d1a6e20df95cd5882d708506c3fe98 Mon Sep 17 00:00:00 2001 From: palevrault Date: Thu, 21 Dec 2023 10:59:17 +0100 Subject: [PATCH 32/48] Correction AthleteMapper --- Sources/src/data/core/database/AthleteMapper.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/src/data/core/database/AthleteMapper.php b/Sources/src/data/core/database/AthleteMapper.php index 08b39822..aff595ac 100644 --- a/Sources/src/data/core/database/AthleteMapper.php +++ b/Sources/src/data/core/database/AthleteMapper.php @@ -14,8 +14,8 @@ class AthleteMapper { foreach ($data as $athleteData) { $athlete = new AthleteEntity(); - if (isset($athleteData['idathlete'])) { - $athlete->setIdAthlete($athleteData['idathlete']); + if (isset($athleteData['idAthlete'])) { + $athlete->setIdAthlete($athleteData['idAthlete']); } if (isset($athleteData['nom'])) { From 39f5026f996cbb4e42068a5a4a9dbfe2115d56a4 Mon Sep 17 00:00:00 2001 From: palevrault Date: Thu, 21 Dec 2023 11:01:59 +0100 Subject: [PATCH 33/48] Correction AthleteMapper --- Sources/src/data/core/database/AthleteMapper.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Sources/src/data/core/database/AthleteMapper.php b/Sources/src/data/core/database/AthleteMapper.php index aff595ac..e9572ca4 100644 --- a/Sources/src/data/core/database/AthleteMapper.php +++ b/Sources/src/data/core/database/AthleteMapper.php @@ -46,16 +46,16 @@ class AthleteMapper { $athlete->setPoids($athleteData['poids']); } - if (isset($athleteData['motdepasse'])) { - $athlete->setMotDePasse($athleteData['motdepasse']); + if (isset($athleteData['motDePasse'])) { + $athlete->setMotDePasse($athleteData['motDePasse']); } - if (isset($athleteData['datenaissance'])) { - $athlete->setDateNaissance($athleteData['datenaissance']); + if (isset($athleteData['dateNaissance'])) { + $athlete->setDateNaissance($athleteData['dateNaissance']); } - if (isset($athleteData['iscoach'])) { - $athlete->setIsCoach($athleteData['iscoach']); + if (isset($athleteData['isCoach'])) { + $athlete->setIsCoach($athleteData['isCoach']); } $athleteEntities[] = $athlete; From d092f7c318b2609cee4fd67442d94ae80e4877af Mon Sep 17 00:00:00 2001 From: palevrault Date: Thu, 21 Dec 2023 11:12:28 +0100 Subject: [PATCH 34/48] Ajout de notif dans la BD --- Sources/src/app/controller/AthleteController.php | 1 - Sources/src/data/core/database/NotificationGateway.php | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Sources/src/app/controller/AthleteController.php b/Sources/src/app/controller/AthleteController.php index 1f8b0bf6..0abf76a2 100644 --- a/Sources/src/app/controller/AthleteController.php +++ b/Sources/src/app/controller/AthleteController.php @@ -93,7 +93,6 @@ class AthleteController extends BaseController $listSearch = $athleteGateway->getAthlete($username); $map = new AthleteMapper(); $athleteEntity = $map->athleteSqlToEntity($listSearch); - $listUsers = []; foreach ($athleteEntity as $entity) { $user = $map->athleteEntityToModel($entity); diff --git a/Sources/src/data/core/database/NotificationGateway.php b/Sources/src/data/core/database/NotificationGateway.php index 8ee36c5b..c1050ab9 100644 --- a/Sources/src/data/core/database/NotificationGateway.php +++ b/Sources/src/data/core/database/NotificationGateway.php @@ -20,8 +20,8 @@ class NotificationGateway } public function addNotification(NotificationEntity $notif){ - $query = "INSERT INTO Notification (idnotif, message, date, statut, urgence, athleteid) VALUES (:idNotif, :message, :date, :statut, :urgence, :idAthlete)"; - $params = [':idNotif'=>$notif->getIdNotif(), ':message'=>$notif->getMessage(), ':date'=>$notif->getDate(), ':statut'=>$notif->getStatut(), ':urgence'=>$notif->getUrgence(), ':idAthlete'=>$notif->getIdAthlete()]; + $query = "INSERT INTO Notification (message, date, statut, urgence, athleteid) VALUES (:message, :date, :statut, :urgence, :idAthlete)"; + $params = [':message'=>$notif->getMessage(), ':date'=>$notif->getDate(), ':statut'=>$notif->getStatut(), ':urgence'=>$notif->getUrgence(), ':idAthlete'=>$notif->getIdAthlete()]; return $this->connection->executeWithErrorHandling($query, $params); } } \ No newline at end of file From 07b223c6330fe025d5f2a38a81b5c0da9f85c9d5 Mon Sep 17 00:00:00 2001 From: palevrault Date: Thu, 21 Dec 2023 12:16:45 +0100 Subject: [PATCH 35/48] correction de trucs --- Sources/src/app/controller/AthleteController.php | 6 +++++- Sources/src/data/core/database/AthleteGateway.php | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Sources/src/app/controller/AthleteController.php b/Sources/src/app/controller/AthleteController.php index 0abf76a2..6f37a675 100644 --- a/Sources/src/app/controller/AthleteController.php +++ b/Sources/src/app/controller/AthleteController.php @@ -90,7 +90,11 @@ class AthleteController extends BaseController } else { try { $athleteGateway = new AthleteGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); - $listSearch = $athleteGateway->getAthlete($username); + if($username==null){ + $listSearch=$athleteGateway->getAthlete(); + } else { + $listSearch = $athleteGateway->getAthleteByName($username); + } $map = new AthleteMapper(); $athleteEntity = $map->athleteSqlToEntity($listSearch); $listUsers = []; diff --git a/Sources/src/data/core/database/AthleteGateway.php b/Sources/src/data/core/database/AthleteGateway.php index 22a78fbd..323be996 100644 --- a/Sources/src/data/core/database/AthleteGateway.php +++ b/Sources/src/data/core/database/AthleteGateway.php @@ -30,7 +30,7 @@ class AthleteGateway { public function getAthleteByName(string $name): array { $query = "SELECT * FROM Athlete WHERE nom = :name AND isCoach=FALSE"; - $params = [':name' => [$name, PDO::PARAM_STR]]; + $params = [':name' => $name]; return $this->connection->executeWithErrorHandling($query, $params); } From 98eddfc9f7fced41053f54fb2f1e4b705a7661b8 Mon Sep 17 00:00:00 2001 From: anperederi Date: Thu, 21 Dec 2023 18:55:53 +0100 Subject: [PATCH 36/48] update controllers --- Sources/src/app/controller/AthleteController.php | 2 +- Sources/src/app/controller/CoachController.php | 15 ++++++++------- .../src/app/controller/HeartRateController.php | 1 - 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Sources/src/app/controller/AthleteController.php b/Sources/src/app/controller/AthleteController.php index 1f8b0bf6..2384e5c1 100644 --- a/Sources/src/app/controller/AthleteController.php +++ b/Sources/src/app/controller/AthleteController.php @@ -120,7 +120,7 @@ class AthleteController extends BaseController return $response; } - #[Route(path: '/analyses', name: 'analyses', methods: ['GET'])] + #[Route(path: '/analyses/{id}', name: 'analyses', methods: ['GET'])] public function analyses(): Response { try { diff --git a/Sources/src/app/controller/CoachController.php b/Sources/src/app/controller/CoachController.php index 9deb8b3d..bf409633 100644 --- a/Sources/src/app/controller/CoachController.php +++ b/Sources/src/app/controller/CoachController.php @@ -7,6 +7,7 @@ use App\Router\Request\IRequest; use App\Router\Response\Response; use App\Router\Response\IResponse; +use Manager\DataManager; use Shared\Attributes\Route; use Twig\Environment; use Data\Core\Preferences; @@ -16,16 +17,16 @@ use Shared\Log; class CoachController extends BaseController { - private ICoachManager $coachManager; - private $security; - private Environment $twig; +// private ICoachManager $coachManager; +// private $security; +// private Environment $twig; protected Preferences $preference; - public function __construct(DataManager $dataManager, Security $security) + public function __construct() { - session_start(); - $this->coachManager = $dataManager->coachMgr; - $this->security = $security; +// session_start(); +// $this->coachManager = $dataManager->coachMgr; +// $this->security = $security; $this->preference = new Preferences(); } diff --git a/Sources/src/app/controller/HeartRateController.php b/Sources/src/app/controller/HeartRateController.php index 9e7090e9..e250f829 100644 --- a/Sources/src/app/controller/HeartRateController.php +++ b/Sources/src/app/controller/HeartRateController.php @@ -18,7 +18,6 @@ class HeartRateController extends BaseController public function __construct() { - session_start(); $this->preference = new Preferences(); } From 1b4448fecd0d8c6e6fe837187fc444f4422be03d Mon Sep 17 00:00:00 2001 From: anperederi Date: Thu, 21 Dec 2023 20:12:03 +0100 Subject: [PATCH 37/48] update activities --- .../src/app/controller/AthleteController.php | 86 ++++++++---- .../views/Templates/page/activity.html.twig | 6 +- .../views/Templates/page/analyze.html.twig | 2 +- .../data/core/database/ActivityGateway.php | 2 +- .../src/data/core/database/AnalyzeEntity.php | 79 +++++++++++ .../src/data/core/database/AnalyzeGateway.php | 24 ++++ .../src/data/core/database/AnalyzeMapper.php | 123 ++++++++++++++++++ .../src/data/core/database/data/athlete.sql | 6 + .../data/core/database/data/friendship.sql | 29 +++++ .../core/database/{db.sql => data/tables.sql} | 29 +---- 10 files changed, 333 insertions(+), 53 deletions(-) create mode 100644 Sources/src/data/core/database/AnalyzeEntity.php create mode 100644 Sources/src/data/core/database/AnalyzeGateway.php create mode 100644 Sources/src/data/core/database/AnalyzeMapper.php create mode 100644 Sources/src/data/core/database/data/athlete.sql create mode 100644 Sources/src/data/core/database/data/friendship.sql rename Sources/src/data/core/database/{db.sql => data/tables.sql} (71%) diff --git a/Sources/src/app/controller/AthleteController.php b/Sources/src/app/controller/AthleteController.php index 2384e5c1..4a317ec6 100644 --- a/Sources/src/app/controller/AthleteController.php +++ b/Sources/src/app/controller/AthleteController.php @@ -4,6 +4,7 @@ namespace App\Controller; use Database\ActivityGateway; use Database\ActivityMapper; +use Database\AnalyzeGateway; use Database\AthleteEntity; use Database\AthleteMapper; use Database\EntrainementGateway; @@ -120,36 +121,38 @@ class AthleteController extends BaseController return $response; } - #[Route(path: '/analyses/{id}', name: 'analyses', methods: ['GET'])] - public function analyses(): Response + #[Route(path: '/analyze/{id}', name: 'analyze_details', methods: ['GET'])] + public function activityDetails(): Response { try { - $activityGateway = new ActivityGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); - $listSearch = $activityGateway->getActivity(); - $map = new ActivityMapper(); - $activityGateway = $map->activitySqlToEntity($listSearch); - $listActivity = []; - foreach ($activityGateway as $entity) { - $activity = $map->activityEntityToModel($entity); - $listActivity[] = ['idactivity' => number_format($activity->getIdActivity(), 1), 'type' => $activity->getType(), - 'date' => $activity->getDate()->format("D j F Y"), 'heureDebut' => $activity->getHeureDebut()->format("H\h i"), 'heureFin' => $activity->getHeureFin()->format("H\h i"), - 'effortRessenti' => $activity->getEffortRessenti(), 'variabilite' => $activity->getVariability(), 'variance' => $activity->getVariance(), - 'ecartType' => $activity->getStandardDeviation(), 'moyenne' => $activity->getAverage(), - 'max' => $activity->getMaximum(), 'min' => $activity->getMinimum(), 'temperature' =>$activity->getAvrTemperature()]; - } + // Utilisez $id pour récupérer les détails de l'activité depuis la base de données +// $activityGateway = new ActivityGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); +// $activityEntity = $activityGateway->getActivityById($id); // Assurez-vous d'avoir une méthode similaire dans votre gateway + + $analyzeGateway = new AnalyzeGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); + $analyzeEntity = $analyzeGateway->getFrequenceCardiaque(); + +// $map = new ActivityMapper(); +// $activityModel = $map->activityEntityToModel($activityEntity); + Log::dd($analyzeEntity); + +// $listAnalyze = []; +// foreach ($analyzeEntity as $entity) { +// $user = $map->athleteEntityToModel($entity); +// $listUsers[] = ['idathlete' => number_format($user->getId(), 1), 'nom' => $user->getNom(), +// 'prenom' => $user->getPrenom(),'email' => $user->getEmail(), 'sexe' => $user->getSexe(), +// 'taille' => $user->getTaille(), 'poids' => $user->getPoids(), 'motdepasse' => $user->getMotDePasse(), +// 'datenaissance' => $user->getDateNaissance(), 'iscoach' => $user->getRole(), 'img' => 'test', +// 'username' => $user->getUsername()]; +// } - $response = $this->render('./page/analyze.html.twig',[ + $response = $this->render('./page/activity_details.html.twig', [ 'css' => $this->preference->getCookie(), 'pp' => "test2", 'user' => 'johndoe',//$currentUser->getUsername(), 'role' => 'Athlete',//$currentUser->getRole(), 'friendship' => [], - 'analyzes' => $listActivity, - 'mails' => [], - 'users' => [], - 'infoUser' => [], - 'exos' => [], - 'member' => [] + 'activity' => [], ]); } catch (\Throwable $th) { throw $th; @@ -158,6 +161,45 @@ class AthleteController extends BaseController return $response; } +// +// #[Route(path: '/analyses/{id}', name: 'analyses', methods: ['GET'])] +// public function analyses(): Response +// { +// try { +// $activityGateway = new ActivityGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); +// $listSearch = $activityGateway->getActivity(); +// $map = new ActivityMapper(); +// $activityGateway = $map->activitySqlToEntity($listSearch); +// $listActivity = []; +// foreach ($activityGateway as $entity) { +// $activity = $map->activityEntityToModel($entity); +// $listActivity[] = ['idactivity' => number_format($activity->getIdActivity(), 1), 'type' => $activity->getType(), +// 'date' => $activity->getDate()->format("D j F Y"), 'heureDebut' => $activity->getHeureDebut()->format("H\h i"), 'heureFin' => $activity->getHeureFin()->format("H\h i"), +// 'effortRessenti' => $activity->getEffortRessenti(), 'variabilite' => $activity->getVariability(), 'variance' => $activity->getVariance(), +// 'ecartType' => $activity->getStandardDeviation(), 'moyenne' => $activity->getAverage(), +// 'max' => $activity->getMaximum(), 'min' => $activity->getMinimum(), 'temperature' =>$activity->getAvrTemperature()]; +// } +// +// $response = $this->render('./page/analyze.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => 'johndoe',//$currentUser->getUsername(), +// 'role' => 'Athlete',//$currentUser->getRole(), +// 'friendship' => [], +// 'analyzes' => $listActivity, +// 'mails' => [], +// 'users' => [], +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [] +// ]); +// } catch (\Throwable $th) { +// throw $th; +// return $this->render("./page/analyze.html.twig", ['tabError' => $taberror]); +// } +// return $response; +// } + #[Route(path: '/activity', name: 'activity', methods: ['GET'])] public function activity(): Response { diff --git a/Sources/src/app/views/Templates/page/activity.html.twig b/Sources/src/app/views/Templates/page/activity.html.twig index be5fb8bd..cf855441 100644 --- a/Sources/src/app/views/Templates/page/activity.html.twig +++ b/Sources/src/app/views/Templates/page/activity.html.twig @@ -67,8 +67,10 @@ {{analyze.max}} Bpm {{analyze.min}} Bpm {{analyze.temperature}} °C -{# En savoir plus#} - En savoir plus + {{ analyze.effortRessenti }} +{# En savoir plus#} + En savoir plus +{# En savoir plus#} {% endfor %} diff --git a/Sources/src/app/views/Templates/page/analyze.html.twig b/Sources/src/app/views/Templates/page/analyze.html.twig index f22c8801..a2167c03 100755 --- a/Sources/src/app/views/Templates/page/analyze.html.twig +++ b/Sources/src/app/views/Templates/page/analyze.html.twig @@ -39,7 +39,7 @@ {{analyze.max}} Bpm {{analyze.min}} Bpm {{analyze.temperature}} °C - En savoir plus + Home {% endfor %}
    diff --git a/Sources/src/data/core/database/ActivityGateway.php b/Sources/src/data/core/database/ActivityGateway.php index ed6db38c..3d9e9564 100644 --- a/Sources/src/data/core/database/ActivityGateway.php +++ b/Sources/src/data/core/database/ActivityGateway.php @@ -17,7 +17,7 @@ class ActivityGateway { public function getActivityById(int $activityId) { $query = "SELECT * FROM Activite WHERE idActivite = :id"; - $params = [':id' => [$activityId, PDO::PARAM_INT]]; + $params = [':id' => $activityId]; return $this->connection->executeWithErrorHandling($query, $params); } diff --git a/Sources/src/data/core/database/AnalyzeEntity.php b/Sources/src/data/core/database/AnalyzeEntity.php new file mode 100644 index 00000000..4560f7b7 --- /dev/null +++ b/Sources/src/data/core/database/AnalyzeEntity.php @@ -0,0 +1,79 @@ +idFc; + } + public function getAltitude() + { + return $this->altitude; + } + public function getTime() + { + return $this->temps; + } + public function getTemperature() + { + return $this->temperature; + } + public function getBpm() + { + return $this->bpm; + } + public function getLongitude() + { + return $this->longitude; + } + public function getLatitude() + { + return $this->latitude; + } + public function getIdActivity() + { + return $this->idactivity; + } + public function setIdFC($idFc) + { + $this->idFc = $idFc; + } + public function setAltitude($altitude) + { + $this->altitude = $altitude; + } + public function setTime($time) + { + $this->time = $time; + } + public function setTemperature($temperature) + { + $this->temperature = $temperature; + } + public function setBpm($bpm) + { + $this->bpm = $bpm; + } + public function setLongitude($longitude) + { + $this->longitude = $longitude; + } + public function setLatitude($latitude) + { + $this->latitude = $latitude; + } + public function setIdActivity($idactivity) + { + $this->idactivity = $idactivity; + } +} \ No newline at end of file diff --git a/Sources/src/data/core/database/AnalyzeGateway.php b/Sources/src/data/core/database/AnalyzeGateway.php new file mode 100644 index 00000000..7dd7666a --- /dev/null +++ b/Sources/src/data/core/database/AnalyzeGateway.php @@ -0,0 +1,24 @@ +connection = $connection; + } + + public function getFrequenceCardiaque() { + $query = "SELECT * FROM FrequenceCardiaque"; + return $this->connection->executeWithErrorHandling($query); + } + public function getFrequenceCardiaqueByIdActivity(int $activityId) + { + $query = "SELECT * FROM FrequenceCardiaque WHERE activiteid = :id"; + $params = [':id' => $activityId]; + return $this->connection->executeWithErrorHandling($query, $params); + } + +} \ No newline at end of file diff --git a/Sources/src/data/core/database/AnalyzeMapper.php b/Sources/src/data/core/database/AnalyzeMapper.php new file mode 100644 index 00000000..6adc7733 --- /dev/null +++ b/Sources/src/data/core/database/AnalyzeMapper.php @@ -0,0 +1,123 @@ +setIdActivity($analyzeData['idactivite']); + } + + if (isset($analyzeData['type'])) { + $analyze->setType($analyzeData['type']); + } + + if (isset($analyzeData['date'])) { + $analyze->setDate($analyzeData['date']); + } + + if (isset($analyzeData['heurededebut'])) { + $analyze->setHeureDebut($analyzeData['heurededebut']); + } + + if (isset($analyzeData['heuredefin'])) { + $analyze->setHeureFin($analyzeData['heuredefin']); + } + + if (isset($analyzeData['effortressent'])) { + $analyze->setEffortRessenti($analyzeData['effortressent']); + } + + if (isset($analyzeData['variabilite'])) { + $analyze->setVariabilite($analyzeData['variabilite']); + } + + if (isset($analyzeData['variance'])) { + $analyze->setVariance($analyzeData['variance']); + } + + if (isset($analyzeData['ecarttype'])) { + $analyze->setEcartType($analyzeData['ecarttype']); + } + + if (isset($analyzeData['moyenne'])) { + $analyze->setMoyenne($analyzeData['moyenne']); + } + + if (isset($analyzeData['maximum'])) { + $analyze->setMaximum($analyzeData['maximum']); + } + + if (isset($analyzeData['minimum'])) { + $analyze->setMinimum($analyzeData['minimum']); + } + + if (isset($analyzeData['temperaturemoyenne'])) { + $analyze->setTemperatureMoyenne($analyzeData['temperaturemoyenne']); + } + + $analyzeEntities[] = $analyze; + } + return $analyzeEntities; + } + + /** + * @throws \Exception + */ +// public function ActivityEntityToModel(ActivityEntity $activiteEntity):Activity { +// $date = new DateTime($activiteEntity->getDate()); +// $heureDebut = new \DateTime($activiteEntity->getHeureDebut()); +// $heureFin = new \DateTime($activiteEntity->getHeureFin()); +// $effortRessenti = intval($activiteEntity->getEffortRessenti()); +// $variability = floatval($activiteEntity->getVariability()); +// $variance = floatval($activiteEntity->getVariance()); +// $ecartType = floatval($activiteEntity->getEcartType()); +// +// $act = new Activity( +// $activiteEntity->getIdActivity(), +// $activiteEntity->getType(), +// $date, +// $heureDebut, +// $heureFin, +// $effortRessenti, +// $variability, +// $variance, +// $ecartType, +// $activiteEntity->getMoyenne(), +// $activiteEntity->getMaximum(), +// $activiteEntity->getMinimum(), +// $activiteEntity->getTemperatureMoyenne(), +// 'false' +// ); +// +// return $act; +// } + //public function ActivityToEntity(Activity model): ActivityEntity; + +// public function activityToEntity( $act):ActivityEntity{ +// +// $act = new ActivityEntity(); +// $act->setIdActivity($act->getIdActivity()()); +// $act->setType($act->getType()); +// $act->setDate($act->getDate()); +// $act->setHeureDebut($act->getHeureDebut()); +// $act->setHeureFin($act->getHeureFin()); +// $act->setEffortRessenti($act->getEffortRessenti()); +// $act->setVariabilite($act->getVariability()); +// $act->setVariance($act->getVariance()); +// $act->setEcartType($act->getEcartType()); +// $act->setMoyenne($act->getMoyenne()); +// $act->setMaximum($act->getMaximum()); +// $act->setMinimum($act->getMinimum()); +// $act->setTemperatureMoyenne($act->getTemperatureMoyenne()); +// +// return $act; +// } +} \ No newline at end of file diff --git a/Sources/src/data/core/database/data/athlete.sql b/Sources/src/data/core/database/data/athlete.sql new file mode 100644 index 00000000..51c2b19a --- /dev/null +++ b/Sources/src/data/core/database/data/athlete.sql @@ -0,0 +1,6 @@ +INSERT INTO Athlete (idAthlete, username, nom, prenom, email, sexe, taille, poids, motDePasse, dateNaissance, isCoach) VALUES + (1, 'johnD63', 'Doe', 'John', 'john.doe@example.com', 'M', 1.80, 70, 'password123', '1990-01-01', FALSE), + (2, 'janeS03', 'Smith', 'Jane', 'jane.smith@example.com', 'F', 1.65, 60, 'password456', '1992-02-02', TRUE), + (3, 'bryanO', 'OConner', 'Bryan', 'bryan.oconner@example.com', 'M', 1.88, 86, 'password789', '1973-09-12', FALSE), + (4, 'dominicT', 'Toretto', 'Dominic', 'dominic.toretto@example.com', 'M', 1.83, 94, 'password987', '1967-07-18', TRUE), + (5, 'miaT', 'Toretto', 'Mia', 'mia.toretto@example.com', 'F', 1.70, 56, 'password654', '1980-04-26', FALSE); \ No newline at end of file diff --git a/Sources/src/data/core/database/data/friendship.sql b/Sources/src/data/core/database/data/friendship.sql new file mode 100644 index 00000000..da8b2a52 --- /dev/null +++ b/Sources/src/data/core/database/data/friendship.sql @@ -0,0 +1,29 @@ +INSERT INTO Friendship (idAthlete1, idAthlete2, debut) VALUES + (3, 4, '2023-01-01'), + (3, 5, '2023-01-12'); + +INSERT INTO Notification (idNotif, message, date, statut, urgence, athleteId) VALUES + (1, 'Training session at 10 AM', '2023-03-10', TRUE, 1, 1), + (2, 'Training session at 3 PM', '2023-05-10', TRUE, 1, 2); + +INSERT INTO Statistique (idStatistique, poids, fcMoyenne, fcMax, caloriesBruleesMoy, date, athleteId) VALUES + (1, 70, 80, 150, 500, '2023-03-10', 1), + (2, 86, 95, 170, 896, '2023-04-13', 3); + +INSERT INTO Entrainement (idEntrainement, date, description, latitude, longitude, feedback, athleteId) VALUES + (1, '2023-03-10', 'Long run in the park', 40.7128, -74.0060, 'Good effort', 1), + (2, '2023-04-13', 'Long run in the forest', 44.7128, -70.0060, 'Pretty good effort', 3); + +INSERT INTO Participe (athleteId, entrainementId) VALUES + (1, 1), + (3, 2); + +INSERT INTO SourceDonnee (idSource, type, modele, precision2, athleteId) VALUES + (1, 'Heart Rate Monitor', 'HRM-Pro', 98.5, 1); + +INSERT INTO Activite (idActivite, type, date, heureDeDebut, heureDeFin, effortRessent, variabilite, variance, ecartType, moyenne, maximum, minimum, temperatureMoyenne, athleteId, sourceId) VALUES + (1, 'Running', '2023-03-10', '08:00:00', '09:00:00', 3, 0.5, 1, 0.1, 140, 160, 120, 20, 1, 1), + (2, 'Running Forest', '2023-04-13', '10:00:00', '12:00:00', 5, 0.5, 1, 0.1, 140, 160, 120, 20, 1, 1); + +INSERT INTO FrequenceCardiaque (idFc, altitude, temps, temperature, bpm, longitude, latitude, activiteId) VALUES + (1, 100, '08:15:00', 15, 130, -74.0060, 40.7128, 1); \ No newline at end of file diff --git a/Sources/src/data/core/database/db.sql b/Sources/src/data/core/database/data/tables.sql similarity index 71% rename from Sources/src/data/core/database/db.sql rename to Sources/src/data/core/database/data/tables.sql index 0eae219b..2a8f0ab3 100644 --- a/Sources/src/data/core/database/db.sql +++ b/Sources/src/data/core/database/data/tables.sql @@ -103,30 +103,5 @@ CREATE TABLE FrequenceCardiaque ( FOREIGN KEY (activiteId) REFERENCES Activite(idActivite) ); -INSERT INTO Athlete (idAthlete, nom, prenom, email, sexe, taille, poids, motDePasse, dateNaissance, isCoach) VALUES - (1, 'Doe', 'John', 'john.doe@example.com', 'M', 1.80, 70, 'password123', '1990-01-01', FALSE), - (2, 'Smith', 'Jane', 'jane.smith@example.com', 'F', 1.65, 60, 'password456', '1992-02-02', TRUE); - -INSERT INTO Friendship (idAthlete1, idAthlete2, debut) VALUES - (1, 2, '2023-01-01'); - -INSERT INTO Notification (idNotif, message, date, statut, urgence, athleteId) VALUES - (1, 'Training session at 10 AM', '2023-03-10', TRUE, 1, 1); - -INSERT INTO Statistique (idStatistique, poids, fcMoyenne, fcMax, caloriesBruleesMoy, date, athleteId) VALUES - (1, 70, 80, 150, 500, '2023-03-10', 1); - -INSERT INTO Entrainement (idEntrainement, date, description, latitude, longitude, feedback, athleteId) VALUES - (1, '2023-03-12', 'Long run in the park', 40.7128, -74.0060, 'Good effort', 1); - -INSERT INTO Participe (athleteId, entrainementId) VALUES - (1, 1); - -INSERT INTO SourceDonnee (idSource, type, modele, precision2, athleteId) VALUES - (1, 'Heart Rate Monitor', 'HRM-Pro', 98.5, 1); - -INSERT INTO Activite (idActivite, type, date, heureDeDebut, heureDeFin, effortRessent, variabilite, variance, ecartType, moyenne, maximum, minimum, temperatureMoyenne, athleteId, sourceId) VALUES - (1, 'Running', '2023-03-10', '08:00:00', '09:00:00', 7, 0.5, 1, 0.1, 140, 160, 120, 20, 1, 1); - -INSERT INTO FrequenceCardiaque (idFc, altitude, temps, temperature, bpm, longitude, latitude, activiteId) VALUES - (1, 100, '08:15:00', 15, 130, -74.0060, 40.7128, 1); +\i athlete.sql +\i friendship.sql \ No newline at end of file From 1b18825afab97e2a6e48e6f4f5e64a27551058b4 Mon Sep 17 00:00:00 2001 From: anperederi Date: Thu, 21 Dec 2023 20:27:56 +0100 Subject: [PATCH 38/48] update merged, add .env file to resolve this --- Sources/src/app/controller/AuthController.php | 2 +- Sources/src/app/controller/Controller.php | 843 +++++++++--------- Sources/src/app/controller/UserController.php | 40 +- 3 files changed, 443 insertions(+), 442 deletions(-) diff --git a/Sources/src/app/controller/AuthController.php b/Sources/src/app/controller/AuthController.php index 92d50404..758e6e79 100644 --- a/Sources/src/app/controller/AuthController.php +++ b/Sources/src/app/controller/AuthController.php @@ -141,7 +141,7 @@ class AuthController extends BaseController } - #[Route(path: '/logout', name: 'logout', methods: ['POST'])] + #[Route(path: '/logout', name: 'logout', methods: ['GET'])] public function logout(IRequest $request): IResponse { $error = []; diff --git a/Sources/src/app/controller/Controller.php b/Sources/src/app/controller/Controller.php index e6e85493..fb2ed0fa 100644 --- a/Sources/src/app/controller/Controller.php +++ b/Sources/src/app/controller/Controller.php @@ -1,423 +1,424 @@ render('./page/activity.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => [], - 'analyzes' => [], - 'mails' => [], - 'users' => [], - 'infoUser' => [], - 'exos' => [], - 'member' => [] - ]); - } - - - #[Route(path: '/exercices', name: 'exercices', methods: ['POST'])] // 8 - public function exercices(String $type, String $intensite, String $date, IRequest $req): Response - { - $exercicesArray = [ - [ - 'date' => $date, - 'type' => $type, - 'intensite' => $intensite, - 'status' => 'A venur', - ] - ]; - return $this->render('./page/exercice.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => [], - 'analyzes' => [], - 'mails' => [], - 'users' => [], - 'infoUser' => [], - 'exos' => $exercicesArray, - 'member' => [] - ]); - } - - #[Route(path: '/search-user', name: 'search-user', methods: ['GET'])] - public function searchUser(string $username, IRequest $req): Response - { - $taberror = []; - // FILTER - $utiliArray = [ - [ - 'nom' => 'John', - 'prenom' => 'Doe', - 'img' => 'john_doe', - 'username' => 'johndoe', - ], - [ - 'nom' => 'Alice', - 'prenom' => 'Smith', - 'img' => 'alice_smith', - 'username' => 'alicesmith', - ], - ]; - // if(!Validation::val_string($name)){ - try { - //code... - // $model->userMgr->addFriend($name); - return $this->render('./page/addfriend.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => [], - 'analyzes' => [], - 'mails' => [], - 'users' => $utiliArray, - 'infoUser' => [], - 'exos' => [], - 'member' => [], - 'responce' => "Notification d'ajout envoyée à $username" - ]); - } catch (\Throwable $th) { - //throw $th; - // return $this->render("addfriend.html.twig", ['tabError' => $taberror ]); - } - // } - - } - - #[Route(path: '/search-member', name: 'search-member', methods: ['GET'])] - public function searchMember(string $username, IRequest $req): Response - { - $taberror = []; - // FILTER - $utiliArray = [ - [ - 'nom' => 'John', - 'prenom' => 'Doe', - 'img' => 'john_doe', - 'username' => 'johndoe', - ], - [ - 'nom' => 'Alice', - 'prenom' => 'Smith', - 'img' => 'alice_smith', - 'username' => 'alicesmith', - ], - ]; - // if(!Validation::val_string($name)){ - try { - //code... - // $model->userMgr->addFriend($name); - return $this->render('./page/addmember.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => [], - 'analyzes' => [], - 'mails' => [], - 'users' => $utiliArray, - 'infoUser' => [], - 'exos' => [], - 'member' => [], - 'responce' => "Notification d'ajout envoyée à $username" - ]); - } catch (\Throwable $th) { - //throw $th; - // return $this->render("addfriend.html.twig", ['tabError' => $taberror ]); - } - // } - - } - - #[Route(path: '/add-member', name: 'add-member', methods: ['POST'])] - public function addmember(string $username, IRequest $req): Response - { - $taberror = []; - $utiliArray = [ - [ - 'nom' => 'John', - 'prenom' => 'Doe', - 'img' => 'john_doe', - 'username' => 'johndoe', - ], - [ - 'nom' => 'Alice', - 'prenom' => 'Smith', - 'img' => 'alice_smith', - 'username' => 'alicesmith', - ], - ]; - // if(!Validation::val_string($name)){ - try { - //code... - // $model->userMgr->addFriend($name); - return $this->render('./page/addmember.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => [], - 'analyzes' => [], - 'mails' => [], - 'users' => $utiliArray, - 'infoUser' => [], - 'exos' => [], - 'member' => [], - 'responce' => "Notification d'ajout envoyée à $username" - ]); - } catch (\Throwable $th) { - //throw $th; - // return $this->render("addfriend.html.twig", ['tabError' => $taberror ]); - } - // } - - } - - #[Route(path: '/member', name: 'member', methods: ['GET'])] - public function member(): Response - { - $utiliArray = [ - [ - 'nom' => 'John', - 'prenom' => 'Doe', - 'img' => 'john_doe', - 'username' => 'johndoe', - ], - [ - 'nom' => 'Alice', - 'prenom' => 'Smith', - 'img' => 'alice_smith', - 'username' => 'alicesmith', - ], - ]; - return $this->render('./page/addmember.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => [], - 'analyzes' => [], - 'mails' => [], - 'users' => $utiliArray, - 'infoUser' => [], - 'exos' => [], - 'member' => [], - ]); - } - - - #[Route(path: '/friendlist', name: 'friendlist', methods: ['POST'])] - public function friendlist(string $username, IRequest $req): Response - { - $utiliArray = [ - [ - 'nom' => 'John', - 'prenom' => 'Doe', - 'img' => 'john_doe', - 'username' => 'johndoe', - ], - [ - 'nom' => 'Alice', - 'prenom' => 'Smith', - 'img' => 'alice_smith', - 'username' => 'alicesmith', - ], - ]; - /* TODO */ - - // -> Enlever ou bloquer un utilisateur en fonction de son username - - return $this->render('./page/friend.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => $utiliArray, - 'analyzes' => [], - 'mails' => [], - 'users' => [], - 'infoUser' => [], - 'exos' => [], - 'member' => [], - ]); - } - - #[Route(path: '/friendlist', name: 'friendlist2', methods: ['GET'])] - public function friendlist2(): Response - { - $utiliArray = [ - [ - 'nom' => 'John', - 'prenom' => 'Doe', - 'img' => 'test', - 'status' => 'johndoe', - 'username' => 'jdoe', - ], - [ - 'nom' => 'Alice', - 'prenom' => 'Smith', - 'img' => 'test2', - 'status' => 'alicesmith', - 'username' => 'asmith', - ], - ]; - return $this->render('./page/friend.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => $utiliArray, - 'analyzes' => [], - 'mails' => [], - 'users' => [], - 'infoUser' => [], - 'exos' => [], - 'member' => [], - ]); - } - - #[Route(path: '/coaching', name: 'coaching', methods: ['GET'])] - public function coaching(): Response - { - return $this->render('./page/coaching.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => [], - 'analyzes' => [], - 'mails' => [], - 'users' => [], - 'infoUser' => [], - 'exos' => [], - 'member' => [] - ]); - } - - #[Route(path: '/mail', name: 'mail', methods: ['GET'])] - public function mail(): Response - { - return $this->render('./page/mail.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => [], - 'analyzes' => [], - 'mails' => [], - 'users' => [], - 'infoUser' => [], - 'exos' => [], - 'member' => [] - ]); - } - - - #[Route(path: '/profile', name: 'profile', methods: ['GET'])] - public function profile(): Response - { - return $this->render('./page/profile.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => [], - 'analyzes' => [], - 'mails' => [], - 'users' => [], - 'infoUser' => [], - 'exos' => [], - 'member' => [] - ]); - } - - - #[Route(path: '/psettings', name: 'psettings', methods: ['POST'])] - public function psettings(string $nom,string $prenom,string $dateNaissance,string $mail,string $tel, IRequest $req): Response - { - - - return $this->render('./page/settings.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => $prenom, - 'role' => "Athlète", - 'friendship' => [], - 'analyzes' => [], - 'mails' => [], - 'users' => [], - 'infoUser' => [], - 'exos' => [], - 'member' => [] - ]); - } - - - - - #[Route(path: '/pass', name: 'pass', methods: ['GET'])] - public function pass(): Response - { - - // CONFIRMER LES DONNESS !!!!! IMPORTANT - - return $this->render('./page/password.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => [], - 'analyzes' => [], - 'mails' => [], - 'users' => [], - 'infoUser' => [], - 'exos' => [], - 'member' => [] - ]); - } - - #[Route(path: '/password', name: 'password', methods: ['POST'])] - public function password(string $email, IRequest $req): Response - { - - // CONFIRMER LES DONNESS !!!!! IMPORTANT - - return $this->render('./page/login.html.twig',[ - 'css' => $this->preference->getCookie(), - 'pp' => "test2", - 'user' => "Doe", - 'role' => "Athlète", - 'friendship' => [], - 'analyzes' => [], - 'mails' => [], - 'users' => [], - 'infoUser' => [], - 'exos' => [], - 'member' => [] - ]); - } - -} - - +// +//namespace App\Controller; +// +//use App\Container; +//use App\Router\Request\IRequest; +//use App\Router\Response\Response; +//use Shared\Attributes\Route; +//use Twig\Environment; +//use Data\Core\Preferences; +//use Shared\Log; +// +//// TODO : Remove this BaseClass +//class Controller extends BaseController +//{ +// +// #[Route(path: '/activity', name: 'activity', methods: ['GET'])] +// public function activity(): Response +// { +// return $this->render('./page/activity.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => [], +// 'analyzes' => [], +// 'mails' => [], +// 'users' => [], +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [] +// ]); +// } +// +// +// #[Route(path: '/exercices', name: 'exercices', methods: ['POST'])] // 8 +// public function exercices(String $type, String $intensite, String $date, IRequest $req): Response +// { +// $exercicesArray = [ +// [ +// 'date' => $date, +// 'type' => $type, +// 'intensite' => $intensite, +// 'status' => 'A venur', +// ] +// ]; +// return $this->render('./page/exercice.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => [], +// 'analyzes' => [], +// 'mails' => [], +// 'users' => [], +// 'infoUser' => [], +// 'exos' => $exercicesArray, +// 'member' => [] +// ]); +// } +// +// #[Route(path: '/search-user', name: 'search-user', methods: ['GET'])] +// public function searchUser(string $username, IRequest $req): Response +// { +// $taberror = []; +// // FILTER +// $utiliArray = [ +// [ +// 'nom' => 'John', +// 'prenom' => 'Doe', +// 'img' => 'john_doe', +// 'username' => 'johndoe', +// ], +// [ +// 'nom' => 'Alice', +// 'prenom' => 'Smith', +// 'img' => 'alice_smith', +// 'username' => 'alicesmith', +// ], +// ]; +// // if(!Validation::val_string($name)){ +// try { +// //code... +// // $model->userMgr->addFriend($name); +// return $this->render('./page/addfriend.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => [], +// 'analyzes' => [], +// 'mails' => [], +// 'users' => $utiliArray, +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [], +// 'responce' => "Notification d'ajout envoyée à $username" +// ]); +// } catch (\Throwable $th) { +// //throw $th; +// // return $this->render("addfriend.html.twig", ['tabError' => $taberror ]); +// } +// // } +// +// } +// +// #[Route(path: '/search-member', name: 'search-member', methods: ['GET'])] +// public function searchMember(string $username, IRequest $req): Response +// { +// $taberror = []; +// // FILTER +// $utiliArray = [ +// [ +// 'nom' => 'John', +// 'prenom' => 'Doe', +// 'img' => 'john_doe', +// 'username' => 'johndoe', +// ], +// [ +// 'nom' => 'Alice', +// 'prenom' => 'Smith', +// 'img' => 'alice_smith', +// 'username' => 'alicesmith', +// ], +// ]; +// // if(!Validation::val_string($name)){ +// try { +// //code... +// // $model->userMgr->addFriend($name); +// return $this->render('./page/addmember.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => [], +// 'analyzes' => [], +// 'mails' => [], +// 'users' => $utiliArray, +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [], +// 'responce' => "Notification d'ajout envoyée à $username" +// ]); +// } catch (\Throwable $th) { +// //throw $th; +// // return $this->render("addfriend.html.twig", ['tabError' => $taberror ]); +// } +// // } +// +// } +// +// #[Route(path: '/add-member', name: 'add-member', methods: ['POST'])] +// public function addmember(string $username, IRequest $req): Response +// { +// $taberror = []; +// $utiliArray = [ +// [ +// 'nom' => 'John', +// 'prenom' => 'Doe', +// 'img' => 'john_doe', +// 'username' => 'johndoe', +// ], +// [ +// 'nom' => 'Alice', +// 'prenom' => 'Smith', +// 'img' => 'alice_smith', +// 'username' => 'alicesmith', +// ], +// ]; +// // if(!Validation::val_string($name)){ +// try { +// //code... +// // $model->userMgr->addFriend($name); +// return $this->render('./page/addmember.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => [], +// 'analyzes' => [], +// 'mails' => [], +// 'users' => $utiliArray, +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [], +// 'responce' => "Notification d'ajout envoyée à $username" +// ]); +// } catch (\Throwable $th) { +// //throw $th; +// // return $this->render("addfriend.html.twig", ['tabError' => $taberror ]); +// } +// // } +// +// } +// +// #[Route(path: '/member', name: 'member', methods: ['GET'])] +// public function member(): Response +// { +// $utiliArray = [ +// [ +// 'nom' => 'John', +// 'prenom' => 'Doe', +// 'img' => 'john_doe', +// 'username' => 'johndoe', +// ], +// [ +// 'nom' => 'Alice', +// 'prenom' => 'Smith', +// 'img' => 'alice_smith', +// 'username' => 'alicesmith', +// ], +// ]; +// return $this->render('./page/addmember.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => [], +// 'analyzes' => [], +// 'mails' => [], +// 'users' => $utiliArray, +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [], +// ]); +// } +// +// +// #[Route(path: '/friendlist', name: 'friendlist', methods: ['POST'])] +// public function friendlist(string $username, IRequest $req): Response +// { +// $utiliArray = [ +// [ +// 'nom' => 'John', +// 'prenom' => 'Doe', +// 'img' => 'john_doe', +// 'username' => 'johndoe', +// ], +// [ +// 'nom' => 'Alice', +// 'prenom' => 'Smith', +// 'img' => 'alice_smith', +// 'username' => 'alicesmith', +// ], +// ]; +// /* TODO */ +// +// // -> Enlever ou bloquer un utilisateur en fonction de son username +// +// return $this->render('./page/friend.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => $utiliArray, +// 'analyzes' => [], +// 'mails' => [], +// 'users' => [], +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [], +// ]); +// } +// +// #[Route(path: '/friendlist', name: 'friendlist2', methods: ['GET'])] +// public function friendlist2(): Response +// { +// $utiliArray = [ +// [ +// 'nom' => 'John', +// 'prenom' => 'Doe', +// 'img' => 'test', +// 'status' => 'johndoe', +// 'username' => 'jdoe', +// ], +// [ +// 'nom' => 'Alice', +// 'prenom' => 'Smith', +// 'img' => 'test2', +// 'status' => 'alicesmith', +// 'username' => 'asmith', +// ], +// ]; +// return $this->render('./page/friend.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => $utiliArray, +// 'analyzes' => [], +// 'mails' => [], +// 'users' => [], +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [], +// ]); +// } +// +// #[Route(path: '/coaching', name: 'coaching', methods: ['GET'])] +// public function coaching(): Response +// { +// return $this->render('./page/coaching.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => [], +// 'analyzes' => [], +// 'mails' => [], +// 'users' => [], +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [] +// ]); +// } +// +// #[Route(path: '/mail', name: 'mail', methods: ['GET'])] +// public function mail(): Response +// { +// return $this->render('./page/mail.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => [], +// 'analyzes' => [], +// 'mails' => [], +// 'users' => [], +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [] +// ]); +// } +// +// +// #[Route(path: '/profile', name: 'profile', methods: ['GET'])] +// public function profile(): Response +// { +// return $this->render('./page/profile.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => [], +// 'analyzes' => [], +// 'mails' => [], +// 'users' => [], +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [] +// ]); +// } +// +// +// #[Route(path: '/psettings', name: 'psettings', methods: ['POST'])] +// public function psettings(string $nom,string $prenom,string $dateNaissance,string $mail,string $tel, IRequest $req): Response +// { +// +// +// return $this->render('./page/settings.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => $prenom, +// 'role' => "Athlète", +// 'friendship' => [], +// 'analyzes' => [], +// 'mails' => [], +// 'users' => [], +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [] +// ]); +// } +// +// +// +// +// #[Route(path: '/pass', name: 'pass', methods: ['GET'])] +// public function pass(): Response +// { +// +// // CONFIRMER LES DONNESS !!!!! IMPORTANT +// +// return $this->render('./page/password.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => [], +// 'analyzes' => [], +// 'mails' => [], +// 'users' => [], +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [] +// ]); +// } +// +// #[Route(path: '/password', name: 'password', methods: ['POST'])] +// public function password(string $email, IRequest $req): Response +// { +// +// // CONFIRMER LES DONNESS !!!!! IMPORTANT +// +// return $this->render('./page/login.html.twig',[ +// 'css' => $this->preference->getCookie(), +// 'pp' => "test2", +// 'user' => "Doe", +// 'role' => "Athlète", +// 'friendship' => [], +// 'analyzes' => [], +// 'mails' => [], +// 'users' => [], +// 'infoUser' => [], +// 'exos' => [], +// 'member' => [] +// ]); +// } +// +//} +// +// +// diff --git a/Sources/src/app/controller/UserController.php b/Sources/src/app/controller/UserController.php index 5ebcbcef..44615f17 100644 --- a/Sources/src/app/controller/UserController.php +++ b/Sources/src/app/controller/UserController.php @@ -87,25 +87,25 @@ class UserController extends BaseController ]); } - #[Route(path: '/logout', name: 'logout', methods: ['GET'])] - public function logout(IRequest $request): IResponse - { - $error = []; - - try { - - if($this->userMgr->deconnecter()){ - return new RedirectResponse('/'); - } - else{ - $error [] = "Erreur de deconnexion. Essayez encore"; - return new RedirectResponse('/'); - } - - } catch (\Throwable $th) { - $error [] =$th->getMessage(); - return new RedirectResponse('/'); - } - } +// #[Route(path: '/logout', name: 'logout', methods: ['GET'])] +// public function logout(IRequest $request): IResponse +// { +// $error = []; +// +// try { +// +// if($this->userMgr->deconnecter()){ +// return new RedirectResponse('/'); +// } +// else{ +// $error [] = "Erreur de deconnexion. Essayez encore"; +// return new RedirectResponse('/'); +// } +// +// } catch (\Throwable $th) { +// $error [] =$th->getMessage(); +// return new RedirectResponse('/'); +// } +// } } \ No newline at end of file From 23ccabbb71fa8004b241ccf6b105372baaf46170 Mon Sep 17 00:00:00 2001 From: palevrault Date: Thu, 21 Dec 2023 21:31:53 +0100 Subject: [PATCH 39/48] Test ajout graphique --- Sources/config/config.php | 8 +++---- Sources/src/app/controller/UserController.php | 9 ++++++++ .../app/views/Templates/page/home.html.twig | 21 ++++++++++++++++++- .../src/data/core/database/AthleteGateway.php | 11 ++++++++++ 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/Sources/config/config.php b/Sources/config/config.php index 4d0a0f4d..f28606cb 100755 --- a/Sources/config/config.php +++ b/Sources/config/config.php @@ -12,10 +12,10 @@ $dotenv->safeLoad(); // const DB_PASSWORD = $_ENV['DB_PASSWORD'] ?? 'achanger'; define("APP_ENV", 'development'); -const DB_SERVER = 'pgsql'; -const DB_HOST = 'localhost'; -const DB_DATABASE = 'sae_3'; -const DB_USER = 'Perederii'; +const DB_SERVER = 'mysql'; +const DB_HOST = 'localhost:3306'; +const DB_DATABASE = 'new'; +const DB_USER = 'root'; const DB_PASSWORD = ''; //const APP_ENV = 'console'; diff --git a/Sources/src/app/controller/UserController.php b/Sources/src/app/controller/UserController.php index 6b3091af..6ce05f94 100644 --- a/Sources/src/app/controller/UserController.php +++ b/Sources/src/app/controller/UserController.php @@ -9,6 +9,8 @@ use Shared\Attributes\Route; use Twig\Environment; use Data\Core\Preferences; use Shared\Log; +use Database\Athletegateway; +use Database\Connexion; class UserController extends BaseController { @@ -43,6 +45,12 @@ class UserController extends BaseController #[Route(path: '/home', name: 'home', methods: ['GET'])] public function home(): Response { + $athleteGateway = new AthleteGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); + $activity = $athleteGateway->getListActivity('1');//$currentUser->getId() + foreach($activity as $act){ + $chart["act"] = $act["nbActivite"]; + $chart["mois"] = date('M', mktime(0, 0, 0, $act["mois"], 10)); + } return $this->render('./page/home.html.twig',[ 'css' => $this->preference->getCookie(), 'pp' => "test2", @@ -50,6 +58,7 @@ class UserController extends BaseController 'role' => "Athlète", 'friendship' => [], 'analyzes' => [], + 'chart' => $chart, 'mails' => [], 'users' => [], 'infoUser' => [], diff --git a/Sources/src/app/views/Templates/page/home.html.twig b/Sources/src/app/views/Templates/page/home.html.twig index 6ade985b..f75c376c 100755 --- a/Sources/src/app/views/Templates/page/home.html.twig +++ b/Sources/src/app/views/Templates/page/home.html.twig @@ -22,7 +22,26 @@ Stastiques globales
    - {# #} + + + +
    diff --git a/Sources/src/data/core/database/AthleteGateway.php b/Sources/src/data/core/database/AthleteGateway.php index 323be996..b73e9380 100644 --- a/Sources/src/data/core/database/AthleteGateway.php +++ b/Sources/src/data/core/database/AthleteGateway.php @@ -86,6 +86,17 @@ class AthleteGateway { return $this->connection->executeWithErrorHandling($query, $params); } + + public function getListActivity(int $idAthlete): array + { + $query = "SELECT count(ac.idActivite) AS nbActivite, MONTH(ac.date) AS mois FROM Athlete at, Activite ac WHERE at.idAthlete = :idAthlete AND ac.date > DATE_SUB(date, INTERVAL 1 YEAR) AND ac.athleteId=at.idAthlete GROUP BY mois"; + + $params = [ + ':idAthlete' => $idAthlete, + ]; + + return $this->connection->executeWithErrorHandling($query, $params); + } public function addAthlete(AthleteEntity $athlete): array { From a691e2a95292a5b4890753e02aea857240dbe9d2 Mon Sep 17 00:00:00 2001 From: anperederi Date: Thu, 21 Dec 2023 21:34:49 +0100 Subject: [PATCH 40/48] add activity analyze --- .../src/app/controller/AthleteController.php | 25 ++----- .../views/Templates/page/activity.html.twig | 5 +- .../views/Templates/page/analyze.html.twig | 74 +++++++++++++------ .../views/Templates/page/exercice.html.twig | 2 +- .../src/data/core/database/AnalyzeMapper.php | 2 + .../core/database/data/frequenceCardiaque.sql | 21 ++++++ 6 files changed, 81 insertions(+), 48 deletions(-) create mode 100644 Sources/src/data/core/database/data/frequenceCardiaque.sql diff --git a/Sources/src/app/controller/AthleteController.php b/Sources/src/app/controller/AthleteController.php index 4a317ec6..98428a80 100644 --- a/Sources/src/app/controller/AthleteController.php +++ b/Sources/src/app/controller/AthleteController.php @@ -121,8 +121,8 @@ class AthleteController extends BaseController return $response; } - #[Route(path: '/analyze/{id}', name: 'analyze_details', methods: ['GET'])] - public function activityDetails(): Response + #[Route(path: '/analyze', name: 'analyze_details', methods: ['GET'])] + public function activityDetails(int $id): Response { try { // Utilisez $id pour récupérer les détails de l'activité depuis la base de données @@ -130,29 +130,16 @@ class AthleteController extends BaseController // $activityEntity = $activityGateway->getActivityById($id); // Assurez-vous d'avoir une méthode similaire dans votre gateway $analyzeGateway = new AnalyzeGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); - $analyzeEntity = $analyzeGateway->getFrequenceCardiaque(); + $analyzeEntity = $analyzeGateway->getFrequenceCardiaqueByIdActivity($id); -// $map = new ActivityMapper(); -// $activityModel = $map->activityEntityToModel($activityEntity); - Log::dd($analyzeEntity); - -// $listAnalyze = []; -// foreach ($analyzeEntity as $entity) { -// $user = $map->athleteEntityToModel($entity); -// $listUsers[] = ['idathlete' => number_format($user->getId(), 1), 'nom' => $user->getNom(), -// 'prenom' => $user->getPrenom(),'email' => $user->getEmail(), 'sexe' => $user->getSexe(), -// 'taille' => $user->getTaille(), 'poids' => $user->getPoids(), 'motdepasse' => $user->getMotDePasse(), -// 'datenaissance' => $user->getDateNaissance(), 'iscoach' => $user->getRole(), 'img' => 'test', -// 'username' => $user->getUsername()]; -// } - - $response = $this->render('./page/activity_details.html.twig', [ + $response = $this->render('./page/analyze.html.twig', [ 'css' => $this->preference->getCookie(), 'pp' => "test2", 'user' => 'johndoe',//$currentUser->getUsername(), 'role' => 'Athlete',//$currentUser->getRole(), 'friendship' => [], 'activity' => [], + 'analyzes' => $analyzeEntity, ]); } catch (\Throwable $th) { throw $th; @@ -211,7 +198,7 @@ class AthleteController extends BaseController $listActivity = []; foreach ($activityGateway as $entity) { $activity = $map->activityEntityToModel($entity); - $listActivity[] = ['idactivity' => number_format($activity->getIdActivity(), 1), 'type' => $activity->getType(), + $listActivity[] = ['idactivity' => number_format($activity->getIdActivity()), 'type' => $activity->getType(), 'date' => $activity->getDate()->format("D j F Y"), 'heureDebut' => $activity->getHeureDebut()->format("H\h i"), 'heureFin' => $activity->getHeureFin()->format("H\h i"), 'effortRessenti' => $activity->getEffortRessenti(), 'variabilite' => $activity->getVariability(), 'variance' => $activity->getVariance(), 'ecartType' => $activity->getStandardDeviation(), 'moyenne' => $activity->getAverage(), diff --git a/Sources/src/app/views/Templates/page/activity.html.twig b/Sources/src/app/views/Templates/page/activity.html.twig index cf855441..89e9607b 100644 --- a/Sources/src/app/views/Templates/page/activity.html.twig +++ b/Sources/src/app/views/Templates/page/activity.html.twig @@ -67,10 +67,7 @@ {{analyze.max}} Bpm {{analyze.min}} Bpm {{analyze.temperature}} °C - {{ analyze.effortRessenti }} -{# En savoir plus#} - En savoir plus -{# En savoir plus#} + En savoir plus {% endfor %} diff --git a/Sources/src/app/views/Templates/page/analyze.html.twig b/Sources/src/app/views/Templates/page/analyze.html.twig index a2167c03..e1d4a5bb 100755 --- a/Sources/src/app/views/Templates/page/analyze.html.twig +++ b/Sources/src/app/views/Templates/page/analyze.html.twig @@ -14,34 +14,60 @@ -
    -
    -
    - Type : - Intensité : - Date : - -
    -
    - {% for analyze in analyzes %} + + - - - - - - - - - - - - - + + + + + + + + + - {% endfor %} + + {% for analyze in analyzes %} + + + + + + + + + + + + + + {% endfor %} +
    {{analyze.date}}{{analyze.heureDebut}}{{analyze.heureFin}}{{analyze.type}}{{analyze.effortRessenti}}{{analyze.variabilite}}{{analyze.variance}}{{analyze.ecartType}}{{analyze.moyenne}} Bpm{{analyze.max}} Bpm{{analyze.min}} Bpm{{analyze.temperature}} °CHomeid FCaltitudetempsTemperaturebpmlongitudelatitudeactiviteid
    {{analyze.idfc}}{{analyze.altitude}}{{analyze.temps}}{{analyze.temperature}}{{analyze.bpm}}{{analyze.longitude}}{{analyze.latitude}}{{analyze.activiteid}}Home
    +
    +
    + +
    diff --git a/Sources/src/app/views/Templates/page/exercice.html.twig b/Sources/src/app/views/Templates/page/exercice.html.twig index 371a3317..07b08632 100755 --- a/Sources/src/app/views/Templates/page/exercice.html.twig +++ b/Sources/src/app/views/Templates/page/exercice.html.twig @@ -21,7 +21,7 @@
    -
    +
    diff --git a/Sources/src/data/core/database/AnalyzeMapper.php b/Sources/src/data/core/database/AnalyzeMapper.php index 6adc7733..33077162 100644 --- a/Sources/src/data/core/database/AnalyzeMapper.php +++ b/Sources/src/data/core/database/AnalyzeMapper.php @@ -2,6 +2,8 @@ namespace Database; +use Shared\Log; + class AnalyzeMapper { public function analyzeSqlToEntity(array $data):array diff --git a/Sources/src/data/core/database/data/frequenceCardiaque.sql b/Sources/src/data/core/database/data/frequenceCardiaque.sql new file mode 100644 index 00000000..a602a401 --- /dev/null +++ b/Sources/src/data/core/database/data/frequenceCardiaque.sql @@ -0,0 +1,21 @@ +INSERT INTO FrequenceCardiaque VALUES(1, 100, '08:15:00', 15, 130, 45.75771709151474, 3.113484980409329, 1); +INSERT INTO FrequenceCardiaque VALUES + (2, ROUND(RANDOM() * 10 + 90), '08:16:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75772709151474, 3.113494980409329, 1), + (3, ROUND(RANDOM() * 10 + 90), '08:17:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75773709151474, 3.113504980409329, 1), + (4, ROUND(RANDOM() * 10 + 90), '08:18:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75774709151474, 3.113514980409329, 1), + (5, ROUND(RANDOM() * 10 + 90), '08:19:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75775709151474, 3.113524980409329, 1), + (6, ROUND(RANDOM() * 10 + 90), '08:20:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75776709151474, 3.113534980409329, 1), + (7, ROUND(RANDOM() * 10 + 90), '08:21:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75777709151474, 3.113544980409329, 1), + (8, ROUND(RANDOM() * 10 + 90), '08:22:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75778709151474, 3.113554980409329, 1), + (9, ROUND(RANDOM() * 10 + 90), '08:23:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75779709151474, 3.113564980409329, 1), + (10, ROUND(RANDOM() * 10 + 90), '08:24:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75780709151474, 3.113574980409329, 1), + (11, ROUND(RANDOM() * 10 + 90), '08:25:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75781709151474, 3.113584980409329, 1), + (12, ROUND(RANDOM() * 10 + 90), '08:26:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75782709151474, 3.113594980409329, 1), + (13, ROUND(RANDOM() * 10 + 90), '08:27:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75783709151474, 3.113604980409329, 1), + (14, ROUND(RANDOM() * 10 + 90), '08:28:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75784709151474, 3.113614980409329, 1), + (15, ROUND(RANDOM() * 10 + 90), '08:29:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75785709151474, 3.113624980409329, 1), + (16, ROUND(RANDOM() * 10 + 90), '08:30:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75786709151474, 3.113634980409329, 1), + (17, ROUND(RANDOM() * 10 + 90), '08:31:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75787709151474, 3.113644980409329, 1), + (18, ROUND(RANDOM() * 10 + 90), '08:32:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75788709151474, 3.113654980409329, 1), + (19, ROUND(RANDOM() * 10 + 90), '08:33:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75789709151474, 3.113664980409329, 1), + (20, ROUND(RANDOM() * 10 + 90), '08:34:00', ROUND(RANDOM() * 5 + 10), ROUND(RANDOM() * 20 + 110), 45.75790709151474, 3.113674980409329, 1); \ No newline at end of file From 9e57169ae60ee2f33afe9a5d772def95d0f9a4d5 Mon Sep 17 00:00:00 2001 From: anperederi Date: Thu, 21 Dec 2023 22:02:06 +0100 Subject: [PATCH 41/48] test to add chart but not conclude --- Sources/config/config.php | 8 +-- Sources/src/app/controller/UserController.php | 20 +++++- .../app/views/Templates/page/home.html.twig | 64 +++++++++++++------ .../src/data/core/database/AthleteGateway.php | 10 ++- package-lock.json | 28 ++++++++ package.json | 5 ++ 6 files changed, 109 insertions(+), 26 deletions(-) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/Sources/config/config.php b/Sources/config/config.php index f28606cb..4d0a0f4d 100755 --- a/Sources/config/config.php +++ b/Sources/config/config.php @@ -12,10 +12,10 @@ $dotenv->safeLoad(); // const DB_PASSWORD = $_ENV['DB_PASSWORD'] ?? 'achanger'; define("APP_ENV", 'development'); -const DB_SERVER = 'mysql'; -const DB_HOST = 'localhost:3306'; -const DB_DATABASE = 'new'; -const DB_USER = 'root'; +const DB_SERVER = 'pgsql'; +const DB_HOST = 'localhost'; +const DB_DATABASE = 'sae_3'; +const DB_USER = 'Perederii'; const DB_PASSWORD = ''; //const APP_ENV = 'console'; diff --git a/Sources/src/app/controller/UserController.php b/Sources/src/app/controller/UserController.php index 6ce05f94..ca403f69 100644 --- a/Sources/src/app/controller/UserController.php +++ b/Sources/src/app/controller/UserController.php @@ -47,10 +47,26 @@ class UserController extends BaseController { $athleteGateway = new AthleteGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); $activity = $athleteGateway->getListActivity('1');//$currentUser->getId() +// Log::dd($activity); + $chart = []; foreach($activity as $act){ - $chart["act"] = $act["nbActivite"]; - $chart["mois"] = date('M', mktime(0, 0, 0, $act["mois"], 10)); + $chart[] = ['act' => $act['nbactivite'], 'mois' => date('m', $act['mois'])]; } + +// $activityGateway = new ActivityGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); +// $listSearch = $activityGateway->getActivity(); +// $map = new ActivityMapper(); +// $activityGateway = $map->activitySqlToEntity($listSearch); +// $listActivity = []; +// foreach ($activityGateway as $entity) { +// $activity = $map->activityEntityToModel($entity); +// $listActivity[] = ['idactivity' => number_format($activity->getIdActivity()), 'type' => $activity->getType(), +// 'date' => $activity->getDate()->format("D j F Y"), 'heureDebut' => $activity->getHeureDebut()->format("H\h i"), 'heureFin' => $activity->getHeureFin()->format("H\h i"), +// 'effortRessenti' => $activity->getEffortRessenti(), 'variabilite' => $activity->getVariability(), 'variance' => $activity->getVariance(), +// 'ecartType' => $activity->getStandardDeviation(), 'moyenne' => $activity->getAverage(), +// 'max' => $activity->getMaximum(), 'min' => $activity->getMinimum(), 'temperature' => $activity->getAvrTemperature()]; +// } +// Log::dd($chart); return $this->render('./page/home.html.twig',[ 'css' => $this->preference->getCookie(), 'pp' => "test2", diff --git a/Sources/src/app/views/Templates/page/home.html.twig b/Sources/src/app/views/Templates/page/home.html.twig index f75c376c..d626f45f 100755 --- a/Sources/src/app/views/Templates/page/home.html.twig +++ b/Sources/src/app/views/Templates/page/home.html.twig @@ -21,27 +21,55 @@ Stastiques globales +
    - - - - + }); + +{# #}
    diff --git a/Sources/src/data/core/database/AthleteGateway.php b/Sources/src/data/core/database/AthleteGateway.php index b73e9380..a6677c89 100644 --- a/Sources/src/data/core/database/AthleteGateway.php +++ b/Sources/src/data/core/database/AthleteGateway.php @@ -86,10 +86,15 @@ class AthleteGateway { return $this->connection->executeWithErrorHandling($query, $params); } - + public function getListActivity(int $idAthlete): array { - $query = "SELECT count(ac.idActivite) AS nbActivite, MONTH(ac.date) AS mois FROM Athlete at, Activite ac WHERE at.idAthlete = :idAthlete AND ac.date > DATE_SUB(date, INTERVAL 1 YEAR) AND ac.athleteId=at.idAthlete GROUP BY mois"; + $query = "SELECT count(ac.idActivite) AS nbActivite, EXTRACT(MONTH FROM ac.date) AS mois + FROM Athlete at, Activite ac + WHERE at.idAthlete = :idAthlete + AND ac.date > CURRENT_DATE - INTERVAL '1 YEAR' + AND ac.athleteId = at.idAthlete + GROUP BY mois"; $params = [ ':idAthlete' => $idAthlete, @@ -98,6 +103,7 @@ class AthleteGateway { return $this->connection->executeWithErrorHandling($query, $params); } + public function addAthlete(AthleteEntity $athlete): array { $query = "INSERT INTO Athlete (nom, prenom, email, sexe, taille, poids, motDePasse, dateNaissance, isCoach) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..b143d20d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,28 @@ +{ + "name": "Web", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "chart.js": "^4.4.1" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, + "node_modules/chart.js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.1.tgz", + "integrity": "sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=7" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..3df43b72 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "chart.js": "^4.4.1" + } +} From 6786eea1c46cd493e993d31355048522b04ac00d Mon Sep 17 00:00:00 2001 From: anperederi Date: Fri, 22 Dec 2023 00:55:23 +0100 Subject: [PATCH 42/48] add heartRate Graph --- .../views/Templates/page/activity.html.twig | 1 + .../views/Templates/page/analyze.html.twig | 75 +++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/Sources/src/app/views/Templates/page/activity.html.twig b/Sources/src/app/views/Templates/page/activity.html.twig index 89e9607b..e14809bc 100644 --- a/Sources/src/app/views/Templates/page/activity.html.twig +++ b/Sources/src/app/views/Templates/page/activity.html.twig @@ -67,6 +67,7 @@
    + {% endfor %} diff --git a/Sources/src/app/views/Templates/page/analyze.html.twig b/Sources/src/app/views/Templates/page/analyze.html.twig index e1d4a5bb..712b9708 100755 --- a/Sources/src/app/views/Templates/page/analyze.html.twig +++ b/Sources/src/app/views/Templates/page/analyze.html.twig @@ -47,10 +47,85 @@ {% endfor %}
    {{analyze.max}} Bpm {{analyze.min}} Bpm {{analyze.temperature}} °C{{analyze.idactivity}} °C En savoir plus
    +{#
    #} +{# #} +{#

    Hello Fallback World

    #} +{#
    #} +{#
    #} +{# #} +{# #} +
    + +

    Hello Fallback World

    +
    +
    + +
    - - - - - - - - - - - - - - - {% for analyze in analyzes %} - - - - - - - - - - - - - - {% endfor %} -
    id FCaltitudetempsTemperaturebpmlongitudelatitudeactiviteid
    {{analyze.idfc}}{{analyze.altitude}}{{analyze.temps}}{{analyze.temperature}}{{analyze.bpm}}{{analyze.longitude}}{{analyze.latitude}}{{analyze.activiteid}}Home
    +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# {% for analyze in analyzes %}#} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# {% endfor %}#} +{#
    id FCaltitudetempsTemperaturebpmlongitudelatitudeactiviteid
    {{analyze.idfc}}{{analyze.altitude}}{{analyze.temps}}{{analyze.temperature}}{{analyze.bpm}}{{analyze.longitude}}{{analyze.latitude}}{{analyze.activiteid}}Home
    #} {#
    #} {# #} {#

    Hello Fallback World

    #} @@ -84,7 +84,7 @@ {# });#} {# #}
    - +

    Hello Fallback World

    @@ -109,7 +109,10 @@ datasets: [{ label: 'Batement par minute', data: data, - borderWidth: 1 + borderWidth: 1, + tension: 0.2, + fill: false, + borderColor: 'rgb(255, 0, 0)' }] }, options: { diff --git a/Sources/src/app/views/Templates/page/home.html.twig b/Sources/src/app/views/Templates/page/home.html.twig index d626f45f..e7df9548 100755 --- a/Sources/src/app/views/Templates/page/home.html.twig +++ b/Sources/src/app/views/Templates/page/home.html.twig @@ -21,55 +21,88 @@ Stastiques globales
    - -
    - +
    + +

    Hello Fallback World

    +
    + + -{# #} + {#new Chart(ctx, {#} + {# type: 'line',#} + {# data: {#} + {# labels: labels,#} + {# datasets: [{#} + {# label: 'Activité du mois',#} + {# data: data,#} + {# borderWidth: 1,#} + {# tension: 0.2,#} + {# fill: false,#} + {# borderColor: 'rgb(255, 0, 0)'#} + {# }]#} + {# },#} + {# options: {#} + {# scales: {#} + {# y: {#} + {# beginAtZero: true#} + {# }#} + {# }#} + {# }#} + {#});#} +
    From 2efb321f6af180a1d9fd5d8c0ab5e40b768c6e55 Mon Sep 17 00:00:00 2001 From: anperederi Date: Tue, 9 Jan 2024 11:12:04 +0100 Subject: [PATCH 44/48] update some parts with database --- Sources/config/config.php | 2 +- .../src/app/controller/AthleteController.php | 4 +- Sources/src/app/controller/AuthController.php | 23 +++- Sources/src/app/controller/UserController.php | 101 +++++++++++++++--- .../app/router/middleware/AuthMiddleware.php | 2 +- .../src/app/views/Templates/base.html.twig | 2 +- .../app/views/Templates/page/home.html.twig | 9 +- .../app/views/Templates/page/import.html.twig | 2 +- .../src/app/views/Templates/page/index.html | 2 +- .../src/data/core/database/ActivityEntity.php | 8 +- .../src/data/core/database/ActivityMapper.php | 33 +++--- .../src/data/core/database/AthleteGateway.php | 34 ++++-- .../src/data/core/database/AthleteMapper.php | 1 - .../core/database/NotificationGateway.php | 4 +- .../src/data/core/database/data/athlete.sql | 12 +-- .../core/database/data/frequenceCardiaque.sql | 43 ++++---- .../data/core/database/data/friendship.sql | 3 - .../src/data/core/database/data/tables.sql | 20 ++-- Sources/src/data/core/network/AuthService.php | 22 +++- Sources/src/data/model/Activity.php | 3 +- Sources/src/data/model/Notification.php | 9 +- Sources/src/data/model/Role.php | 1 - Sources/src/data/model/Training.php | 9 +- Sources/src/data/model/User.php | 25 +++-- .../data/model/manager/ActivityManager.php | 2 +- .../repository/NotificationRepository.php | 10 +- .../data/stub/repository/UserRepository.php | 10 +- 27 files changed, 264 insertions(+), 132 deletions(-) diff --git a/Sources/config/config.php b/Sources/config/config.php index 8d5b276e..dab98bf1 100755 --- a/Sources/config/config.php +++ b/Sources/config/config.php @@ -12,7 +12,7 @@ $dotenv->safeLoad(); // const DB_PASSWORD = $_ENV['DB_PASSWORD'] ?? 'achanger'; define("APP_ENV", getenv('APP_ENV')); -const DB_SERVER = 'pgsql'; +const DB_SERVER = 'mysql'; const DB_HOST = 'localhost'; const DB_DATABASE = 'sae_3'; const DB_USER = 'Perederii'; diff --git a/Sources/src/app/controller/AthleteController.php b/Sources/src/app/controller/AthleteController.php index 6513b409..c5b1d9ee 100644 --- a/Sources/src/app/controller/AthleteController.php +++ b/Sources/src/app/controller/AthleteController.php @@ -302,8 +302,8 @@ class AthleteController extends BaseController $athleteEntity = $map->athleteSqlToEntity($userSearched); $users=[]; foreach ($athleteEntity as $user) { - $this->userMgr->getCurrentUser()->addFriend($user); - $currentUser->addFriend($user); +// $this->userMgr->getCurrentUser()->addFriend($user); +// $currentUser->addFriend($user); $users = ['nom' => $user->getNom(), 'prenom' => $user->getPrenom(), 'img' => 'test', 'username' => $user->getUsername()]; } $notif = new NotificationGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); diff --git a/Sources/src/app/controller/AuthController.php b/Sources/src/app/controller/AuthController.php index 5c0006ba..a62fb2a3 100644 --- a/Sources/src/app/controller/AuthController.php +++ b/Sources/src/app/controller/AuthController.php @@ -9,6 +9,9 @@ use App\Router\Response\Response; use App\Router\Response\IResponse; use App\Router\Session; +use Database\AthleteGateway; +use Database\AthleteMapper; +use Database\Connexion; use Manager\UserManager; use Shared\Attributes\Route; use Shared\Validation; @@ -33,7 +36,21 @@ class AuthController extends BaseController $log=$email; // should check email with verrify email $mdp=Validation::clean_string($password); if($this->userMgr->login($log,$mdp)){ - return new RedirectResponse('/home'); + $athleteGateway = new AthleteGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); + $user = $athleteGateway->getUserByEmail($email); + $map = new AthleteMapper(); + $userEntity = $map->athleteSqlToEntity($user); + + $users = ['username' => $userEntity[0]->getUsername(), 'nom' => $userEntity[0]->getNom(), + 'prenom' => $userEntity[0]->getPrenom(),'email' => $userEntity[0]->getEmail(), 'sexe' => $userEntity[0]->getSexe(), + 'taille' => $userEntity[0]->getTaille(), 'poids' => $userEntity[0]->getPoids(), 'motdepasse' => $userEntity[0]->getMotDePasse(), + 'datenaissance' => $userEntity[0]->getDateNaissance(), 'iscoach' => $userEntity[0]->getIsCoach(), 'img' => 'test']; + return $this->render('./page/home.html.twig', [ + 'css' => $this->preference->getCookie(), + 'pp' => $users['img'], + 'user' => $users['username'], + 'role' => $users['iscoach'] + ]); } else{ $error [] = "Erreur de connexion. Essayez encore"; @@ -59,14 +76,14 @@ class AuthController extends BaseController public function login2(IRequest $request): IResponse { return $this->render('./page/login.html.twig',[ - 'css' => $this->preference->getCookie(), + 'css' => $this->preference->getCookie() ]); } #[Route('/register', name: 'register2' , methods:['GET'])] public function register2(IRequest $request): IResponse{ return $this->render('./page/register.html.twig',[ - 'css' => $this->preference->getCookie(), + 'css' => $this->preference->getCookie() ]); } diff --git a/Sources/src/app/controller/UserController.php b/Sources/src/app/controller/UserController.php index e97dd508..dc0c5536 100644 --- a/Sources/src/app/controller/UserController.php +++ b/Sources/src/app/controller/UserController.php @@ -9,6 +9,7 @@ use App\Router\Response\Response; use App\Router\Response\IResponse; use App\Router\Session; +use DateInterval; use DateTime; use Manager\UserManager; use Shared\Attributes\Route; @@ -53,23 +54,97 @@ class UserController extends BaseController $athleteGateway = new AthleteGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); $activity = $athleteGateway->getListActivity('1');//$currentUser->getId() +// $charts = []; +// $i = 0; +// while ($i <= 12) { +// if ($activity[$i]['mois'] == null) { +// $activity[$i]['mois'] = $i; +// $activity[$i]['nbactivite'] = 0; +// } elseif (($indice = intval($activity[$i]['mois'])) != $i) { +// $temp = $activity[$i]; // Stocker temporairement les données actuelles +// $activity[$i]['mois'] = $i; +// $activity[$i]['nbactivite'] = 0; +// $activity[$indice]['mois'] = $indice; +// $activity[$indice]['nbactivite'] = $temp['nbactivite']; // Restaurer les données +// } +// $charts[] = ['act' => $activity[$i]['nbactivite'], 'mois' => $activity[$i]['mois']]; +// $i++; +// } + $charts = []; - $i = 0; - while ($i <= 12) { - if ($activity[$i]['mois'] == null) { - $activity[$i]['mois'] = $i; - $activity[$i]['nbactivite'] = 0; - } elseif (($indice = intval($activity[$i]['mois'])) != $i) { - $temp = $activity[$i]; // Stocker temporairement les données actuelles - $activity[$i]['mois'] = $i; - $activity[$i]['nbactivite'] = 0; - $activity[$indice]['mois'] = $indice; - $activity[$indice]['nbactivite'] = $temp['nbactivite']; // Restaurer les données + $monthNames = [ + 'Janvier', 'Fevrier', 'Mars', 'Avril', 'Mai', 'Juin', + 'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Decembre' + ]; + + $currentDate = new DateTime(); + $interval = new DateInterval('P1M'); // Période d'un mois + + for ($i = 0; $i < 12; $i++) { + $currentMonth = $currentDate->format('n'); // Format numérique du mois (1 à 12) + $currentMonthName = $monthNames[$currentMonth - 1]; // Mois correspondant dans le tableau + + // Recherche de l'indice du mois dans le tableau $activity + $activityIndex = null; + for ($j = 0; $j < count($activity); $j++) { + if (!empty($activity[$j]['mois']) && $activity[$j]['mois'] == $currentMonth) { + $activityIndex = $j; + break; + } + } + + // Récupération du nombre d'activités et réinitialisation à 0 + $nbActivity = isset($activityIndex) ? $activity[$activityIndex]['nbactivite'] : 0; + if (isset($activityIndex)) { + $activity[$activityIndex]['nbactivite'] = 0; } - $charts[] = ['act' => $activity[$i]['nbactivite'], 'mois' => $activity[$i]['mois']]; - $i++; +// Log::dd($currentMonth); + $charts[] = ['act' => $nbActivity, 'mois' => $currentMonth]; + $currentDate->sub($interval); } +// Inverser l'ordre des éléments si nécessaire + $charts = array_reverse($charts); + +// Log::dd($charts); + +// +// $charts = []; +// $monthNames = [ +// 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', +// 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre' +// ]; +// +// $currentDate = new DateTime(); +// $interval = new DateInterval('P1M'); // Période d'un mois +// +// for ($i = 0; $i < 12; $i++) { +//// $currentDate; // Soustraire un mois +//// Log::dd($currentDate); +// $currentMonth = $currentDate->format('n'); // Format numérique du mois (1 à 12) +//// Log::dd($currentMonth); +// $currentMonthName = $monthNames[$currentMonth - 1]; // Mois correspondant dans le tableau +// for($j = 12; $j > 0; $j--) { +// if(!empty($activity[$j]['mois']) || $activity[$j]['mois'] == $currentMonth) { +// $nbAct = $activity[$j]['nbactivite']; +// $activity[$j]['nbactivite'] = 0; +//// Log::dd($activity); +// break; +// } +// } +// +// $nbActivity = isset($nbAct) ? $nbAct : 0; +//// Log::dd($nbActivity); +// +// $charts[] = ['act' => $nbActivity, 'mois' => $currentMonthName]; +// $currentDate->sub($interval); +// } +// Log::dd($charts); + +// Inverser l'ordre des éléments si nécessaire +// $charts = array_reverse($charts); +// +// Log::dd($charts); return $this->render('./page/home.html.twig',[ 'css' => $this->preference->getCookie(), 'pp' => "test2", diff --git a/Sources/src/app/router/middleware/AuthMiddleware.php b/Sources/src/app/router/middleware/AuthMiddleware.php index a2b95c29..e95f389d 100644 --- a/Sources/src/app/router/middleware/AuthMiddleware.php +++ b/Sources/src/app/router/middleware/AuthMiddleware.php @@ -13,7 +13,7 @@ class AuthMiddleware extends Middleware { $this->auth = $auth; } public function handle(IRequest $request, callable $next) { - $excludedUrls = ['/login', '/register','/forgetPassword']; + $excludedUrls = ['/login', '/register','/forgetPassword', '/']; if ($this->auth->getCurrentUser() === null && !in_array($request->getRequestUri(), $excludedUrls)) { $resp = new RedirectResponse("/login"); diff --git a/Sources/src/app/views/Templates/base.html.twig b/Sources/src/app/views/Templates/base.html.twig index d187eabb..aed11cb5 100755 --- a/Sources/src/app/views/Templates/base.html.twig +++ b/Sources/src/app/views/Templates/base.html.twig @@ -60,7 +60,7 @@ - Analyses + Activités
    Social
    diff --git a/Sources/src/app/views/Templates/page/home.html.twig b/Sources/src/app/views/Templates/page/home.html.twig index e7df9548..3143ca51 100755 --- a/Sources/src/app/views/Templates/page/home.html.twig +++ b/Sources/src/app/views/Templates/page/home.html.twig @@ -31,18 +31,15 @@ const ctx = document.getElementById('myChart'); const labels = [ {% for chart in charts %} - {{ chart.mois }}, + {{ chart.mois }}, {% endfor %} ]; const data = [ {% for chart in charts %} - {{ chart.act }}, + {{ chart.act }}, {% endfor %} ]; - console.log(labels); // Vérifiez les valeurs dans la console - console.log(data); // Vérifiez les valeurs dans la console - new Chart(ctx, { type: 'line', data: { @@ -59,7 +56,7 @@ options: { scales: { x: { - type: 'linear', // Utiliser une échelle linéaire pour les mois + // type: 'linear', // Utiliser une échelle linéaire pour les mois position: 'bottom' }, y: { diff --git a/Sources/src/app/views/Templates/page/import.html.twig b/Sources/src/app/views/Templates/page/import.html.twig index 1410c69d..4598ceb4 100644 --- a/Sources/src/app/views/Templates/page/import.html.twig +++ b/Sources/src/app/views/Templates/page/import.html.twig @@ -44,7 +44,7 @@ select a file from your computer

    - +

    diff --git a/Sources/src/app/views/Templates/page/index.html b/Sources/src/app/views/Templates/page/index.html index 404946e8..081c934c 100644 --- a/Sources/src/app/views/Templates/page/index.html +++ b/Sources/src/app/views/Templates/page/index.html @@ -205,7 +205,7 @@
    -

    Application bientôt disponible !

    +

    Application mobile bientôt disponible !

    athlete activity --> source activity <-- fc -coach --> athlete athlete <-- source stats --> athlete takepart --> athlete takepart --> training +givepart --> athlete +givepart --> training +sendNotif --> athlete +sendNotif --> notif friendship --> athlete notif --> athlete -coach <-- training athlete <-- friendship +@enduml +``` + +```plantuml +@startuml + +class Athlete { + idAthlete + username + nom + prenom + email + sexe + taille + poids + motDePasse + dateNaissance + isCoach +} + +class Amitie { + idAthlete1 + idAthlete2 +} + +class Notification { + idNotif + message + date + statut + urgence + athleteId +} + +class Envoi { + idAthlete + idNotif +} + +class Statistique { + idStatistique + poids + fcMoyenne + fcMax + caloriesBruleesMoy + date + athleteId +} + +class Entrainement { + idEntrainement + date + description + latitude + longitude + feedback + athleteId +} + +class Participe { + athleteId + entrainementId +} + +class Donne { + coachId + entrainementId +} + +class SourceDonnee { + idSource + type + modele + precision + athleteId +} + +class Activite { + idActivite + type + date + heureDeDebut + heureDeFin + effortRessent + variabilite + variance + ecartType + moyenne + maximum + minimum + temperatureMoyenne + athleteId + sourceId +} + +class FrequenceCardiaque { + idFc + altitude + temps + temperature + bpm + longitude + latitude + activiteId +} + +Athlete "1" --o "0..*" Amitie +Athlete "1" --o "0..*" Notification +Athlete "1" --o "0..*" Statistique +Athlete "1" --o "0..*" Entrainement +Entrainement "0..*" --o "0..*" Athlete : Participants +Entrainement "0..*" --o "0..*" Athlete : Coachs +Athlete "1" --o "0..*" SourceDonnee +Activite "1" --o "0..*" FrequenceCardiaque + @enduml ``` \ No newline at end of file diff --git a/Sources/src/app/controller/AuthController.php b/Sources/src/app/controller/AuthController.php index a62fb2a3..0c0a20ca 100644 --- a/Sources/src/app/controller/AuthController.php +++ b/Sources/src/app/controller/AuthController.php @@ -36,20 +36,21 @@ class AuthController extends BaseController $log=$email; // should check email with verrify email $mdp=Validation::clean_string($password); if($this->userMgr->login($log,$mdp)){ - $athleteGateway = new AthleteGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); - $user = $athleteGateway->getUserByEmail($email); - $map = new AthleteMapper(); - $userEntity = $map->athleteSqlToEntity($user); - - $users = ['username' => $userEntity[0]->getUsername(), 'nom' => $userEntity[0]->getNom(), - 'prenom' => $userEntity[0]->getPrenom(),'email' => $userEntity[0]->getEmail(), 'sexe' => $userEntity[0]->getSexe(), - 'taille' => $userEntity[0]->getTaille(), 'poids' => $userEntity[0]->getPoids(), 'motdepasse' => $userEntity[0]->getMotDePasse(), - 'datenaissance' => $userEntity[0]->getDateNaissance(), 'iscoach' => $userEntity[0]->getIsCoach(), 'img' => 'test']; +// Log::dd($this->userMgr->getCurrentUser()); +// $athleteGateway = new AthleteGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); +// $user = $athleteGateway->getUserByEmail($email); +// $map = new AthleteMapper(); +// $userEntity = $map->athleteSqlToEntity($user); +// +// $users = ['username' => $userEntity[0]->getUsername(), 'nom' => $userEntity[0]->getNom(), +// 'prenom' => $userEntity[0]->getPrenom(),'email' => $userEntity[0]->getEmail(), 'sexe' => $userEntity[0]->getSexe(), +// 'taille' => $userEntity[0]->getTaille(), 'poids' => $userEntity[0]->getPoids(), 'motdepasse' => $userEntity[0]->getMotDePasse(), +// 'datenaissance' => $userEntity[0]->getDateNaissance(), 'iscoach' => $userEntity[0]->getIsCoach(), 'img' => 'test']; return $this->render('./page/home.html.twig', [ 'css' => $this->preference->getCookie(), - 'pp' => $users['img'], - 'user' => $users['username'], - 'role' => $users['iscoach'] + 'pp' => 'test', +// 'user' => $this->userMgr->getCurrentUser()->getUsername(), +// 'role' => $this->userMgr->getCurrentUser()->getRole() ]); } else{ diff --git a/Sources/src/app/router/middleware/AuthMiddleware.php b/Sources/src/app/router/middleware/AuthMiddleware.php index e95f389d..7e6cbc06 100644 --- a/Sources/src/app/router/middleware/AuthMiddleware.php +++ b/Sources/src/app/router/middleware/AuthMiddleware.php @@ -14,7 +14,7 @@ class AuthMiddleware extends Middleware { } public function handle(IRequest $request, callable $next) { $excludedUrls = ['/login', '/register','/forgetPassword', '/']; - +// Log::dd($this->auth->getCurrentUser()); if ($this->auth->getCurrentUser() === null && !in_array($request->getRequestUri(), $excludedUrls)) { $resp = new RedirectResponse("/login"); $resp->send(); diff --git a/Sources/src/data/core/database/AthleteMapper.php b/Sources/src/data/core/database/AthleteMapper.php index 61822046..265109c0 100644 --- a/Sources/src/data/core/database/AthleteMapper.php +++ b/Sources/src/data/core/database/AthleteMapper.php @@ -14,8 +14,8 @@ class AthleteMapper { foreach ($data as $athleteData) { $athlete = new AthleteEntity(); - if (isset($athleteData['idathlete'])) { - $athlete->setIdAthlete($athleteData['idathlete']); + if (isset($athleteData['idAthlete'])) { + $athlete->setIdAthlete($athleteData['idAthlete']); } if (isset($athleteData['nom'])) { @@ -46,16 +46,16 @@ class AthleteMapper { $athlete->setPoids($athleteData['poids']); } - if (isset($athleteData['motdepasse'])) { - $athlete->setMotDePasse($athleteData['motdepasse']); + if (isset($athleteData['motDePasse'])) { + $athlete->setMotDePasse($athleteData['motDePasse']); } - if (isset($athleteData['datenaissance'])) { - $athlete->setDateNaissance($athleteData['datenaissance']); + if (isset($athleteData['dateNaissance'])) { + $athlete->setDateNaissance($athleteData['dateNaissance']); } - if (isset($athleteData['iscoach'])) { - $athlete->setIsCoach($athleteData['iscoach']); + if (isset($athleteData['isCoach'])) { + $athlete->setIsCoach($athleteData['isCoach']); } $athleteEntities[] = $athlete; diff --git a/Sources/src/data/core/database/CoachEntity.php b/Sources/src/data/core/database/CoachEntity.php index a1648402..84b0f4dc 100644 --- a/Sources/src/data/core/database/CoachEntity.php +++ b/Sources/src/data/core/database/CoachEntity.php @@ -4,24 +4,106 @@ namespace Database; class CoachEntity { private $idCoach; - private $athleteId; + private $nom; + private $prenom; + private $username; + private $email; + private $sexe; + private $taille; + private $poids; + private $motDePasse; + private $dateNaissance; + private $isCoach; // Getters public function getIdCoach() { return $this->idCoach; } - public function getAthleteId() { - return $this->athleteId; + public function getNom() { + return $this->nom; } + public function getPrenom() { + return $this->prenom; + } + + public function getUsername(){ + return $this->username; + } + + public function getEmail() { + return $this->email; + } + + public function getSexe() { + return $this->sexe; + } + + public function getTaille() { + return $this->taille; + } + + public function getPoids() { + return $this->poids; + } + + public function getMotDePasse() { + return $this->motDePasse; + } + + public function getDateNaissance() { + return $this->dateNaissance; + } + + public function getIsCoach(){ + return $this->isCoach; + } + + // Setters public function setIdCoach($idCoach) { $this->idCoach = $idCoach; } - public function setAthleteId($athleteId) { - $this->athleteId = $athleteId; + public function setNom($nom) { + $this->nom = $nom; + } + + public function setPrenom($prenom) { + $this->prenom = $prenom; + } + + public function setUsername($username){ + $this->username = $username; + } + + public function setEmail($email) { + $this->email = $email; + } + + public function setSexe($sexe) { + $this->sexe = $sexe; + } + + public function setTaille($taille) { + $this->taille = $taille; + } + + public function setPoids($poids) { + $this->poids = $poids; + } + + public function setMotDePasse($motDePasse) { + $this->motDePasse = $motDePasse; + } + + public function setDateNaissance($dateNaissance) { + $this->dateNaissance = $dateNaissance; + } + + public function setIsCoach($isCoach){ + $this->isCoach = $isCoach; } } diff --git a/Sources/src/data/core/database/CoachMapper.php b/Sources/src/data/core/database/CoachMapper.php index f3fd48ec..79d3b21a 100644 --- a/Sources/src/data/core/database/CoachMapper.php +++ b/Sources/src/data/core/database/CoachMapper.php @@ -7,6 +7,7 @@ use \PDO; use \DateTime; use Model\Role; use Model\Coach; +use Shared\Log; class CoachMapper { public function coachSqlToEntity(array $data): array { @@ -15,12 +16,48 @@ class CoachMapper { foreach ($data as $coachData) { $coach = new CoachEntity(); - if (isset($coachData['idCoach'])) { - $coach->setIdCoach($coachData['idCoach']); + if (isset($coachData['idAthlete'])) { + $coach->setIdCoach($coachData['idAthlete']); } - if (isset($coachData['athleteId'])) { - $coach->setAthleteId($coachData['athleteId']); + if (isset($coachData['nom'])) { + $coach->setNom($coachData['nom']); + } + + if (isset($coachData['prenom'])) { + $coach->setPrenom($coachData['prenom']); + } + + if (isset($coachData['username'])) { + $coach->setUsername($coachData['username']); + } + + if (isset($coachData['email'])) { + $coach->setEmail($coachData['email']); + } + + if (isset($coachData['sexe'])) { + $coach->setSexe($coachData['sexe']); + } + + if (isset($coachData['taille'])) { + $coach->setTaille($coachData['taille']); + } + + if (isset($coachData['poids'])) { + $coach->setPoids($coachData['poids']); + } + + if (isset($coachData['motDePasse'])) { + $coach->setMotDePasse($coachData['motDePasse']); + } + + if (isset($coachData['dateNaissance'])) { + $coach->setDateNaissance($coachData['dateNaissance']); + } + + if (isset($coachData['isCoach'])) { + $coach->setIsCoach($coachData['isCoach']); } $coachEntities[] = $coach; @@ -31,25 +68,17 @@ class CoachMapper { public function CoachEntityToModel(CoachEntity $coachEntity):User{ $role = new CoachAthlete(); - - $idCoach = $coachEntity->getIdCoach(); - - $ath = getAthleteByCoachId($idCoach); - $athlete = athleteSqlToEntity($ath); - - $dateSpecific = $athlete->getDateNaissance(); - $date = new DateTime($dateSpecific); + $date = new DateTime($coachEntity->getDateNaissance()); $user = new User( - $coachEntity->getIdCoach(), - $athlete->getNom(), - $athlete->getPrenom(), - $athlete->getEmail(), - $athlete->getMotDePasse(), - $athlete->getSexe(), - $athlete->getTaille(), - $athlete->getPoids(), - $athlete->getDateNaissance(), + $coachEntity->getNom(), + $coachEntity->getPrenom(), + $coachEntity->getUsername(), + $coachEntity->getEmail(), + $coachEntity->getMotDePasse(), + $coachEntity->getSexe(), + $coachEntity->getTaille(), + $coachEntity->getPoids(), $date, $role ); diff --git a/Sources/src/data/core/database/UserGateway.php b/Sources/src/data/core/database/UserGateway.php new file mode 100644 index 00000000..1d73330e --- /dev/null +++ b/Sources/src/data/core/database/UserGateway.php @@ -0,0 +1,97 @@ +connection = $connection; + } + + public function getUsers(): array + { + $query = "SELECT * FROM Athlete"; + $res = $this->connection->executeWithErrorHandling($query); + return $res; + } + + public function getUserById(int $userId): array + { + $query = "SELECT * FROM Athlete WHERE idAthlete = :id"; + $params = [':id' => $userId]; + $res = $this->connection->executeWithErrorHandling($query, $params); + return $res; + } + + public function getUserByName(string $name): array + { + $query = "SELECT * FROM Athlete WHERE nom = :name"; + $params = [':name' => $name]; + return $this->connection->executeWithErrorHandling($query, $params); + } + + public function getUserByFirstName(string $firstName): array + { + $query = "SELECT * FROM Athlete WHERE prenom = :firstName"; + $params = [':firstName' => $firstName]; + return $this->connection->executeWithErrorHandling($query, $params); + } + + public function getUserByEmail(string $email): array + { + $query = "SELECT * FROM Athlete WHERE email = :email"; + $params = [':email' => $email]; + return $this->connection->executeWithErrorHandling($query, $params); + } + + public function getUserByGender(string $gender): array + { + $query = "SELECT * FROM Athlete WHERE sexe = :gender"; + $params = [':gender' => $gender]; + return $this->connection->executeWithErrorHandling($query, $params); + } + + public function getUserByHeight(int $height): array + { + $query = "SELECT * FROM Athlete WHERE taille = :height"; + $params = [':height' => [$height, PDO::PARAM_INT]]; + return $this->connection->executeWithErrorHandling($query, $params); + } + + public function getUserByWeight(int $weight): array + { + $query = "SELECT * FROM Athlete WHERE poids = :weight"; + $params = [':weight' => [$weight, PDO::PARAM_INT]]; + return $this->connection->executeWithErrorHandling($query, $params); + } + + public function getUserByBirthDate(string $birthdate): array + { + $query = "SELECT * FROM Athlete WHERE dateNaissance = :birthdate"; + $params = [':birthdate' => [$birthdate, PDO::PARAM_STR]]; + return $this->connection->executeWithErrorHandling($query, $params); + } + + public function deleteUserById(int $idAthlete): array + { + $query = "DELETE FROM Athlete WHERE idAthlete = :idAthlete"; + + $params = [ + ':idAthlete' => $idAthlete, + ]; + + return $this->connection->executeWithErrorHandling($query, $params); + } + public function deleteUserByEmail(string $email): array + { + $query = "DELETE FROM Athlete WHERE email = :email"; + + $params = [ + ':email' => $email, + ]; + + return $this->connection->executeWithErrorHandling($query, $params); + } +} \ No newline at end of file diff --git a/Sources/src/data/core/database/data/athlete.sql b/Sources/src/data/core/database/data/athlete.sql index 41115f78..fbe5e854 100644 --- a/Sources/src/data/core/database/data/athlete.sql +++ b/Sources/src/data/core/database/data/athlete.sql @@ -1,6 +1,6 @@ INSERT INTO Athlete (username, nom, prenom, email, sexe, taille, poids, motDePasse, dateNaissance, isCoach) VALUES - ('johnD63', 'Doe', 'John', 'john.doe@example.com', 'M', 1.80, 70, 'password123', '1990-01-01', FALSE), - ('janeS03', 'Smith', 'Jane', 'jane.smith@example.com', 'F', 1.65, 60, 'password456', '1992-02-02', TRUE), - ('bryanO', 'OConner', 'Bryan', 'bryan.oconner@example.com', 'M', 1.88, 86, 'password789', '1973-09-12', FALSE), - ('dominicT', 'Toretto', 'Dominic', 'dominic.toretto@example.com', 'M', 1.83, 94, 'password987', '1967-07-18', TRUE), - ('miaT', 'Toretto', 'Mia', 'mia.toretto@example.com', 'F', 1.70, 56, 'password654', '1980-04-26', FALSE); \ No newline at end of file + ('johnD63', 'Doe', 'John', 'john.doe@example.com', 'M', 1.80, 75, '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', '1985-05-15', TRUE), + ('janeS03', 'Smith', 'Jane', 'jane.smith@example.com', 'F', 1.65, 60, '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', '1990-03-10', FALSE), + ('bryanO', 'Martin', 'Paul', 'paul.martin@example.com', 'M', 1.75, 68, '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', '1988-08-20', TRUE), + ('dominicT', 'Brown', 'Anna', 'anna.brown@example.com', 'F', 1.70, 58, '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', '1992-11-25', FALSE), + ('miaT', 'Lee', 'Bruce', 'bruce.lee@example.com', 'M', 1.72, 70, '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', '1970-02-05', FALSE); \ No newline at end of file diff --git a/Sources/src/data/core/database/data/tables.sql b/Sources/src/data/core/database/data/tables.sql index cdf5802e..6875269c 100644 --- a/Sources/src/data/core/database/data/tables.sql +++ b/Sources/src/data/core/database/data/tables.sql @@ -66,7 +66,7 @@ CREATE TABLE SourceDonnee ( idSource INT AUTO_INCREMENT PRIMARY KEY, type VARCHAR(255), modele VARCHAR(255), - precision2 DECIMAL, + precision DECIMAL, athleteId INT, FOREIGN KEY (athleteId) REFERENCES Athlete(idAthlete) ); diff --git a/Sources/src/data/core/network/AuthService.php b/Sources/src/data/core/network/AuthService.php index acab5359..88c407d3 100644 --- a/Sources/src/data/core/network/AuthService.php +++ b/Sources/src/data/core/network/AuthService.php @@ -4,7 +4,9 @@ namespace Network; use App\Router\Session; use Database\AthleteGateway; use Database\AthleteMapper; +use Database\CoachMapper; use Database\Connexion; +use Database\UserGateway; use Model\User; use Model\Athlete; use Model\CoachAthlete; @@ -28,22 +30,39 @@ class AuthService implements IAuthService public function login(string $email, string $password): bool { // $user = $this->userRepository->getItemByEmail($email); - $userGateway = new AthleteGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); + $userGateway = new UserGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); $userRepository = $userGateway->getUserByEmail($email); - $map = new AthleteMapper(); - $userEntity = $map->athleteSqlToEntity($userRepository); -// $map->athleteEntityToModel($userRepository) +// Log::dd($userRepository[0]['isCoach']); + if($userRepository[0]['isCoach']) { + $map = new CoachMapper(); + $coachEntity = $map->coachSqlToEntity($userRepository); +// $user = []; + foreach($coachEntity as $coachs) { + $user = $map->CoachEntityToModel($coachs); + } + } else { + $map = new AthleteMapper(); + $athleteEntity = $map->athleteSqlToEntity($userRepository); + foreach($athleteEntity as $coachs) { + $user = $map->AthleteEntityToModel($coachs); + } + } - $user = ['username' => $userEntity[0]->getUsername(), 'nom' => $userEntity[0]->getNom(), - 'prenom' => $userEntity[0]->getPrenom(),'email' => $userEntity[0]->getEmail(), 'sexe' => $userEntity[0]->getSexe(), - 'taille' => $userEntity[0]->getTaille(), 'poids' => $userEntity[0]->getPoids(), 'motdepasse' => $userEntity[0]->getMotDePasse(), - 'datenaissance' => $userEntity[0]->getDateNaissance(), 'iscoach' => $userEntity[0]->getIsCoach(), 'img' => 'test']; +// Log::dd($user); +// $map->athleteEntityToModel($userRepository) - if ($user === null || !$this->passwordHacher->isPasswordValid($user[0]['motdepasse'],$password)) { +// $user = ['username' => $userEntity[0]->getUsername(), 'nom' => $userEntity[0]->getNom(), +// 'prenom' => $userEntity[0]->getPrenom(),'email' => $userEntity[0]->getEmail(), 'sexe' => $userEntity[0]->getSexe(), +// 'taille' => $userEntity[0]->getTaille(), 'poids' => $userEntity[0]->getPoids(), 'motdepasse' => $userEntity[0]->getMotDePasse(), +// 'datenaissance' => $userEntity[0]->getDateNaissance(), 'iscoach' => $userEntity[0]->getIsCoach(), 'img' => 'test']; +// Log::dd($this->passwordHacher->isPasswordValid($user->getMotDePasse(),$password)); + if ($user === null || !$this->passwordHacher->isPasswordValid($user->getMotDePasse(),$password)) { return false; } - $this->currentUser = $user[0]; + $this->currentUser = $user; +// Log::dd(Session::getInstance()->__get(USER)); Session::getInstance()->__set(USER, $this->currentUser->getId()); +// Log::dd(Session::getInstance()->__set(USER, $this->currentUser->getId())); return true; } From 5b7cdafdf41d6ac7a54ae80b1c1b89e0c6e78738 Mon Sep 17 00:00:00 2001 From: anperederi Date: Thu, 11 Jan 2024 15:02:17 +0100 Subject: [PATCH 46/48] add API --- Sources/composer.json | 3 +- Sources/composer.lock | 99 +- Sources/src/app/controller/AuthController.php | 49 +- .../app/router/middleware/AuthMiddleware.php | 2 +- .../src/data/core/database/ActivityMapper.php | 14 +- Sources/src/data/core/json/JsonSerializer.php | 20 + Sources/vendor/composer/autoload_classmap.php | 126 +- Sources/vendor/composer/autoload_psr4.php | 5 +- Sources/vendor/composer/autoload_static.php | 136 +- Sources/vendor/composer/installed.json | 409 +-- Sources/vendor/composer/installed.php | 67 +- .../nikic/php-parser/.php-cs-fixer.dist.php | 31 + Sources/vendor/nikic/php-parser/Makefile | 10 + Sources/vendor/nikic/php-parser/README.md | 32 +- Sources/vendor/nikic/php-parser/bin/php-parse | 21 +- Sources/vendor/nikic/php-parser/composer.json | 10 +- .../vendor/nikic/php-parser/grammar/README.md | 30 - .../nikic/php-parser/grammar/parser.template | 106 - .../vendor/nikic/php-parser/grammar/php5.y | 1046 ------ .../vendor/nikic/php-parser/grammar/php7.y | 1245 ------- .../nikic/php-parser/grammar/phpyLang.php | 184 -- .../php-parser/grammar/rebuildParsers.php | 81 - .../nikic/php-parser/grammar/tokens.template | 17 - .../vendor/nikic/php-parser/grammar/tokens.y | 115 - .../php-parser/lib/PhpParser/Builder.php | 5 +- .../lib/PhpParser/Builder/ClassConst.php | 32 +- .../lib/PhpParser/Builder/Class_.php | 65 +- .../lib/PhpParser/Builder/Declaration.php | 15 +- .../lib/PhpParser/Builder/EnumCase.php | 16 +- .../lib/PhpParser/Builder/Enum_.php | 53 +- .../lib/PhpParser/Builder/FunctionLike.php | 14 +- .../lib/PhpParser/Builder/Function_.php | 14 +- .../lib/PhpParser/Builder/Interface_.php | 21 +- .../lib/PhpParser/Builder/Method.php | 31 +- .../lib/PhpParser/Builder/Namespace_.php | 10 +- .../lib/PhpParser/Builder/Param.php | 51 +- .../lib/PhpParser/Builder/Property.php | 38 +- .../lib/PhpParser/Builder/TraitUse.php | 11 +- .../PhpParser/Builder/TraitUseAdaptation.php | 53 +- .../lib/PhpParser/Builder/Trait_.php | 27 +- .../php-parser/lib/PhpParser/Builder/Use_.php | 16 +- .../lib/PhpParser/BuilderFactory.php | 114 +- .../lib/PhpParser/BuilderHelpers.php | 36 +- .../php-parser/lib/PhpParser/Comment.php | 102 +- .../php-parser/lib/PhpParser/Comment/Doc.php | 3 +- .../ConstExprEvaluationException.php | 6 +- .../lib/PhpParser/ConstExprEvaluator.php | 25 +- .../nikic/php-parser/lib/PhpParser/Error.php | 57 +- .../php-parser/lib/PhpParser/ErrorHandler.php | 5 +- .../lib/PhpParser/ErrorHandler/Collecting.php | 15 +- .../lib/PhpParser/ErrorHandler/Throwing.php | 5 +- .../lib/PhpParser/Internal/DiffElem.php | 18 +- .../lib/PhpParser/Internal/Differ.php | 58 +- .../Internal/PrintableNewAnonClassNode.php | 33 +- .../lib/PhpParser/Internal/TokenPolyfill.php | 237 ++ .../lib/PhpParser/Internal/TokenStream.php | 125 +- .../php-parser/lib/PhpParser/JsonDecoder.php | 25 +- .../nikic/php-parser/lib/PhpParser/Lexer.php | 582 +--- .../lib/PhpParser/Lexer/Emulative.php | 161 +- .../Lexer/TokenEmulator/AttributeEmulator.php | 29 +- .../CoaleseEqualTokenEmulator.php | 47 - .../Lexer/TokenEmulator/EnumTokenEmulator.php | 25 +- .../TokenEmulator/ExplicitOctalEmulator.php | 23 +- .../FlexibleDocStringEmulator.php | 76 - .../Lexer/TokenEmulator/FnTokenEmulator.php | 23 - .../Lexer/TokenEmulator/KeywordEmulator.php | 44 +- .../TokenEmulator/MatchTokenEmulator.php | 16 +- .../TokenEmulator/NullsafeTokenEmulator.php | 51 +- .../NumericLiteralSeparatorEmulator.php | 105 - .../ReadonlyFunctionTokenEmulator.php | 6 +- .../TokenEmulator/ReadonlyTokenEmulator.php | 25 +- .../Lexer/TokenEmulator/ReverseEmulator.php | 11 +- .../Lexer/TokenEmulator/TokenEmulator.php | 15 +- .../php-parser/lib/PhpParser/Modifiers.php | 69 + .../php-parser/lib/PhpParser/NameContext.php | 47 +- .../nikic/php-parser/lib/PhpParser/Node.php | 53 +- .../php-parser/lib/PhpParser/Node/Arg.php | 28 +- .../lib/PhpParser/Node/ArrayItem.php | 43 + .../lib/PhpParser/Node/Attribute.php | 19 +- .../lib/PhpParser/Node/AttributeGroup.php | 12 +- .../lib/PhpParser/Node/ClosureUse.php | 36 + .../lib/PhpParser/Node/ComplexType.php | 3 +- .../php-parser/lib/PhpParser/Node/Const_.php | 19 +- .../lib/PhpParser/Node/DeclareItem.php | 37 + .../php-parser/lib/PhpParser/Node/Expr.php | 3 +- .../lib/PhpParser/Node/Expr/ArrayDimFetch.php | 21 +- .../lib/PhpParser/Node/Expr/ArrayItem.php | 40 +- .../lib/PhpParser/Node/Expr/Array_.php | 22 +- .../lib/PhpParser/Node/Expr/ArrowFunction.php | 61 +- .../lib/PhpParser/Node/Expr/Assign.php | 19 +- .../lib/PhpParser/Node/Expr/AssignOp.php | 15 +- .../Node/Expr/AssignOp/BitwiseAnd.php | 5 +- .../Node/Expr/AssignOp/BitwiseOr.php | 5 +- .../Node/Expr/AssignOp/BitwiseXor.php | 5 +- .../PhpParser/Node/Expr/AssignOp/Coalesce.php | 5 +- .../PhpParser/Node/Expr/AssignOp/Concat.php | 5 +- .../lib/PhpParser/Node/Expr/AssignOp/Div.php | 5 +- .../PhpParser/Node/Expr/AssignOp/Minus.php | 5 +- .../lib/PhpParser/Node/Expr/AssignOp/Mod.php | 5 +- .../lib/PhpParser/Node/Expr/AssignOp/Mul.php | 5 +- .../lib/PhpParser/Node/Expr/AssignOp/Plus.php | 5 +- .../lib/PhpParser/Node/Expr/AssignOp/Pow.php | 5 +- .../Node/Expr/AssignOp/ShiftLeft.php | 5 +- .../Node/Expr/AssignOp/ShiftRight.php | 5 +- .../lib/PhpParser/Node/Expr/AssignRef.php | 19 +- .../lib/PhpParser/Node/Expr/BinaryOp.php | 19 +- .../Node/Expr/BinaryOp/BitwiseAnd.php | 9 +- .../Node/Expr/BinaryOp/BitwiseOr.php | 9 +- .../Node/Expr/BinaryOp/BitwiseXor.php | 9 +- .../Node/Expr/BinaryOp/BooleanAnd.php | 9 +- .../Node/Expr/BinaryOp/BooleanOr.php | 9 +- .../PhpParser/Node/Expr/BinaryOp/Coalesce.php | 9 +- .../PhpParser/Node/Expr/BinaryOp/Concat.php | 9 +- .../lib/PhpParser/Node/Expr/BinaryOp/Div.php | 9 +- .../PhpParser/Node/Expr/BinaryOp/Equal.php | 9 +- .../PhpParser/Node/Expr/BinaryOp/Greater.php | 9 +- .../Node/Expr/BinaryOp/GreaterOrEqual.php | 9 +- .../Node/Expr/BinaryOp/Identical.php | 9 +- .../Node/Expr/BinaryOp/LogicalAnd.php | 9 +- .../Node/Expr/BinaryOp/LogicalOr.php | 9 +- .../Node/Expr/BinaryOp/LogicalXor.php | 9 +- .../PhpParser/Node/Expr/BinaryOp/Minus.php | 9 +- .../lib/PhpParser/Node/Expr/BinaryOp/Mod.php | 9 +- .../lib/PhpParser/Node/Expr/BinaryOp/Mul.php | 9 +- .../PhpParser/Node/Expr/BinaryOp/NotEqual.php | 9 +- .../Node/Expr/BinaryOp/NotIdentical.php | 9 +- .../lib/PhpParser/Node/Expr/BinaryOp/Plus.php | 9 +- .../lib/PhpParser/Node/Expr/BinaryOp/Pow.php | 9 +- .../Node/Expr/BinaryOp/ShiftLeft.php | 9 +- .../Node/Expr/BinaryOp/ShiftRight.php | 9 +- .../PhpParser/Node/Expr/BinaryOp/Smaller.php | 9 +- .../Node/Expr/BinaryOp/SmallerOrEqual.php | 9 +- .../Node/Expr/BinaryOp/Spaceship.php | 9 +- .../lib/PhpParser/Node/Expr/BitwiseNot.php | 15 +- .../lib/PhpParser/Node/Expr/BooleanNot.php | 15 +- .../lib/PhpParser/Node/Expr/CallLike.php | 10 +- .../lib/PhpParser/Node/Expr/Cast.php | 11 +- .../lib/PhpParser/Node/Expr/Cast/Array_.php | 5 +- .../lib/PhpParser/Node/Expr/Cast/Bool_.php | 5 +- .../lib/PhpParser/Node/Expr/Cast/Double.php | 11 +- .../lib/PhpParser/Node/Expr/Cast/Int_.php | 5 +- .../lib/PhpParser/Node/Expr/Cast/Object_.php | 5 +- .../lib/PhpParser/Node/Expr/Cast/String_.php | 5 +- .../lib/PhpParser/Node/Expr/Cast/Unset_.php | 5 +- .../PhpParser/Node/Expr/ClassConstFetch.php | 20 +- .../lib/PhpParser/Node/Expr/Clone_.php | 15 +- .../lib/PhpParser/Node/Expr/Closure.php | 59 +- .../lib/PhpParser/Node/Expr/ClosureUse.php | 33 +- .../lib/PhpParser/Node/Expr/ConstFetch.php | 15 +- .../lib/PhpParser/Node/Expr/Empty_.php | 15 +- .../lib/PhpParser/Node/Expr/Error.php | 11 +- .../lib/PhpParser/Node/Expr/ErrorSuppress.php | 15 +- .../lib/PhpParser/Node/Expr/Eval_.php | 15 +- .../lib/PhpParser/Node/Expr/Exit_.php | 21 +- .../lib/PhpParser/Node/Expr/FuncCall.php | 21 +- .../lib/PhpParser/Node/Expr/Include_.php | 27 +- .../lib/PhpParser/Node/Expr/Instanceof_.php | 22 +- .../lib/PhpParser/Node/Expr/Isset_.php | 15 +- .../lib/PhpParser/Node/Expr/List_.php | 20 +- .../lib/PhpParser/Node/Expr/Match_.php | 15 +- .../lib/PhpParser/Node/Expr/MethodCall.php | 24 +- .../lib/PhpParser/Node/Expr/New_.php | 21 +- .../Node/Expr/NullsafeMethodCall.php | 24 +- .../Node/Expr/NullsafePropertyFetch.php | 20 +- .../lib/PhpParser/Node/Expr/PostDec.php | 15 +- .../lib/PhpParser/Node/Expr/PostInc.php | 15 +- .../lib/PhpParser/Node/Expr/PreDec.php | 13 +- .../lib/PhpParser/Node/Expr/PreInc.php | 15 +- .../lib/PhpParser/Node/Expr/Print_.php | 15 +- .../lib/PhpParser/Node/Expr/PropertyFetch.php | 20 +- .../lib/PhpParser/Node/Expr/ShellExec.php | 18 +- .../lib/PhpParser/Node/Expr/StaticCall.php | 25 +- .../Node/Expr/StaticPropertyFetch.php | 22 +- .../lib/PhpParser/Node/Expr/Ternary.php | 25 +- .../lib/PhpParser/Node/Expr/Throw_.php | 13 +- .../lib/PhpParser/Node/Expr/UnaryMinus.php | 15 +- .../lib/PhpParser/Node/Expr/UnaryPlus.php | 15 +- .../lib/PhpParser/Node/Expr/Variable.php | 13 +- .../lib/PhpParser/Node/Expr/YieldFrom.php | 15 +- .../lib/PhpParser/Node/Expr/Yield_.php | 21 +- .../lib/PhpParser/Node/FunctionLike.php | 13 +- .../lib/PhpParser/Node/Identifier.php | 26 +- .../PhpParser/Node/InterpolatedStringPart.php | 32 + .../lib/PhpParser/Node/IntersectionType.php | 15 +- .../lib/PhpParser/Node/MatchArm.php | 17 +- .../php-parser/lib/PhpParser/Node/Name.php | 127 +- .../PhpParser/Node/Name/FullyQualified.php | 17 +- .../lib/PhpParser/Node/Name/Relative.php | 17 +- .../lib/PhpParser/Node/NullableType.php | 21 +- .../php-parser/lib/PhpParser/Node/Param.php | 68 +- .../lib/PhpParser/Node/PropertyItem.php | 37 + .../php-parser/lib/PhpParser/Node/Scalar.php | 3 +- .../lib/PhpParser/Node/Scalar/DNumber.php | 76 +- .../lib/PhpParser/Node/Scalar/Encapsed.php | 30 +- .../Node/Scalar/EncapsedStringPart.php | 29 +- .../lib/PhpParser/Node/Scalar/Float_.php | 78 + .../lib/PhpParser/Node/Scalar/Int_.php | 82 + .../Node/Scalar/InterpolatedString.php | 34 + .../lib/PhpParser/Node/Scalar/LNumber.php | 79 +- .../lib/PhpParser/Node/Scalar/MagicConst.php | 9 +- .../Node/Scalar/MagicConst/Class_.php | 9 +- .../PhpParser/Node/Scalar/MagicConst/Dir.php | 9 +- .../PhpParser/Node/Scalar/MagicConst/File.php | 9 +- .../Node/Scalar/MagicConst/Function_.php | 9 +- .../PhpParser/Node/Scalar/MagicConst/Line.php | 9 +- .../Node/Scalar/MagicConst/Method.php | 9 +- .../Node/Scalar/MagicConst/Namespace_.php | 9 +- .../Node/Scalar/MagicConst/Trait_.php | 9 +- .../lib/PhpParser/Node/Scalar/String_.php | 56 +- .../lib/PhpParser/Node/StaticVar.php | 39 + .../php-parser/lib/PhpParser/Node/Stmt.php | 3 +- .../lib/PhpParser/Node/Stmt/Block.php | 29 + .../lib/PhpParser/Node/Stmt/Break_.php | 17 +- .../lib/PhpParser/Node/Stmt/Case_.php | 21 +- .../lib/PhpParser/Node/Stmt/Catch_.php | 23 +- .../lib/PhpParser/Node/Stmt/ClassConst.php | 56 +- .../lib/PhpParser/Node/Stmt/ClassLike.php | 26 +- .../lib/PhpParser/Node/Stmt/ClassMethod.php | 101 +- .../lib/PhpParser/Node/Stmt/Class_.php | 135 +- .../lib/PhpParser/Node/Stmt/Const_.php | 15 +- .../lib/PhpParser/Node/Stmt/Continue_.php | 17 +- .../PhpParser/Node/Stmt/DeclareDeclare.php | 33 +- .../lib/PhpParser/Node/Stmt/Declare_.php | 24 +- .../lib/PhpParser/Node/Stmt/Do_.php | 19 +- .../lib/PhpParser/Node/Stmt/Echo_.php | 15 +- .../lib/PhpParser/Node/Stmt/ElseIf_.php | 19 +- .../lib/PhpParser/Node/Stmt/Else_.php | 15 +- .../lib/PhpParser/Node/Stmt/EnumCase.php | 23 +- .../lib/PhpParser/Node/Stmt/Enum_.php | 30 +- .../lib/PhpParser/Node/Stmt/Expression.php | 15 +- .../lib/PhpParser/Node/Stmt/Finally_.php | 15 +- .../lib/PhpParser/Node/Stmt/For_.php | 34 +- .../lib/PhpParser/Node/Stmt/Foreach_.php | 37 +- .../lib/PhpParser/Node/Stmt/Function_.php | 52 +- .../lib/PhpParser/Node/Stmt/Global_.php | 15 +- .../lib/PhpParser/Node/Stmt/Goto_.php | 15 +- .../lib/PhpParser/Node/Stmt/GroupUse.php | 30 +- .../lib/PhpParser/Node/Stmt/HaltCompiler.php | 15 +- .../lib/PhpParser/Node/Stmt/If_.php | 33 +- .../lib/PhpParser/Node/Stmt/InlineHTML.php | 15 +- .../lib/PhpParser/Node/Stmt/Interface_.php | 23 +- .../lib/PhpParser/Node/Stmt/Label.php | 15 +- .../lib/PhpParser/Node/Stmt/Namespace_.php | 23 +- .../lib/PhpParser/Node/Stmt/Nop.php | 9 +- .../lib/PhpParser/Node/Stmt/Property.php | 65 +- .../PhpParser/Node/Stmt/PropertyProperty.php | 33 +- .../lib/PhpParser/Node/Stmt/Return_.php | 17 +- .../lib/PhpParser/Node/Stmt/StaticVar.php | 36 +- .../lib/PhpParser/Node/Stmt/Static_.php | 16 +- .../lib/PhpParser/Node/Stmt/Switch_.php | 19 +- .../lib/PhpParser/Node/Stmt/Throw_.php | 30 - .../lib/PhpParser/Node/Stmt/TraitUse.php | 17 +- .../Node/Stmt/TraitUseAdaptation.php | 7 +- .../Node/Stmt/TraitUseAdaptation/Alias.php | 25 +- .../Stmt/TraitUseAdaptation/Precedence.php | 19 +- .../lib/PhpParser/Node/Stmt/Trait_.php | 18 +- .../lib/PhpParser/Node/Stmt/TryCatch.php | 23 +- .../lib/PhpParser/Node/Stmt/Unset_.php | 15 +- .../lib/PhpParser/Node/Stmt/UseUse.php | 51 +- .../lib/PhpParser/Node/Stmt/Use_.php | 32 +- .../lib/PhpParser/Node/Stmt/While_.php | 19 +- .../lib/PhpParser/Node/UnionType.php | 15 +- .../php-parser/lib/PhpParser/Node/UseItem.php | 55 + .../lib/PhpParser/Node/VarLikeIdentifier.php | 5 +- .../PhpParser/Node/VariadicPlaceholder.php | 4 +- .../php-parser/lib/PhpParser/NodeAbstract.php | 40 +- .../php-parser/lib/PhpParser/NodeDumper.php | 252 +- .../php-parser/lib/PhpParser/NodeFinder.php | 47 +- .../lib/PhpParser/NodeTraverser.php | 155 +- .../lib/PhpParser/NodeTraverserInterface.php | 11 +- .../php-parser/lib/PhpParser/NodeVisitor.php | 66 +- .../PhpParser/NodeVisitor/CloningVisitor.php | 3 +- .../NodeVisitor/CommentAnnotatingVisitor.php | 82 + .../PhpParser/NodeVisitor/FindingVisitor.php | 9 +- .../NodeVisitor/FirstFindingVisitor.php | 13 +- .../PhpParser/NodeVisitor/NameResolver.php | 61 +- .../NodeVisitor/NodeConnectingVisitor.php | 5 +- .../NodeVisitor/ParentConnectingVisitor.php | 19 +- .../lib/PhpParser/NodeVisitorAbstract.php | 3 +- .../nikic/php-parser/lib/PhpParser/Parser.php | 12 +- .../lib/PhpParser/Parser/Multiple.php | 55 - .../php-parser/lib/PhpParser/Parser/Php5.php | 2682 ---------------- .../php-parser/lib/PhpParser/Parser/Php7.php | 2847 ++++++++--------- .../php-parser/lib/PhpParser/Parser/Php8.php | 2717 ++++++++++++++++ .../lib/PhpParser/Parser/Tokens.php | 148 - .../lib/PhpParser/ParserAbstract.php | 685 ++-- .../lib/PhpParser/ParserFactory.php | 64 +- .../php-parser/lib/PhpParser/PhpVersion.php | 164 + .../lib/PhpParser/PrettyPrinter.php | 51 + .../lib/PhpParser/PrettyPrinter/Standard.php | 721 +++-- .../lib/PhpParser/PrettyPrinterAbstract.php | 955 +++--- .../nikic/php-parser/lib/PhpParser/Token.php | 18 + .../lib/PhpParser/compatibility_tokens.php | 56 + .../nikic/php-parser/phpstan-baseline.neon | 236 ++ .../vendor/nikic/php-parser/phpstan.neon.dist | 8 + .../php-code-coverage/ChangeLog-10.1.md | 14 + .../phpunit/php-code-coverage/composer.json | 2 +- .../src/Data/RawCodeCoverageData.php | 12 + .../ExecutableLinesFindingVisitor.php | 16 + .../StaticAnalysis/ParsingFileAnalyser.php | 6 +- .../phpunit/php-code-coverage/src/Version.php | 2 +- .../vendor/phpunit/phpunit/ChangeLog-10.4.md | 52 - .../vendor/phpunit/phpunit/ChangeLog-10.5.md | 70 + .../vendor/phpunit/phpunit/DEPRECATIONS.md | 33 +- Sources/vendor/phpunit/phpunit/README.md | 2 - Sources/vendor/phpunit/phpunit/SECURITY.md | 2 +- Sources/vendor/phpunit/phpunit/composer.json | 2 +- Sources/vendor/phpunit/phpunit/composer.lock | 1542 +++++++++ Sources/vendor/phpunit/phpunit/phpunit.xsd | 2 +- .../src/Event/Emitter/DispatchingEmitter.php | 50 +- .../phpunit/src/Event/Emitter/Emitter.php | 66 +- .../Events/Test/Assertion/AssertionFailed.php | 2 + .../Assertion/AssertionFailedSubscriber.php | 2 + .../Test/Assertion/AssertionSucceeded.php | 2 + .../AssertionSucceededSubscriber.php | 2 + .../Test/Issue/DeprecationTriggered.php | 13 +- .../Test/Issue/PhpDeprecationTriggered.php | 13 +- .../Issue/PhpunitDeprecationTriggered.php | 10 + .../Test/Issue/PhpunitErrorTriggered.php | 10 + .../Test/Issue/PhpunitWarningTriggered.php | 10 + .../Test/TestData/DataFromDataProvider.php | 18 +- .../src/Event/Value/Test/TestMethod.php | 7 - .../Event/Value/Test/TestMethodBuilder.php | 1 + .../src/Framework/Assert/Functions.php | 39 +- .../Attributes/IgnoreDeprecations.php | 22 + .../Constraint/Cardinality/SameSize.php | 3 +- .../Equality/IsEqualCanonicalizing.php | 1 - .../src/Framework/Constraint/IsIdentical.php | 5 +- .../Exception/PhptAssertionFailedError.php | 53 + .../MockObject/ConfigurableMethod.php | 36 +- .../MockObject/Generator/Generator.php | 8 +- .../MockObject/Generator/MockMethod.php | 59 +- .../src/Framework/MockObject/MockBuilder.php | 4 - .../Runtime/Builder/InvocationMocker.php | 43 +- .../Runtime/ReturnValueGenerator.php | 2 +- .../MockObject/Runtime/Rule/MethodName.php | 5 +- .../phpunit/src/Framework/TestCase.php | 45 +- .../phpunit/src/Framework/TestRunner.php | 5 +- .../src/Logging/JUnit/JunitXmlLogger.php | 38 +- .../Subscriber/TestErroredSubscriber.php | 2 - .../JUnit/Subscriber/TestFailedSubscriber.php | 2 - .../Subscriber/TestFinishedSubscriber.php | 2 - .../TestMarkedIncompleteSubscriber.php | 2 - .../TestPreparationFailedSubscriber.php | 28 + .../TestPreparationStartedSubscriber.php | 28 + .../Subscriber/TestPreparedSubscriber.php | 4 +- .../Subscriber/TestSkippedSubscriber.php | 2 - .../src/Logging/TeamCity/TeamCityLogger.php | 2 +- ...edMockObjectForAbstractClassSubscriber.php | 24 - ...estCreatedMockObjectForTraitSubscriber.php | 24 - ...estCreatedMockObjectFromWsdlSubscriber.php | 24 - .../TestCreatedMockObjectSubscriber.php | 24 - ...TestCreatedPartialMockObjectSubscriber.php | 24 - .../TestCreatedTestProxySubscriber.php | 24 - .../Subscriber/Subscriber.php | 0 .../TestConsideredRiskySubscriber.php | 0 .../Subscriber/TestErroredSubscriber.php | 0 .../Subscriber/TestFailedSubscriber.php | 0 .../Subscriber/TestFinishedSubscriber.php | 0 .../TestMarkedIncompleteSubscriber.php | 0 .../Subscriber/TestPassedSubscriber.php | 0 .../Subscriber/TestPreparedSubscriber.php | 0 .../Subscriber/TestSkippedSubscriber.php | 0 .../{TestMethod => TestResult}/TestResult.php | 33 +- .../TestResultCollection.php | 0 .../TestResultCollectionIterator.php | 0 .../TestResultCollector.php | 53 +- .../src/Metadata/IgnoreDeprecations.php | 26 + .../phpunit/phpunit/src/Metadata/Metadata.php | 18 + .../src/Metadata/MetadataCollection.php | 10 + .../src/Metadata/Parser/AttributeParser.php | 15 + .../phpunit/src/Runner/CodeCoverage.php | 2 - .../phpunit/src/Runner/ErrorHandler.php | 58 +- .../Exception/ErrorException.php} | 11 +- .../phpunit/src/Runner/Extension/Facade.php | 6 + .../phpunit/src/Runner/PhptTestCase.php | 2 - .../src/Runner/TestResult/Collector.php | 12 +- .../src/Runner/TestResult/PassedTests.php | 4 - .../TestSuiteFinishedSubscriber.php | 4 - .../phpunit/phpunit/src/Runner/Version.php | 2 +- .../phpunit/src/TextUI/Application.php | 4 + .../Commands/WarmCodeCoverageCacheCommand.php | 3 +- .../TextUI/Configuration/Configuration.php | 3 + .../src/TextUI/Configuration/Xml/Loader.php | 9 + .../MoveCoverageDirectoriesToSource.php | 8 + .../src/TextUI/Configuration/Xml/PHPUnit.php | 3 + .../Xml/Validator/ValidationResult.php | 3 +- .../ProgressPrinter/ProgressPrinter.php | 4 +- .../TextUI/Output/Default/ResultPrinter.php | 10 +- .../TextUI/Output/TestDox/ResultPrinter.php | 7 - .../phpunit/phpunit/src/Util/Exporter.php | 24 +- .../src/Util/ThrowableToStringMapper.php | 5 + .../vendor/sebastian/complexity/ChangeLog.md | 11 + .../vendor/sebastian/complexity/composer.json | 4 +- .../sebastian/complexity/src/Calculator.php | 9 +- .../src/Complexity/ComplexityCollection.php | 17 + Sources/vendor/sebastian/diff/ChangeLog.md | 21 + Sources/vendor/sebastian/diff/composer.json | 2 +- Sources/vendor/sebastian/diff/src/Chunk.php | 66 +- Sources/vendor/sebastian/diff/src/Diff.php | 65 +- Sources/vendor/sebastian/diff/src/Line.php | 31 + Sources/vendor/sebastian/diff/src/Parser.php | 4 + .../sebastian/lines-of-code/ChangeLog.md | 7 + .../sebastian/lines-of-code/composer.json | 2 +- .../sebastian/lines-of-code/src/Counter.php | 9 +- 405 files changed, 12638 insertions(+), 13267 deletions(-) create mode 100644 Sources/src/data/core/json/JsonSerializer.php create mode 100644 Sources/vendor/nikic/php-parser/.php-cs-fixer.dist.php create mode 100644 Sources/vendor/nikic/php-parser/Makefile delete mode 100644 Sources/vendor/nikic/php-parser/grammar/README.md delete mode 100644 Sources/vendor/nikic/php-parser/grammar/parser.template delete mode 100644 Sources/vendor/nikic/php-parser/grammar/php5.y delete mode 100644 Sources/vendor/nikic/php-parser/grammar/php7.y delete mode 100644 Sources/vendor/nikic/php-parser/grammar/phpyLang.php delete mode 100644 Sources/vendor/nikic/php-parser/grammar/rebuildParsers.php delete mode 100644 Sources/vendor/nikic/php-parser/grammar/tokens.template delete mode 100644 Sources/vendor/nikic/php-parser/grammar/tokens.y create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php delete mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php delete mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php delete mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php delete mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Modifiers.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Node/StaticVar.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php delete mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Node/UseItem.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php delete mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php delete mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php delete mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/PhpVersion.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/Token.php create mode 100644 Sources/vendor/nikic/php-parser/lib/PhpParser/compatibility_tokens.php create mode 100644 Sources/vendor/nikic/php-parser/phpstan-baseline.neon create mode 100644 Sources/vendor/nikic/php-parser/phpstan.neon.dist delete mode 100644 Sources/vendor/phpunit/phpunit/ChangeLog-10.4.md create mode 100644 Sources/vendor/phpunit/phpunit/ChangeLog-10.5.md create mode 100644 Sources/vendor/phpunit/phpunit/composer.lock create mode 100644 Sources/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php create mode 100644 Sources/vendor/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php create mode 100644 Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php create mode 100644 Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php delete mode 100644 Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectForAbstractClassSubscriber.php delete mode 100644 Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectForTraitSubscriber.php delete mode 100644 Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectFromWsdlSubscriber.php delete mode 100644 Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectSubscriber.php delete mode 100644 Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedPartialMockObjectSubscriber.php delete mode 100644 Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedTestProxySubscriber.php rename Sources/vendor/phpunit/phpunit/src/Logging/TestDox/{TestMethod => TestResult}/Subscriber/Subscriber.php (100%) rename Sources/vendor/phpunit/phpunit/src/Logging/TestDox/{TestMethod => TestResult}/Subscriber/TestConsideredRiskySubscriber.php (100%) rename Sources/vendor/phpunit/phpunit/src/Logging/TestDox/{TestMethod => TestResult}/Subscriber/TestErroredSubscriber.php (100%) rename Sources/vendor/phpunit/phpunit/src/Logging/TestDox/{TestMethod => TestResult}/Subscriber/TestFailedSubscriber.php (100%) rename Sources/vendor/phpunit/phpunit/src/Logging/TestDox/{TestMethod => TestResult}/Subscriber/TestFinishedSubscriber.php (100%) rename Sources/vendor/phpunit/phpunit/src/Logging/TestDox/{TestMethod => TestResult}/Subscriber/TestMarkedIncompleteSubscriber.php (100%) rename Sources/vendor/phpunit/phpunit/src/Logging/TestDox/{TestMethod => TestResult}/Subscriber/TestPassedSubscriber.php (100%) rename Sources/vendor/phpunit/phpunit/src/Logging/TestDox/{TestMethod => TestResult}/Subscriber/TestPreparedSubscriber.php (100%) rename Sources/vendor/phpunit/phpunit/src/Logging/TestDox/{TestMethod => TestResult}/Subscriber/TestSkippedSubscriber.php (100%) rename Sources/vendor/phpunit/phpunit/src/Logging/TestDox/{TestMethod => TestResult}/TestResult.php (56%) rename Sources/vendor/phpunit/phpunit/src/Logging/TestDox/{TestMethod => TestResult}/TestResultCollection.php (100%) rename Sources/vendor/phpunit/phpunit/src/Logging/TestDox/{TestMethod => TestResult}/TestResultCollectionIterator.php (100%) rename Sources/vendor/phpunit/phpunit/src/Logging/TestDox/{TestMethod => TestResult}/TestResultCollector.php (76%) create mode 100644 Sources/vendor/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php rename Sources/vendor/phpunit/phpunit/src/{Logging/TestDox/TestMethod/Subscriber/TestCreatedTestStubSubscriber.php => Runner/Exception/ErrorException.php} (50%) diff --git a/Sources/composer.json b/Sources/composer.json index ac9236b7..db1f3aba 100755 --- a/Sources/composer.json +++ b/Sources/composer.json @@ -25,7 +25,8 @@ "Shared\\Attributes\\": "src/shared/attributes", "App\\Views\\Directives\\" : "src/app/views/directives", "Data\\Core\\": "src/data/core/", - "Database\\": "src/data/core/database" + "Database\\": "src/data/core/database", + "Json\\": "src/data/core/json" } }, "require": { diff --git a/Sources/composer.lock b/Sources/composer.lock index 9e57cd5a..e6d830ad 100644 --- a/Sources/composer.lock +++ b/Sources/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1887e85fc3cfddacf8d7e17588dae6f1", + "content-hash": "5a409c8bab8a792898aeb0f32ad5cf48", "packages": [ { "name": "adriangibbons/php-fit-file-analysis", @@ -756,25 +756,27 @@ }, { "name": "nikic/php-parser", - "version": "v4.17.1", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4a21235f7e56e713259a6f76bf4b5ea08502b9dc", + "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -782,7 +784,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -806,9 +808,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.0" }, - "time": "2023-08-13T19:53:39+00:00" + "time": "2024-01-07T17:17:35+00:00" }, { "name": "phar-io/manifest", @@ -923,23 +925,23 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.9", + "version": "10.1.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735" + "reference": "78c3b7625965c2513ee96569a4dbb62601784145" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/a56a9ab2f680246adcf3db43f38ddf1765774735", - "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", + "reference": "78c3b7625965c2513ee96569a4dbb62601784145", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1", "phpunit/php-file-iterator": "^4.0", "phpunit/php-text-template": "^3.0", @@ -989,7 +991,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.9" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" }, "funding": [ { @@ -997,7 +999,7 @@ "type": "github" } ], - "time": "2023-11-23T12:23:20+00:00" + "time": "2023-12-21T15:38:30+00:00" }, { "name": "phpunit/php-file-iterator", @@ -1244,16 +1246,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.4.2", + "version": "10.5.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "cacd8b9dd224efa8eb28beb69004126c7ca1a1a1" + "reference": "ed21115d505b4b4f7dc7b5651464e19a2c7f7856" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/cacd8b9dd224efa8eb28beb69004126c7ca1a1a1", - "reference": "cacd8b9dd224efa8eb28beb69004126c7ca1a1a1", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ed21115d505b4b4f7dc7b5651464e19a2c7f7856", + "reference": "ed21115d505b4b4f7dc7b5651464e19a2c7f7856", "shasum": "" }, "require": { @@ -1293,7 +1295,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.4-dev" + "dev-main": "10.5-dev" } }, "autoload": { @@ -1325,7 +1327,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.4.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.5" }, "funding": [ { @@ -1341,7 +1343,7 @@ "type": "tidelift" } ], - "time": "2023-10-26T07:21:45+00:00" + "time": "2023-12-27T15:13:52+00:00" }, { "name": "sebastian/cli-parser", @@ -1589,20 +1591,20 @@ }, { "name": "sebastian/complexity", - "version": "3.1.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" + "reference": "68ff824baeae169ec9f2137158ee529584553799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", - "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", "shasum": "" }, "require": { - "nikic/php-parser": "^4.10", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { @@ -1611,7 +1613,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.2-dev" } }, "autoload": { @@ -1635,7 +1637,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" }, "funding": [ { @@ -1643,20 +1645,20 @@ "type": "github" } ], - "time": "2023-09-28T11:50:59+00:00" + "time": "2023-12-21T08:37:17+00:00" }, { "name": "sebastian/diff", - "version": "5.0.3", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", - "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", "shasum": "" }, "require": { @@ -1669,7 +1671,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -1702,7 +1704,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" }, "funding": [ { @@ -1710,7 +1712,7 @@ "type": "github" } ], - "time": "2023-05-01T07:48:21+00:00" + "time": "2023-12-22T10:55:06+00:00" }, { "name": "sebastian/environment", @@ -1918,20 +1920,20 @@ }, { "name": "sebastian/lines-of-code", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "shasum": "" }, "require": { - "nikic/php-parser": "^4.10", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { @@ -1964,7 +1966,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" }, "funding": [ { @@ -1972,7 +1974,7 @@ "type": "github" } ], - "time": "2023-08-31T09:25:50+00:00" + "time": "2023-12-21T08:38:20+00:00" }, { "name": "sebastian/object-enumerator", @@ -2314,7 +2316,10 @@ "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, - "platform": [], + "platform": { + "ext-couchbase": "*", + "ext-pdo": "*" + }, "platform-dev": [], "plugin-api-version": "2.6.0" } diff --git a/Sources/src/app/controller/AuthController.php b/Sources/src/app/controller/AuthController.php index 0c0a20ca..3f22f634 100644 --- a/Sources/src/app/controller/AuthController.php +++ b/Sources/src/app/controller/AuthController.php @@ -9,9 +9,12 @@ use App\Router\Response\Response; use App\Router\Response\IResponse; use App\Router\Session; +use Database\ActivityGateway; +use Database\ActivityMapper; use Database\AthleteGateway; use Database\AthleteMapper; use Database\Connexion; +use Json\JsonSerializer; use Manager\UserManager; use Shared\Attributes\Route; use Shared\Validation; @@ -177,6 +180,50 @@ class AuthController extends BaseController return new RedirectResponse('/'); } } - + #[Route(path: '/api', name: 'api', methods: ['GET'])] + public function api(IRequest $request) + { + // Récupérer les données de la base de données (exemple avec un modèle User) +// $user = $this->getUserDataFromDatabase(); + $activityGateway = new ActivityGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); + $listSearch = $activityGateway->getActivity(); + $map = new ActivityMapper(); + $activityGateway = $map->activitySqlToEntity($listSearch); + $listActivity = []; + foreach ($activityGateway as $entity) { + $activity = $map->activityEntityToModel($entity); + $listActivity[] = ['idactivity' => number_format($activity->getIdActivity()), 'type' => $activity->getType(), + 'date' => $activity->getDate()->format("Y-m-d"), 'heureDebut' => $activity->getHeureDebut()->format("Y-m-d"), 'heureFin' => $activity->getHeureFin()->format("Y-m-d"), + 'effortRessenti' => $activity->getEffortRessenti(), 'variabilite' => $activity->getVariability(), 'variance' => $activity->getVariance(), + 'ecartType' => $activity->getStandardDeviation(), 'moyenne' => $activity->getAverage(), + 'max' => $activity->getMaximum(), 'min' => $activity->getMinimum(), 'temperature' => $activity->getAvrTemperature()]; + } + + // Utiliser le sérialiseur JSON pour convertir le modèle en JSON +// Log::dd($listActivity); +// $jsonData = json_encode($listActivity); + $jsonSerializer = new JsonSerializer(); + $jsonData = $jsonSerializer::serialize($listActivity); + + // Configurer l'objet Response pour inclure le JSON + $response = new Response(); + $response->setContent($jsonData); + $response->setHeader('Content-Type', 'application/json'); + + // Retourner l'objet Response + return $response; + } +// #[Route(path: '/api', name: 'api', methods: ['GET'])] +// public function api(IRequest $request) +// { +// $data = 'Hello from Slim API!'; +// $response ??= new Response(); +// $response->setContent($data); +// +// return $response; +// } + + + } ?> \ No newline at end of file diff --git a/Sources/src/app/router/middleware/AuthMiddleware.php b/Sources/src/app/router/middleware/AuthMiddleware.php index 7e6cbc06..b064cd92 100644 --- a/Sources/src/app/router/middleware/AuthMiddleware.php +++ b/Sources/src/app/router/middleware/AuthMiddleware.php @@ -13,7 +13,7 @@ class AuthMiddleware extends Middleware { $this->auth = $auth; } public function handle(IRequest $request, callable $next) { - $excludedUrls = ['/login', '/register','/forgetPassword', '/']; + $excludedUrls = ['/login', '/register','/forgetPassword', '/', '/api']; // Log::dd($this->auth->getCurrentUser()); if ($this->auth->getCurrentUser() === null && !in_array($request->getRequestUri(), $excludedUrls)) { $resp = new RedirectResponse("/login"); diff --git a/Sources/src/data/core/database/ActivityMapper.php b/Sources/src/data/core/database/ActivityMapper.php index 8c6f890f..080ae21a 100644 --- a/Sources/src/data/core/database/ActivityMapper.php +++ b/Sources/src/data/core/database/ActivityMapper.php @@ -21,9 +21,9 @@ class ActivityMapper { $activity->setType($activityData['type']); } -// if (isset($activityData['date'])) { -// $activity->setDate(DateTime::createFromFormat('yyyy-mm--dd',$activityData['date'])); -// } + if (isset($activityData['date'])) { + $activity->setDate(new DateTime($activityData['date'])); + } if (isset($activityData['heureDeDebut'])) { $activity->setHeureDebut(new DateTime($activityData['heureDeDebut'])); @@ -67,7 +67,7 @@ class ActivityMapper { $activityEntities[] = $activity; } - Log::dd($activityEntities); + return $activityEntities; } @@ -75,9 +75,9 @@ class ActivityMapper { * @throws \Exception */ public function ActivityEntityToModel(ActivityEntity $activiteEntity):Activity { - $date = new DateTime($activiteEntity->getDate()); - $heureDebut = new \DateTime($activiteEntity->getHeureDebut()); - $heureFin = new \DateTime($activiteEntity->getHeureFin()); + $date = new DateTime($activiteEntity->getDate()->format('Y-m-d')); + $heureDebut = new \DateTime($activiteEntity->getHeureDebut()->format('H:i:s')); + $heureFin = new \DateTime($activiteEntity->getHeureFin()->format('H:i:s')); $effortRessenti = intval($activiteEntity->getEffortRessenti()); $variability = floatval($activiteEntity->getVariability()); $variance = floatval($activiteEntity->getVariance()); diff --git a/Sources/src/data/core/json/JsonSerializer.php b/Sources/src/data/core/json/JsonSerializer.php new file mode 100644 index 00000000..aa4422ba --- /dev/null +++ b/Sources/src/data/core/json/JsonSerializer.php @@ -0,0 +1,20 @@ +getMessage()); + return ''; // Ou retournez une valeur par défaut, selon vos besoins + } + } + +} \ No newline at end of file diff --git a/Sources/vendor/composer/autoload_classmap.php b/Sources/vendor/composer/autoload_classmap.php index 997e9208..034369e1 100644 --- a/Sources/vendor/composer/autoload_classmap.php +++ b/Sources/vendor/composer/autoload_classmap.php @@ -255,6 +255,7 @@ return array( 'PHPUnit\\Framework\\Attributes\\ExcludeStaticPropertyFromBackup' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/ExcludeStaticPropertyFromBackup.php', 'PHPUnit\\Framework\\Attributes\\Group' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Group.php', 'PHPUnit\\Framework\\Attributes\\IgnoreClassForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/IgnoreClassForCodeCoverage.php', + 'PHPUnit\\Framework\\Attributes\\IgnoreDeprecations' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php', 'PHPUnit\\Framework\\Attributes\\IgnoreFunctionForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/IgnoreFunctionForCodeCoverage.php', 'PHPUnit\\Framework\\Attributes\\IgnoreMethodForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/IgnoreMethodForCodeCoverage.php', 'PHPUnit\\Framework\\Attributes\\Large' => $vendorDir . '/phpunit/phpunit/src/Framework/Attributes/Large.php', @@ -430,6 +431,7 @@ return array( 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnValueMap.php', 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Stub.php', 'PHPUnit\\Framework\\NoChildTestSuiteException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', + 'PHPUnit\\Framework\\PhptAssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php', 'PHPUnit\\Framework\\ProcessIsolationException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ProcessIsolationException.php', 'PHPUnit\\Framework\\Reorderable' => $vendorDir . '/phpunit/phpunit/src/Framework/Reorderable.php', 'PHPUnit\\Framework\\SelfDescribing' => $vendorDir . '/phpunit/phpunit/src/Framework/SelfDescribing.php', @@ -470,6 +472,8 @@ return array( 'PHPUnit\\Logging\\JUnit\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php', + 'PHPUnit\\Logging\\JUnit\\TestPreparationFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php', + 'PHPUnit\\Logging\\JUnit\\TestPreparationStartedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestRunnerExecutionFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestRunnerExecutionFinishedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php', @@ -490,26 +494,19 @@ return array( 'PHPUnit\\Logging\\TestDox\\HtmlRenderer' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/HtmlRenderer.php', 'PHPUnit\\Logging\\TestDox\\NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/NamePrettifier.php', 'PHPUnit\\Logging\\TestDox\\PlainTextRenderer' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/PlainTextRenderer.php', - 'PHPUnit\\Logging\\TestDox\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/Subscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestConsideredRiskySubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestConsideredRiskySubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestCreatedMockObjectForAbstractClassSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectForAbstractClassSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestCreatedMockObjectForTraitSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectForTraitSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestCreatedMockObjectFromWsdlSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectFromWsdlSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestCreatedMockObjectSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestCreatedPartialMockObjectSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedPartialMockObjectSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestCreatedTestProxySubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedTestProxySubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestCreatedTestStubSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedTestStubSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestErroredSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestFailedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestMarkedIncompleteSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestPassedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestPassedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestPreparedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestResult' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResult.php', - 'PHPUnit\\Logging\\TestDox\\TestResultCollection' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResultCollection.php', - 'PHPUnit\\Logging\\TestDox\\TestResultCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResultCollectionIterator.php', - 'PHPUnit\\Logging\\TestDox\\TestResultCollector' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResultCollector.php', - 'PHPUnit\\Logging\\TestDox\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestSkippedSubscriber.php', + 'PHPUnit\\Logging\\TestDox\\Subscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/Subscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestConsideredRiskySubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestConsideredRiskySubscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestErroredSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestErroredSubscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestFailedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFailedSubscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestFinishedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFinishedSubscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestMarkedIncompleteSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestPassedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPassedSubscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestPreparedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPreparedSubscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestResult' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.php', + 'PHPUnit\\Logging\\TestDox\\TestResultCollection' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollection.php', + 'PHPUnit\\Logging\\TestDox\\TestResultCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollectionIterator.php', + 'PHPUnit\\Logging\\TestDox\\TestResultCollector' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.php', + 'PHPUnit\\Logging\\TestDox\\TestSkippedSubscriber' => $vendorDir . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestSkippedSubscriber.php', 'PHPUnit\\Metadata\\After' => $vendorDir . '/phpunit/phpunit/src/Metadata/After.php', 'PHPUnit\\Metadata\\AfterClass' => $vendorDir . '/phpunit/phpunit/src/Metadata/AfterClass.php', 'PHPUnit\\Metadata\\Annotation\\Parser\\DocBlock' => $vendorDir . '/phpunit/phpunit/src/Metadata/Parser/Annotation/DocBlock.php', @@ -539,6 +536,7 @@ return array( 'PHPUnit\\Metadata\\ExcludeStaticPropertyFromBackup' => $vendorDir . '/phpunit/phpunit/src/Metadata/ExcludeStaticPropertyFromBackup.php', 'PHPUnit\\Metadata\\Group' => $vendorDir . '/phpunit/phpunit/src/Metadata/Group.php', 'PHPUnit\\Metadata\\IgnoreClassForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Metadata/IgnoreClassForCodeCoverage.php', + 'PHPUnit\\Metadata\\IgnoreDeprecations' => $vendorDir . '/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php', 'PHPUnit\\Metadata\\IgnoreFunctionForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Metadata/IgnoreFunctionForCodeCoverage.php', 'PHPUnit\\Metadata\\IgnoreMethodForCodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Metadata/IgnoreMethodForCodeCoverage.php', 'PHPUnit\\Metadata\\InvalidVersionRequirementException' => $vendorDir . '/phpunit/phpunit/src/Metadata/Exception/InvalidVersionRequirementException.php', @@ -598,6 +596,7 @@ return array( 'PHPUnit\\Runner\\ClassIsAbstractException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/ClassIsAbstractException.php', 'PHPUnit\\Runner\\CodeCoverage' => $vendorDir . '/phpunit/phpunit/src/Runner/CodeCoverage.php', 'PHPUnit\\Runner\\DirectoryCannotBeCreatedException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/DirectoryCannotBeCreatedException.php', + 'PHPUnit\\Runner\\ErrorException' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/ErrorException.php', 'PHPUnit\\Runner\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Runner/ErrorHandler.php', 'PHPUnit\\Runner\\Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception/Exception.php', 'PHPUnit\\Runner\\Extension\\Extension' => $vendorDir . '/phpunit/phpunit/src/Runner/Extension/Extension.php', @@ -955,6 +954,93 @@ return array( 'PharIo\\Version\\VersionConstraintValue' => $vendorDir . '/phar-io/version/src/VersionConstraintValue.php', 'PharIo\\Version\\VersionNumber' => $vendorDir . '/phar-io/version/src/VersionNumber.php', 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', + 'SebastianBergmann\\CliParser\\AmbiguousOptionException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php', + 'SebastianBergmann\\CliParser\\Exception' => $vendorDir . '/sebastian/cli-parser/src/exceptions/Exception.php', + 'SebastianBergmann\\CliParser\\OptionDoesNotAllowArgumentException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php', + 'SebastianBergmann\\CliParser\\Parser' => $vendorDir . '/sebastian/cli-parser/src/Parser.php', + 'SebastianBergmann\\CliParser\\RequiredOptionArgumentMissingException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.php', + 'SebastianBergmann\\CliParser\\UnknownOptionException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/UnknownOptionException.php', + 'SebastianBergmann\\CodeCoverage\\BranchAndPathCoverageNotSupportedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.php', + 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php', + 'SebastianBergmann\\CodeCoverage\\Data\\ProcessedCodeCoverageData' => $vendorDir . '/phpunit/php-code-coverage/src/Data/ProcessedCodeCoverageData.php', + 'SebastianBergmann\\CodeCoverage\\Data\\RawCodeCoverageData' => $vendorDir . '/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php', + 'SebastianBergmann\\CodeCoverage\\DeadCodeDetectionNotSupportedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Driver.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\PathExistsButIsNotDirectoryException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\PcovDriver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PcovDriver.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\PcovNotAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\Selector' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Selector.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\WriteOperationFailedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugDriver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/XdebugDriver.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugNotAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugNotEnabledException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/XdebugNotEnabledException.php', + 'SebastianBergmann\\CodeCoverage\\Exception' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Exception.php', + 'SebastianBergmann\\CodeCoverage\\FileCouldNotBeWrittenException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/FileCouldNotBeWrittenException.php', + 'SebastianBergmann\\CodeCoverage\\Filter' => $vendorDir . '/phpunit/php-code-coverage/src/Filter.php', + 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', + 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php', + 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverWithPathCoverageSupportAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php', + 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => $vendorDir . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Builder.php', + 'SebastianBergmann\\CodeCoverage\\Node\\CrapIndex' => $vendorDir . '/phpunit/php-code-coverage/src/Node/CrapIndex.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Node\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Node/File.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Iterator.php', + 'SebastianBergmann\\CodeCoverage\\ParserException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/ParserException.php', + 'SebastianBergmann\\CodeCoverage\\ReflectionException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/ReflectionException.php', + 'SebastianBergmann\\CodeCoverage\\ReportAlreadyFinalizedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Clover.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Cobertura' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Cobertura.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Crap4j.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Colors' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Colors.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\CustomCssFile' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/CustomCssFile.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', + 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => $vendorDir . '/phpunit/php-code-coverage/src/Report/PHP.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Text' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Text.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Thresholds' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Thresholds.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/File.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysisCacheNotConfiguredException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CacheWarmer' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CachingFileAnalyser' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CodeUnitFindingVisitor' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ExecutableLinesFindingVisitor' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\FileAnalyser' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\IgnoredLinesFindingVisitor' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParsingFileAnalyser' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php', + 'SebastianBergmann\\CodeCoverage\\TestIdMissingException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/TestIdMissingException.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Known' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Known.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Large' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Large.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Medium' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Medium.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Small' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Small.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\TestSize' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/TestSize.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Unknown' => $vendorDir . '/phpunit/php-code-coverage/src/TestSize/Unknown.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Failure' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/Failure.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Known' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/Known.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Success' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/Success.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\TestStatus' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/TestStatus.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Unknown' => $vendorDir . '/phpunit/php-code-coverage/src/TestStatus/Unknown.php', + 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', + 'SebastianBergmann\\CodeCoverage\\Util\\DirectoryCouldNotBeCreatedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php', + 'SebastianBergmann\\CodeCoverage\\Util\\Filesystem' => $vendorDir . '/phpunit/php-code-coverage/src/Util/Filesystem.php', + 'SebastianBergmann\\CodeCoverage\\Util\\Percentage' => $vendorDir . '/phpunit/php-code-coverage/src/Util/Percentage.php', + 'SebastianBergmann\\CodeCoverage\\Version' => $vendorDir . '/phpunit/php-code-coverage/src/Version.php', + 'SebastianBergmann\\CodeCoverage\\XmlException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/XmlException.php', 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => $vendorDir . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', 'SebastianBergmann\\CodeUnit\\ClassMethodUnit' => $vendorDir . '/sebastian/code-unit/src/ClassMethodUnit.php', 'SebastianBergmann\\CodeUnit\\ClassUnit' => $vendorDir . '/sebastian/code-unit/src/ClassUnit.php', diff --git a/Sources/vendor/composer/autoload_psr4.php b/Sources/vendor/composer/autoload_psr4.php index 218aa369..7d78eeb5 100644 --- a/Sources/vendor/composer/autoload_psr4.php +++ b/Sources/vendor/composer/autoload_psr4.php @@ -16,12 +16,13 @@ return array( 'Shared\\Attributes\\' => array($baseDir . '/src/shared/attributes'), 'Shared\\' => array($baseDir . '/src/shared'), 'Repository\\' => array($baseDir . '/src/data/model/repository'), - 'Psr\\Container\\' => array($vendorDir . '/psr/container/src', $vendorDir . '/sebastian/cli-parser/src'), + 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), - 'PhpOption\\' => array($vendorDir . '/phpoption/phpoption/src/PhpOption', $vendorDir . '/phpunit/php-code-coverage/src/PhpOption'), + 'PhpOption\\' => array($vendorDir . '/phpoption/phpoption/src/PhpOption'), 'Network\\' => array($baseDir . '/src/data/core/network'), 'Model\\' => array($baseDir . '/src/data/model'), 'Manager\\' => array($baseDir . '/src/data/model/manager'), + 'Json\\' => array($baseDir . '/src/data/core/json'), 'Hearttrack\\' => array($baseDir . '/src'), 'GrahamCampbell\\ResultType\\' => array($vendorDir . '/graham-campbell/result-type/src'), 'Dotenv\\' => array($vendorDir . '/vlucas/phpdotenv/src'), diff --git a/Sources/vendor/composer/autoload_static.php b/Sources/vendor/composer/autoload_static.php index daa6f6ec..f8d6fde8 100644 --- a/Sources/vendor/composer/autoload_static.php +++ b/Sources/vendor/composer/autoload_static.php @@ -52,6 +52,10 @@ class ComposerStaticInit1887e85fc3cfddacf8d7e17588dae6f1 'Model\\' => 6, 'Manager\\' => 8, ), + 'J' => + array ( + 'Json\\' => 5, + ), 'H' => array ( 'Hearttrack\\' => 11, @@ -130,7 +134,6 @@ class ComposerStaticInit1887e85fc3cfddacf8d7e17588dae6f1 'Psr\\Container\\' => array ( 0 => __DIR__ . '/..' . '/psr/container/src', - 1 => __DIR__ . '/..' . '/sebastian/cli-parser/src', ), 'PhpParser\\' => array ( @@ -139,7 +142,6 @@ class ComposerStaticInit1887e85fc3cfddacf8d7e17588dae6f1 'PhpOption\\' => array ( 0 => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption', - 1 => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/PhpOption', ), 'Network\\' => array ( @@ -153,6 +155,10 @@ class ComposerStaticInit1887e85fc3cfddacf8d7e17588dae6f1 array ( 0 => __DIR__ . '/../..' . '/src/data/model/manager', ), + 'Json\\' => + array ( + 0 => __DIR__ . '/../..' . '/src/data/core/json', + ), 'Hearttrack\\' => array ( 0 => __DIR__ . '/../..' . '/src', @@ -465,6 +471,7 @@ class ComposerStaticInit1887e85fc3cfddacf8d7e17588dae6f1 'PHPUnit\\Framework\\Attributes\\ExcludeStaticPropertyFromBackup' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/ExcludeStaticPropertyFromBackup.php', 'PHPUnit\\Framework\\Attributes\\Group' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Group.php', 'PHPUnit\\Framework\\Attributes\\IgnoreClassForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/IgnoreClassForCodeCoverage.php', + 'PHPUnit\\Framework\\Attributes\\IgnoreDeprecations' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php', 'PHPUnit\\Framework\\Attributes\\IgnoreFunctionForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/IgnoreFunctionForCodeCoverage.php', 'PHPUnit\\Framework\\Attributes\\IgnoreMethodForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/IgnoreMethodForCodeCoverage.php', 'PHPUnit\\Framework\\Attributes\\Large' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Attributes/Large.php', @@ -640,6 +647,7 @@ class ComposerStaticInit1887e85fc3cfddacf8d7e17588dae6f1 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnValueMap.php', 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Stub.php', 'PHPUnit\\Framework\\NoChildTestSuiteException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', + 'PHPUnit\\Framework\\PhptAssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php', 'PHPUnit\\Framework\\ProcessIsolationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ProcessIsolationException.php', 'PHPUnit\\Framework\\Reorderable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Reorderable.php', 'PHPUnit\\Framework\\SelfDescribing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SelfDescribing.php', @@ -680,6 +688,8 @@ class ComposerStaticInit1887e85fc3cfddacf8d7e17588dae6f1 'PHPUnit\\Logging\\JUnit\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php', + 'PHPUnit\\Logging\\JUnit\\TestPreparationFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php', + 'PHPUnit\\Logging\\JUnit\\TestPreparationStartedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestRunnerExecutionFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestRunnerExecutionFinishedSubscriber.php', 'PHPUnit\\Logging\\JUnit\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php', @@ -700,26 +710,19 @@ class ComposerStaticInit1887e85fc3cfddacf8d7e17588dae6f1 'PHPUnit\\Logging\\TestDox\\HtmlRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/HtmlRenderer.php', 'PHPUnit\\Logging\\TestDox\\NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/NamePrettifier.php', 'PHPUnit\\Logging\\TestDox\\PlainTextRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/PlainTextRenderer.php', - 'PHPUnit\\Logging\\TestDox\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/Subscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestConsideredRiskySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestConsideredRiskySubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestCreatedMockObjectForAbstractClassSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectForAbstractClassSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestCreatedMockObjectForTraitSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectForTraitSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestCreatedMockObjectFromWsdlSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectFromWsdlSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestCreatedMockObjectSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestCreatedPartialMockObjectSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedPartialMockObjectSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestCreatedTestProxySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedTestProxySubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestCreatedTestStubSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedTestStubSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestErroredSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestFailedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestFinishedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestMarkedIncompleteSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestPassedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestPassedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestPreparedSubscriber.php', - 'PHPUnit\\Logging\\TestDox\\TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResult.php', - 'PHPUnit\\Logging\\TestDox\\TestResultCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResultCollection.php', - 'PHPUnit\\Logging\\TestDox\\TestResultCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResultCollectionIterator.php', - 'PHPUnit\\Logging\\TestDox\\TestResultCollector' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResultCollector.php', - 'PHPUnit\\Logging\\TestDox\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestSkippedSubscriber.php', + 'PHPUnit\\Logging\\TestDox\\Subscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/Subscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestConsideredRiskySubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestConsideredRiskySubscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestErroredSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestErroredSubscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestFailedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFailedSubscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestFinishedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFinishedSubscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestMarkedIncompleteSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestPassedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPassedSubscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestPreparedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPreparedSubscriber.php', + 'PHPUnit\\Logging\\TestDox\\TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.php', + 'PHPUnit\\Logging\\TestDox\\TestResultCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollection.php', + 'PHPUnit\\Logging\\TestDox\\TestResultCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollectionIterator.php', + 'PHPUnit\\Logging\\TestDox\\TestResultCollector' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.php', + 'PHPUnit\\Logging\\TestDox\\TestSkippedSubscriber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestSkippedSubscriber.php', 'PHPUnit\\Metadata\\After' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/After.php', 'PHPUnit\\Metadata\\AfterClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/AfterClass.php', 'PHPUnit\\Metadata\\Annotation\\Parser\\DocBlock' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Parser/Annotation/DocBlock.php', @@ -749,6 +752,7 @@ class ComposerStaticInit1887e85fc3cfddacf8d7e17588dae6f1 'PHPUnit\\Metadata\\ExcludeStaticPropertyFromBackup' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/ExcludeStaticPropertyFromBackup.php', 'PHPUnit\\Metadata\\Group' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Group.php', 'PHPUnit\\Metadata\\IgnoreClassForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/IgnoreClassForCodeCoverage.php', + 'PHPUnit\\Metadata\\IgnoreDeprecations' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php', 'PHPUnit\\Metadata\\IgnoreFunctionForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/IgnoreFunctionForCodeCoverage.php', 'PHPUnit\\Metadata\\IgnoreMethodForCodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/IgnoreMethodForCodeCoverage.php', 'PHPUnit\\Metadata\\InvalidVersionRequirementException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Exception/InvalidVersionRequirementException.php', @@ -808,6 +812,7 @@ class ComposerStaticInit1887e85fc3cfddacf8d7e17588dae6f1 'PHPUnit\\Runner\\ClassIsAbstractException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/ClassIsAbstractException.php', 'PHPUnit\\Runner\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/CodeCoverage.php', 'PHPUnit\\Runner\\DirectoryCannotBeCreatedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/DirectoryCannotBeCreatedException.php', + 'PHPUnit\\Runner\\ErrorException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/ErrorException.php', 'PHPUnit\\Runner\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ErrorHandler.php', 'PHPUnit\\Runner\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception/Exception.php', 'PHPUnit\\Runner\\Extension\\Extension' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Extension/Extension.php', @@ -1165,6 +1170,93 @@ class ComposerStaticInit1887e85fc3cfddacf8d7e17588dae6f1 'PharIo\\Version\\VersionConstraintValue' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintValue.php', 'PharIo\\Version\\VersionNumber' => __DIR__ . '/..' . '/phar-io/version/src/VersionNumber.php', 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', + 'SebastianBergmann\\CliParser\\AmbiguousOptionException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php', + 'SebastianBergmann\\CliParser\\Exception' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/Exception.php', + 'SebastianBergmann\\CliParser\\OptionDoesNotAllowArgumentException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php', + 'SebastianBergmann\\CliParser\\Parser' => __DIR__ . '/..' . '/sebastian/cli-parser/src/Parser.php', + 'SebastianBergmann\\CliParser\\RequiredOptionArgumentMissingException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.php', + 'SebastianBergmann\\CliParser\\UnknownOptionException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/UnknownOptionException.php', + 'SebastianBergmann\\CodeCoverage\\BranchAndPathCoverageNotSupportedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.php', + 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php', + 'SebastianBergmann\\CodeCoverage\\Data\\ProcessedCodeCoverageData' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Data/ProcessedCodeCoverageData.php', + 'SebastianBergmann\\CodeCoverage\\Data\\RawCodeCoverageData' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php', + 'SebastianBergmann\\CodeCoverage\\DeadCodeDetectionNotSupportedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Driver.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\PathExistsButIsNotDirectoryException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\PcovDriver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PcovDriver.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\PcovNotAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\Selector' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Selector.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\WriteOperationFailedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugDriver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/XdebugDriver.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugNotAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugNotEnabledException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/XdebugNotEnabledException.php', + 'SebastianBergmann\\CodeCoverage\\Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Exception.php', + 'SebastianBergmann\\CodeCoverage\\FileCouldNotBeWrittenException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/FileCouldNotBeWrittenException.php', + 'SebastianBergmann\\CodeCoverage\\Filter' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Filter.php', + 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', + 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php', + 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverWithPathCoverageSupportAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php', + 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Builder.php', + 'SebastianBergmann\\CodeCoverage\\Node\\CrapIndex' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/CrapIndex.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Node\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/File.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Iterator.php', + 'SebastianBergmann\\CodeCoverage\\ParserException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/ParserException.php', + 'SebastianBergmann\\CodeCoverage\\ReflectionException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/ReflectionException.php', + 'SebastianBergmann\\CodeCoverage\\ReportAlreadyFinalizedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Clover.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Cobertura' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Cobertura.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Crap4j.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Colors' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Colors.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\CustomCssFile' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/CustomCssFile.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', + 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/PHP.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Text' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Text.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Thresholds' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Thresholds.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/File.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysisCacheNotConfiguredException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CacheWarmer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CachingFileAnalyser' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CodeUnitFindingVisitor' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ExecutableLinesFindingVisitor' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\FileAnalyser' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\IgnoredLinesFindingVisitor' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.php', + 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParsingFileAnalyser' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php', + 'SebastianBergmann\\CodeCoverage\\TestIdMissingException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/TestIdMissingException.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Known' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Known.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Large' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Large.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Medium' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Medium.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Small' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Small.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\TestSize' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/TestSize.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestSize\\Unknown' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestSize/Unknown.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Failure' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/Failure.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Known' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/Known.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Success' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/Success.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\TestStatus' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/TestStatus.php', + 'SebastianBergmann\\CodeCoverage\\Test\\TestStatus\\Unknown' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/TestStatus/Unknown.php', + 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', + 'SebastianBergmann\\CodeCoverage\\Util\\DirectoryCouldNotBeCreatedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php', + 'SebastianBergmann\\CodeCoverage\\Util\\Filesystem' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Util/Filesystem.php', + 'SebastianBergmann\\CodeCoverage\\Util\\Percentage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Util/Percentage.php', + 'SebastianBergmann\\CodeCoverage\\Version' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Version.php', + 'SebastianBergmann\\CodeCoverage\\XmlException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/XmlException.php', 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => __DIR__ . '/..' . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', 'SebastianBergmann\\CodeUnit\\ClassMethodUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/ClassMethodUnit.php', 'SebastianBergmann\\CodeUnit\\ClassUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/ClassUnit.php', diff --git a/Sources/vendor/composer/installed.json b/Sources/vendor/composer/installed.json index c5a21d6b..17169bbb 100644 --- a/Sources/vendor/composer/installed.json +++ b/Sources/vendor/composer/installed.json @@ -99,177 +99,6 @@ }, "install-path": "../altorouter/altorouter" }, - { - "name": "doctrine/instantiator", - "version": "1.5.0", - "version_normalized": "1.5.0.0", - "source": { - "type": "git", - "url": "https://github.com/adriangibbons/php-fit-file-analysis.git", - "reference": "8efd36b1b963f01c42dc5329626519c040dec664" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/adriangibbons/php-fit-file-analysis/zipball/8efd36b1b963f01c42dc5329626519c040dec664", - "reference": "8efd36b1b963f01c42dc5329626519c040dec664", - "shasum": "" - }, - "require-dev": { - "phpunit/phpunit": "4.8.*", - "satooshi/php-coveralls": "^2.0", - "squizlabs/php_codesniffer": "2.*" - }, - "time": "2019-11-20T06:58:56+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "adriangibbons\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "description": "A PHP class for analysing FIT files created by Garmin GPS devices", - "homepage": "https://github.com/adriangibbons/php-fit-file-analysis", - "keywords": [ - "Fit", - "garmin" - ], - "support": { - "issues": "https://github.com/adriangibbons/php-fit-file-analysis/issues", - "source": "https://github.com/adriangibbons/php-fit-file-analysis/tree/master" - }, - "install-path": "../adriangibbons/php-fit-file-analysis" - }, - { - "name": "graham-campbell/result-type", - "version": "v1.1.2", - "version_normalized": "1.1.2.0", - "source": { - "type": "git", - "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", - "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" - }, - "time": "2023-11-12T22:16:48+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "GrahamCampbell\\ResultType\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - } - ], - "description": "An Implementation Of The Result Type", - "keywords": [ - "Graham Campbell", - "GrahamCampbell", - "Result Type", - "Result-Type", - "result" - ], - "support": { - "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", - "type": "tidelift" - } - ], - "install-path": "../graham-campbell/result-type" - }, - { - "name": "graham-campbell/result-type", - "version": "v1.1.2", - "version_normalized": "1.1.2.0", - "source": { - "type": "git", - "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", - "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" - }, - "time": "2023-11-12T22:16:48+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "GrahamCampbell\\ResultType\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - } - ], - "description": "An Implementation Of The Result Type", - "keywords": [ - "Graham Campbell", - "GrahamCampbell", - "Result Type", - "Result-Type", - "result" - ], - "support": { - "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", - "type": "tidelift" - } - ], - "install-path": "../graham-campbell/result-type" - }, { "name": "graham-campbell/result-type", "version": "v1.1.2", @@ -399,35 +228,37 @@ }, { "name": "nikic/php-parser", - "version": "v4.17.1", - "version_normalized": "4.17.1.0", + "version": "v5.0.0", + "version_normalized": "5.0.0.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4a21235f7e56e713259a6f76bf4b5ea08502b9dc", + "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, - "time": "2023-08-13T19:53:39+00:00", + "time": "2024-01-07T17:17:35+00:00", "bin": [ "bin/php-parse" ], "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.0-dev" } }, "installation-source": "dist", @@ -452,7 +283,7 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.0" }, "install-path": "../nikic/php-parser" }, @@ -653,102 +484,24 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.9", - "version_normalized": "10.1.9.0", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", - "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" - }, - "time": "2023-11-12T21:59:55+00:00", - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": true - }, - "branch-alias": { - "dev-master": "1.9-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "PhpOption\\": "src/PhpOption/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh" - }, - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - } - ], - "description": "Option Type for PHP", - "keywords": [ - "language", - "option", - "php", - "type" - ], - "support": { - "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", - "type": "tidelift" - } - ], - "install-path": "../phpoption/phpoption" - }, - { - "name": "phpunit/php-code-coverage", - "version": "10.1.9", - "version_normalized": "10.1.9.0", + "version": "10.1.11", + "version_normalized": "10.1.11.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735" + "reference": "78c3b7625965c2513ee96569a4dbb62601784145" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/a56a9ab2f680246adcf3db43f38ddf1765774735", - "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", + "reference": "78c3b7625965c2513ee96569a4dbb62601784145", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1", "phpunit/php-file-iterator": "^4.0", "phpunit/php-text-template": "^3.0", @@ -766,7 +519,7 @@ "ext-pcov": "PHP extension that provides line coverage", "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, - "time": "2023-11-23T12:23:20+00:00", + "time": "2023-12-21T15:38:30+00:00", "type": "library", "extra": { "branch-alias": { @@ -800,7 +553,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.9" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" }, "funding": [ { @@ -1067,17 +820,17 @@ }, { "name": "phpunit/phpunit", - "version": "10.4.2", - "version_normalized": "10.4.2.0", + "version": "10.5.5", + "version_normalized": "10.5.5.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "cacd8b9dd224efa8eb28beb69004126c7ca1a1a1" + "reference": "ed21115d505b4b4f7dc7b5651464e19a2c7f7856" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/cacd8b9dd224efa8eb28beb69004126c7ca1a1a1", - "reference": "cacd8b9dd224efa8eb28beb69004126c7ca1a1a1", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ed21115d505b4b4f7dc7b5651464e19a2c7f7856", + "reference": "ed21115d505b4b4f7dc7b5651464e19a2c7f7856", "shasum": "" }, "require": { @@ -1111,14 +864,14 @@ "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files" }, - "time": "2023-10-26T07:21:45+00:00", + "time": "2023-12-27T15:13:52+00:00", "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { - "dev-main": "10.4-dev" + "dev-main": "10.5-dev" } }, "installation-source": "dist", @@ -1151,7 +904,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.4.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.5" }, "funding": [ { @@ -1225,62 +978,6 @@ }, "install-path": "../psr/container" }, - { - "name": "sebastian/cli-parser", - "version": "2.0.0", - "version_normalized": "2.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "time": "2021-11-05T16:47:00+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" - }, - "install-path": "../psr/container" - }, { "name": "sebastian/cli-parser", "version": "2.0.0", @@ -1539,31 +1236,31 @@ }, { "name": "sebastian/complexity", - "version": "3.1.0", - "version_normalized": "3.1.0.0", + "version": "3.2.0", + "version_normalized": "3.2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" + "reference": "68ff824baeae169ec9f2137158ee529584553799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", - "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", "shasum": "" }, "require": { - "nikic/php-parser": "^4.10", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, - "time": "2023-09-28T11:50:59+00:00", + "time": "2023-12-21T08:37:17+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.2-dev" } }, "installation-source": "dist", @@ -1588,7 +1285,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" }, "funding": [ { @@ -1600,17 +1297,17 @@ }, { "name": "sebastian/diff", - "version": "5.0.3", - "version_normalized": "5.0.3.0", + "version": "5.1.0", + "version_normalized": "5.1.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", - "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", "shasum": "" }, "require": { @@ -1620,11 +1317,11 @@ "phpunit/phpunit": "^10.0", "symfony/process": "^4.2 || ^5" }, - "time": "2023-05-01T07:48:21+00:00", + "time": "2023-12-22T10:55:06+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "installation-source": "dist", @@ -1658,7 +1355,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" }, "funding": [ { @@ -1883,27 +1580,27 @@ }, { "name": "sebastian/lines-of-code", - "version": "2.0.1", - "version_normalized": "2.0.1.0", + "version": "2.0.2", + "version_normalized": "2.0.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "shasum": "" }, "require": { - "nikic/php-parser": "^4.10", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, - "time": "2023-08-31T09:25:50+00:00", + "time": "2023-12-21T08:38:20+00:00", "type": "library", "extra": { "branch-alias": { @@ -1932,7 +1629,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" }, "funding": [ { diff --git a/Sources/vendor/composer/installed.php b/Sources/vendor/composer/installed.php index 5c38c8e3..10c45558 100644 --- a/Sources/vendor/composer/installed.php +++ b/Sources/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'hearttrack/package', 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => 'eb625309ce4a814abafb1d0ded3d0d5937ddc905', + 'reference' => 'e86b3f7b002e2852b5084d5448b98251eec6e846', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -28,33 +28,6 @@ 'aliases' => array(), 'dev_requirement' => false, ), - 'doctrine/instantiator' => array( - 'pretty_version' => '1.5.0', - 'version' => '1.5.0.0', - 'reference' => '0a0fa9780f5d4e507415a065172d26a98d02047b', - 'type' => 'library', - 'install_path' => __DIR__ . '/../adriangibbons/php-fit-file-analysis', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'graham-campbell/result-type' => array( - 'pretty_version' => 'v1.1.2', - 'version' => '1.1.2.0', - 'reference' => 'fbd48bce38f73f8a4ec8583362e732e4095e5862', - 'type' => 'library', - 'install_path' => __DIR__ . '/../graham-campbell/result-type', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'graham-campbell/result-type' => array( - 'pretty_version' => 'v1.1.2', - 'version' => '1.1.2.0', - 'reference' => 'fbd48bce38f73f8a4ec8583362e732e4095e5862', - 'type' => 'library', - 'install_path' => __DIR__ . '/../graham-campbell/result-type', - 'aliases' => array(), - 'dev_requirement' => false, - ), 'graham-campbell/result-type' => array( 'pretty_version' => 'v1.1.2', 'version' => '1.1.2.0', @@ -67,7 +40,7 @@ 'hearttrack/package' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => 'eb625309ce4a814abafb1d0ded3d0d5937ddc905', + 'reference' => 'e86b3f7b002e2852b5084d5448b98251eec6e846', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -83,9 +56,9 @@ 'dev_requirement' => true, ), 'nikic/php-parser' => array( - 'pretty_version' => 'v4.17.1', - 'version' => '4.17.1.0', - 'reference' => 'a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d', + 'pretty_version' => 'v5.0.0', + 'version' => '5.0.0.0', + 'reference' => '4a21235f7e56e713259a6f76bf4b5ea08502b9dc', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), @@ -119,9 +92,9 @@ 'dev_requirement' => false, ), 'phpunit/php-code-coverage' => array( - 'pretty_version' => '10.1.9', - 'version' => '10.1.9.0', - 'reference' => 'a56a9ab2f680246adcf3db43f38ddf1765774735', + 'pretty_version' => '10.1.11', + 'version' => '10.1.11.0', + 'reference' => '78c3b7625965c2513ee96569a4dbb62601784145', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-code-coverage', 'aliases' => array(), @@ -164,9 +137,9 @@ 'dev_requirement' => true, ), 'phpunit/phpunit' => array( - 'pretty_version' => '10.4.2', - 'version' => '10.4.2.0', - 'reference' => 'cacd8b9dd224efa8eb28beb69004126c7ca1a1a1', + 'pretty_version' => '10.5.5', + 'version' => '10.5.5.0', + 'reference' => 'ed21115d505b4b4f7dc7b5651464e19a2c7f7856', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/phpunit', 'aliases' => array(), @@ -218,18 +191,18 @@ 'dev_requirement' => true, ), 'sebastian/complexity' => array( - 'pretty_version' => '3.1.0', - 'version' => '3.1.0.0', - 'reference' => '68cfb347a44871f01e33ab0ef8215966432f6957', + 'pretty_version' => '3.2.0', + 'version' => '3.2.0.0', + 'reference' => '68ff824baeae169ec9f2137158ee529584553799', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/complexity', 'aliases' => array(), 'dev_requirement' => true, ), 'sebastian/diff' => array( - 'pretty_version' => '5.0.3', - 'version' => '5.0.3.0', - 'reference' => '912dc2fbe3e3c1e7873313cc801b100b6c68c87b', + 'pretty_version' => '5.1.0', + 'version' => '5.1.0.0', + 'reference' => 'fbf413a49e54f6b9b17e12d900ac7f6101591b7f', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), @@ -263,9 +236,9 @@ 'dev_requirement' => true, ), 'sebastian/lines-of-code' => array( - 'pretty_version' => '2.0.1', - 'version' => '2.0.1.0', - 'reference' => '649e40d279e243d985aa8fb6e74dd5bb28dc185d', + 'pretty_version' => '2.0.2', + 'version' => '2.0.2.0', + 'reference' => '856e7f6a75a84e339195d48c556f23be2ebf75d0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/lines-of-code', 'aliases' => array(), diff --git a/Sources/vendor/nikic/php-parser/.php-cs-fixer.dist.php b/Sources/vendor/nikic/php-parser/.php-cs-fixer.dist.php new file mode 100644 index 00000000..314307ef --- /dev/null +++ b/Sources/vendor/nikic/php-parser/.php-cs-fixer.dist.php @@ -0,0 +1,31 @@ +exclude('PhpParser/Parser') + ->in(__DIR__ . '/lib') + ->in(__DIR__ . '/test') + ->in(__DIR__ . '/grammar') +; + +$config = new PhpCsFixer\Config(); +return $config->setRiskyAllowed(true) + ->setRules([ + '@PSR12' => true, + // We use PSR12 with consistent brace placement. + 'curly_braces_position' => [ + 'functions_opening_brace' => 'same_line', + 'classes_opening_brace' => 'same_line', + ], + // declare(strict_types=1) on the same line as false, + 'declare_strict_types' => true, + // Keep argument formatting for now. + 'method_argument_space' => ['on_multiline' => 'ignore'], + 'phpdoc_align' => ['align' => 'left'], + 'phpdoc_trim' => true, + 'no_empty_phpdoc' => true, + 'no_superfluous_phpdoc_tags' => ['allow_mixed' => true], + 'no_extra_blank_lines' => true, + ]) + ->setFinder($finder) +; diff --git a/Sources/vendor/nikic/php-parser/Makefile b/Sources/vendor/nikic/php-parser/Makefile new file mode 100644 index 00000000..9a7bdf2d --- /dev/null +++ b/Sources/vendor/nikic/php-parser/Makefile @@ -0,0 +1,10 @@ +.PHONY: phpstan php-cs-fixer + +tools/vendor: + composer install -d tools + +phpstan: tools/vendor + tools/vendor/bin/phpstan + +php-cs-fixer: tools/vendor + tools/vendor/bin/php-cs-fixer fix diff --git a/Sources/vendor/nikic/php-parser/README.md b/Sources/vendor/nikic/php-parser/README.md index 36de23cd..7555838e 100644 --- a/Sources/vendor/nikic/php-parser/README.md +++ b/Sources/vendor/nikic/php-parser/README.md @@ -3,24 +3,24 @@ PHP Parser [![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master) -This is a PHP 5.2 to PHP 8.2 parser written in PHP. Its purpose is to simplify static code analysis and +This is a PHP parser written in PHP. Its purpose is to simplify static code analysis and manipulation. -[**Documentation for version 4.x**][doc_4_x] (stable; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.2). +[**Documentation for version 5.x**][doc_master] (current; for running on PHP >= 7.4; for parsing PHP 7.0 to PHP 8.3, with limited support for parsing PHP 5.x). -[Documentation for version 3.x][doc_3_x] (unsupported; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2). +[Documentation for version 4.x][doc_4_x] (supported; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.3). Features -------- The main features provided by this library are: - * Parsing PHP 5, PHP 7, and PHP 8 code into an abstract syntax tree (AST). + * Parsing PHP 7, and PHP 8 code into an abstract syntax tree (AST). * Invalid code can be parsed into a partial AST. * The AST contains accurate location information. * Dumping the AST in human-readable form. * Converting an AST back to PHP code. - * Experimental: Formatting can be preserved for partially changed ASTs. + * Formatting can be preserved for partially changed ASTs. * Infrastructure to traverse and modify ASTs. * Resolution of namespaced names. * Evaluation of constant expressions. @@ -51,7 +51,7 @@ function test($foo) } CODE; -$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7); +$parser = (new ParserFactory())->createForNewestSupportedVersion(); try { $ast = $parser->parse($code); } catch (Error $error) { @@ -68,12 +68,17 @@ This dumps an AST looking something like this: ``` array( 0: Stmt_Function( + attrGroups: array( + ) byRef: false name: Identifier( name: test ) params: array( 0: Param( + attrGroups: array( + ) + flags: 0 type: null byRef: false variadic: false @@ -88,12 +93,11 @@ array( 0: Stmt_Expression( expr: Expr_FuncCall( name: Name( - parts: array( - 0: var_dump - ) + name: var_dump ) args: array( 0: Arg( + name: null value: Expr_Variable( name: foo ) @@ -135,12 +139,16 @@ This gives us an AST where the `Function_::$stmts` are empty: ``` array( 0: Stmt_Function( + attrGroups: array( + ) byRef: false name: Identifier( name: test ) params: array( 0: Param( + attrGroups: array( + ) type: null byRef: false variadic: false @@ -203,9 +211,8 @@ Component documentation: * [AST builders](doc/component/AST_builders.markdown) * Fluent builders for AST nodes * [Lexer](doc/component/Lexer.markdown) - * Lexer options - * Token and file positions for nodes - * Custom attributes + * Emulation + * Tokens, positions and attributes * [Error handling](doc/component/Error_handling.markdown) * Column information for errors * Error recovery (parsing of syntactically incorrect code) @@ -223,3 +230,4 @@ Component documentation: [doc_3_x]: https://github.com/nikic/PHP-Parser/tree/3.x/doc [doc_4_x]: https://github.com/nikic/PHP-Parser/tree/4.x/doc + [doc_master]: https://github.com/nikic/PHP-Parser/tree/master/doc diff --git a/Sources/vendor/nikic/php-parser/bin/php-parse b/Sources/vendor/nikic/php-parser/bin/php-parse index bb3e46df..fc44f234 100755 --- a/Sources/vendor/nikic/php-parser/bin/php-parse +++ b/Sources/vendor/nikic/php-parser/bin/php-parse @@ -26,13 +26,7 @@ if (empty($files)) { showHelp("Must specify at least one file."); } -$lexer = new PhpParser\Lexer\Emulative(['usedAttributes' => [ - 'startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments' -]]); -$parser = (new PhpParser\ParserFactory)->create( - PhpParser\ParserFactory::PREFER_PHP7, - $lexer -); +$parser = (new PhpParser\ParserFactory())->createForVersion($attributes['version']); $dumper = new PhpParser\NodeDumper([ 'dumpComments' => true, 'dumpPositions' => $attributes['with-positions'], @@ -43,7 +37,10 @@ $traverser = new PhpParser\NodeTraverser(); $traverser->addVisitor(new PhpParser\NodeVisitor\NameResolver); foreach ($files as $file) { - if (strpos($file, ' Stdin:\n"); + } else if (strpos($file, ' Code $code\n"); } else { @@ -108,7 +105,7 @@ function showHelp($error = '') { if ($error) { fwrite(STDERR, $error . "\n\n"); } - fwrite($error ? STDERR : STDOUT, << false, 'with-positions' => false, 'with-recovery' => false, + 'version' => PhpParser\PhpVersion::getNewestSupported(), ]; array_shift($args); @@ -193,7 +192,9 @@ function parseArgs($args) { $parseOptions = false; break; default: - if ($arg[0] === '-') { + if (preg_match('/^--version=(.*)$/', $arg, $matches)) { + $attributes['version'] = PhpParser\PhpVersion::fromString($matches[1]); + } elseif ($arg[0] === '-' && \strlen($arg[0]) > 1) { showHelp("Invalid operation $arg."); } else { $files[] = $arg; diff --git a/Sources/vendor/nikic/php-parser/composer.json b/Sources/vendor/nikic/php-parser/composer.json index 2fd064a2..b4b1bca7 100644 --- a/Sources/vendor/nikic/php-parser/composer.json +++ b/Sources/vendor/nikic/php-parser/composer.json @@ -13,16 +13,18 @@ } ], "require": { - "php": ">=7.0", - "ext-tokenizer": "*" + "php": ">=7.4", + "ext-tokenizer": "*", + "ext-json": "*", + "ext-ctype": "*" }, "require-dev": { - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", "ircmaxell/php-yacc": "^0.0.7" }, "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.0-dev" } }, "autoload": { diff --git a/Sources/vendor/nikic/php-parser/grammar/README.md b/Sources/vendor/nikic/php-parser/grammar/README.md deleted file mode 100644 index 4bae11d8..00000000 --- a/Sources/vendor/nikic/php-parser/grammar/README.md +++ /dev/null @@ -1,30 +0,0 @@ -What do all those files mean? -============================= - - * `php5.y`: PHP 5 grammar written in a pseudo language - * `php7.y`: PHP 7 grammar written in a pseudo language - * `tokens.y`: Tokens definition shared between PHP 5 and PHP 7 grammars - * `parser.template`: A `kmyacc` parser prototype file for PHP - * `tokens.template`: A `kmyacc` prototype file for the `Tokens` class - * `rebuildParsers.php`: Preprocesses the grammar and builds the parser using `kmyacc` - -.phpy pseudo language -===================== - -The `.y` file is a normal grammar in `kmyacc` (`yacc`) style, with some transformations -applied to it: - - * Nodes are created using the syntax `Name[..., ...]`. This is transformed into - `new Name(..., ..., attributes())` - * Some function-like constructs are resolved (see `rebuildParsers.php` for a list) - -Building the parser -=================== - -Run `php grammar/rebuildParsers.php` to rebuild the parsers. Additional options: - - * The `KMYACC` environment variable can be used to specify an alternative `kmyacc` binary. - By default the `phpyacc` dev dependency will be used. To use the original `kmyacc`, you - need to compile [moriyoshi's fork](https://github.com/moriyoshi/kmyacc-forked). - * The `--debug` option enables emission of debug symbols and creates the `y.output` file. - * The `--keep-tmp-grammar` option preserves the preprocessed grammar file. diff --git a/Sources/vendor/nikic/php-parser/grammar/parser.template b/Sources/vendor/nikic/php-parser/grammar/parser.template deleted file mode 100644 index 6166607c..00000000 --- a/Sources/vendor/nikic/php-parser/grammar/parser.template +++ /dev/null @@ -1,106 +0,0 @@ -semValue -#semval($,%t) $this->semValue -#semval(%n) $stackPos-(%l-%n) -#semval(%n,%t) $stackPos-(%l-%n) - -namespace PhpParser\Parser; - -use PhpParser\Error; -use PhpParser\Node; -use PhpParser\Node\Expr; -use PhpParser\Node\Name; -use PhpParser\Node\Scalar; -use PhpParser\Node\Stmt; -#include; - -/* This is an automatically GENERATED file, which should not be manually edited. - * Instead edit one of the following: - * * the grammar files grammar/php5.y or grammar/php7.y - * * the skeleton file grammar/parser.template - * * the preprocessing script grammar/rebuildParsers.php - */ -class #(-p) extends \PhpParser\ParserAbstract -{ - protected $tokenToSymbolMapSize = #(YYMAXLEX); - protected $actionTableSize = #(YYLAST); - protected $gotoTableSize = #(YYGLAST); - - protected $invalidSymbol = #(YYBADCH); - protected $errorSymbol = #(YYINTERRTOK); - protected $defaultAction = #(YYDEFAULT); - protected $unexpectedTokenRule = #(YYUNEXPECTED); - - protected $YY2TBLSTATE = #(YY2TBLSTATE); - protected $numNonLeafStates = #(YYNLSTATES); - - protected $symbolToName = array( - #listvar terminals - ); - - protected $tokenToSymbol = array( - #listvar yytranslate - ); - - protected $action = array( - #listvar yyaction - ); - - protected $actionCheck = array( - #listvar yycheck - ); - - protected $actionBase = array( - #listvar yybase - ); - - protected $actionDefault = array( - #listvar yydefault - ); - - protected $goto = array( - #listvar yygoto - ); - - protected $gotoCheck = array( - #listvar yygcheck - ); - - protected $gotoBase = array( - #listvar yygbase - ); - - protected $gotoDefault = array( - #listvar yygdefault - ); - - protected $ruleToNonTerminal = array( - #listvar yylhs - ); - - protected $ruleToLength = array( - #listvar yylen - ); -#if -t - - protected $productions = array( - #production-strings; - ); -#endif - - protected function initReduceCallbacks() { - $this->reduceCallbacks = [ -#reduce - %n => function ($stackPos) { - %b - }, -#noact - %n => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, -#endreduce - ]; - } -} -#tailcode; diff --git a/Sources/vendor/nikic/php-parser/grammar/php5.y b/Sources/vendor/nikic/php-parser/grammar/php5.y deleted file mode 100644 index 77e4fb7e..00000000 --- a/Sources/vendor/nikic/php-parser/grammar/php5.y +++ /dev/null @@ -1,1046 +0,0 @@ -%pure_parser -%expect 6 - -%tokens - -%% - -start: - top_statement_list { $$ = $this->handleNamespaces($1); } -; - -top_statement_list_ex: - top_statement_list_ex top_statement { pushNormalizing($1, $2); } - | /* empty */ { init(); } -; - -top_statement_list: - top_statement_list_ex - { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); - if ($nop !== null) { $1[] = $nop; } $$ = $1; } -; - -ampersand: - T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG - | T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG -; - -reserved_non_modifiers: - T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND - | T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE - | T_ENDWHILE | T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH - | T_FINALLY | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO - | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT - | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS - | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_HALT_COMPILER | T_FN - | T_MATCH -; - -semi_reserved: - reserved_non_modifiers - | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC -; - -identifier_ex: - T_STRING { $$ = Node\Identifier[$1]; } - | semi_reserved { $$ = Node\Identifier[$1]; } -; - -identifier: - T_STRING { $$ = Node\Identifier[$1]; } -; - -reserved_non_modifiers_identifier: - reserved_non_modifiers { $$ = Node\Identifier[$1]; } -; - -namespace_name: - T_STRING { $$ = Name[$1]; } - | T_NAME_QUALIFIED { $$ = Name[$1]; } -; - -legacy_namespace_name: - namespace_name { $$ = $1; } - | T_NAME_FULLY_QUALIFIED { $$ = Name[substr($1, 1)]; } -; - -plain_variable: - T_VARIABLE { $$ = Expr\Variable[parseVar($1)]; } -; - -top_statement: - statement { $$ = $1; } - | function_declaration_statement { $$ = $1; } - | class_declaration_statement { $$ = $1; } - | T_HALT_COMPILER - { $$ = Stmt\HaltCompiler[$this->lexer->handleHaltCompiler()]; } - | T_NAMESPACE namespace_name ';' - { $$ = Stmt\Namespace_[$2, null]; - $$->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); - $this->checkNamespace($$); } - | T_NAMESPACE namespace_name '{' top_statement_list '}' - { $$ = Stmt\Namespace_[$2, $4]; - $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($$); } - | T_NAMESPACE '{' top_statement_list '}' - { $$ = Stmt\Namespace_[null, $3]; - $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($$); } - | T_USE use_declarations ';' { $$ = Stmt\Use_[$2, Stmt\Use_::TYPE_NORMAL]; } - | T_USE use_type use_declarations ';' { $$ = Stmt\Use_[$3, $2]; } - | group_use_declaration ';' { $$ = $1; } - | T_CONST constant_declaration_list ';' { $$ = Stmt\Const_[$2]; } -; - -use_type: - T_FUNCTION { $$ = Stmt\Use_::TYPE_FUNCTION; } - | T_CONST { $$ = Stmt\Use_::TYPE_CONSTANT; } -; - -group_use_declaration: - T_USE use_type legacy_namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations '}' - { $$ = Stmt\GroupUse[$3, $6, $2]; } - | T_USE legacy_namespace_name T_NS_SEPARATOR '{' inline_use_declarations '}' - { $$ = Stmt\GroupUse[$2, $5, Stmt\Use_::TYPE_UNKNOWN]; } -; - -unprefixed_use_declarations: - unprefixed_use_declarations ',' unprefixed_use_declaration - { push($1, $3); } - | unprefixed_use_declaration { init($1); } -; - -use_declarations: - use_declarations ',' use_declaration { push($1, $3); } - | use_declaration { init($1); } -; - -inline_use_declarations: - inline_use_declarations ',' inline_use_declaration { push($1, $3); } - | inline_use_declaration { init($1); } -; - -unprefixed_use_declaration: - namespace_name - { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } - | namespace_name T_AS identifier - { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } -; - -use_declaration: - legacy_namespace_name - { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } - | legacy_namespace_name T_AS identifier - { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } -; - -inline_use_declaration: - unprefixed_use_declaration { $$ = $1; $$->type = Stmt\Use_::TYPE_NORMAL; } - | use_type unprefixed_use_declaration { $$ = $2; $$->type = $1; } -; - -constant_declaration_list: - constant_declaration_list ',' constant_declaration { push($1, $3); } - | constant_declaration { init($1); } -; - -constant_declaration: - identifier '=' static_scalar { $$ = Node\Const_[$1, $3]; } -; - -class_const_list: - class_const_list ',' class_const { push($1, $3); } - | class_const { init($1); } -; - -class_const: - identifier_ex '=' static_scalar { $$ = Node\Const_[$1, $3]; } -; - -inner_statement_list_ex: - inner_statement_list_ex inner_statement { pushNormalizing($1, $2); } - | /* empty */ { init(); } -; - -inner_statement_list: - inner_statement_list_ex - { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); - if ($nop !== null) { $1[] = $nop; } $$ = $1; } -; - -inner_statement: - statement { $$ = $1; } - | function_declaration_statement { $$ = $1; } - | class_declaration_statement { $$ = $1; } - | T_HALT_COMPILER - { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', attributes()); } -; - -non_empty_statement: - '{' inner_statement_list '}' - { - if ($2) { - $$ = $2; prependLeadingComments($$); - } else { - makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); - if (null === $$) { $$ = array(); } - } - } - | T_IF parentheses_expr statement elseif_list else_single - { $$ = Stmt\If_[$2, ['stmts' => toArray($3), 'elseifs' => $4, 'else' => $5]]; } - | T_IF parentheses_expr ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';' - { $$ = Stmt\If_[$2, ['stmts' => $4, 'elseifs' => $5, 'else' => $6]]; } - | T_WHILE parentheses_expr while_statement { $$ = Stmt\While_[$2, $3]; } - | T_DO statement T_WHILE parentheses_expr ';' { $$ = Stmt\Do_ [$4, toArray($2)]; } - | T_FOR '(' for_expr ';' for_expr ';' for_expr ')' for_statement - { $$ = Stmt\For_[['init' => $3, 'cond' => $5, 'loop' => $7, 'stmts' => $9]]; } - | T_SWITCH parentheses_expr switch_case_list { $$ = Stmt\Switch_[$2, $3]; } - | T_BREAK ';' { $$ = Stmt\Break_[null]; } - | T_BREAK expr ';' { $$ = Stmt\Break_[$2]; } - | T_CONTINUE ';' { $$ = Stmt\Continue_[null]; } - | T_CONTINUE expr ';' { $$ = Stmt\Continue_[$2]; } - | T_RETURN ';' { $$ = Stmt\Return_[null]; } - | T_RETURN expr ';' { $$ = Stmt\Return_[$2]; } - | T_GLOBAL global_var_list ';' { $$ = Stmt\Global_[$2]; } - | T_STATIC static_var_list ';' { $$ = Stmt\Static_[$2]; } - | T_ECHO expr_list ';' { $$ = Stmt\Echo_[$2]; } - | T_INLINE_HTML { $$ = Stmt\InlineHTML[$1]; } - | yield_expr ';' { $$ = Stmt\Expression[$1]; } - | expr ';' { $$ = Stmt\Expression[$1]; } - | T_UNSET '(' variables_list ')' ';' { $$ = Stmt\Unset_[$3]; } - | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement - { $$ = Stmt\Foreach_[$3, $5[0], ['keyVar' => null, 'byRef' => $5[1], 'stmts' => $7]]; } - | T_FOREACH '(' expr T_AS variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement - { $$ = Stmt\Foreach_[$3, $7[0], ['keyVar' => $5, 'byRef' => $7[1], 'stmts' => $9]]; } - | T_DECLARE '(' declare_list ')' declare_statement { $$ = Stmt\Declare_[$3, $5]; } - | T_TRY '{' inner_statement_list '}' catches optional_finally - { $$ = Stmt\TryCatch[$3, $5, $6]; $this->checkTryCatch($$); } - | T_THROW expr ';' { $$ = Stmt\Throw_[$2]; } - | T_GOTO identifier ';' { $$ = Stmt\Goto_[$2]; } - | identifier ':' { $$ = Stmt\Label[$1]; } - | expr error { $$ = Stmt\Expression[$1]; } - | error { $$ = array(); /* means: no statement */ } -; - -statement: - non_empty_statement { $$ = $1; } - | ';' - { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); - if ($$ === null) $$ = array(); /* means: no statement */ } -; - -catches: - /* empty */ { init(); } - | catches catch { push($1, $2); } -; - -catch: - T_CATCH '(' name plain_variable ')' '{' inner_statement_list '}' - { $$ = Stmt\Catch_[array($3), $4, $7]; } -; - -optional_finally: - /* empty */ { $$ = null; } - | T_FINALLY '{' inner_statement_list '}' { $$ = Stmt\Finally_[$3]; } -; - -variables_list: - variable { init($1); } - | variables_list ',' variable { push($1, $3); } -; - -optional_ref: - /* empty */ { $$ = false; } - | ampersand { $$ = true; } -; - -optional_arg_ref: - /* empty */ { $$ = false; } - | T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG { $$ = true; } -; - -optional_ellipsis: - /* empty */ { $$ = false; } - | T_ELLIPSIS { $$ = true; } -; - -identifier_maybe_readonly: - identifier { $$ = $1; } - | T_READONLY { $$ = Node\Identifier[$1]; } -; - -function_declaration_statement: - T_FUNCTION optional_ref identifier_maybe_readonly '(' parameter_list ')' optional_return_type '{' inner_statement_list '}' - { $$ = Stmt\Function_[$3, ['byRef' => $2, 'params' => $5, 'returnType' => $7, 'stmts' => $9]]; } -; - -class_declaration_statement: - class_entry_type identifier extends_from implements_list '{' class_statement_list '}' - { $$ = Stmt\Class_[$2, ['type' => $1, 'extends' => $3, 'implements' => $4, 'stmts' => $6]]; - $this->checkClass($$, #2); } - | T_INTERFACE identifier interface_extends_list '{' class_statement_list '}' - { $$ = Stmt\Interface_[$2, ['extends' => $3, 'stmts' => $5]]; - $this->checkInterface($$, #2); } - | T_TRAIT identifier '{' class_statement_list '}' - { $$ = Stmt\Trait_[$2, ['stmts' => $4]]; } -; - -class_entry_type: - T_CLASS { $$ = 0; } - | T_ABSTRACT T_CLASS { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } - | T_FINAL T_CLASS { $$ = Stmt\Class_::MODIFIER_FINAL; } -; - -extends_from: - /* empty */ { $$ = null; } - | T_EXTENDS class_name { $$ = $2; } -; - -interface_extends_list: - /* empty */ { $$ = array(); } - | T_EXTENDS class_name_list { $$ = $2; } -; - -implements_list: - /* empty */ { $$ = array(); } - | T_IMPLEMENTS class_name_list { $$ = $2; } -; - -class_name_list: - class_name { init($1); } - | class_name_list ',' class_name { push($1, $3); } -; - -for_statement: - statement { $$ = toArray($1); } - | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; } -; - -foreach_statement: - statement { $$ = toArray($1); } - | ':' inner_statement_list T_ENDFOREACH ';' { $$ = $2; } -; - -declare_statement: - non_empty_statement { $$ = toArray($1); } - | ';' { $$ = null; } - | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; } -; - -declare_list: - declare_list_element { init($1); } - | declare_list ',' declare_list_element { push($1, $3); } -; - -declare_list_element: - identifier '=' static_scalar { $$ = Stmt\DeclareDeclare[$1, $3]; } -; - -switch_case_list: - '{' case_list '}' { $$ = $2; } - | '{' ';' case_list '}' { $$ = $3; } - | ':' case_list T_ENDSWITCH ';' { $$ = $2; } - | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; } -; - -case_list: - /* empty */ { init(); } - | case_list case { push($1, $2); } -; - -case: - T_CASE expr case_separator inner_statement_list_ex { $$ = Stmt\Case_[$2, $4]; } - | T_DEFAULT case_separator inner_statement_list_ex { $$ = Stmt\Case_[null, $3]; } -; - -case_separator: - ':' - | ';' -; - -while_statement: - statement { $$ = toArray($1); } - | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; } -; - -elseif_list: - /* empty */ { init(); } - | elseif_list elseif { push($1, $2); } -; - -elseif: - T_ELSEIF parentheses_expr statement { $$ = Stmt\ElseIf_[$2, toArray($3)]; } -; - -new_elseif_list: - /* empty */ { init(); } - | new_elseif_list new_elseif { push($1, $2); } -; - -new_elseif: - T_ELSEIF parentheses_expr ':' inner_statement_list { $$ = Stmt\ElseIf_[$2, $4]; } -; - -else_single: - /* empty */ { $$ = null; } - | T_ELSE statement { $$ = Stmt\Else_[toArray($2)]; } -; - -new_else_single: - /* empty */ { $$ = null; } - | T_ELSE ':' inner_statement_list { $$ = Stmt\Else_[$3]; } -; - -foreach_variable: - variable { $$ = array($1, false); } - | ampersand variable { $$ = array($2, true); } - | list_expr { $$ = array($1, false); } -; - -parameter_list: - non_empty_parameter_list { $$ = $1; } - | /* empty */ { $$ = array(); } -; - -non_empty_parameter_list: - parameter { init($1); } - | non_empty_parameter_list ',' parameter { push($1, $3); } -; - -parameter: - optional_param_type optional_arg_ref optional_ellipsis plain_variable - { $$ = Node\Param[$4, null, $1, $2, $3]; $this->checkParam($$); } - | optional_param_type optional_arg_ref optional_ellipsis plain_variable '=' static_scalar - { $$ = Node\Param[$4, $6, $1, $2, $3]; $this->checkParam($$); } -; - -type: - name { $$ = $1; } - | T_ARRAY { $$ = Node\Identifier['array']; } - | T_CALLABLE { $$ = Node\Identifier['callable']; } -; - -optional_param_type: - /* empty */ { $$ = null; } - | type { $$ = $1; } -; - -optional_return_type: - /* empty */ { $$ = null; } - | ':' type { $$ = $2; } -; - -argument_list: - '(' ')' { $$ = array(); } - | '(' non_empty_argument_list ')' { $$ = $2; } - | '(' yield_expr ')' { $$ = array(Node\Arg[$2, false, false]); } -; - -non_empty_argument_list: - argument { init($1); } - | non_empty_argument_list ',' argument { push($1, $3); } -; - -argument: - expr { $$ = Node\Arg[$1, false, false]; } - | ampersand variable { $$ = Node\Arg[$2, true, false]; } - | T_ELLIPSIS expr { $$ = Node\Arg[$2, false, true]; } -; - -global_var_list: - global_var_list ',' global_var { push($1, $3); } - | global_var { init($1); } -; - -global_var: - plain_variable { $$ = $1; } - | '$' variable { $$ = Expr\Variable[$2]; } - | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } -; - -static_var_list: - static_var_list ',' static_var { push($1, $3); } - | static_var { init($1); } -; - -static_var: - plain_variable { $$ = Stmt\StaticVar[$1, null]; } - | plain_variable '=' static_scalar { $$ = Stmt\StaticVar[$1, $3]; } -; - -class_statement_list_ex: - class_statement_list_ex class_statement { if ($2 !== null) { push($1, $2); } } - | /* empty */ { init(); } -; - -class_statement_list: - class_statement_list_ex - { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); - if ($nop !== null) { $1[] = $nop; } $$ = $1; } -; - -class_statement: - variable_modifiers property_declaration_list ';' - { $$ = Stmt\Property[$1, $2]; $this->checkProperty($$, #1); } - | T_CONST class_const_list ';' { $$ = Stmt\ClassConst[$2, 0]; } - | method_modifiers T_FUNCTION optional_ref identifier_ex '(' parameter_list ')' optional_return_type method_body - { $$ = Stmt\ClassMethod[$4, ['type' => $1, 'byRef' => $3, 'params' => $6, 'returnType' => $8, 'stmts' => $9]]; - $this->checkClassMethod($$, #1); } - | T_USE class_name_list trait_adaptations { $$ = Stmt\TraitUse[$2, $3]; } -; - -trait_adaptations: - ';' { $$ = array(); } - | '{' trait_adaptation_list '}' { $$ = $2; } -; - -trait_adaptation_list: - /* empty */ { init(); } - | trait_adaptation_list trait_adaptation { push($1, $2); } -; - -trait_adaptation: - trait_method_reference_fully_qualified T_INSTEADOF class_name_list ';' - { $$ = Stmt\TraitUseAdaptation\Precedence[$1[0], $1[1], $3]; } - | trait_method_reference T_AS member_modifier identifier_ex ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, $4]; } - | trait_method_reference T_AS member_modifier ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, null]; } - | trait_method_reference T_AS identifier ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } - | trait_method_reference T_AS reserved_non_modifiers_identifier ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } -; - -trait_method_reference_fully_qualified: - name T_PAAMAYIM_NEKUDOTAYIM identifier_ex { $$ = array($1, $3); } -; -trait_method_reference: - trait_method_reference_fully_qualified { $$ = $1; } - | identifier_ex { $$ = array(null, $1); } -; - -method_body: - ';' /* abstract method */ { $$ = null; } - | '{' inner_statement_list '}' { $$ = $2; } -; - -variable_modifiers: - non_empty_member_modifiers { $$ = $1; } - | T_VAR { $$ = 0; } -; - -method_modifiers: - /* empty */ { $$ = 0; } - | non_empty_member_modifiers { $$ = $1; } -; - -non_empty_member_modifiers: - member_modifier { $$ = $1; } - | non_empty_member_modifiers member_modifier { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } -; - -member_modifier: - T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } - | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } - | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } - | T_STATIC { $$ = Stmt\Class_::MODIFIER_STATIC; } - | T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } - | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } -; - -property_declaration_list: - property_declaration { init($1); } - | property_declaration_list ',' property_declaration { push($1, $3); } -; - -property_decl_name: - T_VARIABLE { $$ = Node\VarLikeIdentifier[parseVar($1)]; } -; - -property_declaration: - property_decl_name { $$ = Stmt\PropertyProperty[$1, null]; } - | property_decl_name '=' static_scalar { $$ = Stmt\PropertyProperty[$1, $3]; } -; - -expr_list: - expr_list ',' expr { push($1, $3); } - | expr { init($1); } -; - -for_expr: - /* empty */ { $$ = array(); } - | expr_list { $$ = $1; } -; - -expr: - variable { $$ = $1; } - | list_expr '=' expr { $$ = Expr\Assign[$1, $3]; } - | variable '=' expr { $$ = Expr\Assign[$1, $3]; } - | variable '=' ampersand variable { $$ = Expr\AssignRef[$1, $4]; } - | variable '=' ampersand new_expr { $$ = Expr\AssignRef[$1, $4]; } - | new_expr { $$ = $1; } - | T_CLONE expr { $$ = Expr\Clone_[$2]; } - | variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1, $3]; } - | variable T_MINUS_EQUAL expr { $$ = Expr\AssignOp\Minus [$1, $3]; } - | variable T_MUL_EQUAL expr { $$ = Expr\AssignOp\Mul [$1, $3]; } - | variable T_DIV_EQUAL expr { $$ = Expr\AssignOp\Div [$1, $3]; } - | variable T_CONCAT_EQUAL expr { $$ = Expr\AssignOp\Concat [$1, $3]; } - | variable T_MOD_EQUAL expr { $$ = Expr\AssignOp\Mod [$1, $3]; } - | variable T_AND_EQUAL expr { $$ = Expr\AssignOp\BitwiseAnd[$1, $3]; } - | variable T_OR_EQUAL expr { $$ = Expr\AssignOp\BitwiseOr [$1, $3]; } - | variable T_XOR_EQUAL expr { $$ = Expr\AssignOp\BitwiseXor[$1, $3]; } - | variable T_SL_EQUAL expr { $$ = Expr\AssignOp\ShiftLeft [$1, $3]; } - | variable T_SR_EQUAL expr { $$ = Expr\AssignOp\ShiftRight[$1, $3]; } - | variable T_POW_EQUAL expr { $$ = Expr\AssignOp\Pow [$1, $3]; } - | variable T_COALESCE_EQUAL expr { $$ = Expr\AssignOp\Coalesce [$1, $3]; } - | variable T_INC { $$ = Expr\PostInc[$1]; } - | T_INC variable { $$ = Expr\PreInc [$2]; } - | variable T_DEC { $$ = Expr\PostDec[$1]; } - | T_DEC variable { $$ = Expr\PreDec [$2]; } - | expr T_BOOLEAN_OR expr { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } - | expr T_BOOLEAN_AND expr { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } - | expr T_LOGICAL_OR expr { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } - | expr T_LOGICAL_AND expr { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } - | expr T_LOGICAL_XOR expr { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } - | expr '|' expr { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } - | expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } - | expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } - | expr '^' expr { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } - | expr '.' expr { $$ = Expr\BinaryOp\Concat [$1, $3]; } - | expr '+' expr { $$ = Expr\BinaryOp\Plus [$1, $3]; } - | expr '-' expr { $$ = Expr\BinaryOp\Minus [$1, $3]; } - | expr '*' expr { $$ = Expr\BinaryOp\Mul [$1, $3]; } - | expr '/' expr { $$ = Expr\BinaryOp\Div [$1, $3]; } - | expr '%' expr { $$ = Expr\BinaryOp\Mod [$1, $3]; } - | expr T_SL expr { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } - | expr T_SR expr { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } - | expr T_POW expr { $$ = Expr\BinaryOp\Pow [$1, $3]; } - | '+' expr %prec T_INC { $$ = Expr\UnaryPlus [$2]; } - | '-' expr %prec T_INC { $$ = Expr\UnaryMinus[$2]; } - | '!' expr { $$ = Expr\BooleanNot[$2]; } - | '~' expr { $$ = Expr\BitwiseNot[$2]; } - | expr T_IS_IDENTICAL expr { $$ = Expr\BinaryOp\Identical [$1, $3]; } - | expr T_IS_NOT_IDENTICAL expr { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } - | expr T_IS_EQUAL expr { $$ = Expr\BinaryOp\Equal [$1, $3]; } - | expr T_IS_NOT_EQUAL expr { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } - | expr T_SPACESHIP expr { $$ = Expr\BinaryOp\Spaceship [$1, $3]; } - | expr '<' expr { $$ = Expr\BinaryOp\Smaller [$1, $3]; } - | expr T_IS_SMALLER_OR_EQUAL expr { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } - | expr '>' expr { $$ = Expr\BinaryOp\Greater [$1, $3]; } - | expr T_IS_GREATER_OR_EQUAL expr { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } - | expr T_INSTANCEOF class_name_reference { $$ = Expr\Instanceof_[$1, $3]; } - | parentheses_expr { $$ = $1; } - /* we need a separate '(' new_expr ')' rule to avoid problems caused by a s/r conflict */ - | '(' new_expr ')' { $$ = $2; } - | expr '?' expr ':' expr { $$ = Expr\Ternary[$1, $3, $5]; } - | expr '?' ':' expr { $$ = Expr\Ternary[$1, null, $4]; } - | expr T_COALESCE expr { $$ = Expr\BinaryOp\Coalesce[$1, $3]; } - | T_ISSET '(' variables_list ')' { $$ = Expr\Isset_[$3]; } - | T_EMPTY '(' expr ')' { $$ = Expr\Empty_[$3]; } - | T_INCLUDE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE]; } - | T_INCLUDE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE_ONCE]; } - | T_EVAL parentheses_expr { $$ = Expr\Eval_[$2]; } - | T_REQUIRE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; } - | T_REQUIRE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; } - | T_INT_CAST expr { $$ = Expr\Cast\Int_ [$2]; } - | T_DOUBLE_CAST expr - { $attrs = attributes(); - $attrs['kind'] = $this->getFloatCastKind($1); - $$ = new Expr\Cast\Double($2, $attrs); } - | T_STRING_CAST expr { $$ = Expr\Cast\String_ [$2]; } - | T_ARRAY_CAST expr { $$ = Expr\Cast\Array_ [$2]; } - | T_OBJECT_CAST expr { $$ = Expr\Cast\Object_ [$2]; } - | T_BOOL_CAST expr { $$ = Expr\Cast\Bool_ [$2]; } - | T_UNSET_CAST expr { $$ = Expr\Cast\Unset_ [$2]; } - | T_EXIT exit_expr - { $attrs = attributes(); - $attrs['kind'] = strtolower($1) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; - $$ = new Expr\Exit_($2, $attrs); } - | '@' expr { $$ = Expr\ErrorSuppress[$2]; } - | scalar { $$ = $1; } - | array_expr { $$ = $1; } - | scalar_dereference { $$ = $1; } - | '`' backticks_expr '`' { $$ = Expr\ShellExec[$2]; } - | T_PRINT expr { $$ = Expr\Print_[$2]; } - | T_YIELD { $$ = Expr\Yield_[null, null]; } - | T_YIELD_FROM expr { $$ = Expr\YieldFrom[$2]; } - | T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type - '{' inner_statement_list '}' - { $$ = Expr\Closure[['static' => false, 'byRef' => $2, 'params' => $4, 'uses' => $6, 'returnType' => $7, 'stmts' => $9]]; } - | T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type - '{' inner_statement_list '}' - { $$ = Expr\Closure[['static' => true, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $10]]; } -; - -parentheses_expr: - '(' expr ')' { $$ = $2; } - | '(' yield_expr ')' { $$ = $2; } -; - -yield_expr: - T_YIELD expr { $$ = Expr\Yield_[$2, null]; } - | T_YIELD expr T_DOUBLE_ARROW expr { $$ = Expr\Yield_[$4, $2]; } -; - -array_expr: - T_ARRAY '(' array_pair_list ')' - { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG; - $$ = new Expr\Array_($3, $attrs); } - | '[' array_pair_list ']' - { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_SHORT; - $$ = new Expr\Array_($2, $attrs); } -; - -scalar_dereference: - array_expr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[Scalar\String_::fromString($1, attributes()), $3]; } - | constant '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | scalar_dereference '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - /* alternative array syntax missing intentionally */ -; - -anonymous_class: - T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}' - { $$ = array(Stmt\Class_[null, ['type' => 0, 'extends' => $3, 'implements' => $4, 'stmts' => $6]], $2); - $this->checkClass($$[0], -1); } -; - -new_expr: - T_NEW class_name_reference ctor_arguments { $$ = Expr\New_[$2, $3]; } - | T_NEW anonymous_class - { list($class, $ctorArgs) = $2; $$ = Expr\New_[$class, $ctorArgs]; } -; - -lexical_vars: - /* empty */ { $$ = array(); } - | T_USE '(' lexical_var_list ')' { $$ = $3; } -; - -lexical_var_list: - lexical_var { init($1); } - | lexical_var_list ',' lexical_var { push($1, $3); } -; - -lexical_var: - optional_ref plain_variable { $$ = Expr\ClosureUse[$2, $1]; } -; - -name_readonly: - T_READONLY { $$ = Name[$1]; } -; - -function_call: - name argument_list { $$ = Expr\FuncCall[$1, $2]; } - | name_readonly argument_list { $$ = Expr\FuncCall[$1, $2]; } - | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_ex argument_list - { $$ = Expr\StaticCall[$1, $3, $4]; } - | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '{' expr '}' argument_list - { $$ = Expr\StaticCall[$1, $4, $6]; } - | static_property argument_list - { $$ = $this->fixupPhp5StaticPropCall($1, $2, attributes()); } - | variable_without_objects argument_list - { $$ = Expr\FuncCall[$1, $2]; } - | function_call '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - /* alternative array syntax missing intentionally */ -; - -class_name: - T_STATIC { $$ = Name[$1]; } - | name { $$ = $1; } -; - -name: - T_STRING { $$ = Name[$1]; } - | T_NAME_QUALIFIED { $$ = Name[$1]; } - | T_NAME_FULLY_QUALIFIED { $$ = Name\FullyQualified[substr($1, 1)]; } - | T_NAME_RELATIVE { $$ = Name\Relative[substr($1, 10)]; } -; - -class_name_reference: - class_name { $$ = $1; } - | dynamic_class_name_reference { $$ = $1; } -; - -dynamic_class_name_reference: - object_access_for_dcnr { $$ = $1; } - | base_variable { $$ = $1; } -; - -class_name_or_var: - class_name { $$ = $1; } - | reference_variable { $$ = $1; } -; - -object_access_for_dcnr: - base_variable T_OBJECT_OPERATOR object_property - { $$ = Expr\PropertyFetch[$1, $3]; } - | object_access_for_dcnr T_OBJECT_OPERATOR object_property - { $$ = Expr\PropertyFetch[$1, $3]; } - | object_access_for_dcnr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | object_access_for_dcnr '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } -; - -exit_expr: - /* empty */ { $$ = null; } - | '(' ')' { $$ = null; } - | parentheses_expr { $$ = $1; } -; - -backticks_expr: - /* empty */ { $$ = array(); } - | T_ENCAPSED_AND_WHITESPACE - { $$ = array(Scalar\EncapsedStringPart[Scalar\String_::parseEscapeSequences($1, '`', false)]); } - | encaps_list { parseEncapsed($1, '`', false); $$ = $1; } -; - -ctor_arguments: - /* empty */ { $$ = array(); } - | argument_list { $$ = $1; } -; - -common_scalar: - T_LNUMBER { $$ = $this->parseLNumber($1, attributes(), true); } - | T_DNUMBER { $$ = Scalar\DNumber::fromString($1, attributes()); } - | T_CONSTANT_ENCAPSED_STRING { $$ = Scalar\String_::fromString($1, attributes(), false); } - | T_LINE { $$ = Scalar\MagicConst\Line[]; } - | T_FILE { $$ = Scalar\MagicConst\File[]; } - | T_DIR { $$ = Scalar\MagicConst\Dir[]; } - | T_CLASS_C { $$ = Scalar\MagicConst\Class_[]; } - | T_TRAIT_C { $$ = Scalar\MagicConst\Trait_[]; } - | T_METHOD_C { $$ = Scalar\MagicConst\Method[]; } - | T_FUNC_C { $$ = Scalar\MagicConst\Function_[]; } - | T_NS_C { $$ = Scalar\MagicConst\Namespace_[]; } - | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC - { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), false); } - | T_START_HEREDOC T_END_HEREDOC - { $$ = $this->parseDocString($1, '', $2, attributes(), stackAttributes(#2), false); } -; - -static_scalar: - common_scalar { $$ = $1; } - | class_name T_PAAMAYIM_NEKUDOTAYIM identifier_ex { $$ = Expr\ClassConstFetch[$1, $3]; } - | name { $$ = Expr\ConstFetch[$1]; } - | T_ARRAY '(' static_array_pair_list ')' { $$ = Expr\Array_[$3]; } - | '[' static_array_pair_list ']' { $$ = Expr\Array_[$2]; } - | static_operation { $$ = $1; } -; - -static_operation: - static_scalar T_BOOLEAN_OR static_scalar { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } - | static_scalar T_BOOLEAN_AND static_scalar { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } - | static_scalar T_LOGICAL_OR static_scalar { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } - | static_scalar T_LOGICAL_AND static_scalar { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } - | static_scalar T_LOGICAL_XOR static_scalar { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } - | static_scalar '|' static_scalar { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } - | static_scalar T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG static_scalar - { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } - | static_scalar T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG static_scalar - { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } - | static_scalar '^' static_scalar { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } - | static_scalar '.' static_scalar { $$ = Expr\BinaryOp\Concat [$1, $3]; } - | static_scalar '+' static_scalar { $$ = Expr\BinaryOp\Plus [$1, $3]; } - | static_scalar '-' static_scalar { $$ = Expr\BinaryOp\Minus [$1, $3]; } - | static_scalar '*' static_scalar { $$ = Expr\BinaryOp\Mul [$1, $3]; } - | static_scalar '/' static_scalar { $$ = Expr\BinaryOp\Div [$1, $3]; } - | static_scalar '%' static_scalar { $$ = Expr\BinaryOp\Mod [$1, $3]; } - | static_scalar T_SL static_scalar { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } - | static_scalar T_SR static_scalar { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } - | static_scalar T_POW static_scalar { $$ = Expr\BinaryOp\Pow [$1, $3]; } - | '+' static_scalar %prec T_INC { $$ = Expr\UnaryPlus [$2]; } - | '-' static_scalar %prec T_INC { $$ = Expr\UnaryMinus[$2]; } - | '!' static_scalar { $$ = Expr\BooleanNot[$2]; } - | '~' static_scalar { $$ = Expr\BitwiseNot[$2]; } - | static_scalar T_IS_IDENTICAL static_scalar { $$ = Expr\BinaryOp\Identical [$1, $3]; } - | static_scalar T_IS_NOT_IDENTICAL static_scalar { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } - | static_scalar T_IS_EQUAL static_scalar { $$ = Expr\BinaryOp\Equal [$1, $3]; } - | static_scalar T_IS_NOT_EQUAL static_scalar { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } - | static_scalar '<' static_scalar { $$ = Expr\BinaryOp\Smaller [$1, $3]; } - | static_scalar T_IS_SMALLER_OR_EQUAL static_scalar { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } - | static_scalar '>' static_scalar { $$ = Expr\BinaryOp\Greater [$1, $3]; } - | static_scalar T_IS_GREATER_OR_EQUAL static_scalar { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } - | static_scalar '?' static_scalar ':' static_scalar { $$ = Expr\Ternary[$1, $3, $5]; } - | static_scalar '?' ':' static_scalar { $$ = Expr\Ternary[$1, null, $4]; } - | static_scalar '[' static_scalar ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | '(' static_scalar ')' { $$ = $2; } -; - -constant: - name { $$ = Expr\ConstFetch[$1]; } - | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_ex - { $$ = Expr\ClassConstFetch[$1, $3]; } -; - -scalar: - common_scalar { $$ = $1; } - | constant { $$ = $1; } - | '"' encaps_list '"' - { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); } - | T_START_HEREDOC encaps_list T_END_HEREDOC - { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } -; - -static_array_pair_list: - /* empty */ { $$ = array(); } - | non_empty_static_array_pair_list optional_comma { $$ = $1; } -; - -optional_comma: - /* empty */ - | ',' -; - -non_empty_static_array_pair_list: - non_empty_static_array_pair_list ',' static_array_pair { push($1, $3); } - | static_array_pair { init($1); } -; - -static_array_pair: - static_scalar T_DOUBLE_ARROW static_scalar { $$ = Expr\ArrayItem[$3, $1, false]; } - | static_scalar { $$ = Expr\ArrayItem[$1, null, false]; } -; - -variable: - object_access { $$ = $1; } - | base_variable { $$ = $1; } - | function_call { $$ = $1; } - | new_expr_array_deref { $$ = $1; } -; - -new_expr_array_deref: - '(' new_expr ')' '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$2, $5]; } - | new_expr_array_deref '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - /* alternative array syntax missing intentionally */ -; - -object_access: - variable_or_new_expr T_OBJECT_OPERATOR object_property - { $$ = Expr\PropertyFetch[$1, $3]; } - | variable_or_new_expr T_OBJECT_OPERATOR object_property argument_list - { $$ = Expr\MethodCall[$1, $3, $4]; } - | object_access argument_list { $$ = Expr\FuncCall[$1, $2]; } - | object_access '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | object_access '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } -; - -variable_or_new_expr: - variable { $$ = $1; } - | '(' new_expr ')' { $$ = $2; } -; - -variable_without_objects: - reference_variable { $$ = $1; } - | '$' variable_without_objects { $$ = Expr\Variable[$2]; } -; - -base_variable: - variable_without_objects { $$ = $1; } - | static_property { $$ = $1; } -; - -static_property: - class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '$' reference_variable - { $$ = Expr\StaticPropertyFetch[$1, $4]; } - | static_property_with_arrays { $$ = $1; } -; - -static_property_simple_name: - T_VARIABLE - { $var = parseVar($1); $$ = \is_string($var) ? Node\VarLikeIdentifier[$var] : $var; } -; - -static_property_with_arrays: - class_name_or_var T_PAAMAYIM_NEKUDOTAYIM static_property_simple_name - { $$ = Expr\StaticPropertyFetch[$1, $3]; } - | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '$' '{' expr '}' - { $$ = Expr\StaticPropertyFetch[$1, $5]; } - | static_property_with_arrays '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | static_property_with_arrays '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } -; - -reference_variable: - reference_variable '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | reference_variable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | plain_variable { $$ = $1; } - | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } -; - -dim_offset: - /* empty */ { $$ = null; } - | expr { $$ = $1; } -; - -object_property: - identifier { $$ = $1; } - | '{' expr '}' { $$ = $2; } - | variable_without_objects { $$ = $1; } - | error { $$ = Expr\Error[]; $this->errorState = 2; } -; - -list_expr: - T_LIST '(' list_expr_elements ')' { $$ = Expr\List_[$3]; } -; - -list_expr_elements: - list_expr_elements ',' list_expr_element { push($1, $3); } - | list_expr_element { init($1); } -; - -list_expr_element: - variable { $$ = Expr\ArrayItem[$1, null, false]; } - | list_expr { $$ = Expr\ArrayItem[$1, null, false]; } - | /* empty */ { $$ = null; } -; - -array_pair_list: - /* empty */ { $$ = array(); } - | non_empty_array_pair_list optional_comma { $$ = $1; } -; - -non_empty_array_pair_list: - non_empty_array_pair_list ',' array_pair { push($1, $3); } - | array_pair { init($1); } -; - -array_pair: - expr T_DOUBLE_ARROW expr { $$ = Expr\ArrayItem[$3, $1, false]; } - | expr { $$ = Expr\ArrayItem[$1, null, false]; } - | expr T_DOUBLE_ARROW ampersand variable { $$ = Expr\ArrayItem[$4, $1, true]; } - | ampersand variable { $$ = Expr\ArrayItem[$2, null, true]; } - | T_ELLIPSIS expr { $$ = new Expr\ArrayItem($2, null, false, attributes(), true); } -; - -encaps_list: - encaps_list encaps_var { push($1, $2); } - | encaps_list encaps_string_part { push($1, $2); } - | encaps_var { init($1); } - | encaps_string_part encaps_var { init($1, $2); } -; - -encaps_string_part: - T_ENCAPSED_AND_WHITESPACE { $$ = Scalar\EncapsedStringPart[$1]; } -; - -encaps_str_varname: - T_STRING_VARNAME { $$ = Expr\Variable[$1]; } -; - -encaps_var: - plain_variable { $$ = $1; } - | plain_variable '[' encaps_var_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | plain_variable T_OBJECT_OPERATOR identifier { $$ = Expr\PropertyFetch[$1, $3]; } - | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { $$ = Expr\Variable[$2]; } - | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' { $$ = Expr\Variable[$2]; } - | T_DOLLAR_OPEN_CURLY_BRACES encaps_str_varname '[' expr ']' '}' - { $$ = Expr\ArrayDimFetch[$2, $4]; } - | T_CURLY_OPEN variable '}' { $$ = $2; } -; - -encaps_var_offset: - T_STRING { $$ = Scalar\String_[$1]; } - | T_NUM_STRING { $$ = $this->parseNumString($1, attributes()); } - | plain_variable { $$ = $1; } -; - -%% diff --git a/Sources/vendor/nikic/php-parser/grammar/php7.y b/Sources/vendor/nikic/php-parser/grammar/php7.y deleted file mode 100644 index 1ef60bfe..00000000 --- a/Sources/vendor/nikic/php-parser/grammar/php7.y +++ /dev/null @@ -1,1245 +0,0 @@ -%pure_parser -%expect 2 - -%tokens - -%% - -start: - top_statement_list { $$ = $this->handleNamespaces($1); } -; - -top_statement_list_ex: - top_statement_list_ex top_statement { pushNormalizing($1, $2); } - | /* empty */ { init(); } -; - -top_statement_list: - top_statement_list_ex - { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); - if ($nop !== null) { $1[] = $nop; } $$ = $1; } -; - -ampersand: - T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG - | T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG -; - -reserved_non_modifiers: - T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND - | T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE - | T_ENDWHILE | T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH - | T_FINALLY | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO - | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT - | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS - | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_HALT_COMPILER | T_FN - | T_MATCH | T_ENUM -; - -semi_reserved: - reserved_non_modifiers - | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC | T_READONLY -; - -identifier_maybe_reserved: - T_STRING { $$ = Node\Identifier[$1]; } - | semi_reserved { $$ = Node\Identifier[$1]; } -; - -identifier_not_reserved: - T_STRING { $$ = Node\Identifier[$1]; } -; - -reserved_non_modifiers_identifier: - reserved_non_modifiers { $$ = Node\Identifier[$1]; } -; - -namespace_declaration_name: - T_STRING { $$ = Name[$1]; } - | semi_reserved { $$ = Name[$1]; } - | T_NAME_QUALIFIED { $$ = Name[$1]; } -; - -namespace_name: - T_STRING { $$ = Name[$1]; } - | T_NAME_QUALIFIED { $$ = Name[$1]; } -; - -legacy_namespace_name: - namespace_name { $$ = $1; } - | T_NAME_FULLY_QUALIFIED { $$ = Name[substr($1, 1)]; } -; - -plain_variable: - T_VARIABLE { $$ = Expr\Variable[parseVar($1)]; } -; - -semi: - ';' { /* nothing */ } - | error { /* nothing */ } -; - -no_comma: - /* empty */ { /* nothing */ } - | ',' { $this->emitError(new Error('A trailing comma is not allowed here', attributes())); } -; - -optional_comma: - /* empty */ - | ',' -; - -attribute_decl: - class_name { $$ = Node\Attribute[$1, []]; } - | class_name argument_list { $$ = Node\Attribute[$1, $2]; } -; - -attribute_group: - attribute_decl { init($1); } - | attribute_group ',' attribute_decl { push($1, $3); } -; - -attribute: - T_ATTRIBUTE attribute_group optional_comma ']' { $$ = Node\AttributeGroup[$2]; } -; - -attributes: - attribute { init($1); } - | attributes attribute { push($1, $2); } -; - -optional_attributes: - /* empty */ { $$ = []; } - | attributes { $$ = $1; } -; - -top_statement: - statement { $$ = $1; } - | function_declaration_statement { $$ = $1; } - | class_declaration_statement { $$ = $1; } - | T_HALT_COMPILER - { $$ = Stmt\HaltCompiler[$this->lexer->handleHaltCompiler()]; } - | T_NAMESPACE namespace_declaration_name semi - { $$ = Stmt\Namespace_[$2, null]; - $$->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); - $this->checkNamespace($$); } - | T_NAMESPACE namespace_declaration_name '{' top_statement_list '}' - { $$ = Stmt\Namespace_[$2, $4]; - $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($$); } - | T_NAMESPACE '{' top_statement_list '}' - { $$ = Stmt\Namespace_[null, $3]; - $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($$); } - | T_USE use_declarations semi { $$ = Stmt\Use_[$2, Stmt\Use_::TYPE_NORMAL]; } - | T_USE use_type use_declarations semi { $$ = Stmt\Use_[$3, $2]; } - | group_use_declaration semi { $$ = $1; } - | T_CONST constant_declaration_list semi { $$ = Stmt\Const_[$2]; } -; - -use_type: - T_FUNCTION { $$ = Stmt\Use_::TYPE_FUNCTION; } - | T_CONST { $$ = Stmt\Use_::TYPE_CONSTANT; } -; - -group_use_declaration: - T_USE use_type legacy_namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations '}' - { $$ = Stmt\GroupUse[$3, $6, $2]; } - | T_USE legacy_namespace_name T_NS_SEPARATOR '{' inline_use_declarations '}' - { $$ = Stmt\GroupUse[$2, $5, Stmt\Use_::TYPE_UNKNOWN]; } -; - -unprefixed_use_declarations: - non_empty_unprefixed_use_declarations optional_comma { $$ = $1; } -; - -non_empty_unprefixed_use_declarations: - non_empty_unprefixed_use_declarations ',' unprefixed_use_declaration - { push($1, $3); } - | unprefixed_use_declaration { init($1); } -; - -use_declarations: - non_empty_use_declarations no_comma { $$ = $1; } -; - -non_empty_use_declarations: - non_empty_use_declarations ',' use_declaration { push($1, $3); } - | use_declaration { init($1); } -; - -inline_use_declarations: - non_empty_inline_use_declarations optional_comma { $$ = $1; } -; - -non_empty_inline_use_declarations: - non_empty_inline_use_declarations ',' inline_use_declaration - { push($1, $3); } - | inline_use_declaration { init($1); } -; - -unprefixed_use_declaration: - namespace_name - { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } - | namespace_name T_AS identifier_not_reserved - { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } -; - -use_declaration: - legacy_namespace_name - { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } - | legacy_namespace_name T_AS identifier_not_reserved - { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } -; - -inline_use_declaration: - unprefixed_use_declaration { $$ = $1; $$->type = Stmt\Use_::TYPE_NORMAL; } - | use_type unprefixed_use_declaration { $$ = $2; $$->type = $1; } -; - -constant_declaration_list: - non_empty_constant_declaration_list no_comma { $$ = $1; } -; - -non_empty_constant_declaration_list: - non_empty_constant_declaration_list ',' constant_declaration - { push($1, $3); } - | constant_declaration { init($1); } -; - -constant_declaration: - identifier_not_reserved '=' expr { $$ = Node\Const_[$1, $3]; } -; - -class_const_list: - non_empty_class_const_list no_comma { $$ = $1; } -; - -non_empty_class_const_list: - non_empty_class_const_list ',' class_const { push($1, $3); } - | class_const { init($1); } -; - -class_const: - T_STRING '=' expr - { $$ = Node\Const_[new Node\Identifier($1, stackAttributes(#1)), $3]; } - | semi_reserved '=' expr - { $$ = Node\Const_[new Node\Identifier($1, stackAttributes(#1)), $3]; } -; - -inner_statement_list_ex: - inner_statement_list_ex inner_statement { pushNormalizing($1, $2); } - | /* empty */ { init(); } -; - -inner_statement_list: - inner_statement_list_ex - { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); - if ($nop !== null) { $1[] = $nop; } $$ = $1; } -; - -inner_statement: - statement { $$ = $1; } - | function_declaration_statement { $$ = $1; } - | class_declaration_statement { $$ = $1; } - | T_HALT_COMPILER - { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', attributes()); } -; - -non_empty_statement: - '{' inner_statement_list '}' - { - if ($2) { - $$ = $2; prependLeadingComments($$); - } else { - makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); - if (null === $$) { $$ = array(); } - } - } - | T_IF '(' expr ')' statement elseif_list else_single - { $$ = Stmt\If_[$3, ['stmts' => toArray($5), 'elseifs' => $6, 'else' => $7]]; } - | T_IF '(' expr ')' ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';' - { $$ = Stmt\If_[$3, ['stmts' => $6, 'elseifs' => $7, 'else' => $8]]; } - | T_WHILE '(' expr ')' while_statement { $$ = Stmt\While_[$3, $5]; } - | T_DO statement T_WHILE '(' expr ')' ';' { $$ = Stmt\Do_ [$5, toArray($2)]; } - | T_FOR '(' for_expr ';' for_expr ';' for_expr ')' for_statement - { $$ = Stmt\For_[['init' => $3, 'cond' => $5, 'loop' => $7, 'stmts' => $9]]; } - | T_SWITCH '(' expr ')' switch_case_list { $$ = Stmt\Switch_[$3, $5]; } - | T_BREAK optional_expr semi { $$ = Stmt\Break_[$2]; } - | T_CONTINUE optional_expr semi { $$ = Stmt\Continue_[$2]; } - | T_RETURN optional_expr semi { $$ = Stmt\Return_[$2]; } - | T_GLOBAL global_var_list semi { $$ = Stmt\Global_[$2]; } - | T_STATIC static_var_list semi { $$ = Stmt\Static_[$2]; } - | T_ECHO expr_list_forbid_comma semi { $$ = Stmt\Echo_[$2]; } - | T_INLINE_HTML { $$ = Stmt\InlineHTML[$1]; } - | expr semi { - $e = $1; - if ($e instanceof Expr\Throw_) { - // For backwards-compatibility reasons, convert throw in statement position into - // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_). - $$ = Stmt\Throw_[$e->expr]; - } else { - $$ = Stmt\Expression[$e]; - } - } - | T_UNSET '(' variables_list ')' semi { $$ = Stmt\Unset_[$3]; } - | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement - { $$ = Stmt\Foreach_[$3, $5[0], ['keyVar' => null, 'byRef' => $5[1], 'stmts' => $7]]; } - | T_FOREACH '(' expr T_AS variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement - { $$ = Stmt\Foreach_[$3, $7[0], ['keyVar' => $5, 'byRef' => $7[1], 'stmts' => $9]]; } - | T_FOREACH '(' expr error ')' foreach_statement - { $$ = Stmt\Foreach_[$3, new Expr\Error(stackAttributes(#4)), ['stmts' => $6]]; } - | T_DECLARE '(' declare_list ')' declare_statement { $$ = Stmt\Declare_[$3, $5]; } - | T_TRY '{' inner_statement_list '}' catches optional_finally - { $$ = Stmt\TryCatch[$3, $5, $6]; $this->checkTryCatch($$); } - | T_GOTO identifier_not_reserved semi { $$ = Stmt\Goto_[$2]; } - | identifier_not_reserved ':' { $$ = Stmt\Label[$1]; } - | error { $$ = array(); /* means: no statement */ } -; - -statement: - non_empty_statement { $$ = $1; } - | ';' - { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); - if ($$ === null) $$ = array(); /* means: no statement */ } -; - -catches: - /* empty */ { init(); } - | catches catch { push($1, $2); } -; - -name_union: - name { init($1); } - | name_union '|' name { push($1, $3); } -; - -catch: - T_CATCH '(' name_union optional_plain_variable ')' '{' inner_statement_list '}' - { $$ = Stmt\Catch_[$3, $4, $7]; } -; - -optional_finally: - /* empty */ { $$ = null; } - | T_FINALLY '{' inner_statement_list '}' { $$ = Stmt\Finally_[$3]; } -; - -variables_list: - non_empty_variables_list optional_comma { $$ = $1; } -; - -non_empty_variables_list: - variable { init($1); } - | non_empty_variables_list ',' variable { push($1, $3); } -; - -optional_ref: - /* empty */ { $$ = false; } - | ampersand { $$ = true; } -; - -optional_arg_ref: - /* empty */ { $$ = false; } - | T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG { $$ = true; } -; - -optional_ellipsis: - /* empty */ { $$ = false; } - | T_ELLIPSIS { $$ = true; } -; - -block_or_error: - '{' inner_statement_list '}' { $$ = $2; } - | error { $$ = []; } -; - -identifier_maybe_readonly: - identifier_not_reserved { $$ = $1; } - | T_READONLY { $$ = Node\Identifier[$1]; } -; - -function_declaration_statement: - T_FUNCTION optional_ref identifier_maybe_readonly '(' parameter_list ')' optional_return_type block_or_error - { $$ = Stmt\Function_[$3, ['byRef' => $2, 'params' => $5, 'returnType' => $7, 'stmts' => $8, 'attrGroups' => []]]; } - | attributes T_FUNCTION optional_ref identifier_maybe_readonly '(' parameter_list ')' optional_return_type block_or_error - { $$ = Stmt\Function_[$4, ['byRef' => $3, 'params' => $6, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => $1]]; } -; - -class_declaration_statement: - class_entry_type identifier_not_reserved extends_from implements_list '{' class_statement_list '}' - { $$ = Stmt\Class_[$2, ['type' => $1, 'extends' => $3, 'implements' => $4, 'stmts' => $6, 'attrGroups' => []]]; - $this->checkClass($$, #2); } - | attributes class_entry_type identifier_not_reserved extends_from implements_list '{' class_statement_list '}' - { $$ = Stmt\Class_[$3, ['type' => $2, 'extends' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]]; - $this->checkClass($$, #3); } - | optional_attributes T_INTERFACE identifier_not_reserved interface_extends_list '{' class_statement_list '}' - { $$ = Stmt\Interface_[$3, ['extends' => $4, 'stmts' => $6, 'attrGroups' => $1]]; - $this->checkInterface($$, #3); } - | optional_attributes T_TRAIT identifier_not_reserved '{' class_statement_list '}' - { $$ = Stmt\Trait_[$3, ['stmts' => $5, 'attrGroups' => $1]]; } - | optional_attributes T_ENUM identifier_not_reserved enum_scalar_type implements_list '{' class_statement_list '}' - { $$ = Stmt\Enum_[$3, ['scalarType' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]]; - $this->checkEnum($$, #3); } -; - -enum_scalar_type: - /* empty */ { $$ = null; } - | ':' type { $$ = $2; } - -enum_case_expr: - /* empty */ { $$ = null; } - | '=' expr { $$ = $2; } -; - -class_entry_type: - T_CLASS { $$ = 0; } - | class_modifiers T_CLASS { $$ = $1; } -; - -class_modifiers: - class_modifier { $$ = $1; } - | class_modifiers class_modifier { $this->checkClassModifier($1, $2, #2); $$ = $1 | $2; } -; - -class_modifier: - T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } - | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } - | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } -; - -extends_from: - /* empty */ { $$ = null; } - | T_EXTENDS class_name { $$ = $2; } -; - -interface_extends_list: - /* empty */ { $$ = array(); } - | T_EXTENDS class_name_list { $$ = $2; } -; - -implements_list: - /* empty */ { $$ = array(); } - | T_IMPLEMENTS class_name_list { $$ = $2; } -; - -class_name_list: - non_empty_class_name_list no_comma { $$ = $1; } -; - -non_empty_class_name_list: - class_name { init($1); } - | non_empty_class_name_list ',' class_name { push($1, $3); } -; - -for_statement: - statement { $$ = toArray($1); } - | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; } -; - -foreach_statement: - statement { $$ = toArray($1); } - | ':' inner_statement_list T_ENDFOREACH ';' { $$ = $2; } -; - -declare_statement: - non_empty_statement { $$ = toArray($1); } - | ';' { $$ = null; } - | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; } -; - -declare_list: - non_empty_declare_list no_comma { $$ = $1; } -; - -non_empty_declare_list: - declare_list_element { init($1); } - | non_empty_declare_list ',' declare_list_element { push($1, $3); } -; - -declare_list_element: - identifier_not_reserved '=' expr { $$ = Stmt\DeclareDeclare[$1, $3]; } -; - -switch_case_list: - '{' case_list '}' { $$ = $2; } - | '{' ';' case_list '}' { $$ = $3; } - | ':' case_list T_ENDSWITCH ';' { $$ = $2; } - | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; } -; - -case_list: - /* empty */ { init(); } - | case_list case { push($1, $2); } -; - -case: - T_CASE expr case_separator inner_statement_list_ex { $$ = Stmt\Case_[$2, $4]; } - | T_DEFAULT case_separator inner_statement_list_ex { $$ = Stmt\Case_[null, $3]; } -; - -case_separator: - ':' - | ';' -; - -match: - T_MATCH '(' expr ')' '{' match_arm_list '}' { $$ = Expr\Match_[$3, $6]; } -; - -match_arm_list: - /* empty */ { $$ = []; } - | non_empty_match_arm_list optional_comma { $$ = $1; } -; - -non_empty_match_arm_list: - match_arm { init($1); } - | non_empty_match_arm_list ',' match_arm { push($1, $3); } -; - -match_arm: - expr_list_allow_comma T_DOUBLE_ARROW expr { $$ = Node\MatchArm[$1, $3]; } - | T_DEFAULT optional_comma T_DOUBLE_ARROW expr { $$ = Node\MatchArm[null, $4]; } -; - -while_statement: - statement { $$ = toArray($1); } - | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; } -; - -elseif_list: - /* empty */ { init(); } - | elseif_list elseif { push($1, $2); } -; - -elseif: - T_ELSEIF '(' expr ')' statement { $$ = Stmt\ElseIf_[$3, toArray($5)]; } -; - -new_elseif_list: - /* empty */ { init(); } - | new_elseif_list new_elseif { push($1, $2); } -; - -new_elseif: - T_ELSEIF '(' expr ')' ':' inner_statement_list - { $$ = Stmt\ElseIf_[$3, $6]; $this->fixupAlternativeElse($$); } -; - -else_single: - /* empty */ { $$ = null; } - | T_ELSE statement { $$ = Stmt\Else_[toArray($2)]; } -; - -new_else_single: - /* empty */ { $$ = null; } - | T_ELSE ':' inner_statement_list - { $$ = Stmt\Else_[$3]; $this->fixupAlternativeElse($$); } -; - -foreach_variable: - variable { $$ = array($1, false); } - | ampersand variable { $$ = array($2, true); } - | list_expr { $$ = array($1, false); } - | array_short_syntax { $$ = array($1, false); } -; - -parameter_list: - non_empty_parameter_list optional_comma { $$ = $1; } - | /* empty */ { $$ = array(); } -; - -non_empty_parameter_list: - parameter { init($1); } - | non_empty_parameter_list ',' parameter { push($1, $3); } -; - -optional_property_modifiers: - /* empty */ { $$ = 0; } - | optional_property_modifiers property_modifier - { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } -; - -property_modifier: - T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } - | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } - | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } - | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } -; - -parameter: - optional_attributes optional_property_modifiers optional_type_without_static - optional_arg_ref optional_ellipsis plain_variable - { $$ = new Node\Param($6, null, $3, $4, $5, attributes(), $2, $1); - $this->checkParam($$); } - | optional_attributes optional_property_modifiers optional_type_without_static - optional_arg_ref optional_ellipsis plain_variable '=' expr - { $$ = new Node\Param($6, $8, $3, $4, $5, attributes(), $2, $1); - $this->checkParam($$); } - | optional_attributes optional_property_modifiers optional_type_without_static - optional_arg_ref optional_ellipsis error - { $$ = new Node\Param(Expr\Error[], null, $3, $4, $5, attributes(), $2, $1); } -; - -type_expr: - type { $$ = $1; } - | '?' type { $$ = Node\NullableType[$2]; } - | union_type { $$ = Node\UnionType[$1]; } - | intersection_type { $$ = $1; } -; - -type: - type_without_static { $$ = $1; } - | T_STATIC { $$ = Node\Name['static']; } -; - -type_without_static: - name { $$ = $this->handleBuiltinTypes($1); } - | T_ARRAY { $$ = Node\Identifier['array']; } - | T_CALLABLE { $$ = Node\Identifier['callable']; } -; - -union_type_element: - type { $$ = $1; } - | '(' intersection_type ')' { $$ = $2; } -; - -union_type: - union_type_element '|' union_type_element { init($1, $3); } - | union_type '|' union_type_element { push($1, $3); } -; - -union_type_without_static_element: - type_without_static { $$ = $1; } - | '(' intersection_type_without_static ')' { $$ = $2; } -; - -union_type_without_static: - union_type_without_static_element '|' union_type_without_static_element { init($1, $3); } - | union_type_without_static '|' union_type_without_static_element { push($1, $3); } -; - -intersection_type_list: - type T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type { init($1, $3); } - | intersection_type_list T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type - { push($1, $3); } -; - -intersection_type: - intersection_type_list { $$ = Node\IntersectionType[$1]; } -; - -intersection_type_without_static_list: - type_without_static T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static - { init($1, $3); } - | intersection_type_without_static_list T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static - { push($1, $3); } -; - -intersection_type_without_static: - intersection_type_without_static_list { $$ = Node\IntersectionType[$1]; } -; - -type_expr_without_static: - type_without_static { $$ = $1; } - | '?' type_without_static { $$ = Node\NullableType[$2]; } - | union_type_without_static { $$ = Node\UnionType[$1]; } - | intersection_type_without_static { $$ = $1; } -; - -optional_type_without_static: - /* empty */ { $$ = null; } - | type_expr_without_static { $$ = $1; } -; - -optional_return_type: - /* empty */ { $$ = null; } - | ':' type_expr { $$ = $2; } - | ':' error { $$ = null; } -; - -argument_list: - '(' ')' { $$ = array(); } - | '(' non_empty_argument_list optional_comma ')' { $$ = $2; } - | '(' variadic_placeholder ')' { init($2); } -; - -variadic_placeholder: - T_ELLIPSIS { $$ = Node\VariadicPlaceholder[]; } -; - -non_empty_argument_list: - argument { init($1); } - | non_empty_argument_list ',' argument { push($1, $3); } -; - -argument: - expr { $$ = Node\Arg[$1, false, false]; } - | ampersand variable { $$ = Node\Arg[$2, true, false]; } - | T_ELLIPSIS expr { $$ = Node\Arg[$2, false, true]; } - | identifier_maybe_reserved ':' expr - { $$ = new Node\Arg($3, false, false, attributes(), $1); } -; - -global_var_list: - non_empty_global_var_list no_comma { $$ = $1; } -; - -non_empty_global_var_list: - non_empty_global_var_list ',' global_var { push($1, $3); } - | global_var { init($1); } -; - -global_var: - simple_variable { $$ = $1; } -; - -static_var_list: - non_empty_static_var_list no_comma { $$ = $1; } -; - -non_empty_static_var_list: - non_empty_static_var_list ',' static_var { push($1, $3); } - | static_var { init($1); } -; - -static_var: - plain_variable { $$ = Stmt\StaticVar[$1, null]; } - | plain_variable '=' expr { $$ = Stmt\StaticVar[$1, $3]; } -; - -class_statement_list_ex: - class_statement_list_ex class_statement { if ($2 !== null) { push($1, $2); } } - | /* empty */ { init(); } -; - -class_statement_list: - class_statement_list_ex - { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); - if ($nop !== null) { $1[] = $nop; } $$ = $1; } -; - -class_statement: - optional_attributes variable_modifiers optional_type_without_static property_declaration_list semi - { $$ = new Stmt\Property($2, $4, attributes(), $3, $1); - $this->checkProperty($$, #2); } - | optional_attributes method_modifiers T_CONST class_const_list semi - { $$ = new Stmt\ClassConst($4, $2, attributes(), $1); - $this->checkClassConst($$, #2); } - | optional_attributes method_modifiers T_CONST type_expr class_const_list semi - { $$ = new Stmt\ClassConst($5, $2, attributes(), $1, $4); - $this->checkClassConst($$, #2); } - | optional_attributes method_modifiers T_FUNCTION optional_ref identifier_maybe_reserved '(' parameter_list ')' - optional_return_type method_body - { $$ = Stmt\ClassMethod[$5, ['type' => $2, 'byRef' => $4, 'params' => $7, 'returnType' => $9, 'stmts' => $10, 'attrGroups' => $1]]; - $this->checkClassMethod($$, #2); } - | T_USE class_name_list trait_adaptations { $$ = Stmt\TraitUse[$2, $3]; } - | optional_attributes T_CASE identifier_maybe_reserved enum_case_expr semi - { $$ = Stmt\EnumCase[$3, $4, $1]; } - | error { $$ = null; /* will be skipped */ } -; - -trait_adaptations: - ';' { $$ = array(); } - | '{' trait_adaptation_list '}' { $$ = $2; } -; - -trait_adaptation_list: - /* empty */ { init(); } - | trait_adaptation_list trait_adaptation { push($1, $2); } -; - -trait_adaptation: - trait_method_reference_fully_qualified T_INSTEADOF class_name_list ';' - { $$ = Stmt\TraitUseAdaptation\Precedence[$1[0], $1[1], $3]; } - | trait_method_reference T_AS member_modifier identifier_maybe_reserved ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, $4]; } - | trait_method_reference T_AS member_modifier ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, null]; } - | trait_method_reference T_AS identifier_not_reserved ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } - | trait_method_reference T_AS reserved_non_modifiers_identifier ';' - { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } -; - -trait_method_reference_fully_qualified: - name T_PAAMAYIM_NEKUDOTAYIM identifier_maybe_reserved { $$ = array($1, $3); } -; -trait_method_reference: - trait_method_reference_fully_qualified { $$ = $1; } - | identifier_maybe_reserved { $$ = array(null, $1); } -; - -method_body: - ';' /* abstract method */ { $$ = null; } - | block_or_error { $$ = $1; } -; - -variable_modifiers: - non_empty_member_modifiers { $$ = $1; } - | T_VAR { $$ = 0; } -; - -method_modifiers: - /* empty */ { $$ = 0; } - | non_empty_member_modifiers { $$ = $1; } -; - -non_empty_member_modifiers: - member_modifier { $$ = $1; } - | non_empty_member_modifiers member_modifier { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } -; - -member_modifier: - T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } - | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } - | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } - | T_STATIC { $$ = Stmt\Class_::MODIFIER_STATIC; } - | T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } - | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } - | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } -; - -property_declaration_list: - non_empty_property_declaration_list no_comma { $$ = $1; } -; - -non_empty_property_declaration_list: - property_declaration { init($1); } - | non_empty_property_declaration_list ',' property_declaration - { push($1, $3); } -; - -property_decl_name: - T_VARIABLE { $$ = Node\VarLikeIdentifier[parseVar($1)]; } -; - -property_declaration: - property_decl_name { $$ = Stmt\PropertyProperty[$1, null]; } - | property_decl_name '=' expr { $$ = Stmt\PropertyProperty[$1, $3]; } -; - -expr_list_forbid_comma: - non_empty_expr_list no_comma { $$ = $1; } -; - -expr_list_allow_comma: - non_empty_expr_list optional_comma { $$ = $1; } -; - -non_empty_expr_list: - non_empty_expr_list ',' expr { push($1, $3); } - | expr { init($1); } -; - -for_expr: - /* empty */ { $$ = array(); } - | expr_list_forbid_comma { $$ = $1; } -; - -expr: - variable { $$ = $1; } - | list_expr '=' expr { $$ = Expr\Assign[$1, $3]; } - | array_short_syntax '=' expr { $$ = Expr\Assign[$1, $3]; } - | variable '=' expr { $$ = Expr\Assign[$1, $3]; } - | variable '=' ampersand variable { $$ = Expr\AssignRef[$1, $4]; } - | new_expr { $$ = $1; } - | match { $$ = $1; } - | T_CLONE expr { $$ = Expr\Clone_[$2]; } - | variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1, $3]; } - | variable T_MINUS_EQUAL expr { $$ = Expr\AssignOp\Minus [$1, $3]; } - | variable T_MUL_EQUAL expr { $$ = Expr\AssignOp\Mul [$1, $3]; } - | variable T_DIV_EQUAL expr { $$ = Expr\AssignOp\Div [$1, $3]; } - | variable T_CONCAT_EQUAL expr { $$ = Expr\AssignOp\Concat [$1, $3]; } - | variable T_MOD_EQUAL expr { $$ = Expr\AssignOp\Mod [$1, $3]; } - | variable T_AND_EQUAL expr { $$ = Expr\AssignOp\BitwiseAnd[$1, $3]; } - | variable T_OR_EQUAL expr { $$ = Expr\AssignOp\BitwiseOr [$1, $3]; } - | variable T_XOR_EQUAL expr { $$ = Expr\AssignOp\BitwiseXor[$1, $3]; } - | variable T_SL_EQUAL expr { $$ = Expr\AssignOp\ShiftLeft [$1, $3]; } - | variable T_SR_EQUAL expr { $$ = Expr\AssignOp\ShiftRight[$1, $3]; } - | variable T_POW_EQUAL expr { $$ = Expr\AssignOp\Pow [$1, $3]; } - | variable T_COALESCE_EQUAL expr { $$ = Expr\AssignOp\Coalesce [$1, $3]; } - | variable T_INC { $$ = Expr\PostInc[$1]; } - | T_INC variable { $$ = Expr\PreInc [$2]; } - | variable T_DEC { $$ = Expr\PostDec[$1]; } - | T_DEC variable { $$ = Expr\PreDec [$2]; } - | expr T_BOOLEAN_OR expr { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } - | expr T_BOOLEAN_AND expr { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } - | expr T_LOGICAL_OR expr { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } - | expr T_LOGICAL_AND expr { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } - | expr T_LOGICAL_XOR expr { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } - | expr '|' expr { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } - | expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } - | expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } - | expr '^' expr { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } - | expr '.' expr { $$ = Expr\BinaryOp\Concat [$1, $3]; } - | expr '+' expr { $$ = Expr\BinaryOp\Plus [$1, $3]; } - | expr '-' expr { $$ = Expr\BinaryOp\Minus [$1, $3]; } - | expr '*' expr { $$ = Expr\BinaryOp\Mul [$1, $3]; } - | expr '/' expr { $$ = Expr\BinaryOp\Div [$1, $3]; } - | expr '%' expr { $$ = Expr\BinaryOp\Mod [$1, $3]; } - | expr T_SL expr { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } - | expr T_SR expr { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } - | expr T_POW expr { $$ = Expr\BinaryOp\Pow [$1, $3]; } - | '+' expr %prec T_INC { $$ = Expr\UnaryPlus [$2]; } - | '-' expr %prec T_INC { $$ = Expr\UnaryMinus[$2]; } - | '!' expr { $$ = Expr\BooleanNot[$2]; } - | '~' expr { $$ = Expr\BitwiseNot[$2]; } - | expr T_IS_IDENTICAL expr { $$ = Expr\BinaryOp\Identical [$1, $3]; } - | expr T_IS_NOT_IDENTICAL expr { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } - | expr T_IS_EQUAL expr { $$ = Expr\BinaryOp\Equal [$1, $3]; } - | expr T_IS_NOT_EQUAL expr { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } - | expr T_SPACESHIP expr { $$ = Expr\BinaryOp\Spaceship [$1, $3]; } - | expr '<' expr { $$ = Expr\BinaryOp\Smaller [$1, $3]; } - | expr T_IS_SMALLER_OR_EQUAL expr { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } - | expr '>' expr { $$ = Expr\BinaryOp\Greater [$1, $3]; } - | expr T_IS_GREATER_OR_EQUAL expr { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } - | expr T_INSTANCEOF class_name_reference { $$ = Expr\Instanceof_[$1, $3]; } - | '(' expr ')' { $$ = $2; } - | expr '?' expr ':' expr { $$ = Expr\Ternary[$1, $3, $5]; } - | expr '?' ':' expr { $$ = Expr\Ternary[$1, null, $4]; } - | expr T_COALESCE expr { $$ = Expr\BinaryOp\Coalesce[$1, $3]; } - | T_ISSET '(' expr_list_allow_comma ')' { $$ = Expr\Isset_[$3]; } - | T_EMPTY '(' expr ')' { $$ = Expr\Empty_[$3]; } - | T_INCLUDE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE]; } - | T_INCLUDE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE_ONCE]; } - | T_EVAL '(' expr ')' { $$ = Expr\Eval_[$3]; } - | T_REQUIRE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; } - | T_REQUIRE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; } - | T_INT_CAST expr { $$ = Expr\Cast\Int_ [$2]; } - | T_DOUBLE_CAST expr - { $attrs = attributes(); - $attrs['kind'] = $this->getFloatCastKind($1); - $$ = new Expr\Cast\Double($2, $attrs); } - | T_STRING_CAST expr { $$ = Expr\Cast\String_ [$2]; } - | T_ARRAY_CAST expr { $$ = Expr\Cast\Array_ [$2]; } - | T_OBJECT_CAST expr { $$ = Expr\Cast\Object_ [$2]; } - | T_BOOL_CAST expr { $$ = Expr\Cast\Bool_ [$2]; } - | T_UNSET_CAST expr { $$ = Expr\Cast\Unset_ [$2]; } - | T_EXIT exit_expr - { $attrs = attributes(); - $attrs['kind'] = strtolower($1) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; - $$ = new Expr\Exit_($2, $attrs); } - | '@' expr { $$ = Expr\ErrorSuppress[$2]; } - | scalar { $$ = $1; } - | '`' backticks_expr '`' { $$ = Expr\ShellExec[$2]; } - | T_PRINT expr { $$ = Expr\Print_[$2]; } - | T_YIELD { $$ = Expr\Yield_[null, null]; } - | T_YIELD expr { $$ = Expr\Yield_[$2, null]; } - | T_YIELD expr T_DOUBLE_ARROW expr { $$ = Expr\Yield_[$4, $2]; } - | T_YIELD_FROM expr { $$ = Expr\YieldFrom[$2]; } - | T_THROW expr { $$ = Expr\Throw_[$2]; } - - | T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW - { $$ = Expr\ArrowFunction[['static' => false, 'byRef' => $2, 'params' => $4, 'returnType' => $6, 'expr' => $8, 'attrGroups' => []]]; } - | T_STATIC T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW - { $$ = Expr\ArrowFunction[['static' => true, 'byRef' => $3, 'params' => $5, 'returnType' => $7, 'expr' => $9, 'attrGroups' => []]]; } - | T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error - { $$ = Expr\Closure[['static' => false, 'byRef' => $2, 'params' => $4, 'uses' => $6, 'returnType' => $7, 'stmts' => $8, 'attrGroups' => []]]; } - | T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error - { $$ = Expr\Closure[['static' => true, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => []]]; } - - | attributes T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW - { $$ = Expr\ArrowFunction[['static' => false, 'byRef' => $3, 'params' => $5, 'returnType' => $7, 'expr' => $9, 'attrGroups' => $1]]; } - | attributes T_STATIC T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW - { $$ = Expr\ArrowFunction[['static' => true, 'byRef' => $4, 'params' => $6, 'returnType' => $8, 'expr' => $10, 'attrGroups' => $1]]; } - | attributes T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error - { $$ = Expr\Closure[['static' => false, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => $1]]; } - | attributes T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error - { $$ = Expr\Closure[['static' => true, 'byRef' => $4, 'params' => $6, 'uses' => $8, 'returnType' => $9, 'stmts' => $10, 'attrGroups' => $1]]; } -; - -anonymous_class: - optional_attributes class_entry_type ctor_arguments extends_from implements_list '{' class_statement_list '}' - { $$ = array(Stmt\Class_[null, ['type' => $2, 'extends' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]], $3); - $this->checkClass($$[0], -1); } -; - -new_expr: - T_NEW class_name_reference ctor_arguments { $$ = Expr\New_[$2, $3]; } - | T_NEW anonymous_class - { list($class, $ctorArgs) = $2; $$ = Expr\New_[$class, $ctorArgs]; } -; - -lexical_vars: - /* empty */ { $$ = array(); } - | T_USE '(' lexical_var_list ')' { $$ = $3; } -; - -lexical_var_list: - non_empty_lexical_var_list optional_comma { $$ = $1; } -; - -non_empty_lexical_var_list: - lexical_var { init($1); } - | non_empty_lexical_var_list ',' lexical_var { push($1, $3); } -; - -lexical_var: - optional_ref plain_variable { $$ = Expr\ClosureUse[$2, $1]; } -; - -name_readonly: - T_READONLY { $$ = Name[$1]; } -; - -function_call: - name argument_list { $$ = Expr\FuncCall[$1, $2]; } - | name_readonly argument_list { $$ = Expr\FuncCall[$1, $2]; } - | callable_expr argument_list { $$ = Expr\FuncCall[$1, $2]; } - | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM member_name argument_list - { $$ = Expr\StaticCall[$1, $3, $4]; } -; - -class_name: - T_STATIC { $$ = Name[$1]; } - | name { $$ = $1; } -; - -name: - T_STRING { $$ = Name[$1]; } - | T_NAME_QUALIFIED { $$ = Name[$1]; } - | T_NAME_FULLY_QUALIFIED { $$ = Name\FullyQualified[substr($1, 1)]; } - | T_NAME_RELATIVE { $$ = Name\Relative[substr($1, 10)]; } -; - -class_name_reference: - class_name { $$ = $1; } - | new_variable { $$ = $1; } - | '(' expr ')' { $$ = $2; } - | error { $$ = Expr\Error[]; $this->errorState = 2; } -; - -class_name_or_var: - class_name { $$ = $1; } - | fully_dereferencable { $$ = $1; } -; - -exit_expr: - /* empty */ { $$ = null; } - | '(' optional_expr ')' { $$ = $2; } -; - -backticks_expr: - /* empty */ { $$ = array(); } - | T_ENCAPSED_AND_WHITESPACE - { $$ = array(Scalar\EncapsedStringPart[Scalar\String_::parseEscapeSequences($1, '`')]); } - | encaps_list { parseEncapsed($1, '`', true); $$ = $1; } -; - -ctor_arguments: - /* empty */ { $$ = array(); } - | argument_list { $$ = $1; } -; - -constant: - name { $$ = Expr\ConstFetch[$1]; } - | T_LINE { $$ = Scalar\MagicConst\Line[]; } - | T_FILE { $$ = Scalar\MagicConst\File[]; } - | T_DIR { $$ = Scalar\MagicConst\Dir[]; } - | T_CLASS_C { $$ = Scalar\MagicConst\Class_[]; } - | T_TRAIT_C { $$ = Scalar\MagicConst\Trait_[]; } - | T_METHOD_C { $$ = Scalar\MagicConst\Method[]; } - | T_FUNC_C { $$ = Scalar\MagicConst\Function_[]; } - | T_NS_C { $$ = Scalar\MagicConst\Namespace_[]; } -; - -class_constant: - class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_maybe_reserved - { $$ = Expr\ClassConstFetch[$1, $3]; } - | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '{' expr '}' - { $$ = Expr\ClassConstFetch[$1, $4]; } - /* We interpret an isolated FOO:: as an unfinished class constant fetch. It could also be - an unfinished static property fetch or unfinished scoped call. */ - | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM error - { $$ = Expr\ClassConstFetch[$1, new Expr\Error(stackAttributes(#3))]; $this->errorState = 2; } -; - -array_short_syntax: - '[' array_pair_list ']' - { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_SHORT; - $$ = new Expr\Array_($2, $attrs); } -; - -dereferencable_scalar: - T_ARRAY '(' array_pair_list ')' - { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG; - $$ = new Expr\Array_($3, $attrs); } - | array_short_syntax { $$ = $1; } - | T_CONSTANT_ENCAPSED_STRING { $$ = Scalar\String_::fromString($1, attributes()); } - | '"' encaps_list '"' - { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); } -; - -scalar: - T_LNUMBER { $$ = $this->parseLNumber($1, attributes()); } - | T_DNUMBER { $$ = Scalar\DNumber::fromString($1, attributes()); } - | dereferencable_scalar { $$ = $1; } - | constant { $$ = $1; } - | class_constant { $$ = $1; } - | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC - { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } - | T_START_HEREDOC T_END_HEREDOC - { $$ = $this->parseDocString($1, '', $2, attributes(), stackAttributes(#2), true); } - | T_START_HEREDOC encaps_list T_END_HEREDOC - { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } -; - -optional_expr: - /* empty */ { $$ = null; } - | expr { $$ = $1; } -; - -fully_dereferencable: - variable { $$ = $1; } - | '(' expr ')' { $$ = $2; } - | dereferencable_scalar { $$ = $1; } - | class_constant { $$ = $1; } -; - -array_object_dereferencable: - fully_dereferencable { $$ = $1; } - | constant { $$ = $1; } -; - -callable_expr: - callable_variable { $$ = $1; } - | '(' expr ')' { $$ = $2; } - | dereferencable_scalar { $$ = $1; } -; - -callable_variable: - simple_variable { $$ = $1; } - | array_object_dereferencable '[' optional_expr ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | array_object_dereferencable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | function_call { $$ = $1; } - | array_object_dereferencable T_OBJECT_OPERATOR property_name argument_list - { $$ = Expr\MethodCall[$1, $3, $4]; } - | array_object_dereferencable T_NULLSAFE_OBJECT_OPERATOR property_name argument_list - { $$ = Expr\NullsafeMethodCall[$1, $3, $4]; } -; - -optional_plain_variable: - /* empty */ { $$ = null; } - | plain_variable { $$ = $1; } -; - -variable: - callable_variable { $$ = $1; } - | static_member { $$ = $1; } - | array_object_dereferencable T_OBJECT_OPERATOR property_name - { $$ = Expr\PropertyFetch[$1, $3]; } - | array_object_dereferencable T_NULLSAFE_OBJECT_OPERATOR property_name - { $$ = Expr\NullsafePropertyFetch[$1, $3]; } -; - -simple_variable: - plain_variable { $$ = $1; } - | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } - | '$' simple_variable { $$ = Expr\Variable[$2]; } - | '$' error { $$ = Expr\Variable[Expr\Error[]]; $this->errorState = 2; } -; - -static_member_prop_name: - simple_variable - { $var = $1->name; $$ = \is_string($var) ? Node\VarLikeIdentifier[$var] : $var; } -; - -static_member: - class_name_or_var T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name - { $$ = Expr\StaticPropertyFetch[$1, $3]; } -; - -new_variable: - simple_variable { $$ = $1; } - | new_variable '[' optional_expr ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | new_variable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | new_variable T_OBJECT_OPERATOR property_name { $$ = Expr\PropertyFetch[$1, $3]; } - | new_variable T_NULLSAFE_OBJECT_OPERATOR property_name { $$ = Expr\NullsafePropertyFetch[$1, $3]; } - | class_name T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name - { $$ = Expr\StaticPropertyFetch[$1, $3]; } - | new_variable T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name - { $$ = Expr\StaticPropertyFetch[$1, $3]; } -; - -member_name: - identifier_maybe_reserved { $$ = $1; } - | '{' expr '}' { $$ = $2; } - | simple_variable { $$ = $1; } -; - -property_name: - identifier_not_reserved { $$ = $1; } - | '{' expr '}' { $$ = $2; } - | simple_variable { $$ = $1; } - | error { $$ = Expr\Error[]; $this->errorState = 2; } -; - -list_expr: - T_LIST '(' inner_array_pair_list ')' { $$ = Expr\List_[$3]; } -; - -array_pair_list: - inner_array_pair_list - { $$ = $1; $end = count($$)-1; if ($$[$end] === null) array_pop($$); } -; - -comma_or_error: - ',' - | error - { /* do nothing -- prevent default action of $$=$1. See #551. */ } -; - -inner_array_pair_list: - inner_array_pair_list comma_or_error array_pair { push($1, $3); } - | array_pair { init($1); } -; - -array_pair: - expr { $$ = Expr\ArrayItem[$1, null, false]; } - | ampersand variable { $$ = Expr\ArrayItem[$2, null, true]; } - | list_expr { $$ = Expr\ArrayItem[$1, null, false]; } - | expr T_DOUBLE_ARROW expr { $$ = Expr\ArrayItem[$3, $1, false]; } - | expr T_DOUBLE_ARROW ampersand variable { $$ = Expr\ArrayItem[$4, $1, true]; } - | expr T_DOUBLE_ARROW list_expr { $$ = Expr\ArrayItem[$3, $1, false]; } - | T_ELLIPSIS expr { $$ = new Expr\ArrayItem($2, null, false, attributes(), true); } - | /* empty */ { $$ = null; } -; - -encaps_list: - encaps_list encaps_var { push($1, $2); } - | encaps_list encaps_string_part { push($1, $2); } - | encaps_var { init($1); } - | encaps_string_part encaps_var { init($1, $2); } -; - -encaps_string_part: - T_ENCAPSED_AND_WHITESPACE { $$ = Scalar\EncapsedStringPart[$1]; } -; - -encaps_str_varname: - T_STRING_VARNAME { $$ = Expr\Variable[$1]; } -; - -encaps_var: - plain_variable { $$ = $1; } - | plain_variable '[' encaps_var_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | plain_variable T_OBJECT_OPERATOR identifier_not_reserved - { $$ = Expr\PropertyFetch[$1, $3]; } - | plain_variable T_NULLSAFE_OBJECT_OPERATOR identifier_not_reserved - { $$ = Expr\NullsafePropertyFetch[$1, $3]; } - | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { $$ = Expr\Variable[$2]; } - | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' { $$ = Expr\Variable[$2]; } - | T_DOLLAR_OPEN_CURLY_BRACES encaps_str_varname '[' expr ']' '}' - { $$ = Expr\ArrayDimFetch[$2, $4]; } - | T_CURLY_OPEN variable '}' { $$ = $2; } -; - -encaps_var_offset: - T_STRING { $$ = Scalar\String_[$1]; } - | T_NUM_STRING { $$ = $this->parseNumString($1, attributes()); } - | '-' T_NUM_STRING { $$ = $this->parseNumString('-' . $2, attributes()); } - | plain_variable { $$ = $1; } -; - -%% diff --git a/Sources/vendor/nikic/php-parser/grammar/phpyLang.php b/Sources/vendor/nikic/php-parser/grammar/phpyLang.php deleted file mode 100644 index 663c2a14..00000000 --- a/Sources/vendor/nikic/php-parser/grammar/phpyLang.php +++ /dev/null @@ -1,184 +0,0 @@ -\'[^\\\\\']*+(?:\\\\.[^\\\\\']*+)*+\') - (?"[^\\\\"]*+(?:\\\\.[^\\\\"]*+)*+") - (?(?&singleQuotedString)|(?&doubleQuotedString)) - (?/\*[^*]*+(?:\*(?!/)[^*]*+)*+\*/) - (?\{[^\'"/{}]*+(?:(?:(?&string)|(?&comment)|(?&code)|/)[^\'"/{}]*+)*+}) -)'; - -const PARAMS = '\[(?[^[\]]*+(?:\[(?¶ms)\][^[\]]*+)*+)\]'; -const ARGS = '\((?[^()]*+(?:\((?&args)\)[^()]*+)*+)\)'; - -/////////////////////////////// -/// Preprocessing functions /// -/////////////////////////////// - -function preprocessGrammar($code) { - $code = resolveNodes($code); - $code = resolveMacros($code); - $code = resolveStackAccess($code); - - return $code; -} - -function resolveNodes($code) { - return preg_replace_callback( - '~\b(?[A-Z][a-zA-Z_\\\\]++)\s*' . PARAMS . '~', - function($matches) { - // recurse - $matches['params'] = resolveNodes($matches['params']); - - $params = magicSplit( - '(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,', - $matches['params'] - ); - - $paramCode = ''; - foreach ($params as $param) { - $paramCode .= $param . ', '; - } - - return 'new ' . $matches['name'] . '(' . $paramCode . 'attributes())'; - }, - $code - ); -} - -function resolveMacros($code) { - return preg_replace_callback( - '~\b(?)(?!array\()(?[a-z][A-Za-z]++)' . ARGS . '~', - function($matches) { - // recurse - $matches['args'] = resolveMacros($matches['args']); - - $name = $matches['name']; - $args = magicSplit( - '(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,', - $matches['args'] - ); - - if ('attributes' === $name) { - assertArgs(0, $args, $name); - return '$this->startAttributeStack[#1] + $this->endAttributes'; - } - - if ('stackAttributes' === $name) { - assertArgs(1, $args, $name); - return '$this->startAttributeStack[' . $args[0] . ']' - . ' + $this->endAttributeStack[' . $args[0] . ']'; - } - - if ('init' === $name) { - return '$$ = array(' . implode(', ', $args) . ')'; - } - - if ('push' === $name) { - assertArgs(2, $args, $name); - - return $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0]; - } - - if ('pushNormalizing' === $name) { - assertArgs(2, $args, $name); - - return 'if (is_array(' . $args[1] . ')) { $$ = array_merge(' . $args[0] . ', ' . $args[1] . '); }' - . ' else { ' . $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0] . '; }'; - } - - if ('toArray' == $name) { - assertArgs(1, $args, $name); - - return 'is_array(' . $args[0] . ') ? ' . $args[0] . ' : array(' . $args[0] . ')'; - } - - if ('parseVar' === $name) { - assertArgs(1, $args, $name); - - return 'substr(' . $args[0] . ', 1)'; - } - - if ('parseEncapsed' === $name) { - assertArgs(3, $args, $name); - - return 'foreach (' . $args[0] . ' as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) {' - . ' $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, ' . $args[1] . ', ' . $args[2] . '); } }'; - } - - if ('makeNop' === $name) { - assertArgs(3, $args, $name); - - return '$startAttributes = ' . $args[1] . ';' - . ' if (isset($startAttributes[\'comments\']))' - . ' { ' . $args[0] . ' = new Stmt\Nop($startAttributes + ' . $args[2] . '); }' - . ' else { ' . $args[0] . ' = null; }'; - } - - if ('makeZeroLengthNop' == $name) { - assertArgs(2, $args, $name); - - return '$startAttributes = ' . $args[1] . ';' - . ' if (isset($startAttributes[\'comments\']))' - . ' { ' . $args[0] . ' = new Stmt\Nop($this->createCommentNopAttributes($startAttributes[\'comments\'])); }' - . ' else { ' . $args[0] . ' = null; }'; - } - - if ('prependLeadingComments' === $name) { - assertArgs(1, $args, $name); - - return '$attrs = $this->startAttributeStack[#1]; $stmts = ' . $args[0] . '; ' - . 'if (!empty($attrs[\'comments\'])) {' - . '$stmts[0]->setAttribute(\'comments\', ' - . 'array_merge($attrs[\'comments\'], $stmts[0]->getAttribute(\'comments\', []))); }'; - } - - return $matches[0]; - }, - $code - ); -} - -function assertArgs($num, $args, $name) { - if ($num != count($args)) { - die('Wrong argument count for ' . $name . '().'); - } -} - -function resolveStackAccess($code) { - $code = preg_replace('/\$\d+/', '$this->semStack[$0]', $code); - $code = preg_replace('/#(\d+)/', '$$1', $code); - return $code; -} - -function removeTrailingWhitespace($code) { - $lines = explode("\n", $code); - $lines = array_map('rtrim', $lines); - return implode("\n", $lines); -} - -////////////////////////////// -/// Regex helper functions /// -////////////////////////////// - -function regex($regex) { - return '~' . LIB . '(?:' . str_replace('~', '\~', $regex) . ')~'; -} - -function magicSplit($regex, $string) { - $pieces = preg_split(regex('(?:(?&string)|(?&comment)|(?&code))(*SKIP)(*FAIL)|' . $regex), $string); - - foreach ($pieces as &$piece) { - $piece = trim($piece); - } - - if ($pieces === ['']) { - return []; - } - - return $pieces; -} diff --git a/Sources/vendor/nikic/php-parser/grammar/rebuildParsers.php b/Sources/vendor/nikic/php-parser/grammar/rebuildParsers.php deleted file mode 100644 index 2d0c6b14..00000000 --- a/Sources/vendor/nikic/php-parser/grammar/rebuildParsers.php +++ /dev/null @@ -1,81 +0,0 @@ - 'Php5', - __DIR__ . '/php7.y' => 'Php7', -]; - -$tokensFile = __DIR__ . '/tokens.y'; -$tokensTemplate = __DIR__ . '/tokens.template'; -$skeletonFile = __DIR__ . '/parser.template'; -$tmpGrammarFile = __DIR__ . '/tmp_parser.phpy'; -$tmpResultFile = __DIR__ . '/tmp_parser.php'; -$resultDir = __DIR__ . '/../lib/PhpParser/Parser'; -$tokensResultsFile = $resultDir . '/Tokens.php'; - -$kmyacc = getenv('KMYACC'); -if (!$kmyacc) { - // Use phpyacc from dev dependencies by default. - $kmyacc = __DIR__ . '/../vendor/bin/phpyacc'; -} - -$options = array_flip($argv); -$optionDebug = isset($options['--debug']); -$optionKeepTmpGrammar = isset($options['--keep-tmp-grammar']); - -/////////////////// -/// Main script /// -/////////////////// - -$tokens = file_get_contents($tokensFile); - -foreach ($grammarFileToName as $grammarFile => $name) { - echo "Building temporary $name grammar file.\n"; - - $grammarCode = file_get_contents($grammarFile); - $grammarCode = str_replace('%tokens', $tokens, $grammarCode); - $grammarCode = preprocessGrammar($grammarCode); - - file_put_contents($tmpGrammarFile, $grammarCode); - - $additionalArgs = $optionDebug ? '-t -v' : ''; - - echo "Building $name parser.\n"; - $output = execCmd("$kmyacc $additionalArgs -m $skeletonFile -p $name $tmpGrammarFile"); - - $resultCode = file_get_contents($tmpResultFile); - $resultCode = removeTrailingWhitespace($resultCode); - - ensureDirExists($resultDir); - file_put_contents("$resultDir/$name.php", $resultCode); - unlink($tmpResultFile); - - echo "Building token definition.\n"; - $output = execCmd("$kmyacc -m $tokensTemplate $tmpGrammarFile"); - rename($tmpResultFile, $tokensResultsFile); - - if (!$optionKeepTmpGrammar) { - unlink($tmpGrammarFile); - } -} - -//////////////////////////////// -/// Utility helper functions /// -//////////////////////////////// - -function ensureDirExists($dir) { - if (!is_dir($dir)) { - mkdir($dir, 0777, true); - } -} - -function execCmd($cmd) { - $output = trim(shell_exec("$cmd 2>&1")); - if ($output !== "") { - echo "> " . $cmd . "\n"; - echo $output; - } - return $output; -} diff --git a/Sources/vendor/nikic/php-parser/grammar/tokens.template b/Sources/vendor/nikic/php-parser/grammar/tokens.template deleted file mode 100644 index ba4e4901..00000000 --- a/Sources/vendor/nikic/php-parser/grammar/tokens.template +++ /dev/null @@ -1,17 +0,0 @@ -semValue -#semval($,%t) $this->semValue -#semval(%n) $this->stackPos-(%l-%n) -#semval(%n,%t) $this->stackPos-(%l-%n) - -namespace PhpParser\Parser; -#include; - -/* GENERATED file based on grammar/tokens.y */ -final class Tokens -{ -#tokenval - const %s = %n; -#endtokenval -} diff --git a/Sources/vendor/nikic/php-parser/grammar/tokens.y b/Sources/vendor/nikic/php-parser/grammar/tokens.y deleted file mode 100644 index 8f0b2172..00000000 --- a/Sources/vendor/nikic/php-parser/grammar/tokens.y +++ /dev/null @@ -1,115 +0,0 @@ -/* We currently rely on the token ID mapping to be the same between PHP 5 and PHP 7 - so the same lexer can be used for - * both. This is enforced by sharing this token file. */ - -%right T_THROW -%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE -%left ',' -%left T_LOGICAL_OR -%left T_LOGICAL_XOR -%left T_LOGICAL_AND -%right T_PRINT -%right T_YIELD -%right T_DOUBLE_ARROW -%right T_YIELD_FROM -%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL -%left '?' ':' -%right T_COALESCE -%left T_BOOLEAN_OR -%left T_BOOLEAN_AND -%left '|' -%left '^' -%left T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG -%nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL T_SPACESHIP -%nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL -%left T_SL T_SR -%left '+' '-' '.' -%left '*' '/' '%' -%right '!' -%nonassoc T_INSTANCEOF -%right '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@' -%right T_POW -%right '[' -%nonassoc T_NEW T_CLONE -%token T_EXIT -%token T_IF -%left T_ELSEIF -%left T_ELSE -%left T_ENDIF -%token T_LNUMBER -%token T_DNUMBER -%token T_STRING -%token T_STRING_VARNAME -%token T_VARIABLE -%token T_NUM_STRING -%token T_INLINE_HTML -%token T_ENCAPSED_AND_WHITESPACE -%token T_CONSTANT_ENCAPSED_STRING -%token T_ECHO -%token T_DO -%token T_WHILE -%token T_ENDWHILE -%token T_FOR -%token T_ENDFOR -%token T_FOREACH -%token T_ENDFOREACH -%token T_DECLARE -%token T_ENDDECLARE -%token T_AS -%token T_SWITCH -%token T_MATCH -%token T_ENDSWITCH -%token T_CASE -%token T_DEFAULT -%token T_BREAK -%token T_CONTINUE -%token T_GOTO -%token T_FUNCTION -%token T_FN -%token T_CONST -%token T_RETURN -%token T_TRY -%token T_CATCH -%token T_FINALLY -%token T_THROW -%token T_USE -%token T_INSTEADOF -%token T_GLOBAL -%right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC T_READONLY -%token T_VAR -%token T_UNSET -%token T_ISSET -%token T_EMPTY -%token T_HALT_COMPILER -%token T_CLASS -%token T_TRAIT -%token T_INTERFACE -%token T_ENUM -%token T_EXTENDS -%token T_IMPLEMENTS -%token T_OBJECT_OPERATOR -%token T_NULLSAFE_OBJECT_OPERATOR -%token T_DOUBLE_ARROW -%token T_LIST -%token T_ARRAY -%token T_CALLABLE -%token T_CLASS_C -%token T_TRAIT_C -%token T_METHOD_C -%token T_FUNC_C -%token T_LINE -%token T_FILE -%token T_START_HEREDOC -%token T_END_HEREDOC -%token T_DOLLAR_OPEN_CURLY_BRACES -%token T_CURLY_OPEN -%token T_PAAMAYIM_NEKUDOTAYIM -%token T_NAMESPACE -%token T_NS_C -%token T_DIR -%token T_NS_SEPARATOR -%token T_ELLIPSIS -%token T_NAME_FULLY_QUALIFIED -%token T_NAME_QUALIFIED -%token T_NAME_RELATIVE -%token T_ATTRIBUTE -%token T_ENUM diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder.php index 26d8921e..d6aa124c 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder.php @@ -2,12 +2,11 @@ namespace PhpParser; -interface Builder -{ +interface Builder { /** * Returns the built node. * * @return Node The built node */ - public function getNode() : Node; + public function getNode(): Node; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php index a7fe129b..fa5dc10e 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php @@ -6,26 +6,28 @@ namespace PhpParser\Builder; use PhpParser; use PhpParser\BuilderHelpers; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\Const_; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt; -class ClassConst implements PhpParser\Builder -{ - protected $flags = 0; - protected $attributes = []; - protected $constants = []; +class ClassConst implements PhpParser\Builder { + protected int $flags = 0; + /** @var array */ + protected array $attributes = []; + /** @var list */ + protected array $constants = []; - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; - /** @var Identifier|Node\Name|Node\ComplexType */ - protected $type; + /** @var list */ + protected array $attributeGroups = []; + /** @var Identifier|Node\Name|Node\ComplexType|null */ + protected ?Node $type = null; /** * Creates a class constant builder * - * @param string|Identifier $name Name + * @param string|Identifier $name Name * @param Node\Expr|bool|null|int|float|string|array $value Value */ public function __construct($name, $value) { @@ -35,7 +37,7 @@ class ClassConst implements PhpParser\Builder /** * Add another constant to const group * - * @param string|Identifier $name Name + * @param string|Identifier $name Name * @param Node\Expr|bool|null|int|float|string|array $value Value * * @return $this The builder instance (for fluid interface) @@ -52,7 +54,7 @@ class ClassConst implements PhpParser\Builder * @return $this The builder instance (for fluid interface) */ public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC); return $this; } @@ -63,7 +65,7 @@ class ClassConst implements PhpParser\Builder * @return $this The builder instance (for fluid interface) */ public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED); return $this; } @@ -74,7 +76,7 @@ class ClassConst implements PhpParser\Builder * @return $this The builder instance (for fluid interface) */ public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE); return $this; } @@ -85,7 +87,7 @@ class ClassConst implements PhpParser\Builder * @return $this The builder instance (for fluid interface) */ public function makeFinal() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::FINAL); return $this; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php index 35b54d04..6f394315 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php @@ -4,25 +4,27 @@ namespace PhpParser\Builder; use PhpParser; use PhpParser\BuilderHelpers; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\Name; use PhpParser\Node\Stmt; -class Class_ extends Declaration -{ - protected $name; - - protected $extends = null; - protected $implements = []; - protected $flags = 0; - - protected $uses = []; - protected $constants = []; - protected $properties = []; - protected $methods = []; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; +class Class_ extends Declaration { + protected string $name; + protected ?Name $extends = null; + /** @var list */ + protected array $implements = []; + protected int $flags = 0; + /** @var list */ + protected array $uses = []; + /** @var list */ + protected array $constants = []; + /** @var list */ + protected array $properties = []; + /** @var list */ + protected array $methods = []; + /** @var list */ + protected array $attributeGroups = []; /** * Creates a class builder. @@ -67,7 +69,7 @@ class Class_ extends Declaration * @return $this The builder instance (for fluid interface) */ public function makeAbstract() { - $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); + $this->flags = BuilderHelpers::addClassModifier($this->flags, Modifiers::ABSTRACT); return $this; } @@ -78,13 +80,18 @@ class Class_ extends Declaration * @return $this The builder instance (for fluid interface) */ public function makeFinal() { - $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); + $this->flags = BuilderHelpers::addClassModifier($this->flags, Modifiers::FINAL); return $this; } + /** + * Makes the class readonly. + * + * @return $this The builder instance (for fluid interface) + */ public function makeReadonly() { - $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); + $this->flags = BuilderHelpers::addClassModifier($this->flags, Modifiers::READONLY); return $this; } @@ -99,20 +106,18 @@ class Class_ extends Declaration public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); - $targets = [ - Stmt\TraitUse::class => &$this->uses, - Stmt\ClassConst::class => &$this->constants, - Stmt\Property::class => &$this->properties, - Stmt\ClassMethod::class => &$this->methods, - ]; - - $class = \get_class($stmt); - if (!isset($targets[$class])) { + if ($stmt instanceof Stmt\Property) { + $this->properties[] = $stmt; + } elseif ($stmt instanceof Stmt\ClassMethod) { + $this->methods[] = $stmt; + } elseif ($stmt instanceof Stmt\TraitUse) { + $this->uses[] = $stmt; + } elseif ($stmt instanceof Stmt\ClassConst) { + $this->constants[] = $stmt; + } else { throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); } - $targets[$class][] = $stmt; - return $this; } @@ -134,7 +139,7 @@ class Class_ extends Declaration * * @return Stmt\Class_ The built class node */ - public function getNode() : PhpParser\Node { + public function getNode(): PhpParser\Node { return new Stmt\Class_($this->name, [ 'flags' => $this->flags, 'extends' => $this->extends, diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php index 83094992..488b7213 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php @@ -5,16 +5,23 @@ namespace PhpParser\Builder; use PhpParser; use PhpParser\BuilderHelpers; -abstract class Declaration implements PhpParser\Builder -{ - protected $attributes = []; +abstract class Declaration implements PhpParser\Builder { + /** @var array */ + protected array $attributes = []; + /** + * Adds a statement. + * + * @param PhpParser\Node\Stmt|PhpParser\Builder $stmt The statement to add + * + * @return $this The builder instance (for fluid interface) + */ abstract public function addStmt($stmt); /** * Adds multiple statements. * - * @param array $stmts The statements to add + * @param (PhpParser\Node\Stmt|PhpParser\Builder)[] $stmts The statements to add * * @return $this The builder instance (for fluid interface) */ diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php index accc5166..04058bf5 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php @@ -10,19 +10,21 @@ use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt; -class EnumCase implements PhpParser\Builder -{ +class EnumCase implements PhpParser\Builder { + /** @var Identifier|string */ protected $name; - protected $value = null; - protected $attributes = []; + /** @var ?Node\Expr */ + protected ?Node\Expr $value = null; + /** @var array */ + protected array $attributes = []; - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; + /** @var list */ + protected array $attributeGroups = []; /** * Creates an enum case builder. * - * @param string|Identifier $name Name + * @param string|Identifier $name Name */ public function __construct($name) { $this->name = $name; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php index be7eef95..c00df03f 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php @@ -9,20 +9,21 @@ use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Stmt; -class Enum_ extends Declaration -{ - protected $name; - protected $scalarType = null; - - protected $implements = []; - - protected $uses = []; - protected $enumCases = []; - protected $constants = []; - protected $methods = []; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; +class Enum_ extends Declaration { + protected string $name; + protected ?Identifier $scalarType = null; + /** @var list */ + protected array $implements = []; + /** @var list */ + protected array $uses = []; + /** @var list */ + protected array $enumCases = []; + /** @var list */ + protected array $constants = []; + /** @var list */ + protected array $methods = []; + /** @var list */ + protected array $attributeGroups = []; /** * Creates an enum builder. @@ -36,7 +37,7 @@ class Enum_ extends Declaration /** * Sets the scalar type. * - * @param string|Identifier $type + * @param string|Identifier $scalarType * * @return $this */ @@ -71,20 +72,18 @@ class Enum_ extends Declaration public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); - $targets = [ - Stmt\TraitUse::class => &$this->uses, - Stmt\EnumCase::class => &$this->enumCases, - Stmt\ClassConst::class => &$this->constants, - Stmt\ClassMethod::class => &$this->methods, - ]; - - $class = \get_class($stmt); - if (!isset($targets[$class])) { + if ($stmt instanceof Stmt\EnumCase) { + $this->enumCases[] = $stmt; + } elseif ($stmt instanceof Stmt\ClassMethod) { + $this->methods[] = $stmt; + } elseif ($stmt instanceof Stmt\TraitUse) { + $this->uses[] = $stmt; + } elseif ($stmt instanceof Stmt\ClassConst) { + $this->constants[] = $stmt; + } else { throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); } - $targets[$class][] = $stmt; - return $this; } @@ -106,7 +105,7 @@ class Enum_ extends Declaration * * @return Stmt\Enum_ The built enum node */ - public function getNode() : PhpParser\Node { + public function getNode(): PhpParser\Node { return new Stmt\Enum_($this->name, [ 'scalarType' => $this->scalarType, 'implements' => $this->implements, diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php index 98ea9d33..ff79cb6b 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php @@ -5,13 +5,13 @@ namespace PhpParser\Builder; use PhpParser\BuilderHelpers; use PhpParser\Node; -abstract class FunctionLike extends Declaration -{ - protected $returnByRef = false; - protected $params = []; +abstract class FunctionLike extends Declaration { + protected bool $returnByRef = false; + /** @var Node\Param[] */ + protected array $params = []; - /** @var string|Node\Name|Node\NullableType|null */ - protected $returnType = null; + /** @var Node\Identifier|Node\Name|Node\ComplexType|null */ + protected ?Node $returnType = null; /** * Make the function return by reference. @@ -46,7 +46,7 @@ abstract class FunctionLike extends Declaration /** * Adds multiple parameters. * - * @param array $params The parameters to add + * @param (Node\Param|Param)[] $params The parameters to add * * @return $this The builder instance (for fluid interface) */ diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php index 1cd73c0d..48f5f693 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php @@ -7,13 +7,13 @@ use PhpParser\BuilderHelpers; use PhpParser\Node; use PhpParser\Node\Stmt; -class Function_ extends FunctionLike -{ - protected $name; - protected $stmts = []; +class Function_ extends FunctionLike { + protected string $name; + /** @var list */ + protected array $stmts = []; - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; + /** @var list */ + protected array $attributeGroups = []; /** * Creates a function builder. @@ -55,7 +55,7 @@ class Function_ extends FunctionLike * * @return Stmt\Function_ The built function node */ - public function getNode() : Node { + public function getNode(): Node { return new Stmt\Function_($this->name, [ 'byRef' => $this->returnByRef, 'params' => $this->params, diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php index 7806e85f..13dd3f7f 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php @@ -8,15 +8,16 @@ use PhpParser\Node; use PhpParser\Node\Name; use PhpParser\Node\Stmt; -class Interface_ extends Declaration -{ - protected $name; - protected $extends = []; - protected $constants = []; - protected $methods = []; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; +class Interface_ extends Declaration { + protected string $name; + /** @var list */ + protected array $extends = []; + /** @var list */ + protected array $constants = []; + /** @var list */ + protected array $methods = []; + /** @var list */ + protected array $attributeGroups = []; /** * Creates an interface builder. @@ -83,7 +84,7 @@ class Interface_ extends Declaration * * @return Stmt\Interface_ The built interface node */ - public function getNode() : PhpParser\Node { + public function getNode(): PhpParser\Node { return new Stmt\Interface_($this->name, [ 'extends' => $this->extends, 'stmts' => array_merge($this->constants, $this->methods), diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php index 232d7cb8..8358dbe3 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php @@ -4,19 +4,20 @@ namespace PhpParser\Builder; use PhpParser; use PhpParser\BuilderHelpers; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\Stmt; -class Method extends FunctionLike -{ - protected $name; - protected $flags = 0; +class Method extends FunctionLike { + protected string $name; - /** @var array|null */ - protected $stmts = []; + protected int $flags = 0; - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; + /** @var list|null */ + protected ?array $stmts = []; + + /** @var list */ + protected array $attributeGroups = []; /** * Creates a method builder. @@ -33,7 +34,7 @@ class Method extends FunctionLike * @return $this The builder instance (for fluid interface) */ public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC); return $this; } @@ -44,7 +45,7 @@ class Method extends FunctionLike * @return $this The builder instance (for fluid interface) */ public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED); return $this; } @@ -55,7 +56,7 @@ class Method extends FunctionLike * @return $this The builder instance (for fluid interface) */ public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE); return $this; } @@ -66,7 +67,7 @@ class Method extends FunctionLike * @return $this The builder instance (for fluid interface) */ public function makeStatic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::STATIC); return $this; } @@ -81,7 +82,7 @@ class Method extends FunctionLike throw new \LogicException('Cannot make method with statements abstract'); } - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::ABSTRACT); $this->stmts = null; // abstract methods don't have statements return $this; @@ -93,7 +94,7 @@ class Method extends FunctionLike * @return $this The builder instance (for fluid interface) */ public function makeFinal() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::FINAL); return $this; } @@ -133,7 +134,7 @@ class Method extends FunctionLike * * @return Stmt\ClassMethod The built method node */ - public function getNode() : Node { + public function getNode(): Node { return new Stmt\ClassMethod($this->name, [ 'flags' => $this->flags, 'byRef' => $this->returnByRef, diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php index 1c751e16..80fe6f84 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php @@ -7,10 +7,10 @@ use PhpParser\BuilderHelpers; use PhpParser\Node; use PhpParser\Node\Stmt; -class Namespace_ extends Declaration -{ - private $name; - private $stmts = []; +class Namespace_ extends Declaration { + private ?Node\Name $name; + /** @var Stmt[] */ + private array $stmts = []; /** * Creates a namespace builder. @@ -39,7 +39,7 @@ class Namespace_ extends Declaration * * @return Stmt\Namespace_ The built node */ - public function getNode() : Node { + public function getNode(): Node { return new Stmt\Namespace_($this->name, $this->stmts, $this->attributes); } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php index 69f35332..f439e876 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php @@ -4,25 +4,19 @@ namespace PhpParser\Builder; use PhpParser; use PhpParser\BuilderHelpers; +use PhpParser\Modifiers; use PhpParser\Node; -class Param implements PhpParser\Builder -{ - protected $name; - - protected $default = null; - - /** @var Node\Identifier|Node\Name|Node\NullableType|null */ - protected $type = null; - - protected $byRef = false; - - protected $variadic = false; - - protected $flags = 0; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; +class Param implements PhpParser\Builder { + protected string $name; + protected ?Node\Expr $default = null; + /** @var Node\Identifier|Node\Name|Node\ComplexType|null */ + protected ?Node $type = null; + protected bool $byRef = false; + protected int $flags = 0; + protected bool $variadic = false; + /** @var list */ + protected array $attributeGroups = []; /** * Creates a parameter builder. @@ -62,19 +56,6 @@ class Param implements PhpParser\Builder return $this; } - /** - * Sets type for the parameter. - * - * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type - * - * @return $this The builder instance (for fluid interface) - * - * @deprecated Use setType() instead - */ - public function setTypeHint($type) { - return $this->setType($type); - } - /** * Make the parameter accept the value by reference. * @@ -103,7 +84,7 @@ class Param implements PhpParser\Builder * @return $this The builder instance (for fluid interface) */ public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PUBLIC); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC); return $this; } @@ -114,7 +95,7 @@ class Param implements PhpParser\Builder * @return $this The builder instance (for fluid interface) */ public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PROTECTED); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED); return $this; } @@ -125,7 +106,7 @@ class Param implements PhpParser\Builder * @return $this The builder instance (for fluid interface) */ public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PRIVATE); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE); return $this; } @@ -136,7 +117,7 @@ class Param implements PhpParser\Builder * @return $this The builder instance (for fluid interface) */ public function makeReadonly() { - $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_READONLY); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::READONLY); return $this; } @@ -159,7 +140,7 @@ class Param implements PhpParser\Builder * * @return Node\Param The built parameter node */ - public function getNode() : Node { + public function getNode(): Node { return new Node\Param( new Node\Expr\Variable($this->name), $this->default, $this->type, $this->byRef, $this->variadic, [], $this->flags, $this->attributeGroups diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php index 68e31856..3fc96d98 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php @@ -4,25 +4,25 @@ namespace PhpParser\Builder; use PhpParser; use PhpParser\BuilderHelpers; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Stmt; use PhpParser\Node\ComplexType; -class Property implements PhpParser\Builder -{ - protected $name; +class Property implements PhpParser\Builder { + protected string $name; - protected $flags = 0; - protected $default = null; - protected $attributes = []; + protected int $flags = 0; - /** @var null|Identifier|Name|NullableType */ - protected $type; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; + protected ?Node\Expr $default = null; + /** @var array */ + protected array $attributes = []; + /** @var null|Identifier|Name|ComplexType */ + protected ?Node $type = null; + /** @var list */ + protected array $attributeGroups = []; /** * Creates a property builder. @@ -39,7 +39,7 @@ class Property implements PhpParser\Builder * @return $this The builder instance (for fluid interface) */ public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC); return $this; } @@ -50,7 +50,7 @@ class Property implements PhpParser\Builder * @return $this The builder instance (for fluid interface) */ public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED); return $this; } @@ -61,7 +61,7 @@ class Property implements PhpParser\Builder * @return $this The builder instance (for fluid interface) */ public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE); return $this; } @@ -72,7 +72,7 @@ class Property implements PhpParser\Builder * @return $this The builder instance (for fluid interface) */ public function makeStatic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::STATIC); return $this; } @@ -83,7 +83,7 @@ class Property implements PhpParser\Builder * @return $this The builder instance (for fluid interface) */ public function makeReadonly() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::READONLY); return $this; } @@ -147,11 +147,11 @@ class Property implements PhpParser\Builder * * @return Stmt\Property The built property node */ - public function getNode() : PhpParser\Node { + public function getNode(): PhpParser\Node { return new Stmt\Property( - $this->flags !== 0 ? $this->flags : Stmt\Class_::MODIFIER_PUBLIC, + $this->flags !== 0 ? $this->flags : Modifiers::PUBLIC, [ - new Stmt\PropertyProperty($this->name, $this->default) + new Node\PropertyItem($this->name, $this->default) ], $this->attributes, $this->type, diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php index 311e8cd7..cf21c821 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php @@ -7,10 +7,11 @@ use PhpParser\BuilderHelpers; use PhpParser\Node; use PhpParser\Node\Stmt; -class TraitUse implements Builder -{ - protected $traits = []; - protected $adaptations = []; +class TraitUse implements Builder { + /** @var Node\Name[] */ + protected array $traits = []; + /** @var Stmt\TraitUseAdaptation[] */ + protected array $adaptations = []; /** * Creates a trait use builder. @@ -58,7 +59,7 @@ class TraitUse implements Builder * * @return Node The built node */ - public function getNode() : Node { + public function getNode(): Node { return new Stmt\TraitUse($this->traits, $this->adaptations); } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php index eb6c0b62..fee09583 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php @@ -4,43 +4,40 @@ namespace PhpParser\Builder; use PhpParser\Builder; use PhpParser\BuilderHelpers; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\Stmt; -class TraitUseAdaptation implements Builder -{ - const TYPE_UNDEFINED = 0; - const TYPE_ALIAS = 1; - const TYPE_PRECEDENCE = 2; +class TraitUseAdaptation implements Builder { + private const TYPE_UNDEFINED = 0; + private const TYPE_ALIAS = 1; + private const TYPE_PRECEDENCE = 2; - /** @var int Type of building adaptation */ - protected $type; - - protected $trait; - protected $method; - - protected $modifier = null; - protected $alias = null; - - protected $insteadof = []; + protected int $type; + protected ?Node\Name $trait; + protected Node\Identifier $method; + protected ?int $modifier = null; + protected ?Node\Identifier $alias = null; + /** @var Node\Name[] */ + protected array $insteadof = []; /** * Creates a trait use adaptation builder. * - * @param Node\Name|string|null $trait Name of adaptated trait - * @param Node\Identifier|string $method Name of adaptated method + * @param Node\Name|string|null $trait Name of adapted trait + * @param Node\Identifier|string $method Name of adapted method */ public function __construct($trait, $method) { $this->type = self::TYPE_UNDEFINED; - $this->trait = is_null($trait)? null: BuilderHelpers::normalizeName($trait); + $this->trait = is_null($trait) ? null : BuilderHelpers::normalizeName($trait); $this->method = BuilderHelpers::normalizeIdentifier($method); } /** * Sets alias of method. * - * @param Node\Identifier|string $alias Alias for adaptated method + * @param Node\Identifier|string $alias Alias for adapted method * * @return $this The builder instance (for fluid interface) */ @@ -53,37 +50,37 @@ class TraitUseAdaptation implements Builder throw new \LogicException('Cannot set alias for not alias adaptation buider'); } - $this->alias = $alias; + $this->alias = BuilderHelpers::normalizeIdentifier($alias); return $this; } /** - * Sets adaptated method public. + * Sets adapted method public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { - $this->setModifier(Stmt\Class_::MODIFIER_PUBLIC); + $this->setModifier(Modifiers::PUBLIC); return $this; } /** - * Sets adaptated method protected. + * Sets adapted method protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { - $this->setModifier(Stmt\Class_::MODIFIER_PROTECTED); + $this->setModifier(Modifiers::PROTECTED); return $this; } /** - * Sets adaptated method private. + * Sets adapted method private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { - $this->setModifier(Stmt\Class_::MODIFIER_PRIVATE); + $this->setModifier(Modifiers::PRIVATE); return $this; } @@ -114,7 +111,7 @@ class TraitUseAdaptation implements Builder return $this; } - protected function setModifier(int $modifier) { + protected function setModifier(int $modifier): void { if ($this->type === self::TYPE_UNDEFINED) { $this->type = self::TYPE_ALIAS; } @@ -135,7 +132,7 @@ class TraitUseAdaptation implements Builder * * @return Node The built node */ - public function getNode() : Node { + public function getNode(): Node { switch ($this->type) { case self::TYPE_ALIAS: return new Stmt\TraitUseAdaptation\Alias($this->trait, $this->method, $this->modifier, $this->alias); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php index 97f32f98..ffa1bd5c 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php @@ -7,15 +7,18 @@ use PhpParser\BuilderHelpers; use PhpParser\Node; use PhpParser\Node\Stmt; -class Trait_ extends Declaration -{ - protected $name; - protected $uses = []; - protected $properties = []; - protected $methods = []; - - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; +class Trait_ extends Declaration { + protected string $name; + /** @var list */ + protected array $uses = []; + /** @var list */ + protected array $constants = []; + /** @var list */ + protected array $properties = []; + /** @var list */ + protected array $methods = []; + /** @var list */ + protected array $attributeGroups = []; /** * Creates an interface builder. @@ -42,6 +45,8 @@ class Trait_ extends Declaration $this->methods[] = $stmt; } elseif ($stmt instanceof Stmt\TraitUse) { $this->uses[] = $stmt; + } elseif ($stmt instanceof Stmt\ClassConst) { + $this->constants[] = $stmt; } else { throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); } @@ -67,10 +72,10 @@ class Trait_ extends Declaration * * @return Stmt\Trait_ The built interface node */ - public function getNode() : PhpParser\Node { + public function getNode(): PhpParser\Node { return new Stmt\Trait_( $this->name, [ - 'stmts' => array_merge($this->uses, $this->properties, $this->methods), + 'stmts' => array_merge($this->uses, $this->constants, $this->properties, $this->methods), 'attrGroups' => $this->attributeGroups, ], $this->attributes ); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php index 4bd3d12d..b82cf139 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php @@ -7,17 +7,17 @@ use PhpParser\BuilderHelpers; use PhpParser\Node; use PhpParser\Node\Stmt; -class Use_ implements Builder -{ - protected $name; - protected $type; - protected $alias = null; +class Use_ implements Builder { + protected Node\Name $name; + /** @var Stmt\Use_::TYPE_* */ + protected int $type; + protected ?string $alias = null; /** * Creates a name use (alias) builder. * * @param Node\Name|string $name Name of the entity (namespace, class, function, constant) to alias - * @param int $type One of the Stmt\Use_::TYPE_* constants + * @param Stmt\Use_::TYPE_* $type One of the Stmt\Use_::TYPE_* constants */ public function __construct($name, int $type) { $this->name = BuilderHelpers::normalizeName($name); @@ -41,9 +41,9 @@ class Use_ implements Builder * * @return Stmt\Use_ The built node */ - public function getNode() : Node { + public function getNode(): Node { return new Stmt\Use_([ - new Stmt\UseUse($this->name, $this->alias) + new Node\UseItem($this->name, $this->alias) ], $this->type); } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php index af010e02..b7efe5e9 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php @@ -10,17 +10,14 @@ use PhpParser\Node\Name; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Use_; -class BuilderFactory -{ +class BuilderFactory { /** * Creates an attribute node. * * @param string|Name $name Name of the attribute - * @param array $args Attribute named arguments - * - * @return Node\Attribute + * @param array $args Attribute named arguments */ - public function attribute($name, array $args = []) : Node\Attribute { + public function attribute($name, array $args = []): Node\Attribute { return new Node\Attribute( BuilderHelpers::normalizeName($name), $this->args($args) @@ -34,7 +31,7 @@ class BuilderFactory * * @return Builder\Namespace_ The created namespace builder */ - public function namespace($name) : Builder\Namespace_ { + public function namespace($name): Builder\Namespace_ { return new Builder\Namespace_($name); } @@ -45,7 +42,7 @@ class BuilderFactory * * @return Builder\Class_ The created class builder */ - public function class(string $name) : Builder\Class_ { + public function class(string $name): Builder\Class_ { return new Builder\Class_($name); } @@ -56,7 +53,7 @@ class BuilderFactory * * @return Builder\Interface_ The created interface builder */ - public function interface(string $name) : Builder\Interface_ { + public function interface(string $name): Builder\Interface_ { return new Builder\Interface_($name); } @@ -67,7 +64,7 @@ class BuilderFactory * * @return Builder\Trait_ The created trait builder */ - public function trait(string $name) : Builder\Trait_ { + public function trait(string $name): Builder\Trait_ { return new Builder\Trait_($name); } @@ -78,7 +75,7 @@ class BuilderFactory * * @return Builder\Enum_ The created enum builder */ - public function enum(string $name) : Builder\Enum_ { + public function enum(string $name): Builder\Enum_ { return new Builder\Enum_($name); } @@ -87,21 +84,21 @@ class BuilderFactory * * @param Node\Name|string ...$traits Trait names * - * @return Builder\TraitUse The create trait use builder + * @return Builder\TraitUse The created trait use builder */ - public function useTrait(...$traits) : Builder\TraitUse { + public function useTrait(...$traits): Builder\TraitUse { return new Builder\TraitUse(...$traits); } /** * Creates a trait use adaptation builder. * - * @param Node\Name|string|null $trait Trait name + * @param Node\Name|string|null $trait Trait name * @param Node\Identifier|string $method Method name * - * @return Builder\TraitUseAdaptation The create trait use adaptation builder + * @return Builder\TraitUseAdaptation The created trait use adaptation builder */ - public function traitUseAdaptation($trait, $method = null) : Builder\TraitUseAdaptation { + public function traitUseAdaptation($trait, $method = null): Builder\TraitUseAdaptation { if ($method === null) { $method = $trait; $trait = null; @@ -117,7 +114,7 @@ class BuilderFactory * * @return Builder\Method The created method builder */ - public function method(string $name) : Builder\Method { + public function method(string $name): Builder\Method { return new Builder\Method($name); } @@ -128,7 +125,7 @@ class BuilderFactory * * @return Builder\Param The created parameter builder */ - public function param(string $name) : Builder\Param { + public function param(string $name): Builder\Param { return new Builder\Param($name); } @@ -139,7 +136,7 @@ class BuilderFactory * * @return Builder\Property The created property builder */ - public function property(string $name) : Builder\Property { + public function property(string $name): Builder\Property { return new Builder\Property($name); } @@ -150,7 +147,7 @@ class BuilderFactory * * @return Builder\Function_ The created function builder */ - public function function(string $name) : Builder\Function_ { + public function function(string $name): Builder\Function_ { return new Builder\Function_($name); } @@ -161,7 +158,7 @@ class BuilderFactory * * @return Builder\Use_ The created use builder */ - public function use($name) : Builder\Use_ { + public function use($name): Builder\Use_ { return new Builder\Use_($name, Use_::TYPE_NORMAL); } @@ -172,7 +169,7 @@ class BuilderFactory * * @return Builder\Use_ The created use function builder */ - public function useFunction($name) : Builder\Use_ { + public function useFunction($name): Builder\Use_ { return new Builder\Use_($name, Use_::TYPE_FUNCTION); } @@ -183,30 +180,30 @@ class BuilderFactory * * @return Builder\Use_ The created use const builder */ - public function useConst($name) : Builder\Use_ { + public function useConst($name): Builder\Use_ { return new Builder\Use_($name, Use_::TYPE_CONSTANT); } /** * Creates a class constant builder. * - * @param string|Identifier $name Name + * @param string|Identifier $name Name * @param Node\Expr|bool|null|int|float|string|array $value Value * * @return Builder\ClassConst The created use const builder */ - public function classConst($name, $value) : Builder\ClassConst { + public function classConst($name, $value): Builder\ClassConst { return new Builder\ClassConst($name, $value); } /** * Creates an enum case builder. * - * @param string|Identifier $name Name + * @param string|Identifier $name Name * * @return Builder\EnumCase The created use const builder */ - public function enumCase($name) : Builder\EnumCase { + public function enumCase($name): Builder\EnumCase { return new Builder\EnumCase($name); } @@ -214,10 +211,8 @@ class BuilderFactory * Creates node a for a literal value. * * @param Expr|bool|null|int|float|string|array $value $value - * - * @return Expr */ - public function val($value) : Expr { + public function val($value): Expr { return BuilderHelpers::normalizeValue($value); } @@ -225,10 +220,8 @@ class BuilderFactory * Creates variable node. * * @param string|Expr $name Name - * - * @return Expr\Variable */ - public function var($name) : Expr\Variable { + public function var($name): Expr\Variable { if (!\is_string($name) && !$name instanceof Expr) { throw new \LogicException('Variable name must be string or Expr'); } @@ -243,9 +236,9 @@ class BuilderFactory * * @param array $args List of arguments to normalize * - * @return Arg[] + * @return list */ - public function args(array $args) : array { + public function args(array $args): array { $normalizedArgs = []; foreach ($args as $key => $arg) { if (!($arg instanceof Arg)) { @@ -263,11 +256,9 @@ class BuilderFactory * Creates a function call node. * * @param string|Name|Expr $name Function name - * @param array $args Function arguments - * - * @return Expr\FuncCall + * @param array $args Function arguments */ - public function funcCall($name, array $args = []) : Expr\FuncCall { + public function funcCall($name, array $args = []): Expr\FuncCall { return new Expr\FuncCall( BuilderHelpers::normalizeNameOrExpr($name), $this->args($args) @@ -277,13 +268,11 @@ class BuilderFactory /** * Creates a method call node. * - * @param Expr $var Variable the method is called on + * @param Expr $var Variable the method is called on * @param string|Identifier|Expr $name Method name - * @param array $args Method arguments - * - * @return Expr\MethodCall + * @param array $args Method arguments */ - public function methodCall(Expr $var, $name, array $args = []) : Expr\MethodCall { + public function methodCall(Expr $var, $name, array $args = []): Expr\MethodCall { return new Expr\MethodCall( $var, BuilderHelpers::normalizeIdentifierOrExpr($name), @@ -294,13 +283,11 @@ class BuilderFactory /** * Creates a static method call node. * - * @param string|Name|Expr $class Class name - * @param string|Identifier|Expr $name Method name - * @param array $args Method arguments - * - * @return Expr\StaticCall + * @param string|Name|Expr $class Class name + * @param string|Identifier|Expr $name Method name + * @param array $args Method arguments */ - public function staticCall($class, $name, array $args = []) : Expr\StaticCall { + public function staticCall($class, $name, array $args = []): Expr\StaticCall { return new Expr\StaticCall( BuilderHelpers::normalizeNameOrExpr($class), BuilderHelpers::normalizeIdentifierOrExpr($name), @@ -312,11 +299,9 @@ class BuilderFactory * Creates an object creation node. * * @param string|Name|Expr $class Class name - * @param array $args Constructor arguments - * - * @return Expr\New_ + * @param array $args Constructor arguments */ - public function new($class, array $args = []) : Expr\New_ { + public function new($class, array $args = []): Expr\New_ { return new Expr\New_( BuilderHelpers::normalizeNameOrExpr($class), $this->args($args) @@ -327,22 +312,18 @@ class BuilderFactory * Creates a constant fetch node. * * @param string|Name $name Constant name - * - * @return Expr\ConstFetch */ - public function constFetch($name) : Expr\ConstFetch { + public function constFetch($name): Expr\ConstFetch { return new Expr\ConstFetch(BuilderHelpers::normalizeName($name)); } /** * Creates a property fetch node. * - * @param Expr $var Variable holding object + * @param Expr $var Variable holding object * @param string|Identifier|Expr $name Property name - * - * @return Expr\PropertyFetch */ - public function propertyFetch(Expr $var, $name) : Expr\PropertyFetch { + public function propertyFetch(Expr $var, $name): Expr\PropertyFetch { return new Expr\PropertyFetch($var, BuilderHelpers::normalizeIdentifierOrExpr($name)); } @@ -350,9 +331,7 @@ class BuilderFactory * Creates a class constant fetch node. * * @param string|Name|Expr $class Class name - * @param string|Identifier|Expr $name Constant name - * - * @return Expr\ClassConstFetch + * @param string|Identifier|Expr $name Constant name */ public function classConstFetch($class, $name): Expr\ClassConstFetch { return new Expr\ClassConstFetch( @@ -365,10 +344,8 @@ class BuilderFactory * Creates nested Concat nodes from a list of expressions. * * @param Expr|string ...$exprs Expressions or literal strings - * - * @return Concat */ - public function concat(...$exprs) : Concat { + public function concat(...$exprs): Concat { $numExprs = count($exprs); if ($numExprs < 2) { throw new \LogicException('Expected at least two expressions'); @@ -383,9 +360,8 @@ class BuilderFactory /** * @param string|Expr $expr - * @return Expr */ - private function normalizeStringExpr($expr) : Expr { + private function normalizeStringExpr($expr): Expr { if ($expr instanceof Expr) { return $expr; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php index af6ceb99..3e41b26f 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php @@ -15,8 +15,7 @@ use PhpParser\Node\Stmt; * * @internal */ -final class BuilderHelpers -{ +final class BuilderHelpers { /** * Normalizes a node: Converts builder objects to nodes. * @@ -24,7 +23,7 @@ final class BuilderHelpers * * @return Node The normalized node */ - public static function normalizeNode($node) : Node { + public static function normalizeNode($node): Node { if ($node instanceof Builder) { return $node->getNode(); } @@ -45,7 +44,7 @@ final class BuilderHelpers * * @return Stmt The normalized statement node */ - public static function normalizeStmt($node) : Stmt { + public static function normalizeStmt($node): Stmt { $node = self::normalizeNode($node); if ($node instanceof Stmt) { return $node; @@ -65,7 +64,7 @@ final class BuilderHelpers * * @return Identifier The normalized identifier */ - public static function normalizeIdentifier($name) : Identifier { + public static function normalizeIdentifier($name): Identifier { if ($name instanceof Identifier) { return $name; } @@ -103,7 +102,7 @@ final class BuilderHelpers * * @return Name The normalized name */ - public static function normalizeName($name) : Name { + public static function normalizeName($name): Name { if ($name instanceof Name) { return $name; } @@ -219,7 +218,7 @@ final class BuilderHelpers * * @return Expr The normalized value */ - public static function normalizeValue($value) : Expr { + public static function normalizeValue($value): Expr { if ($value instanceof Node\Expr) { return $value; } @@ -237,11 +236,11 @@ final class BuilderHelpers } if (is_int($value)) { - return new Scalar\LNumber($value); + return new Scalar\Int_($value); } if (is_float($value)) { - return new Scalar\DNumber($value); + return new Scalar\Float_($value); } if (is_string($value)) { @@ -254,12 +253,12 @@ final class BuilderHelpers foreach ($value as $itemKey => $itemValue) { // for consecutive, numeric keys don't generate keys if (null !== $lastKey && ++$lastKey === $itemKey) { - $items[] = new Expr\ArrayItem( + $items[] = new Node\ArrayItem( self::normalizeValue($itemValue) ); } else { $lastKey = null; - $items[] = new Expr\ArrayItem( + $items[] = new Node\ArrayItem( self::normalizeValue($itemValue), self::normalizeValue($itemKey) ); @@ -279,7 +278,7 @@ final class BuilderHelpers * * @return Comment\Doc The normalized doc comment */ - public static function normalizeDocComment($docComment) : Comment\Doc { + public static function normalizeDocComment($docComment): Comment\Doc { if ($docComment instanceof Comment\Doc) { return $docComment; } @@ -298,8 +297,7 @@ final class BuilderHelpers * * @return Node\AttributeGroup The Attribute Group */ - public static function normalizeAttribute($attribute) : Node\AttributeGroup - { + public static function normalizeAttribute($attribute): Node\AttributeGroup { if ($attribute instanceof Node\AttributeGroup) { return $attribute; } @@ -315,12 +313,12 @@ final class BuilderHelpers * Adds a modifier and returns new modifier bitmask. * * @param int $modifiers Existing modifiers - * @param int $modifier Modifier to set + * @param int $modifier Modifier to set * * @return int New modifiers */ - public static function addModifier(int $modifiers, int $modifier) : int { - Stmt\Class_::verifyModifier($modifiers, $modifier); + public static function addModifier(int $modifiers, int $modifier): int { + Modifiers::verifyModifier($modifiers, $modifier); return $modifiers | $modifier; } @@ -328,8 +326,8 @@ final class BuilderHelpers * Adds a modifier and returns new modifier bitmask. * @return int New modifiers */ - public static function addClassModifier(int $existingModifiers, int $modifierToSet) : int { - Stmt\Class_::verifyClassModifier($existingModifiers, $modifierToSet); + public static function addClassModifier(int $existingModifiers, int $modifierToSet): int { + Modifiers::verifyClassModifier($existingModifiers, $modifierToSet); return $existingModifiers | $modifierToSet; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Comment.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Comment.php index 61e98d3d..17dc4c73 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Comment.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Comment.php @@ -2,23 +2,22 @@ namespace PhpParser; -class Comment implements \JsonSerializable -{ - protected $text; - protected $startLine; - protected $startFilePos; - protected $startTokenPos; - protected $endLine; - protected $endFilePos; - protected $endTokenPos; +class Comment implements \JsonSerializable { + protected string $text; + protected int $startLine; + protected int $startFilePos; + protected int $startTokenPos; + protected int $endLine; + protected int $endFilePos; + protected int $endTokenPos; /** * Constructs a comment node. * - * @param string $text Comment text (including comment delimiters like /*) - * @param int $startLine Line number the comment started on - * @param int $startFilePos File offset the comment started on - * @param int $startTokenPos Token offset the comment started on + * @param string $text Comment text (including comment delimiters like /*) + * @param int $startLine Line number the comment started on + * @param int $startFilePos File offset the comment started on + * @param int $startTokenPos Token offset the comment started on */ public function __construct( string $text, @@ -39,7 +38,7 @@ class Comment implements \JsonSerializable * * @return string The comment text (including comment delimiters like /*) */ - public function getText() : string { + public function getText(): string { return $this->text; } @@ -48,7 +47,7 @@ class Comment implements \JsonSerializable * * @return int Line number (or -1 if not available) */ - public function getStartLine() : int { + public function getStartLine(): int { return $this->startLine; } @@ -57,7 +56,7 @@ class Comment implements \JsonSerializable * * @return int File offset (or -1 if not available) */ - public function getStartFilePos() : int { + public function getStartFilePos(): int { return $this->startFilePos; } @@ -66,7 +65,7 @@ class Comment implements \JsonSerializable * * @return int Token offset (or -1 if not available) */ - public function getStartTokenPos() : int { + public function getStartTokenPos(): int { return $this->startTokenPos; } @@ -75,7 +74,7 @@ class Comment implements \JsonSerializable * * @return int Line number (or -1 if not available) */ - public function getEndLine() : int { + public function getEndLine(): int { return $this->endLine; } @@ -84,7 +83,7 @@ class Comment implements \JsonSerializable * * @return int File offset (or -1 if not available) */ - public function getEndFilePos() : int { + public function getEndFilePos(): int { return $this->endFilePos; } @@ -93,49 +92,16 @@ class Comment implements \JsonSerializable * * @return int Token offset (or -1 if not available) */ - public function getEndTokenPos() : int { + public function getEndTokenPos(): int { return $this->endTokenPos; } - /** - * Gets the line number the comment started on. - * - * @deprecated Use getStartLine() instead - * - * @return int Line number - */ - public function getLine() : int { - return $this->startLine; - } - - /** - * Gets the file offset the comment started on. - * - * @deprecated Use getStartFilePos() instead - * - * @return int File offset - */ - public function getFilePos() : int { - return $this->startFilePos; - } - - /** - * Gets the token offset the comment started on. - * - * @deprecated Use getStartTokenPos() instead - * - * @return int Token offset - */ - public function getTokenPos() : int { - return $this->startTokenPos; - } - /** * Gets the comment text. * * @return string The comment text (including comment delimiters like /*) */ - public function __toString() : string { + public function __toString(): string { return $this->text; } @@ -144,18 +110,19 @@ class Comment implements \JsonSerializable * * "Reformatted" here means that we try to clean up the whitespace at the * starts of the lines. This is necessary because we receive the comments - * without trailing whitespace on the first line, but with trailing whitespace + * without leading whitespace on the first line, but with leading whitespace * on all subsequent lines. * - * @return mixed|string + * Additionally, this normalizes CRLF newlines to LF newlines. */ - public function getReformattedText() { - $text = trim($this->text); + public function getReformattedText(): string { + $text = str_replace("\r\n", "\n", $this->text); $newlinePos = strpos($text, "\n"); if (false === $newlinePos) { // Single line comments don't need further processing return $text; - } elseif (preg_match('((*BSR_ANYCRLF)(*ANYCRLF)^.*(?:\R\s+\*.*)+$)', $text)) { + } + if (preg_match('(^.*(?:\n\s+\*.*)+$)', $text)) { // Multi line comment of the type // // /* @@ -164,8 +131,9 @@ class Comment implements \JsonSerializable // */ // // is handled by replacing the whitespace sequences before the * by a single space - return preg_replace('(^\s+\*)m', ' *', $this->text); - } elseif (preg_match('(^/\*\*?\s*[\r\n])', $text) && preg_match('(\n(\s*)\*/$)', $text, $matches)) { + return preg_replace('(^\s+\*)m', ' *', $text); + } + if (preg_match('(^/\*\*?\s*\n)', $text) && preg_match('(\n(\s*)\*/$)', $text, $matches)) { // Multi line comment of the type // // /* @@ -177,7 +145,8 @@ class Comment implements \JsonSerializable // */ on all lines. So if the last line is " */", then " " is removed at the // start of all lines. return preg_replace('(^' . preg_quote($matches[1]) . ')m', '', $text); - } elseif (preg_match('(^/\*\*?\s*(?!\s))', $text, $matches)) { + } + if (preg_match('(^/\*\*?\s*(?!\s))', $text, $matches)) { // Multi line comment of the type // // /* Some text. @@ -204,9 +173,9 @@ class Comment implements \JsonSerializable * @param string $str String to check * @return int Length in characters. Tabs count as single characters. */ - private function getShortestWhitespacePrefixLen(string $str) : int { + private function getShortestWhitespacePrefixLen(string $str): int { $lines = explode("\n", $str); - $shortestPrefixLen = \INF; + $shortestPrefixLen = \PHP_INT_MAX; foreach ($lines as $line) { preg_match('(^\s*)', $line, $matches); $prefixLen = strlen($matches[0]); @@ -218,10 +187,9 @@ class Comment implements \JsonSerializable } /** - * @return array - * @psalm-return array{nodeType:string, text:mixed, line:mixed, filePos:mixed} + * @return array{nodeType:string, text:mixed, line:mixed, filePos:mixed} */ - public function jsonSerialize() : array { + public function jsonSerialize(): array { // Technically not a node, but we make it look like one anyway $type = $this instanceof Comment\Doc ? 'Comment_Doc' : 'Comment'; return [ diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php index a9db6128..bb3e9146 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php @@ -2,6 +2,5 @@ namespace PhpParser\Comment; -class Doc extends \PhpParser\Comment -{ +class Doc extends \PhpParser\Comment { } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php index 49c92d59..7964058a 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php @@ -1,6 +1,6 @@ -fallbackEvaluator = $fallbackEvaluator ?? function(Expr $expr) { + public function __construct(?callable $fallbackEvaluator = null) { + $this->fallbackEvaluator = $fallbackEvaluator ?? function (Expr $expr) { throw new ConstExprEvaluationException( "Expression of type {$expr->getType()} cannot be evaluated" ); @@ -63,7 +64,7 @@ class ConstExprEvaluator * @throws ConstExprEvaluationException if the expression cannot be evaluated or an error occurred */ public function evaluateSilently(Expr $expr) { - set_error_handler(function($num, $str, $file, $line) { + set_error_handler(function ($num, $str, $file, $line) { throw new \ErrorException($str, 0, $num, $file, $line); }); @@ -101,9 +102,10 @@ class ConstExprEvaluator return $this->evaluate($expr); } + /** @return mixed */ private function evaluate(Expr $expr) { - if ($expr instanceof Scalar\LNumber - || $expr instanceof Scalar\DNumber + if ($expr instanceof Scalar\Int_ + || $expr instanceof Scalar\Float_ || $expr instanceof Scalar\String_ ) { return $expr->value; @@ -146,7 +148,7 @@ class ConstExprEvaluator return ($this->fallbackEvaluator)($expr); } - private function evaluateArray(Expr\Array_ $expr) { + private function evaluateArray(Expr\Array_ $expr): array { $array = []; foreach ($expr->items as $item) { if (null !== $item->key) { @@ -160,6 +162,7 @@ class ConstExprEvaluator return $array; } + /** @return mixed */ private function evaluateTernary(Expr\Ternary $expr) { if (null === $expr->if) { return $this->evaluate($expr->cond) ?: $this->evaluate($expr->else); @@ -170,6 +173,7 @@ class ConstExprEvaluator : $this->evaluate($expr->else); } + /** @return mixed */ private function evaluateBinaryOp(Expr\BinaryOp $expr) { if ($expr instanceof Expr\BinaryOp\Coalesce && $expr->left instanceof Expr\ArrayDimFetch @@ -216,6 +220,7 @@ class ConstExprEvaluator throw new \Exception('Should not happen'); } + /** @return mixed */ private function evaluateConstFetch(Expr\ConstFetch $expr) { $name = $expr->name->toLowerString(); switch ($name) { diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Error.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Error.php index d1fb959d..02feace0 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Error.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Error.php @@ -2,25 +2,20 @@ namespace PhpParser; -class Error extends \RuntimeException -{ - protected $rawMessage; - protected $attributes; +class Error extends \RuntimeException { + protected string $rawMessage; + /** @var array */ + protected array $attributes; /** * Creates an Exception signifying a parse error. * - * @param string $message Error message - * @param array|int $attributes Attributes of node/token where error occurred - * (or start line of error -- deprecated) + * @param string $message Error message + * @param array $attributes Attributes of node/token where error occurred */ - public function __construct(string $message, $attributes = []) { + public function __construct(string $message, array $attributes = []) { $this->rawMessage = $message; - if (is_array($attributes)) { - $this->attributes = $attributes; - } else { - $this->attributes = ['startLine' => $attributes]; - } + $this->attributes = $attributes; $this->updateMessage(); } @@ -29,7 +24,7 @@ class Error extends \RuntimeException * * @return string Error message */ - public function getRawMessage() : string { + public function getRawMessage(): string { return $this->rawMessage; } @@ -38,7 +33,7 @@ class Error extends \RuntimeException * * @return int Error start line */ - public function getStartLine() : int { + public function getStartLine(): int { return $this->attributes['startLine'] ?? -1; } @@ -47,25 +42,25 @@ class Error extends \RuntimeException * * @return int Error end line */ - public function getEndLine() : int { + public function getEndLine(): int { return $this->attributes['endLine'] ?? -1; } /** * Gets the attributes of the node/token the error occurred at. * - * @return array + * @return array */ - public function getAttributes() : array { + public function getAttributes(): array { return $this->attributes; } /** * Sets the attributes of the node/token the error occurred at. * - * @param array $attributes + * @param array $attributes */ - public function setAttributes(array $attributes) { + public function setAttributes(array $attributes): void { $this->attributes = $attributes; $this->updateMessage(); } @@ -75,7 +70,7 @@ class Error extends \RuntimeException * * @param string $message Error message */ - public function setRawMessage(string $message) { + public function setRawMessage(string $message): void { $this->rawMessage = $message; $this->updateMessage(); } @@ -85,7 +80,7 @@ class Error extends \RuntimeException * * @param int $line Error start line */ - public function setStartLine(int $line) { + public function setStartLine(int $line): void { $this->attributes['startLine'] = $line; $this->updateMessage(); } @@ -94,10 +89,8 @@ class Error extends \RuntimeException * Returns whether the error has start and end column information. * * For column information enable the startFilePos and endFilePos in the lexer options. - * - * @return bool */ - public function hasColumnInfo() : bool { + public function hasColumnInfo(): bool { return isset($this->attributes['startFilePos'], $this->attributes['endFilePos']); } @@ -105,9 +98,8 @@ class Error extends \RuntimeException * Gets the start column (1-based) into the line where the error started. * * @param string $code Source code of the file - * @return int */ - public function getStartColumn(string $code) : int { + public function getStartColumn(string $code): int { if (!$this->hasColumnInfo()) { throw new \RuntimeException('Error does not have column information'); } @@ -119,9 +111,8 @@ class Error extends \RuntimeException * Gets the end column (1-based) into the line where the error ended. * * @param string $code Source code of the file - * @return int */ - public function getEndColumn(string $code) : int { + public function getEndColumn(string $code): int { if (!$this->hasColumnInfo()) { throw new \RuntimeException('Error does not have column information'); } @@ -136,7 +127,7 @@ class Error extends \RuntimeException * * @return string Formatted message */ - public function getMessageWithColumnInfo(string $code) : string { + public function getMessageWithColumnInfo(string $code): string { return sprintf( '%s from %d:%d to %d:%d', $this->getRawMessage(), $this->getStartLine(), $this->getStartColumn($code), @@ -148,11 +139,11 @@ class Error extends \RuntimeException * Converts a file offset into a column. * * @param string $code Source code that $pos indexes into - * @param int $pos 0-based position in $code + * @param int $pos 0-based position in $code * * @return int 1-based column (relative to start of line) */ - private function toColumn(string $code, int $pos) : int { + private function toColumn(string $code, int $pos): int { if ($pos > strlen($code)) { throw new \RuntimeException('Invalid position information'); } @@ -168,7 +159,7 @@ class Error extends \RuntimeException /** * Updates the exception message after a change to rawMessage or rawLine. */ - protected function updateMessage() { + protected function updateMessage(): void { $this->message = $this->rawMessage; if (-1 === $this->getStartLine()) { diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php index d620e745..51ad730c 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php @@ -2,12 +2,11 @@ namespace PhpParser; -interface ErrorHandler -{ +interface ErrorHandler { /** * Handle an error generated during lexing, parsing or some other operation. * * @param Error $error The error that needs to be handled */ - public function handleError(Error $error); + public function handleError(Error $error): void; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php index 784b61b1..eee63492 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php @@ -10,12 +10,11 @@ use PhpParser\ErrorHandler; * * This allows graceful handling of errors. */ -class Collecting implements ErrorHandler -{ +class Collecting implements ErrorHandler { /** @var Error[] Collected errors */ - private $errors = []; + private array $errors = []; - public function handleError(Error $error) { + public function handleError(Error $error): void { $this->errors[] = $error; } @@ -24,23 +23,21 @@ class Collecting implements ErrorHandler * * @return Error[] */ - public function getErrors() : array { + public function getErrors(): array { return $this->errors; } /** * Check whether there are any errors. - * - * @return bool */ - public function hasErrors() : bool { + public function hasErrors(): bool { return !empty($this->errors); } /** * Reset/clear collected errors. */ - public function clearErrors() { + public function clearErrors(): void { $this->errors = []; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php index aeee989b..dff33dd0 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php @@ -10,9 +10,8 @@ use PhpParser\ErrorHandler; * * This is the default strategy used by all components. */ -class Throwing implements ErrorHandler -{ - public function handleError(Error $error) { +class Throwing implements ErrorHandler { + public function handleError(Error $error): void { throw $error; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php index a38b57ba..7433b5d3 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php @@ -5,20 +5,24 @@ namespace PhpParser\Internal; /** * @internal */ -class DiffElem -{ - const TYPE_KEEP = 0; - const TYPE_REMOVE = 1; - const TYPE_ADD = 2; - const TYPE_REPLACE = 3; +class DiffElem { + public const TYPE_KEEP = 0; + public const TYPE_REMOVE = 1; + public const TYPE_ADD = 2; + public const TYPE_REPLACE = 3; /** @var int One of the TYPE_* constants */ - public $type; + public int $type; /** @var mixed Is null for add operations */ public $old; /** @var mixed Is null for remove operations */ public $new; + /** + * @param int $type One of the TYPE_* constants + * @param mixed $old Is null for add operations + * @param mixed $new Is null for remove operations + */ public function __construct(int $type, $old, $new) { $this->type = $type; $this->old = $old; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php index 7f218c74..253e1757 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php @@ -8,16 +8,17 @@ namespace PhpParser\Internal; * Myers, Eugene W. "An O (ND) difference algorithm and its variations." * Algorithmica 1.1 (1986): 251-266. * + * @template T * @internal */ -class Differ -{ +class Differ { + /** @var callable(T, T): bool */ private $isEqual; /** * Create differ over the given equality relation. * - * @param callable $isEqual Equality relation with signature function($a, $b) : bool + * @param callable(T, T): bool $isEqual Equality relation */ public function __construct(callable $isEqual) { $this->isEqual = $isEqual; @@ -26,12 +27,14 @@ class Differ /** * Calculate diff (edit script) from $old to $new. * - * @param array $old Original array - * @param array $new New array + * @param T[] $old Original array + * @param T[] $new New array * * @return DiffElem[] Diff (edit script) */ - public function diff(array $old, array $new) { + public function diff(array $old, array $new): array { + $old = \array_values($old); + $new = \array_values($new); list($trace, $x, $y) = $this->calculateTrace($old, $new); return $this->extractDiff($trace, $x, $y, $old, $new); } @@ -42,32 +45,37 @@ class Differ * If a sequence of remove operations is followed by the same number of add operations, these * will be coalesced into replace operations. * - * @param array $old Original array - * @param array $new New array + * @param T[] $old Original array + * @param T[] $new New array * * @return DiffElem[] Diff (edit script), including replace operations */ - public function diffWithReplacements(array $old, array $new) { + public function diffWithReplacements(array $old, array $new): array { return $this->coalesceReplacements($this->diff($old, $new)); } - private function calculateTrace(array $a, array $b) { - $n = \count($a); - $m = \count($b); + /** + * @param T[] $old + * @param T[] $new + * @return array{array>, int, int} + */ + private function calculateTrace(array $old, array $new): array { + $n = \count($old); + $m = \count($new); $max = $n + $m; $v = [1 => 0]; $trace = []; for ($d = 0; $d <= $max; $d++) { $trace[] = $v; for ($k = -$d; $k <= $d; $k += 2) { - if ($k === -$d || ($k !== $d && $v[$k-1] < $v[$k+1])) { - $x = $v[$k+1]; + if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { + $x = $v[$k + 1]; } else { - $x = $v[$k-1] + 1; + $x = $v[$k - 1] + 1; } $y = $x - $k; - while ($x < $n && $y < $m && ($this->isEqual)($a[$x], $b[$y])) { + while ($x < $n && $y < $m && ($this->isEqual)($old[$x], $new[$y])) { $x++; $y++; } @@ -81,13 +89,19 @@ class Differ throw new \Exception('Should not happen'); } - private function extractDiff(array $trace, int $x, int $y, array $a, array $b) { + /** + * @param array> $trace + * @param T[] $old + * @param T[] $new + * @return DiffElem[] + */ + private function extractDiff(array $trace, int $x, int $y, array $old, array $new): array { $result = []; for ($d = \count($trace) - 1; $d >= 0; $d--) { $v = $trace[$d]; $k = $x - $y; - if ($k === -$d || ($k !== $d && $v[$k-1] < $v[$k+1])) { + if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { $prevK = $k + 1; } else { $prevK = $k - 1; @@ -97,7 +111,7 @@ class Differ $prevY = $prevX - $prevK; while ($x > $prevX && $y > $prevY) { - $result[] = new DiffElem(DiffElem::TYPE_KEEP, $a[$x-1], $b[$y-1]); + $result[] = new DiffElem(DiffElem::TYPE_KEEP, $old[$x - 1], $new[$y - 1]); $x--; $y--; } @@ -107,12 +121,12 @@ class Differ } while ($x > $prevX) { - $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $a[$x-1], null); + $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $old[$x - 1], null); $x--; } while ($y > $prevY) { - $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $b[$y-1]); + $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $new[$y - 1]); $y--; } } @@ -125,7 +139,7 @@ class Differ * @param DiffElem[] $diff * @return DiffElem[] */ - private function coalesceReplacements(array $diff) { + private function coalesceReplacements(array $diff): array { $newDiff = []; $c = \count($diff); for ($i = 0; $i < $c; $i++) { diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php index 67632270..b30a99a1 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php @@ -15,23 +15,30 @@ use PhpParser\Node\Expr; * * @internal */ -class PrintableNewAnonClassNode extends Expr -{ +class PrintableNewAnonClassNode extends Expr { /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; /** @var int Modifiers */ - public $flags; - /** @var Node\Arg[] Arguments */ - public $args; + public int $flags; + /** @var (Node\Arg|Node\VariadicPlaceholder)[] Arguments */ + public array $args; /** @var null|Node\Name Name of extended class */ - public $extends; + public ?Node\Name $extends; /** @var Node\Name[] Names of implemented interfaces */ - public $implements; + public array $implements; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; + /** + * @param Node\AttributeGroup[] $attrGroups PHP attribute groups + * @param (Node\Arg|Node\VariadicPlaceholder)[] $args Arguments + * @param Node\Name|null $extends Name of extended class + * @param Node\Name[] $implements Names of implemented interfaces + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Attributes + */ public function __construct( - array $attrGroups, int $flags, array $args, Node\Name $extends = null, array $implements, + array $attrGroups, int $flags, array $args, ?Node\Name $extends, array $implements, array $stmts, array $attributes ) { parent::__construct($attributes); @@ -43,7 +50,7 @@ class PrintableNewAnonClassNode extends Expr $this->stmts = $stmts; } - public static function fromNewNode(Expr\New_ $newNode) { + public static function fromNewNode(Expr\New_ $newNode): self { $class = $newNode->class; assert($class instanceof Node\Stmt\Class_); // We don't assert that $class->name is null here, to allow consumers to assign unique names @@ -54,11 +61,11 @@ class PrintableNewAnonClassNode extends Expr ); } - public function getType() : string { + public function getType(): string { return 'Expr_PrintableNewAnonClass'; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['attrGroups', 'flags', 'args', 'extends', 'implements', 'stmts']; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php new file mode 100644 index 00000000..36022d09 --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php @@ -0,0 +1,237 @@ += 80000) { + class TokenPolyfill extends \PhpToken { + } + return; +} + +/** + * This is a polyfill for the PhpToken class introduced in PHP 8.0. We do not actually polyfill + * PhpToken, because composer might end up picking a different polyfill implementation, which does + * not meet our requirements. + * + * @internal + */ +class TokenPolyfill { + /** @var int The ID of the token. Either a T_* constant of a character code < 256. */ + public int $id; + /** @var string The textual content of the token. */ + public string $text; + /** @var int The 1-based starting line of the token (or -1 if unknown). */ + public int $line; + /** @var int The 0-based starting position of the token (or -1 if unknown). */ + public int $pos; + + /** @var array Tokens ignored by the PHP parser. */ + private const IGNORABLE_TOKENS = [ + \T_WHITESPACE => true, + \T_COMMENT => true, + \T_DOC_COMMENT => true, + \T_OPEN_TAG => true, + ]; + + /** @var array Tokens that may be part of a T_NAME_* identifier. */ + private static array $identifierTokens; + + /** + * Create a Token with the given ID and text, as well optional line and position information. + */ + final public function __construct(int $id, string $text, int $line = -1, int $pos = -1) { + $this->id = $id; + $this->text = $text; + $this->line = $line; + $this->pos = $pos; + } + + /** + * Get the name of the token. For single-char tokens this will be the token character. + * Otherwise it will be a T_* style name, or null if the token ID is unknown. + */ + public function getTokenName(): ?string { + if ($this->id < 256) { + return \chr($this->id); + } + + $name = token_name($this->id); + return $name === 'UNKNOWN' ? null : $name; + } + + /** + * Check whether the token is of the given kind. The kind may be either an integer that matches + * the token ID, a string that matches the token text, or an array of integers/strings. In the + * latter case, the function returns true if any of the kinds in the array match. + * + * @param int|string|(int|string)[] $kind + */ + public function is($kind): bool { + if (\is_int($kind)) { + return $this->id === $kind; + } + if (\is_string($kind)) { + return $this->text === $kind; + } + if (\is_array($kind)) { + foreach ($kind as $entry) { + if (\is_int($entry)) { + if ($this->id === $entry) { + return true; + } + } elseif (\is_string($entry)) { + if ($this->text === $entry) { + return true; + } + } else { + throw new \TypeError( + 'Argument #1 ($kind) must only have elements of type string|int, ' . + gettype($entry) . ' given'); + } + } + return false; + } + throw new \TypeError( + 'Argument #1 ($kind) must be of type string|int|array, ' .gettype($kind) . ' given'); + } + + /** + * Check whether this token would be ignored by the PHP parser. Returns true for T_WHITESPACE, + * T_COMMENT, T_DOC_COMMENT and T_OPEN_TAG, and false for everything else. + */ + public function isIgnorable(): bool { + return isset(self::IGNORABLE_TOKENS[$this->id]); + } + + /** + * Return the textual content of the token. + */ + public function __toString(): string { + return $this->text; + } + + /** + * Tokenize the given source code and return an array of tokens. + * + * This performs certain canonicalizations to match the PHP 8.0 token format: + * * Bad characters are represented using T_BAD_CHARACTER rather than omitted. + * * T_COMMENT does not include trailing newlines, instead the newline is part of a following + * T_WHITESPACE token. + * * Namespaced names are represented using T_NAME_* tokens. + * + * @return static[] + */ + public static function tokenize(string $code, int $flags = 0): array { + self::init(); + + $tokens = []; + $line = 1; + $pos = 0; + $origTokens = \token_get_all($code, $flags); + + $numTokens = \count($origTokens); + for ($i = 0; $i < $numTokens; $i++) { + $token = $origTokens[$i]; + if (\is_string($token)) { + if (\strlen($token) === 2) { + // b" and B" are tokenized as single-char tokens, even though they aren't. + $tokens[] = new static(\ord('"'), $token, $line, $pos); + $pos += 2; + } else { + $tokens[] = new static(\ord($token), $token, $line, $pos); + $pos++; + } + } else { + $id = $token[0]; + $text = $token[1]; + + // Emulate PHP 8.0 comment format, which does not include trailing whitespace anymore. + if ($id === \T_COMMENT && \substr($text, 0, 2) !== '/*' && + \preg_match('/(\r\n|\n|\r)$/D', $text, $matches) + ) { + $trailingNewline = $matches[0]; + $text = \substr($text, 0, -\strlen($trailingNewline)); + $tokens[] = new static($id, $text, $line, $pos); + $pos += \strlen($text); + + if ($i + 1 < $numTokens && $origTokens[$i + 1][0] === \T_WHITESPACE) { + // Move trailing newline into following T_WHITESPACE token, if it already exists. + $origTokens[$i + 1][1] = $trailingNewline . $origTokens[$i + 1][1]; + $origTokens[$i + 1][2]--; + } else { + // Otherwise, we need to create a new T_WHITESPACE token. + $tokens[] = new static(\T_WHITESPACE, $trailingNewline, $line, $pos); + $line++; + $pos += \strlen($trailingNewline); + } + continue; + } + + // Emulate PHP 8.0 T_NAME_* tokens, by combining sequences of T_NS_SEPARATOR and + // T_STRING into a single token. + if (($id === \T_NS_SEPARATOR || isset(self::$identifierTokens[$id]))) { + $newText = $text; + $lastWasSeparator = $id === \T_NS_SEPARATOR; + for ($j = $i + 1; $j < $numTokens; $j++) { + if ($lastWasSeparator) { + if (!isset(self::$identifierTokens[$origTokens[$j][0]])) { + break; + } + $lastWasSeparator = false; + } else { + if ($origTokens[$j][0] !== \T_NS_SEPARATOR) { + break; + } + $lastWasSeparator = true; + } + $newText .= $origTokens[$j][1]; + } + if ($lastWasSeparator) { + // Trailing separator is not part of the name. + $j--; + $newText = \substr($newText, 0, -1); + } + if ($j > $i + 1) { + if ($id === \T_NS_SEPARATOR) { + $id = \T_NAME_FULLY_QUALIFIED; + } elseif ($id === \T_NAMESPACE) { + $id = \T_NAME_RELATIVE; + } else { + $id = \T_NAME_QUALIFIED; + } + $tokens[] = new static($id, $newText, $line, $pos); + $pos += \strlen($newText); + $i = $j - 1; + continue; + } + } + + $tokens[] = new static($id, $text, $line, $pos); + $line += \substr_count($text, "\n"); + $pos += \strlen($text); + } + } + return $tokens; + } + + /** Initialize private static state needed by tokenize(). */ + private static function init(): void { + if (isset(self::$identifierTokens)) { + return; + } + + // Based on semi_reserved production. + self::$identifierTokens = \array_fill_keys([ + \T_STRING, + \T_STATIC, \T_ABSTRACT, \T_FINAL, \T_PRIVATE, \T_PROTECTED, \T_PUBLIC, \T_READONLY, + \T_INCLUDE, \T_INCLUDE_ONCE, \T_EVAL, \T_REQUIRE, \T_REQUIRE_ONCE, \T_LOGICAL_OR, \T_LOGICAL_XOR, \T_LOGICAL_AND, + \T_INSTANCEOF, \T_NEW, \T_CLONE, \T_EXIT, \T_IF, \T_ELSEIF, \T_ELSE, \T_ENDIF, \T_ECHO, \T_DO, \T_WHILE, + \T_ENDWHILE, \T_FOR, \T_ENDFOR, \T_FOREACH, \T_ENDFOREACH, \T_DECLARE, \T_ENDDECLARE, \T_AS, \T_TRY, \T_CATCH, + \T_FINALLY, \T_THROW, \T_USE, \T_INSTEADOF, \T_GLOBAL, \T_VAR, \T_UNSET, \T_ISSET, \T_EMPTY, \T_CONTINUE, \T_GOTO, + \T_FUNCTION, \T_CONST, \T_RETURN, \T_PRINT, \T_YIELD, \T_LIST, \T_SWITCH, \T_ENDSWITCH, \T_CASE, \T_DEFAULT, + \T_BREAK, \T_ARRAY, \T_CALLABLE, \T_EXTENDS, \T_IMPLEMENTS, \T_NAMESPACE, \T_TRAIT, \T_INTERFACE, \T_CLASS, + \T_CLASS_C, \T_TRAIT_C, \T_FUNC_C, \T_METHOD_C, \T_LINE, \T_FILE, \T_DIR, \T_NS_C, \T_HALT_COMPILER, \T_FN, + \T_MATCH, + ], true); + } +} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php index 7e0a5de0..8fba1312 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php @@ -2,22 +2,23 @@ namespace PhpParser\Internal; +use PhpParser\Token; + /** * Provides operations on token streams, for use by pretty printer. * * @internal */ -class TokenStream -{ - /** @var array Tokens (in token_get_all format) */ - private $tokens; +class TokenStream { + /** @var Token[] Tokens (in PhpToken::tokenize() format) */ + private array $tokens; /** @var int[] Map from position to indentation */ - private $indentMap; + private array $indentMap; /** * Create token stream instance. * - * @param array $tokens Tokens in token_get_all() format + * @param Token[] $tokens Tokens in PhpToken::tokenize() format */ public function __construct(array $tokens) { $this->tokens = $tokens; @@ -28,11 +29,9 @@ class TokenStream * Whether the given position is immediately surrounded by parenthesis. * * @param int $startPos Start position - * @param int $endPos End position - * - * @return bool + * @param int $endPos End position */ - public function haveParens(int $startPos, int $endPos) : bool { + public function haveParens(int $startPos, int $endPos): bool { return $this->haveTokenImmediatelyBefore($startPos, '(') && $this->haveTokenImmediatelyAfter($endPos, ')'); } @@ -41,11 +40,9 @@ class TokenStream * Whether the given position is immediately surrounded by braces. * * @param int $startPos Start position - * @param int $endPos End position - * - * @return bool + * @param int $endPos End position */ - public function haveBraces(int $startPos, int $endPos) : bool { + public function haveBraces(int $startPos, int $endPos): bool { return ($this->haveTokenImmediatelyBefore($startPos, '{') || $this->haveTokenImmediatelyBefore($startPos, T_CURLY_OPEN)) && $this->haveTokenImmediatelyAfter($endPos, '}'); @@ -56,21 +53,20 @@ class TokenStream * * During this check whitespace and comments are skipped. * - * @param int $pos Position before which the token should occur + * @param int $pos Position before which the token should occur * @param int|string $expectedTokenType Token to check for * * @return bool Whether the expected token was found */ - public function haveTokenImmediatelyBefore(int $pos, $expectedTokenType) : bool { + public function haveTokenImmediatelyBefore(int $pos, $expectedTokenType): bool { $tokens = $this->tokens; $pos--; for (; $pos >= 0; $pos--) { - $tokenType = $tokens[$pos][0]; - if ($tokenType === $expectedTokenType) { + $token = $tokens[$pos]; + if ($token->is($expectedTokenType)) { return true; } - if ($tokenType !== \T_WHITESPACE - && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { + if (!$token->isIgnorable()) { break; } } @@ -82,28 +78,28 @@ class TokenStream * * During this check whitespace and comments are skipped. * - * @param int $pos Position after which the token should occur + * @param int $pos Position after which the token should occur * @param int|string $expectedTokenType Token to check for * * @return bool Whether the expected token was found */ - public function haveTokenImmediatelyAfter(int $pos, $expectedTokenType) : bool { + public function haveTokenImmediatelyAfter(int $pos, $expectedTokenType): bool { $tokens = $this->tokens; $pos++; - for (; $pos < \count($tokens); $pos++) { - $tokenType = $tokens[$pos][0]; - if ($tokenType === $expectedTokenType) { + for ($c = \count($tokens); $pos < $c; $pos++) { + $token = $tokens[$pos]; + if ($token->is($expectedTokenType)) { return true; } - if ($tokenType !== \T_WHITESPACE - && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { + if (!$token->isIgnorable()) { break; } } return false; } - public function skipLeft(int $pos, $skipTokenType) { + /** @param int|string|(int|string)[] $skipTokenType */ + public function skipLeft(int $pos, $skipTokenType): int { $tokens = $this->tokens; $pos = $this->skipLeftWhitespace($pos); @@ -111,7 +107,7 @@ class TokenStream return $pos; } - if ($tokens[$pos][0] !== $skipTokenType) { + if (!$tokens[$pos]->is($skipTokenType)) { // Shouldn't happen. The skip token MUST be there throw new \Exception('Encountered unexpected token'); } @@ -120,7 +116,8 @@ class TokenStream return $this->skipLeftWhitespace($pos); } - public function skipRight(int $pos, $skipTokenType) { + /** @param int|string|(int|string)[] $skipTokenType */ + public function skipRight(int $pos, $skipTokenType): int { $tokens = $this->tokens; $pos = $this->skipRightWhitespace($pos); @@ -128,7 +125,7 @@ class TokenStream return $pos; } - if ($tokens[$pos][0] !== $skipTokenType) { + if (!$tokens[$pos]->is($skipTokenType)) { // Shouldn't happen. The skip token MUST be there throw new \Exception('Encountered unexpected token'); } @@ -143,11 +140,10 @@ class TokenStream * @param int $pos Token position * @return int Non-whitespace token position */ - public function skipLeftWhitespace(int $pos) { + public function skipLeftWhitespace(int $pos): int { $tokens = $this->tokens; for (; $pos >= 0; $pos--) { - $type = $tokens[$pos][0]; - if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { + if (!$tokens[$pos]->isIgnorable()) { break; } } @@ -160,22 +156,21 @@ class TokenStream * @param int $pos Token position * @return int Non-whitespace token position */ - public function skipRightWhitespace(int $pos) { + public function skipRightWhitespace(int $pos): int { $tokens = $this->tokens; for ($count = \count($tokens); $pos < $count; $pos++) { - $type = $tokens[$pos][0]; - if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { + if (!$tokens[$pos]->isIgnorable()) { break; } } return $pos; } - public function findRight(int $pos, $findTokenType) { + /** @param int|string|(int|string)[] $findTokenType */ + public function findRight(int $pos, $findTokenType): int { $tokens = $this->tokens; for ($count = \count($tokens); $pos < $count; $pos++) { - $type = $tokens[$pos][0]; - if ($type === $findTokenType) { + if ($tokens[$pos]->is($findTokenType)) { return $pos; } } @@ -190,22 +185,16 @@ class TokenStream * @param int|string $tokenType Token type to look for * @return bool Whether the token occurs in the given range */ - public function haveTokenInRange(int $startPos, int $endPos, $tokenType) { + public function haveTokenInRange(int $startPos, int $endPos, $tokenType): bool { $tokens = $this->tokens; for ($pos = $startPos; $pos < $endPos; $pos++) { - if ($tokens[$pos][0] === $tokenType) { + if ($tokens[$pos]->is($tokenType)) { return true; } } return false; } - public function haveBracesInRange(int $startPos, int $endPos) { - return $this->haveTokenInRange($startPos, $endPos, '{') - || $this->haveTokenInRange($startPos, $endPos, T_CURLY_OPEN) - || $this->haveTokenInRange($startPos, $endPos, '}'); - } - public function haveTagInRange(int $startPos, int $endPos): bool { return $this->haveTokenInRange($startPos, $endPos, \T_OPEN_TAG) || $this->haveTokenInRange($startPos, $endPos, \T_CLOSE_TAG); @@ -218,41 +207,37 @@ class TokenStream * * @return int Indentation depth (in spaces) */ - public function getIndentationBefore(int $pos) : int { + public function getIndentationBefore(int $pos): int { return $this->indentMap[$pos]; } /** * Get the code corresponding to a token offset range, optionally adjusted for indentation. * - * @param int $from Token start position (inclusive) - * @param int $to Token end position (exclusive) + * @param int $from Token start position (inclusive) + * @param int $to Token end position (exclusive) * @param int $indent By how much the code should be indented (can be negative as well) * * @return string Code corresponding to token range, adjusted for indentation */ - public function getTokenCode(int $from, int $to, int $indent) : string { + public function getTokenCode(int $from, int $to, int $indent): string { $tokens = $this->tokens; $result = ''; for ($pos = $from; $pos < $to; $pos++) { $token = $tokens[$pos]; - if (\is_array($token)) { - $type = $token[0]; - $content = $token[1]; - if ($type === \T_CONSTANT_ENCAPSED_STRING || $type === \T_ENCAPSED_AND_WHITESPACE) { - $result .= $content; + $id = $token->id; + $text = $token->text; + if ($id === \T_CONSTANT_ENCAPSED_STRING || $id === \T_ENCAPSED_AND_WHITESPACE) { + $result .= $text; + } else { + // TODO Handle non-space indentation + if ($indent < 0) { + $result .= str_replace("\n" . str_repeat(" ", -$indent), "\n", $text); + } elseif ($indent > 0) { + $result .= str_replace("\n", "\n" . str_repeat(" ", $indent), $text); } else { - // TODO Handle non-space indentation - if ($indent < 0) { - $result .= str_replace("\n" . str_repeat(" ", -$indent), "\n", $content); - } elseif ($indent > 0) { - $result .= str_replace("\n", "\n" . str_repeat(" ", $indent), $content); - } else { - $result .= $content; - } + $result .= $text; } - } else { - $result .= $token; } } return $result; @@ -263,14 +248,14 @@ class TokenStream * * @return int[] Token position to indentation map */ - private function calcIndentMap() { + private function calcIndentMap(): array { $indentMap = []; $indent = 0; foreach ($this->tokens as $token) { $indentMap[] = $indent; - if ($token[0] === \T_WHITESPACE) { - $content = $token[1]; + if ($token->id === \T_WHITESPACE) { + $content = $token->text; $newlinePos = \strrpos($content, "\n"); if (false !== $newlinePos) { $indent = \strlen($content) - $newlinePos - 1; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php index 47d2003d..7be41426 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php @@ -2,11 +2,11 @@ namespace PhpParser; -class JsonDecoder -{ - /** @var \ReflectionClass[] Node type to reflection class map */ - private $reflectionClassCache; +class JsonDecoder { + /** @var \ReflectionClass[] Node type to reflection class map */ + private array $reflectionClassCache; + /** @return mixed */ public function decode(string $json) { $value = json_decode($json, true); if (json_last_error()) { @@ -16,6 +16,10 @@ class JsonDecoder return $this->decodeRecursive($value); } + /** + * @param mixed $value + * @return mixed + */ private function decodeRecursive($value) { if (\is_array($value)) { if (isset($value['nodeType'])) { @@ -29,7 +33,7 @@ class JsonDecoder return $value; } - private function decodeArray(array $array) : array { + private function decodeArray(array $array): array { $decodedArray = []; foreach ($array as $key => $value) { $decodedArray[$key] = $this->decodeRecursive($value); @@ -37,14 +41,13 @@ class JsonDecoder return $decodedArray; } - private function decodeNode(array $value) : Node { + private function decodeNode(array $value): Node { $nodeType = $value['nodeType']; if (!\is_string($nodeType)) { throw new \RuntimeException('Node type must be a string'); } $reflectionClass = $this->reflectionClassFromNodeType($nodeType); - /** @var Node $node */ $node = $reflectionClass->newInstanceWithoutConstructor(); if (isset($value['attributes'])) { @@ -66,7 +69,7 @@ class JsonDecoder return $node; } - private function decodeComment(array $value) : Comment { + private function decodeComment(array $value): Comment { $className = $value['nodeType'] === 'Comment' ? Comment::class : Comment\Doc::class; if (!isset($value['text'])) { throw new \RuntimeException('Comment must have text'); @@ -79,7 +82,8 @@ class JsonDecoder ); } - private function reflectionClassFromNodeType(string $nodeType) : \ReflectionClass { + /** @return \ReflectionClass */ + private function reflectionClassFromNodeType(string $nodeType): \ReflectionClass { if (!isset($this->reflectionClassCache[$nodeType])) { $className = $this->classNameFromNodeType($nodeType); $this->reflectionClassCache[$nodeType] = new \ReflectionClass($className); @@ -87,7 +91,8 @@ class JsonDecoder return $this->reflectionClassCache[$nodeType]; } - private function classNameFromNodeType(string $nodeType) : string { + /** @return class-string */ + private function classNameFromNodeType(string $nodeType): string { $className = 'PhpParser\\Node\\' . strtr($nodeType, '_', '\\'); if (class_exists($className)) { return $className; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer.php index e15dd0a5..5e2ece96 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer.php @@ -2,559 +2,115 @@ namespace PhpParser; -use PhpParser\Parser\Tokens; - -class Lexer -{ - protected $code; - protected $tokens; - protected $pos; - protected $line; - protected $filePos; - protected $prevCloseTagHasNewline; - - protected $tokenMap; - protected $dropTokens; - protected $identifierTokens; - - private $attributeStartLineUsed; - private $attributeEndLineUsed; - private $attributeStartTokenPosUsed; - private $attributeEndTokenPosUsed; - private $attributeStartFilePosUsed; - private $attributeEndFilePosUsed; - private $attributeCommentsUsed; +require __DIR__ . '/compatibility_tokens.php'; +class Lexer { /** - * Creates a Lexer. + * Tokenize the provided source code. * - * @param array $options Options array. Currently only the 'usedAttributes' option is supported, - * which is an array of attributes to add to the AST nodes. Possible - * attributes are: 'comments', 'startLine', 'endLine', 'startTokenPos', - * 'endTokenPos', 'startFilePos', 'endFilePos'. The option defaults to the - * first three. For more info see getNextToken() docs. - */ - public function __construct(array $options = []) { - // Create Map from internal tokens to PhpParser tokens. - $this->defineCompatibilityTokens(); - $this->tokenMap = $this->createTokenMap(); - $this->identifierTokens = $this->createIdentifierTokenMap(); - - // map of tokens to drop while lexing (the map is only used for isset lookup, - // that's why the value is simply set to 1; the value is never actually used.) - $this->dropTokens = array_fill_keys( - [\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT, \T_BAD_CHARACTER], 1 - ); - - $defaultAttributes = ['comments', 'startLine', 'endLine']; - $usedAttributes = array_fill_keys($options['usedAttributes'] ?? $defaultAttributes, true); - - // Create individual boolean properties to make these checks faster. - $this->attributeStartLineUsed = isset($usedAttributes['startLine']); - $this->attributeEndLineUsed = isset($usedAttributes['endLine']); - $this->attributeStartTokenPosUsed = isset($usedAttributes['startTokenPos']); - $this->attributeEndTokenPosUsed = isset($usedAttributes['endTokenPos']); - $this->attributeStartFilePosUsed = isset($usedAttributes['startFilePos']); - $this->attributeEndFilePosUsed = isset($usedAttributes['endFilePos']); - $this->attributeCommentsUsed = isset($usedAttributes['comments']); - } - - /** - * Initializes the lexer for lexing the provided source code. + * The token array is in the same format as provided by the PhpToken::tokenize() method in + * PHP 8.0. The tokens are instances of PhpParser\Token, to abstract over a polyfill + * implementation in earlier PHP version. * - * This function does not throw if lexing errors occur. Instead, errors may be retrieved using - * the getErrors() method. + * The token array is terminated by a sentinel token with token ID 0. + * The token array does not discard any tokens (i.e. whitespace and comments are included). + * The token position attributes are against this token array. * - * @param string $code The source code to lex + * @param string $code The source code to tokenize. * @param ErrorHandler|null $errorHandler Error handler to use for lexing errors. Defaults to - * ErrorHandler\Throwing + * ErrorHandler\Throwing. + * @return Token[] Tokens */ - public function startLexing(string $code, ErrorHandler $errorHandler = null) { + public function tokenize(string $code, ?ErrorHandler $errorHandler = null): array { if (null === $errorHandler) { $errorHandler = new ErrorHandler\Throwing(); } - $this->code = $code; // keep the code around for __halt_compiler() handling - $this->pos = -1; - $this->line = 1; - $this->filePos = 0; - - // If inline HTML occurs without preceding code, treat it as if it had a leading newline. - // This ensures proper composability, because having a newline is the "safe" assumption. - $this->prevCloseTagHasNewline = true; - $scream = ini_set('xdebug.scream', '0'); - $this->tokens = @token_get_all($code); - $this->postprocessTokens($errorHandler); + $tokens = @Token::tokenize($code); + $this->postprocessTokens($tokens, $errorHandler); if (false !== $scream) { ini_set('xdebug.scream', $scream); } - } - - private function handleInvalidCharacterRange($start, $end, $line, ErrorHandler $errorHandler) { - $tokens = []; - for ($i = $start; $i < $end; $i++) { - $chr = $this->code[$i]; - if ($chr === "\0") { - // PHP cuts error message after null byte, so need special case - $errorMsg = 'Unexpected null byte'; - } else { - $errorMsg = sprintf( - 'Unexpected character "%s" (ASCII %d)', $chr, ord($chr) - ); - } - $tokens[] = [\T_BAD_CHARACTER, $chr, $line]; - $errorHandler->handleError(new Error($errorMsg, [ - 'startLine' => $line, - 'endLine' => $line, - 'startFilePos' => $i, - 'endFilePos' => $i, - ])); - } return $tokens; } - /** - * Check whether comment token is unterminated. - * - * @return bool - */ - private function isUnterminatedComment($token) : bool { - return ($token[0] === \T_COMMENT || $token[0] === \T_DOC_COMMENT) - && substr($token[1], 0, 2) === '/*' - && substr($token[1], -2) !== '*/'; - } - - protected function postprocessTokens(ErrorHandler $errorHandler) { - // PHP's error handling for token_get_all() is rather bad, so if we want detailed - // error information we need to compute it ourselves. Invalid character errors are - // detected by finding "gaps" in the token array. Unterminated comments are detected - // by checking if a trailing comment has a "*/" at the end. - // - // Additionally, we perform a number of canonicalizations here: - // * Use the PHP 8.0 comment format, which does not include trailing whitespace anymore. - // * Use PHP 8.0 T_NAME_* tokens. - // * Use PHP 8.1 T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG and - // T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG tokens used to disambiguate intersection types. - - $filePos = 0; - $line = 1; - $numTokens = \count($this->tokens); - for ($i = 0; $i < $numTokens; $i++) { - $token = $this->tokens[$i]; - - // Since PHP 7.4 invalid characters are represented by a T_BAD_CHARACTER token. - // In this case we only need to emit an error. - if ($token[0] === \T_BAD_CHARACTER) { - $this->handleInvalidCharacterRange($filePos, $filePos + 1, $line, $errorHandler); - } - - if ($token[0] === \T_COMMENT && substr($token[1], 0, 2) !== '/*' - && preg_match('/(\r\n|\n|\r)$/D', $token[1], $matches)) { - $trailingNewline = $matches[0]; - $token[1] = substr($token[1], 0, -strlen($trailingNewline)); - $this->tokens[$i] = $token; - if (isset($this->tokens[$i + 1]) && $this->tokens[$i + 1][0] === \T_WHITESPACE) { - // Move trailing newline into following T_WHITESPACE token, if it already exists. - $this->tokens[$i + 1][1] = $trailingNewline . $this->tokens[$i + 1][1]; - $this->tokens[$i + 1][2]--; - } else { - // Otherwise, we need to create a new T_WHITESPACE token. - array_splice($this->tokens, $i + 1, 0, [ - [\T_WHITESPACE, $trailingNewline, $line], - ]); - $numTokens++; - } - } - - // Emulate PHP 8 T_NAME_* tokens, by combining sequences of T_NS_SEPARATOR and T_STRING - // into a single token. - if (\is_array($token) - && ($token[0] === \T_NS_SEPARATOR || isset($this->identifierTokens[$token[0]]))) { - $lastWasSeparator = $token[0] === \T_NS_SEPARATOR; - $text = $token[1]; - for ($j = $i + 1; isset($this->tokens[$j]); $j++) { - if ($lastWasSeparator) { - if (!isset($this->identifierTokens[$this->tokens[$j][0]])) { - break; - } - $lastWasSeparator = false; - } else { - if ($this->tokens[$j][0] !== \T_NS_SEPARATOR) { - break; - } - $lastWasSeparator = true; - } - $text .= $this->tokens[$j][1]; - } - if ($lastWasSeparator) { - // Trailing separator is not part of the name. - $j--; - $text = substr($text, 0, -1); - } - if ($j > $i + 1) { - if ($token[0] === \T_NS_SEPARATOR) { - $type = \T_NAME_FULLY_QUALIFIED; - } else if ($token[0] === \T_NAMESPACE) { - $type = \T_NAME_RELATIVE; - } else { - $type = \T_NAME_QUALIFIED; - } - $token = [$type, $text, $line]; - array_splice($this->tokens, $i, $j - $i, [$token]); - $numTokens -= $j - $i - 1; - } - } - - if ($token === '&') { - $next = $i + 1; - while (isset($this->tokens[$next]) && $this->tokens[$next][0] === \T_WHITESPACE) { - $next++; - } - $followedByVarOrVarArg = isset($this->tokens[$next]) && - ($this->tokens[$next][0] === \T_VARIABLE || $this->tokens[$next][0] === \T_ELLIPSIS); - $this->tokens[$i] = $token = [ - $followedByVarOrVarArg - ? \T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG - : \T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG, - '&', - $line, - ]; - } - - $tokenValue = \is_string($token) ? $token : $token[1]; - $tokenLen = \strlen($tokenValue); - - if (substr($this->code, $filePos, $tokenLen) !== $tokenValue) { - // Something is missing, must be an invalid character - $nextFilePos = strpos($this->code, $tokenValue, $filePos); - $badCharTokens = $this->handleInvalidCharacterRange( - $filePos, $nextFilePos, $line, $errorHandler); - $filePos = (int) $nextFilePos; - - array_splice($this->tokens, $i, 0, $badCharTokens); - $numTokens += \count($badCharTokens); - $i += \count($badCharTokens); - } - - $filePos += $tokenLen; - $line += substr_count($tokenValue, "\n"); - } - - if ($filePos !== \strlen($this->code)) { - if (substr($this->code, $filePos, 2) === '/*') { - // Unlike PHP, HHVM will drop unterminated comments entirely - $comment = substr($this->code, $filePos); - $errorHandler->handleError(new Error('Unterminated comment', [ - 'startLine' => $line, - 'endLine' => $line + substr_count($comment, "\n"), - 'startFilePos' => $filePos, - 'endFilePos' => $filePos + \strlen($comment), - ])); - - // Emulate the PHP behavior - $isDocComment = isset($comment[3]) && $comment[3] === '*'; - $this->tokens[] = [$isDocComment ? \T_DOC_COMMENT : \T_COMMENT, $comment, $line]; - } else { - // Invalid characters at the end of the input - $badCharTokens = $this->handleInvalidCharacterRange( - $filePos, \strlen($this->code), $line, $errorHandler); - $this->tokens = array_merge($this->tokens, $badCharTokens); - } - return; + private function handleInvalidCharacter(Token $token, ErrorHandler $errorHandler): void { + $chr = $token->text; + if ($chr === "\0") { + // PHP cuts error message after null byte, so need special case + $errorMsg = 'Unexpected null byte'; + } else { + $errorMsg = sprintf( + 'Unexpected character "%s" (ASCII %d)', $chr, ord($chr) + ); } - if (count($this->tokens) > 0) { - // Check for unterminated comment - $lastToken = $this->tokens[count($this->tokens) - 1]; - if ($this->isUnterminatedComment($lastToken)) { - $errorHandler->handleError(new Error('Unterminated comment', [ - 'startLine' => $line - substr_count($lastToken[1], "\n"), - 'endLine' => $line, - 'startFilePos' => $filePos - \strlen($lastToken[1]), - 'endFilePos' => $filePos, - ])); - } - } + $errorHandler->handleError(new Error($errorMsg, [ + 'startLine' => $token->line, + 'endLine' => $token->line, + 'startFilePos' => $token->pos, + 'endFilePos' => $token->pos, + ])); } - /** - * Fetches the next token. - * - * The available attributes are determined by the 'usedAttributes' option, which can - * be specified in the constructor. The following attributes are supported: - * - * * 'comments' => Array of PhpParser\Comment or PhpParser\Comment\Doc instances, - * representing all comments that occurred between the previous - * non-discarded token and the current one. - * * 'startLine' => Line in which the node starts. - * * 'endLine' => Line in which the node ends. - * * 'startTokenPos' => Offset into the token array of the first token in the node. - * * 'endTokenPos' => Offset into the token array of the last token in the node. - * * 'startFilePos' => Offset into the code string of the first character that is part of the node. - * * 'endFilePos' => Offset into the code string of the last character that is part of the node. - * - * @param mixed $value Variable to store token content in - * @param mixed $startAttributes Variable to store start attributes in - * @param mixed $endAttributes Variable to store end attributes in - * - * @return int Token id - */ - public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) : int { - $startAttributes = []; - $endAttributes = []; - - while (1) { - if (isset($this->tokens[++$this->pos])) { - $token = $this->tokens[$this->pos]; - } else { - // EOF token with ID 0 - $token = "\0"; - } - - if ($this->attributeStartLineUsed) { - $startAttributes['startLine'] = $this->line; - } - if ($this->attributeStartTokenPosUsed) { - $startAttributes['startTokenPos'] = $this->pos; - } - if ($this->attributeStartFilePosUsed) { - $startAttributes['startFilePos'] = $this->filePos; - } - - if (\is_string($token)) { - $value = $token; - if (isset($token[1])) { - // bug in token_get_all - $this->filePos += 2; - $id = ord('"'); - } else { - $this->filePos += 1; - $id = ord($token); - } - } elseif (!isset($this->dropTokens[$token[0]])) { - $value = $token[1]; - $id = $this->tokenMap[$token[0]]; - if (\T_CLOSE_TAG === $token[0]) { - $this->prevCloseTagHasNewline = false !== strpos($token[1], "\n") - || false !== strpos($token[1], "\r"); - } elseif (\T_INLINE_HTML === $token[0]) { - $startAttributes['hasLeadingNewline'] = $this->prevCloseTagHasNewline; - } - - $this->line += substr_count($value, "\n"); - $this->filePos += \strlen($value); - } else { - $origLine = $this->line; - $origFilePos = $this->filePos; - $this->line += substr_count($token[1], "\n"); - $this->filePos += \strlen($token[1]); - - if (\T_COMMENT === $token[0] || \T_DOC_COMMENT === $token[0]) { - if ($this->attributeCommentsUsed) { - $comment = \T_DOC_COMMENT === $token[0] - ? new Comment\Doc($token[1], - $origLine, $origFilePos, $this->pos, - $this->line, $this->filePos - 1, $this->pos) - : new Comment($token[1], - $origLine, $origFilePos, $this->pos, - $this->line, $this->filePos - 1, $this->pos); - $startAttributes['comments'][] = $comment; - } - } - continue; - } - - if ($this->attributeEndLineUsed) { - $endAttributes['endLine'] = $this->line; - } - if ($this->attributeEndTokenPosUsed) { - $endAttributes['endTokenPos'] = $this->pos; - } - if ($this->attributeEndFilePosUsed) { - $endAttributes['endFilePos'] = $this->filePos - 1; - } - - return $id; - } - - throw new \RuntimeException('Reached end of lexer loop'); - } - - /** - * Returns the token array for current code. - * - * The token array is in the same format as provided by the - * token_get_all() function and does not discard tokens (i.e. - * whitespace and comments are included). The token position - * attributes are against this token array. - * - * @return array Array of tokens in token_get_all() format - */ - public function getTokens() : array { - return $this->tokens; + private function isUnterminatedComment(Token $token): bool { + return $token->is([\T_COMMENT, \T_DOC_COMMENT]) + && substr($token->text, 0, 2) === '/*' + && substr($token->text, -2) !== '*/'; } /** - * Handles __halt_compiler() by returning the text after it. - * - * @return string Remaining text + * @param list $tokens */ - public function handleHaltCompiler() : string { - // text after T_HALT_COMPILER, still including (); - $textAfter = substr($this->code, $this->filePos); - - // ensure that it is followed by (); - // this simplifies the situation, by not allowing any comments - // in between of the tokens. - if (!preg_match('~^\s*\(\s*\)\s*(?:;|\?>\r?\n?)~', $textAfter, $matches)) { - throw new Error('__HALT_COMPILER must be followed by "();"'); - } - - // prevent the lexer from returning any further tokens - $this->pos = count($this->tokens); - - // return with (); removed - return substr($textAfter, strlen($matches[0])); - } + protected function postprocessTokens(array &$tokens, ErrorHandler $errorHandler): void { + // This function reports errors (bad characters and unterminated comments) in the token + // array, and performs certain canonicalizations: + // * Use PHP 8.1 T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG and + // T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG tokens used to disambiguate intersection types. + // * Add a sentinel token with ID 0. - private function defineCompatibilityTokens() { - static $compatTokensDefined = false; - if ($compatTokensDefined) { + $numTokens = \count($tokens); + if ($numTokens === 0) { + // Empty input edge case: Just add the sentinel token. + $tokens[] = new Token(0, "\0", 1, 0); return; } - $compatTokens = [ - // PHP 7.4 - 'T_BAD_CHARACTER', - 'T_FN', - 'T_COALESCE_EQUAL', - // PHP 8.0 - 'T_NAME_QUALIFIED', - 'T_NAME_FULLY_QUALIFIED', - 'T_NAME_RELATIVE', - 'T_MATCH', - 'T_NULLSAFE_OBJECT_OPERATOR', - 'T_ATTRIBUTE', - // PHP 8.1 - 'T_ENUM', - 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', - 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', - 'T_READONLY', - ]; - - // PHP-Parser might be used together with another library that also emulates some or all - // of these tokens. Perform a sanity-check that all already defined tokens have been - // assigned a unique ID. - $usedTokenIds = []; - foreach ($compatTokens as $token) { - if (\defined($token)) { - $tokenId = \constant($token); - $clashingToken = $usedTokenIds[$tokenId] ?? null; - if ($clashingToken !== null) { - throw new \Error(sprintf( - 'Token %s has same ID as token %s, ' . - 'you may be using a library with broken token emulation', - $token, $clashingToken - )); - } - $usedTokenIds[$tokenId] = $token; - } - } - - // Now define any tokens that have not yet been emulated. Try to assign IDs from -1 - // downwards, but skip any IDs that may already be in use. - $newTokenId = -1; - foreach ($compatTokens as $token) { - if (!\defined($token)) { - while (isset($usedTokenIds[$newTokenId])) { - $newTokenId--; - } - \define($token, $newTokenId); - $newTokenId--; + for ($i = 0; $i < $numTokens; $i++) { + $token = $tokens[$i]; + if ($token->id === \T_BAD_CHARACTER) { + $this->handleInvalidCharacter($token, $errorHandler); } - } - $compatTokensDefined = true; - } - - /** - * Creates the token map. - * - * The token map maps the PHP internal token identifiers - * to the identifiers used by the Parser. Additionally it - * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'. - * - * @return array The token map - */ - protected function createTokenMap() : array { - $tokenMap = []; - - // 256 is the minimum possible token number, as everything below - // it is an ASCII value - for ($i = 256; $i < 1000; ++$i) { - if (\T_DOUBLE_COLON === $i) { - // T_DOUBLE_COLON is equivalent to T_PAAMAYIM_NEKUDOTAYIM - $tokenMap[$i] = Tokens::T_PAAMAYIM_NEKUDOTAYIM; - } elseif(\T_OPEN_TAG_WITH_ECHO === $i) { - // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO - $tokenMap[$i] = Tokens::T_ECHO; - } elseif(\T_CLOSE_TAG === $i) { - // T_CLOSE_TAG is equivalent to ';' - $tokenMap[$i] = ord(';'); - } elseif ('UNKNOWN' !== $name = token_name($i)) { - if ('T_HASHBANG' === $name) { - // HHVM uses a special token for #! hashbang lines - $tokenMap[$i] = Tokens::T_INLINE_HTML; - } elseif (defined($name = Tokens::class . '::' . $name)) { - // Other tokens can be mapped directly - $tokenMap[$i] = constant($name); + if ($token->id === \ord('&')) { + $next = $i + 1; + while (isset($tokens[$next]) && $tokens[$next]->id === \T_WHITESPACE) { + $next++; } + $followedByVarOrVarArg = isset($tokens[$next]) && + $tokens[$next]->is([\T_VARIABLE, \T_ELLIPSIS]); + $token->id = $followedByVarOrVarArg + ? \T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG + : \T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG; } } - // HHVM uses a special token for numbers that overflow to double - if (defined('T_ONUMBER')) { - $tokenMap[\T_ONUMBER] = Tokens::T_DNUMBER; - } - // HHVM also has a separate token for the __COMPILER_HALT_OFFSET__ constant - if (defined('T_COMPILER_HALT_OFFSET')) { - $tokenMap[\T_COMPILER_HALT_OFFSET] = Tokens::T_STRING; + // Check for unterminated comment + $lastToken = $tokens[$numTokens - 1]; + if ($this->isUnterminatedComment($lastToken)) { + $errorHandler->handleError(new Error('Unterminated comment', [ + 'startLine' => $lastToken->line, + 'endLine' => $lastToken->getEndLine(), + 'startFilePos' => $lastToken->pos, + 'endFilePos' => $lastToken->getEndPos(), + ])); } - // Assign tokens for which we define compatibility constants, as token_name() does not know them. - $tokenMap[\T_FN] = Tokens::T_FN; - $tokenMap[\T_COALESCE_EQUAL] = Tokens::T_COALESCE_EQUAL; - $tokenMap[\T_NAME_QUALIFIED] = Tokens::T_NAME_QUALIFIED; - $tokenMap[\T_NAME_FULLY_QUALIFIED] = Tokens::T_NAME_FULLY_QUALIFIED; - $tokenMap[\T_NAME_RELATIVE] = Tokens::T_NAME_RELATIVE; - $tokenMap[\T_MATCH] = Tokens::T_MATCH; - $tokenMap[\T_NULLSAFE_OBJECT_OPERATOR] = Tokens::T_NULLSAFE_OBJECT_OPERATOR; - $tokenMap[\T_ATTRIBUTE] = Tokens::T_ATTRIBUTE; - $tokenMap[\T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG; - $tokenMap[\T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG; - $tokenMap[\T_ENUM] = Tokens::T_ENUM; - $tokenMap[\T_READONLY] = Tokens::T_READONLY; - - return $tokenMap; - } - - private function createIdentifierTokenMap(): array { - // Based on semi_reserved production. - return array_fill_keys([ - \T_STRING, - \T_STATIC, \T_ABSTRACT, \T_FINAL, \T_PRIVATE, \T_PROTECTED, \T_PUBLIC, \T_READONLY, - \T_INCLUDE, \T_INCLUDE_ONCE, \T_EVAL, \T_REQUIRE, \T_REQUIRE_ONCE, \T_LOGICAL_OR, \T_LOGICAL_XOR, \T_LOGICAL_AND, - \T_INSTANCEOF, \T_NEW, \T_CLONE, \T_EXIT, \T_IF, \T_ELSEIF, \T_ELSE, \T_ENDIF, \T_ECHO, \T_DO, \T_WHILE, - \T_ENDWHILE, \T_FOR, \T_ENDFOR, \T_FOREACH, \T_ENDFOREACH, \T_DECLARE, \T_ENDDECLARE, \T_AS, \T_TRY, \T_CATCH, - \T_FINALLY, \T_THROW, \T_USE, \T_INSTEADOF, \T_GLOBAL, \T_VAR, \T_UNSET, \T_ISSET, \T_EMPTY, \T_CONTINUE, \T_GOTO, - \T_FUNCTION, \T_CONST, \T_RETURN, \T_PRINT, \T_YIELD, \T_LIST, \T_SWITCH, \T_ENDSWITCH, \T_CASE, \T_DEFAULT, - \T_BREAK, \T_ARRAY, \T_CALLABLE, \T_EXTENDS, \T_IMPLEMENTS, \T_NAMESPACE, \T_TRAIT, \T_INTERFACE, \T_CLASS, - \T_CLASS_C, \T_TRAIT_C, \T_FUNC_C, \T_METHOD_C, \T_LINE, \T_FILE, \T_DIR, \T_NS_C, \T_HALT_COMPILER, \T_FN, - \T_MATCH, - ], true); + // Add sentinel token. + $tokens[] = new Token(0, "\0", $lastToken->getEndLine(), $lastToken->getEndPos()); } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php index b0929f3c..934954cd 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php @@ -18,42 +18,29 @@ use PhpParser\Lexer\TokenEmulator\ReadonlyFunctionTokenEmulator; use PhpParser\Lexer\TokenEmulator\ReadonlyTokenEmulator; use PhpParser\Lexer\TokenEmulator\ReverseEmulator; use PhpParser\Lexer\TokenEmulator\TokenEmulator; +use PhpParser\PhpVersion; +use PhpParser\Token; -class Emulative extends Lexer -{ - const PHP_7_3 = '7.3dev'; - const PHP_7_4 = '7.4dev'; - const PHP_8_0 = '8.0dev'; - const PHP_8_1 = '8.1dev'; - const PHP_8_2 = '8.2dev'; +class Emulative extends Lexer { + /** @var array{int, string, string}[] Patches used to reverse changes introduced in the code */ + private array $patches = []; - /** @var mixed[] Patches used to reverse changes introduced in the code */ - private $patches = []; + /** @var list */ + private array $emulators = []; - /** @var TokenEmulator[] */ - private $emulators = []; + private PhpVersion $targetPhpVersion; - /** @var string */ - private $targetPhpVersion; + private PhpVersion $hostPhpVersion; /** - * @param mixed[] $options Lexer options. In addition to the usual options, - * accepts a 'phpVersion' string that specifies the - * version to emulate. Defaults to newest supported. + * @param PhpVersion|null $phpVersion PHP version to emulate. Defaults to newest supported. */ - public function __construct(array $options = []) - { - $this->targetPhpVersion = $options['phpVersion'] ?? Emulative::PHP_8_2; - unset($options['phpVersion']); - - parent::__construct($options); + public function __construct(?PhpVersion $phpVersion = null) { + $this->targetPhpVersion = $phpVersion ?? PhpVersion::getNewestSupported(); + $this->hostPhpVersion = PhpVersion::getHostVersion(); $emulators = [ - new FlexibleDocStringEmulator(), - new FnTokenEmulator(), new MatchTokenEmulator(), - new CoaleseEqualTokenEmulator(), - new NumericLiteralSeparatorEmulator(), new NullsafeTokenEmulator(), new AttributeEmulator(), new EnumTokenEmulator(), @@ -68,21 +55,24 @@ class Emulative extends Lexer $emulatorPhpVersion = $emulator->getPhpVersion(); if ($this->isForwardEmulationNeeded($emulatorPhpVersion)) { $this->emulators[] = $emulator; - } else if ($this->isReverseEmulationNeeded($emulatorPhpVersion)) { + } elseif ($this->isReverseEmulationNeeded($emulatorPhpVersion)) { $this->emulators[] = new ReverseEmulator($emulator); } } } - public function startLexing(string $code, ErrorHandler $errorHandler = null) { - $emulators = array_filter($this->emulators, function($emulator) use($code) { + public function tokenize(string $code, ?ErrorHandler $errorHandler = null): array { + $emulators = array_filter($this->emulators, function ($emulator) use ($code) { return $emulator->isEmulationNeeded($code); }); if (empty($emulators)) { // Nothing to emulate, yay - parent::startLexing($code, $errorHandler); - return; + return parent::tokenize($code, $errorHandler); + } + + if ($errorHandler === null) { + $errorHandler = new ErrorHandler\Throwing(); } $this->patches = []; @@ -91,9 +81,9 @@ class Emulative extends Lexer } $collector = new ErrorHandler\Collecting(); - parent::startLexing($code, $collector); + $tokens = parent::tokenize($code, $collector); $this->sortPatches(); - $this->fixupTokens(); + $tokens = $this->fixupTokens($tokens); $errors = $collector->getErrors(); if (!empty($errors)) { @@ -104,90 +94,80 @@ class Emulative extends Lexer } foreach ($emulators as $emulator) { - $this->tokens = $emulator->emulate($code, $this->tokens); + $tokens = $emulator->emulate($code, $tokens); } + + return $tokens; } - private function isForwardEmulationNeeded(string $emulatorPhpVersion): bool { - return version_compare(\PHP_VERSION, $emulatorPhpVersion, '<') - && version_compare($this->targetPhpVersion, $emulatorPhpVersion, '>='); + private function isForwardEmulationNeeded(PhpVersion $emulatorPhpVersion): bool { + return $this->hostPhpVersion->older($emulatorPhpVersion) + && $this->targetPhpVersion->newerOrEqual($emulatorPhpVersion); } - private function isReverseEmulationNeeded(string $emulatorPhpVersion): bool { - return version_compare(\PHP_VERSION, $emulatorPhpVersion, '>=') - && version_compare($this->targetPhpVersion, $emulatorPhpVersion, '<'); + private function isReverseEmulationNeeded(PhpVersion $emulatorPhpVersion): bool { + return $this->hostPhpVersion->newerOrEqual($emulatorPhpVersion) + && $this->targetPhpVersion->older($emulatorPhpVersion); } - private function sortPatches() - { + private function sortPatches(): void { // Patches may be contributed by different emulators. // Make sure they are sorted by increasing patch position. - usort($this->patches, function($p1, $p2) { + usort($this->patches, function ($p1, $p2) { return $p1[0] <=> $p2[0]; }); } - private function fixupTokens() - { + /** + * @param list $tokens + * @return list + */ + private function fixupTokens(array $tokens): array { if (\count($this->patches) === 0) { - return; + return $tokens; } // Load first patch $patchIdx = 0; - list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; // We use a manual loop over the tokens, because we modify the array on the fly - $pos = 0; - for ($i = 0, $c = \count($this->tokens); $i < $c; $i++) { - $token = $this->tokens[$i]; - if (\is_string($token)) { - if ($patchPos === $pos) { - // Only support replacement for string tokens. - assert($patchType === 'replace'); - $this->tokens[$i] = $patchText; - - // Fetch the next patch - $patchIdx++; - if ($patchIdx >= \count($this->patches)) { - // No more patches, we're done - return; - } - list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; - } - - $pos += \strlen($token); - continue; - } - - $len = \strlen($token[1]); - $posDelta = 0; + $posDelta = 0; + $lineDelta = 0; + for ($i = 0, $c = \count($tokens); $i < $c; $i++) { + $token = $tokens[$i]; + $pos = $token->pos; + $token->pos += $posDelta; + $token->line += $lineDelta; + $localPosDelta = 0; + $len = \strlen($token->text); while ($patchPos >= $pos && $patchPos < $pos + $len) { $patchTextLen = \strlen($patchText); if ($patchType === 'remove') { if ($patchPos === $pos && $patchTextLen === $len) { // Remove token entirely - array_splice($this->tokens, $i, 1, []); + array_splice($tokens, $i, 1, []); $i--; $c--; } else { // Remove from token string - $this->tokens[$i][1] = substr_replace( - $token[1], '', $patchPos - $pos + $posDelta, $patchTextLen + $token->text = substr_replace( + $token->text, '', $patchPos - $pos + $localPosDelta, $patchTextLen ); - $posDelta -= $patchTextLen; + $localPosDelta -= $patchTextLen; } + $lineDelta -= \substr_count($patchText, "\n"); } elseif ($patchType === 'add') { // Insert into the token string - $this->tokens[$i][1] = substr_replace( - $token[1], $patchText, $patchPos - $pos + $posDelta, 0 + $token->text = substr_replace( + $token->text, $patchText, $patchPos - $pos + $localPosDelta, 0 ); - $posDelta += $patchTextLen; - } else if ($patchType === 'replace') { + $localPosDelta += $patchTextLen; + $lineDelta += \substr_count($patchText, "\n"); + } elseif ($patchType === 'replace') { // Replace inside the token string - $this->tokens[$i][1] = substr_replace( - $token[1], $patchText, $patchPos - $pos + $posDelta, $patchTextLen + $token->text = substr_replace( + $token->text, $patchText, $patchPos - $pos + $localPosDelta, $patchTextLen ); } else { assert(false); @@ -196,22 +176,17 @@ class Emulative extends Lexer // Fetch the next patch $patchIdx++; if ($patchIdx >= \count($this->patches)) { - // No more patches, we're done - return; + // No more patches. However, we still need to adjust position. + $patchPos = \PHP_INT_MAX; + break; } list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; - - // Multiple patches may apply to the same token. Reload the current one to check - // If the new patch applies - $token = $this->tokens[$i]; } - $pos += $len; + $posDelta += $localPosDelta; } - - // A patch did not apply - assert(false); + return $tokens; } /** @@ -219,7 +194,7 @@ class Emulative extends Lexer * * @param Error[] $errors */ - private function fixupErrors(array $errors) { + private function fixupErrors(array $errors): void { foreach ($errors as $error) { $attrs = $error->getAttributes(); @@ -235,7 +210,7 @@ class Emulative extends Lexer if ($patchType === 'add') { $posDelta += strlen($patchText); $lineDelta += substr_count($patchText, "\n"); - } else if ($patchType === 'remove') { + } elseif ($patchType === 'remove') { $posDelta -= strlen($patchText); $lineDelta -= substr_count($patchText, "\n"); } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php index 6776a519..2c12f33a 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php @@ -2,43 +2,36 @@ namespace PhpParser\Lexer\TokenEmulator; -use PhpParser\Lexer\Emulative; +use PhpParser\PhpVersion; +use PhpParser\Token; -final class AttributeEmulator extends TokenEmulator -{ - public function getPhpVersion(): string - { - return Emulative::PHP_8_0; +final class AttributeEmulator extends TokenEmulator { + public function getPhpVersion(): PhpVersion { + return PhpVersion::fromComponents(8, 0); } - public function isEmulationNeeded(string $code) : bool - { + public function isEmulationNeeded(string $code): bool { return strpos($code, '#[') !== false; } - public function emulate(string $code, array $tokens): array - { + public function emulate(string $code, array $tokens): array { // We need to manually iterate and manage a count because we'll change // the tokens array on the way. - $line = 1; for ($i = 0, $c = count($tokens); $i < $c; ++$i) { - if ($tokens[$i] === '#' && isset($tokens[$i + 1]) && $tokens[$i + 1] === '[') { + $token = $tokens[$i]; + if ($token->text === '#' && isset($tokens[$i + 1]) && $tokens[$i + 1]->text === '[') { array_splice($tokens, $i, 2, [ - [\T_ATTRIBUTE, '#[', $line] + new Token(\T_ATTRIBUTE, '#[', $token->line, $token->pos), ]); $c--; continue; } - if (\is_array($tokens[$i])) { - $line += substr_count($tokens[$i][1], "\n"); - } } return $tokens; } - public function reverseEmulate(string $code, array $tokens): array - { + public function reverseEmulate(string $code, array $tokens): array { // TODO return $tokens; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php deleted file mode 100644 index d91da921..00000000 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php +++ /dev/null @@ -1,47 +0,0 @@ -id === \T_WHITESPACE + && $tokens[$pos + 2]->id === \T_STRING; } -} \ No newline at end of file +} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php index f5f6805b..9cadf420 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php @@ -2,11 +2,12 @@ namespace PhpParser\Lexer\TokenEmulator; -use PhpParser\Lexer\Emulative; +use PhpParser\PhpVersion; +use PhpParser\Token; class ExplicitOctalEmulator extends TokenEmulator { - public function getPhpVersion(): string { - return Emulative::PHP_8_1; + public function getPhpVersion(): PhpVersion { + return PhpVersion::fromComponents(8, 1); } public function isEmulationNeeded(string $code): bool { @@ -15,13 +16,14 @@ class ExplicitOctalEmulator extends TokenEmulator { public function emulate(string $code, array $tokens): array { for ($i = 0, $c = count($tokens); $i < $c; ++$i) { - if ($tokens[$i][0] == \T_LNUMBER && $tokens[$i][1] === '0' && - isset($tokens[$i + 1]) && $tokens[$i + 1][0] == \T_STRING && - preg_match('/[oO][0-7]+(?:_[0-7]+)*/', $tokens[$i + 1][1]) + $token = $tokens[$i]; + if ($token->id == \T_LNUMBER && $token->text === '0' && + isset($tokens[$i + 1]) && $tokens[$i + 1]->id == \T_STRING && + preg_match('/[oO][0-7]+(?:_[0-7]+)*/', $tokens[$i + 1]->text) ) { - $tokenKind = $this->resolveIntegerOrFloatToken($tokens[$i + 1][1]); + $tokenKind = $this->resolveIntegerOrFloatToken($tokens[$i + 1]->text); array_splice($tokens, $i, 2, [ - [$tokenKind, '0' . $tokens[$i + 1][1], $tokens[$i][2]], + new Token($tokenKind, '0' . $tokens[$i + 1]->text, $token->line, $token->pos), ]); $c--; } @@ -29,8 +31,7 @@ class ExplicitOctalEmulator extends TokenEmulator { return $tokens; } - private function resolveIntegerOrFloatToken(string $str): int - { + private function resolveIntegerOrFloatToken(string $str): int { $str = substr($str, 1); $str = str_replace('_', '', $str); $num = octdec($str); @@ -41,4 +42,4 @@ class ExplicitOctalEmulator extends TokenEmulator { // Explicit octals were not legal code previously, don't bother. return $tokens; } -} \ No newline at end of file +} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php deleted file mode 100644 index c15d6271..00000000 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php +++ /dev/null @@ -1,76 +0,0 @@ -\h*)\2(?![a-zA-Z0-9_\x80-\xff])(?(?:;?[\r\n])?)/x -REGEX; - - public function getPhpVersion(): string - { - return Emulative::PHP_7_3; - } - - public function isEmulationNeeded(string $code) : bool - { - return strpos($code, '<<<') !== false; - } - - public function emulate(string $code, array $tokens): array - { - // Handled by preprocessing + fixup. - return $tokens; - } - - public function reverseEmulate(string $code, array $tokens): array - { - // Not supported. - return $tokens; - } - - public function preprocessCode(string $code, array &$patches): string { - if (!preg_match_all(self::FLEXIBLE_DOC_STRING_REGEX, $code, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE)) { - // No heredoc/nowdoc found - return $code; - } - - // Keep track of how much we need to adjust string offsets due to the modifications we - // already made - $posDelta = 0; - foreach ($matches as $match) { - $indentation = $match['indentation'][0]; - $indentationStart = $match['indentation'][1]; - - $separator = $match['separator'][0]; - $separatorStart = $match['separator'][1]; - - if ($indentation === '' && $separator !== '') { - // Ordinary heredoc/nowdoc - continue; - } - - if ($indentation !== '') { - // Remove indentation - $indentationLen = strlen($indentation); - $code = substr_replace($code, '', $indentationStart + $posDelta, $indentationLen); - $patches[] = [$indentationStart + $posDelta, 'add', $indentation]; - $posDelta -= $indentationLen; - } - - if ($separator === '') { - // Insert newline as separator - $code = substr_replace($code, "\n", $separatorStart + $posDelta, 0); - $patches[] = [$separatorStart + $posDelta, 'remove', "\n"]; - $posDelta += 1; - } - } - - return $code; - } -} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php deleted file mode 100644 index eb7e4963..00000000 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php +++ /dev/null @@ -1,23 +0,0 @@ -getKeywordString()) !== false; } - protected function isKeywordContext(array $tokens, int $pos): bool - { + /** @param Token[] $tokens */ + protected function isKeywordContext(array $tokens, int $pos): bool { $previousNonSpaceToken = $this->getPreviousNonSpaceToken($tokens, $pos); - return $previousNonSpaceToken === null || $previousNonSpaceToken[0] !== \T_OBJECT_OPERATOR; + return $previousNonSpaceToken === null || $previousNonSpaceToken->id !== \T_OBJECT_OPERATOR; } - public function emulate(string $code, array $tokens): array - { + public function emulate(string $code, array $tokens): array { $keywordString = $this->getKeywordString(); foreach ($tokens as $i => $token) { - if ($token[0] === T_STRING && strtolower($token[1]) === $keywordString + if ($token->id === T_STRING && strtolower($token->text) === $keywordString && $this->isKeywordContext($tokens, $i)) { - $tokens[$i][0] = $this->getKeywordToken(); + $token->id = $this->getKeywordToken(); } } return $tokens; } - /** - * @param mixed[] $tokens - * @return array|string|null - */ - private function getPreviousNonSpaceToken(array $tokens, int $start) - { + /** @param Token[] $tokens */ + private function getPreviousNonSpaceToken(array $tokens, int $start): ?Token { for ($i = $start - 1; $i >= 0; --$i) { - if ($tokens[$i][0] === T_WHITESPACE) { + if ($tokens[$i]->id === T_WHITESPACE) { continue; } @@ -48,12 +43,11 @@ abstract class KeywordEmulator extends TokenEmulator return null; } - public function reverseEmulate(string $code, array $tokens): array - { + public function reverseEmulate(string $code, array $tokens): array { $keywordToken = $this->getKeywordToken(); - foreach ($tokens as $i => $token) { - if ($token[0] === $keywordToken) { - $tokens[$i][0] = \T_STRING; + foreach ($tokens as $token) { + if ($token->id === $keywordToken) { + $token->id = \T_STRING; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php index 902a46df..0fa5fbc2 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php @@ -2,22 +2,18 @@ namespace PhpParser\Lexer\TokenEmulator; -use PhpParser\Lexer\Emulative; +use PhpParser\PhpVersion; -final class MatchTokenEmulator extends KeywordEmulator -{ - public function getPhpVersion(): string - { - return Emulative::PHP_8_0; +final class MatchTokenEmulator extends KeywordEmulator { + public function getPhpVersion(): PhpVersion { + return PhpVersion::fromComponents(8, 0); } - public function getKeywordString(): string - { + public function getKeywordString(): string { return 'match'; } - public function getKeywordToken(): int - { + public function getKeywordToken(): int { return \T_MATCH; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php index 1a29c676..cede96f0 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php @@ -2,65 +2,58 @@ namespace PhpParser\Lexer\TokenEmulator; -use PhpParser\Lexer\Emulative; +use PhpParser\PhpVersion; +use PhpParser\Token; -final class NullsafeTokenEmulator extends TokenEmulator -{ - public function getPhpVersion(): string - { - return Emulative::PHP_8_0; +final class NullsafeTokenEmulator extends TokenEmulator { + public function getPhpVersion(): PhpVersion { + return PhpVersion::fromComponents(8, 0); } - public function isEmulationNeeded(string $code): bool - { + public function isEmulationNeeded(string $code): bool { return strpos($code, '?->') !== false; } - public function emulate(string $code, array $tokens): array - { + public function emulate(string $code, array $tokens): array { // We need to manually iterate and manage a count because we'll change // the tokens array on the way - $line = 1; for ($i = 0, $c = count($tokens); $i < $c; ++$i) { - if ($tokens[$i] === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1][0] === \T_OBJECT_OPERATOR) { + $token = $tokens[$i]; + if ($token->text === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1]->id === \T_OBJECT_OPERATOR) { array_splice($tokens, $i, 2, [ - [\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line] + new Token(\T_NULLSAFE_OBJECT_OPERATOR, '?->', $token->line, $token->pos), ]); $c--; continue; } // Handle ?-> inside encapsed string. - if ($tokens[$i][0] === \T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1]) - && $tokens[$i - 1][0] === \T_VARIABLE - && preg_match('/^\?->([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)/', $tokens[$i][1], $matches) + if ($token->id === \T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1]) + && $tokens[$i - 1]->id === \T_VARIABLE + && preg_match('/^\?->([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)/', $token->text, $matches) ) { $replacement = [ - [\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line], - [\T_STRING, $matches[1], $line], + new Token(\T_NULLSAFE_OBJECT_OPERATOR, '?->', $token->line, $token->pos), + new Token(\T_STRING, $matches[1], $token->line, $token->pos + 3), ]; - if (\strlen($matches[0]) !== \strlen($tokens[$i][1])) { - $replacement[] = [ + $matchLen = \strlen($matches[0]); + if ($matchLen !== \strlen($token->text)) { + $replacement[] = new Token( \T_ENCAPSED_AND_WHITESPACE, - \substr($tokens[$i][1], \strlen($matches[0])), - $line - ]; + \substr($token->text, $matchLen), + $token->line, $token->pos + $matchLen + ); } array_splice($tokens, $i, 1, $replacement); $c += \count($replacement) - 1; continue; } - - if (\is_array($tokens[$i])) { - $line += substr_count($tokens[$i][1], "\n"); - } } return $tokens; } - public function reverseEmulate(string $code, array $tokens): array - { + public function reverseEmulate(string $code, array $tokens): array { // ?-> was not valid code previously, don't bother. return $tokens; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php deleted file mode 100644 index cdf793e4..00000000 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php +++ /dev/null @@ -1,105 +0,0 @@ -resolveIntegerOrFloatToken($match); - $newTokens = [[$tokenKind, $match, $token[2]]]; - - $numTokens = 1; - $len = $tokenLen; - while ($matchLen > $len) { - $nextToken = $tokens[$i + $numTokens]; - $nextTokenText = \is_array($nextToken) ? $nextToken[1] : $nextToken; - $nextTokenLen = \strlen($nextTokenText); - - $numTokens++; - if ($matchLen < $len + $nextTokenLen) { - // Split trailing characters into a partial token. - assert(is_array($nextToken), "Partial token should be an array token"); - $partialText = substr($nextTokenText, $matchLen - $len); - $newTokens[] = [$nextToken[0], $partialText, $nextToken[2]]; - break; - } - - $len += $nextTokenLen; - } - - array_splice($tokens, $i, $numTokens, $newTokens); - $c -= $numTokens - \count($newTokens); - $codeOffset += $matchLen; - } - - return $tokens; - } - - private function resolveIntegerOrFloatToken(string $str): int - { - $str = str_replace('_', '', $str); - - if (stripos($str, '0b') === 0) { - $num = bindec($str); - } elseif (stripos($str, '0x') === 0) { - $num = hexdec($str); - } elseif (stripos($str, '0') === 0 && ctype_digit($str)) { - $num = octdec($str); - } else { - $num = +$str; - } - - return is_float($num) ? T_DNUMBER : T_LNUMBER; - } - - public function reverseEmulate(string $code, array $tokens): array - { - // Numeric separators were not legal code previously, don't bother. - return $tokens; - } -} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php index e671458c..5990d7fa 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php @@ -2,7 +2,7 @@ namespace PhpParser\Lexer\TokenEmulator; -use PhpParser\Lexer\Emulative; +use PhpParser\PhpVersion; /* * In PHP 8.1, "readonly(" was special cased in the lexer in order to support functions with @@ -20,8 +20,8 @@ class ReadonlyFunctionTokenEmulator extends KeywordEmulator { return \T_READONLY; } - public function getPhpVersion(): string { - return Emulative::PHP_8_2; + public function getPhpVersion(): PhpVersion { + return PhpVersion::fromComponents(8, 2); } public function reverseEmulate(string $code, array $tokens): array { diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php index 539a2bcf..37240f79 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php @@ -2,35 +2,30 @@ namespace PhpParser\Lexer\TokenEmulator; -use PhpParser\Lexer\Emulative; +use PhpParser\PhpVersion; -final class ReadonlyTokenEmulator extends KeywordEmulator -{ - public function getPhpVersion(): string - { - return Emulative::PHP_8_1; +final class ReadonlyTokenEmulator extends KeywordEmulator { + public function getPhpVersion(): PhpVersion { + return PhpVersion::fromComponents(8, 1); } - public function getKeywordString(): string - { + public function getKeywordString(): string { return 'readonly'; } - public function getKeywordToken(): int - { + public function getKeywordToken(): int { return \T_READONLY; } - protected function isKeywordContext(array $tokens, int $pos): bool - { + protected function isKeywordContext(array $tokens, int $pos): bool { if (!parent::isKeywordContext($tokens, $pos)) { return false; } // Support "function readonly(" return !(isset($tokens[$pos + 1]) && - ($tokens[$pos + 1][0] === '(' || - ($tokens[$pos + 1][0] === \T_WHITESPACE && + ($tokens[$pos + 1]->text === '(' || + ($tokens[$pos + 1]->id === \T_WHITESPACE && isset($tokens[$pos + 2]) && - $tokens[$pos + 2][0] === '('))); + $tokens[$pos + 2]->text === '('))); } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php index 90093f66..851b5c4a 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php @@ -2,19 +2,20 @@ namespace PhpParser\Lexer\TokenEmulator; +use PhpParser\PhpVersion; + /** * Reverses emulation direction of the inner emulator. */ -final class ReverseEmulator extends TokenEmulator -{ +final class ReverseEmulator extends TokenEmulator { /** @var TokenEmulator Inner emulator */ - private $emulator; + private TokenEmulator $emulator; public function __construct(TokenEmulator $emulator) { $this->emulator = $emulator; } - public function getPhpVersion(): string { + public function getPhpVersion(): PhpVersion { return $this->emulator->getPhpVersion(); } @@ -33,4 +34,4 @@ final class ReverseEmulator extends TokenEmulator public function preprocessCode(string $code, array &$patches): string { return $code; } -} \ No newline at end of file +} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php index a020bc0f..fec2f19f 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php @@ -2,23 +2,28 @@ namespace PhpParser\Lexer\TokenEmulator; +use PhpParser\PhpVersion; +use PhpParser\Token; + /** @internal */ -abstract class TokenEmulator -{ - abstract public function getPhpVersion(): string; +abstract class TokenEmulator { + abstract public function getPhpVersion(): PhpVersion; abstract public function isEmulationNeeded(string $code): bool; /** - * @return array Modified Tokens + * @param Token[] $tokens Original tokens + * @return Token[] Modified Tokens */ abstract public function emulate(string $code, array $tokens): array; /** - * @return array Modified Tokens + * @param Token[] $tokens Original tokens + * @return Token[] Modified Tokens */ abstract public function reverseEmulate(string $code, array $tokens): array; + /** @param array{int, string, string}[] $patches */ public function preprocessCode(string $code, array &$patches): string { return $code; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Modifiers.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Modifiers.php new file mode 100644 index 00000000..b7120eea --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Modifiers.php @@ -0,0 +1,69 @@ + [aliasName => originalName]] */ - protected $aliases = []; + protected array $aliases = []; /** @var Name[][] Same as $aliases but preserving original case */ - protected $origAliases = []; + protected array $origAliases = []; /** @var ErrorHandler Error handler */ - protected $errorHandler; + protected ErrorHandler $errorHandler; /** * Create a name context. @@ -36,7 +35,7 @@ class NameContext * * @param Name|null $namespace Null is the global namespace */ - public function startNamespace(Name $namespace = null) { + public function startNamespace(?Name $namespace = null): void { $this->namespace = $namespace; $this->origAliases = $this->aliases = [ Stmt\Use_::TYPE_NORMAL => [], @@ -48,12 +47,12 @@ class NameContext /** * Add an alias / import. * - * @param Name $name Original name - * @param string $aliasName Aliased name - * @param int $type One of Stmt\Use_::TYPE_* - * @param array $errorAttrs Attributes to use to report an error + * @param Name $name Original name + * @param string $aliasName Aliased name + * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_* + * @param array $errorAttrs Attributes to use to report an error */ - public function addAlias(Name $name, string $aliasName, int $type, array $errorAttrs = []) { + public function addAlias(Name $name, string $aliasName, int $type, array $errorAttrs = []): void { // Constant names are case sensitive, everything else case insensitive if ($type === Stmt\Use_::TYPE_CONSTANT) { $aliasLookupName = $aliasName; @@ -87,7 +86,7 @@ class NameContext * * @return null|Name Namespace (or null if global namespace) */ - public function getNamespace() { + public function getNamespace(): ?Name { return $this->namespace; } @@ -95,11 +94,11 @@ class NameContext * Get resolved name. * * @param Name $name Name to resolve - * @param int $type One of Stmt\Use_::TYPE_{FUNCTION|CONSTANT} + * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_{FUNCTION|CONSTANT} * * @return null|Name Resolved name, or null if static resolution is not possible */ - public function getResolvedName(Name $name, int $type) { + public function getResolvedName(Name $name, int $type): ?Name { // don't resolve special class names if ($type === Stmt\Use_::TYPE_NORMAL && $name->isSpecialClassName()) { if (!$name->isUnqualified()) { @@ -142,7 +141,7 @@ class NameContext * * @return Name Resolved name */ - public function getResolvedClassName(Name $name) : Name { + public function getResolvedClassName(Name $name): Name { return $this->getResolvedName($name, Stmt\Use_::TYPE_NORMAL); } @@ -150,11 +149,11 @@ class NameContext * Get possible ways of writing a fully qualified name (e.g., by making use of aliases). * * @param string $name Fully-qualified name (without leading namespace separator) - * @param int $type One of Stmt\Use_::TYPE_* + * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_* * * @return Name[] Possible representations of the name */ - public function getPossibleNames(string $name, int $type) : array { + public function getPossibleNames(string $name, int $type): array { $lcName = strtolower($name); if ($type === Stmt\Use_::TYPE_NORMAL) { @@ -206,11 +205,11 @@ class NameContext * Get shortest representation of this fully-qualified name. * * @param string $name Fully-qualified name (without leading namespace separator) - * @param int $type One of Stmt\Use_::TYPE_* + * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_* * * @return Name Shortest representation */ - public function getShortName(string $name, int $type) : Name { + public function getShortName(string $name, int $type): Name { $possibleNames = $this->getPossibleNames($name, $type); // Find shortest name @@ -224,10 +223,10 @@ class NameContext } } - return $shortestName; + return $shortestName; } - private function resolveAlias(Name $name, $type) { + private function resolveAlias(Name $name, int $type): ?FullyQualified { $firstPart = $name->getFirst(); if ($name->isQualified()) { @@ -250,7 +249,7 @@ class NameContext return null; } - private function getNamespaceRelativeName(string $name, string $lcName, int $type) { + private function getNamespaceRelativeName(string $name, string $lcName, int $type): ?Name { if (null === $this->namespace) { return new Name($name); } @@ -271,7 +270,7 @@ class NameContext return null; } - private function normalizeConstName(string $name) { + private function normalizeConstName(string $name): string { $nsSep = strrpos($name, '\\'); if (false === $nsSep) { return $name; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node.php index befb2565..258e4516 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node.php @@ -2,28 +2,29 @@ namespace PhpParser; -interface Node -{ +interface Node { /** * Gets the type of the node. * * @return string Type of the node */ - public function getType() : string; + public function getType(): string; /** * Gets the names of the sub nodes. * - * @return array Names of sub nodes + * @return string[] Names of sub nodes */ - public function getSubNodeNames() : array; + public function getSubNodeNames(): array; /** * Gets line the node started in (alias of getStartLine). * * @return int Start line (or -1 if not available) + * + * @deprecated Use getStartLine() instead */ - public function getLine() : int; + public function getLine(): int; /** * Gets line the node started in. @@ -32,7 +33,7 @@ interface Node * * @return int Start line (or -1 if not available) */ - public function getStartLine() : int; + public function getStartLine(): int; /** * Gets the line the node ended in. @@ -41,7 +42,7 @@ interface Node * * @return int End line (or -1 if not available) */ - public function getEndLine() : int; + public function getEndLine(): int; /** * Gets the token offset of the first token that is part of this node. @@ -52,7 +53,7 @@ interface Node * * @return int Token start position (or -1 if not available) */ - public function getStartTokenPos() : int; + public function getStartTokenPos(): int; /** * Gets the token offset of the last token that is part of this node. @@ -63,7 +64,7 @@ interface Node * * @return int Token end position (or -1 if not available) */ - public function getEndTokenPos() : int; + public function getEndTokenPos(): int; /** * Gets the file offset of the first character that is part of this node. @@ -72,7 +73,7 @@ interface Node * * @return int File start position (or -1 if not available) */ - public function getStartFilePos() : int; + public function getStartFilePos(): int; /** * Gets the file offset of the last character that is part of this node. @@ -81,7 +82,7 @@ interface Node * * @return int File end position (or -1 if not available) */ - public function getEndFilePos() : int; + public function getEndFilePos(): int; /** * Gets all comments directly preceding this node. @@ -90,14 +91,14 @@ interface Node * * @return Comment[] */ - public function getComments() : array; + public function getComments(): array; /** * Gets the doc comment of the node. * * @return null|Comment\Doc Doc comment object or null */ - public function getDocComment(); + public function getDocComment(): ?Comment\Doc; /** * Sets the doc comment of the node. @@ -106,30 +107,24 @@ interface Node * * @param Comment\Doc $docComment Doc comment to set */ - public function setDocComment(Comment\Doc $docComment); + public function setDocComment(Comment\Doc $docComment): void; /** * Sets an attribute on a node. * - * @param string $key - * @param mixed $value + * @param mixed $value */ - public function setAttribute(string $key, $value); + public function setAttribute(string $key, $value): void; /** * Returns whether an attribute exists. - * - * @param string $key - * - * @return bool */ - public function hasAttribute(string $key) : bool; + public function hasAttribute(string $key): bool; /** * Returns the value of an attribute. * - * @param string $key - * @param mixed $default + * @param mixed $default * * @return mixed */ @@ -138,14 +133,14 @@ interface Node /** * Returns all the attributes of this node. * - * @return array + * @return array */ - public function getAttributes() : array; + public function getAttributes(): array; /** * Replaces all the attributes of this node. * - * @param array $attributes + * @param array $attributes */ - public function setAttributes(array $attributes); + public function setAttributes(array $attributes): void; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php index bcf130e6..6680efac 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php @@ -2,32 +2,30 @@ namespace PhpParser\Node; -use PhpParser\Node\VariadicPlaceholder; use PhpParser\NodeAbstract; -class Arg extends NodeAbstract -{ +class Arg extends NodeAbstract { /** @var Identifier|null Parameter name (for named parameters) */ - public $name; + public ?Identifier $name; /** @var Expr Value to pass */ - public $value; + public Expr $value; /** @var bool Whether to pass by ref */ - public $byRef; + public bool $byRef; /** @var bool Whether to unpack the argument */ - public $unpack; + public bool $unpack; /** * Constructs a function call argument node. * - * @param Expr $value Value to pass - * @param bool $byRef Whether to pass by ref - * @param bool $unpack Whether to unpack the argument - * @param array $attributes Additional attributes + * @param Expr $value Value to pass + * @param bool $byRef Whether to pass by ref + * @param bool $unpack Whether to unpack the argument + * @param array $attributes Additional attributes * @param Identifier|null $name Parameter name (for named parameters) */ public function __construct( Expr $value, bool $byRef = false, bool $unpack = false, array $attributes = [], - Identifier $name = null + ?Identifier $name = null ) { $this->attributes = $attributes; $this->name = $name; @@ -36,11 +34,11 @@ class Arg extends NodeAbstract $this->unpack = $unpack; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['name', 'value', 'byRef', 'unpack']; } - - public function getType() : string { + + public function getType(): string { return 'Arg'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php new file mode 100644 index 00000000..fa1cff52 --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php @@ -0,0 +1,43 @@ + $attributes Additional attributes + */ + public function __construct(Expr $value, ?Expr $key = null, bool $byRef = false, array $attributes = [], bool $unpack = false) { + $this->attributes = $attributes; + $this->key = $key; + $this->value = $value; + $this->byRef = $byRef; + $this->unpack = $unpack; + } + + public function getSubNodeNames(): array { + return ['key', 'value', 'byRef', 'unpack']; + } + + public function getType(): string { + return 'ArrayItem'; + } +} + +// @deprecated compatibility alias +class_alias(ArrayItem::class, Expr\ArrayItem::class); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php index c96f66e5..9d892436 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php @@ -5,18 +5,17 @@ namespace PhpParser\Node; use PhpParser\Node; use PhpParser\NodeAbstract; -class Attribute extends NodeAbstract -{ +class Attribute extends NodeAbstract { /** @var Name Attribute name */ - public $name; + public Name $name; - /** @var Arg[] Attribute arguments */ - public $args; + /** @var list Attribute arguments */ + public array $args; /** - * @param Node\Name $name Attribute name - * @param Arg[] $args Attribute arguments - * @param array $attributes Additional node attributes + * @param Node\Name $name Attribute name + * @param list $args Attribute arguments + * @param array $attributes Additional node attributes */ public function __construct(Name $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; @@ -24,11 +23,11 @@ class Attribute extends NodeAbstract $this->args = $args; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['name', 'args']; } - public function getType() : string { + public function getType(): string { return 'Attribute'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php index 613bfc41..b9eb588d 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php @@ -2,28 +2,26 @@ namespace PhpParser\Node; -use PhpParser\Node; use PhpParser\NodeAbstract; -class AttributeGroup extends NodeAbstract -{ +class AttributeGroup extends NodeAbstract { /** @var Attribute[] Attributes */ - public $attrs; + public array $attrs; /** * @param Attribute[] $attrs PHP attributes - * @param array $attributes Additional node attributes + * @param array $attributes Additional node attributes */ public function __construct(array $attrs, array $attributes = []) { $this->attributes = $attributes; $this->attrs = $attrs; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['attrs']; } - public function getType() : string { + public function getType(): string { return 'AttributeGroup'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php new file mode 100644 index 00000000..e313280b --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php @@ -0,0 +1,36 @@ + $attributes Additional attributes + */ + public function __construct(Expr\Variable $var, bool $byRef = false, array $attributes = []) { + $this->attributes = $attributes; + $this->var = $var; + $this->byRef = $byRef; + } + + public function getSubNodeNames(): array { + return ['var', 'byRef']; + } + + public function getType(): string { + return 'ClosureUse'; + } +} + +// @deprecated compatibility alias +class_alias(ClosureUse::class, Expr\ClosureUse::class); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php index 9505532a..05a5e5ee 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php @@ -9,6 +9,5 @@ use PhpParser\NodeAbstract; * * It does not provide any shared behavior and exists only for type-checking purposes. */ -abstract class ComplexType extends NodeAbstract -{ +abstract class ComplexType extends NodeAbstract { } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php index 07a74df8..8b26ae86 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php @@ -4,22 +4,21 @@ namespace PhpParser\Node; use PhpParser\NodeAbstract; -class Const_ extends NodeAbstract -{ +class Const_ extends NodeAbstract { /** @var Identifier Name */ - public $name; + public Identifier $name; /** @var Expr Value */ - public $value; + public Expr $value; /** @var Name|null Namespaced name (if using NameResolver) */ - public $namespacedName; + public ?Name $namespacedName; /** * Constructs a const node for use in class const and const statements. * - * @param string|Identifier $name Name - * @param Expr $value Value - * @param array $attributes Additional attributes + * @param string|Identifier $name Name + * @param Expr $value Value + * @param array $attributes Additional attributes */ public function __construct($name, Expr $value, array $attributes = []) { $this->attributes = $attributes; @@ -27,11 +26,11 @@ class Const_ extends NodeAbstract $this->value = $value; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['name', 'value']; } - public function getType() : string { + public function getType(): string { return 'Const'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php new file mode 100644 index 00000000..55c1fe4f --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php @@ -0,0 +1,37 @@ +value pair node. + * + * @param string|Node\Identifier $key Key + * @param Node\Expr $value Value + * @param array $attributes Additional attributes + */ + public function __construct($key, Node\Expr $value, array $attributes = []) { + $this->attributes = $attributes; + $this->key = \is_string($key) ? new Node\Identifier($key) : $key; + $this->value = $value; + } + + public function getSubNodeNames(): array { + return ['key', 'value']; + } + + public function getType(): string { + return 'DeclareItem'; + } +} + +// @deprecated compatibility alias +class_alias(DeclareItem::class, Stmt\DeclareDeclare::class); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php index 6cf4df22..8b7dbb6c 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php @@ -4,6 +4,5 @@ namespace PhpParser\Node; use PhpParser\NodeAbstract; -abstract class Expr extends NodeAbstract -{ +abstract class Expr extends NodeAbstract { } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php index 71694478..24427bbc 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php @@ -4,31 +4,30 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class ArrayDimFetch extends Expr -{ +class ArrayDimFetch extends Expr { /** @var Expr Variable */ - public $var; + public Expr $var; /** @var null|Expr Array index / dim */ - public $dim; + public ?Expr $dim; /** * Constructs an array index fetch node. * - * @param Expr $var Variable - * @param null|Expr $dim Array index / dim - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param null|Expr $dim Array index / dim + * @param array $attributes Additional attributes */ - public function __construct(Expr $var, Expr $dim = null, array $attributes = []) { + public function __construct(Expr $var, ?Expr $dim = null, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; $this->dim = $dim; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['var', 'dim']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_ArrayDimFetch'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php index 1b078f82..490ac937 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php @@ -1,41 +1,3 @@ attributes = $attributes; - $this->key = $key; - $this->value = $value; - $this->byRef = $byRef; - $this->unpack = $unpack; - } - - public function getSubNodeNames() : array { - return ['key', 'value', 'byRef', 'unpack']; - } - - public function getType() : string { - return 'Expr_ArrayItem'; - } -} +require __DIR__ . '/../ArrayItem.php'; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php index e6eaa283..3c8c9c2f 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php @@ -2,33 +2,33 @@ namespace PhpParser\Node\Expr; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; -class Array_ extends Expr -{ +class Array_ extends Expr { // For use in "kind" attribute - const KIND_LONG = 1; // array() syntax - const KIND_SHORT = 2; // [] syntax + public const KIND_LONG = 1; // array() syntax + public const KIND_SHORT = 2; // [] syntax - /** @var (ArrayItem|null)[] Items */ - public $items; + /** @var ArrayItem[] Items */ + public array $items; /** * Constructs an array node. * - * @param (ArrayItem|null)[] $items Items of the array - * @param array $attributes Additional attributes + * @param ArrayItem[] $items Items of the array + * @param array $attributes Additional attributes */ public function __construct(array $items = [], array $attributes = []) { $this->attributes = $attributes; $this->items = $items; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['items']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_Array'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php index c273fb7e..0e98ce9f 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php @@ -6,55 +6,60 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\FunctionLike; -class ArrowFunction extends Expr implements FunctionLike -{ - /** @var bool */ - public $static; +class ArrowFunction extends Expr implements FunctionLike { + /** @var bool Whether the closure is static */ + public bool $static; - /** @var bool */ - public $byRef; + /** @var bool Whether to return by reference */ + public bool $byRef; /** @var Node\Param[] */ - public $params = []; + public array $params = []; /** @var null|Node\Identifier|Node\Name|Node\ComplexType */ - public $returnType; + public ?Node $returnType; - /** @var Expr */ - public $expr; + /** @var Expr Expression body */ + public Expr $expr; /** @var Node\AttributeGroup[] */ - public $attrGroups; + public array $attrGroups; /** - * @param array $subNodes Array of the following optional subnodes: - * 'static' => false : Whether the closure is static - * 'byRef' => false : Whether to return by reference - * 'params' => array() : Parameters - * 'returnType' => null : Return type - * 'expr' => Expr : Expression body - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes + * @param array{ + * expr: Expr, + * static?: bool, + * byRef?: bool, + * params?: Node\Param[], + * returnType?: null|Node\Identifier|Node\Name|Node\ComplexType, + * attrGroups?: Node\AttributeGroup[] + * } $subNodes Array of the following subnodes: + * 'expr' : Expression body + * 'static' => false : Whether the closure is static + * 'byRef' => false : Whether to return by reference + * 'params' => array() : Parameters + * 'returnType' => null : Return type + * 'attrGroups' => array() : PHP attribute groups + * @param array $attributes Additional attributes */ - public function __construct(array $subNodes = [], array $attributes = []) { + public function __construct(array $subNodes, array $attributes = []) { $this->attributes = $attributes; $this->static = $subNodes['static'] ?? false; $this->byRef = $subNodes['byRef'] ?? false; $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->returnType = $subNodes['returnType'] ?? null; $this->expr = $subNodes['expr']; $this->attrGroups = $subNodes['attrGroups'] ?? []; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['attrGroups', 'static', 'byRef', 'params', 'returnType', 'expr']; } - public function returnsByRef() : bool { + public function returnsByRef(): bool { return $this->byRef; } - public function getParams() : array { + public function getParams(): array { return $this->params; } @@ -62,18 +67,18 @@ class ArrowFunction extends Expr implements FunctionLike return $this->returnType; } - public function getAttrGroups() : array { + public function getAttrGroups(): array { return $this->attrGroups; } /** * @return Node\Stmt\Return_[] */ - public function getStmts() : array { + public function getStmts(): array { return [new Node\Stmt\Return_($this->expr)]; } - public function getType() : string { + public function getType(): string { return 'Expr_ArrowFunction'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php index cf9e6e82..dcbf84dd 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php @@ -4,19 +4,18 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class Assign extends Expr -{ +class Assign extends Expr { /** @var Expr Variable */ - public $var; + public Expr $var; /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs an assignment node. * - * @param Expr $var Variable - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $var, Expr $expr, array $attributes = []) { $this->attributes = $attributes; @@ -24,11 +23,11 @@ class Assign extends Expr $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['var', 'expr']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_Assign'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php index bce8604f..5209a64b 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php @@ -4,19 +4,18 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -abstract class AssignOp extends Expr -{ +abstract class AssignOp extends Expr { /** @var Expr Variable */ - public $var; + public Expr $var; /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs a compound assignment operation node. * - * @param Expr $var Variable - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $var, Expr $expr, array $attributes = []) { $this->attributes = $attributes; @@ -24,7 +23,7 @@ abstract class AssignOp extends Expr $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['var', 'expr']; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php index 420284cd..4f3623fb 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\AssignOp; -class BitwiseAnd extends AssignOp -{ - public function getType() : string { +class BitwiseAnd extends AssignOp { + public function getType(): string { return 'Expr_AssignOp_BitwiseAnd'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php index 481ad3bb..23efe107 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\AssignOp; -class BitwiseOr extends AssignOp -{ - public function getType() : string { +class BitwiseOr extends AssignOp { + public function getType(): string { return 'Expr_AssignOp_BitwiseOr'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php index f41d4c8e..24be7303 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\AssignOp; -class BitwiseXor extends AssignOp -{ - public function getType() : string { +class BitwiseXor extends AssignOp { + public function getType(): string { return 'Expr_AssignOp_BitwiseXor'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php index c0e9b316..b78ea901 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\AssignOp; -class Coalesce extends AssignOp -{ - public function getType() : string { +class Coalesce extends AssignOp { + public function getType(): string { return 'Expr_AssignOp_Coalesce'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php index ac168207..f419e2ea 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\AssignOp; -class Concat extends AssignOp -{ - public function getType() : string { +class Concat extends AssignOp { + public function getType(): string { return 'Expr_AssignOp_Concat'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php index f1fcfc09..98b04727 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\AssignOp; -class Div extends AssignOp -{ - public function getType() : string { +class Div extends AssignOp { + public function getType(): string { return 'Expr_AssignOp_Div'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php index 82ef4517..20765993 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\AssignOp; -class Minus extends AssignOp -{ - public function getType() : string { +class Minus extends AssignOp { + public function getType(): string { return 'Expr_AssignOp_Minus'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php index be3b4a0a..526430e2 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\AssignOp; -class Mod extends AssignOp -{ - public function getType() : string { +class Mod extends AssignOp { + public function getType(): string { return 'Expr_AssignOp_Mod'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php index 5c196c3b..81241ac9 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\AssignOp; -class Mul extends AssignOp -{ - public function getType() : string { +class Mul extends AssignOp { + public function getType(): string { return 'Expr_AssignOp_Mul'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php index dd101c61..0bca8cc1 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\AssignOp; -class Plus extends AssignOp -{ - public function getType() : string { +class Plus extends AssignOp { + public function getType(): string { return 'Expr_AssignOp_Plus'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php index 5e1307d1..4e3279c4 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\AssignOp; -class Pow extends AssignOp -{ - public function getType() : string { +class Pow extends AssignOp { + public function getType(): string { return 'Expr_AssignOp_Pow'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php index b8f88269..7a5dd60c 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\AssignOp; -class ShiftLeft extends AssignOp -{ - public function getType() : string { +class ShiftLeft extends AssignOp { + public function getType(): string { return 'Expr_AssignOp_ShiftLeft'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php index e0cc67b7..4f270864 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\AssignOp; -class ShiftRight extends AssignOp -{ - public function getType() : string { +class ShiftRight extends AssignOp { + public function getType(): string { return 'Expr_AssignOp_ShiftRight'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php index de3c644c..9714650a 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php @@ -4,19 +4,18 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class AssignRef extends Expr -{ +class AssignRef extends Expr { /** @var Expr Variable reference is assigned to */ - public $var; + public Expr $var; /** @var Expr Variable which is referenced */ - public $expr; + public Expr $expr; /** * Constructs an assignment node. * - * @param Expr $var Variable - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $var, Expr $expr, array $attributes = []) { $this->attributes = $attributes; @@ -24,11 +23,11 @@ class AssignRef extends Expr $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['var', 'expr']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_AssignRef'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php index d9c582b0..1b92bd4f 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php @@ -4,19 +4,18 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -abstract class BinaryOp extends Expr -{ +abstract class BinaryOp extends Expr { /** @var Expr The left hand side expression */ - public $left; + public Expr $left; /** @var Expr The right hand side expression */ - public $right; + public Expr $right; /** * Constructs a binary operator node. * - * @param Expr $left The left hand side expression - * @param Expr $right The right hand side expression - * @param array $attributes Additional attributes + * @param Expr $left The left hand side expression + * @param Expr $right The right hand side expression + * @param array $attributes Additional attributes */ public function __construct(Expr $left, Expr $right, array $attributes = []) { $this->attributes = $attributes; @@ -24,7 +23,7 @@ abstract class BinaryOp extends Expr $this->right = $right; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['left', 'right']; } @@ -33,8 +32,6 @@ abstract class BinaryOp extends Expr * * In the case there are multiple possible sigils for an operator, this method does not * necessarily return the one used in the parsed code. - * - * @return string */ - abstract public function getOperatorSigil() : string; + abstract public function getOperatorSigil(): string; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php index d907393b..5930c541 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class BitwiseAnd extends BinaryOp -{ - public function getOperatorSigil() : string { +class BitwiseAnd extends BinaryOp { + public function getOperatorSigil(): string { return '&'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_BitwiseAnd'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php index d92069f3..adcefd0e 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class BitwiseOr extends BinaryOp -{ - public function getOperatorSigil() : string { +class BitwiseOr extends BinaryOp { + public function getOperatorSigil(): string { return '|'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_BitwiseOr'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php index 40fa94f8..92bca609 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class BitwiseXor extends BinaryOp -{ - public function getOperatorSigil() : string { +class BitwiseXor extends BinaryOp { + public function getOperatorSigil(): string { return '^'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_BitwiseXor'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php index 4c3c9e9b..82a6b5a2 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class BooleanAnd extends BinaryOp -{ - public function getOperatorSigil() : string { +class BooleanAnd extends BinaryOp { + public function getOperatorSigil(): string { return '&&'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_BooleanAnd'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php index 5ad41727..739edafa 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class BooleanOr extends BinaryOp -{ - public function getOperatorSigil() : string { +class BooleanOr extends BinaryOp { + public function getOperatorSigil(): string { return '||'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_BooleanOr'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php index b8cf6f45..ab75a23e 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class Coalesce extends BinaryOp -{ - public function getOperatorSigil() : string { +class Coalesce extends BinaryOp { + public function getOperatorSigil(): string { return '??'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_Coalesce'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php index 9a8d9873..a730f576 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class Concat extends BinaryOp -{ - public function getOperatorSigil() : string { +class Concat extends BinaryOp { + public function getOperatorSigil(): string { return '.'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_Concat'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php index d38df0db..ba1f629d 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class Div extends BinaryOp -{ - public function getOperatorSigil() : string { +class Div extends BinaryOp { + public function getOperatorSigil(): string { return '/'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_Div'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php index e7b11dc8..28bde812 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class Equal extends BinaryOp -{ - public function getOperatorSigil() : string { +class Equal extends BinaryOp { + public function getOperatorSigil(): string { return '=='; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_Equal'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php index da01f7a1..6215c50b 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class Greater extends BinaryOp -{ - public function getOperatorSigil() : string { +class Greater extends BinaryOp { + public function getOperatorSigil(): string { return '>'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_Greater'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php index d677502c..4d440b10 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class GreaterOrEqual extends BinaryOp -{ - public function getOperatorSigil() : string { +class GreaterOrEqual extends BinaryOp { + public function getOperatorSigil(): string { return '>='; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_GreaterOrEqual'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php index 3d96285c..e25d17cd 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class Identical extends BinaryOp -{ - public function getOperatorSigil() : string { +class Identical extends BinaryOp { + public function getOperatorSigil(): string { return '==='; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_Identical'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php index 2a3afd54..9b9ea1f6 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class LogicalAnd extends BinaryOp -{ - public function getOperatorSigil() : string { +class LogicalAnd extends BinaryOp { + public function getOperatorSigil(): string { return 'and'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_LogicalAnd'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php index 21507dba..a6235ee7 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class LogicalOr extends BinaryOp -{ - public function getOperatorSigil() : string { +class LogicalOr extends BinaryOp { + public function getOperatorSigil(): string { return 'or'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_LogicalOr'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php index 261c6a91..7ff2fdb0 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class LogicalXor extends BinaryOp -{ - public function getOperatorSigil() : string { +class LogicalXor extends BinaryOp { + public function getOperatorSigil(): string { return 'xor'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_LogicalXor'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php index 54b3c6e9..8924c55e 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class Minus extends BinaryOp -{ - public function getOperatorSigil() : string { +class Minus extends BinaryOp { + public function getOperatorSigil(): string { return '-'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_Minus'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php index 10340404..56619de1 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class Mod extends BinaryOp -{ - public function getOperatorSigil() : string { +class Mod extends BinaryOp { + public function getOperatorSigil(): string { return '%'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_Mod'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php index b82d0b2f..98745fbe 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class Mul extends BinaryOp -{ - public function getOperatorSigil() : string { +class Mul extends BinaryOp { + public function getOperatorSigil(): string { return '*'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_Mul'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php index 51075da5..72d03c45 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class NotEqual extends BinaryOp -{ - public function getOperatorSigil() : string { +class NotEqual extends BinaryOp { + public function getOperatorSigil(): string { return '!='; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_NotEqual'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php index fa4050e0..e9befd80 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class NotIdentical extends BinaryOp -{ - public function getOperatorSigil() : string { +class NotIdentical extends BinaryOp { + public function getOperatorSigil(): string { return '!=='; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_NotIdentical'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php index 62f02299..fe34b84c 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class Plus extends BinaryOp -{ - public function getOperatorSigil() : string { +class Plus extends BinaryOp { + public function getOperatorSigil(): string { return '+'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_Plus'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php index 572a1e8e..e4e641cb 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class Pow extends BinaryOp -{ - public function getOperatorSigil() : string { +class Pow extends BinaryOp { + public function getOperatorSigil(): string { return '**'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_Pow'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php index 4e70b4ef..22c6260f 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class ShiftLeft extends BinaryOp -{ - public function getOperatorSigil() : string { +class ShiftLeft extends BinaryOp { + public function getOperatorSigil(): string { return '<<'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_ShiftLeft'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php index 45acbd04..cd42644a 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class ShiftRight extends BinaryOp -{ - public function getOperatorSigil() : string { +class ShiftRight extends BinaryOp { + public function getOperatorSigil(): string { return '>>'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_ShiftRight'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php index 3cb8e7e0..01e9b231 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class Smaller extends BinaryOp -{ - public function getOperatorSigil() : string { +class Smaller extends BinaryOp { + public function getOperatorSigil(): string { return '<'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_Smaller'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php index 83e8e214..2c88f383 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class SmallerOrEqual extends BinaryOp -{ - public function getOperatorSigil() : string { +class SmallerOrEqual extends BinaryOp { + public function getOperatorSigil(): string { return '<='; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_SmallerOrEqual'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php index 8c6d787f..974ec7dd 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp; -class Spaceship extends BinaryOp -{ - public function getOperatorSigil() : string { +class Spaceship extends BinaryOp { + public function getOperatorSigil(): string { return '<=>'; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BinaryOp_Spaceship'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php index ed44984b..b7175a7a 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class BitwiseNot extends Expr -{ +class BitwiseNot extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs a bitwise not node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BitwiseNot'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php index bf27e9f6..c66d2332 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class BooleanNot extends Expr -{ +class BooleanNot extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs a boolean not node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_BooleanNot'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php index 78e1cf34..2af2245b 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php @@ -19,12 +19,8 @@ abstract class CallLike extends Expr { * Returns whether this call expression is actually a first class callable. */ public function isFirstClassCallable(): bool { - foreach ($this->getRawArgs() as $arg) { - if ($arg instanceof VariadicPlaceholder) { - return true; - } - } - return false; + $rawArgs = $this->getRawArgs(); + return count($rawArgs) === 1 && current($rawArgs) instanceof VariadicPlaceholder; } /** @@ -36,4 +32,4 @@ abstract class CallLike extends Expr { assert(!$this->isFirstClassCallable()); return $this->getRawArgs(); } -} \ No newline at end of file +} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php index 36769d4f..c2751de4 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php @@ -4,23 +4,22 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -abstract class Cast extends Expr -{ +abstract class Cast extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs a cast node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php index 57cc473b..471cb824 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\Cast; use PhpParser\Node\Expr\Cast; -class Array_ extends Cast -{ - public function getType() : string { +class Array_ extends Cast { + public function getType(): string { return 'Expr_Cast_Array'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php index 04eb4af5..3aed497c 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\Cast; use PhpParser\Node\Expr\Cast; -class Bool_ extends Cast -{ - public function getType() : string { +class Bool_ extends Cast { + public function getType(): string { return 'Expr_Cast_Bool'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php index 891ba5f8..e7f5cd9b 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php @@ -4,14 +4,13 @@ namespace PhpParser\Node\Expr\Cast; use PhpParser\Node\Expr\Cast; -class Double extends Cast -{ +class Double extends Cast { // For use in "kind" attribute - const KIND_DOUBLE = 1; // "double" syntax - const KIND_FLOAT = 2; // "float" syntax - const KIND_REAL = 3; // "real" syntax + public const KIND_DOUBLE = 1; // "double" syntax + public const KIND_FLOAT = 2; // "float" syntax + public const KIND_REAL = 3; // "real" syntax - public function getType() : string { + public function getType(): string { return 'Expr_Cast_Double'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php index 01ed594b..20744b9b 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\Cast; use PhpParser\Node\Expr\Cast; -class Int_ extends Cast -{ - public function getType() : string { +class Int_ extends Cast { + public function getType(): string { return 'Expr_Cast_Int'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php index 163752be..dffa9e54 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\Cast; use PhpParser\Node\Expr\Cast; -class Object_ extends Cast -{ - public function getType() : string { +class Object_ extends Cast { + public function getType(): string { return 'Expr_Cast_Object'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php index b3d99270..c7605ab8 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\Cast; use PhpParser\Node\Expr\Cast; -class String_ extends Cast -{ - public function getType() : string { +class String_ extends Cast { + public function getType(): string { return 'Expr_Cast_String'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php index accda3e4..cb709a43 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php @@ -4,9 +4,8 @@ namespace PhpParser\Node\Expr\Cast; use PhpParser\Node\Expr\Cast; -class Unset_ extends Cast -{ - public function getType() : string { +class Unset_ extends Cast { + public function getType(): string { return 'Expr_Cast_Unset'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php index 0c45ffb4..7fdd40e4 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php @@ -2,35 +2,35 @@ namespace PhpParser\Node\Expr; +use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Identifier; use PhpParser\Node\Name; -class ClassConstFetch extends Expr -{ +class ClassConstFetch extends Expr { /** @var Name|Expr Class name */ - public $class; + public Node $class; /** @var Identifier|Expr|Error Constant name */ - public $name; + public Node $name; /** * Constructs a class const fetch node. * - * @param Name|Expr $class Class name - * @param string|Identifier|Expr|Error $name Constant name - * @param array $attributes Additional attributes + * @param Name|Expr $class Class name + * @param string|Identifier|Expr|Error $name Constant name + * @param array $attributes Additional attributes */ - public function __construct($class, $name, array $attributes = []) { + public function __construct(Node $class, $name, array $attributes = []) { $this->attributes = $attributes; $this->class = $class; $this->name = \is_string($name) ? new Identifier($name) : $name; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['class', 'name']; } - public function getType() : string { + public function getType(): string { return 'Expr_ClassConstFetch'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php index db216b8f..d85bc9ab 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class Clone_ extends Expr -{ +class Clone_ extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs a clone node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_Clone'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php index 56ddea6a..0680446f 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php @@ -3,38 +3,46 @@ namespace PhpParser\Node\Expr; use PhpParser\Node; +use PhpParser\Node\ClosureUse; use PhpParser\Node\Expr; use PhpParser\Node\FunctionLike; -class Closure extends Expr implements FunctionLike -{ +class Closure extends Expr implements FunctionLike { /** @var bool Whether the closure is static */ - public $static; + public bool $static; /** @var bool Whether to return by reference */ - public $byRef; + public bool $byRef; /** @var Node\Param[] Parameters */ - public $params; + public array $params; /** @var ClosureUse[] use()s */ - public $uses; + public array $uses; /** @var null|Node\Identifier|Node\Name|Node\ComplexType Return type */ - public $returnType; + public ?Node $returnType; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; /** * Constructs a lambda function node. * - * @param array $subNodes Array of the following optional subnodes: - * 'static' => false : Whether the closure is static - * 'byRef' => false : Whether to return by reference - * 'params' => array(): Parameters - * 'uses' => array(): use()s - * 'returnType' => null : Return type - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attributes groups - * @param array $attributes Additional attributes + * @param array{ + * static?: bool, + * byRef?: bool, + * params?: Node\Param[], + * uses?: ClosureUse[], + * returnType?: null|Node\Identifier|Node\Name|Node\ComplexType, + * stmts?: Node\Stmt[], + * attrGroups?: Node\AttributeGroup[], + * } $subNodes Array of the following optional subnodes: + * 'static' => false : Whether the closure is static + * 'byRef' => false : Whether to return by reference + * 'params' => array(): Parameters + * 'uses' => array(): use()s + * 'returnType' => null : Return type + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attributes groups + * @param array $attributes Additional attributes */ public function __construct(array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; @@ -42,21 +50,20 @@ class Closure extends Expr implements FunctionLike $this->byRef = $subNodes['byRef'] ?? false; $this->params = $subNodes['params'] ?? []; $this->uses = $subNodes['uses'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->returnType = $subNodes['returnType'] ?? null; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['attrGroups', 'static', 'byRef', 'params', 'uses', 'returnType', 'stmts']; } - public function returnsByRef() : bool { + public function returnsByRef(): bool { return $this->byRef; } - public function getParams() : array { + public function getParams(): array { return $this->params; } @@ -65,15 +72,15 @@ class Closure extends Expr implements FunctionLike } /** @return Node\Stmt[] */ - public function getStmts() : array { + public function getStmts(): array { return $this->stmts; } - public function getAttrGroups() : array { + public function getAttrGroups(): array { return $this->attrGroups; } - public function getType() : string { + public function getType(): string { return 'Expr_Closure'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php index 2b8a0966..681ff317 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php @@ -1,34 +1,3 @@ attributes = $attributes; - $this->var = $var; - $this->byRef = $byRef; - } - - public function getSubNodeNames() : array { - return ['var', 'byRef']; - } - - public function getType() : string { - return 'Expr_ClosureUse'; - } -} +require __DIR__ . '/../ClosureUse.php'; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php index 14ebd16b..47191c5f 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php @@ -5,27 +5,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; use PhpParser\Node\Name; -class ConstFetch extends Expr -{ +class ConstFetch extends Expr { /** @var Name Constant name */ - public $name; + public Name $name; /** * Constructs a const fetch node. * - * @param Name $name Constant name - * @param array $attributes Additional attributes + * @param Name $name Constant name + * @param array $attributes Additional attributes */ public function __construct(Name $name, array $attributes = []) { $this->attributes = $attributes; $this->name = $name; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['name']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_ConstFetch'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php index 4042ec93..d2f30506 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class Empty_ extends Expr -{ +class Empty_ extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs an empty() node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_Empty'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php index 1637f3ae..43010ac4 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php @@ -10,22 +10,21 @@ use PhpParser\Node\Expr; * An error node may be placed at a position where an expression is required, but an error occurred. * Error nodes will not be present if the parser is run in throwOnError mode (the default). */ -class Error extends Expr -{ +class Error extends Expr { /** * Constructs an error node. * - * @param array $attributes Additional attributes + * @param array $attributes Additional attributes */ public function __construct(array $attributes = []) { $this->attributes = $attributes; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return []; } - - public function getType() : string { + + public function getType(): string { return 'Expr_Error'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php index c44ff6f9..32625a23 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class ErrorSuppress extends Expr -{ +class ErrorSuppress extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs an error suppress node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_ErrorSuppress'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php index 85685474..5120b1b4 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class Eval_ extends Expr -{ +class Eval_ extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs an eval() node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_Eval'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php index b88a8f7e..cf002466 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php @@ -4,31 +4,30 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class Exit_ extends Expr -{ +class Exit_ extends Expr { /* For use in "kind" attribute */ - const KIND_EXIT = 1; - const KIND_DIE = 2; + public const KIND_EXIT = 1; + public const KIND_DIE = 2; /** @var null|Expr Expression */ - public $expr; + public ?Expr $expr; /** * Constructs an exit() node. * - * @param null|Expr $expr Expression - * @param array $attributes Additional attributes + * @param null|Expr $expr Expression + * @param array $attributes Additional attributes */ - public function __construct(Expr $expr = null, array $attributes = []) { + public function __construct(?Expr $expr = null, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_Exit'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php index 2de4d0dd..0b85840d 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php @@ -5,31 +5,30 @@ namespace PhpParser\Node\Expr; use PhpParser\Node; use PhpParser\Node\Expr; -class FuncCall extends CallLike -{ +class FuncCall extends CallLike { /** @var Node\Name|Expr Function name */ - public $name; + public Node $name; /** @var array Arguments */ - public $args; + public array $args; /** * Constructs a function call node. * - * @param Node\Name|Expr $name Function name - * @param array $args Arguments - * @param array $attributes Additional attributes + * @param Node\Name|Expr $name Function name + * @param array $args Arguments + * @param array $attributes Additional attributes */ - public function __construct($name, array $args = [], array $attributes = []) { + public function __construct(Node $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->name = $name; $this->args = $args; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['name', 'args']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_FuncCall'; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php index 07ce5968..e1187b19 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php @@ -4,24 +4,23 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class Include_ extends Expr -{ - const TYPE_INCLUDE = 1; - const TYPE_INCLUDE_ONCE = 2; - const TYPE_REQUIRE = 3; - const TYPE_REQUIRE_ONCE = 4; +class Include_ extends Expr { + public const TYPE_INCLUDE = 1; + public const TYPE_INCLUDE_ONCE = 2; + public const TYPE_REQUIRE = 3; + public const TYPE_REQUIRE_ONCE = 4; /** @var Expr Expression */ - public $expr; + public Expr $expr; /** @var int Type of include */ - public $type; + public int $type; /** * Constructs an include node. * - * @param Expr $expr Expression - * @param int $type Type of include - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param int $type Type of include + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, int $type, array $attributes = []) { $this->attributes = $attributes; @@ -29,11 +28,11 @@ class Include_ extends Expr $this->type = $type; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr', 'type']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_Include'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php index 9000d47b..a2783cb3 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php @@ -2,34 +2,34 @@ namespace PhpParser\Node\Expr; +use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Name; -class Instanceof_ extends Expr -{ +class Instanceof_ extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** @var Name|Expr Class name */ - public $class; + public Node $class; /** * Constructs an instanceof check node. * - * @param Expr $expr Expression - * @param Name|Expr $class Class name - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param Name|Expr $class Class name + * @param array $attributes Additional attributes */ - public function __construct(Expr $expr, $class, array $attributes = []) { + public function __construct(Expr $expr, Node $class, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; $this->class = $class; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr', 'class']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_Instanceof'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php index 76b73875..4f80fff7 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class Isset_ extends Expr -{ +class Isset_ extends Expr { /** @var Expr[] Variables */ - public $vars; + public array $vars; /** * Constructs an array node. * - * @param Expr[] $vars Variables - * @param array $attributes Additional attributes + * @param Expr[] $vars Variables + * @param array $attributes Additional attributes */ public function __construct(array $vars, array $attributes = []) { $this->attributes = $attributes; $this->vars = $vars; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['vars']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_Isset'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php index c27a27b9..496b7b38 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php @@ -2,29 +2,33 @@ namespace PhpParser\Node\Expr; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; -class List_ extends Expr -{ +class List_ extends Expr { + // For use in "kind" attribute + public const KIND_LIST = 1; // list() syntax + public const KIND_ARRAY = 2; // [] syntax + /** @var (ArrayItem|null)[] List of items to assign to */ - public $items; + public array $items; /** * Constructs a list() destructuring node. * - * @param (ArrayItem|null)[] $items List of items to assign to - * @param array $attributes Additional attributes + * @param (ArrayItem|null)[] $items List of items to assign to + * @param array $attributes Additional attributes */ public function __construct(array $items, array $attributes = []) { $this->attributes = $attributes; $this->items = $items; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['items']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_List'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php index 2455a302..cd028a2d 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php @@ -5,15 +5,16 @@ namespace PhpParser\Node\Expr; use PhpParser\Node; use PhpParser\Node\MatchArm; -class Match_ extends Node\Expr -{ - /** @var Node\Expr */ - public $cond; +class Match_ extends Node\Expr { + /** @var Node\Expr Condition */ + public Node\Expr $cond; /** @var MatchArm[] */ - public $arms; + public array $arms; /** + * @param Node\Expr $cond Condition * @param MatchArm[] $arms + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $arms = [], array $attributes = []) { $this->attributes = $attributes; @@ -21,11 +22,11 @@ class Match_ extends Node\Expr $this->arms = $arms; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['cond', 'arms']; } - public function getType() : string { + public function getType(): string { return 'Expr_Match'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php index 49ca4835..2703c75d 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php @@ -2,27 +2,27 @@ namespace PhpParser\Node\Expr; +use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr; use PhpParser\Node\Identifier; use PhpParser\Node\VariadicPlaceholder; -class MethodCall extends CallLike -{ +class MethodCall extends CallLike { /** @var Expr Variable holding object */ - public $var; + public Expr $var; /** @var Identifier|Expr Method name */ - public $name; + public Node $name; /** @var array Arguments */ - public $args; + public array $args; /** * Constructs a function call node. * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Method name - * @param array $args Arguments - * @param array $attributes Additional attributes + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Method name + * @param array $args Arguments + * @param array $attributes Additional attributes */ public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; @@ -31,11 +31,11 @@ class MethodCall extends CallLike $this->args = $args; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['var', 'name', 'args']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_MethodCall'; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php index e2bb6492..eedaaa1e 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php @@ -7,31 +7,30 @@ use PhpParser\Node\Arg; use PhpParser\Node\Expr; use PhpParser\Node\VariadicPlaceholder; -class New_ extends CallLike -{ +class New_ extends CallLike { /** @var Node\Name|Expr|Node\Stmt\Class_ Class name */ - public $class; + public Node $class; /** @var array Arguments */ - public $args; + public array $args; /** * Constructs a function call node. * - * @param Node\Name|Expr|Node\Stmt\Class_ $class Class name (or class node for anonymous classes) - * @param array $args Arguments - * @param array $attributes Additional attributes + * @param Node\Name|Expr|Node\Stmt\Class_ $class Class name (or class node for anonymous classes) + * @param array $args Arguments + * @param array $attributes Additional attributes */ - public function __construct($class, array $args = [], array $attributes = []) { + public function __construct(Node $class, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->class = $class; $this->args = $args; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['class', 'args']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_New'; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php index 07a571fd..a151f715 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php @@ -2,27 +2,27 @@ namespace PhpParser\Node\Expr; +use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr; use PhpParser\Node\Identifier; use PhpParser\Node\VariadicPlaceholder; -class NullsafeMethodCall extends CallLike -{ +class NullsafeMethodCall extends CallLike { /** @var Expr Variable holding object */ - public $var; + public Expr $var; /** @var Identifier|Expr Method name */ - public $name; + public Node $name; /** @var array Arguments */ - public $args; + public array $args; /** * Constructs a nullsafe method call node. * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Method name - * @param array $args Arguments - * @param array $attributes Additional attributes + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Method name + * @param array $args Arguments + * @param array $attributes Additional attributes */ public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; @@ -31,11 +31,11 @@ class NullsafeMethodCall extends CallLike $this->args = $args; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['var', 'name', 'args']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_NullsafeMethodCall'; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php index 9317eb3b..6f73a16d 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php @@ -2,22 +2,22 @@ namespace PhpParser\Node\Expr; +use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Identifier; -class NullsafePropertyFetch extends Expr -{ +class NullsafePropertyFetch extends Expr { /** @var Expr Variable holding object */ - public $var; + public Expr $var; /** @var Identifier|Expr Property name */ - public $name; + public Node $name; /** * Constructs a nullsafe property fetch node. * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Property name - * @param array $attributes Additional attributes + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Property name + * @param array $attributes Additional attributes */ public function __construct(Expr $var, $name, array $attributes = []) { $this->attributes = $attributes; @@ -25,11 +25,11 @@ class NullsafePropertyFetch extends Expr $this->name = \is_string($name) ? new Identifier($name) : $name; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['var', 'name']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_NullsafePropertyFetch'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php index 94d6c296..3dca8fdc 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class PostDec extends Expr -{ +class PostDec extends Expr { /** @var Expr Variable */ - public $var; + public Expr $var; /** * Constructs a post decrement node. * - * @param Expr $var Variable - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param array $attributes Additional attributes */ public function __construct(Expr $var, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['var']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_PostDec'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php index 005c443a..bc990c30 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class PostInc extends Expr -{ +class PostInc extends Expr { /** @var Expr Variable */ - public $var; + public Expr $var; /** * Constructs a post increment node. * - * @param Expr $var Variable - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param array $attributes Additional attributes */ public function __construct(Expr $var, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['var']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_PostInc'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php index a5ca685a..2f168730 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class PreDec extends Expr -{ +class PreDec extends Expr { /** @var Expr Variable */ - public $var; + public Expr $var; /** * Constructs a pre decrement node. * - * @param Expr $var Variable - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param array $attributes Additional attributes */ public function __construct(Expr $var, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['var']; } - public function getType() : string { + public function getType(): string { return 'Expr_PreDec'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php index 0986c447..fd455f55 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class PreInc extends Expr -{ +class PreInc extends Expr { /** @var Expr Variable */ - public $var; + public Expr $var; /** * Constructs a pre increment node. * - * @param Expr $var Variable - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param array $attributes Additional attributes */ public function __construct(Expr $var, array $attributes = []) { $this->attributes = $attributes; $this->var = $var; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['var']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_PreInc'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php index 2d43c2ac..60574760 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class Print_ extends Expr -{ +class Print_ extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs an print() node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_Print'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php index 4281f31c..8c416a8c 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php @@ -2,22 +2,22 @@ namespace PhpParser\Node\Expr; +use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Identifier; -class PropertyFetch extends Expr -{ +class PropertyFetch extends Expr { /** @var Expr Variable holding object */ - public $var; + public Expr $var; /** @var Identifier|Expr Property name */ - public $name; + public Node $name; /** * Constructs a function call node. * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Property name - * @param array $attributes Additional attributes + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Property name + * @param array $attributes Additional attributes */ public function __construct(Expr $var, $name, array $attributes = []) { $this->attributes = $attributes; @@ -25,11 +25,11 @@ class PropertyFetch extends Expr $this->name = \is_string($name) ? new Identifier($name) : $name; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['var', 'name']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_PropertyFetch'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php index 537a7cc8..e4003512 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php @@ -3,28 +3,28 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; +use PhpParser\Node\InterpolatedStringPart; -class ShellExec extends Expr -{ - /** @var array Encapsed string array */ - public $parts; +class ShellExec extends Expr { + /** @var (Expr|InterpolatedStringPart)[] Interpolated string array */ + public array $parts; /** * Constructs a shell exec (backtick) node. * - * @param array $parts Encapsed string array - * @param array $attributes Additional attributes + * @param (Expr|InterpolatedStringPart)[] $parts Interpolated string array + * @param array $attributes Additional attributes */ public function __construct(array $parts, array $attributes = []) { $this->attributes = $attributes; $this->parts = $parts; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['parts']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_ShellExec'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php index d0d099c4..707f34b6 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php @@ -8,35 +8,34 @@ use PhpParser\Node\Expr; use PhpParser\Node\Identifier; use PhpParser\Node\VariadicPlaceholder; -class StaticCall extends CallLike -{ +class StaticCall extends CallLike { /** @var Node\Name|Expr Class name */ - public $class; + public Node $class; /** @var Identifier|Expr Method name */ - public $name; + public Node $name; /** @var array Arguments */ - public $args; + public array $args; /** * Constructs a static method call node. * - * @param Node\Name|Expr $class Class name - * @param string|Identifier|Expr $name Method name - * @param array $args Arguments - * @param array $attributes Additional attributes + * @param Node\Name|Expr $class Class name + * @param string|Identifier|Expr $name Method name + * @param array $args Arguments + * @param array $attributes Additional attributes */ - public function __construct($class, $name, array $args = [], array $attributes = []) { + public function __construct(Node $class, $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->class = $class; $this->name = \is_string($name) ? new Identifier($name) : $name; $this->args = $args; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['class', 'name', 'args']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_StaticCall'; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php index 1ee1a25e..4836a65b 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php @@ -2,35 +2,35 @@ namespace PhpParser\Node\Expr; +use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Name; use PhpParser\Node\VarLikeIdentifier; -class StaticPropertyFetch extends Expr -{ +class StaticPropertyFetch extends Expr { /** @var Name|Expr Class name */ - public $class; + public Node $class; /** @var VarLikeIdentifier|Expr Property name */ - public $name; + public Node $name; /** * Constructs a static property fetch node. * - * @param Name|Expr $class Class name - * @param string|VarLikeIdentifier|Expr $name Property name - * @param array $attributes Additional attributes + * @param Name|Expr $class Class name + * @param string|VarLikeIdentifier|Expr $name Property name + * @param array $attributes Additional attributes */ - public function __construct($class, $name, array $attributes = []) { + public function __construct(Node $class, $name, array $attributes = []) { $this->attributes = $attributes; $this->class = $class; $this->name = \is_string($name) ? new VarLikeIdentifier($name) : $name; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['class', 'name']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_StaticPropertyFetch'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php index 9316f47d..d4837e64 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php @@ -4,35 +4,34 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class Ternary extends Expr -{ +class Ternary extends Expr { /** @var Expr Condition */ - public $cond; + public Expr $cond; /** @var null|Expr Expression for true */ - public $if; + public ?Expr $if; /** @var Expr Expression for false */ - public $else; + public Expr $else; /** * Constructs a ternary operator node. * - * @param Expr $cond Condition - * @param null|Expr $if Expression for true - * @param Expr $else Expression for false - * @param array $attributes Additional attributes + * @param Expr $cond Condition + * @param null|Expr $if Expression for true + * @param Expr $else Expression for false + * @param array $attributes Additional attributes */ - public function __construct(Expr $cond, $if, Expr $else, array $attributes = []) { + public function __construct(Expr $cond, ?Expr $if, Expr $else, array $attributes = []) { $this->attributes = $attributes; $this->cond = $cond; $this->if = $if; $this->else = $else; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['cond', 'if', 'else']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_Ternary'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php index 5c97f0e2..ee49f835 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node; -class Throw_ extends Node\Expr -{ +class Throw_ extends Node\Expr { /** @var Node\Expr Expression */ - public $expr; + public Node\Expr $expr; /** * Constructs a throw expression node. * - * @param Node\Expr $expr Expression - * @param array $attributes Additional attributes + * @param Node\Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } - public function getType() : string { + public function getType(): string { return 'Expr_Throw'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php index ce8808bc..cd06f74b 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class UnaryMinus extends Expr -{ +class UnaryMinus extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs a unary minus node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_UnaryMinus'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php index d23047e5..1b44f7b3 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class UnaryPlus extends Expr -{ +class UnaryPlus extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs a unary plus node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_UnaryPlus'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php index b47d38e9..bab74920 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class Variable extends Expr -{ +class Variable extends Expr { /** @var string|Expr Name */ public $name; /** * Constructs a variable node. * - * @param string|Expr $name Name - * @param array $attributes Additional attributes + * @param string|Expr $name Name + * @param array $attributes Additional attributes */ public function __construct($name, array $attributes = []) { $this->attributes = $attributes; $this->name = $name; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['name']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_Variable'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php index a3efce61..5cff88f8 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class YieldFrom extends Expr -{ +class YieldFrom extends Expr { /** @var Expr Expression to yield from */ - public $expr; + public Expr $expr; /** * Constructs an "yield from" node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_YieldFrom'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php index aef8fc33..bd81e69b 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php @@ -4,31 +4,30 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; -class Yield_ extends Expr -{ +class Yield_ extends Expr { /** @var null|Expr Key expression */ - public $key; + public ?Expr $key; /** @var null|Expr Value expression */ - public $value; + public ?Expr $value; /** * Constructs a yield expression node. * - * @param null|Expr $value Value expression - * @param null|Expr $key Key expression - * @param array $attributes Additional attributes + * @param null|Expr $value Value expression + * @param null|Expr $key Key expression + * @param array $attributes Additional attributes */ - public function __construct(Expr $value = null, Expr $key = null, array $attributes = []) { + public function __construct(?Expr $value = null, ?Expr $key = null, array $attributes = []) { $this->attributes = $attributes; $this->key = $key; $this->value = $value; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['key', 'value']; } - - public function getType() : string { + + public function getType(): string { return 'Expr_Yield'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php index 5a825e73..58f653a8 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php @@ -4,21 +4,18 @@ namespace PhpParser\Node; use PhpParser\Node; -interface FunctionLike extends Node -{ +interface FunctionLike extends Node { /** * Whether to return by reference - * - * @return bool */ - public function returnsByRef() : bool; + public function returnsByRef(): bool; /** * List of parameters * * @return Param[] */ - public function getParams() : array; + public function getParams(): array; /** * Get the declared return type or null @@ -32,12 +29,12 @@ interface FunctionLike extends Node * * @return Stmt[]|null */ - public function getStmts(); + public function getStmts(): ?array; /** * Get PHP attribute groups. * * @return AttributeGroup[] */ - public function getAttrGroups() : array; + public function getAttrGroups(): array; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php index 2f262db0..266166cb 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php @@ -7,12 +7,12 @@ use PhpParser\NodeAbstract; /** * Represents a non-namespaced name. Namespaced names are represented using Name nodes. */ -class Identifier extends NodeAbstract -{ +class Identifier extends NodeAbstract { /** @var string Identifier as string */ - public $name; + public string $name; - private static $specialClassNames = [ + /** @var array */ + private static array $specialClassNames = [ 'self' => true, 'parent' => true, 'static' => true, @@ -21,15 +21,15 @@ class Identifier extends NodeAbstract /** * Constructs an identifier node. * - * @param string $name Identifier as string - * @param array $attributes Additional attributes + * @param string $name Identifier as string + * @param array $attributes Additional attributes */ public function __construct(string $name, array $attributes = []) { $this->attributes = $attributes; $this->name = $name; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['name']; } @@ -38,7 +38,7 @@ class Identifier extends NodeAbstract * * @return string Identifier as string. */ - public function toString() : string { + public function toString(): string { return $this->name; } @@ -47,7 +47,7 @@ class Identifier extends NodeAbstract * * @return string Lowercased identifier as string */ - public function toLowerString() : string { + public function toLowerString(): string { return strtolower($this->name); } @@ -56,7 +56,7 @@ class Identifier extends NodeAbstract * * @return bool Whether identifier is a special class name */ - public function isSpecialClassName() : bool { + public function isSpecialClassName(): bool { return isset(self::$specialClassNames[strtolower($this->name)]); } @@ -65,11 +65,11 @@ class Identifier extends NodeAbstract * * @return string Identifier as string */ - public function __toString() : string { + public function __toString(): string { return $this->name; } - - public function getType() : string { + + public function getType(): string { return 'Identifier'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php new file mode 100644 index 00000000..576dac46 --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php @@ -0,0 +1,32 @@ + $attributes Additional attributes + */ + public function __construct(string $value, array $attributes = []) { + $this->attributes = $attributes; + $this->value = $value; + } + + public function getSubNodeNames(): array { + return ['value']; + } + + public function getType(): string { + return 'InterpolatedStringPart'; + } +} + +// @deprecated compatibility alias +class_alias(InterpolatedStringPart::class, Scalar\EncapsedStringPart::class); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php index 9208e139..3b39cf10 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php @@ -2,29 +2,26 @@ namespace PhpParser\Node; -use PhpParser\NodeAbstract; - -class IntersectionType extends ComplexType -{ +class IntersectionType extends ComplexType { /** @var (Identifier|Name)[] Types */ - public $types; + public array $types; /** * Constructs an intersection type. * - * @param (Identifier|Name)[] $types Types - * @param array $attributes Additional attributes + * @param (Identifier|Name)[] $types Types + * @param array $attributes Additional attributes */ public function __construct(array $types, array $attributes = []) { $this->attributes = $attributes; $this->types = $types; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['types']; } - public function getType() : string { + public function getType(): string { return 'IntersectionType'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php index 2ae1c86b..2927f029 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php @@ -5,27 +5,26 @@ namespace PhpParser\Node; use PhpParser\Node; use PhpParser\NodeAbstract; -class MatchArm extends NodeAbstract -{ - /** @var null|Node\Expr[] */ - public $conds; +class MatchArm extends NodeAbstract { + /** @var null|list */ + public ?array $conds; /** @var Node\Expr */ - public $body; + public Expr $body; /** - * @param null|Node\Expr[] $conds + * @param null|list $conds */ - public function __construct($conds, Node\Expr $body, array $attributes = []) { + public function __construct(?array $conds, Node\Expr $body, array $attributes = []) { $this->conds = $conds; $this->body = $body; $this->attributes = $attributes; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['conds', 'body']; } - public function getType() : string { + public function getType(): string { return 'MatchArm'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php index f0a564ff..26b863e4 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php @@ -4,15 +4,12 @@ namespace PhpParser\Node; use PhpParser\NodeAbstract; -class Name extends NodeAbstract -{ - /** - * @var string[] Parts of the name - * @deprecated Use getParts() instead - */ - public $parts; +class Name extends NodeAbstract { + /** @var string Name as string */ + public string $name; - private static $specialClassNames = [ + /** @var array */ + private static array $specialClassNames = [ 'self' => true, 'parent' => true, 'static' => true, @@ -21,16 +18,16 @@ class Name extends NodeAbstract /** * Constructs a name node. * - * @param string|string[]|self $name Name as string, part array or Name instance (copy ctor) - * @param array $attributes Additional attributes + * @param string|string[]|self $name Name as string, part array or Name instance (copy ctor) + * @param array $attributes Additional attributes */ - public function __construct($name, array $attributes = []) { + final public function __construct($name, array $attributes = []) { $this->attributes = $attributes; - $this->parts = self::prepareName($name); + $this->name = self::prepareName($name); } - public function getSubNodeNames() : array { - return ['parts']; + public function getSubNodeNames(): array { + return ['name']; } /** @@ -39,7 +36,7 @@ class Name extends NodeAbstract * @return string[] Parts of name */ public function getParts(): array { - return $this->parts; + return \explode('\\', $this->name); } /** @@ -47,8 +44,11 @@ class Name extends NodeAbstract * * @return string First part of the name */ - public function getFirst() : string { - return $this->parts[0]; + public function getFirst(): string { + if (false !== $pos = \strpos($this->name, '\\')) { + return \substr($this->name, 0, $pos); + } + return $this->name; } /** @@ -56,8 +56,11 @@ class Name extends NodeAbstract * * @return string Last part of the name */ - public function getLast() : string { - return $this->parts[count($this->parts) - 1]; + public function getLast(): string { + if (false !== $pos = \strrpos($this->name, '\\')) { + return \substr($this->name, $pos + 1); + } + return $this->name; } /** @@ -65,8 +68,8 @@ class Name extends NodeAbstract * * @return bool Whether the name is unqualified */ - public function isUnqualified() : bool { - return 1 === count($this->parts); + public function isUnqualified(): bool { + return false === \strpos($this->name, '\\'); } /** @@ -74,8 +77,8 @@ class Name extends NodeAbstract * * @return bool Whether the name is qualified */ - public function isQualified() : bool { - return 1 < count($this->parts); + public function isQualified(): bool { + return false !== \strpos($this->name, '\\'); } /** @@ -83,7 +86,7 @@ class Name extends NodeAbstract * * @return bool Whether the name is fully qualified */ - public function isFullyQualified() : bool { + public function isFullyQualified(): bool { return false; } @@ -92,7 +95,7 @@ class Name extends NodeAbstract * * @return bool Whether the name is relative */ - public function isRelative() : bool { + public function isRelative(): bool { return false; } @@ -102,8 +105,8 @@ class Name extends NodeAbstract * * @return string String representation */ - public function toString() : string { - return implode('\\', $this->parts); + public function toString(): string { + return $this->name; } /** @@ -112,7 +115,7 @@ class Name extends NodeAbstract * * @return string String representation */ - public function toCodeString() : string { + public function toCodeString(): string { return $this->toString(); } @@ -122,8 +125,8 @@ class Name extends NodeAbstract * * @return string Lowercased string representation */ - public function toLowerString() : string { - return strtolower(implode('\\', $this->parts)); + public function toLowerString(): string { + return strtolower($this->name); } /** @@ -131,9 +134,8 @@ class Name extends NodeAbstract * * @return bool Whether identifier is a special class name */ - public function isSpecialClassName() : bool { - return count($this->parts) === 1 - && isset(self::$specialClassNames[strtolower($this->parts[0])]); + public function isSpecialClassName(): bool { + return isset(self::$specialClassNames[strtolower($this->name)]); } /** @@ -142,8 +144,8 @@ class Name extends NodeAbstract * * @return string String representation */ - public function __toString() : string { - return implode('\\', $this->parts); + public function __toString(): string { + return $this->name; } /** @@ -157,13 +159,22 @@ class Name extends NodeAbstract * * Offset and length have the same meaning as in array_slice(). * - * @param int $offset Offset to start the slice at (may be negative) + * @param int $offset Offset to start the slice at (may be negative) * @param int|null $length Length of the slice (may be negative) * * @return static|null Sliced name */ - public function slice(int $offset, int $length = null) { - $numParts = count($this->parts); + public function slice(int $offset, ?int $length = null) { + if ($offset === 1 && $length === null) { + // Short-circuit the common case. + if (false !== $pos = \strpos($this->name, '\\')) { + return new static(\substr($this->name, $pos + 1)); + } + return null; + } + + $parts = \explode('\\', $this->name); + $numParts = \count($parts); $realOffset = $offset < 0 ? $offset + $numParts : $offset; if ($realOffset < 0 || $realOffset > $numParts) { @@ -184,7 +195,7 @@ class Name extends NodeAbstract return null; } - return new static(array_slice($this->parts, $realOffset, $realLength), $this->attributes); + return new static(array_slice($parts, $realOffset, $realLength), $this->attributes); } /** @@ -198,49 +209,53 @@ class Name extends NodeAbstract * Name::concat($namespace, $shortName) * where $namespace is a Name node or null will work as expected. * - * @param string|string[]|self|null $name1 The first name - * @param string|string[]|self|null $name2 The second name - * @param array $attributes Attributes to assign to concatenated name + * @param string|string[]|self|null $name1 The first name + * @param string|string[]|self|null $name2 The second name + * @param array $attributes Attributes to assign to concatenated name * * @return static|null Concatenated name */ public static function concat($name1, $name2, array $attributes = []) { if (null === $name1 && null === $name2) { return null; - } elseif (null === $name1) { - return new static(self::prepareName($name2), $attributes); - } elseif (null === $name2) { - return new static(self::prepareName($name1), $attributes); + } + if (null === $name1) { + return new static($name2, $attributes); + } + if (null === $name2) { + return new static($name1, $attributes); } else { return new static( - array_merge(self::prepareName($name1), self::prepareName($name2)), $attributes + self::prepareName($name1) . '\\' . self::prepareName($name2), $attributes ); } } /** * Prepares a (string, array or Name node) name for use in name changing methods by converting - * it to an array. + * it to a string. * * @param string|string[]|self $name Name to prepare * - * @return string[] Prepared name + * @return string Prepared name */ - private static function prepareName($name) : array { + private static function prepareName($name): string { if (\is_string($name)) { if ('' === $name) { throw new \InvalidArgumentException('Name cannot be empty'); } - return explode('\\', $name); - } elseif (\is_array($name)) { + return $name; + } + if (\is_array($name)) { if (empty($name)) { throw new \InvalidArgumentException('Name cannot be empty'); } - return $name; - } elseif ($name instanceof self) { - return $name->parts; + return implode('\\', $name); + } + if ($name instanceof self) { + return $name->name; } throw new \InvalidArgumentException( @@ -248,7 +263,7 @@ class Name extends NodeAbstract ); } - public function getType() : string { + public function getType(): string { return 'Name'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php index 1df93a56..21183786 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php @@ -2,14 +2,13 @@ namespace PhpParser\Node\Name; -class FullyQualified extends \PhpParser\Node\Name -{ +class FullyQualified extends \PhpParser\Node\Name { /** * Checks whether the name is unqualified. (E.g. Name) * * @return bool Whether the name is unqualified */ - public function isUnqualified() : bool { + public function isUnqualified(): bool { return false; } @@ -18,7 +17,7 @@ class FullyQualified extends \PhpParser\Node\Name * * @return bool Whether the name is qualified */ - public function isQualified() : bool { + public function isQualified(): bool { return false; } @@ -27,7 +26,7 @@ class FullyQualified extends \PhpParser\Node\Name * * @return bool Whether the name is fully qualified */ - public function isFullyQualified() : bool { + public function isFullyQualified(): bool { return true; } @@ -36,15 +35,15 @@ class FullyQualified extends \PhpParser\Node\Name * * @return bool Whether the name is relative */ - public function isRelative() : bool { + public function isRelative(): bool { return false; } - public function toCodeString() : string { + public function toCodeString(): string { return '\\' . $this->toString(); } - - public function getType() : string { + + public function getType(): string { return 'Name_FullyQualified'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php index 57bf7af2..0226a4e4 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php @@ -2,14 +2,13 @@ namespace PhpParser\Node\Name; -class Relative extends \PhpParser\Node\Name -{ +class Relative extends \PhpParser\Node\Name { /** * Checks whether the name is unqualified. (E.g. Name) * * @return bool Whether the name is unqualified */ - public function isUnqualified() : bool { + public function isUnqualified(): bool { return false; } @@ -18,7 +17,7 @@ class Relative extends \PhpParser\Node\Name * * @return bool Whether the name is qualified */ - public function isQualified() : bool { + public function isQualified(): bool { return false; } @@ -27,7 +26,7 @@ class Relative extends \PhpParser\Node\Name * * @return bool Whether the name is fully qualified */ - public function isFullyQualified() : bool { + public function isFullyQualified(): bool { return false; } @@ -36,15 +35,15 @@ class Relative extends \PhpParser\Node\Name * * @return bool Whether the name is relative */ - public function isRelative() : bool { + public function isRelative(): bool { return true; } - public function toCodeString() : string { + public function toCodeString(): string { return 'namespace\\' . $this->toString(); } - - public function getType() : string { + + public function getType(): string { return 'Name_Relative'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php index d68e26a3..b99acd13 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php @@ -2,27 +2,28 @@ namespace PhpParser\Node; -class NullableType extends ComplexType -{ +use PhpParser\Node; + +class NullableType extends ComplexType { /** @var Identifier|Name Type */ - public $type; + public Node $type; /** * Constructs a nullable type (wrapping another type). * - * @param string|Identifier|Name $type Type - * @param array $attributes Additional attributes + * @param Identifier|Name $type Type + * @param array $attributes Additional attributes */ - public function __construct($type, array $attributes = []) { + public function __construct(Node $type, array $attributes = []) { $this->attributes = $attributes; - $this->type = \is_string($type) ? new Identifier($type) : $type; + $this->type = $type; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['type']; } - - public function getType() : string { + + public function getType(): string { return 'NullableType'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php index 1e90b794..0e9ff0e2 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php @@ -2,46 +2,47 @@ namespace PhpParser\Node; +use PhpParser\Modifiers; +use PhpParser\Node; use PhpParser\NodeAbstract; -class Param extends NodeAbstract -{ +class Param extends NodeAbstract { /** @var null|Identifier|Name|ComplexType Type declaration */ - public $type; + public ?Node $type; /** @var bool Whether parameter is passed by reference */ - public $byRef; + public bool $byRef; /** @var bool Whether this is a variadic argument */ - public $variadic; + public bool $variadic; /** @var Expr\Variable|Expr\Error Parameter variable */ - public $var; + public Expr $var; /** @var null|Expr Default value */ - public $default; - /** @var int */ - public $flags; + public ?Expr $default; + /** @var int Optional visibility flags */ + public int $flags; /** @var AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; /** * Constructs a parameter node. * - * @param Expr\Variable|Expr\Error $var Parameter variable - * @param null|Expr $default Default value - * @param null|string|Identifier|Name|ComplexType $type Type declaration - * @param bool $byRef Whether is passed by reference - * @param bool $variadic Whether this is a variadic argument - * @param array $attributes Additional attributes - * @param int $flags Optional visibility flags - * @param AttributeGroup[] $attrGroups PHP attribute groups + * @param Expr\Variable|Expr\Error $var Parameter variable + * @param null|Expr $default Default value + * @param null|Identifier|Name|ComplexType $type Type declaration + * @param bool $byRef Whether is passed by reference + * @param bool $variadic Whether this is a variadic argument + * @param array $attributes Additional attributes + * @param int $flags Optional visibility flags + * @param list $attrGroups PHP attribute groups */ public function __construct( - $var, Expr $default = null, $type = null, + Expr $var, ?Expr $default = null, ?Node $type = null, bool $byRef = false, bool $variadic = false, array $attributes = [], int $flags = 0, array $attrGroups = [] ) { $this->attributes = $attributes; - $this->type = \is_string($type) ? new Identifier($type) : $type; + $this->type = $type; $this->byRef = $byRef; $this->variadic = $variadic; $this->var = $var; @@ -50,11 +51,34 @@ class Param extends NodeAbstract $this->attrGroups = $attrGroups; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['attrGroups', 'flags', 'type', 'byRef', 'variadic', 'var', 'default']; } - public function getType() : string { + public function getType(): string { return 'Param'; } + + /** + * Whether this parameter uses constructor property promotion. + */ + public function isPromoted(): bool { + return $this->flags !== 0; + } + + public function isPublic(): bool { + return (bool) ($this->flags & Modifiers::PUBLIC); + } + + public function isProtected(): bool { + return (bool) ($this->flags & Modifiers::PROTECTED); + } + + public function isPrivate(): bool { + return (bool) ($this->flags & Modifiers::PRIVATE); + } + + public function isReadonly(): bool { + return (bool) ($this->flags & Modifiers::READONLY); + } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php new file mode 100644 index 00000000..101611e6 --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php @@ -0,0 +1,37 @@ + $attributes Additional attributes + */ + public function __construct($name, ?Node\Expr $default = null, array $attributes = []) { + $this->attributes = $attributes; + $this->name = \is_string($name) ? new Node\VarLikeIdentifier($name) : $name; + $this->default = $default; + } + + public function getSubNodeNames(): array { + return ['name', 'default']; + } + + public function getType(): string { + return 'PropertyItem'; + } +} + +// @deprecated compatibility alias +class_alias(PropertyItem::class, Stmt\PropertyProperty::class); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php index 8117909b..3df25721 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php @@ -2,6 +2,5 @@ namespace PhpParser\Node; -abstract class Scalar extends Expr -{ +abstract class Scalar extends Expr { } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php index 8a15c6f1..ad3937a5 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php @@ -1,77 +1,3 @@ attributes = $attributes; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['value']; - } - - /** - * @param mixed[] $attributes - */ - public static function fromString(string $str, array $attributes = []): DNumber - { - $attributes['rawValue'] = $str; - $float = self::parse($str); - - return new DNumber($float, $attributes); - } - - /** - * @internal - * - * Parses a DNUMBER token like PHP would. - * - * @param string $str A string number - * - * @return float The parsed number - */ - public static function parse(string $str) : float { - $str = str_replace('_', '', $str); - - // Check whether this is one of the special integer notations. - if ('0' === $str[0]) { - // hex - if ('x' === $str[1] || 'X' === $str[1]) { - return hexdec($str); - } - - // bin - if ('b' === $str[1] || 'B' === $str[1]) { - return bindec($str); - } - - // oct, but only if the string does not contain any of '.eE'. - if (false === strpbrk($str, '.eE')) { - // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit - // (8 or 9) so that only the digits before that are used. - return octdec(substr($str, 0, strcspn($str, '89'))); - } - } - - // dec - return (float) $str; - } - - public function getType() : string { - return 'Scalar_DNumber'; - } -} +require __DIR__ . '/Float_.php'; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php index fa5d2e26..c5aaf5b4 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php @@ -1,31 +1,3 @@ attributes = $attributes; - $this->parts = $parts; - } - - public function getSubNodeNames() : array { - return ['parts']; - } - - public function getType() : string { - return 'Scalar_Encapsed'; - } -} +require __DIR__ . '/InterpolatedString.php'; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php index bb3194c1..990e9801 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php @@ -1,30 +1,3 @@ attributes = $attributes; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['value']; - } - - public function getType() : string { - return 'Scalar_EncapsedStringPart'; - } -} +require __DIR__ . '/../InterpolatedStringPart.php'; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php new file mode 100644 index 00000000..5af13192 --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php @@ -0,0 +1,78 @@ + $attributes Additional attributes + */ + public function __construct(float $value, array $attributes = []) { + $this->attributes = $attributes; + $this->value = $value; + } + + public function getSubNodeNames(): array { + return ['value']; + } + + /** + * @param mixed[] $attributes + */ + public static function fromString(string $str, array $attributes = []): Float_ { + $attributes['rawValue'] = $str; + $float = self::parse($str); + + return new Float_($float, $attributes); + } + + /** + * @internal + * + * Parses a DNUMBER token like PHP would. + * + * @param string $str A string number + * + * @return float The parsed number + */ + public static function parse(string $str): float { + $str = str_replace('_', '', $str); + + // Check whether this is one of the special integer notations. + if ('0' === $str[0]) { + // hex + if ('x' === $str[1] || 'X' === $str[1]) { + return hexdec($str); + } + + // bin + if ('b' === $str[1] || 'B' === $str[1]) { + return bindec($str); + } + + // oct, but only if the string does not contain any of '.eE'. + if (false === strpbrk($str, '.eE')) { + // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit + // (8 or 9) so that only the digits before that are used. + return octdec(substr($str, 0, strcspn($str, '89'))); + } + } + + // dec + return (float) $str; + } + + public function getType(): string { + return 'Scalar_Float'; + } +} + +// @deprecated compatibility alias +class_alias(Float_::class, DNumber::class); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php new file mode 100644 index 00000000..bcc257a6 --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php @@ -0,0 +1,82 @@ + $attributes Additional attributes + */ + public function __construct(int $value, array $attributes = []) { + $this->attributes = $attributes; + $this->value = $value; + } + + public function getSubNodeNames(): array { + return ['value']; + } + + /** + * Constructs an Int node from a string number literal. + * + * @param string $str String number literal (decimal, octal, hex or binary) + * @param array $attributes Additional attributes + * @param bool $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5) + * + * @return Int_ The constructed LNumber, including kind attribute + */ + public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = false): Int_ { + $attributes['rawValue'] = $str; + + $str = str_replace('_', '', $str); + + if ('0' !== $str[0] || '0' === $str) { + $attributes['kind'] = Int_::KIND_DEC; + return new Int_((int) $str, $attributes); + } + + if ('x' === $str[1] || 'X' === $str[1]) { + $attributes['kind'] = Int_::KIND_HEX; + return new Int_(hexdec($str), $attributes); + } + + if ('b' === $str[1] || 'B' === $str[1]) { + $attributes['kind'] = Int_::KIND_BIN; + return new Int_(bindec($str), $attributes); + } + + if (!$allowInvalidOctal && strpbrk($str, '89')) { + throw new Error('Invalid numeric literal', $attributes); + } + + // Strip optional explicit octal prefix. + if ('o' === $str[1] || 'O' === $str[1]) { + $str = substr($str, 2); + } + + // use intval instead of octdec to get proper cutting behavior with malformed numbers + $attributes['kind'] = Int_::KIND_OCT; + return new Int_(intval($str, 8), $attributes); + } + + public function getType(): string { + return 'Scalar_Int'; + } +} + +// @deprecated compatibility alias +class_alias(Int_::class, LNumber::class); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php new file mode 100644 index 00000000..9336dfe4 --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php @@ -0,0 +1,34 @@ + $attributes Additional attributes + */ + public function __construct(array $parts, array $attributes = []) { + $this->attributes = $attributes; + $this->parts = $parts; + } + + public function getSubNodeNames(): array { + return ['parts']; + } + + public function getType(): string { + return 'Scalar_InterpolatedString'; + } +} + +// @deprecated compatibility alias +class_alias(InterpolatedString::class, Encapsed::class); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php index 2cc2b22c..cfe8c8c1 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php @@ -1,80 +1,3 @@ attributes = $attributes; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['value']; - } - - /** - * Constructs an LNumber node from a string number literal. - * - * @param string $str String number literal (decimal, octal, hex or binary) - * @param array $attributes Additional attributes - * @param bool $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5) - * - * @return LNumber The constructed LNumber, including kind attribute - */ - public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = false) : LNumber { - $attributes['rawValue'] = $str; - - $str = str_replace('_', '', $str); - - if ('0' !== $str[0] || '0' === $str) { - $attributes['kind'] = LNumber::KIND_DEC; - return new LNumber((int) $str, $attributes); - } - - if ('x' === $str[1] || 'X' === $str[1]) { - $attributes['kind'] = LNumber::KIND_HEX; - return new LNumber(hexdec($str), $attributes); - } - - if ('b' === $str[1] || 'B' === $str[1]) { - $attributes['kind'] = LNumber::KIND_BIN; - return new LNumber(bindec($str), $attributes); - } - - if (!$allowInvalidOctal && strpbrk($str, '89')) { - throw new Error('Invalid numeric literal', $attributes); - } - - // Strip optional explicit octal prefix. - if ('o' === $str[1] || 'O' === $str[1]) { - $str = substr($str, 2); - } - - // use intval instead of octdec to get proper cutting behavior with malformed numbers - $attributes['kind'] = LNumber::KIND_OCT; - return new LNumber(intval($str, 8), $attributes); - } - - public function getType() : string { - return 'Scalar_LNumber'; - } -} +require __DIR__ . '/Int_.php'; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php index 941f0c76..1da9b391 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php @@ -4,18 +4,17 @@ namespace PhpParser\Node\Scalar; use PhpParser\Node\Scalar; -abstract class MagicConst extends Scalar -{ +abstract class MagicConst extends Scalar { /** * Constructs a magic constant node. * - * @param array $attributes Additional attributes + * @param array $attributes Additional attributes */ public function __construct(array $attributes = []) { $this->attributes = $attributes; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return []; } @@ -24,5 +23,5 @@ abstract class MagicConst extends Scalar * * @return string Name of magic constant */ - abstract public function getName() : string; + abstract public function getName(): string; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php index 24432847..732ed140 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Scalar\MagicConst; use PhpParser\Node\Scalar\MagicConst; -class Class_ extends MagicConst -{ - public function getName() : string { +class Class_ extends MagicConst { + public function getName(): string { return '__CLASS__'; } - - public function getType() : string { + + public function getType(): string { return 'Scalar_MagicConst_Class'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php index 2b618473..64daa713 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Scalar\MagicConst; use PhpParser\Node\Scalar\MagicConst; -class Dir extends MagicConst -{ - public function getName() : string { +class Dir extends MagicConst { + public function getName(): string { return '__DIR__'; } - - public function getType() : string { + + public function getType(): string { return 'Scalar_MagicConst_Dir'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php index 3422db06..91041f0f 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Scalar\MagicConst; use PhpParser\Node\Scalar\MagicConst; -class File extends MagicConst -{ - public function getName() : string { +class File extends MagicConst { + public function getName(): string { return '__FILE__'; } - - public function getType() : string { + + public function getType(): string { return 'Scalar_MagicConst_File'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php index 1db65a15..c242d2d9 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Scalar\MagicConst; use PhpParser\Node\Scalar\MagicConst; -class Function_ extends MagicConst -{ - public function getName() : string { +class Function_ extends MagicConst { + public function getName(): string { return '__FUNCTION__'; } - - public function getType() : string { + + public function getType(): string { return 'Scalar_MagicConst_Function'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php index 25d3de57..58d8ce39 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Scalar\MagicConst; use PhpParser\Node\Scalar\MagicConst; -class Line extends MagicConst -{ - public function getName() : string { +class Line extends MagicConst { + public function getName(): string { return '__LINE__'; } - - public function getType() : string { + + public function getType(): string { return 'Scalar_MagicConst_Line'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php index d168d56f..47f341f1 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Scalar\MagicConst; use PhpParser\Node\Scalar\MagicConst; -class Method extends MagicConst -{ - public function getName() : string { +class Method extends MagicConst { + public function getName(): string { return '__METHOD__'; } - - public function getType() : string { + + public function getType(): string { return 'Scalar_MagicConst_Method'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php index 4fabb751..e9f8c0ea 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Scalar\MagicConst; use PhpParser\Node\Scalar\MagicConst; -class Namespace_ extends MagicConst -{ - public function getName() : string { +class Namespace_ extends MagicConst { + public function getName(): string { return '__NAMESPACE__'; } - - public function getType() : string { + + public function getType(): string { return 'Scalar_MagicConst_Namespace'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php index 5ee7e40a..25f49731 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php @@ -4,13 +4,12 @@ namespace PhpParser\Node\Scalar\MagicConst; use PhpParser\Node\Scalar\MagicConst; -class Trait_ extends MagicConst -{ - public function getName() : string { +class Trait_ extends MagicConst { + public function getName(): string { return '__TRAIT__'; } - - public function getType() : string { + + public function getType(): string { return 'Scalar_MagicConst_Trait'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php index 6690a16b..c965366d 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php @@ -5,18 +5,18 @@ namespace PhpParser\Node\Scalar; use PhpParser\Error; use PhpParser\Node\Scalar; -class String_ extends Scalar -{ +class String_ extends Scalar { /* For use in "kind" attribute */ - const KIND_SINGLE_QUOTED = 1; - const KIND_DOUBLE_QUOTED = 2; - const KIND_HEREDOC = 3; - const KIND_NOWDOC = 4; + public const KIND_SINGLE_QUOTED = 1; + public const KIND_DOUBLE_QUOTED = 2; + public const KIND_HEREDOC = 3; + public const KIND_NOWDOC = 4; /** @var string String value */ - public $value; + public string $value; - protected static $replacements = [ + /** @var array Escaped character to its decoded value */ + protected static array $replacements = [ '\\' => '\\', '$' => '$', 'n' => "\n", @@ -30,23 +30,23 @@ class String_ extends Scalar /** * Constructs a string scalar node. * - * @param string $value Value of the string - * @param array $attributes Additional attributes + * @param string $value Value of the string + * @param array $attributes Additional attributes */ public function __construct(string $value, array $attributes = []) { $this->attributes = $attributes; $this->value = $value; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['value']; } /** + * @param array $attributes * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes */ - public static function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = true): self - { + public static function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = true): self { $attributes['kind'] = ($str[0] === "'" || ($str[1] === "'" && ($str[0] === 'b' || $str[0] === 'B'))) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED; @@ -68,7 +68,7 @@ class String_ extends Scalar * * @return string The parsed string */ - public static function parse(string $str, bool $parseUnicodeEscape = true) : string { + public static function parse(string $str, bool $parseUnicodeEscape = true): string { $bLength = 0; if ('b' === $str[0] || 'B' === $str[0]) { $bLength = 1; @@ -92,13 +92,13 @@ class String_ extends Scalar * * Parses escape sequences in strings (all string types apart from single quoted). * - * @param string $str String without quotes + * @param string $str String without quotes * @param null|string $quote Quote type * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes * * @return string String with escape sequences parsed */ - public static function parseEscapeSequences(string $str, $quote, bool $parseUnicodeEscape = true) : string { + public static function parseEscapeSequences(string $str, ?string $quote, bool $parseUnicodeEscape = true): string { if (null !== $quote) { $str = str_replace('\\' . $quote, $quote, $str); } @@ -110,15 +110,19 @@ class String_ extends Scalar return preg_replace_callback( '~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}' . $extra . ')~', - function($matches) { + function ($matches) { $str = $matches[1]; if (isset(self::$replacements[$str])) { return self::$replacements[$str]; - } elseif ('x' === $str[0] || 'X' === $str[0]) { + } + if ('x' === $str[0] || 'X' === $str[0]) { return chr(hexdec(substr($str, 1))); - } elseif ('u' === $str[0]) { - return self::codePointToUtf8(hexdec($matches[2])); + } + if ('u' === $str[0]) { + $dec = hexdec($matches[2]); + // If it overflowed to float, treat as INT_MAX, it will throw an error anyway. + return self::codePointToUtf8(\is_int($dec) ? $dec : \PHP_INT_MAX); } else { return chr(octdec($str)); } @@ -134,24 +138,24 @@ class String_ extends Scalar * * @return string UTF-8 representation of code point */ - private static function codePointToUtf8(int $num) : string { + private static function codePointToUtf8(int $num): string { if ($num <= 0x7F) { return chr($num); } if ($num <= 0x7FF) { - return chr(($num>>6) + 0xC0) . chr(($num&0x3F) + 0x80); + return chr(($num >> 6) + 0xC0) . chr(($num & 0x3F) + 0x80); } if ($num <= 0xFFFF) { - return chr(($num>>12) + 0xE0) . chr((($num>>6)&0x3F) + 0x80) . chr(($num&0x3F) + 0x80); + return chr(($num >> 12) + 0xE0) . chr((($num >> 6) & 0x3F) + 0x80) . chr(($num & 0x3F) + 0x80); } if ($num <= 0x1FFFFF) { - return chr(($num>>18) + 0xF0) . chr((($num>>12)&0x3F) + 0x80) - . chr((($num>>6)&0x3F) + 0x80) . chr(($num&0x3F) + 0x80); + return chr(($num >> 18) + 0xF0) . chr((($num >> 12) & 0x3F) + 0x80) + . chr((($num >> 6) & 0x3F) + 0x80) . chr(($num & 0x3F) + 0x80); } throw new Error('Invalid UTF-8 codepoint escape sequence: Codepoint too large'); } - public function getType() : string { + public function getType(): string { return 'Scalar_String'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/StaticVar.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/StaticVar.php new file mode 100644 index 00000000..517c0edd --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/StaticVar.php @@ -0,0 +1,39 @@ + $attributes Additional attributes + */ + public function __construct( + Expr\Variable $var, ?Node\Expr $default = null, array $attributes = [] + ) { + $this->attributes = $attributes; + $this->var = $var; + $this->default = $default; + } + + public function getSubNodeNames(): array { + return ['var', 'default']; + } + + public function getType(): string { + return 'StaticVar'; + } +} + +// @deprecated compatibility alias +class_alias(StaticVar::class, Stmt\StaticVar::class); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php index 69d33e57..481d31a9 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php @@ -4,6 +4,5 @@ namespace PhpParser\Node; use PhpParser\NodeAbstract; -abstract class Stmt extends NodeAbstract -{ +abstract class Stmt extends NodeAbstract { } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php new file mode 100644 index 00000000..073df208 --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php @@ -0,0 +1,29 @@ + $attributes Additional attributes + */ + public function __construct(array $stmts, array $attributes = []) { + $this->attributes = $attributes; + $this->stmts = $stmts; + } + + public function getType(): string { + return 'Stmt_Block'; + } + + public function getSubNodeNames(): array { + return ['stmts']; + } +} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php index 6adc5a6c..d2bcc5eb 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Break_ extends Node\Stmt -{ +class Break_ extends Node\Stmt { /** @var null|Node\Expr Number of loops to break */ - public $num; + public ?Node\Expr $num; /** * Constructs a break node. * - * @param null|Node\Expr $num Number of loops to break - * @param array $attributes Additional attributes + * @param null|Node\Expr $num Number of loops to break + * @param array $attributes Additional attributes */ - public function __construct(Node\Expr $num = null, array $attributes = []) { + public function __construct(?Node\Expr $num = null, array $attributes = []) { $this->attributes = $attributes; $this->num = $num; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['num']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Break'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php index 2bf044c9..a06ca183 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php @@ -4,31 +4,30 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Case_ extends Node\Stmt -{ +class Case_ extends Node\Stmt { /** @var null|Node\Expr Condition (null for default) */ - public $cond; + public ?Node\Expr $cond; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs a case node. * - * @param null|Node\Expr $cond Condition (null for default) - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param null|Node\Expr $cond Condition (null for default) + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ - public function __construct($cond, array $stmts = [], array $attributes = []) { + public function __construct(?Node\Expr $cond, array $stmts = [], array $attributes = []) { $this->attributes = $attributes; $this->cond = $cond; $this->stmts = $stmts; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['cond', 'stmts']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Case'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php index 9b9c0947..e8d39c9c 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php @@ -5,25 +5,24 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; use PhpParser\Node\Expr; -class Catch_ extends Node\Stmt -{ +class Catch_ extends Node\Stmt { /** @var Node\Name[] Types of exceptions to catch */ - public $types; + public array $types; /** @var Expr\Variable|null Variable for exception */ - public $var; + public ?Expr\Variable $var; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs a catch node. * - * @param Node\Name[] $types Types of exceptions to catch - * @param Expr\Variable|null $var Variable for exception - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param Node\Name[] $types Types of exceptions to catch + * @param Expr\Variable|null $var Variable for exception + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ public function __construct( - array $types, Expr\Variable $var = null, array $stmts = [], array $attributes = [] + array $types, ?Expr\Variable $var = null, array $stmts = [], array $attributes = [] ) { $this->attributes = $attributes; $this->types = $types; @@ -31,11 +30,11 @@ class Catch_ extends Node\Stmt $this->stmts = $stmts; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['types', 'var', 'stmts']; } - public function getType() : string { + public function getType(): string { return 'Stmt_Catch'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php index 8abaad6d..9bdce1f1 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php @@ -2,84 +2,76 @@ namespace PhpParser\Node\Stmt; +use PhpParser\Modifiers; use PhpParser\Node; -class ClassConst extends Node\Stmt -{ +class ClassConst extends Node\Stmt { /** @var int Modifiers */ - public $flags; + public int $flags; /** @var Node\Const_[] Constant declarations */ - public $consts; + public array $consts; /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; /** @var Node\Identifier|Node\Name|Node\ComplexType|null Type declaration */ - public $type; + public ?Node $type; /** * Constructs a class const list node. * - * @param Node\Const_[] $consts Constant declarations - * @param int $flags Modifiers - * @param array $attributes Additional attributes - * @param Node\AttributeGroup[] $attrGroups PHP attribute groups - * @param null|string|Node\Identifier|Node\Name|Node\ComplexType $type Type declaration + * @param Node\Const_[] $consts Constant declarations + * @param int $flags Modifiers + * @param array $attributes Additional attributes + * @param list $attrGroups PHP attribute groups + * @param null|Node\Identifier|Node\Name|Node\ComplexType $type Type declaration */ public function __construct( array $consts, int $flags = 0, array $attributes = [], array $attrGroups = [], - $type = null + ?Node $type = null ) { $this->attributes = $attributes; $this->flags = $flags; $this->consts = $consts; $this->attrGroups = $attrGroups; - $this->type = \is_string($type) ? new Node\Identifier($type) : $type; + $this->type = $type; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['attrGroups', 'flags', 'type', 'consts']; } /** * Whether constant is explicitly or implicitly public. - * - * @return bool */ - public function isPublic() : bool { - return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 - || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; + public function isPublic(): bool { + return ($this->flags & Modifiers::PUBLIC) !== 0 + || ($this->flags & Modifiers::VISIBILITY_MASK) === 0; } /** * Whether constant is protected. - * - * @return bool */ - public function isProtected() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); + public function isProtected(): bool { + return (bool) ($this->flags & Modifiers::PROTECTED); } /** * Whether constant is private. - * - * @return bool */ - public function isPrivate() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); + public function isPrivate(): bool { + return (bool) ($this->flags & Modifiers::PRIVATE); } /** * Whether constant is final. - * - * @return bool */ - public function isFinal() : bool { - return (bool) ($this->flags & Class_::MODIFIER_FINAL); + public function isFinal(): bool { + return (bool) ($this->flags & Modifiers::FINAL); } - public function getType() : string { + public function getType(): string { return 'Stmt_ClassConst'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php index 2fa4e861..fb9ba4f5 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php @@ -3,23 +3,23 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; +use PhpParser\Node\PropertyItem; -abstract class ClassLike extends Node\Stmt -{ +abstract class ClassLike extends Node\Stmt { /** @var Node\Identifier|null Name */ - public $name; + public ?Node\Identifier $name; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; /** @var Node\Name|null Namespaced name (if using NameResolver) */ - public $namespacedName; + public ?Node\Name $namespacedName; /** * @return TraitUse[] */ - public function getTraitUses() : array { + public function getTraitUses(): array { $traitUses = []; foreach ($this->stmts as $stmt) { if ($stmt instanceof TraitUse) { @@ -32,7 +32,7 @@ abstract class ClassLike extends Node\Stmt /** * @return ClassConst[] */ - public function getConstants() : array { + public function getConstants(): array { $constants = []; foreach ($this->stmts as $stmt) { if ($stmt instanceof ClassConst) { @@ -45,7 +45,7 @@ abstract class ClassLike extends Node\Stmt /** * @return Property[] */ - public function getProperties() : array { + public function getProperties(): array { $properties = []; foreach ($this->stmts as $stmt) { if ($stmt instanceof Property) { @@ -62,11 +62,11 @@ abstract class ClassLike extends Node\Stmt * * @return Property|null Property node or null if the property does not exist */ - public function getProperty(string $name) { + public function getProperty(string $name): ?Property { foreach ($this->stmts as $stmt) { if ($stmt instanceof Property) { foreach ($stmt->props as $prop) { - if ($prop instanceof PropertyProperty && $name === $prop->name->toString()) { + if ($prop instanceof PropertyItem && $name === $prop->name->toString()) { return $stmt; } } @@ -80,7 +80,7 @@ abstract class ClassLike extends Node\Stmt * * @return ClassMethod[] */ - public function getMethods() : array { + public function getMethods(): array { $methods = []; foreach ($this->stmts as $stmt) { if ($stmt instanceof ClassMethod) { @@ -97,7 +97,7 @@ abstract class ClassLike extends Node\Stmt * * @return ClassMethod|null Method node or null if the method does not exist */ - public function getMethod(string $name) { + public function getMethod(string $name): ?ClassMethod { $lowerName = strtolower($name); foreach ($this->stmts as $stmt) { if ($stmt instanceof ClassMethod && $lowerName === $stmt->name->toLowerString()) { diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php index 6e85161e..59c0519e 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php @@ -2,27 +2,28 @@ namespace PhpParser\Node\Stmt; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\FunctionLike; -class ClassMethod extends Node\Stmt implements FunctionLike -{ +class ClassMethod extends Node\Stmt implements FunctionLike { /** @var int Flags */ - public $flags; + public int $flags; /** @var bool Whether to return by reference */ - public $byRef; + public bool $byRef; /** @var Node\Identifier Name */ - public $name; + public Node\Identifier $name; /** @var Node\Param[] Parameters */ - public $params; + public array $params; /** @var null|Node\Identifier|Node\Name|Node\ComplexType Return type */ - public $returnType; + public ?Node $returnType; /** @var Node\Stmt[]|null Statements */ - public $stmts; + public ?array $stmts; /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; - private static $magicNames = [ + /** @var array */ + private static array $magicNames = [ '__construct' => true, '__destruct' => true, '__call' => true, @@ -46,14 +47,21 @@ class ClassMethod extends Node\Stmt implements FunctionLike * Constructs a class method node. * * @param string|Node\Identifier $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'flags => MODIFIER_PUBLIC: Flags - * 'byRef' => false : Whether to return by reference - * 'params' => array() : Parameters - * 'returnType' => null : Return type - * 'stmts' => array() : Statements - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes + * @param array{ + * flags?: int, + * byRef?: bool, + * params?: Node\Param[], + * returnType?: null|Node\Identifier|Node\Name|Node\ComplexType, + * stmts?: Node\Stmt[]|null, + * attrGroups?: Node\AttributeGroup[], + * } $subNodes Array of the following optional subnodes: + * 'flags => 0 : Flags + * 'byRef' => false : Whether to return by reference + * 'params' => array() : Parameters + * 'returnType' => null : Return type + * 'stmts' => array() : Statements + * 'attrGroups' => array() : PHP attribute groups + * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; @@ -61,21 +69,20 @@ class ClassMethod extends Node\Stmt implements FunctionLike $this->byRef = $subNodes['byRef'] ?? false; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->returnType = $subNodes['returnType'] ?? null; $this->stmts = array_key_exists('stmts', $subNodes) ? $subNodes['stmts'] : []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['attrGroups', 'flags', 'byRef', 'name', 'params', 'returnType', 'stmts']; } - public function returnsByRef() : bool { + public function returnsByRef(): bool { return $this->byRef; } - public function getParams() : array { + public function getParams(): array { return $this->params; } @@ -83,79 +90,65 @@ class ClassMethod extends Node\Stmt implements FunctionLike return $this->returnType; } - public function getStmts() { + public function getStmts(): ?array { return $this->stmts; } - public function getAttrGroups() : array { + public function getAttrGroups(): array { return $this->attrGroups; } /** * Whether the method is explicitly or implicitly public. - * - * @return bool */ - public function isPublic() : bool { - return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 - || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; + public function isPublic(): bool { + return ($this->flags & Modifiers::PUBLIC) !== 0 + || ($this->flags & Modifiers::VISIBILITY_MASK) === 0; } /** * Whether the method is protected. - * - * @return bool */ - public function isProtected() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); + public function isProtected(): bool { + return (bool) ($this->flags & Modifiers::PROTECTED); } /** * Whether the method is private. - * - * @return bool */ - public function isPrivate() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); + public function isPrivate(): bool { + return (bool) ($this->flags & Modifiers::PRIVATE); } /** * Whether the method is abstract. - * - * @return bool */ - public function isAbstract() : bool { - return (bool) ($this->flags & Class_::MODIFIER_ABSTRACT); + public function isAbstract(): bool { + return (bool) ($this->flags & Modifiers::ABSTRACT); } /** * Whether the method is final. - * - * @return bool */ - public function isFinal() : bool { - return (bool) ($this->flags & Class_::MODIFIER_FINAL); + public function isFinal(): bool { + return (bool) ($this->flags & Modifiers::FINAL); } /** * Whether the method is static. - * - * @return bool */ - public function isStatic() : bool { - return (bool) ($this->flags & Class_::MODIFIER_STATIC); + public function isStatic(): bool { + return (bool) ($this->flags & Modifiers::STATIC); } /** * Whether the method is magic. - * - * @return bool */ - public function isMagic() : bool { + public function isMagic(): bool { return isset(self::$magicNames[$this->name->toLowerString()]); } - public function getType() : string { + public function getType(): string { return 'Stmt_ClassMethod'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php index 52ed6c6c..3f492b7b 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php @@ -2,39 +2,52 @@ namespace PhpParser\Node\Stmt; -use PhpParser\Error; +use PhpParser\Modifiers; use PhpParser\Node; -class Class_ extends ClassLike -{ - const MODIFIER_PUBLIC = 1; - const MODIFIER_PROTECTED = 2; - const MODIFIER_PRIVATE = 4; - const MODIFIER_STATIC = 8; - const MODIFIER_ABSTRACT = 16; - const MODIFIER_FINAL = 32; - const MODIFIER_READONLY = 64; - - const VISIBILITY_MODIFIER_MASK = 7; // 1 | 2 | 4 - - /** @var int Type */ - public $flags; +class Class_ extends ClassLike { + /** @deprecated Use Modifiers::PUBLIC instead */ + public const MODIFIER_PUBLIC = 1; + /** @deprecated Use Modifiers::PROTECTED instead */ + public const MODIFIER_PROTECTED = 2; + /** @deprecated Use Modifiers::PRIVATE instead */ + public const MODIFIER_PRIVATE = 4; + /** @deprecated Use Modifiers::STATIC instead */ + public const MODIFIER_STATIC = 8; + /** @deprecated Use Modifiers::ABSTRACT instead */ + public const MODIFIER_ABSTRACT = 16; + /** @deprecated Use Modifiers::FINAL instead */ + public const MODIFIER_FINAL = 32; + /** @deprecated Use Modifiers::READONLY instead */ + public const MODIFIER_READONLY = 64; + + /** @deprecated Use Modifiers::VISIBILITY_MASK instead */ + public const VISIBILITY_MODIFIER_MASK = 7; // 1 | 2 | 4 + + /** @var int Modifiers */ + public int $flags; /** @var null|Node\Name Name of extended class */ - public $extends; + public ?Node\Name $extends; /** @var Node\Name[] Names of implemented interfaces */ - public $implements; + public array $implements; /** * Constructs a class node. * * @param string|Node\Identifier|null $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'flags' => 0 : Flags - * 'extends' => null : Name of extended class - * 'implements' => array(): Names of implemented interfaces - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes + * @param array{ + * flags?: int, + * extends?: Node\Name|null, + * implements?: Node\Name[], + * stmts?: Node\Stmt[], + * attrGroups?: Node\AttributeGroup[], + * } $subNodes Array of the following optional subnodes: + * 'flags' => 0 : Flags + * 'extends' => null : Name of extended class + * 'implements' => array(): Names of implemented interfaces + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; @@ -46,92 +59,36 @@ class Class_ extends ClassLike $this->attrGroups = $subNodes['attrGroups'] ?? []; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['attrGroups', 'flags', 'name', 'extends', 'implements', 'stmts']; } /** * Whether the class is explicitly abstract. - * - * @return bool */ - public function isAbstract() : bool { - return (bool) ($this->flags & self::MODIFIER_ABSTRACT); + public function isAbstract(): bool { + return (bool) ($this->flags & Modifiers::ABSTRACT); } /** * Whether the class is final. - * - * @return bool */ - public function isFinal() : bool { - return (bool) ($this->flags & self::MODIFIER_FINAL); + public function isFinal(): bool { + return (bool) ($this->flags & Modifiers::FINAL); } - public function isReadonly() : bool { - return (bool) ($this->flags & self::MODIFIER_READONLY); + public function isReadonly(): bool { + return (bool) ($this->flags & Modifiers::READONLY); } /** * Whether the class is anonymous. - * - * @return bool */ - public function isAnonymous() : bool { + public function isAnonymous(): bool { return null === $this->name; } - /** - * @internal - */ - public static function verifyClassModifier($a, $b) { - if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { - throw new Error('Multiple abstract modifiers are not allowed'); - } - - if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { - throw new Error('Multiple final modifiers are not allowed'); - } - - if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { - throw new Error('Multiple readonly modifiers are not allowed'); - } - - if ($a & 48 && $b & 48) { - throw new Error('Cannot use the final modifier on an abstract class'); - } - } - - /** - * @internal - */ - public static function verifyModifier($a, $b) { - if ($a & self::VISIBILITY_MODIFIER_MASK && $b & self::VISIBILITY_MODIFIER_MASK) { - throw new Error('Multiple access type modifiers are not allowed'); - } - - if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { - throw new Error('Multiple abstract modifiers are not allowed'); - } - - if ($a & self::MODIFIER_STATIC && $b & self::MODIFIER_STATIC) { - throw new Error('Multiple static modifiers are not allowed'); - } - - if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { - throw new Error('Multiple final modifiers are not allowed'); - } - - if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { - throw new Error('Multiple readonly modifiers are not allowed'); - } - - if ($a & 48 && $b & 48) { - throw new Error('Cannot use the final modifier on an abstract class member'); - } - } - - public function getType() : string { + public function getType(): string { return 'Stmt_Class'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php index e6316345..f1165fd0 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Const_ extends Node\Stmt -{ +class Const_ extends Node\Stmt { /** @var Node\Const_[] Constant declarations */ - public $consts; + public array $consts; /** * Constructs a const list node. * - * @param Node\Const_[] $consts Constant declarations - * @param array $attributes Additional attributes + * @param Node\Const_[] $consts Constant declarations + * @param array $attributes Additional attributes */ public function __construct(array $consts, array $attributes = []) { $this->attributes = $attributes; $this->consts = $consts; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['consts']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Const'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php index 24882683..54e979dd 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Continue_ extends Node\Stmt -{ +class Continue_ extends Node\Stmt { /** @var null|Node\Expr Number of loops to continue */ - public $num; + public ?Node\Expr $num; /** * Constructs a continue node. * - * @param null|Node\Expr $num Number of loops to continue - * @param array $attributes Additional attributes + * @param null|Node\Expr $num Number of loops to continue + * @param array $attributes Additional attributes */ - public function __construct(Node\Expr $num = null, array $attributes = []) { + public function __construct(?Node\Expr $num = null, array $attributes = []) { $this->attributes = $attributes; $this->num = $num; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['num']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Continue'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php index ac07f30c..cb9e8376 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php @@ -1,34 +1,3 @@ value pair node. - * - * @param string|Node\Identifier $key Key - * @param Node\Expr $value Value - * @param array $attributes Additional attributes - */ - public function __construct($key, Node\Expr $value, array $attributes = []) { - $this->attributes = $attributes; - $this->key = \is_string($key) ? new Node\Identifier($key) : $key; - $this->value = $value; - } - - public function getSubNodeNames() : array { - return ['key', 'value']; - } - - public function getType() : string { - return 'Stmt_DeclareDeclare'; - } -} +require __DIR__ . '/../DeclareItem.php'; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php index f46ff0ba..3c0547bd 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php @@ -3,32 +3,32 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; +use PhpParser\Node\DeclareItem; -class Declare_ extends Node\Stmt -{ - /** @var DeclareDeclare[] List of declares */ - public $declares; +class Declare_ extends Node\Stmt { + /** @var DeclareItem[] List of declares */ + public array $declares; /** @var Node\Stmt[]|null Statements */ - public $stmts; + public ?array $stmts; /** * Constructs a declare node. * - * @param DeclareDeclare[] $declares List of declares - * @param Node\Stmt[]|null $stmts Statements - * @param array $attributes Additional attributes + * @param DeclareItem[] $declares List of declares + * @param Node\Stmt[]|null $stmts Statements + * @param array $attributes Additional attributes */ - public function __construct(array $declares, array $stmts = null, array $attributes = []) { + public function __construct(array $declares, ?array $stmts = null, array $attributes = []) { $this->attributes = $attributes; $this->declares = $declares; $this->stmts = $stmts; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['declares', 'stmts']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Declare'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php index 78e90da0..61244428 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php @@ -4,19 +4,18 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Do_ extends Node\Stmt -{ +class Do_ extends Node\Stmt { /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** @var Node\Expr Condition */ - public $cond; + public Node\Expr $cond; /** * Constructs a do while node. * - * @param Node\Expr $cond Condition - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param Node\Expr $cond Condition + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) { $this->attributes = $attributes; @@ -24,11 +23,11 @@ class Do_ extends Node\Stmt $this->stmts = $stmts; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['stmts', 'cond']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Do'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php index 7cc50d5d..4d424523 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Echo_ extends Node\Stmt -{ +class Echo_ extends Node\Stmt { /** @var Node\Expr[] Expressions */ - public $exprs; + public array $exprs; /** * Constructs an echo node. * - * @param Node\Expr[] $exprs Expressions - * @param array $attributes Additional attributes + * @param Node\Expr[] $exprs Expressions + * @param array $attributes Additional attributes */ public function __construct(array $exprs, array $attributes = []) { $this->attributes = $attributes; $this->exprs = $exprs; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['exprs']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Echo'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php index eef1ece3..b26d59ce 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php @@ -4,19 +4,18 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class ElseIf_ extends Node\Stmt -{ +class ElseIf_ extends Node\Stmt { /** @var Node\Expr Condition */ - public $cond; + public Node\Expr $cond; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs an elseif node. * - * @param Node\Expr $cond Condition - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param Node\Expr $cond Condition + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) { $this->attributes = $attributes; @@ -24,11 +23,11 @@ class ElseIf_ extends Node\Stmt $this->stmts = $stmts; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['cond', 'stmts']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_ElseIf'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php index 0e61778e..3d2b066e 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Else_ extends Node\Stmt -{ +class Else_ extends Node\Stmt { /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs an else node. * - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ public function __construct(array $stmts = [], array $attributes = []) { $this->attributes = $attributes; $this->stmts = $stmts; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['stmts']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Else'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php index 5beff8b3..c071a0af 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php @@ -5,33 +5,32 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; use PhpParser\Node\AttributeGroup; -class EnumCase extends Node\Stmt -{ +class EnumCase extends Node\Stmt { /** @var Node\Identifier Enum case name */ - public $name; + public Node\Identifier $name; /** @var Node\Expr|null Enum case expression */ - public $expr; + public ?Node\Expr $expr; /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; /** - * @param string|Node\Identifier $name Enum case name - * @param Node\Expr|null $expr Enum case expression - * @param AttributeGroup[] $attrGroups PHP attribute groups - * @param array $attributes Additional attributes + * @param string|Node\Identifier $name Enum case name + * @param Node\Expr|null $expr Enum case expression + * @param list $attrGroups PHP attribute groups + * @param array $attributes Additional attributes */ - public function __construct($name, Node\Expr $expr = null, array $attrGroups = [], array $attributes = []) { + public function __construct($name, ?Node\Expr $expr = null, array $attrGroups = [], array $attributes = []) { parent::__construct($attributes); $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->expr = $expr; $this->attrGroups = $attrGroups; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['attrGroups', 'name', 'expr']; } - public function getType() : string { + public function getType(): string { return 'Stmt_EnumCase'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php index 3a50c225..7eea6a69 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php @@ -4,21 +4,25 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Enum_ extends ClassLike -{ +class Enum_ extends ClassLike { /** @var null|Node\Identifier Scalar Type */ - public $scalarType; + public ?Node $scalarType; /** @var Node\Name[] Names of implemented interfaces */ - public $implements; + public array $implements; /** - * @param string|Node\Identifier|null $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'scalarType' => null : Scalar type - * 'implements' => array() : Names of implemented interfaces - * 'stmts' => array() : Statements - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes + * @param string|Node\Identifier|null $name Name + * @param array{ + * scalarType?: Node\Identifier|null, + * implements?: Node\Name[], + * stmts?: Node\Stmt[], + * attrGroups?: Node\AttributeGroup[], + * } $subNodes Array of the following optional subnodes: + * 'scalarType' => null : Scalar type + * 'implements' => array() : Names of implemented interfaces + * 'stmts' => array() : Statements + * 'attrGroups' => array() : PHP attribute groups + * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->name = \is_string($name) ? new Node\Identifier($name) : $name; @@ -30,11 +34,11 @@ class Enum_ extends ClassLike parent::__construct($attributes); } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['attrGroups', 'name', 'scalarType', 'implements', 'stmts']; } - public function getType() : string { + public function getType(): string { return 'Stmt_Enum'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php index 99d1687d..89751fa2 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php @@ -7,27 +7,26 @@ use PhpParser\Node; /** * Represents statements of type "expr;" */ -class Expression extends Node\Stmt -{ +class Expression extends Node\Stmt { /** @var Node\Expr Expression */ - public $expr; + public Node\Expr $expr; /** * Constructs an expression statement. * - * @param Node\Expr $expr Expression - * @param array $attributes Additional attributes + * @param Node\Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $expr, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Expression'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php index d55b8b68..69ecf253 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Finally_ extends Node\Stmt -{ +class Finally_ extends Node\Stmt { /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs a finally node. * - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ public function __construct(array $stmts = [], array $attributes = []) { $this->attributes = $attributes; $this->stmts = $stmts; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['stmts']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Finally'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php index 1323d37c..6f2fbb9e 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php @@ -4,26 +4,30 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class For_ extends Node\Stmt -{ +class For_ extends Node\Stmt { /** @var Node\Expr[] Init expressions */ - public $init; + public array $init; /** @var Node\Expr[] Loop conditions */ - public $cond; + public array $cond; /** @var Node\Expr[] Loop expressions */ - public $loop; + public array $loop; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs a for loop node. * - * @param array $subNodes Array of the following optional subnodes: - * 'init' => array(): Init expressions - * 'cond' => array(): Loop conditions - * 'loop' => array(): Loop expressions - * 'stmts' => array(): Statements - * @param array $attributes Additional attributes + * @param array{ + * init?: Node\Expr[], + * cond?: Node\Expr[], + * loop?: Node\Expr[], + * stmts?: Node\Stmt[], + * } $subNodes Array of the following optional subnodes: + * 'init' => array(): Init expressions + * 'cond' => array(): Loop conditions + * 'loop' => array(): Loop expressions + * 'stmts' => array(): Statements + * @param array $attributes Additional attributes */ public function __construct(array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; @@ -33,11 +37,11 @@ class For_ extends Node\Stmt $this->stmts = $subNodes['stmts'] ?? []; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['init', 'cond', 'loop', 'stmts']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_For'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php index 0556a7ce..c5d9a8b1 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php @@ -4,29 +4,32 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Foreach_ extends Node\Stmt -{ +class Foreach_ extends Node\Stmt { /** @var Node\Expr Expression to iterate */ - public $expr; + public Node\Expr $expr; /** @var null|Node\Expr Variable to assign key to */ - public $keyVar; + public ?Node\Expr $keyVar; /** @var bool Whether to assign value by reference */ - public $byRef; + public bool $byRef; /** @var Node\Expr Variable to assign value to */ - public $valueVar; + public Node\Expr $valueVar; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs a foreach node. * - * @param Node\Expr $expr Expression to iterate - * @param Node\Expr $valueVar Variable to assign value to - * @param array $subNodes Array of the following optional subnodes: - * 'keyVar' => null : Variable to assign key to - * 'byRef' => false : Whether to assign value by reference - * 'stmts' => array(): Statements - * @param array $attributes Additional attributes + * @param Node\Expr $expr Expression to iterate + * @param Node\Expr $valueVar Variable to assign value to + * @param array{ + * keyVar?: Node\Expr|null, + * byRef?: bool, + * stmts?: Node\Stmt[], + * } $subNodes Array of the following optional subnodes: + * 'keyVar' => null : Variable to assign key to + * 'byRef' => false : Whether to assign value by reference + * 'stmts' => array(): Statements + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $expr, Node\Expr $valueVar, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; @@ -37,11 +40,11 @@ class Foreach_ extends Node\Stmt $this->stmts = $subNodes['stmts'] ?? []; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr', 'keyVar', 'byRef', 'valueVar', 'stmts']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Foreach'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php index c2ccae24..2111bab7 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php @@ -5,56 +5,60 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; use PhpParser\Node\FunctionLike; -class Function_ extends Node\Stmt implements FunctionLike -{ +class Function_ extends Node\Stmt implements FunctionLike { /** @var bool Whether function returns by reference */ - public $byRef; + public bool $byRef; /** @var Node\Identifier Name */ - public $name; + public Node\Identifier $name; /** @var Node\Param[] Parameters */ - public $params; + public array $params; /** @var null|Node\Identifier|Node\Name|Node\ComplexType Return type */ - public $returnType; + public ?Node $returnType; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; /** @var Node\Name|null Namespaced name (if using NameResolver) */ - public $namespacedName; + public ?Node\Name $namespacedName; /** * Constructs a function node. * * @param string|Node\Identifier $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'byRef' => false : Whether to return by reference - * 'params' => array(): Parameters - * 'returnType' => null : Return type - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes + * @param array{ + * byRef?: bool, + * params?: Node\Param[], + * returnType?: null|Node\Identifier|Node\Name|Node\ComplexType, + * stmts?: Node\Stmt[], + * attrGroups?: Node\AttributeGroup[], + * } $subNodes Array of the following optional subnodes: + * 'byRef' => false : Whether to return by reference + * 'params' => array(): Parameters + * 'returnType' => null : Return type + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->byRef = $subNodes['byRef'] ?? false; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->returnType = $subNodes['returnType'] ?? null; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['attrGroups', 'byRef', 'name', 'params', 'returnType', 'stmts']; } - public function returnsByRef() : bool { + public function returnsByRef(): bool { return $this->byRef; } - public function getParams() : array { + public function getParams(): array { return $this->params; } @@ -62,16 +66,16 @@ class Function_ extends Node\Stmt implements FunctionLike return $this->returnType; } - public function getAttrGroups() : array { + public function getAttrGroups(): array { return $this->attrGroups; } /** @return Node\Stmt[] */ - public function getStmts() : array { + public function getStmts(): array { return $this->stmts; } - public function getType() : string { + public function getType(): string { return 'Stmt_Function'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php index a0022ad9..d3ab12fc 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Global_ extends Node\Stmt -{ +class Global_ extends Node\Stmt { /** @var Node\Expr[] Variables */ - public $vars; + public array $vars; /** * Constructs a global variables list node. * - * @param Node\Expr[] $vars Variables to unset - * @param array $attributes Additional attributes + * @param Node\Expr[] $vars Variables to unset + * @param array $attributes Additional attributes */ public function __construct(array $vars, array $attributes = []) { $this->attributes = $attributes; $this->vars = $vars; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['vars']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Global'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php index 24a57f78..26a0d01e 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php @@ -5,27 +5,26 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt; -class Goto_ extends Stmt -{ +class Goto_ extends Stmt { /** @var Identifier Name of label to jump to */ - public $name; + public Identifier $name; /** * Constructs a goto node. * - * @param string|Identifier $name Name of label to jump to - * @param array $attributes Additional attributes + * @param string|Identifier $name Name of label to jump to + * @param array $attributes Additional attributes */ public function __construct($name, array $attributes = []) { $this->attributes = $attributes; $this->name = \is_string($name) ? new Identifier($name) : $name; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['name']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Goto'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php index 24520d22..0ec8e9d4 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php @@ -4,23 +4,25 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node\Name; use PhpParser\Node\Stmt; +use PhpParser\Node\UseItem; -class GroupUse extends Stmt -{ - /** @var int Type of group use */ - public $type; +class GroupUse extends Stmt { + /** + * @var Use_::TYPE_* Type of group use + */ + public int $type; /** @var Name Prefix for uses */ - public $prefix; - /** @var UseUse[] Uses */ - public $uses; + public Name $prefix; + /** @var UseItem[] Uses */ + public array $uses; /** * Constructs a group use node. * - * @param Name $prefix Prefix for uses - * @param UseUse[] $uses Uses - * @param int $type Type of group use - * @param array $attributes Additional attributes + * @param Name $prefix Prefix for uses + * @param UseItem[] $uses Uses + * @param Use_::TYPE_* $type Type of group use + * @param array $attributes Additional attributes */ public function __construct(Name $prefix, array $uses, int $type = Use_::TYPE_NORMAL, array $attributes = []) { $this->attributes = $attributes; @@ -29,11 +31,11 @@ class GroupUse extends Stmt $this->uses = $uses; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['type', 'prefix', 'uses']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_GroupUse'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php index 8e624e0f..665bacde 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node\Stmt; -class HaltCompiler extends Stmt -{ +class HaltCompiler extends Stmt { /** @var string Remaining text after halt compiler statement. */ - public $remaining; + public string $remaining; /** * Constructs a __halt_compiler node. * - * @param string $remaining Remaining text after halt compiler statement. - * @param array $attributes Additional attributes + * @param string $remaining Remaining text after halt compiler statement. + * @param array $attributes Additional attributes */ public function __construct(string $remaining, array $attributes = []) { $this->attributes = $attributes; $this->remaining = $remaining; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['remaining']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_HaltCompiler'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php index a1bae4bf..544390ff 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php @@ -4,26 +4,29 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class If_ extends Node\Stmt -{ +class If_ extends Node\Stmt { /** @var Node\Expr Condition expression */ - public $cond; + public Node\Expr $cond; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** @var ElseIf_[] Elseif clauses */ - public $elseifs; + public array $elseifs; /** @var null|Else_ Else clause */ - public $else; + public ?Else_ $else; /** * Constructs an if node. * - * @param Node\Expr $cond Condition - * @param array $subNodes Array of the following optional subnodes: - * 'stmts' => array(): Statements - * 'elseifs' => array(): Elseif clauses - * 'else' => null : Else clause - * @param array $attributes Additional attributes + * @param Node\Expr $cond Condition + * @param array{ + * stmts?: Node\Stmt[], + * elseifs?: ElseIf_[], + * else?: Else_|null, + * } $subNodes Array of the following optional subnodes: + * 'stmts' => array(): Statements + * 'elseifs' => array(): Elseif clauses + * 'else' => null : Else clause + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; @@ -33,11 +36,11 @@ class If_ extends Node\Stmt $this->else = $subNodes['else'] ?? null; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['cond', 'stmts', 'elseifs', 'else']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_If'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php index 0711d284..0515d020 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node\Stmt; -class InlineHTML extends Stmt -{ +class InlineHTML extends Stmt { /** @var string String */ - public $value; + public string $value; /** * Constructs an inline HTML node. * - * @param string $value String - * @param array $attributes Additional attributes + * @param string $value String + * @param array $attributes Additional attributes */ public function __construct(string $value, array $attributes = []) { $this->attributes = $attributes; $this->value = $value; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['value']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_InlineHTML'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php index 4d587dd4..9359064f 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php @@ -4,20 +4,23 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Interface_ extends ClassLike -{ +class Interface_ extends ClassLike { /** @var Node\Name[] Extended interfaces */ - public $extends; + public array $extends; /** * Constructs a class node. * * @param string|Node\Identifier $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'extends' => array(): Name of extended interfaces - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes + * @param array{ + * extends?: Node\Name[], + * stmts?: Node\Stmt[], + * attrGroups?: Node\AttributeGroup[], + * } $subNodes Array of the following optional subnodes: + * 'extends' => array(): Name of extended interfaces + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; @@ -27,11 +30,11 @@ class Interface_ extends ClassLike $this->attrGroups = $subNodes['attrGroups'] ?? []; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['attrGroups', 'name', 'extends', 'stmts']; } - public function getType() : string { + public function getType(): string { return 'Stmt_Interface'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php index 3edcb3be..658468d2 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php @@ -5,27 +5,26 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt; -class Label extends Stmt -{ +class Label extends Stmt { /** @var Identifier Name */ - public $name; + public Identifier $name; /** * Constructs a label node. * - * @param string|Identifier $name Name - * @param array $attributes Additional attributes + * @param string|Identifier $name Name + * @param array $attributes Additional attributes */ public function __construct($name, array $attributes = []) { $this->attributes = $attributes; $this->name = \is_string($name) ? new Identifier($name) : $name; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['name']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Label'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php index c6320457..f5b59ad6 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php @@ -4,35 +4,34 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Namespace_ extends Node\Stmt -{ +class Namespace_ extends Node\Stmt { /* For use in the "kind" attribute */ - const KIND_SEMICOLON = 1; - const KIND_BRACED = 2; + public const KIND_SEMICOLON = 1; + public const KIND_BRACED = 2; /** @var null|Node\Name Name */ - public $name; + public ?Node\Name $name; /** @var Node\Stmt[] Statements */ public $stmts; /** * Constructs a namespace node. * - * @param null|Node\Name $name Name - * @param null|Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param null|Node\Name $name Name + * @param null|Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ - public function __construct(Node\Name $name = null, $stmts = [], array $attributes = []) { + public function __construct(?Node\Name $name = null, ?array $stmts = [], array $attributes = []) { $this->attributes = $attributes; $this->name = $name; $this->stmts = $stmts; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['name', 'stmts']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Namespace'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php index f86f8df7..3acfa46f 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php @@ -5,13 +5,12 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; /** Nop/empty statement (;). */ -class Nop extends Node\Stmt -{ - public function getSubNodeNames() : array { +class Nop extends Node\Stmt { + public function getSubNodeNames(): array { return []; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Nop'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php index bc781bbf..872ea6b7 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php @@ -2,90 +2,81 @@ namespace PhpParser\Node\Stmt; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\ComplexType; use PhpParser\Node\Identifier; use PhpParser\Node\Name; +use PhpParser\Node\PropertyItem; -class Property extends Node\Stmt -{ +class Property extends Node\Stmt { /** @var int Modifiers */ - public $flags; - /** @var PropertyProperty[] Properties */ - public $props; + public int $flags; + /** @var PropertyItem[] Properties */ + public array $props; /** @var null|Identifier|Name|ComplexType Type declaration */ - public $type; + public ?Node $type; /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; /** * Constructs a class property list node. * - * @param int $flags Modifiers - * @param PropertyProperty[] $props Properties - * @param array $attributes Additional attributes - * @param null|string|Identifier|Name|ComplexType $type Type declaration - * @param Node\AttributeGroup[] $attrGroups PHP attribute groups + * @param int $flags Modifiers + * @param PropertyItem[] $props Properties + * @param array $attributes Additional attributes + * @param null|Identifier|Name|ComplexType $type Type declaration + * @param Node\AttributeGroup[] $attrGroups PHP attribute groups */ - public function __construct(int $flags, array $props, array $attributes = [], $type = null, array $attrGroups = []) { + public function __construct(int $flags, array $props, array $attributes = [], ?Node $type = null, array $attrGroups = []) { $this->attributes = $attributes; $this->flags = $flags; $this->props = $props; - $this->type = \is_string($type) ? new Identifier($type) : $type; + $this->type = $type; $this->attrGroups = $attrGroups; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['attrGroups', 'flags', 'type', 'props']; } /** * Whether the property is explicitly or implicitly public. - * - * @return bool */ - public function isPublic() : bool { - return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 - || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; + public function isPublic(): bool { + return ($this->flags & Modifiers::PUBLIC) !== 0 + || ($this->flags & Modifiers::VISIBILITY_MASK) === 0; } /** * Whether the property is protected. - * - * @return bool */ - public function isProtected() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); + public function isProtected(): bool { + return (bool) ($this->flags & Modifiers::PROTECTED); } /** * Whether the property is private. - * - * @return bool */ - public function isPrivate() : bool { - return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); + public function isPrivate(): bool { + return (bool) ($this->flags & Modifiers::PRIVATE); } /** * Whether the property is static. - * - * @return bool */ - public function isStatic() : bool { - return (bool) ($this->flags & Class_::MODIFIER_STATIC); + public function isStatic(): bool { + return (bool) ($this->flags & Modifiers::STATIC); } /** * Whether the property is readonly. - * - * @return bool */ - public function isReadonly() : bool { - return (bool) ($this->flags & Class_::MODIFIER_READONLY); + public function isReadonly(): bool { + return (bool) ($this->flags & Modifiers::READONLY); } - public function getType() : string { + public function getType(): string { return 'Stmt_Property'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php index 205731e2..4a21a880 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php @@ -1,34 +1,3 @@ attributes = $attributes; - $this->name = \is_string($name) ? new Node\VarLikeIdentifier($name) : $name; - $this->default = $default; - } - - public function getSubNodeNames() : array { - return ['name', 'default']; - } - - public function getType() : string { - return 'Stmt_PropertyProperty'; - } -} +require __DIR__ . '/../PropertyItem.php'; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php index efc578c5..9c44cca8 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Return_ extends Node\Stmt -{ +class Return_ extends Node\Stmt { /** @var null|Node\Expr Expression */ - public $expr; + public ?Node\Expr $expr; /** * Constructs a return node. * - * @param null|Node\Expr $expr Expression - * @param array $attributes Additional attributes + * @param null|Node\Expr $expr Expression + * @param array $attributes Additional attributes */ - public function __construct(Node\Expr $expr = null, array $attributes = []) { + public function __construct(?Node\Expr $expr = null, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['expr']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Return'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php index 29584560..88452e7f 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php @@ -1,37 +1,3 @@ attributes = $attributes; - $this->var = $var; - $this->default = $default; - } - - public function getSubNodeNames() : array { - return ['var', 'default']; - } - - public function getType() : string { - return 'Stmt_StaticVar'; - } -} +require __DIR__ . '/../StaticVar.php'; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php index 464898ff..a84de106 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php @@ -2,29 +2,29 @@ namespace PhpParser\Node\Stmt; +use PhpParser\Node\StaticVar; use PhpParser\Node\Stmt; -class Static_ extends Stmt -{ +class Static_ extends Stmt { /** @var StaticVar[] Variable definitions */ - public $vars; + public array $vars; /** * Constructs a static variables list node. * - * @param StaticVar[] $vars Variable definitions - * @param array $attributes Additional attributes + * @param StaticVar[] $vars Variable definitions + * @param array $attributes Additional attributes */ public function __construct(array $vars, array $attributes = []) { $this->attributes = $attributes; $this->vars = $vars; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['vars']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Static'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php index 2c8dae02..21e5efa5 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php @@ -4,19 +4,18 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Switch_ extends Node\Stmt -{ +class Switch_ extends Node\Stmt { /** @var Node\Expr Condition */ - public $cond; + public Node\Expr $cond; /** @var Case_[] Case list */ - public $cases; + public array $cases; /** * Constructs a case node. * - * @param Node\Expr $cond Condition - * @param Case_[] $cases Case list - * @param array $attributes Additional attributes + * @param Node\Expr $cond Condition + * @param Case_[] $cases Case list + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $cases, array $attributes = []) { $this->attributes = $attributes; @@ -24,11 +23,11 @@ class Switch_ extends Node\Stmt $this->cases = $cases; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['cond', 'cases']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Switch'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php deleted file mode 100644 index a34e2b36..00000000 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - - public function getSubNodeNames() : array { - return ['expr']; - } - - public function getType() : string { - return 'Stmt_Throw'; - } -} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php index 9e97053b..7705a570 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php @@ -4,19 +4,18 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class TraitUse extends Node\Stmt -{ +class TraitUse extends Node\Stmt { /** @var Node\Name[] Traits */ - public $traits; + public array $traits; /** @var TraitUseAdaptation[] Adaptations */ - public $adaptations; + public array $adaptations; /** * Constructs a trait use node. * - * @param Node\Name[] $traits Traits + * @param Node\Name[] $traits Traits * @param TraitUseAdaptation[] $adaptations Adaptations - * @param array $attributes Additional attributes + * @param array $attributes Additional attributes */ public function __construct(array $traits, array $adaptations = [], array $attributes = []) { $this->attributes = $attributes; @@ -24,11 +23,11 @@ class TraitUse extends Node\Stmt $this->adaptations = $adaptations; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['traits', 'adaptations']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_TraitUse'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php index 8bdd2c04..987bc88e 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php @@ -4,10 +4,9 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -abstract class TraitUseAdaptation extends Node\Stmt -{ +abstract class TraitUseAdaptation extends Node\Stmt { /** @var Node\Name|null Trait name */ - public $trait; + public ?Node\Name $trait; /** @var Node\Identifier Method name */ - public $method; + public Node\Identifier $method; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php index a3bccbd1..449671e7 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php @@ -4,23 +4,22 @@ namespace PhpParser\Node\Stmt\TraitUseAdaptation; use PhpParser\Node; -class Alias extends Node\Stmt\TraitUseAdaptation -{ +class Alias extends Node\Stmt\TraitUseAdaptation { /** @var null|int New modifier */ - public $newModifier; + public ?int $newModifier; /** @var null|Node\Identifier New name */ - public $newName; + public ?Node\Identifier $newName; /** * Constructs a trait use precedence adaptation node. * - * @param null|Node\Name $trait Trait name - * @param string|Node\Identifier $method Method name - * @param null|int $newModifier New modifier - * @param null|string|Node\Identifier $newName New name - * @param array $attributes Additional attributes + * @param null|Node\Name $trait Trait name + * @param string|Node\Identifier $method Method name + * @param null|int $newModifier New modifier + * @param null|string|Node\Identifier $newName New name + * @param array $attributes Additional attributes */ - public function __construct($trait, $method, $newModifier, $newName, array $attributes = []) { + public function __construct(?Node\Name $trait, $method, ?int $newModifier, $newName, array $attributes = []) { $this->attributes = $attributes; $this->trait = $trait; $this->method = \is_string($method) ? new Node\Identifier($method) : $method; @@ -28,11 +27,11 @@ class Alias extends Node\Stmt\TraitUseAdaptation $this->newName = \is_string($newName) ? new Node\Identifier($newName) : $newName; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['trait', 'method', 'newModifier', 'newName']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_TraitUseAdaptation_Alias'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php index 80385f64..7bc40837 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php @@ -4,18 +4,17 @@ namespace PhpParser\Node\Stmt\TraitUseAdaptation; use PhpParser\Node; -class Precedence extends Node\Stmt\TraitUseAdaptation -{ +class Precedence extends Node\Stmt\TraitUseAdaptation { /** @var Node\Name[] Overwritten traits */ - public $insteadof; + public array $insteadof; /** * Constructs a trait use precedence adaptation node. * - * @param Node\Name $trait Trait name - * @param string|Node\Identifier $method Method name - * @param Node\Name[] $insteadof Overwritten traits - * @param array $attributes Additional attributes + * @param Node\Name $trait Trait name + * @param string|Node\Identifier $method Method name + * @param Node\Name[] $insteadof Overwritten traits + * @param array $attributes Additional attributes */ public function __construct(Node\Name $trait, $method, array $insteadof, array $attributes = []) { $this->attributes = $attributes; @@ -24,11 +23,11 @@ class Precedence extends Node\Stmt\TraitUseAdaptation $this->insteadof = $insteadof; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['trait', 'method', 'insteadof']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_TraitUseAdaptation_Precedence'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php index 0cec203a..5f2b3307 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php @@ -4,16 +4,18 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Trait_ extends ClassLike -{ +class Trait_ extends ClassLike { /** * Constructs a trait node. * * @param string|Node\Identifier $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes + * @param array{ + * stmts?: Node\Stmt[], + * attrGroups?: Node\AttributeGroup[], + * } $subNodes Array of the following optional subnodes: + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; @@ -22,11 +24,11 @@ class Trait_ extends ClassLike $this->attrGroups = $subNodes['attrGroups'] ?? []; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['attrGroups', 'name', 'stmts']; } - public function getType() : string { + public function getType(): string { return 'Stmt_Trait'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php index 7fc158c5..6414c46c 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php @@ -4,35 +4,34 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class TryCatch extends Node\Stmt -{ +class TryCatch extends Node\Stmt { /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** @var Catch_[] Catches */ - public $catches; + public array $catches; /** @var null|Finally_ Optional finally node */ - public $finally; + public ?Finally_ $finally; /** * Constructs a try catch node. * - * @param Node\Stmt[] $stmts Statements - * @param Catch_[] $catches Catches - * @param null|Finally_ $finally Optional finally node - * @param array $attributes Additional attributes + * @param Node\Stmt[] $stmts Statements + * @param Catch_[] $catches Catches + * @param null|Finally_ $finally Optional finally node + * @param array $attributes Additional attributes */ - public function __construct(array $stmts, array $catches, Finally_ $finally = null, array $attributes = []) { + public function __construct(array $stmts, array $catches, ?Finally_ $finally = null, array $attributes = []) { $this->attributes = $attributes; $this->stmts = $stmts; $this->catches = $catches; $this->finally = $finally; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['stmts', 'catches', 'finally']; } - public function getType() : string { + public function getType(): string { return 'Stmt_TryCatch'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php index 310e427a..c211beb0 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php @@ -4,27 +4,26 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Unset_ extends Node\Stmt -{ +class Unset_ extends Node\Stmt { /** @var Node\Expr[] Variables to unset */ - public $vars; + public array $vars; /** * Constructs an unset node. * - * @param Node\Expr[] $vars Variables to unset - * @param array $attributes Additional attributes + * @param Node\Expr[] $vars Variables to unset + * @param array $attributes Additional attributes */ public function __construct(array $vars, array $attributes = []) { $this->attributes = $attributes; $this->vars = $vars; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['vars']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Unset'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php index 32bd7847..85830edc 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php @@ -1,52 +1,3 @@ attributes = $attributes; - $this->type = $type; - $this->name = $name; - $this->alias = \is_string($alias) ? new Identifier($alias) : $alias; - } - - public function getSubNodeNames() : array { - return ['type', 'name', 'alias']; - } - - /** - * Get alias. If not explicitly given this is the last component of the used name. - * - * @return Identifier - */ - public function getAlias() : Identifier { - if (null !== $this->alias) { - return $this->alias; - } - - return new Identifier($this->name->getLast()); - } - - public function getType() : string { - return 'Stmt_UseUse'; - } -} +require __DIR__ . '/../UseItem.php'; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php index 8753da31..5b2d8648 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php @@ -3,33 +3,33 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node\Stmt; +use PhpParser\Node\UseItem; -class Use_ extends Stmt -{ +class Use_ extends Stmt { /** * Unknown type. Both Stmt\Use_ / Stmt\GroupUse and Stmt\UseUse have a $type property, one of them will always be * TYPE_UNKNOWN while the other has one of the three other possible types. For normal use statements the type on the * Stmt\UseUse is unknown. It's only the other way around for mixed group use declarations. */ - const TYPE_UNKNOWN = 0; + public const TYPE_UNKNOWN = 0; /** Class or namespace import */ - const TYPE_NORMAL = 1; + public const TYPE_NORMAL = 1; /** Function import */ - const TYPE_FUNCTION = 2; + public const TYPE_FUNCTION = 2; /** Constant import */ - const TYPE_CONSTANT = 3; + public const TYPE_CONSTANT = 3; - /** @var int Type of alias */ - public $type; - /** @var UseUse[] Aliases */ - public $uses; + /** @var self::TYPE_* Type of alias */ + public int $type; + /** @var UseItem[] Aliases */ + public array $uses; /** * Constructs an alias (use) list node. * - * @param UseUse[] $uses Aliases - * @param int $type Type of alias - * @param array $attributes Additional attributes + * @param UseItem[] $uses Aliases + * @param Stmt\Use_::TYPE_* $type Type of alias + * @param array $attributes Additional attributes */ public function __construct(array $uses, int $type = self::TYPE_NORMAL, array $attributes = []) { $this->attributes = $attributes; @@ -37,11 +37,11 @@ class Use_ extends Stmt $this->uses = $uses; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['type', 'uses']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_Use'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php index f41034f8..2f7aed23 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php @@ -4,19 +4,18 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class While_ extends Node\Stmt -{ +class While_ extends Node\Stmt { /** @var Node\Expr Condition */ - public $cond; + public Node\Expr $cond; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs a while node. * - * @param Node\Expr $cond Condition - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param Node\Expr $cond Condition + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) { $this->attributes = $attributes; @@ -24,11 +23,11 @@ class While_ extends Node\Stmt $this->stmts = $stmts; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['cond', 'stmts']; } - - public function getType() : string { + + public function getType(): string { return 'Stmt_While'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php index 93cecd23..bad88d2b 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php @@ -2,27 +2,26 @@ namespace PhpParser\Node; -class UnionType extends ComplexType -{ +class UnionType extends ComplexType { /** @var (Identifier|Name|IntersectionType)[] Types */ - public $types; + public array $types; /** * Constructs a union type. * - * @param (Identifier|Name|IntersectionType)[] $types Types - * @param array $attributes Additional attributes + * @param (Identifier|Name|IntersectionType)[] $types Types + * @param array $attributes Additional attributes */ public function __construct(array $types, array $attributes = []) { $this->attributes = $attributes; $this->types = $types; } - public function getSubNodeNames() : array { + public function getSubNodeNames(): array { return ['types']; } - - public function getType() : string { + + public function getType(): string { return 'UnionType'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/UseItem.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/UseItem.php new file mode 100644 index 00000000..a7d9fc44 --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/UseItem.php @@ -0,0 +1,55 @@ + $attributes Additional attributes + */ + public function __construct(Node\Name $name, $alias = null, int $type = Use_::TYPE_UNKNOWN, array $attributes = []) { + $this->attributes = $attributes; + $this->type = $type; + $this->name = $name; + $this->alias = \is_string($alias) ? new Identifier($alias) : $alias; + } + + public function getSubNodeNames(): array { + return ['type', 'name', 'alias']; + } + + /** + * Get alias. If not explicitly given this is the last component of the used name. + */ + public function getAlias(): Identifier { + if (null !== $this->alias) { + return $this->alias; + } + + return new Identifier($this->name->getLast()); + } + + public function getType(): string { + return 'UseItem'; + } +} + +// @deprecated compatibility alias +class_alias(UseItem::class, Stmt\UseUse::class); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php index a30807a6..9baa6fe0 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php @@ -9,9 +9,8 @@ namespace PhpParser\Node; * Examples: Names in property declarations are formatted as variables. Names in static property * lookups are also formatted as variables. */ -class VarLikeIdentifier extends Identifier -{ - public function getType() : string { +class VarLikeIdentifier extends Identifier { + public function getType(): string { return 'VarLikeIdentifier'; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php index 403a24df..48c4f338 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php @@ -11,7 +11,7 @@ class VariadicPlaceholder extends NodeAbstract { /** * Create a variadic argument placeholder (first-class callable syntax). * - * @param array $attributes Additional attributes + * @param array $attributes Additional attributes */ public function __construct(array $attributes = []) { $this->attributes = $attributes; @@ -24,4 +24,4 @@ class VariadicPlaceholder extends NodeAbstract { public function getSubNodeNames(): array { return []; } -} \ No newline at end of file +} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php index 04514da1..7c3a3607 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php @@ -2,14 +2,14 @@ namespace PhpParser; -abstract class NodeAbstract implements Node, \JsonSerializable -{ - protected $attributes; +abstract class NodeAbstract implements Node, \JsonSerializable { + /** @var array Attributes */ + protected array $attributes; /** * Creates a Node. * - * @param array $attributes Array of attributes + * @param array $attributes Array of attributes */ public function __construct(array $attributes = []) { $this->attributes = $attributes; @@ -20,7 +20,7 @@ abstract class NodeAbstract implements Node, \JsonSerializable * * @return int Start line (or -1 if not available) */ - public function getLine() : int { + public function getLine(): int { return $this->attributes['startLine'] ?? -1; } @@ -31,7 +31,7 @@ abstract class NodeAbstract implements Node, \JsonSerializable * * @return int Start line (or -1 if not available) */ - public function getStartLine() : int { + public function getStartLine(): int { return $this->attributes['startLine'] ?? -1; } @@ -42,7 +42,7 @@ abstract class NodeAbstract implements Node, \JsonSerializable * * @return int End line (or -1 if not available) */ - public function getEndLine() : int { + public function getEndLine(): int { return $this->attributes['endLine'] ?? -1; } @@ -55,7 +55,7 @@ abstract class NodeAbstract implements Node, \JsonSerializable * * @return int Token start position (or -1 if not available) */ - public function getStartTokenPos() : int { + public function getStartTokenPos(): int { return $this->attributes['startTokenPos'] ?? -1; } @@ -68,7 +68,7 @@ abstract class NodeAbstract implements Node, \JsonSerializable * * @return int Token end position (or -1 if not available) */ - public function getEndTokenPos() : int { + public function getEndTokenPos(): int { return $this->attributes['endTokenPos'] ?? -1; } @@ -79,7 +79,7 @@ abstract class NodeAbstract implements Node, \JsonSerializable * * @return int File start position (or -1 if not available) */ - public function getStartFilePos() : int { + public function getStartFilePos(): int { return $this->attributes['startFilePos'] ?? -1; } @@ -90,7 +90,7 @@ abstract class NodeAbstract implements Node, \JsonSerializable * * @return int File end position (or -1 if not available) */ - public function getEndFilePos() : int { + public function getEndFilePos(): int { return $this->attributes['endFilePos'] ?? -1; } @@ -101,7 +101,7 @@ abstract class NodeAbstract implements Node, \JsonSerializable * * @return Comment[] */ - public function getComments() : array { + public function getComments(): array { return $this->attributes['comments'] ?? []; } @@ -110,7 +110,7 @@ abstract class NodeAbstract implements Node, \JsonSerializable * * @return null|Comment\Doc Doc comment object or null */ - public function getDocComment() { + public function getDocComment(): ?Comment\Doc { $comments = $this->getComments(); for ($i = count($comments) - 1; $i >= 0; $i--) { $comment = $comments[$i]; @@ -129,7 +129,7 @@ abstract class NodeAbstract implements Node, \JsonSerializable * * @param Comment\Doc $docComment Doc comment to set */ - public function setDocComment(Comment\Doc $docComment) { + public function setDocComment(Comment\Doc $docComment): void { $comments = $this->getComments(); for ($i = count($comments) - 1; $i >= 0; $i--) { if ($comments[$i] instanceof Comment\Doc) { @@ -145,11 +145,11 @@ abstract class NodeAbstract implements Node, \JsonSerializable $this->setAttribute('comments', $comments); } - public function setAttribute(string $key, $value) { + public function setAttribute(string $key, $value): void { $this->attributes[$key] = $value; } - public function hasAttribute(string $key) : bool { + public function hasAttribute(string $key): bool { return array_key_exists($key, $this->attributes); } @@ -161,18 +161,18 @@ abstract class NodeAbstract implements Node, \JsonSerializable return $default; } - public function getAttributes() : array { + public function getAttributes(): array { return $this->attributes; } - public function setAttributes(array $attributes) { + public function setAttributes(array $attributes): void { $this->attributes = $attributes; } /** - * @return array + * @return array */ - public function jsonSerialize() : array { + public function jsonSerialize(): array { return ['nodeType' => $this->getType()] + get_object_vars($this); } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php index ba622efd..a2535de7 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php @@ -2,17 +2,33 @@ namespace PhpParser; +use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\Include_; -use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Expr\List_; +use PhpParser\Node\Scalar\Int_; +use PhpParser\Node\Scalar\InterpolatedString; +use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\GroupUse; use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; +use PhpParser\Node\UseItem; -class NodeDumper -{ - private $dumpComments; - private $dumpPositions; - private $code; +class NodeDumper { + private bool $dumpComments; + private bool $dumpPositions; + private bool $dumpOtherAttributes; + private ?string $code; + private string $res; + private string $nl; + + private const IGNORE_ATTRIBUTES = [ + 'comments' => true, + 'startLine' => true, + 'endLine' => true, + 'startFilePos' => true, + 'endFilePos' => true, + 'startTokenPos' => true, + 'endTokenPos' => true, + ]; /** * Constructs a NodeDumper. @@ -21,150 +37,218 @@ class NodeDumper * * bool dumpComments: Whether comments should be dumped. * * bool dumpPositions: Whether line/offset information should be dumped. To dump offset * information, the code needs to be passed to dump(). + * * bool dumpOtherAttributes: Whether non-comment, non-position attributes should be dumped. * * @param array $options Options (see description) */ public function __construct(array $options = []) { $this->dumpComments = !empty($options['dumpComments']); $this->dumpPositions = !empty($options['dumpPositions']); + $this->dumpOtherAttributes = !empty($options['dumpOtherAttributes']); } /** * Dumps a node or array. * - * @param array|Node $node Node or array to dump + * @param array|Node $node Node or array to dump * @param string|null $code Code corresponding to dumped AST. This only needs to be passed if * the dumpPositions option is enabled and the dumping of node offsets * is desired. * * @return string Dumped value */ - public function dump($node, string $code = null) : string { + public function dump($node, ?string $code = null): string { $this->code = $code; - return $this->dumpRecursive($node); + $this->res = ''; + $this->nl = "\n"; + $this->dumpRecursive($node, false); + return $this->res; } - protected function dumpRecursive($node) { + /** @param mixed $node */ + protected function dumpRecursive($node, bool $indent = true): void { + if ($indent) { + $this->nl .= " "; + } if ($node instanceof Node) { - $r = $node->getType(); + $this->res .= $node->getType(); if ($this->dumpPositions && null !== $p = $this->dumpPosition($node)) { - $r .= $p; + $this->res .= $p; } - $r .= '('; + $this->res .= '('; foreach ($node->getSubNodeNames() as $key) { - $r .= "\n " . $key . ': '; + $this->res .= "$this->nl " . $key . ': '; $value = $node->$key; - if (null === $value) { - $r .= 'null'; - } elseif (false === $value) { - $r .= 'false'; - } elseif (true === $value) { - $r .= 'true'; - } elseif (is_scalar($value)) { + if (\is_int($value)) { if ('flags' === $key || 'newModifier' === $key) { - $r .= $this->dumpFlags($value); - } elseif ('type' === $key && $node instanceof Include_) { - $r .= $this->dumpIncludeType($value); - } elseif ('type' === $key - && ($node instanceof Use_ || $node instanceof UseUse || $node instanceof GroupUse)) { - $r .= $this->dumpUseType($value); - } else { - $r .= $value; + $this->res .= $this->dumpFlags($value); + continue; + } + if ('type' === $key && $node instanceof Include_) { + $this->res .= $this->dumpIncludeType($value); + continue; + } + if ('type' === $key + && ($node instanceof Use_ || $node instanceof UseItem || $node instanceof GroupUse)) { + $this->res .= $this->dumpUseType($value); + continue; } - } else { - $r .= str_replace("\n", "\n ", $this->dumpRecursive($value)); } + $this->dumpRecursive($value); } if ($this->dumpComments && $comments = $node->getComments()) { - $r .= "\n comments: " . str_replace("\n", "\n ", $this->dumpRecursive($comments)); + $this->res .= "$this->nl comments: "; + $this->dumpRecursive($comments); } - } elseif (is_array($node)) { - $r = 'array('; - foreach ($node as $key => $value) { - $r .= "\n " . $key . ': '; - - if (null === $value) { - $r .= 'null'; - } elseif (false === $value) { - $r .= 'false'; - } elseif (true === $value) { - $r .= 'true'; - } elseif (is_scalar($value)) { - $r .= $value; - } else { - $r .= str_replace("\n", "\n ", $this->dumpRecursive($value)); + if ($this->dumpOtherAttributes) { + foreach ($node->getAttributes() as $key => $value) { + if (isset(self::IGNORE_ATTRIBUTES[$key])) { + continue; + } + + $this->res .= "$this->nl $key: "; + if (\is_int($value)) { + if ('kind' === $key) { + if ($node instanceof Int_) { + $this->res .= $this->dumpIntKind($value); + continue; + } + if ($node instanceof String_ || $node instanceof InterpolatedString) { + $this->res .= $this->dumpStringKind($value); + continue; + } + if ($node instanceof Array_) { + $this->res .= $this->dumpArrayKind($value); + continue; + } + if ($node instanceof List_) { + $this->res .= $this->dumpListKind($value); + continue; + } + } + } + $this->dumpRecursive($value); } } + $this->res .= "$this->nl)"; + } elseif (\is_array($node)) { + $this->res .= 'array('; + foreach ($node as $key => $value) { + $this->res .= "$this->nl " . $key . ': '; + $this->dumpRecursive($value); + } + $this->res .= "$this->nl)"; } elseif ($node instanceof Comment) { - return $node->getReformattedText(); + $this->res .= \str_replace("\n", $this->nl, $node->getReformattedText()); + } elseif (\is_string($node)) { + $this->res .= \str_replace("\n", $this->nl, (string)$node); + } elseif (\is_int($node) || \is_float($node)) { + $this->res .= $node; + } elseif (null === $node) { + $this->res .= 'null'; + } elseif (false === $node) { + $this->res .= 'false'; + } elseif (true === $node) { + $this->res .= 'true'; } else { throw new \InvalidArgumentException('Can only dump nodes and arrays.'); } - - return $r . "\n)"; + if ($indent) { + $this->nl = \substr($this->nl, 0, -4); + } } - protected function dumpFlags($flags) { + protected function dumpFlags(int $flags): string { $strs = []; - if ($flags & Class_::MODIFIER_PUBLIC) { - $strs[] = 'MODIFIER_PUBLIC'; + if ($flags & Modifiers::PUBLIC) { + $strs[] = 'PUBLIC'; } - if ($flags & Class_::MODIFIER_PROTECTED) { - $strs[] = 'MODIFIER_PROTECTED'; + if ($flags & Modifiers::PROTECTED) { + $strs[] = 'PROTECTED'; } - if ($flags & Class_::MODIFIER_PRIVATE) { - $strs[] = 'MODIFIER_PRIVATE'; + if ($flags & Modifiers::PRIVATE) { + $strs[] = 'PRIVATE'; } - if ($flags & Class_::MODIFIER_ABSTRACT) { - $strs[] = 'MODIFIER_ABSTRACT'; + if ($flags & Modifiers::ABSTRACT) { + $strs[] = 'ABSTRACT'; } - if ($flags & Class_::MODIFIER_STATIC) { - $strs[] = 'MODIFIER_STATIC'; + if ($flags & Modifiers::STATIC) { + $strs[] = 'STATIC'; } - if ($flags & Class_::MODIFIER_FINAL) { - $strs[] = 'MODIFIER_FINAL'; + if ($flags & Modifiers::FINAL) { + $strs[] = 'FINAL'; } - if ($flags & Class_::MODIFIER_READONLY) { - $strs[] = 'MODIFIER_READONLY'; + if ($flags & Modifiers::READONLY) { + $strs[] = 'READONLY'; } if ($strs) { return implode(' | ', $strs) . ' (' . $flags . ')'; } else { - return $flags; + return (string) $flags; } } - protected function dumpIncludeType($type) { - $map = [ + /** @param array $map */ + private function dumpEnum(int $value, array $map): string { + if (!isset($map[$value])) { + return (string) $value; + } + return $map[$value] . ' (' . $value . ')'; + } + + private function dumpIncludeType(int $type): string { + return $this->dumpEnum($type, [ Include_::TYPE_INCLUDE => 'TYPE_INCLUDE', Include_::TYPE_INCLUDE_ONCE => 'TYPE_INCLUDE_ONCE', Include_::TYPE_REQUIRE => 'TYPE_REQUIRE', Include_::TYPE_REQUIRE_ONCE => 'TYPE_REQUIRE_ONCE', - ]; - - if (!isset($map[$type])) { - return $type; - } - return $map[$type] . ' (' . $type . ')'; + ]); } - protected function dumpUseType($type) { - $map = [ + private function dumpUseType(int $type): string { + return $this->dumpEnum($type, [ Use_::TYPE_UNKNOWN => 'TYPE_UNKNOWN', Use_::TYPE_NORMAL => 'TYPE_NORMAL', Use_::TYPE_FUNCTION => 'TYPE_FUNCTION', Use_::TYPE_CONSTANT => 'TYPE_CONSTANT', - ]; + ]); + } - if (!isset($map[$type])) { - return $type; - } - return $map[$type] . ' (' . $type . ')'; + private function dumpIntKind(int $kind): string { + return $this->dumpEnum($kind, [ + Int_::KIND_BIN => 'KIND_BIN', + Int_::KIND_OCT => 'KIND_OCT', + Int_::KIND_DEC => 'KIND_DEC', + Int_::KIND_HEX => 'KIND_HEX', + ]); + } + + private function dumpStringKind(int $kind): string { + return $this->dumpEnum($kind, [ + String_::KIND_SINGLE_QUOTED => 'KIND_SINGLE_QUOTED', + String_::KIND_DOUBLE_QUOTED => 'KIND_DOUBLE_QUOTED', + String_::KIND_HEREDOC => 'KIND_HEREDOC', + String_::KIND_NOWDOC => 'KIND_NOWDOC', + ]); + } + + private function dumpArrayKind(int $kind): string { + return $this->dumpEnum($kind, [ + Array_::KIND_LONG => 'KIND_LONG', + Array_::KIND_SHORT => 'KIND_SHORT', + ]); + } + + private function dumpListKind(int $kind): string { + return $this->dumpEnum($kind, [ + List_::KIND_LIST => 'KIND_LIST', + List_::KIND_ARRAY => 'KIND_ARRAY', + ]); } /** @@ -174,7 +258,7 @@ class NodeDumper * * @return string|null Dump of position, or null if position information not available */ - protected function dumpPosition(Node $node) { + protected function dumpPosition(Node $node): ?string { if (!$node->hasAttribute('startLine') || !$node->hasAttribute('endLine')) { return null; } @@ -191,7 +275,7 @@ class NodeDumper } // Copied from Error class - private function toColumn($code, $pos) { + private function toColumn(string $code, int $pos): int { if ($pos > strlen($code)) { throw new \RuntimeException('Invalid position information'); } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php index 2e7cfdad..96c84526 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php @@ -5,25 +5,27 @@ namespace PhpParser; use PhpParser\NodeVisitor\FindingVisitor; use PhpParser\NodeVisitor\FirstFindingVisitor; -class NodeFinder -{ +class NodeFinder { /** * Find all nodes satisfying a filter callback. * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param callable $filter Filter callback: function(Node $node) : bool + * @param Node|Node[] $nodes Single node or array of nodes to search in + * @param callable $filter Filter callback: function(Node $node) : bool * * @return Node[] Found nodes satisfying the filter callback */ - public function find($nodes, callable $filter) : array { + public function find($nodes, callable $filter): array { + if ($nodes === []) { + return []; + } + if (!is_array($nodes)) { $nodes = [$nodes]; } $visitor = new FindingVisitor($filter); - $traverser = new NodeTraverser; - $traverser->addVisitor($visitor); + $traverser = new NodeTraverser($visitor); $traverser->traverse($nodes); return $visitor->getFoundNodes(); @@ -31,13 +33,15 @@ class NodeFinder /** * Find all nodes that are instances of a certain class. + + * @template TNode as Node * * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param string $class Class name + * @param class-string $class Class name * - * @return Node[] Found nodes (all instances of $class) + * @return TNode[] Found nodes (all instances of $class) */ - public function findInstanceOf($nodes, string $class) : array { + public function findInstanceOf($nodes, string $class): array { return $this->find($nodes, function ($node) use ($class) { return $node instanceof $class; }); @@ -46,20 +50,23 @@ class NodeFinder /** * Find first node satisfying a filter callback. * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param callable $filter Filter callback: function(Node $node) : bool + * @param Node|Node[] $nodes Single node or array of nodes to search in + * @param callable $filter Filter callback: function(Node $node) : bool * * @return null|Node Found node (or null if none found) */ - public function findFirst($nodes, callable $filter) { + public function findFirst($nodes, callable $filter): ?Node { + if ($nodes === []) { + return null; + } + if (!is_array($nodes)) { $nodes = [$nodes]; } $visitor = new FirstFindingVisitor($filter); - $traverser = new NodeTraverser; - $traverser->addVisitor($visitor); + $traverser = new NodeTraverser($visitor); $traverser->traverse($nodes); return $visitor->getFoundNode(); @@ -68,12 +75,14 @@ class NodeFinder /** * Find first node that is an instance of a certain class. * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param string $class Class name + * @template TNode as Node + * + * @param Node|Node[] $nodes Single node or array of nodes to search in + * @param class-string $class Class name * - * @return null|Node Found node, which is an instance of $class (or null if none found) + * @return null|TNode Found node, which is an instance of $class (or null if none found) */ - public function findFirstInstanceOf($nodes, string $class) { + public function findFirstInstanceOf($nodes, string $class): ?Node { return $this->findFirst($nodes, function ($node) use ($class) { return $node instanceof $class; }); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php index 97d45bda..f5b868a1 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php @@ -2,51 +2,40 @@ namespace PhpParser; -class NodeTraverser implements NodeTraverserInterface -{ +class NodeTraverser implements NodeTraverserInterface { /** - * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CHILDREN, child nodes - * of the current node will not be traversed for any visitors. - * - * For subsequent visitors enterNode() will still be called on the current - * node and leaveNode() will also be invoked for the current node. + * @deprecated Use NodeVisitor::DONT_TRAVERSE_CHILDREN instead. */ - const DONT_TRAVERSE_CHILDREN = 1; + public const DONT_TRAVERSE_CHILDREN = NodeVisitor::DONT_TRAVERSE_CHILDREN; /** - * If NodeVisitor::enterNode() or NodeVisitor::leaveNode() returns - * STOP_TRAVERSAL, traversal is aborted. - * - * The afterTraverse() method will still be invoked. + * @deprecated Use NodeVisitor::STOP_TRAVERSAL instead. */ - const STOP_TRAVERSAL = 2; + public const STOP_TRAVERSAL = NodeVisitor::STOP_TRAVERSAL; /** - * If NodeVisitor::leaveNode() returns REMOVE_NODE for a node that occurs - * in an array, it will be removed from the array. - * - * For subsequent visitors leaveNode() will still be invoked for the - * removed node. + * @deprecated Use NodeVisitor::REMOVE_NODE instead. */ - const REMOVE_NODE = 3; + public const REMOVE_NODE = NodeVisitor::REMOVE_NODE; /** - * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CURRENT_AND_CHILDREN, child nodes - * of the current node will not be traversed for any visitors. - * - * For subsequent visitors enterNode() will not be called as well. - * leaveNode() will be invoked for visitors that has enterNode() method invoked. + * @deprecated Use NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN instead. */ - const DONT_TRAVERSE_CURRENT_AND_CHILDREN = 4; + public const DONT_TRAVERSE_CURRENT_AND_CHILDREN = NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; - /** @var NodeVisitor[] Visitors */ - protected $visitors = []; + /** @var list Visitors */ + protected array $visitors = []; /** @var bool Whether traversal should be stopped */ - protected $stopTraversal; + protected bool $stopTraversal; - public function __construct() { - // for BC + /** + * Create a traverser with the given visitors. + * + * @param NodeVisitor ...$visitors Node visitors + */ + public function __construct(NodeVisitor ...$visitors) { + $this->visitors = $visitors; } /** @@ -54,21 +43,17 @@ class NodeTraverser implements NodeTraverserInterface * * @param NodeVisitor $visitor Visitor to add */ - public function addVisitor(NodeVisitor $visitor) { + public function addVisitor(NodeVisitor $visitor): void { $this->visitors[] = $visitor; } /** * Removes an added visitor. - * - * @param NodeVisitor $visitor */ - public function removeVisitor(NodeVisitor $visitor) { - foreach ($this->visitors as $index => $storedVisitor) { - if ($storedVisitor === $visitor) { - unset($this->visitors[$index]); - break; - } + public function removeVisitor(NodeVisitor $visitor): void { + $index = array_search($visitor, $this->visitors); + if ($index !== false) { + array_splice($this->visitors, $index, 1, []); } } @@ -79,7 +64,7 @@ class NodeTraverser implements NodeTraverserInterface * * @return Node[] Traversed array of nodes */ - public function traverse(array $nodes) : array { + public function traverse(array $nodes): array { $this->stopTraversal = false; foreach ($this->visitors as $visitor) { @@ -90,7 +75,8 @@ class NodeTraverser implements NodeTraverserInterface $nodes = $this->traverseArray($nodes); - foreach ($this->visitors as $visitor) { + for ($i = \count($this->visitors) - 1; $i >= 0; --$i) { + $visitor = $this->visitors[$i]; if (null !== $return = $visitor->afterTraverse($nodes)) { $nodes = $return; } @@ -103,37 +89,37 @@ class NodeTraverser implements NodeTraverserInterface * Recursively traverse a node. * * @param Node $node Node to traverse. - * - * @return Node Result of traversal (may be original node or new one) */ - protected function traverseNode(Node $node) : Node { + protected function traverseNode(Node $node): void { foreach ($node->getSubNodeNames() as $name) { - $subNode =& $node->$name; + $subNode = $node->$name; if (\is_array($subNode)) { - $subNode = $this->traverseArray($subNode); + $node->$name = $this->traverseArray($subNode); if ($this->stopTraversal) { break; } } elseif ($subNode instanceof Node) { $traverseChildren = true; - $breakVisitorIndex = null; + $visitorIndex = -1; foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($subNode); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($subNode, $return); - $subNode = $return; - } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { + $subNode = $node->$name = $return; + } elseif (NodeVisitor::DONT_TRAVERSE_CHILDREN === $return) { $traverseChildren = false; - } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { + } elseif (NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { $traverseChildren = false; - $breakVisitorIndex = $visitorIndex; break; - } elseif (self::STOP_TRAVERSAL === $return) { + } elseif (NodeVisitor::STOP_TRAVERSAL === $return) { $this->stopTraversal = true; break 2; + } elseif (NodeVisitor::REPLACE_WITH_NULL === $return) { + $node->$name = null; + continue 2; } else { throw new \LogicException( 'enterNode() returned invalid value of type ' . gettype($return) @@ -143,22 +129,26 @@ class NodeTraverser implements NodeTraverserInterface } if ($traverseChildren) { - $subNode = $this->traverseNode($subNode); + $this->traverseNode($subNode); if ($this->stopTraversal) { break; } } - foreach ($this->visitors as $visitorIndex => $visitor) { + for (; $visitorIndex >= 0; --$visitorIndex) { + $visitor = $this->visitors[$visitorIndex]; $return = $visitor->leaveNode($subNode); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($subNode, $return); - $subNode = $return; - } elseif (self::STOP_TRAVERSAL === $return) { + $subNode = $node->$name = $return; + } elseif (NodeVisitor::STOP_TRAVERSAL === $return) { $this->stopTraversal = true; break 2; + } elseif (NodeVisitor::REPLACE_WITH_NULL === $return) { + $node->$name = null; + break; } elseif (\is_array($return)) { throw new \LogicException( 'leaveNode() may only return an array ' . @@ -170,15 +160,9 @@ class NodeTraverser implements NodeTraverserInterface ); } } - - if ($breakVisitorIndex === $visitorIndex) { - break; - } } } } - - return $node; } /** @@ -188,29 +172,37 @@ class NodeTraverser implements NodeTraverserInterface * * @return array Result of traversal (may be original array or changed one) */ - protected function traverseArray(array $nodes) : array { + protected function traverseArray(array $nodes): array { $doNodes = []; - foreach ($nodes as $i => &$node) { + foreach ($nodes as $i => $node) { if ($node instanceof Node) { $traverseChildren = true; - $breakVisitorIndex = null; + $visitorIndex = -1; foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($node); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($node, $return); - $node = $return; - } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { + $nodes[$i] = $node = $return; + } elseif (\is_array($return)) { + $doNodes[] = [$i, $return]; + continue 2; + } elseif (NodeVisitor::REMOVE_NODE === $return) { + $doNodes[] = [$i, []]; + continue 2; + } elseif (NodeVisitor::DONT_TRAVERSE_CHILDREN === $return) { $traverseChildren = false; - } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { + } elseif (NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { $traverseChildren = false; - $breakVisitorIndex = $visitorIndex; break; - } elseif (self::STOP_TRAVERSAL === $return) { + } elseif (NodeVisitor::STOP_TRAVERSAL === $return) { $this->stopTraversal = true; break 2; + } elseif (NodeVisitor::REPLACE_WITH_NULL === $return) { + throw new \LogicException( + 'REPLACE_WITH_NULL can not be used if the parent structure is an array'); } else { throw new \LogicException( 'enterNode() returned invalid value of type ' . gettype($return) @@ -220,43 +212,38 @@ class NodeTraverser implements NodeTraverserInterface } if ($traverseChildren) { - $node = $this->traverseNode($node); + $this->traverseNode($node); if ($this->stopTraversal) { break; } } - foreach ($this->visitors as $visitorIndex => $visitor) { + for (; $visitorIndex >= 0; --$visitorIndex) { + $visitor = $this->visitors[$visitorIndex]; $return = $visitor->leaveNode($node); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($node, $return); - $node = $return; + $nodes[$i] = $node = $return; } elseif (\is_array($return)) { $doNodes[] = [$i, $return]; break; - } elseif (self::REMOVE_NODE === $return) { + } elseif (NodeVisitor::REMOVE_NODE === $return) { $doNodes[] = [$i, []]; break; - } elseif (self::STOP_TRAVERSAL === $return) { + } elseif (NodeVisitor::STOP_TRAVERSAL === $return) { $this->stopTraversal = true; break 2; - } elseif (false === $return) { + } elseif (NodeVisitor::REPLACE_WITH_NULL === $return) { throw new \LogicException( - 'bool(false) return from leaveNode() no longer supported. ' . - 'Return NodeTraverser::REMOVE_NODE instead' - ); + 'REPLACE_WITH_NULL can not be used if the parent structure is an array'); } else { throw new \LogicException( 'leaveNode() returned invalid value of type ' . gettype($return) ); } } - - if ($breakVisitorIndex === $visitorIndex) { - break; - } } } elseif (\is_array($node)) { throw new \LogicException('Invalid node structure: Contains nested arrays'); @@ -272,7 +259,7 @@ class NodeTraverser implements NodeTraverserInterface return $nodes; } - private function ensureReplacementReasonable($old, $new) { + private function ensureReplacementReasonable(Node $old, Node $new): void { if ($old instanceof Node\Stmt && $new instanceof Node\Expr) { throw new \LogicException( "Trying to replace statement ({$old->getType()}) " . diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php index 77ff3d27..c3992b3d 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php @@ -2,21 +2,18 @@ namespace PhpParser; -interface NodeTraverserInterface -{ +interface NodeTraverserInterface { /** * Adds a visitor. * * @param NodeVisitor $visitor Visitor to add */ - public function addVisitor(NodeVisitor $visitor); + public function addVisitor(NodeVisitor $visitor): void; /** * Removes an added visitor. - * - * @param NodeVisitor $visitor */ - public function removeVisitor(NodeVisitor $visitor); + public function removeVisitor(NodeVisitor $visitor): void; /** * Traverses an array of nodes using the registered visitors. @@ -25,5 +22,5 @@ interface NodeTraverserInterface * * @return Node[] Traversed array of nodes */ - public function traverse(array $nodes) : array; + public function traverse(array $nodes): array; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php index f1f7f3e3..0ec4f7be 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php @@ -2,8 +2,49 @@ namespace PhpParser; -interface NodeVisitor -{ +interface NodeVisitor { + /** + * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CHILDREN, child nodes + * of the current node will not be traversed for any visitors. + * + * For subsequent visitors enterNode() will still be called on the current + * node and leaveNode() will also be invoked for the current node. + */ + public const DONT_TRAVERSE_CHILDREN = 1; + + /** + * If NodeVisitor::enterNode() or NodeVisitor::leaveNode() returns + * STOP_TRAVERSAL, traversal is aborted. + * + * The afterTraverse() method will still be invoked. + */ + public const STOP_TRAVERSAL = 2; + + /** + * If NodeVisitor::leaveNode() returns REMOVE_NODE for a node that occurs + * in an array, it will be removed from the array. + * + * For subsequent visitors leaveNode() will still be invoked for the + * removed node. + */ + public const REMOVE_NODE = 3; + + /** + * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CURRENT_AND_CHILDREN, child nodes + * of the current node will not be traversed for any visitors. + * + * For subsequent visitors enterNode() will not be called as well. + * leaveNode() will be invoked for visitors that has enterNode() method invoked. + */ + public const DONT_TRAVERSE_CURRENT_AND_CHILDREN = 4; + + /** + * If NodeVisitor::enterNode() or NodeVisitor::leaveNode() returns REPLACE_WITH_NULL, + * the node will be replaced with null. This is not a legal return value if the node is part + * of an array, rather than another node. + */ + public const REPLACE_WITH_NULL = 5; + /** * Called once before traversal. * @@ -23,16 +64,25 @@ interface NodeVisitor * Return value semantics: * * null * => $node stays as-is - * * NodeTraverser::DONT_TRAVERSE_CHILDREN + * * array (of Nodes) + * => The return value is merged into the parent array (at the position of the $node) + * * NodeVisitor::REMOVE_NODE + * => $node is removed from the parent array + * * NodeVisitor::REPLACE_WITH_NULL + * => $node is replaced with null + * * NodeVisitor::DONT_TRAVERSE_CHILDREN * => Children of $node are not traversed. $node stays as-is - * * NodeTraverser::STOP_TRAVERSAL + * * NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN + * => Further visitors for the current node are skipped, and its children are not + * traversed. $node stays as-is. + * * NodeVisitor::STOP_TRAVERSAL * => Traversal is aborted. $node stays as-is * * otherwise * => $node is set to the return value * * @param Node $node Node * - * @return null|int|Node Replacement node (or special return value) + * @return null|int|Node|Node[] Replacement node (or special return value) */ public function enterNode(Node $node); @@ -42,9 +92,11 @@ interface NodeVisitor * Return value semantics: * * null * => $node stays as-is - * * NodeTraverser::REMOVE_NODE + * * NodeVisitor::REMOVE_NODE * => $node is removed from the parent array - * * NodeTraverser::STOP_TRAVERSAL + * * NodeVisitor::REPLACE_WITH_NULL + * => $node is replaced with null + * * NodeVisitor::STOP_TRAVERSAL * => Traversal is aborted. $node stays as-is * * array (of Nodes) * => The return value is merged into the parent array (at the position of the $node) diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php index a85fa493..cba92499 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php @@ -10,8 +10,7 @@ use PhpParser\NodeVisitorAbstract; * * This visitor is required to perform format-preserving pretty prints. */ -class CloningVisitor extends NodeVisitorAbstract -{ +class CloningVisitor extends NodeVisitorAbstract { public function enterNode(Node $origNode) { $node = clone $origNode; $node->setAttribute('origNode', $origNode); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php new file mode 100644 index 00000000..5e2aed31 --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php @@ -0,0 +1,82 @@ + Token positions of comments */ + private array $commentPositions = []; + + /** + * Create a comment annotation visitor. + * + * @param Token[] $tokens Token array + */ + public function __construct(array $tokens) { + $this->tokens = $tokens; + + // Collect positions of comments. We use this to avoid traversing parts of the AST where + // there are no comments. + foreach ($tokens as $i => $token) { + if ($token->id === \T_COMMENT || $token->id === \T_DOC_COMMENT) { + $this->commentPositions[] = $i; + } + } + } + + public function enterNode(Node $node) { + $nextCommentPos = current($this->commentPositions); + if ($nextCommentPos === false) { + // No more comments. + return self::STOP_TRAVERSAL; + } + + $oldPos = $this->pos; + $this->pos = $pos = $node->getStartTokenPos(); + if ($nextCommentPos > $oldPos && $nextCommentPos < $pos) { + $comments = []; + while (--$pos >= $oldPos) { + $token = $this->tokens[$pos]; + if ($token->id === \T_DOC_COMMENT) { + $comments[] = new Comment\Doc( + $token->text, $token->line, $token->pos, $pos, + $token->getEndLine(), $token->getEndPos() - 1, $pos); + continue; + } + if ($token->id === \T_COMMENT) { + $comments[] = new Comment( + $token->text, $token->line, $token->pos, $pos, + $token->getEndLine(), $token->getEndPos() - 1, $pos); + continue; + } + if ($token->id !== \T_WHITESPACE) { + break; + } + } + if (!empty($comments)) { + $node->setAttribute('comments', array_reverse($comments)); + } + + do { + $nextCommentPos = next($this->commentPositions); + } while ($nextCommentPos !== false && $nextCommentPos < $this->pos); + } + + $endPos = $node->getEndTokenPos(); + if ($nextCommentPos > $endPos) { + // Skip children if there are no comments located inside this node. + $this->pos = $endPos; + return self::DONT_TRAVERSE_CHILDREN; + } + + return null; + } +} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php index 9531edbc..1f3f4bae 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php @@ -9,12 +9,11 @@ use PhpParser\NodeVisitorAbstract; * This visitor can be used to find and collect all nodes satisfying some criterion determined by * a filter callback. */ -class FindingVisitor extends NodeVisitorAbstract -{ +class FindingVisitor extends NodeVisitorAbstract { /** @var callable Filter callback */ protected $filterCallback; /** @var Node[] Found nodes */ - protected $foundNodes; + protected array $foundNodes; public function __construct(callable $filterCallback) { $this->filterCallback = $filterCallback; @@ -27,11 +26,11 @@ class FindingVisitor extends NodeVisitorAbstract * * @return Node[] Found nodes */ - public function getFoundNodes() : array { + public function getFoundNodes(): array { return $this->foundNodes; } - public function beforeTraverse(array $nodes) { + public function beforeTraverse(array $nodes): ?array { $this->foundNodes = []; return null; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php index 596a7d7f..05deed59 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php @@ -3,19 +3,18 @@ namespace PhpParser\NodeVisitor; use PhpParser\Node; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PhpParser\NodeVisitorAbstract; /** * This visitor can be used to find the first node satisfying some criterion determined by * a filter callback. */ -class FirstFindingVisitor extends NodeVisitorAbstract -{ +class FirstFindingVisitor extends NodeVisitorAbstract { /** @var callable Filter callback */ protected $filterCallback; /** @var null|Node Found node */ - protected $foundNode; + protected ?Node $foundNode; public function __construct(callable $filterCallback) { $this->filterCallback = $filterCallback; @@ -28,11 +27,11 @@ class FirstFindingVisitor extends NodeVisitorAbstract * * @return null|Node Found node (or null if not found) */ - public function getFoundNode() { + public function getFoundNode(): ?Node { return $this->foundNode; } - public function beforeTraverse(array $nodes) { + public function beforeTraverse(array $nodes): ?array { $this->foundNode = null; return null; @@ -42,7 +41,7 @@ class FirstFindingVisitor extends NodeVisitorAbstract $filterCallback = $this->filterCallback; if ($filterCallback($node)) { $this->foundNode = $node; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } return null; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php index d0e7de02..ccd014eb 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php @@ -11,16 +11,15 @@ use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt; use PhpParser\NodeVisitorAbstract; -class NameResolver extends NodeVisitorAbstract -{ +class NameResolver extends NodeVisitorAbstract { /** @var NameContext Naming context */ - protected $nameContext; + protected NameContext $nameContext; /** @var bool Whether to preserve original names */ - protected $preserveOriginalNames; + protected bool $preserveOriginalNames; /** @var bool Whether to replace resolved nodes in place, or to add resolvedNode attributes */ - protected $replaceNodes; + protected bool $replaceNodes; /** * Constructs a name resolution visitor. @@ -33,24 +32,22 @@ class NameResolver extends NodeVisitorAbstract * namespacedName attribute, as usual.) * * @param ErrorHandler|null $errorHandler Error handler - * @param array $options Options + * @param array{preserveOriginalNames?: bool, replaceNodes?: bool} $options Options */ - public function __construct(ErrorHandler $errorHandler = null, array $options = []) { - $this->nameContext = new NameContext($errorHandler ?? new ErrorHandler\Throwing); + public function __construct(?ErrorHandler $errorHandler = null, array $options = []) { + $this->nameContext = new NameContext($errorHandler ?? new ErrorHandler\Throwing()); $this->preserveOriginalNames = $options['preserveOriginalNames'] ?? false; $this->replaceNodes = $options['replaceNodes'] ?? true; } /** * Get name resolution context. - * - * @return NameContext */ - public function getNameContext() : NameContext { + public function getNameContext(): NameContext { return $this->nameContext; } - public function beforeTraverse(array $nodes) { + public function beforeTraverse(array $nodes): ?array { $this->nameContext->startNamespace(); return null; } @@ -78,6 +75,8 @@ class NameResolver extends NodeVisitorAbstract $this->resolveAttrGroups($node); if (null !== $node->name) { $this->addNamespacedName($node); + } else { + $node->namespacedName = null; } } elseif ($node instanceof Stmt\Interface_) { foreach ($node->extends as &$interface) { @@ -86,15 +85,13 @@ class NameResolver extends NodeVisitorAbstract $this->resolveAttrGroups($node); $this->addNamespacedName($node); - } elseif ($node instanceof Stmt\Enum_) { + } elseif ($node instanceof Stmt\Enum_) { foreach ($node->implements as &$interface) { $interface = $this->resolveClassName($interface); } $this->resolveAttrGroups($node); - if (null !== $node->name) { - $this->addNamespacedName($node); - } + $this->addNamespacedName($node); } elseif ($node instanceof Stmt\Trait_) { $this->resolveAttrGroups($node); $this->addNamespacedName($node); @@ -117,9 +114,12 @@ class NameResolver extends NodeVisitorAbstract foreach ($node->consts as $const) { $this->addNamespacedName($const); } - } else if ($node instanceof Stmt\ClassConst) { + } elseif ($node instanceof Stmt\ClassConst) { + if (null !== $node->type) { + $node->type = $this->resolveType($node->type); + } $this->resolveAttrGroups($node); - } else if ($node instanceof Stmt\EnumCase) { + } elseif ($node instanceof Stmt\EnumCase) { $this->resolveAttrGroups($node); } elseif ($node instanceof Expr\StaticCall || $node instanceof Expr\StaticPropertyFetch @@ -161,7 +161,8 @@ class NameResolver extends NodeVisitorAbstract return null; } - private function addAlias(Stmt\UseUse $use, int $type, Name $prefix = null) { + /** @param Stmt\Use_::TYPE_* $type */ + private function addAlias(Node\UseItem $use, int $type, ?Name $prefix = null): void { // Add prefix for group uses $name = $prefix ? Name::concat($prefix, $use->name) : $use->name; // Type is determined either by individual element or whole use declaration @@ -172,8 +173,8 @@ class NameResolver extends NodeVisitorAbstract ); } - /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure $node */ - private function resolveSignature($node) { + /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure|Expr\ArrowFunction $node */ + private function resolveSignature($node): void { foreach ($node->params as $param) { $param->type = $this->resolveType($param->type); $this->resolveAttrGroups($param); @@ -181,7 +182,12 @@ class NameResolver extends NodeVisitorAbstract $node->returnType = $this->resolveType($node->returnType); } - private function resolveType($node) { + /** + * @template T of Node\Identifier|Name|Node\ComplexType|null + * @param T $node + * @return T + */ + private function resolveType(?Node $node): ?Node { if ($node instanceof Name) { return $this->resolveClassName($node); } @@ -202,11 +208,11 @@ class NameResolver extends NodeVisitorAbstract * Resolve name, according to name resolver options. * * @param Name $name Function or constant name to resolve - * @param int $type One of Stmt\Use_::TYPE_* + * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_* * * @return Name Resolved name, or original name with attribute */ - protected function resolveName(Name $name, int $type) : Name { + protected function resolveName(Name $name, int $type): Name { if (!$this->replaceNodes) { $resolvedName = $this->nameContext->getResolvedName($name, $type); if (null !== $resolvedName) { @@ -237,17 +243,16 @@ class NameResolver extends NodeVisitorAbstract return $name; } - protected function resolveClassName(Name $name) { + protected function resolveClassName(Name $name): Name { return $this->resolveName($name, Stmt\Use_::TYPE_NORMAL); } - protected function addNamespacedName(Node $node) { + protected function addNamespacedName(Node $node): void { $node->namespacedName = Name::concat( $this->nameContext->getNamespace(), (string) $node->name); } - protected function resolveAttrGroups(Node $node) - { + protected function resolveAttrGroups(Node $node): void { foreach ($node->attrGroups as $attrGroup) { foreach ($attrGroup->attrs as $attr) { $attr->name = $this->resolveClassName($attr->name); diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php index ea372e5b..38fedfd5 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php @@ -14,12 +14,11 @@ use PhpParser\NodeVisitorAbstract; * node can be accessed through $node->getAttribute('previous'), * and the next node can be accessed through $node->getAttribute('next'). */ -final class NodeConnectingVisitor extends NodeVisitorAbstract -{ +final class NodeConnectingVisitor extends NodeVisitorAbstract { /** * @var Node[] */ - private $stack = []; + private array $stack = []; /** * @var ?Node diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php index b98d2bfa..1e7e9e8b 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php @@ -2,31 +2,29 @@ namespace PhpParser\NodeVisitor; -use function array_pop; -use function count; use PhpParser\Node; use PhpParser\NodeVisitorAbstract; +use function array_pop; +use function count; + /** * Visitor that connects a child node to its parent node. * * On the child node, the parent node can be accessed through * $node->getAttribute('parent'). */ -final class ParentConnectingVisitor extends NodeVisitorAbstract -{ +final class ParentConnectingVisitor extends NodeVisitorAbstract { /** * @var Node[] */ - private $stack = []; + private array $stack = []; - public function beforeTraverse(array $nodes) - { + public function beforeTraverse(array $nodes) { $this->stack = []; } - public function enterNode(Node $node) - { + public function enterNode(Node $node) { if (!empty($this->stack)) { $node->setAttribute('parent', $this->stack[count($this->stack) - 1]); } @@ -34,8 +32,7 @@ final class ParentConnectingVisitor extends NodeVisitorAbstract $this->stack[] = $node; } - public function leaveNode(Node $node) - { + public function leaveNode(Node $node) { array_pop($this->stack); } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php index d378d670..6fb15cca 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php @@ -5,8 +5,7 @@ namespace PhpParser; /** * @codeCoverageIgnore */ -class NodeVisitorAbstract implements NodeVisitor -{ +abstract class NodeVisitorAbstract implements NodeVisitor { public function beforeTraverse(array $nodes) { return null; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser.php index 8956c767..68954afe 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser.php @@ -2,8 +2,7 @@ namespace PhpParser; -interface Parser -{ +interface Parser { /** * Parses PHP code into a node tree. * @@ -14,5 +13,12 @@ interface Parser * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and * the parser was unable to recover from an error). */ - public function parse(string $code, ErrorHandler $errorHandler = null); + public function parse(string $code, ?ErrorHandler $errorHandler = null): ?array; + + /** + * Return tokens for the last parse. + * + * @return Token[] + */ + public function getTokens(): array; } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php deleted file mode 100644 index 77fd1f3f..00000000 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php +++ /dev/null @@ -1,55 +0,0 @@ -parsers = $parsers; - } - - public function parse(string $code, ErrorHandler $errorHandler = null) { - if (null === $errorHandler) { - $errorHandler = new ErrorHandler\Throwing; - } - - list($firstStmts, $firstError) = $this->tryParse($this->parsers[0], $errorHandler, $code); - if ($firstError === null) { - return $firstStmts; - } - - for ($i = 1, $c = count($this->parsers); $i < $c; ++$i) { - list($stmts, $error) = $this->tryParse($this->parsers[$i], $errorHandler, $code); - if ($error === null) { - return $stmts; - } - } - - throw $firstError; - } - - private function tryParse(Parser $parser, ErrorHandler $errorHandler, $code) { - $stmts = null; - $error = null; - try { - $stmts = $parser->parse($code, $errorHandler); - } catch (Error $error) {} - return [$stmts, $error]; - } -} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php deleted file mode 100644 index a4306710..00000000 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php +++ /dev/null @@ -1,2682 +0,0 @@ -'", - "T_IS_GREATER_OR_EQUAL", - "T_SL", - "T_SR", - "'+'", - "'-'", - "'.'", - "'*'", - "'/'", - "'%'", - "'!'", - "T_INSTANCEOF", - "'~'", - "T_INC", - "T_DEC", - "T_INT_CAST", - "T_DOUBLE_CAST", - "T_STRING_CAST", - "T_ARRAY_CAST", - "T_OBJECT_CAST", - "T_BOOL_CAST", - "T_UNSET_CAST", - "'@'", - "T_POW", - "'['", - "T_NEW", - "T_CLONE", - "T_EXIT", - "T_IF", - "T_ELSEIF", - "T_ELSE", - "T_ENDIF", - "T_LNUMBER", - "T_DNUMBER", - "T_STRING", - "T_STRING_VARNAME", - "T_VARIABLE", - "T_NUM_STRING", - "T_INLINE_HTML", - "T_ENCAPSED_AND_WHITESPACE", - "T_CONSTANT_ENCAPSED_STRING", - "T_ECHO", - "T_DO", - "T_WHILE", - "T_ENDWHILE", - "T_FOR", - "T_ENDFOR", - "T_FOREACH", - "T_ENDFOREACH", - "T_DECLARE", - "T_ENDDECLARE", - "T_AS", - "T_SWITCH", - "T_MATCH", - "T_ENDSWITCH", - "T_CASE", - "T_DEFAULT", - "T_BREAK", - "T_CONTINUE", - "T_GOTO", - "T_FUNCTION", - "T_FN", - "T_CONST", - "T_RETURN", - "T_TRY", - "T_CATCH", - "T_FINALLY", - "T_USE", - "T_INSTEADOF", - "T_GLOBAL", - "T_STATIC", - "T_ABSTRACT", - "T_FINAL", - "T_PRIVATE", - "T_PROTECTED", - "T_PUBLIC", - "T_READONLY", - "T_VAR", - "T_UNSET", - "T_ISSET", - "T_EMPTY", - "T_HALT_COMPILER", - "T_CLASS", - "T_TRAIT", - "T_INTERFACE", - "T_EXTENDS", - "T_IMPLEMENTS", - "T_OBJECT_OPERATOR", - "T_LIST", - "T_ARRAY", - "T_CALLABLE", - "T_CLASS_C", - "T_TRAIT_C", - "T_METHOD_C", - "T_FUNC_C", - "T_LINE", - "T_FILE", - "T_START_HEREDOC", - "T_END_HEREDOC", - "T_DOLLAR_OPEN_CURLY_BRACES", - "T_CURLY_OPEN", - "T_PAAMAYIM_NEKUDOTAYIM", - "T_NAMESPACE", - "T_NS_C", - "T_DIR", - "T_NS_SEPARATOR", - "T_ELLIPSIS", - "T_NAME_FULLY_QUALIFIED", - "T_NAME_QUALIFIED", - "T_NAME_RELATIVE", - "';'", - "'{'", - "'}'", - "'('", - "')'", - "'$'", - "'`'", - "']'", - "'\"'", - "T_ENUM", - "T_NULLSAFE_OBJECT_OPERATOR", - "T_ATTRIBUTE" - ); - - protected $tokenToSymbol = array( - 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 56, 164, 168, 161, 55, 168, 168, - 159, 160, 53, 50, 8, 51, 52, 54, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 31, 156, - 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 70, 168, 163, 36, 168, 162, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 157, 35, 158, 58, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, - 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, - 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 165, 131, - 132, 133, 166, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 167 - ); - - protected $action = array( - 700, 670, 671, 672, 673, 674, 286, 675, 676, 677, - 713, 714, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 0, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244,-32766,-32766,-32766,-32766,-32766, - -32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767, 245, 246, - 242, 243, 244,-32766,-32766, 678,-32766,-32766,-32766,-32766, - -32766,-32766,-32766,-32766,-32766, 1229, 245, 246, 1230, 679, - 680, 681, 682, 683, 684, 685, 899, 900, 747,-32766, - -32766,-32766,-32766,-32766,-32766, 686, 687, 688, 689, 690, - 691, 692, 693, 694, 695, 696, 716, 739, 717, 718, - 719, 720, 708, 709, 710, 738, 711, 712, 697, 698, - 699, 701, 702, 703, 741, 742, 743, 744, 745, 746, - 875, 704, 705, 706, 707, 737, 728, 726, 727, 723, - 724, 1046, 715, 721, 722, 729, 730, 732, 731, 733, - 734, 55, 56, 425, 57, 58, 725, 736, 735, 755, - 59, 60, -226, 61,-32766,-32766,-32766,-32766,-32766,-32766, - -32766,-32766,-32766,-32766, 337,-32767,-32767,-32767,-32767, 29, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 620,-32766,-32766,-32766,-32766, 62, 63, - 1046,-32766,-32766,-32766, 64, 419, 65, 294, 295, 66, - 67, 68, 69, 70, 71, 72, 73, 823, 25, 302, - 74, 418, 984, 986, 669, 668, 1100, 1101, 1078, 755, - 755, 767, 1220, 768, 470,-32766,-32766,-32766, 341, 749, - 824, 54,-32767,-32767,-32767,-32767, 98, 99, 100, 101, - 102, 220, 221, 222, 362, 876,-32766, 27,-32766,-32766, - -32766,-32766,-32766, 1046, 493, 126, 1080, 1079, 1081, 370, - 1068, 930, 207, 478, 479, 952, 953, 954, 951, 950, - 949, 128, 480, 481, 803, 1106, 1107, 1108, 1109, 1103, - 1104, 319, 32, 297, 10, 211, -515, 1110, 1105, 669, - 668, 1080, 1079, 1081, 220, 221, 222, 41, 364, 341, - 334, 421, 336, 426, -128, -128, -128, 313, 1046, 469, - -4, 824, 54, 812, 770, 207, 40, 21, 427, -128, - 471, -128, 472, -128, 473, -128, 1046, 428, 220, 221, - 222,-32766, 33, 34, 429, 361, 327, 52, 35, 474, - -32766,-32766,-32766, 342, 357, 358, 475, 476, 48, 207, - 249, 669, 668, 477, 443, 300, 795, 846, 430, 431, - 28,-32766, 814,-32766,-32766,-32766,-32766,-32766,-32766,-32766, - -32767,-32767,-32767,-32767,-32767, 952, 953, 954, 951, 950, - 949, 422, 755, 424, 426, 826, 634, -128,-32766,-32766, - 469, 824, 54, 288, 812, 1151, 755, 40, 21, 427, - 317, 471, 345, 472, 129, 473, 9, 1186, 428, 769, - 360, 324, 905, 33, 34, 429, 361, 1046, 415, 35, - 474, 944, 1068, 315, 125, 357, 358, 475, 476,-32766, - -32766,-32766, 926, 302, 477, 121, 1068, 759, 846, 430, - 431, 669, 668, 423, 755, 1152, 809, 1046, 480, 766, - -32766, 805,-32766,-32766,-32766,-32766, -261, 127, 347, 436, - 841, 341, 1078, 1200, 426, 446, 826, 634, -4, 807, - 469, 824, 54, 436, 812, 341, 755, 40, 21, 427, - 444, 471, 130, 472, 1068, 473, 346, 767, 428, 768, - -211, -211, -211, 33, 34, 429, 361, 308, 1076, 35, - 474,-32766,-32766,-32766, 1046, 357, 358, 475, 476,-32766, - -32766,-32766, 906, 120, 477, 539, 1068, 795, 846, 430, - 431, 436,-32766, 341,-32766,-32766,-32766, 1046, 480, 810, - -32766, 925,-32766,-32766, 754, 1080, 1079, 1081, 49,-32766, - -32766,-32766, 749, 751, 426, 1201, 826, 634, -211, 30, - 469, 669, 668, 436, 812, 341, 75, 40, 21, 427, - -32766, 471, 1064, 472, 124, 473, 669, 668, 428, 212, - -210, -210, -210, 33, 34, 429, 361, 51, 1186, 35, - 474, 755,-32766,-32766,-32766, 357, 358, 475, 476, 213, - 824, 54, 221, 222, 477, 20, 581, 795, 846, 430, - 431, 220, 221, 222, 755, 222, 247, 78, 79, 80, - 81, 341, 207, 517, 103, 104, 105, 752, 307, 131, - 637, 1068, 207, 341, 207, 122, 826, 634, -210, 36, - 106, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 1112, 307, 346, 436, 214, - 341, 824, 54, 426, 123, 250, 129, 134, 106, 469, - -32766, 572, 1112, 812, 245, 246, 40, 21, 427, 251, - 471, 252, 472, 341, 473, 453, 22, 428, 207, 899, - 900, 638, 33, 34, 429, 824, 54, -86, 35, 474, - 220, 221, 222, 314, 357, 358, 100, 101, 102, 239, - 240, 241, 645, 477, -230, 458, 589, 135, 374, 596, - 597, 207, 760, 640, 648, 642, 941, 654, 929, 662, - 822, 133, 307, 837, 426,-32766, 106, 749, 43, 44, - 469, 45, 442, 46, 812, 826, 634, 40, 21, 427, - 47, 471, 50, 472, 53, 473, 132, 608, 428, 302, - 604, -280,-32766, 33, 34, 429, 824, 54, 426, 35, - 474, 755, 957, -84, 469, 357, 358, 521, 812, 628, - 363, 40, 21, 427, 477, 471, 575, 472, -515, 473, - 847, 616, 428, -423,-32766, 11, 646, 33, 34, 429, - 824, 54, 445, 35, 474, 462, 285, 578, 1111, 357, - 358, 593, 369, 848, 594, 290, 826, 634, 477, 0, - 0, 532, 0, 0, 325, 0, 0, 0, 0, 0, - 651, 0, 0, 0, 322, 326, 0, 0, 0, 426, - 0, 0, 0, 0, 323, 469, 316, 318, -516, 812, - 862, 634, 40, 21, 427, 0, 471, 0, 472, 0, - 473, 1158, 0, 428, 0, -414, 6, 7, 33, 34, - 429, 824, 54, 426, 35, 474, 12, 14, 373, 469, - 357, 358, -424, 812, 563, 754, 40, 21, 427, 477, - 471, 248, 472, 839, 473, 38, 39, 428, 657, 658, - 765, 813, 33, 34, 429, 821, 800, 815, 35, 474, - 215, 216, 878, 869, 357, 358, 217, 870, 218, 798, - 863, 826, 634, 477, 860, 858, 936, 937, 934, 820, - 209, 804, 806, 808, 811, 933, 763, 764, 1100, 1101, - 935, 659, 78, 335, 426, 359, 1102, 635, 639, 641, - 469, 643, 644, 647, 812, 826, 634, 40, 21, 427, - 649, 471, 650, 472, 652, 473, 653, 636, 428, 796, - 1226, 1228, 762, 33, 34, 429, 215, 216, 845, 35, - 474, 761, 217, 844, 218, 357, 358, 1227, 843, 1060, - 831, 1048, 842, 1049, 477, 559, 209, 1106, 1107, 1108, - 1109, 1103, 1104, 398, 1100, 1101, 829, 942, 867, 1110, - 1105, 868, 1102, 457, 1225, 1194, 1192, 1177, 1157, 219, - 1190, 1091, 917, 1198, 1188, 0, 826, 634, 24, -433, - 26, 31, 37, 42, 76, 77, 210, 287, 292, 293, - 308, 309, 310, 311, 339, 356, 416, 0, -227, -226, - 16, 17, 18, 393, 454, 461, 463, 467, 553, 625, - 1051, 559, 1054, 1106, 1107, 1108, 1109, 1103, 1104, 398, - 907, 1116, 1050, 1026, 564, 1110, 1105, 1025, 1093, 1055, - 0, 1044, 0, 1057, 1056, 219, 1059, 1058, 1075, 0, - 1191, 1176, 1172, 1189, 1090, 1223, 1117, 1171, 600 - ); - - protected $actionCheck = array( - 2, 3, 4, 5, 6, 7, 14, 9, 10, 11, - 12, 13, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 0, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 9, 10, 11, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 69, 70, - 53, 54, 55, 9, 10, 57, 30, 116, 32, 33, - 34, 35, 36, 37, 38, 80, 69, 70, 83, 71, - 72, 73, 74, 75, 76, 77, 135, 136, 80, 33, - 34, 35, 36, 37, 38, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 31, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 13, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 3, 4, 5, 6, 7, 148, 149, 150, 82, - 12, 13, 160, 15, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 8, 44, 45, 46, 47, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 80, 33, 34, 35, 36, 50, 51, - 13, 9, 10, 11, 56, 128, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 1, 70, 71, - 72, 73, 59, 60, 37, 38, 78, 79, 80, 82, - 82, 106, 85, 108, 86, 9, 10, 11, 161, 80, - 1, 2, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 9, 10, 11, 106, 156, 30, 8, 32, 33, - 34, 35, 36, 13, 116, 8, 153, 154, 155, 8, - 122, 158, 30, 125, 126, 116, 117, 118, 119, 120, - 121, 31, 134, 135, 156, 137, 138, 139, 140, 141, - 142, 143, 145, 146, 8, 8, 133, 149, 150, 37, - 38, 153, 154, 155, 9, 10, 11, 159, 8, 161, - 162, 8, 164, 74, 75, 76, 77, 8, 13, 80, - 0, 1, 2, 84, 158, 30, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 13, 98, 9, 10, - 11, 9, 103, 104, 105, 106, 8, 70, 109, 110, - 9, 10, 11, 8, 115, 116, 117, 118, 70, 30, - 31, 37, 38, 124, 31, 8, 127, 128, 129, 130, - 8, 30, 156, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 116, 117, 118, 119, 120, - 121, 8, 82, 8, 74, 156, 157, 158, 33, 34, - 80, 1, 2, 8, 84, 163, 82, 87, 88, 89, - 133, 91, 70, 93, 152, 95, 108, 82, 98, 158, - 8, 113, 160, 103, 104, 105, 106, 13, 108, 109, - 110, 123, 122, 113, 157, 115, 116, 117, 118, 9, - 10, 11, 156, 71, 124, 157, 122, 127, 128, 129, - 130, 37, 38, 8, 82, 160, 156, 13, 134, 156, - 30, 156, 32, 33, 34, 35, 158, 157, 148, 159, - 122, 161, 80, 1, 74, 133, 156, 157, 158, 156, - 80, 1, 2, 159, 84, 161, 82, 87, 88, 89, - 157, 91, 157, 93, 122, 95, 161, 106, 98, 108, - 100, 101, 102, 103, 104, 105, 106, 159, 116, 109, - 110, 9, 10, 11, 13, 115, 116, 117, 118, 9, - 10, 11, 160, 16, 124, 81, 122, 127, 128, 129, - 130, 159, 30, 161, 32, 33, 34, 13, 134, 156, - 30, 156, 32, 33, 153, 153, 154, 155, 70, 9, - 10, 11, 80, 80, 74, 160, 156, 157, 158, 14, - 80, 37, 38, 159, 84, 161, 152, 87, 88, 89, - 30, 91, 160, 93, 14, 95, 37, 38, 98, 16, - 100, 101, 102, 103, 104, 105, 106, 70, 82, 109, - 110, 82, 33, 34, 35, 115, 116, 117, 118, 16, - 1, 2, 10, 11, 124, 160, 85, 127, 128, 129, - 130, 9, 10, 11, 82, 11, 14, 157, 9, 10, - 11, 161, 30, 85, 53, 54, 55, 154, 57, 157, - 31, 122, 30, 161, 30, 157, 156, 157, 158, 30, - 69, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 144, 57, 161, 159, 16, - 161, 1, 2, 74, 157, 16, 152, 157, 69, 80, - 116, 161, 144, 84, 69, 70, 87, 88, 89, 16, - 91, 16, 93, 161, 95, 75, 76, 98, 30, 135, - 136, 31, 103, 104, 105, 1, 2, 31, 109, 110, - 9, 10, 11, 31, 115, 116, 50, 51, 52, 50, - 51, 52, 31, 124, 160, 75, 76, 101, 102, 111, - 112, 30, 156, 157, 31, 31, 156, 157, 156, 157, - 31, 31, 57, 38, 74, 33, 69, 80, 70, 70, - 80, 70, 89, 70, 84, 156, 157, 87, 88, 89, - 70, 91, 70, 93, 70, 95, 70, 96, 98, 71, - 77, 82, 85, 103, 104, 105, 1, 2, 74, 109, - 110, 82, 82, 97, 80, 115, 116, 85, 84, 92, - 106, 87, 88, 89, 124, 91, 90, 93, 133, 95, - 128, 94, 98, 147, 116, 97, 31, 103, 104, 105, - 1, 2, 97, 109, 110, 97, 97, 100, 144, 115, - 116, 100, 106, 128, 113, 161, 156, 157, 124, -1, - -1, 151, -1, -1, 114, -1, -1, -1, -1, -1, - 31, -1, -1, -1, 131, 131, -1, -1, -1, 74, - -1, -1, -1, -1, 132, 80, 133, 133, 133, 84, - 156, 157, 87, 88, 89, -1, 91, -1, 93, -1, - 95, 144, -1, 98, -1, 147, 147, 147, 103, 104, - 105, 1, 2, 74, 109, 110, 147, 147, 147, 80, - 115, 116, 147, 84, 151, 153, 87, 88, 89, 124, - 91, 31, 93, 152, 95, 156, 156, 98, 156, 156, - 156, 156, 103, 104, 105, 156, 156, 156, 109, 110, - 50, 51, 156, 156, 115, 116, 56, 156, 58, 156, - 156, 156, 157, 124, 156, 156, 156, 156, 156, 156, - 70, 156, 156, 156, 156, 156, 156, 156, 78, 79, - 156, 158, 157, 157, 74, 157, 86, 157, 157, 157, - 80, 157, 157, 157, 84, 156, 157, 87, 88, 89, - 157, 91, 157, 93, 157, 95, 157, 157, 98, 158, - 158, 158, 158, 103, 104, 105, 50, 51, 158, 109, - 110, 158, 56, 158, 58, 115, 116, 158, 158, 158, - 158, 158, 158, 158, 124, 135, 70, 137, 138, 139, - 140, 141, 142, 143, 78, 79, 158, 158, 158, 149, - 150, 158, 86, 158, 158, 158, 158, 158, 164, 159, - 158, 158, 158, 158, 158, -1, 156, 157, 159, 162, - 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, - 159, 159, 159, 159, 159, 159, 159, -1, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 135, 160, 137, 138, 139, 140, 141, 142, 143, - 160, 160, 160, 160, 160, 149, 150, 160, 160, 163, - -1, 162, -1, 163, 163, 159, 163, 163, 163, -1, - 163, 163, 163, 163, 163, 163, 163, 163, 163 - ); - - protected $actionBase = array( - 0, 229, 310, 390, 470, 103, 325, 325, 784, -2, - -2, 149, -2, -2, -2, 660, 765, 799, 765, 589, - 694, 870, 870, 870, 252, 404, 404, 404, 514, 177, - 177, 918, 434, 118, 295, 313, 240, 491, 491, 491, - 491, 138, 138, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 89, 206, 773, 550, - 535, 775, 776, 777, 912, 709, 913, 856, 857, 700, - 858, 859, 862, 863, 864, 855, 865, 935, 866, 599, - 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, - 599, 322, 592, 285, 319, 232, 44, 691, 691, 691, - 691, 691, 691, 691, 182, 182, 182, 182, 182, 182, - 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, - 182, 182, 582, 530, 530, 530, 594, 860, 658, 926, - 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, - 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, - 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, - 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, - 926, 926, 926, 500, -21, -21, 492, 702, 420, 355, - 216, 549, 151, 26, 26, 331, 331, 331, 331, 331, - 46, 46, 5, 5, 5, 5, 153, 188, 188, 188, - 188, 121, 121, 121, 121, 314, 314, 394, 394, 362, - 300, 298, 499, 499, 499, 499, 499, 499, 499, 499, - 499, 499, 67, 656, 656, 659, 659, 522, 554, 554, - 554, 554, 679, -59, -59, 381, 462, 462, 462, 528, - 717, 854, 382, 382, 382, 382, 382, 382, 561, 561, - 561, -3, -3, -3, 692, 115, 137, 115, 137, 678, - 732, 450, 732, 338, 677, -15, 510, 810, 468, 707, - 850, 711, 853, 572, 735, 267, 529, 654, 674, 463, - 529, 529, 529, 529, 654, 610, 640, 608, 463, 529, - 463, 718, 323, 496, 89, 570, 507, 675, 778, 293, - 670, 780, 290, 373, 332, 566, 278, 435, 733, 781, - 914, 917, 385, 715, 675, 675, 675, 352, 511, 278, - -8, 605, 605, 605, 605, 156, 605, 605, 605, 605, - 251, 276, 375, 402, 779, 657, 657, 690, 872, 869, - 869, 657, 689, 657, 690, 874, 874, 874, 874, 657, - 657, 657, 657, 869, 869, 869, 688, 869, 239, 703, - 704, 704, 874, 742, 743, 657, 657, 712, 869, 869, - 869, 712, 695, 874, 701, 741, 277, 869, 874, 672, - 689, 672, 657, 701, 672, 689, 689, 672, 22, 666, - 668, 873, 875, 887, 790, 662, 685, 879, 880, 876, - 878, 871, 699, 744, 745, 497, 669, 671, 673, 680, - 719, 682, 713, 674, 667, 667, 667, 655, 720, 655, - 667, 667, 667, 667, 667, 667, 667, 667, 916, 646, - 731, 714, 653, 749, 553, 573, 791, 664, 811, 900, - 893, 867, 919, 881, 898, 655, 920, 739, 247, 643, - 882, 783, 786, 655, 883, 655, 792, 655, 902, 812, - 686, 813, 814, 667, 910, 921, 923, 924, 925, 927, - 928, 929, 930, 684, 931, 750, 696, 894, 299, 877, - 718, 729, 705, 788, 751, 820, 328, 932, 823, 655, - 655, 794, 785, 655, 795, 756, 740, 890, 757, 895, - 933, 664, 708, 896, 655, 706, 825, 934, 328, 681, - 683, 888, 661, 761, 886, 911, 885, 796, 649, 663, - 829, 830, 831, 693, 763, 891, 892, 889, 764, 803, - 665, 805, 697, 832, 807, 884, 768, 833, 834, 899, - 676, 730, 710, 698, 687, 809, 835, 897, 769, 770, - 771, 848, 772, 849, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 138, 138, 138, 138, -2, -2, - -2, -2, 0, 0, -2, 0, 0, 0, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 0, 0, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 599, - 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, - 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, - 599, 599, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 599, -21, -21, -21, -21, 599, - -21, -21, -21, -21, -21, -21, -21, 599, 599, 599, - 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, - 599, 599, 599, 599, 599, -21, 599, 599, 599, -21, - 382, -21, 382, 382, 382, 382, 382, 382, 382, 382, - 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, - 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, - 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, - 382, 382, 382, 382, 382, 382, 599, 0, 0, 599, - -21, 599, -21, 599, -21, -21, 599, 599, 599, 599, - 599, 599, 599, -21, -21, -21, -21, -21, -21, 0, - 561, 561, 561, 561, -21, -21, -21, -21, 382, 382, - 382, 382, 382, 382, 259, 382, 382, 382, 382, 382, - 382, 382, 382, 382, 382, 382, 561, 561, -3, -3, - 382, 382, 382, 382, 382, 259, 382, 382, 463, 689, - 689, 689, 137, 137, 137, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 137, 463, 0, - 463, 0, 382, 463, 689, 463, 657, 137, 689, 689, - 463, 869, 616, 616, 616, 616, 328, 278, 0, 0, - 689, 689, 0, 0, 0, 0, 0, 689, 0, 0, - 0, 0, 0, 0, 869, 0, 0, 0, 0, 0, - 667, 247, 0, 705, 335, 0, 0, 0, 0, 0, - 0, 705, 335, 347, 347, 0, 684, 667, 667, 667, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 328 - ); - - protected $actionDefault = array( - 3,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767, 544, 544, 499,32767,32767, - 32767,32767,32767,32767,32767,32767,32767, 299, 299, 299, - 32767,32767,32767, 532, 532, 532, 532, 532, 532, 532, - 532, 532, 532, 532,32767,32767,32767,32767,32767,32767, - 383,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767, 389, - 549,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767, 364, - 365, 367, 368, 298, 552, 533, 247, 390, 548, 297, - 249, 327, 503,32767,32767,32767, 329, 122, 258, 203, - 502, 125, 296, 234, 382, 384, 328, 303, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 302, 458, 361, 360, 359, 460,32767, 459, 496, - 496, 499,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767, 325, 487, 486, 326, 456, 330, 457, - 333, 461, 464, 331, 332, 349, 350, 347, 348, 351, - 462, 463, 480, 481, 478, 479, 301, 352, 353, 354, - 355, 482, 483, 484, 485,32767,32767, 543, 543,32767, - 32767, 282,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767, 340, 341, 471, 472,32767, 238, 238, - 238, 238, 283, 238,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767, 335, 336, - 334, 466, 467, 465, 432,32767,32767,32767, 434,32767, - 32767,32767,32767,32767,32767,32767,32767,32767, 504,32767, - 32767,32767,32767,32767, 517, 421, 171,32767, 413,32767, - 171, 171, 171, 171,32767, 222, 224, 167,32767, 171, - 32767, 490,32767,32767,32767,32767, 522, 345,32767,32767, - 116,32767,32767,32767, 559,32767, 517,32767, 116,32767, - 32767,32767,32767, 358, 337, 338, 339,32767,32767, 521, - 515, 474, 475, 476, 477,32767, 468, 469, 470, 473, - 32767,32767,32767,32767,32767,32767,32767,32767, 429, 435, - 435,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767, 520, 519,32767, 414, 498, 188, - 186, 186,32767, 208, 208,32767,32767, 190, 491, 510, - 32767, 190, 173,32767, 400, 175, 498,32767,32767, 240, - 32767, 240,32767, 400, 240,32767,32767, 240,32767, 415, - 439,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767, 379, 380, 493, 506, - 32767, 507,32767, 413, 343, 344, 346, 322,32767, 324, - 369, 370, 371, 372, 373, 374, 375, 377,32767, 419, - 32767, 422,32767,32767,32767, 257,32767, 557,32767,32767, - 306, 557,32767,32767,32767, 551,32767,32767, 300,32767, - 32767,32767,32767, 253,32767, 169,32767, 541,32767, 558, - 32767, 515,32767, 342,32767,32767,32767,32767,32767,32767, - 32767,32767,32767, 516,32767,32767,32767,32767, 229,32767, - 452,32767, 116,32767,32767,32767, 189,32767,32767, 304, - 248,32767,32767, 550,32767,32767,32767,32767,32767,32767, - 32767,32767, 114,32767, 170,32767,32767,32767, 191,32767, - 32767, 515,32767,32767,32767,32767,32767,32767,32767, 295, - 32767,32767,32767,32767,32767,32767,32767, 515,32767,32767, - 233,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 415,32767, 276,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767, 127, 127, 3, 127, 127, 260, - 3, 260, 127, 260, 260, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 216, 219, 208, 208, 164, - 127, 127, 268 - ); - - protected $goto = array( - 166, 140, 140, 140, 166, 187, 168, 144, 147, 141, - 142, 143, 149, 163, 163, 163, 163, 144, 144, 165, - 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, - 138, 159, 160, 161, 162, 184, 139, 185, 494, 495, - 377, 496, 500, 501, 502, 503, 504, 505, 506, 507, - 970, 164, 145, 146, 148, 171, 176, 186, 203, 253, - 256, 258, 260, 263, 264, 265, 266, 267, 268, 269, - 277, 278, 279, 280, 303, 304, 328, 329, 330, 394, - 395, 396, 543, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 150, 151, 152, - 167, 153, 169, 154, 204, 170, 155, 156, 157, 205, - 158, 136, 621, 561, 757, 561, 561, 561, 561, 561, - 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, - 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, - 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, - 561, 561, 561, 561, 561, 561, 561, 561, 561, 1113, - 629, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, - 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, - 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, - 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, - 1113, 1113, 1113, 1113, 1113, 758, 520, 531, 509, 656, - 556, 1183, 750, 509, 592, 786, 1183, 888, 612, 613, - 884, 617, 618, 624, 626, 631, 633, 817, 855, 855, - 855, 855, 850, 856, 174, 891, 891, 1205, 1205, 177, - 178, 179, 401, 402, 403, 404, 173, 202, 206, 208, - 257, 259, 261, 262, 270, 271, 272, 273, 274, 275, - 281, 282, 283, 284, 305, 306, 331, 332, 333, 406, - 407, 408, 409, 175, 180, 254, 255, 181, 182, 183, - 498, 498, 498, 498, 498, 498, 861, 498, 498, 498, - 498, 498, 498, 498, 498, 498, 498, 510, 586, 538, - 601, 602, 510, 545, 546, 547, 548, 549, 550, 551, - 552, 554, 587, 1209, 560, 350, 560, 560, 560, 560, - 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, - 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, - 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, - 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, - 400, 607, 537, 537, 569, 533, 909, 535, 535, 497, - 499, 525, 541, 570, 573, 584, 591, 298, 296, 296, - 296, 298, 289, 299, 611, 378, 511, 614, 595, 947, - 375, 511, 437, 437, 437, 437, 437, 437, 1163, 437, - 437, 437, 437, 437, 437, 437, 437, 437, 437, 1077, - 948, 338, 1175, 321, 1077, 898, 898, 898, 898, 606, - 898, 898, 1217, 1217, 1202, 753, 576, 605, 756, 1077, - 1077, 1077, 1077, 1077, 1077, 1069, 384, 384, 384, 391, - 1217, 877, 859, 857, 859, 655, 466, 512, 886, 881, - 753, 384, 753, 384, 968, 384, 895, 385, 588, 353, - 414, 384, 1231, 1019, 542, 1197, 1197, 1197, 568, 1094, - 386, 386, 386, 904, 915, 515, 1029, 19, 15, 372, - 389, 915, 940, 448, 450, 632, 340, 1216, 1216, 1114, - 615, 938, 840, 555, 775, 386, 913, 1070, 1073, 1074, - 399, 1069, 1182, 660, 23, 1216, 773, 1182, 544, 603, - 1066, 1219, 1071, 1174, 1071, 519, 1199, 1199, 1199, 1089, - 1088, 1072, 343, 523, 534, 519, 519, 772, 351, 352, - 13, 579, 583, 627, 1061, 388, 782, 562, 771, 515, - 783, 1181, 3, 4, 918, 956, 865, 451, 574, 1160, - 464, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 514, 529, 0, 0, 0, 0, - 514, 0, 529, 0, 0, 0, 0, 610, 513, 516, - 439, 440, 1067, 619, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 780, 1224, 0, 0, 0, 0, - 0, 524, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 778, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 301, 301 - ); - - protected $gotoCheck = array( - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 57, 69, 15, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 128, - 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 16, 102, 32, 69, 32, - 32, 120, 6, 69, 32, 29, 120, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 50, 69, 69, - 69, 69, 69, 69, 27, 77, 77, 77, 77, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 119, 119, 119, 119, 119, 119, 33, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 67, 110, - 67, 67, 119, 111, 111, 111, 111, 111, 111, 111, - 111, 111, 111, 142, 57, 72, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 51, 51, 51, 51, 51, 51, 84, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 5, 5, 5, - 5, 5, 5, 5, 63, 46, 124, 63, 129, 98, - 63, 124, 57, 57, 57, 57, 57, 57, 133, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 98, 127, 82, 127, 57, 57, 57, 57, 57, 49, - 57, 57, 144, 144, 140, 11, 40, 40, 14, 57, - 57, 57, 57, 57, 57, 82, 13, 13, 13, 48, - 144, 14, 14, 14, 14, 14, 57, 14, 14, 14, - 11, 13, 11, 13, 102, 13, 79, 11, 70, 70, - 70, 13, 13, 103, 2, 9, 9, 9, 2, 34, - 125, 125, 125, 81, 13, 13, 34, 34, 34, 34, - 17, 13, 8, 8, 8, 8, 18, 143, 143, 8, - 8, 8, 9, 34, 25, 125, 85, 82, 82, 82, - 125, 82, 121, 74, 34, 143, 24, 121, 47, 34, - 116, 143, 82, 82, 82, 47, 121, 121, 121, 126, - 126, 82, 58, 58, 58, 47, 47, 23, 72, 72, - 58, 62, 62, 62, 114, 12, 23, 12, 23, 13, - 26, 121, 30, 30, 86, 100, 71, 65, 66, 132, - 109, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, - 9, -1, 9, -1, -1, -1, -1, 13, 9, 9, - 9, 9, 13, 13, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, - -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 5, 5 - ); - - protected $gotoBase = array( - 0, 0, -172, 0, 0, 353, 201, 0, 477, 149, - 0, 110, 195, 117, 426, 112, 203, 140, 171, 0, - 0, 0, 0, 168, 164, 157, 119, 27, 0, 205, - -118, 0, -428, 266, 51, 0, 0, 0, 0, 0, - 388, 0, 0, -24, 0, 0, 345, 484, 146, 133, - 209, 75, 0, 0, 0, 0, 0, 107, 161, 0, - 0, 0, 222, -77, 0, 106, 97, -343, 0, -94, - 135, 123, -129, 0, 129, 0, 0, -50, 0, 143, - 0, 159, 64, 0, 338, 132, 122, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 98, 0, - 121, 0, 165, 156, 0, 0, 0, 0, 0, 87, - 273, 259, 0, 0, 114, 0, 150, 0, 0, -5, - -91, 200, 0, 0, 84, 154, 202, 77, -48, 178, - 0, 0, 93, 187, 0, 0, 0, 0, 0, 0, - 136, 0, 286, 167, 102, 0, 0 - ); - - protected $gotoDefault = array( - -32768, 468, 664, 2, 665, 835, 740, 748, 598, 482, - 630, 582, 380, 1193, 792, 793, 794, 381, 368, 483, - 379, 410, 405, 781, 774, 776, 784, 172, 411, 787, - 1, 789, 518, 825, 1020, 365, 797, 366, 590, 799, - 527, 801, 802, 137, 382, 383, 528, 484, 390, 577, - 816, 276, 387, 818, 367, 819, 828, 371, 465, 455, - 460, 530, 557, 609, 432, 447, 571, 565, 536, 1086, - 566, 864, 349, 872, 661, 880, 883, 485, 558, 894, - 452, 902, 1099, 397, 908, 914, 919, 291, 922, 417, - 412, 585, 927, 928, 5, 932, 622, 623, 8, 312, - 955, 599, 969, 420, 1039, 1041, 486, 487, 522, 459, - 508, 526, 488, 1062, 441, 413, 1065, 433, 489, 490, - 434, 435, 1083, 355, 1168, 354, 449, 320, 1155, 580, - 1118, 456, 1208, 1164, 348, 491, 492, 376, 1187, 392, - 1203, 438, 1210, 1218, 344, 540, 567 - ); - - protected $ruleToNonTerminal = array( - 0, 1, 3, 3, 2, 5, 5, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, - 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, - 12, 12, 13, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 18, 18, 19, 19, 21, 21, - 17, 17, 22, 22, 23, 23, 24, 24, 25, 25, - 20, 20, 26, 28, 28, 29, 30, 30, 32, 31, - 31, 31, 31, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 14, 14, 54, 54, 56, 55, 55, 48, - 48, 58, 58, 59, 59, 60, 60, 61, 61, 15, - 16, 16, 16, 64, 64, 64, 65, 65, 68, 68, - 66, 66, 70, 70, 41, 41, 50, 50, 53, 53, - 53, 52, 52, 71, 42, 42, 42, 42, 72, 72, - 73, 73, 74, 74, 39, 39, 35, 35, 75, 37, - 37, 76, 36, 36, 38, 38, 49, 49, 49, 62, - 62, 78, 78, 79, 79, 81, 81, 81, 80, 80, - 63, 63, 82, 82, 82, 83, 83, 84, 84, 84, - 44, 44, 85, 85, 85, 45, 45, 86, 86, 87, - 87, 67, 88, 88, 88, 88, 93, 93, 94, 94, - 95, 95, 95, 95, 95, 96, 97, 97, 92, 92, - 89, 89, 91, 91, 99, 99, 98, 98, 98, 98, - 98, 98, 90, 90, 101, 100, 100, 46, 46, 40, - 40, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 34, 34, 47, - 47, 106, 106, 107, 107, 107, 107, 113, 102, 102, - 109, 109, 115, 115, 116, 117, 118, 118, 118, 118, - 118, 118, 118, 69, 69, 57, 57, 57, 57, 103, - 103, 122, 122, 119, 119, 123, 123, 123, 123, 104, - 104, 104, 108, 108, 108, 114, 114, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 27, 27, 27, 27, 27, 27, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 112, 112, 105, 105, 105, 105, 129, 129, 132, 132, - 131, 131, 133, 133, 51, 51, 51, 51, 135, 135, - 134, 134, 134, 134, 134, 136, 136, 121, 121, 124, - 124, 120, 120, 138, 137, 137, 137, 137, 125, 125, - 125, 125, 111, 111, 126, 126, 126, 126, 77, 139, - 139, 140, 140, 140, 110, 110, 141, 141, 142, 142, - 142, 142, 142, 127, 127, 127, 127, 144, 145, 143, - 143, 143, 143, 143, 143, 143, 146, 146, 146 - ); - - protected $ruleToLength = array( - 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 5, 4, - 3, 4, 2, 3, 1, 1, 7, 6, 3, 1, - 3, 1, 3, 1, 1, 3, 1, 3, 1, 2, - 3, 1, 3, 3, 1, 3, 2, 0, 1, 1, - 1, 1, 1, 3, 5, 8, 3, 5, 9, 3, - 2, 3, 2, 3, 2, 3, 3, 3, 3, 1, - 2, 2, 5, 7, 9, 5, 6, 3, 3, 2, - 2, 1, 1, 1, 0, 2, 8, 0, 4, 1, - 3, 0, 1, 0, 1, 0, 1, 1, 1, 10, - 7, 6, 5, 1, 2, 2, 0, 2, 0, 2, - 0, 2, 1, 3, 1, 4, 1, 4, 1, 1, - 4, 1, 3, 3, 3, 4, 4, 5, 0, 2, - 4, 3, 1, 1, 1, 4, 0, 2, 3, 0, - 2, 4, 0, 2, 0, 3, 1, 2, 1, 1, - 0, 1, 3, 4, 6, 1, 1, 1, 0, 1, - 0, 2, 2, 3, 3, 1, 3, 1, 2, 2, - 3, 1, 1, 2, 4, 3, 1, 1, 3, 2, - 0, 1, 3, 3, 9, 3, 1, 3, 0, 2, - 4, 5, 4, 4, 4, 3, 1, 1, 1, 3, - 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, - 1, 1, 1, 3, 1, 1, 3, 3, 1, 0, - 1, 1, 3, 3, 4, 4, 1, 2, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 1, 3, 5, - 4, 3, 4, 4, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, - 1, 3, 2, 1, 2, 10, 11, 3, 3, 2, - 4, 4, 3, 4, 4, 4, 4, 7, 3, 2, - 0, 4, 1, 3, 2, 1, 2, 2, 4, 6, - 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 3, 4, 4, 0, - 2, 1, 0, 1, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, - 1, 3, 1, 4, 3, 1, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, - 3, 3, 3, 3, 3, 3, 5, 4, 4, 3, - 1, 3, 1, 1, 3, 3, 0, 2, 0, 1, - 3, 1, 3, 1, 1, 1, 1, 1, 6, 4, - 3, 4, 2, 4, 4, 1, 3, 1, 2, 1, - 1, 4, 1, 1, 3, 6, 4, 4, 4, 4, - 1, 4, 0, 1, 1, 3, 1, 1, 4, 3, - 1, 1, 1, 0, 0, 2, 3, 1, 3, 1, - 4, 2, 2, 2, 2, 1, 2, 1, 1, 1, - 4, 3, 3, 3, 6, 3, 1, 1, 1 - ); - - protected function initReduceCallbacks() { - $this->reduceCallbacks = [ - 0 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 1 => function ($stackPos) { - $this->semValue = $this->handleNamespaces($this->semStack[$stackPos-(1-1)]); - }, - 2 => function ($stackPos) { - if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; - }, - 3 => function ($stackPos) { - $this->semValue = array(); - }, - 4 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 5 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 6 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 7 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 8 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 9 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 10 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 11 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 12 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 13 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 14 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 15 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 16 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 17 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 18 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 19 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 20 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 21 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 22 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 23 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 24 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 25 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 26 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 27 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 28 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 29 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 30 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 31 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 32 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 33 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 34 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 35 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 36 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 37 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 38 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 39 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 40 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 41 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 42 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 43 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 44 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 45 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 46 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 47 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 48 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 49 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 50 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 51 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 52 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 53 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 54 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 55 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 56 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 57 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 58 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 59 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 60 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 61 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 62 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 63 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 64 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 65 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 66 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 67 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 68 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 69 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 70 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 71 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 72 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 73 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 74 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 75 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 76 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 77 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 78 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 79 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 80 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 81 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 82 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 83 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 84 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 85 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 86 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 87 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 88 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 89 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 90 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 91 => function ($stackPos) { - $this->semValue = new Name(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 92 => function ($stackPos) { - $this->semValue = new Expr\Variable(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 93 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 94 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 95 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 96 => function ($stackPos) { - $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 97 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(3-2)], null, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); - $this->checkNamespace($this->semValue); - }, - 98 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, - 99 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, - 100 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 101 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 102 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 103 => function ($stackPos) { - $this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 104 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_FUNCTION; - }, - 105 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_CONSTANT; - }, - 106 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->semStack[$stackPos-(7-2)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 107 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 108 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 109 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 110 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 111 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 112 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 113 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 114 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); - }, - 115 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); - }, - 116 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); - }, - 117 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); - }, - 118 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL; - }, - 119 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; $this->semValue->type = $this->semStack[$stackPos-(2-1)]; - }, - 120 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 121 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 122 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 123 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 124 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 125 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 126 => function ($stackPos) { - if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; - }, - 127 => function ($stackPos) { - $this->semValue = array(); - }, - 128 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 129 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 130 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 131 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 132 => function ($stackPos) { - throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 133 => function ($stackPos) { - - if ($this->semStack[$stackPos-(3-2)]) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; $attrs = $this->startAttributeStack[$stackPos-(3-1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) {$stmts[0]->setAttribute('comments', array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); }; - } else { - $startAttributes = $this->startAttributeStack[$stackPos-(3-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; - if (null === $this->semValue) { $this->semValue = array(); } - } - - }, - 134 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos-(5-2)], ['stmts' => is_array($this->semStack[$stackPos-(5-3)]) ? $this->semStack[$stackPos-(5-3)] : array($this->semStack[$stackPos-(5-3)]), 'elseifs' => $this->semStack[$stackPos-(5-4)], 'else' => $this->semStack[$stackPos-(5-5)]], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 135 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos-(8-2)], ['stmts' => $this->semStack[$stackPos-(8-4)], 'elseifs' => $this->semStack[$stackPos-(8-5)], 'else' => $this->semStack[$stackPos-(8-6)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 136 => function ($stackPos) { - $this->semValue = new Stmt\While_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 137 => function ($stackPos) { - $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(5-4)], is_array($this->semStack[$stackPos-(5-2)]) ? $this->semStack[$stackPos-(5-2)] : array($this->semStack[$stackPos-(5-2)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 138 => function ($stackPos) { - $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 139 => function ($stackPos) { - $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 140 => function ($stackPos) { - $this->semValue = new Stmt\Break_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 141 => function ($stackPos) { - $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 142 => function ($stackPos) { - $this->semValue = new Stmt\Continue_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 143 => function ($stackPos) { - $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 144 => function ($stackPos) { - $this->semValue = new Stmt\Return_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 145 => function ($stackPos) { - $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 146 => function ($stackPos) { - $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 147 => function ($stackPos) { - $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 148 => function ($stackPos) { - $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 149 => function ($stackPos) { - $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 150 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 151 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 152 => function ($stackPos) { - $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 153 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 154 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - }, - 155 => function ($stackPos) { - $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 156 => function ($stackPos) { - $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkTryCatch($this->semValue); - }, - 157 => function ($stackPos) { - $this->semValue = new Stmt\Throw_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 158 => function ($stackPos) { - $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 159 => function ($stackPos) { - $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 160 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 161 => function ($stackPos) { - $this->semValue = array(); /* means: no statement */ - }, - 162 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 163 => function ($stackPos) { - $startAttributes = $this->startAttributeStack[$stackPos-(1-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; - if ($this->semValue === null) $this->semValue = array(); /* means: no statement */ - }, - 164 => function ($stackPos) { - $this->semValue = array(); - }, - 165 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 166 => function ($stackPos) { - $this->semValue = new Stmt\Catch_(array($this->semStack[$stackPos-(8-3)]), $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); - }, - 167 => function ($stackPos) { - $this->semValue = null; - }, - 168 => function ($stackPos) { - $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 169 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 170 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 171 => function ($stackPos) { - $this->semValue = false; - }, - 172 => function ($stackPos) { - $this->semValue = true; - }, - 173 => function ($stackPos) { - $this->semValue = false; - }, - 174 => function ($stackPos) { - $this->semValue = true; - }, - 175 => function ($stackPos) { - $this->semValue = false; - }, - 176 => function ($stackPos) { - $this->semValue = true; - }, - 177 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 178 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 179 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(10-3)], ['byRef' => $this->semStack[$stackPos-(10-2)], 'params' => $this->semStack[$stackPos-(10-5)], 'returnType' => $this->semStack[$stackPos-(10-7)], 'stmts' => $this->semStack[$stackPos-(10-9)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - }, - 180 => function ($stackPos) { - $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(7-2)], ['type' => $this->semStack[$stackPos-(7-1)], 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - $this->checkClass($this->semValue, $stackPos-(7-2)); - }, - 181 => function ($stackPos) { - $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(6-2)], ['extends' => $this->semStack[$stackPos-(6-3)], 'stmts' => $this->semStack[$stackPos-(6-5)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - $this->checkInterface($this->semValue, $stackPos-(6-2)); - }, - 182 => function ($stackPos) { - $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(5-2)], ['stmts' => $this->semStack[$stackPos-(5-4)]], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 183 => function ($stackPos) { - $this->semValue = 0; - }, - 184 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, - 185 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, - 186 => function ($stackPos) { - $this->semValue = null; - }, - 187 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 188 => function ($stackPos) { - $this->semValue = array(); - }, - 189 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 190 => function ($stackPos) { - $this->semValue = array(); - }, - 191 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 192 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 193 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 194 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 195 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 196 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 197 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 198 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 199 => function ($stackPos) { - $this->semValue = null; - }, - 200 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 201 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 202 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 203 => function ($stackPos) { - $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 204 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 205 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-3)]; - }, - 206 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 207 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(5-3)]; - }, - 208 => function ($stackPos) { - $this->semValue = array(); - }, - 209 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 210 => function ($stackPos) { - $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 211 => function ($stackPos) { - $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 212 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 213 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 214 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, - 215 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 216 => function ($stackPos) { - $this->semValue = array(); - }, - 217 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 218 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(3-2)], is_array($this->semStack[$stackPos-(3-3)]) ? $this->semStack[$stackPos-(3-3)] : array($this->semStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 219 => function ($stackPos) { - $this->semValue = array(); - }, - 220 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 221 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 222 => function ($stackPos) { - $this->semValue = null; - }, - 223 => function ($stackPos) { - $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 224 => function ($stackPos) { - $this->semValue = null; - }, - 225 => function ($stackPos) { - $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 226 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 227 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-2)], true); - }, - 228 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 229 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 230 => function ($stackPos) { - $this->semValue = array(); - }, - 231 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 232 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 233 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos-(4-4)], null, $this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); $this->checkParam($this->semValue); - }, - 234 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-6)], $this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-3)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkParam($this->semValue); - }, - 235 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 236 => function ($stackPos) { - $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 237 => function ($stackPos) { - $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 238 => function ($stackPos) { - $this->semValue = null; - }, - 239 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 240 => function ($stackPos) { - $this->semValue = null; - }, - 241 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; - }, - 242 => function ($stackPos) { - $this->semValue = array(); - }, - 243 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 244 => function ($stackPos) { - $this->semValue = array(new Node\Arg($this->semStack[$stackPos-(3-2)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes)); - }, - 245 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 246 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 247 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 248 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 249 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 250 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 251 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 252 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 253 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 254 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 255 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 256 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 257 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 258 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 259 => function ($stackPos) { - if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } - }, - 260 => function ($stackPos) { - $this->semValue = array(); - }, - 261 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 262 => function ($stackPos) { - $this->semValue = new Stmt\Property($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkProperty($this->semValue, $stackPos-(3-1)); - }, - 263 => function ($stackPos) { - $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(3-2)], 0, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 264 => function ($stackPos) { - $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(9-4)], ['type' => $this->semStack[$stackPos-(9-1)], 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); - $this->checkClassMethod($this->semValue, $stackPos-(9-1)); - }, - 265 => function ($stackPos) { - $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 266 => function ($stackPos) { - $this->semValue = array(); - }, - 267 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 268 => function ($stackPos) { - $this->semValue = array(); - }, - 269 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 270 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 271 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 272 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 273 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 274 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 275 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); - }, - 276 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 277 => function ($stackPos) { - $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); - }, - 278 => function ($stackPos) { - $this->semValue = null; - }, - 279 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 280 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 281 => function ($stackPos) { - $this->semValue = 0; - }, - 282 => function ($stackPos) { - $this->semValue = 0; - }, - 283 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 284 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 285 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; - }, - 286 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; - }, - 287 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; - }, - 288 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; - }, - 289 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_STATIC; - }, - 290 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, - 291 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, - 292 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 293 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 294 => function ($stackPos) { - $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 295 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 296 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 297 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 298 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 299 => function ($stackPos) { - $this->semValue = array(); - }, - 300 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 301 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 302 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 303 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 304 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 305 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 306 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 307 => function ($stackPos) { - $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 308 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 309 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 310 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 311 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 312 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 313 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 314 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 315 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 316 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 317 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 318 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 319 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 320 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 321 => function ($stackPos) { - $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 322 => function ($stackPos) { - $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 323 => function ($stackPos) { - $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 324 => function ($stackPos) { - $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 325 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 326 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 327 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 328 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 329 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 330 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 331 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 332 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 333 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 334 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 335 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 336 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 337 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 338 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 339 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 340 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 341 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 342 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 343 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 344 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 345 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 346 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 347 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 348 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 349 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 350 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 351 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 352 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 353 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 354 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 355 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 356 => function ($stackPos) { - $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 357 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 358 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 359 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 360 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 361 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 362 => function ($stackPos) { - $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 363 => function ($stackPos) { - $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 364 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 365 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 366 => function ($stackPos) { - $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 367 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 368 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 369 => function ($stackPos) { - $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 370 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; - $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]); - $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs); - }, - 371 => function ($stackPos) { - $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 372 => function ($stackPos) { - $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 373 => function ($stackPos) { - $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 374 => function ($stackPos) { - $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 375 => function ($stackPos) { - $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 376 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; - $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; - $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs); - }, - 377 => function ($stackPos) { - $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 378 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 379 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 380 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 381 => function ($stackPos) { - $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 382 => function ($stackPos) { - $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 383 => function ($stackPos) { - $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 384 => function ($stackPos) { - $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 385 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(10-2)], 'params' => $this->semStack[$stackPos-(10-4)], 'uses' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-7)], 'stmts' => $this->semStack[$stackPos-(10-9)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - }, - 386 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(11-3)], 'params' => $this->semStack[$stackPos-(11-5)], 'uses' => $this->semStack[$stackPos-(11-7)], 'returnType' => $this->semStack[$stackPos-(11-8)], 'stmts' => $this->semStack[$stackPos-(11-10)]], $this->startAttributeStack[$stackPos-(11-1)] + $this->endAttributes); - }, - 387 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 388 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 389 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 390 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 391 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); - }, - 392 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); - }, - 393 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 394 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch(Scalar\String_::fromString($this->semStack[$stackPos-(4-1)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes), $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 395 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 396 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 397 => function ($stackPos) { - $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes), $this->semStack[$stackPos-(7-2)]); - $this->checkClass($this->semValue[0], -1); - }, - 398 => function ($stackPos) { - $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 399 => function ($stackPos) { - list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 400 => function ($stackPos) { - $this->semValue = array(); - }, - 401 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-3)]; - }, - 402 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 403 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 404 => function ($stackPos) { - $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 405 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 406 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 407 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 408 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 409 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 410 => function ($stackPos) { - $this->semValue = $this->fixupPhp5StaticPropCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 411 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 412 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 413 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 414 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 415 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 416 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 417 => function ($stackPos) { - $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 418 => function ($stackPos) { - $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 419 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 420 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 421 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 422 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 423 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 424 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 425 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 426 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 427 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 428 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 429 => function ($stackPos) { - $this->semValue = null; - }, - 430 => function ($stackPos) { - $this->semValue = null; - }, - 431 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 432 => function ($stackPos) { - $this->semValue = array(); - }, - 433 => function ($stackPos) { - $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`', false), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); - }, - 434 => function ($stackPos) { - foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', false); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 435 => function ($stackPos) { - $this->semValue = array(); - }, - 436 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 437 => function ($stackPos) { - $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, true); - }, - 438 => function ($stackPos) { - $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 439 => function ($stackPos) { - $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, false); - }, - 440 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 441 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 442 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 443 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 444 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 445 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 446 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 447 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 448 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], false); - }, - 449 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], false); - }, - 450 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 451 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 452 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 453 => function ($stackPos) { - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 454 => function ($stackPos) { - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 455 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 456 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 457 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 458 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 459 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 460 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 461 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 462 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 463 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 464 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 465 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 466 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 467 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 468 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 469 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 470 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 471 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 472 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 473 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 474 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 475 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 476 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 477 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 478 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 479 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 480 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 481 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 482 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 483 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 484 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 485 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 486 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 487 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 488 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 489 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 490 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 491 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 492 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 493 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 494 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs); - }, - 495 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); - }, - 496 => function ($stackPos) { - $this->semValue = array(); - }, - 497 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 498 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 499 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 500 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 501 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 502 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 503 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 504 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 505 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 506 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 507 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 508 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 509 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 510 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 511 => function ($stackPos) { - $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 512 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 513 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 514 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 515 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 516 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 517 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 518 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 519 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 520 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 521 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 522 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 523 => function ($stackPos) { - $var = substr($this->semStack[$stackPos-(1-1)], 1); $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var; - }, - 524 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 525 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 526 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 527 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 528 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 529 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 530 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 531 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 532 => function ($stackPos) { - $this->semValue = null; - }, - 533 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 534 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 535 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 536 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 537 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; - }, - 538 => function ($stackPos) { - $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 539 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 540 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 541 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 542 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 543 => function ($stackPos) { - $this->semValue = null; - }, - 544 => function ($stackPos) { - $this->semValue = array(); - }, - 545 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 546 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 547 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 548 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 549 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 550 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 551 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 552 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true); - }, - 553 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 554 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 555 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 556 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); - }, - 557 => function ($stackPos) { - $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 558 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 559 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 560 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 561 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 562 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 563 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 564 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 565 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 566 => function ($stackPos) { - $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 567 => function ($stackPos) { - $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 568 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - ]; - } -} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php index fc895cb0..7d8cb107 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php @@ -1,8 +1,9 @@ -reduceCallbacks = [ - 0 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, + 0 => null, 1 => function ($stackPos) { $this->semValue = $this->handleNamespaces($this->semStack[$stackPos-(1-1)]); }, 2 => function ($stackPos) { - if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; + if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; } $this->semValue = $this->semStack[$stackPos-(2-1)];; }, 3 => function ($stackPos) { $this->semValue = array(); }, 4 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; + $nop = $this->maybeCreateZeroLengthNop($this->tokenPos);; if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; }, - 5 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 6 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 7 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 8 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 9 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 10 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 11 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 12 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 13 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 14 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 15 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 16 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 17 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 18 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 19 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 20 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 21 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 22 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 23 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 24 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 25 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 26 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 27 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 28 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 29 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 30 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 31 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 32 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 33 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 34 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 35 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 36 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 37 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 38 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 39 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 40 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 41 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 42 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 43 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 44 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 45 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 46 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 47 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 48 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 49 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 50 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 51 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 52 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 53 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 54 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 55 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 56 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 57 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 58 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 59 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 60 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 61 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 62 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 63 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 64 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 65 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 66 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 67 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 68 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 69 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 70 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 71 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 72 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 73 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 74 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 75 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, + 5 => null, + 6 => null, + 7 => null, + 8 => null, + 9 => null, + 10 => null, + 11 => null, + 12 => null, + 13 => null, + 14 => null, + 15 => null, + 16 => null, + 17 => null, + 18 => null, + 19 => null, + 20 => null, + 21 => null, + 22 => null, + 23 => null, + 24 => null, + 25 => null, + 26 => null, + 27 => null, + 28 => null, + 29 => null, + 30 => null, + 31 => null, + 32 => null, + 33 => null, + 34 => null, + 35 => null, + 36 => null, + 37 => null, + 38 => null, + 39 => null, + 40 => null, + 41 => null, + 42 => null, + 43 => null, + 44 => null, + 45 => null, + 46 => null, + 47 => null, + 48 => null, + 49 => null, + 50 => null, + 51 => null, + 52 => null, + 53 => null, + 54 => null, + 55 => null, + 56 => null, + 57 => null, + 58 => null, + 59 => null, + 60 => null, + 61 => null, + 62 => null, + 63 => null, + 64 => null, + 65 => null, + 66 => null, + 67 => null, + 68 => null, + 69 => null, + 70 => null, + 71 => null, + 72 => null, + 73 => null, + 74 => null, + 75 => null, 76 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 77 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 78 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 79 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 80 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 81 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 82 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 83 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 84 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, + $this->semValue = $this->semStack[$stackPos-(1-1)]; if ($this->semValue === "emitError(new Error('Cannot use "getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos]))); + }, + 77 => null, + 78 => null, + 79 => null, + 80 => null, + 81 => null, + 82 => null, + 83 => null, + 84 => null, 85 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 86 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 87 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 88 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 89 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 90 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 91 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 92 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 93 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 94 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, + 94 => null, 95 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Name(substr($this->semStack[$stackPos-(1-1)], 1), $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 96 => function ($stackPos) { - $this->semValue = new Name(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Expr\Variable(substr($this->semStack[$stackPos-(1-1)], 1), $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 97 => function ($stackPos) { - $this->semValue = new Expr\Variable(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + /* nothing */ }, 98 => function ($stackPos) { /* nothing */ @@ -1306,283 +1277,237 @@ class Php7 extends \PhpParser\ParserAbstract /* nothing */ }, 100 => function ($stackPos) { - /* nothing */ - }, - 101 => function ($stackPos) { - $this->emitError(new Error('A trailing comma is not allowed here', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); - }, - 102 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; + $this->emitError(new Error('A trailing comma is not allowed here', $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos]))); }, + 101 => null, + 102 => null, 103 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; + $this->semValue = new Node\Attribute($this->semStack[$stackPos-(1-1)], [], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 104 => function ($stackPos) { - $this->semValue = new Node\Attribute($this->semStack[$stackPos-(1-1)], [], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\Attribute($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 105 => function ($stackPos) { - $this->semValue = new Node\Attribute($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 106 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 107 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = new Node\AttributeGroup($this->semStack[$stackPos-(4-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 108 => function ($stackPos) { - $this->semValue = new Node\AttributeGroup($this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 109 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, - 110 => function ($stackPos) { + 109 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, - 111 => function ($stackPos) { + 110 => function ($stackPos) { $this->semValue = []; }, - 112 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 113 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 114 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, + 111 => null, + 112 => null, + 113 => null, + 114 => null, 115 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Stmt\HaltCompiler($this->handleHaltCompiler(), $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 116 => function ($stackPos) { - $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(3-2)], null, $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); + $this->checkNamespace($this->semValue); }, 117 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(3-2)], null, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); + $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($this->semValue); }, 118 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($this->semValue); }, 119 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); + $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 120 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 121 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, + 121 => null, 122 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 123 => function ($stackPos) { - $this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = Stmt\Use_::TYPE_FUNCTION; }, 124 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_FUNCTION; + $this->semValue = Stmt\Use_::TYPE_CONSTANT; }, 125 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_CONSTANT; + $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->semStack[$stackPos-(7-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(7-1)], $this->tokenEndStack[$stackPos])); }, 126 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->semStack[$stackPos-(7-2)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 127 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], Stmt\Use_::TYPE_UNKNOWN, $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos])); }, + 127 => null, 128 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 129 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, - 130 => function ($stackPos) { + 129 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, + 130 => null, 131 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 132 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, - 133 => function ($stackPos) { + 132 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, + 133 => null, 134 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 135 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 136 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = new Node\UseItem($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); $this->checkUseUse($this->semValue, $stackPos-(1-1)); }, 137 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); + $this->semValue = new Node\UseItem($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); $this->checkUseUse($this->semValue, $stackPos-(3-3)); }, 138 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); + $this->semValue = new Node\UseItem($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); $this->checkUseUse($this->semValue, $stackPos-(1-1)); }, 139 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); + $this->semValue = new Node\UseItem($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); $this->checkUseUse($this->semValue, $stackPos-(3-3)); }, 140 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); - }, - 141 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL; }, - 142 => function ($stackPos) { + 141 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; $this->semValue->type = $this->semStack[$stackPos-(2-1)]; }, + 142 => null, 143 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 144 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, - 145 => function ($stackPos) { + 144 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, - 146 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + 145 => function ($stackPos) { + $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, + 146 => null, 147 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 148 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 149 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = new Node\Const_(new Node\Identifier($this->semStack[$stackPos-(3-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos-(3-1)])), $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 150 => function ($stackPos) { - $this->semValue = new Node\Const_(new Node\Identifier($this->semStack[$stackPos-(3-1)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributeStack[$stackPos-(3-1)]), $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Node\Const_(new Node\Identifier($this->semStack[$stackPos-(3-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos-(3-1)])), $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 151 => function ($stackPos) { - $this->semValue = new Node\Const_(new Node\Identifier($this->semStack[$stackPos-(3-1)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributeStack[$stackPos-(3-1)]), $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; } $this->semValue = $this->semStack[$stackPos-(2-1)];; }, 152 => function ($stackPos) { - if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; - }, - 153 => function ($stackPos) { $this->semValue = array(); }, - 154 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; + 153 => function ($stackPos) { + $nop = $this->maybeCreateZeroLengthNop($this->tokenPos);; if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; }, - 155 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 156 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, + 154 => null, + 155 => null, + 156 => null, 157 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 158 => function ($stackPos) { - throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Stmt\Block($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 159 => function ($stackPos) { - - if ($this->semStack[$stackPos-(3-2)]) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; $attrs = $this->startAttributeStack[$stackPos-(3-1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) {$stmts[0]->setAttribute('comments', array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); }; - } else { - $startAttributes = $this->startAttributeStack[$stackPos-(3-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; - if (null === $this->semValue) { $this->semValue = array(); } - } - + $this->semValue = new Stmt\If_($this->semStack[$stackPos-(7-3)], ['stmts' => $this->semStack[$stackPos-(7-5)], 'elseifs' => $this->semStack[$stackPos-(7-6)], 'else' => $this->semStack[$stackPos-(7-7)]], $this->getAttributes($this->tokenStartStack[$stackPos-(7-1)], $this->tokenEndStack[$stackPos])); }, 160 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos-(7-3)], ['stmts' => is_array($this->semStack[$stackPos-(7-5)]) ? $this->semStack[$stackPos-(7-5)] : array($this->semStack[$stackPos-(7-5)]), 'elseifs' => $this->semStack[$stackPos-(7-6)], 'else' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + $this->semValue = new Stmt\If_($this->semStack[$stackPos-(10-3)], ['stmts' => $this->semStack[$stackPos-(10-6)], 'elseifs' => $this->semStack[$stackPos-(10-7)], 'else' => $this->semStack[$stackPos-(10-8)]], $this->getAttributes($this->tokenStartStack[$stackPos-(10-1)], $this->tokenEndStack[$stackPos])); }, 161 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos-(10-3)], ['stmts' => $this->semStack[$stackPos-(10-6)], 'elseifs' => $this->semStack[$stackPos-(10-7)], 'else' => $this->semStack[$stackPos-(10-8)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); + $this->semValue = new Stmt\While_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); }, 162 => function ($stackPos) { - $this->semValue = new Stmt\While_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(7-5)], $this->semStack[$stackPos-(7-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(7-1)], $this->tokenEndStack[$stackPos])); }, 163 => function ($stackPos) { - $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(7-5)], is_array($this->semStack[$stackPos-(7-2)]) ? $this->semStack[$stackPos-(7-2)] : array($this->semStack[$stackPos-(7-2)]), $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->getAttributes($this->tokenStartStack[$stackPos-(9-1)], $this->tokenEndStack[$stackPos])); }, 164 => function ($stackPos) { - $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); }, 165 => function ($stackPos) { - $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 166 => function ($stackPos) { - $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 167 => function ($stackPos) { - $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 168 => function ($stackPos) { - $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 169 => function ($stackPos) { - $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 170 => function ($stackPos) { - $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 171 => function ($stackPos) { - $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + + $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + $this->semValue->setAttribute('hasLeadingNewline', $this->inlineHtmlHasLeadingNewline($stackPos-(1-1))); + }, 172 => function ($stackPos) { - $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 173 => function ($stackPos) { - - $e = $this->semStack[$stackPos-(2-1)]; - if ($e instanceof Expr\Throw_) { - // For backwards-compatibility reasons, convert throw in statement position into - // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_). - $this->semValue = new Stmt\Throw_($e->expr, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - } else { - $this->semValue = new Stmt\Expression($e, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - } - + $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); }, 174 => function ($stackPos) { - $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->getAttributes($this->tokenStartStack[$stackPos-(7-1)], $this->tokenEndStack[$stackPos])); }, 175 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->getAttributes($this->tokenStartStack[$stackPos-(9-1)], $this->tokenEndStack[$stackPos])); }, 176 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(6-3)], new Expr\Error($this->getAttributes($this->tokenStartStack[$stackPos-(6-4)], $this->tokenEndStack[$stackPos-(6-4)])), ['stmts' => $this->semStack[$stackPos-(6-6)]], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos])); }, 177 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(6-3)], new Expr\Error($this->startAttributeStack[$stackPos-(6-4)] + $this->endAttributeStack[$stackPos-(6-4)]), ['stmts' => $this->semStack[$stackPos-(6-6)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); }, 178 => function ($stackPos) { - $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos])); $this->checkTryCatch($this->semValue); }, 179 => function ($stackPos) { - $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkTryCatch($this->semValue); + $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 180 => function ($stackPos) { - $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 181 => function ($stackPos) { - $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 182 => function ($stackPos) { - $this->semValue = array(); /* means: no statement */ + $this->semValue = null; /* means: no statement */ }, + 182 => null, 183 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = $this->maybeCreateNop($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos]); }, 184 => function ($stackPos) { - $startAttributes = $this->startAttributeStack[$stackPos-(1-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; - if ($this->semValue === null) $this->semValue = array(); /* means: no statement */ + if ($this->semStack[$stackPos-(1-1)] instanceof Stmt\Block) { $this->semValue = $this->semStack[$stackPos-(1-1)]->stmts; } else if ($this->semStack[$stackPos-(1-1)] === null) { $this->semValue = []; } else { $this->semValue = [$this->semStack[$stackPos-(1-1)]]; }; }, 185 => function ($stackPos) { $this->semValue = array(); @@ -1597,17 +1522,15 @@ class Php7 extends \PhpParser\ParserAbstract $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 189 => function ($stackPos) { - $this->semValue = new Stmt\Catch_($this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + $this->semValue = new Stmt\Catch_($this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos])); }, 190 => function ($stackPos) { $this->semValue = null; }, 191 => function ($stackPos) { - $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 192 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, + 192 => null, 193 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, @@ -1638,35 +1561,33 @@ class Php7 extends \PhpParser\ParserAbstract 202 => function ($stackPos) { $this->semValue = []; }, - 203 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, + 203 => null, 204 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 205 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(8-3)], ['byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-5)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(8-3)], ['byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-5)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos])); }, 206 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(9-4)], ['byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(9-4)], ['byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(9-1)], $this->tokenEndStack[$stackPos])); }, 207 => function ($stackPos) { - $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(7-2)], ['type' => $this->semStack[$stackPos-(7-1)], 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(7-2)], ['type' => $this->semStack[$stackPos-(7-1)], 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => []], $this->getAttributes($this->tokenStartStack[$stackPos-(7-1)], $this->tokenEndStack[$stackPos])); $this->checkClass($this->semValue, $stackPos-(7-2)); }, 208 => function ($stackPos) { - $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(8-3)], ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(8-3)], ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos])); $this->checkClass($this->semValue, $stackPos-(8-3)); }, 209 => function ($stackPos) { - $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(7-3)], ['extends' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => $this->semStack[$stackPos-(7-1)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(7-3)], ['extends' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => $this->semStack[$stackPos-(7-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(7-1)], $this->tokenEndStack[$stackPos])); $this->checkInterface($this->semValue, $stackPos-(7-3)); }, 210 => function ($stackPos) { - $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(6-3)], ['stmts' => $this->semStack[$stackPos-(6-5)], 'attrGroups' => $this->semStack[$stackPos-(6-1)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(6-3)], ['stmts' => $this->semStack[$stackPos-(6-5)], 'attrGroups' => $this->semStack[$stackPos-(6-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos])); }, 211 => function ($stackPos) { - $this->semValue = new Stmt\Enum_($this->semStack[$stackPos-(8-3)], ['scalarType' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + $this->semValue = new Stmt\Enum_($this->semStack[$stackPos-(8-3)], ['scalarType' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos])); $this->checkEnum($this->semValue, $stackPos-(8-3)); }, 212 => function ($stackPos) { @@ -1684,23 +1605,19 @@ class Php7 extends \PhpParser\ParserAbstract 216 => function ($stackPos) { $this->semValue = 0; }, - 217 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 218 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, + 217 => null, + 218 => null, 219 => function ($stackPos) { $this->checkClassModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; }, 220 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; + $this->semValue = Modifiers::ABSTRACT; }, 221 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; + $this->semValue = Modifiers::FINAL; }, 222 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; + $this->semValue = Modifiers::READONLY; }, 223 => function ($stackPos) { $this->semValue = null; @@ -1720,29 +1637,23 @@ class Php7 extends \PhpParser\ParserAbstract 228 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; }, - 229 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, + 229 => null, 230 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 231 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, - 232 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, + 232 => null, 233 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, - 234 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); - }, + 234 => null, 235 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 236 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + if ($this->semStack[$stackPos-(1-1)] instanceof Stmt\Block) { $this->semValue = $this->semStack[$stackPos-(1-1)]->stmts; } else if ($this->semStack[$stackPos-(1-1)] === null) { $this->semValue = []; } else { $this->semValue = [$this->semStack[$stackPos-(1-1)]]; }; }, 237 => function ($stackPos) { $this->semValue = null; @@ -1750,9 +1661,7 @@ class Php7 extends \PhpParser\ParserAbstract 238 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, - 239 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, + 239 => null, 240 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, @@ -1760,7 +1669,7 @@ class Php7 extends \PhpParser\ParserAbstract $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 242 => function ($stackPos) { - $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Node\DeclareItem($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 243 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; @@ -1781,26 +1690,20 @@ class Php7 extends \PhpParser\ParserAbstract $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 249 => function ($stackPos) { - $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 250 => function ($stackPos) { - $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 251 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 252 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; + $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, + 251 => null, + 252 => null, 253 => function ($stackPos) { - $this->semValue = new Expr\Match_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + $this->semValue = new Expr\Match_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->getAttributes($this->tokenStartStack[$stackPos-(7-1)], $this->tokenEndStack[$stackPos])); }, 254 => function ($stackPos) { $this->semValue = []; }, - 255 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, + 255 => null, 256 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, @@ -1808,13 +1711,13 @@ class Php7 extends \PhpParser\ParserAbstract $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 258 => function ($stackPos) { - $this->semValue = new Node\MatchArm($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Node\MatchArm($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 259 => function ($stackPos) { - $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 260 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 261 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; @@ -1826,7 +1729,7 @@ class Php7 extends \PhpParser\ParserAbstract $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 264 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(5-3)], is_array($this->semStack[$stackPos-(5-5)]) ? $this->semStack[$stackPos-(5-5)] : array($this->semStack[$stackPos-(5-5)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); }, 265 => function ($stackPos) { $this->semValue = array(); @@ -1835,19 +1738,19 @@ class Php7 extends \PhpParser\ParserAbstract $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 267 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->fixupAlternativeElse($this->semValue); + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-6)], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos])); $this->fixupAlternativeElse($this->semValue); }, 268 => function ($stackPos) { $this->semValue = null; }, 269 => function ($stackPos) { - $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 270 => function ($stackPos) { $this->semValue = null; }, 271 => function ($stackPos) { - $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->fixupAlternativeElse($this->semValue); + $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); $this->fixupAlternativeElse($this->semValue); }, 272 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)], false); @@ -1859,11 +1762,9 @@ class Php7 extends \PhpParser\ParserAbstract $this->semValue = array($this->semStack[$stackPos-(1-1)], false); }, 275 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 276 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = array($this->fixupArrayDestructuring($this->semStack[$stackPos-(1-1)]), false); }, + 276 => null, 277 => function ($stackPos) { $this->semValue = array(); }, @@ -1880,58 +1781,50 @@ class Php7 extends \PhpParser\ParserAbstract $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; }, 282 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; + $this->semValue = Modifiers::PUBLIC; }, 283 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; + $this->semValue = Modifiers::PROTECTED; }, 284 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; + $this->semValue = Modifiers::PRIVATE; }, 285 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; + $this->semValue = Modifiers::READONLY; }, 286 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos-(6-6)], null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); + $this->semValue = new Node\Param($this->semStack[$stackPos-(6-6)], null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos]), $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); $this->checkParam($this->semValue); }, 287 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-8)], $this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-5)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes, $this->semStack[$stackPos-(8-2)], $this->semStack[$stackPos-(8-1)]); + $this->semValue = new Node\Param($this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-8)], $this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos]), $this->semStack[$stackPos-(8-2)], $this->semStack[$stackPos-(8-1)]); $this->checkParam($this->semValue); }, 288 => function ($stackPos) { - $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes), null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); - }, - 289 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Node\Param(new Expr\Error($this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos])), null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos]), $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); }, + 289 => null, 290 => function ($stackPos) { - $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 291 => function ($stackPos) { - $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 292 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 293 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, + 292 => null, + 293 => null, 294 => function ($stackPos) { - $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\Name('static', $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 295 => function ($stackPos) { $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos-(1-1)]); }, 296 => function ($stackPos) { - $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\Identifier('array', $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 297 => function ($stackPos) { - $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 298 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Node\Identifier('callable', $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, + 298 => null, 299 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, @@ -1941,9 +1834,7 @@ class Php7 extends \PhpParser\ParserAbstract 301 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, - 302 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, + 302 => null, 303 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, @@ -1960,7 +1851,7 @@ class Php7 extends \PhpParser\ParserAbstract $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 308 => function ($stackPos) { - $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 309 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); @@ -1969,26 +1860,20 @@ class Php7 extends \PhpParser\ParserAbstract $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 311 => function ($stackPos) { - $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 312 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, + 312 => null, 313 => function ($stackPos) { - $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 314 => function ($stackPos) { - $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 315 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, + 315 => null, 316 => function ($stackPos) { $this->semValue = null; }, - 317 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, + 317 => null, 318 => function ($stackPos) { $this->semValue = null; }, @@ -2008,7 +1893,7 @@ class Php7 extends \PhpParser\ParserAbstract $this->semValue = array($this->semStack[$stackPos-(3-2)]); }, 324 => function ($stackPos) { - $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\VariadicPlaceholder($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 325 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); @@ -2017,32 +1902,26 @@ class Php7 extends \PhpParser\ParserAbstract $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 327 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 328 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 329 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 330 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(3-3)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->semStack[$stackPos-(3-1)]); - }, - 331 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = new Node\Arg($this->semStack[$stackPos-(3-3)], false, false, $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos]), $this->semStack[$stackPos-(3-1)]); }, + 331 => null, 332 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 333 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, - 334 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 335 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, + 334 => null, + 335 => null, 336 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, @@ -2050,42 +1929,42 @@ class Php7 extends \PhpParser\ParserAbstract $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 338 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 339 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Node\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 340 => function ($stackPos) { - if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } + if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } else { $this->semValue = $this->semStack[$stackPos-(2-1)]; } }, 341 => function ($stackPos) { $this->semValue = array(); }, 342 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; + $nop = $this->maybeCreateZeroLengthNop($this->tokenPos);; if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 343 => function ($stackPos) { - $this->semValue = new Stmt\Property($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-1)]); + $this->semValue = new Stmt\Property($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos]), $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-1)]); $this->checkProperty($this->semValue, $stackPos-(5-2)); }, 344 => function ($stackPos) { - $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-2)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-1)]); + $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos]), $this->semStack[$stackPos-(5-1)]); $this->checkClassConst($this->semValue, $stackPos-(5-2)); }, 345 => function ($stackPos) { - $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-2)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-4)]); + $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos]), $this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-4)]); $this->checkClassConst($this->semValue, $stackPos-(6-2)); }, 346 => function ($stackPos) { - $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(10-5)], ['type' => $this->semStack[$stackPos-(10-2)], 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-7)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); + $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(10-5)], ['type' => $this->semStack[$stackPos-(10-2)], 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-7)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(10-1)], $this->tokenEndStack[$stackPos])); $this->checkClassMethod($this->semValue, $stackPos-(10-2)); }, 347 => function ($stackPos) { - $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 348 => function ($stackPos) { - $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-1)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); }, 349 => function ($stackPos) { $this->semValue = null; /* will be skipped */ @@ -2103,77 +1982,65 @@ class Php7 extends \PhpParser\ParserAbstract $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 354 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 355 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); }, 356 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 357 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 358 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 359 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, - 360 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, + 360 => null, 361 => function ($stackPos) { $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); }, 362 => function ($stackPos) { $this->semValue = null; }, - 363 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 364 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, + 363 => null, + 364 => null, 365 => function ($stackPos) { $this->semValue = 0; }, 366 => function ($stackPos) { $this->semValue = 0; }, - 367 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 368 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, + 367 => null, + 368 => null, 369 => function ($stackPos) { $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; }, 370 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; + $this->semValue = Modifiers::PUBLIC; }, 371 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; + $this->semValue = Modifiers::PROTECTED; }, 372 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; + $this->semValue = Modifiers::PRIVATE; }, 373 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_STATIC; + $this->semValue = Modifiers::STATIC; }, 374 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; + $this->semValue = Modifiers::ABSTRACT; }, 375 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; + $this->semValue = Modifiers::FINAL; }, 376 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; - }, - 377 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = Modifiers::READONLY; }, + 377 => null, 378 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, @@ -2181,20 +2048,16 @@ class Php7 extends \PhpParser\ParserAbstract $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 380 => function ($stackPos) { - $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 381 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\PropertyItem($this->semStack[$stackPos-(1-1)], null, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 382 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 383 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 384 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = new Node\PropertyItem($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, + 383 => null, + 384 => null, 385 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, @@ -2204,695 +2067,633 @@ class Php7 extends \PhpParser\ParserAbstract 387 => function ($stackPos) { $this->semValue = array(); }, - 388 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 389 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, + 388 => null, + 389 => null, 390 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 391 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\Assign($this->fixupArrayDestructuring($this->semStack[$stackPos-(3-1)]), $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 392 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 393 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 394 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 395 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 396 => function ($stackPos) { - $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + if (!$this->phpVersion->allowsAssignNewByReference()) { + $this->emitError(new Error('Cannot assign new by reference', $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos]))); + } + }, + 395 => null, + 396 => null, 397 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 398 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 399 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 400 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 401 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 402 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 403 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 404 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 405 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 406 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 407 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 408 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 409 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 410 => function ($stackPos) { - $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 411 => function ($stackPos) { - $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 412 => function ($stackPos) { - $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 413 => function ($stackPos) { - $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 414 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 415 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 416 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 417 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 418 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 419 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 420 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 421 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 422 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 423 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 424 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 425 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 426 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 427 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 428 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 429 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 430 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 431 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 432 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 433 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 434 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 435 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 436 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 437 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 438 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 439 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 440 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 441 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 442 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 443 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 444 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 445 => function ($stackPos) { - $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 446 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 447 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 448 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); }, 449 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 450 => function ($stackPos) { - $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 451 => function ($stackPos) { - $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 452 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 453 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 454 => function ($stackPos) { - $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 455 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 456 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 457 => function ($stackPos) { - $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 458 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; - $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]); - $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs); + $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 459 => function ($stackPos) { - $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $attrs = $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos]); + $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]); + $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs); }, 460 => function ($stackPos) { - $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 461 => function ($stackPos) { - $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 462 => function ($stackPos) { - $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 463 => function ($stackPos) { - $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 464 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; - $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; - $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs); + $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 465 => function ($stackPos) { - $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $attrs = $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos]); + $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; + $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs); }, 466 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 467 => function ($stackPos) { - $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, + 467 => null, 468 => function ($stackPos) { - $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 469 => function ($stackPos) { - $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 470 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Yield_(null, null, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 471 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 472 => function ($stackPos) { - $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 473 => function ($stackPos) { - $this->semValue = new Expr\Throw_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 474 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'returnType' => $this->semStack[$stackPos-(8-6)], 'expr' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + $this->semValue = new Expr\Throw_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 475 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'returnType' => $this->semStack[$stackPos-(8-6)], 'expr' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos])); }, 476 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'uses' => $this->semStack[$stackPos-(8-6)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->getAttributes($this->tokenStartStack[$stackPos-(9-1)], $this->tokenEndStack[$stackPos])); }, 477 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'uses' => $this->semStack[$stackPos-(8-6)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos])); }, 478 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->getAttributes($this->tokenStartStack[$stackPos-(9-1)], $this->tokenEndStack[$stackPos])); }, 479 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-8)], 'expr' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(9-1)], $this->tokenEndStack[$stackPos])); }, 480 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-8)], 'expr' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(10-1)], $this->tokenEndStack[$stackPos])); }, 481 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'uses' => $this->semStack[$stackPos-(10-8)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); + $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(9-1)], $this->tokenEndStack[$stackPos])); }, 482 => function ($stackPos) { - $this->semValue = array(new Stmt\Class_(null, ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes), $this->semStack[$stackPos-(8-3)]); - $this->checkClass($this->semValue[0], -1); + $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'uses' => $this->semStack[$stackPos-(10-8)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(10-1)], $this->tokenEndStack[$stackPos])); }, 483 => function ($stackPos) { - $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = array(new Stmt\Class_(null, ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos])), $this->semStack[$stackPos-(8-3)]); + $this->checkClass($this->semValue[0], -1); }, 484 => function ($stackPos) { - list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 485 => function ($stackPos) { - $this->semValue = array(); + list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 486 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-3)]; + $this->semValue = array(); }, 487 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 488 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = $this->semStack[$stackPos-(4-3)]; }, + 488 => null, 489 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 490 => function ($stackPos) { - $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 491 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 492 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 493 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 494 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 495 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 496 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 497 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 498 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, + 498 => null, 499 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 500 => function ($stackPos) { - $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 501 => function ($stackPos) { - $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 502 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 503 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 504 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, + 503 => null, + 504 => null, 505 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 506 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 507 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 508 => function ($stackPos) { - $this->semValue = null; + $this->semValue = new Expr\Error($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); $this->errorState = 2; }, + 507 => null, + 508 => null, 509 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = null; }, 510 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 511 => function ($stackPos) { - $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`'), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); + $this->semValue = array(); }, 512 => function ($stackPos) { - foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', true); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = array($this->semStack[$stackPos-(1-1)]); foreach ($this->semValue as $s) { if ($s instanceof Node\InterpolatedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', $this->phpVersion->supportsUnicodeEscapes()); } }; }, 513 => function ($stackPos) { - $this->semValue = array(); + foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\InterpolatedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', $this->phpVersion->supportsUnicodeEscapes()); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 514 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 515 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = array(); }, + 515 => null, 516 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 517 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Line($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 518 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\File($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 519 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Dir($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 520 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Class_($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 521 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Trait_($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 522 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Method($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 523 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Function_($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 524 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Namespace_($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 525 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 526 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], new Expr\Error($this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->errorState = 2; + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); }, 527 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], new Expr\Error($this->getAttributes($this->tokenStartStack[$stackPos-(3-3)], $this->tokenEndStack[$stackPos-(3-3)])), $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); $this->errorState = 2; }, 528 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); + $attrs = $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos]); $attrs['kind'] = Expr\Array_::KIND_SHORT; + $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); }, 529 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $attrs = $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos]); $attrs['kind'] = Expr\Array_::KIND_LONG; + $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); + $this->createdArrays->attach($this->semValue); }, 530 => function ($stackPos) { - $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->createdArrays->attach($this->semValue); }, 531 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs); + $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos]), $this->phpVersion->supportsUnicodeEscapes()); }, 532 => function ($stackPos) { - $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $attrs = $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos]); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; + foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\InterpolatedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', $this->phpVersion->supportsUnicodeEscapes()); } }; $this->semValue = new Scalar\InterpolatedString($this->semStack[$stackPos-(3-2)], $attrs); }, 533 => function ($stackPos) { - $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos]), $this->phpVersion->allowsInvalidOctals()); }, 534 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 535 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 536 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 537 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); + $this->semValue = Scalar\Float_::fromString($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, + 535 => null, + 536 => null, + 537 => null, 538 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], true); + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos]), $this->getAttributes($this->tokenStartStack[$stackPos-(3-3)], $this->tokenEndStack[$stackPos-(3-3)]), true); }, 539 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos]), $this->getAttributes($this->tokenStartStack[$stackPos-(2-2)], $this->tokenEndStack[$stackPos-(2-2)]), true); }, 540 => function ($stackPos) { - $this->semValue = null; + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos]), $this->getAttributes($this->tokenStartStack[$stackPos-(3-3)], $this->tokenEndStack[$stackPos-(3-3)]), true); }, 541 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 542 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 543 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = null; }, + 542 => null, + 543 => null, 544 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 545 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 546 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 547 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 548 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 549 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, + 545 => null, + 546 => null, + 547 => null, + 548 => null, + 549 => null, 550 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 551 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 552 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, + 551 => null, + 552 => null, 553 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 554 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 555 => function ($stackPos) { - $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, + 555 => null, 556 => function ($stackPos) { - $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 557 => function ($stackPos) { - $this->semValue = null; + $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 558 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 559 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 560 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 561 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = null; }, + 559 => null, + 560 => null, + 561 => null, 562 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 563 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 564 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, + 564 => null, 565 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 566 => function ($stackPos) { - $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); $this->errorState = 2; + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 567 => function ($stackPos) { - $var = $this->semStack[$stackPos-(1-1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var; + $this->semValue = new Expr\Variable(new Expr\Error($this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])), $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); $this->errorState = 2; }, 568 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $var = $this->semStack[$stackPos-(1-1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])) : $var; }, 569 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 570 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, + 570 => null, 571 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 572 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 573 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 574 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 575 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 576 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 577 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, + 577 => null, 578 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 579 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 580 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, + 579 => null, + 580 => null, 581 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 582 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, + 582 => null, 583 => function ($stackPos) { - $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\Error($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); $this->errorState = 2; }, 584 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; $end = count($this->semValue)-1; if ($this->semValue[$end] === null) array_pop($this->semValue); + $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); $this->semValue->setAttribute('kind', Expr\List_::KIND_LIST); + $this->postprocessList($this->semValue); }, 585 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 586 => function ($stackPos) { - /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ + $this->semValue = $this->semStack[$stackPos-(1-1)]; $end = count($this->semValue)-1; if ($this->semValue[$end]->value instanceof Expr\Error) array_pop($this->semValue); }, + 586 => null, 587 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ }, 588 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 589 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 590 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Node\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 591 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, 592 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Node\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 593 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Node\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 594 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Node\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 595 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true); + $this->semValue = new Node\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 596 => function ($stackPos) { - $this->semValue = null; + $this->semValue = new Node\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos]), true); }, 597 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + /* Create an Error node now to remember the position. We'll later either report an error, + or convert this into a null element, depending on whether this is a creation or destructuring context. */ + $attrs = $this->createEmptyElemAttributes($this->tokenPos); + $this->semValue = new Node\ArrayItem(new Expr\Error($attrs), null, false, $attrs); }, 598 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 599 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 600 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 601 => function ($stackPos) { - $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); }, 602 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $attrs = $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos]); $attrs['rawValue'] = $this->semStack[$stackPos-(1-1)]; $this->semValue = new Node\InterpolatedStringPart($this->semStack[$stackPos-(1-1)], $attrs); }, 603 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 604 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, + 604 => null, 605 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); }, 606 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 607 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 608 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 609 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); }, 610 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos])); }, 611 => function ($stackPos) { - $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 612 => function ($stackPos) { - $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 613 => function ($stackPos) { - $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); }, 614 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); }, + 615 => null, ]; } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php new file mode 100644 index 00000000..76d52a8c --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php @@ -0,0 +1,2717 @@ +'", + "T_IS_GREATER_OR_EQUAL", + "'.'", + "T_SL", + "T_SR", + "'+'", + "'-'", + "'*'", + "'/'", + "'%'", + "'!'", + "T_INSTANCEOF", + "'~'", + "T_INC", + "T_DEC", + "T_INT_CAST", + "T_DOUBLE_CAST", + "T_STRING_CAST", + "T_ARRAY_CAST", + "T_OBJECT_CAST", + "T_BOOL_CAST", + "T_UNSET_CAST", + "'@'", + "T_POW", + "'['", + "T_NEW", + "T_CLONE", + "T_EXIT", + "T_IF", + "T_ELSEIF", + "T_ELSE", + "T_ENDIF", + "T_LNUMBER", + "T_DNUMBER", + "T_STRING", + "T_STRING_VARNAME", + "T_VARIABLE", + "T_NUM_STRING", + "T_INLINE_HTML", + "T_ENCAPSED_AND_WHITESPACE", + "T_CONSTANT_ENCAPSED_STRING", + "T_ECHO", + "T_DO", + "T_WHILE", + "T_ENDWHILE", + "T_FOR", + "T_ENDFOR", + "T_FOREACH", + "T_ENDFOREACH", + "T_DECLARE", + "T_ENDDECLARE", + "T_AS", + "T_SWITCH", + "T_MATCH", + "T_ENDSWITCH", + "T_CASE", + "T_DEFAULT", + "T_BREAK", + "T_CONTINUE", + "T_GOTO", + "T_FUNCTION", + "T_FN", + "T_CONST", + "T_RETURN", + "T_TRY", + "T_CATCH", + "T_FINALLY", + "T_USE", + "T_INSTEADOF", + "T_GLOBAL", + "T_STATIC", + "T_ABSTRACT", + "T_FINAL", + "T_PRIVATE", + "T_PROTECTED", + "T_PUBLIC", + "T_READONLY", + "T_VAR", + "T_UNSET", + "T_ISSET", + "T_EMPTY", + "T_HALT_COMPILER", + "T_CLASS", + "T_TRAIT", + "T_INTERFACE", + "T_ENUM", + "T_EXTENDS", + "T_IMPLEMENTS", + "T_OBJECT_OPERATOR", + "T_NULLSAFE_OBJECT_OPERATOR", + "T_LIST", + "T_ARRAY", + "T_CALLABLE", + "T_CLASS_C", + "T_TRAIT_C", + "T_METHOD_C", + "T_FUNC_C", + "T_LINE", + "T_FILE", + "T_START_HEREDOC", + "T_END_HEREDOC", + "T_DOLLAR_OPEN_CURLY_BRACES", + "T_CURLY_OPEN", + "T_PAAMAYIM_NEKUDOTAYIM", + "T_NAMESPACE", + "T_NS_C", + "T_DIR", + "T_NS_SEPARATOR", + "T_ELLIPSIS", + "T_NAME_FULLY_QUALIFIED", + "T_NAME_QUALIFIED", + "T_NAME_RELATIVE", + "T_ATTRIBUTE", + "';'", + "']'", + "'('", + "')'", + "'{'", + "'}'", + "'`'", + "'\"'", + "'$'" + ); + + protected array $tokenToSymbol = array( + 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 56, 166, 168, 167, 55, 168, 168, + 161, 162, 53, 51, 8, 52, 48, 54, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 31, 159, + 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 70, 168, 160, 36, 168, 165, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 163, 35, 164, 58, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, + 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, + 41, 42, 43, 45, 47, 49, 50, 57, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158 + ); + + protected array $action = array( + 133, 134, 135, 582, 136, 137, 0, 751, 752, 753, + 138, 38, 327,-32766,-32766,-32766,-32766,-32766,-32766, 837, + 826,-32767,-32767,-32767,-32767, 102, 103, 104, 1112, 1113, + 1114, 1111, 1110, 1109, 1115, 745, 744,-32766, 1027,-32766, + -32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767, + -32767, 1245,-32766,-32766, 1322, 754, 1112, 1113, 1114, 1111, + 1110, 1109, 1115, 459, 460, 461, 2, 990, 1306, 265, + 139, 404, 758, 759, 760, 761, 467, 468, 429, 835, + 606, -16, 1341, 23, 292, 815, 762, 763, 764, 765, + 766, 767, 768, 769, 770, 771, 791, 583, 792, 793, + 794, 795, 783, 784, 345, 346, 786, 787, 772, 773, + 774, 776, 777, 778, 356, 818, 819, 820, 821, 822, + 584, 779, 780, 585, 586, 941, 803, 801, 802, 814, + 798, 799, 835, 826, 587, 588, 797, 589, 590, 591, + 592, 593, 594, -328, 36, 251, 35, -194, 800, 595, + 596, -193, 140, -85, 133, 134, 135, 582, 136, 137, + 1060, 751, 752, 753, 138, 38, 129, -110, -110, -585, + -32766, -585, -110,-32766,-32766,-32766, 241, 836, -110, 145, + 959, 960,-32766,-32766,-32766, 961, -594,-32766, 482, 745, + 744, 955, 1036, -594,-32766, 991,-32766,-32766,-32766,-32766, + -32766,-32766,-32766,-32766,-32766,-32766,-32766,-32766, 299, 754, + 831, 75,-32766,-32766,-32766, 291, 142, 326, 242, -85, + 326, 382, 381, 265, 139, 404, 758, 759, 760, 761, + 82, 423, 429,-32766, 326,-32766,-32766,-32766,-32766, 815, + 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, + 791, 583, 792, 793, 794, 795, 783, 784, 345, 346, + 786, 787, 772, 773, 774, 776, 777, 778, 356, 818, + 819, 820, 821, 822, 584, 779, 780, 585, 586, 254, + 803, 801, 802, 814, 798, 799, 832, 725, 587, 588, + 797, 589, 590, 591, 592, 593, 594, -328, 83, 84, + 85, -194, 800, 595, 596, -193, 149, 775, 746, 747, + 748, 749, 750, 151, 751, 752, 753, 788, 789, 37, + 483, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, -594, 274, -594,-32766,-32766, + -32766,-32766,-32766,-32766, 310, 1089, 127, 312, 110, 737, + 1326, 21, 754,-32766,-32766,-32766, -272, 1325,-32766,-32766, + 1088,-32766,-32766,-32766,-32766,-32766, 755, 756, 757, 758, + 759, 760, 761, 1104,-32766, 824,-32766,-32766, -545, 429, + 1036, 323, 815, 762, 763, 764, 765, 766, 767, 768, + 769, 770, 771, 791, 813, 792, 793, 794, 795, 783, + 784, 785, 812, 786, 787, 772, 773, 774, 776, 777, + 778, 817, 818, 819, 820, 821, 822, 823, 779, 780, + 781, 782, 1033, 803, 801, 802, 814, 798, 799, 745, + 744, 790, 796, 797, 804, 805, 807, 806, 808, 809, + 152,-32766, -545, -545, 1036, 800, 811, 810, 50, 51, + 52, 513, 53, 54, 1240, 1239, 1241, -545, 55, 56, + -110, 57,-32766, 1090, 920, -110, 556, -110, 292, -551, + 339, -545, 306, 103, 104, -110, -110, -110, -110, -110, + -110, -110, -110, 105, 106, 107, 108, 109, 1245, 274, + 380, 381, -591, -367, 715, -367, 340, 58, 59, -591, + 423, 110, 60, 370, 61, 248, 249, 62, 63, 64, + 65, 66, 67, 68, 69, -544, 28, 267, 70, 445, + 514,-32766, 374, -342, 1272, 1273, 515, 1278, 835, 862, + 389, 863, 1270, 42, 25, 516, 943, 517, 943, 518, + 920, 519, 299, 1036, 520, 521, 1266, 910, 441, 44, + 45, 446, 377, 376,-32766, 46, 522, 1023, 1022, 1021, + 1024, 368, 338, 391, 1238, 7, 291, 442, 1231, 835, + 524, 525, 526, 443, 1245, 357, 1036, 362, 834, -544, + -544, 154, 528, 529, 444, 1259, 1260, 1261, 1262, 1256, + 1257, 298,-32766,-32766, -544, -548, 1059, 1263, 1258, 291, + 1236, 1240, 1239, 1241, 299, 841, -550, 71, -544, 656, + 26, 321, 322, 326, -153, -153, -153, 920, 612, 675, + 676, 1035, 922, 910,-32766, 286, 710, 835, 155, -153, + 828, -153, 862, -153, 863, -153, 150, 407, 156, 1240, + 1239, 1241,-32766,-32766,-32766, 375, 1351, 716, 75, 1352, + 158, -591, 33, -591, 326, 835, 959, 960, -78, -548, + -548, 523, 920,-32766, 378, 379, 896, 955, -110, -110, + -110, 32, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 745, 744, -58, -548, -57, + -110, -110, 717, 745, 744, -110, 383, 384, 922, 1033, + 910, -110, 710, -153, 647, 648, 830, 124, 141, 125, + -32766, 1033, 326, 712, 1150, 1152, 48, 130, 131, 144, + 159, 1036,-32766, 160, 161, -543, 28, 162, 1238, 920, + 163, 299, 920, 1036, 75,-32766,-32766,-32766, 835,-32766, + 326,-32766, 1270,-32766, 282, 910,-32766, -87, -84, -78, + -73,-32766,-32766,-32766, -4, 920, 282,-32766,-32766, 720, + -72, -71, 727,-32766, 420, -70, -69, -68, -67, -66, + 287, 286,-32766, -65, -46, 922, 745, 744, 1231, 710, + 300, 301, -546, -18, 148, -302, 273, 283, 726, -543, + -543, 729, 528, 529, 920, 1259, 1260, 1261, 1262, 1256, + 1257, 919, 74, 147, -543, 288, 293, 1263, 1258, 126, + -298, 280, 910,-32766, 281, 910, 284, 73, -543, 1238, + 976, 690, 322, 326, 710, 285,-32766,-32766,-32766, 332, + -32766, 274,-32766, 294,-32766, 937, 110,-32766, 910, 685, + 835, -543,-32766,-32766,-32766, 826, -546, -546,-32766,-32766, + 146,-32766, -50, 701,-32766, 420, 703, 691, 20, 1119, + 375, -546, 436,-32766, 645, 1353, 1277, 297, 657,-32766, + 1279, 959, 960, 561, 956, -546, 523, 910, 692, 693, + 678, 527, 955, -110, -110, -110, 132, 922, 662, 663, + 922, 710, 464, -508, 710,-32766, 1240, 1239, 1241, 493, + 679, 1238, 282, 939, 10, -543, -543, 40,-32766,-32766, + -32766, 731,-32766, 922,-32766, 307,-32766, 710, -4,-32766, + -543, 305, 41, 304,-32766,-32766,-32766, 0, 0,-32766, + -32766,-32766, 920, 0, -543, 1238,-32766, 420, 311, 0, + 567, 299,-32766,-32766,-32766,-32766,-32766, -498,-32766, 897, + -32766, 0, 922,-32766, 8, 0, 710, 24,-32766,-32766, + -32766,-32766, 372, 610,-32766,-32766, 834, 1238, 734, -275, + -32766, 420, 920, 735,-32766,-32766,-32766, 854,-32766,-32766, + -32766, 901,-32766, 1000, 977,-32766, 49, 984, 974, 488, + -32766,-32766,-32766,-32766, 985, 899,-32766,-32766, 972, 1238, + 574, 1093,-32766, 420, 1096, 1097,-32766,-32766,-32766, 1094, + -32766,-32766,-32766, 1095,-32766, 910, 1101,-32766, 1267, 846, + 1292, 1310,-32766,-32766,-32766, 1344, 650, 34,-32766,-32766, + -579, -250, -250, -250,-32766, 420, -578, 375, -577, -551, + 28, 267, -550,-32766, -549, -492, 1, 29, 959, 960, + 302, 303, 835, 523, 30, 910, 1270, 39, 896, 955, + -110, -110, -110, 43, 47, 373, 72, 76, 77, 78, + 79, -249, -249, -249, 80, 81, 143, 375, 153, 128, + -273, 157, 247, 328, 357, 358, 359, 360, 959, 960, + 922, 361, 1231, 523, 710, -250, 362, 363, 896, 955, + -110, -110, -110, 364, 365, 366, 367, 529, 28, 1259, + 1260, 1261, 1262, 1256, 1257, 369, 437, 555, 1207, -272, + 835, 1263, 1258, 13, 1270, 14,-32766, 15, 16, 18, + 922, 73, 1238, 1348, 710, -249, 322, 326, 406,-32766, + -32766,-32766, 484,-32766, 485,-32766, 492,-32766, 495, 496, + -32766, 497, 498, 502, 503,-32766,-32766,-32766, 504, 511, + 1231,-32766,-32766, 572, 696, 1249, 1190,-32766, 420, 1268, + 1062, 1061, 1042, 1226, 1038, 529,-32766, 1259, 1260, 1261, + 1262, 1256, 1257, -277, -102, 12, 17, 27, 296, 1263, + 1258, 405, 603, 607, 636, 702, 1194, 1244, 1191, 73, + 320, 1323, 0, 371, 322, 326, 711, 714, 718, 719, + 721, 722, 723, 724, 728, 0, 713, 0, 1350, 857, + 856, 865, 949, 992, 864, 1349, 948, 946, 947, 950, + 1222, 930, 940, 928, 982, 983, 634, 1347, 1304, 1293, + 1311, 1320, 0, 0, 1271, 0, 326 + ); + + protected array $actionCheck = array( + 2, 3, 4, 5, 6, 7, 0, 9, 10, 11, + 12, 13, 70, 9, 10, 11, 9, 10, 11, 1, + 80, 44, 45, 46, 47, 48, 49, 50, 116, 117, + 118, 119, 120, 121, 122, 37, 38, 30, 1, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 1, 9, 10, 1, 57, 116, 117, 118, 119, + 120, 121, 122, 129, 130, 131, 8, 31, 1, 71, + 72, 73, 74, 75, 76, 77, 134, 135, 80, 82, + 1, 31, 85, 8, 30, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 1, 128, 129, 130, 131, + 132, 133, 82, 80, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 8, 147, 148, 8, 8, 150, 151, + 152, 8, 154, 31, 2, 3, 4, 5, 6, 7, + 162, 9, 10, 11, 12, 13, 8, 117, 118, 160, + 116, 162, 122, 9, 10, 11, 97, 159, 128, 8, + 117, 118, 9, 10, 11, 122, 1, 137, 31, 37, + 38, 128, 138, 8, 30, 159, 32, 33, 34, 35, + 36, 37, 38, 30, 9, 32, 33, 34, 158, 57, + 80, 161, 9, 10, 11, 161, 163, 167, 14, 97, + 167, 106, 107, 71, 72, 73, 74, 75, 76, 77, + 163, 116, 80, 30, 167, 32, 33, 34, 35, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 8, + 128, 129, 130, 131, 132, 133, 156, 163, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 162, 9, 10, + 11, 162, 150, 151, 152, 162, 154, 2, 3, 4, + 5, 6, 7, 14, 9, 10, 11, 12, 13, 30, + 163, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 160, 57, 162, 9, 10, + 11, 9, 10, 11, 8, 159, 14, 8, 69, 163, + 1, 101, 57, 9, 10, 11, 162, 8, 116, 30, + 1, 32, 33, 34, 35, 36, 71, 72, 73, 74, + 75, 76, 77, 123, 30, 80, 32, 33, 70, 80, + 138, 8, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 116, 128, 129, 130, 131, 132, 133, 37, + 38, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 14, 116, 134, 135, 138, 150, 151, 152, 2, 3, + 4, 5, 6, 7, 155, 156, 157, 149, 12, 13, + 101, 15, 137, 164, 1, 106, 85, 108, 30, 161, + 8, 163, 113, 49, 50, 116, 117, 118, 119, 120, + 121, 122, 123, 51, 52, 53, 54, 55, 1, 57, + 106, 107, 1, 106, 31, 108, 8, 51, 52, 8, + 116, 69, 56, 8, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 70, 70, 71, 72, 73, + 74, 116, 8, 164, 78, 79, 80, 146, 82, 106, + 8, 108, 86, 87, 88, 89, 122, 91, 122, 93, + 1, 95, 158, 138, 98, 99, 1, 84, 8, 103, + 104, 105, 106, 107, 116, 109, 110, 119, 120, 121, + 122, 115, 116, 106, 80, 108, 161, 8, 122, 82, + 124, 125, 126, 8, 1, 161, 138, 161, 155, 134, + 135, 14, 136, 137, 8, 139, 140, 141, 142, 143, + 144, 145, 51, 52, 149, 70, 1, 151, 152, 161, + 116, 155, 156, 157, 158, 8, 161, 161, 163, 75, + 76, 165, 166, 167, 75, 76, 77, 1, 52, 75, + 76, 137, 159, 84, 137, 30, 163, 82, 14, 90, + 80, 92, 106, 94, 108, 96, 101, 102, 14, 155, + 156, 157, 9, 10, 11, 106, 80, 31, 161, 83, + 14, 160, 14, 162, 167, 82, 117, 118, 16, 134, + 135, 122, 1, 30, 106, 107, 127, 128, 129, 130, + 131, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 37, 38, 16, 163, 16, + 117, 118, 31, 37, 38, 122, 106, 107, 159, 116, + 84, 128, 163, 164, 111, 112, 156, 16, 163, 16, + 137, 116, 167, 163, 59, 60, 70, 16, 16, 16, + 16, 138, 74, 16, 16, 70, 70, 16, 80, 1, + 16, 158, 1, 138, 161, 87, 88, 89, 82, 91, + 167, 93, 86, 95, 161, 84, 98, 31, 31, 31, + 31, 103, 104, 105, 0, 1, 161, 109, 110, 31, + 31, 31, 31, 115, 116, 31, 31, 31, 31, 31, + 37, 30, 124, 31, 31, 159, 37, 38, 122, 163, + 134, 135, 70, 31, 31, 35, 31, 31, 31, 134, + 135, 31, 136, 137, 1, 139, 140, 141, 142, 143, + 144, 31, 154, 31, 149, 37, 37, 151, 152, 163, + 35, 35, 84, 74, 35, 84, 35, 161, 163, 80, + 159, 80, 166, 167, 163, 35, 87, 88, 89, 35, + 91, 57, 93, 37, 95, 38, 69, 98, 84, 77, + 82, 70, 103, 104, 105, 80, 134, 135, 109, 110, + 70, 85, 31, 80, 115, 116, 92, 116, 97, 82, + 106, 149, 108, 124, 113, 83, 146, 113, 90, 137, + 146, 117, 118, 89, 128, 163, 122, 84, 137, 138, + 94, 127, 128, 129, 130, 131, 31, 159, 96, 100, + 159, 163, 97, 149, 163, 74, 155, 156, 157, 97, + 100, 80, 161, 154, 150, 134, 135, 159, 87, 88, + 89, 164, 91, 159, 93, 114, 95, 163, 164, 98, + 149, 133, 159, 132, 103, 104, 105, -1, -1, 74, + 109, 110, 1, -1, 163, 80, 115, 116, 132, -1, + 153, 158, 87, 88, 89, 124, 91, 149, 93, 164, + 95, -1, 159, 98, 149, -1, 163, 149, 103, 104, + 105, 74, 149, 153, 109, 110, 155, 80, 159, 162, + 115, 116, 1, 159, 87, 88, 89, 159, 91, 124, + 93, 159, 95, 159, 159, 98, 70, 159, 159, 102, + 103, 104, 105, 74, 159, 159, 109, 110, 159, 80, + 81, 159, 115, 116, 159, 159, 87, 88, 89, 159, + 91, 124, 93, 159, 95, 84, 159, 98, 160, 160, + 160, 160, 103, 104, 105, 160, 160, 163, 109, 110, + 161, 100, 101, 102, 115, 116, 161, 106, 161, 161, + 70, 71, 161, 124, 161, 161, 161, 161, 117, 118, + 134, 135, 82, 122, 161, 84, 86, 161, 127, 128, + 129, 130, 131, 161, 161, 149, 161, 161, 161, 161, + 161, 100, 101, 102, 161, 161, 161, 106, 161, 163, + 162, 161, 161, 161, 161, 161, 161, 161, 117, 118, + 159, 161, 122, 122, 163, 164, 161, 161, 127, 128, + 129, 130, 131, 161, 161, 161, 161, 137, 70, 139, + 140, 141, 142, 143, 144, 161, 161, 161, 165, 162, + 82, 151, 152, 162, 86, 162, 74, 162, 162, 162, + 159, 161, 80, 164, 163, 164, 166, 167, 162, 87, + 88, 89, 162, 91, 162, 93, 162, 95, 162, 162, + 98, 162, 162, 162, 162, 103, 104, 105, 162, 162, + 122, 109, 110, 162, 162, 162, 162, 115, 116, 162, + 162, 162, 162, 162, 162, 137, 124, 139, 140, 141, + 142, 143, 144, 162, 162, 162, 162, 162, 162, 151, + 152, 162, 162, 162, 162, 162, 162, 162, 162, 161, + 163, 162, -1, 163, 166, 167, 163, 163, 163, 163, + 163, 163, 163, 163, 163, -1, 163, -1, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, -1, -1, 166, -1, 167 + ); + + protected array $actionBase = array( + 0, -2, 152, 549, 764, 941, 981, 751, 555, 309, + 560, 864, 626, 738, 738, 741, 738, 473, 671, 783, + -60, 305, 305, 783, 305, 803, 803, 803, 658, 658, + 658, 658, 749, 749, 897, 897, 929, 865, 831, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 18, 36, 79, 648, 1036, 1044, + 1040, 1045, 1034, 1033, 1039, 1041, 1046, 1083, 1084, 782, + 1085, 1086, 1082, 1087, 1042, 876, 1035, 1043, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 195, 342, 43, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 643, 643, + 643, 666, 666, 354, 173, 980, 203, 1048, 1048, 1048, + 1048, 1048, 1048, 1048, 1048, 1048, 665, 339, 164, 164, + 7, 7, 7, 7, 7, 50, 369, 583, -23, -23, + -23, -23, 448, 605, 497, 260, 397, 434, 54, 394, + 593, 593, 316, 316, 415, 415, 316, 316, 316, 442, + 442, 252, 252, 252, 252, 318, 455, 433, 391, 742, + 53, 53, 53, 53, 742, 742, 742, 742, 734, 1088, + 742, 742, 742, 722, 781, 781, 926, 551, 551, 781, + 536, -3, -3, 536, 63, -3, 67, 576, 335, 756, + 115, 9, 335, 535, 656, 501, 185, 821, 568, 821, + 1032, 424, 776, 776, 426, 753, 729, 867, 1063, 1049, + 799, 1080, 810, 1081, -66, -58, 728, 1031, 1031, 1031, + 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1089, 402, + 1032, 130, 1089, 1089, 1089, 402, 402, 402, 402, 402, + 402, 402, 402, 402, 402, 603, 130, 544, 554, 130, + 804, 402, 18, 808, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 762, 157, 18, 36, 124, 124, + 196, 37, 124, 124, 124, 124, 18, 18, 18, 18, + 568, 784, 797, 600, 820, 143, 784, 784, 784, 122, + 135, 204, 139, 760, 785, 467, 775, 775, 787, 895, + 895, 775, 768, 775, 787, 913, 775, 775, 895, 895, + 793, 158, 550, 472, 524, 569, 895, 346, 775, 775, + 775, 775, 816, 575, 775, 271, 171, 775, 775, 816, + 801, 766, 58, 798, 895, 895, 895, 816, 505, 798, + 798, 798, 819, 824, 761, 765, 383, 349, 607, 138, + 807, 765, 765, 775, 532, 761, 765, 761, 765, 759, + 765, 765, 765, 761, 765, 768, 498, 765, 714, 586, + 75, 765, 6, 915, 916, 726, 917, 906, 918, 965, + 919, 923, 1053, 894, 931, 912, 924, 966, 903, 896, + 780, 701, 703, 815, 754, 893, 777, 777, 777, 888, + 777, 777, 777, 777, 777, 777, 777, 777, 701, 868, + 823, 794, 934, 711, 712, 1011, 730, 795, 963, 933, + 1013, 925, 758, 713, 977, 935, 757, 1047, 936, 940, + 986, 1014, 828, 1017, 979, 790, 1064, 1065, 869, 946, + 1054, 777, 915, 923, 727, 912, 924, 903, 896, 752, + 748, 746, 747, 745, 744, 739, 740, 763, 1018, 887, + 879, 870, 945, 891, 701, 871, 971, 874, 990, 992, + 1050, 805, 792, 875, 1066, 952, 953, 954, 1055, 1019, + 1056, 773, 973, 817, 994, 812, 1067, 996, 997, 999, + 1000, 1057, 1068, 1058, 885, 1059, 832, 788, 928, 802, + 1069, 299, 791, 800, 806, 964, 436, 932, 1060, 1070, + 1071, 1001, 1002, 1006, 1072, 1073, 927, 834, 975, 796, + 976, 967, 835, 838, 577, 779, 1020, 786, 789, 778, + 624, 634, 1074, 1075, 1076, 930, 767, 772, 839, 845, + 1021, 743, 1022, 1077, 646, 846, 717, 1078, 1012, 718, + 721, 652, 683, 681, 724, 774, 1061, 818, 811, 771, + 955, 721, 770, 849, 1079, 852, 855, 856, 1007, 860, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 456, 456, 456, 456, 456, 456, 305, 305, 305, 305, + 305, 456, 456, 456, 456, 456, 456, 456, 305, 305, + 0, 0, 305, 0, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 494, 494, 289, 289, 494, 289, 494, 494, 494, 494, + 494, 494, 494, 494, 494, 0, 289, 289, 289, 289, + 289, 289, 289, 289, 494, 793, 494, 442, 442, 442, + 442, 494, 494, 494, -88, -88, 442, 494, 63, 494, + 494, 494, 494, 494, 494, 494, 494, 494, 0, 0, + 494, 494, 494, 494, 0, 0, 130, -3, 494, 768, + 768, 768, 768, 494, 494, 494, 494, -3, -3, 494, + 494, 494, 0, 0, 0, 0, 442, 442, 0, 130, + 0, 0, 130, 0, 0, 768, 768, 494, 63, 793, + 359, 494, 0, 0, 0, 0, 130, 768, 130, 402, + 775, -3, -3, 775, 402, 402, 124, 18, 359, 545, + 545, 545, 545, 0, 0, 568, 793, 793, 793, 793, + 793, 793, 793, 793, 793, 793, 793, 768, 0, 793, + 0, 768, 768, 768, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 768, + 0, 0, 895, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 913, 0, 0, 0, 0, 0, 0, + 768, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 777, 805, 0, 805, 0, 777, 777, 777, 0, 0, + 0, 0, 779, 743 + ); + + protected array $actionDefault = array( + 3,32767, 102,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767, 100,32767,32767,32767,32767, 597, 597, + 597, 597,32767,32767, 254, 102,32767,32767, 470, 387, + 387, 387,32767,32767, 541, 541, 541, 541, 541, 541, + 32767,32767,32767,32767,32767,32767, 470,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767, 100, + 32767,32767,32767, 36, 7, 8, 10, 11, 49, 17, + 324,32767,32767,32767,32767, 102,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767, 590,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767, 474, 453, + 454, 456, 457, 386, 542, 596, 327, 593, 385, 145, + 339, 329, 242, 330, 258, 475, 259, 476, 479, 480, + 215, 287, 382, 149, 150, 417, 471, 419, 469, 473, + 418, 392, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 390, 391, 472, 450, 449, + 448,32767,32767, 415, 416,32767, 420,32767,32767,32767, + 32767,32767,32767,32767, 102,32767, 389, 423, 421, 422, + 439, 440, 437, 438, 441,32767,32767,32767, 442, 443, + 444, 445, 316,32767,32767, 366, 364, 424, 316, 111, + 32767,32767,32767,32767,32767,32767,32767,32767,32767, 430, + 431,32767,32767,32767,32767, 535, 447,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 102,32767, 100, 537, 412, 414, 504, 425, 426, 393, + 32767, 511,32767, 102,32767, 513,32767,32767,32767,32767, + 32767,32767,32767, 536,32767, 543, 543,32767, 497, 100, + 195,32767,32767, 512,32767, 195, 195,32767,32767,32767, + 32767,32767,32767,32767,32767, 604, 497, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110,32767, 195, + 110,32767,32767,32767, 100, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 190,32767, 268, 270, 102, + 558, 195,32767, 516,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767, 509,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 497, 435, 138,32767, 138, 543, 427, 428, 429, 499, + 543, 543, 543, 312, 289,32767,32767,32767,32767, 514, + 514, 100, 100, 100, 100, 509,32767,32767,32767,32767, + 111, 99, 99, 99, 99, 99, 103, 101,32767,32767, + 32767,32767, 223, 99,32767, 101, 101,32767,32767, 223, + 225, 212, 101, 227,32767, 562, 563, 223, 101, 227, + 227, 227, 247, 247, 486, 318, 101, 99, 101, 101, + 197, 318, 318,32767, 101, 486, 318, 486, 318, 199, + 318, 318, 318, 486, 318,32767, 101, 318, 214, 99, + 99, 318,32767,32767,32767, 499,32767,32767,32767,32767, + 32767,32767,32767, 222,32767,32767,32767,32767,32767,32767, + 32767,32767, 530,32767, 547, 560, 433, 434, 436, 545, + 458, 459, 460, 461, 462, 463, 464, 466, 592,32767, + 503,32767,32767,32767, 338,32767, 602,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767, 603,32767, 543,32767,32767,32767, + 32767, 432, 9, 74, 492, 42, 43, 51, 57, 520, + 521, 522, 523, 517, 518, 524, 519,32767,32767, 525, + 568,32767,32767, 544, 595,32767,32767,32767,32767,32767, + 32767, 138,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767, 530,32767, 136,32767,32767,32767,32767, + 32767,32767,32767,32767, 526,32767,32767,32767, 543,32767, + 32767,32767,32767, 314, 311,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767, 543,32767,32767,32767,32767,32767, 291,32767, 308, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767, 286,32767,32767, 381, + 499, 294, 296, 297,32767,32767,32767,32767, 360,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 152, 152, 3, 3, 341, 152, 152, 152, 341, 341, + 152, 341, 341, 341, 152, 152, 152, 152, 152, 152, + 280, 185, 262, 265, 247, 247, 152, 352, 152 + ); + + protected array $goto = array( + 196, 196, 1034, 1065, 697, 431, 661, 621, 658, 319, + 706, 425, 314, 315, 335, 576, 430, 336, 432, 638, + 654, 655, 852, 672, 673, 674, 853, 167, 167, 167, + 167, 221, 197, 193, 193, 177, 179, 216, 193, 193, + 193, 193, 193, 194, 194, 194, 194, 194, 194, 188, + 189, 190, 191, 192, 218, 216, 219, 536, 537, 421, + 538, 540, 541, 542, 543, 544, 545, 546, 547, 1136, + 168, 169, 170, 195, 171, 172, 173, 166, 174, 175, + 176, 178, 215, 217, 220, 238, 243, 244, 246, 257, + 258, 259, 260, 261, 262, 263, 264, 268, 269, 270, + 271, 277, 289, 290, 317, 318, 426, 427, 428, 581, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 180, 237, 181, 198, 199, + 200, 239, 188, 189, 190, 191, 192, 218, 1136, 201, + 182, 183, 184, 202, 198, 185, 240, 203, 201, 165, + 204, 205, 186, 206, 207, 208, 187, 209, 210, 211, + 212, 213, 214, 855, 1232, 975, 279, 279, 279, 279, + 623, 623, 419, 351, 1269, 600, 1269, 1269, 1269, 1269, + 1269, 1269, 1269, 1269, 1269, 1287, 1287, 599, 1100, 1287, + 709, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 508, 700, 827, 1098, 458, 559, 552, 860, 833, 909, + 904, 905, 918, 861, 906, 858, 907, 908, 859, 1233, + 1234, 912, 500, 886, 501, 252, 252, 843, 1107, 1108, + 507, 1087, 1082, 1083, 1084, 341, 552, 559, 568, 569, + 344, 579, 602, 616, 617, 1235, 1295, 1296, 833, 440, + 833, 22, 250, 250, 250, 250, 245, 253, 694, 573, + 1237, 829, 1237, 893, 851, 893, 893, 1034, 1034, 1237, + 694, 349, 342, 1034, 694, 1034, 1034, 1034, 1034, 1034, + 1034, 1034, 1034, 1034, 848, 1327, 1034, 1034, 1034, 1034, + 1319, 1319, 1319, 1319, 1237, 343, 342, 1040, 1039, 1237, + 1237, 1237, 1237, 868, 996, 1237, 1237, 1237, 913, 355, + 914, 354, 354, 354, 354, 466, 466, 479, 880, 355, + 355, 867, 394, 926, 466, 481, 571, 927, 967, 410, + 705, 942, 355, 355, 942, 848, 355, 660, 1354, 609, + 624, 627, 628, 629, 630, 651, 652, 653, 708, 554, + 1133, 1285, 1285, 355, 355, 1285, 1058, 1285, 1285, 1285, + 1285, 1285, 1285, 1285, 1285, 1285, 539, 539, 1185, 424, + 539, 611, 539, 539, 539, 539, 539, 539, 539, 539, + 539, 566, 682, 1337, 1337, 733, 637, 639, 1043, 1044, + 659, 476, 1312, 1313, 683, 687, 1010, 695, 704, 1006, + 1337, 1298, 438, 408, 409, 631, 633, 635, 670, 5, + 671, 6, 412, 413, 414, 337, 684, 1340, 1340, 415, + 325, 309, 686, 347, 352, 353, 553, 563, 450, 450, + 450, 553, 1309, 563, 1309, 666, 397, 462, 845, 1314, + 1315, 1309, 548, 548, 548, 548, 873, 604, 469, 580, + 470, 471, 403, 554, 878, 848, 958, 1345, 1346, 577, + 614, 870, 550, 615, 550, 255, 255, 1321, 1321, 1321, + 1321, 550, 999, 1018, 477, 971, 1228, 732, 736, 881, + 869, 1070, 1074, 876, 882, 551, 1008, 1003, 1071, 1075, + 978, 980, 0, 1305, 1118, 0, 456, 0, 0, 0, + 0, 969, 969, 969, 969, 0, 0, 456, 963, 970, + 0, 0, 0, 0, 968, 0, 1230, 0, 0, 0, + 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, + 450, 931, 1123, 450, 0, 1073, 1116, 885, 619, 1307, + 1307, 1073, 1216, 944, 1015, 433, 1217, 1220, 945, 1221, + 0, 433, 872, 0, 664, 994, 0, 1041, 1041, 0, + 866, 0, 0, 0, 665, 1052, 1048, 1049, 0, 0, + 0, 0, 1227, 324, 275, 324, 1037, 1037, 681, 952, + 0, 0, 1029, 1045, 1046, 396, 399, 560, 601, 605, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1013, 1013 + ); + + protected array $gotoCheck = array( + 42, 42, 73, 127, 73, 66, 66, 56, 56, 66, + 9, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 86, 86, 26, 86, 86, 86, 27, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 15, 20, 49, 23, 23, 23, 23, + 108, 108, 43, 97, 108, 130, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 170, 170, 8, 8, 170, + 8, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 8, 8, 6, 8, 83, 76, 76, 15, 12, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 20, + 20, 15, 155, 45, 155, 5, 5, 20, 144, 144, + 155, 15, 15, 15, 15, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 20, 20, 20, 12, 83, + 12, 76, 5, 5, 5, 5, 5, 5, 7, 172, + 73, 7, 73, 25, 25, 25, 25, 73, 73, 73, + 7, 179, 168, 73, 7, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 22, 181, 73, 73, 73, 73, + 9, 9, 9, 9, 73, 168, 168, 118, 118, 73, + 73, 73, 73, 35, 103, 73, 73, 73, 65, 14, + 65, 24, 24, 24, 24, 149, 149, 84, 35, 14, + 14, 35, 62, 73, 149, 84, 104, 73, 93, 93, + 93, 9, 14, 14, 9, 22, 14, 64, 14, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 14, + 150, 171, 171, 14, 14, 171, 114, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 173, 173, 151, 13, + 173, 13, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 48, 116, 182, 182, 48, 48, 48, 119, 119, + 48, 176, 176, 176, 48, 48, 48, 48, 48, 48, + 182, 14, 113, 82, 82, 85, 85, 85, 82, 46, + 82, 46, 82, 82, 82, 29, 82, 182, 182, 82, + 169, 169, 14, 82, 97, 97, 9, 9, 23, 23, + 23, 9, 130, 9, 130, 120, 9, 9, 18, 178, + 178, 130, 107, 107, 107, 107, 39, 107, 9, 9, + 9, 9, 28, 14, 9, 22, 92, 9, 9, 2, + 2, 37, 19, 80, 19, 5, 5, 130, 130, 130, + 130, 19, 50, 110, 157, 50, 160, 50, 99, 16, + 16, 16, 16, 9, 41, 50, 50, 50, 129, 132, + 16, 96, -1, 130, 147, -1, 19, -1, -1, -1, + -1, 19, 19, 19, 19, -1, -1, 19, 19, 19, + -1, -1, -1, -1, 16, -1, 14, -1, -1, -1, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 17, 17, 23, -1, 130, 16, 16, 17, 130, + 130, 130, 79, 79, 17, 117, 79, 79, 79, 79, + -1, 117, 17, -1, 17, 17, -1, 117, 117, -1, + 17, -1, -1, -1, 117, 117, 117, 117, -1, -1, + -1, -1, 17, 24, 24, 24, 89, 89, 89, 89, + -1, -1, 89, 89, 89, 59, 59, 59, 59, 59, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 107, 107 + ); + + protected array $gotoBase = array( + 0, 0, -253, 0, 0, 224, 182, 251, 179, -10, + 0, 0, -89, 32, 11, -185, 27, 66, 128, 197, + -229, 0, 5, 163, 308, 260, 18, 22, 115, 118, + 0, 0, 0, 0, 0, -68, 0, 122, 0, 123, + 0, 43, -1, 153, 0, 200, -327, 0, -330, 147, + 460, 0, 0, 0, 0, 0, -33, 0, 0, 540, + 0, 0, 280, 0, 95, 294, -236, 0, 0, 0, + 0, 0, 0, -5, 0, 0, -140, 0, 0, 134, + 119, -19, -88, -75, -152, -74, -698, 0, 0, 296, + 0, 0, 127, 23, 0, 0, 48, -310, 0, 71, + 0, 0, 0, 269, 283, 0, 0, 414, -71, 0, + 103, 0, 0, 124, 83, 0, 100, 273, 17, 104, + 144, 0, 0, 0, 0, 0, 0, 1, 0, 114, + 167, 0, 47, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -47, 0, 0, 50, 0, 281, + 105, 94, 0, 0, 0, -273, 0, 34, 0, 0, + 107, 0, 0, 0, 0, 0, 0, 0, -26, 99, + -56, 110, 230, 125, 0, 0, 90, 0, 67, 241, + 0, 254, 75, 0, 0 + ); + + protected array $gotoDefault = array( + -32768, 512, 740, 4, 741, 935, 816, 825, 597, 530, + 707, 348, 625, 422, 1303, 911, 1122, 578, 844, 1246, + 1254, 457, 847, 330, 730, 923, 894, 895, 400, 386, + 392, 398, 649, 626, 494, 879, 453, 871, 486, 874, + 452, 883, 164, 418, 510, 887, 3, 890, 557, 921, + 973, 387, 898, 388, 677, 900, 562, 902, 903, 395, + 401, 402, 1127, 570, 622, 915, 256, 564, 916, 385, + 917, 925, 390, 393, 688, 465, 505, 499, 411, 1102, + 565, 608, 646, 447, 473, 620, 632, 618, 480, 434, + 416, 329, 957, 965, 487, 463, 979, 350, 987, 738, + 1135, 640, 489, 995, 641, 1002, 1005, 531, 532, 478, + 1017, 272, 1020, 490, 19, 667, 1031, 1032, 668, 642, + 1054, 643, 669, 644, 1056, 472, 598, 1064, 454, 1072, + 1291, 455, 1076, 266, 1079, 278, 417, 435, 1085, 1086, + 9, 1092, 698, 699, 11, 276, 509, 1117, 689, 451, + 1134, 439, 1204, 1206, 558, 491, 1224, 1223, 680, 506, + 1229, 448, 1294, 449, 533, 474, 316, 534, 1338, 308, + 333, 313, 549, 295, 334, 535, 475, 1300, 1308, 331, + 31, 1328, 1339, 575, 613 + ); + + protected array $ruleToNonTerminal = array( + 0, 1, 3, 3, 2, 5, 5, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, + 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, + 11, 11, 12, 12, 13, 13, 14, 15, 15, 16, + 16, 17, 17, 18, 18, 21, 21, 22, 23, 23, + 24, 24, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 29, 29, 30, 30, 32, 34, 34, + 28, 36, 36, 33, 38, 38, 35, 35, 37, 37, + 39, 39, 31, 40, 40, 41, 43, 44, 44, 45, + 45, 46, 46, 48, 47, 47, 47, 47, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 25, 25, 50, 69, 69, 72, 72, 71, + 70, 70, 63, 75, 75, 76, 76, 77, 77, 78, + 78, 79, 79, 80, 80, 26, 26, 27, 27, 27, + 27, 27, 88, 88, 90, 90, 83, 83, 91, 91, + 92, 92, 92, 84, 84, 87, 87, 85, 85, 93, + 94, 94, 57, 57, 65, 65, 68, 68, 68, 67, + 95, 95, 96, 58, 58, 58, 58, 97, 97, 98, + 98, 99, 99, 100, 101, 101, 102, 102, 103, 103, + 55, 55, 51, 51, 105, 53, 53, 106, 52, 52, + 54, 54, 64, 64, 64, 64, 81, 81, 109, 109, + 111, 111, 112, 112, 112, 112, 110, 110, 110, 114, + 114, 114, 114, 89, 89, 117, 117, 117, 118, 118, + 115, 115, 119, 119, 121, 121, 122, 122, 116, 123, + 123, 120, 124, 124, 124, 124, 113, 113, 82, 82, + 82, 20, 20, 20, 126, 125, 125, 127, 127, 127, + 127, 60, 128, 128, 129, 61, 131, 131, 132, 132, + 133, 133, 86, 134, 134, 134, 134, 134, 134, 134, + 139, 139, 140, 140, 141, 141, 141, 141, 141, 142, + 143, 143, 138, 138, 135, 135, 137, 137, 145, 145, + 144, 144, 144, 144, 144, 144, 144, 136, 146, 146, + 148, 147, 147, 62, 104, 149, 149, 56, 56, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 156, 150, 150, 155, 155, 158, 159, + 159, 160, 161, 162, 162, 162, 162, 19, 19, 73, + 73, 73, 73, 151, 151, 151, 151, 164, 164, 152, + 152, 154, 154, 154, 157, 157, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 171, 171, 171, 108, 173, + 173, 173, 173, 153, 153, 153, 153, 153, 153, 153, + 153, 59, 59, 167, 167, 167, 167, 174, 174, 163, + 163, 163, 175, 175, 175, 175, 175, 175, 74, 74, + 66, 66, 66, 66, 130, 130, 130, 130, 178, 177, + 166, 166, 166, 166, 166, 166, 166, 165, 165, 165, + 176, 176, 176, 176, 107, 172, 180, 180, 179, 179, + 181, 181, 181, 181, 181, 181, 181, 181, 169, 169, + 169, 169, 168, 183, 182, 182, 182, 182, 182, 182, + 182, 182, 184, 184, 184, 184 + ); + + protected array $ruleToLength = array( + 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 1, 1, 2, 1, 3, 4, 1, 2, + 0, 1, 1, 1, 1, 4, 3, 5, 4, 3, + 4, 2, 3, 1, 1, 7, 6, 2, 3, 1, + 2, 3, 1, 2, 3, 1, 1, 3, 1, 3, + 1, 2, 2, 3, 1, 3, 2, 3, 1, 3, + 3, 2, 0, 1, 1, 1, 1, 1, 3, 7, + 10, 5, 7, 9, 5, 3, 3, 3, 3, 3, + 3, 1, 2, 5, 7, 9, 6, 5, 6, 3, + 2, 1, 1, 1, 1, 0, 2, 1, 3, 8, + 0, 4, 2, 1, 3, 0, 1, 0, 1, 0, + 1, 3, 1, 1, 1, 8, 9, 7, 8, 7, + 6, 8, 0, 2, 0, 2, 1, 2, 1, 2, + 1, 1, 1, 0, 2, 0, 2, 0, 2, 2, + 1, 3, 1, 4, 1, 4, 1, 1, 4, 2, + 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, + 3, 1, 1, 7, 0, 2, 1, 3, 3, 4, + 1, 4, 0, 2, 5, 0, 2, 6, 0, 2, + 0, 3, 1, 2, 1, 1, 2, 0, 1, 3, + 0, 2, 1, 1, 1, 1, 6, 8, 6, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, + 3, 1, 1, 2, 1, 1, 0, 1, 0, 2, + 2, 2, 4, 3, 1, 1, 3, 1, 2, 2, + 3, 2, 3, 1, 1, 2, 3, 1, 1, 3, + 2, 0, 1, 5, 5, 6, 10, 3, 5, 1, + 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, + 1, 1, 3, 2, 2, 3, 1, 0, 1, 1, + 3, 3, 3, 4, 4, 1, 1, 2, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, + 3, 4, 4, 2, 2, 4, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 1, 3, 2, + 1, 2, 4, 2, 2, 8, 9, 8, 9, 9, + 10, 9, 10, 8, 3, 2, 0, 4, 2, 1, + 3, 2, 1, 2, 2, 2, 4, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 1, 1, 1, 0, + 3, 0, 1, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 5, 3, 3, 4, + 1, 1, 3, 1, 1, 1, 1, 1, 3, 2, + 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, + 3, 1, 1, 4, 4, 1, 4, 4, 0, 1, + 1, 1, 3, 3, 1, 4, 2, 2, 1, 3, + 1, 4, 4, 3, 3, 3, 3, 1, 3, 1, + 1, 3, 1, 1, 4, 1, 1, 1, 3, 1, + 1, 2, 1, 3, 4, 3, 2, 0, 2, 2, + 1, 2, 1, 1, 1, 4, 3, 3, 3, 3, + 6, 3, 1, 1, 2, 1 + ); + + protected function initReduceCallbacks(): void { + $this->reduceCallbacks = [ + 0 => null, + 1 => function ($stackPos) { + $this->semValue = $this->handleNamespaces($this->semStack[$stackPos-(1-1)]); + }, + 2 => function ($stackPos) { + if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; } $this->semValue = $this->semStack[$stackPos-(2-1)];; + }, + 3 => function ($stackPos) { + $this->semValue = array(); + }, + 4 => function ($stackPos) { + $nop = $this->maybeCreateZeroLengthNop($this->tokenPos);; + if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 5 => null, + 6 => null, + 7 => null, + 8 => null, + 9 => null, + 10 => null, + 11 => null, + 12 => null, + 13 => null, + 14 => null, + 15 => null, + 16 => null, + 17 => null, + 18 => null, + 19 => null, + 20 => null, + 21 => null, + 22 => null, + 23 => null, + 24 => null, + 25 => null, + 26 => null, + 27 => null, + 28 => null, + 29 => null, + 30 => null, + 31 => null, + 32 => null, + 33 => null, + 34 => null, + 35 => null, + 36 => null, + 37 => null, + 38 => null, + 39 => null, + 40 => null, + 41 => null, + 42 => null, + 43 => null, + 44 => null, + 45 => null, + 46 => null, + 47 => null, + 48 => null, + 49 => null, + 50 => null, + 51 => null, + 52 => null, + 53 => null, + 54 => null, + 55 => null, + 56 => null, + 57 => null, + 58 => null, + 59 => null, + 60 => null, + 61 => null, + 62 => null, + 63 => null, + 64 => null, + 65 => null, + 66 => null, + 67 => null, + 68 => null, + 69 => null, + 70 => null, + 71 => null, + 72 => null, + 73 => null, + 74 => null, + 75 => null, + 76 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; if ($this->semValue === "emitError(new Error('Cannot use "getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos]))); + }, + 77 => null, + 78 => null, + 79 => null, + 80 => null, + 81 => null, + 82 => null, + 83 => null, + 84 => null, + 85 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 86 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 87 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 88 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 89 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 90 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 91 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 92 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 93 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 94 => null, + 95 => function ($stackPos) { + $this->semValue = new Name(substr($this->semStack[$stackPos-(1-1)], 1), $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 96 => function ($stackPos) { + $this->semValue = new Expr\Variable(substr($this->semStack[$stackPos-(1-1)], 1), $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 97 => function ($stackPos) { + /* nothing */ + }, + 98 => function ($stackPos) { + /* nothing */ + }, + 99 => function ($stackPos) { + /* nothing */ + }, + 100 => function ($stackPos) { + $this->emitError(new Error('A trailing comma is not allowed here', $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos]))); + }, + 101 => null, + 102 => null, + 103 => function ($stackPos) { + $this->semValue = new Node\Attribute($this->semStack[$stackPos-(1-1)], [], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 104 => function ($stackPos) { + $this->semValue = new Node\Attribute($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 105 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 106 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 107 => function ($stackPos) { + $this->semValue = new Node\AttributeGroup($this->semStack[$stackPos-(4-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 108 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 109 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 110 => function ($stackPos) { + $this->semValue = []; + }, + 111 => null, + 112 => null, + 113 => null, + 114 => null, + 115 => function ($stackPos) { + $this->semValue = new Stmt\HaltCompiler($this->handleHaltCompiler(), $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 116 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(3-2)], null, $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); + $this->checkNamespace($this->semValue); + }, + 117 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $this->checkNamespace($this->semValue); + }, + 118 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $this->checkNamespace($this->semValue); + }, + 119 => function ($stackPos) { + $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 120 => function ($stackPos) { + $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 121 => null, + 122 => function ($stackPos) { + $this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 123 => function ($stackPos) { + $this->semValue = Stmt\Use_::TYPE_FUNCTION; + }, + 124 => function ($stackPos) { + $this->semValue = Stmt\Use_::TYPE_CONSTANT; + }, + 125 => function ($stackPos) { + $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->semStack[$stackPos-(7-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(7-1)], $this->tokenEndStack[$stackPos])); + }, + 126 => function ($stackPos) { + $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], Stmt\Use_::TYPE_UNKNOWN, $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos])); + }, + 127 => null, + 128 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 129 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 130 => null, + 131 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 132 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 133 => null, + 134 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 135 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 136 => function ($stackPos) { + $this->semValue = new Node\UseItem($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); $this->checkUseUse($this->semValue, $stackPos-(1-1)); + }, + 137 => function ($stackPos) { + $this->semValue = new Node\UseItem($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); $this->checkUseUse($this->semValue, $stackPos-(3-3)); + }, + 138 => function ($stackPos) { + $this->semValue = new Node\UseItem($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); $this->checkUseUse($this->semValue, $stackPos-(1-1)); + }, + 139 => function ($stackPos) { + $this->semValue = new Node\UseItem($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); $this->checkUseUse($this->semValue, $stackPos-(3-3)); + }, + 140 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL; + }, + 141 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; $this->semValue->type = $this->semStack[$stackPos-(2-1)]; + }, + 142 => null, + 143 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 144 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 145 => function ($stackPos) { + $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 146 => null, + 147 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 148 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 149 => function ($stackPos) { + $this->semValue = new Node\Const_(new Node\Identifier($this->semStack[$stackPos-(3-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos-(3-1)])), $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 150 => function ($stackPos) { + $this->semValue = new Node\Const_(new Node\Identifier($this->semStack[$stackPos-(3-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos-(3-1)])), $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 151 => function ($stackPos) { + if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; } $this->semValue = $this->semStack[$stackPos-(2-1)];; + }, + 152 => function ($stackPos) { + $this->semValue = array(); + }, + 153 => function ($stackPos) { + $nop = $this->maybeCreateZeroLengthNop($this->tokenPos);; + if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 154 => null, + 155 => null, + 156 => null, + 157 => function ($stackPos) { + throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 158 => function ($stackPos) { + $this->semValue = new Stmt\Block($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 159 => function ($stackPos) { + $this->semValue = new Stmt\If_($this->semStack[$stackPos-(7-3)], ['stmts' => $this->semStack[$stackPos-(7-5)], 'elseifs' => $this->semStack[$stackPos-(7-6)], 'else' => $this->semStack[$stackPos-(7-7)]], $this->getAttributes($this->tokenStartStack[$stackPos-(7-1)], $this->tokenEndStack[$stackPos])); + }, + 160 => function ($stackPos) { + $this->semValue = new Stmt\If_($this->semStack[$stackPos-(10-3)], ['stmts' => $this->semStack[$stackPos-(10-6)], 'elseifs' => $this->semStack[$stackPos-(10-7)], 'else' => $this->semStack[$stackPos-(10-8)]], $this->getAttributes($this->tokenStartStack[$stackPos-(10-1)], $this->tokenEndStack[$stackPos])); + }, + 161 => function ($stackPos) { + $this->semValue = new Stmt\While_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); + }, + 162 => function ($stackPos) { + $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(7-5)], $this->semStack[$stackPos-(7-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(7-1)], $this->tokenEndStack[$stackPos])); + }, + 163 => function ($stackPos) { + $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->getAttributes($this->tokenStartStack[$stackPos-(9-1)], $this->tokenEndStack[$stackPos])); + }, + 164 => function ($stackPos) { + $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); + }, + 165 => function ($stackPos) { + $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 166 => function ($stackPos) { + $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 167 => function ($stackPos) { + $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 168 => function ($stackPos) { + $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 169 => function ($stackPos) { + $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 170 => function ($stackPos) { + $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 171 => function ($stackPos) { + + $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + $this->semValue->setAttribute('hasLeadingNewline', $this->inlineHtmlHasLeadingNewline($stackPos-(1-1))); + + }, + 172 => function ($stackPos) { + $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 173 => function ($stackPos) { + $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); + }, + 174 => function ($stackPos) { + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->getAttributes($this->tokenStartStack[$stackPos-(7-1)], $this->tokenEndStack[$stackPos])); + }, + 175 => function ($stackPos) { + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->getAttributes($this->tokenStartStack[$stackPos-(9-1)], $this->tokenEndStack[$stackPos])); + }, + 176 => function ($stackPos) { + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(6-3)], new Expr\Error($this->getAttributes($this->tokenStartStack[$stackPos-(6-4)], $this->tokenEndStack[$stackPos-(6-4)])), ['stmts' => $this->semStack[$stackPos-(6-6)]], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos])); + }, + 177 => function ($stackPos) { + $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); + }, + 178 => function ($stackPos) { + $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos])); $this->checkTryCatch($this->semValue); + }, + 179 => function ($stackPos) { + $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 180 => function ($stackPos) { + $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 181 => function ($stackPos) { + $this->semValue = null; /* means: no statement */ + }, + 182 => null, + 183 => function ($stackPos) { + $this->semValue = $this->maybeCreateNop($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos]); + }, + 184 => function ($stackPos) { + if ($this->semStack[$stackPos-(1-1)] instanceof Stmt\Block) { $this->semValue = $this->semStack[$stackPos-(1-1)]->stmts; } else if ($this->semStack[$stackPos-(1-1)] === null) { $this->semValue = []; } else { $this->semValue = [$this->semStack[$stackPos-(1-1)]]; }; + }, + 185 => function ($stackPos) { + $this->semValue = array(); + }, + 186 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 187 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 188 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 189 => function ($stackPos) { + $this->semValue = new Stmt\Catch_($this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos])); + }, + 190 => function ($stackPos) { + $this->semValue = null; + }, + 191 => function ($stackPos) { + $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 192 => null, + 193 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 194 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 195 => function ($stackPos) { + $this->semValue = false; + }, + 196 => function ($stackPos) { + $this->semValue = true; + }, + 197 => function ($stackPos) { + $this->semValue = false; + }, + 198 => function ($stackPos) { + $this->semValue = true; + }, + 199 => function ($stackPos) { + $this->semValue = false; + }, + 200 => function ($stackPos) { + $this->semValue = true; + }, + 201 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 202 => function ($stackPos) { + $this->semValue = []; + }, + 203 => null, + 204 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 205 => function ($stackPos) { + $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(8-3)], ['byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-5)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos])); + }, + 206 => function ($stackPos) { + $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(9-4)], ['byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(9-1)], $this->tokenEndStack[$stackPos])); + }, + 207 => function ($stackPos) { + $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(7-2)], ['type' => $this->semStack[$stackPos-(7-1)], 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => []], $this->getAttributes($this->tokenStartStack[$stackPos-(7-1)], $this->tokenEndStack[$stackPos])); + $this->checkClass($this->semValue, $stackPos-(7-2)); + }, + 208 => function ($stackPos) { + $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(8-3)], ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos])); + $this->checkClass($this->semValue, $stackPos-(8-3)); + }, + 209 => function ($stackPos) { + $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(7-3)], ['extends' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => $this->semStack[$stackPos-(7-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(7-1)], $this->tokenEndStack[$stackPos])); + $this->checkInterface($this->semValue, $stackPos-(7-3)); + }, + 210 => function ($stackPos) { + $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(6-3)], ['stmts' => $this->semStack[$stackPos-(6-5)], 'attrGroups' => $this->semStack[$stackPos-(6-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos])); + }, + 211 => function ($stackPos) { + $this->semValue = new Stmt\Enum_($this->semStack[$stackPos-(8-3)], ['scalarType' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos])); + $this->checkEnum($this->semValue, $stackPos-(8-3)); + }, + 212 => function ($stackPos) { + $this->semValue = null; + }, + 213 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 214 => function ($stackPos) { + $this->semValue = null; + }, + 215 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 216 => function ($stackPos) { + $this->semValue = 0; + }, + 217 => null, + 218 => null, + 219 => function ($stackPos) { + $this->checkClassModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; + }, + 220 => function ($stackPos) { + $this->semValue = Modifiers::ABSTRACT; + }, + 221 => function ($stackPos) { + $this->semValue = Modifiers::FINAL; + }, + 222 => function ($stackPos) { + $this->semValue = Modifiers::READONLY; + }, + 223 => function ($stackPos) { + $this->semValue = null; + }, + 224 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 225 => function ($stackPos) { + $this->semValue = array(); + }, + 226 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 227 => function ($stackPos) { + $this->semValue = array(); + }, + 228 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 229 => null, + 230 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 231 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 232 => null, + 233 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 234 => null, + 235 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 236 => function ($stackPos) { + if ($this->semStack[$stackPos-(1-1)] instanceof Stmt\Block) { $this->semValue = $this->semStack[$stackPos-(1-1)]->stmts; } else if ($this->semStack[$stackPos-(1-1)] === null) { $this->semValue = []; } else { $this->semValue = [$this->semStack[$stackPos-(1-1)]]; }; + }, + 237 => function ($stackPos) { + $this->semValue = null; + }, + 238 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 239 => null, + 240 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 241 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 242 => function ($stackPos) { + $this->semValue = new Node\DeclareItem($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 243 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 244 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-3)]; + }, + 245 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 246 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(5-3)]; + }, + 247 => function ($stackPos) { + $this->semValue = array(); + }, + 248 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 249 => function ($stackPos) { + $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 250 => function ($stackPos) { + $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 251 => null, + 252 => null, + 253 => function ($stackPos) { + $this->semValue = new Expr\Match_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->getAttributes($this->tokenStartStack[$stackPos-(7-1)], $this->tokenEndStack[$stackPos])); + }, + 254 => function ($stackPos) { + $this->semValue = []; + }, + 255 => null, + 256 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 257 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 258 => function ($stackPos) { + $this->semValue = new Node\MatchArm($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 259 => function ($stackPos) { + $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 260 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 261 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 262 => function ($stackPos) { + $this->semValue = array(); + }, + 263 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 264 => function ($stackPos) { + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); + }, + 265 => function ($stackPos) { + $this->semValue = array(); + }, + 266 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 267 => function ($stackPos) { + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-6)], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos])); $this->fixupAlternativeElse($this->semValue); + }, + 268 => function ($stackPos) { + $this->semValue = null; + }, + 269 => function ($stackPos) { + $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 270 => function ($stackPos) { + $this->semValue = null; + }, + 271 => function ($stackPos) { + $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); $this->fixupAlternativeElse($this->semValue); + }, + 272 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)], false); + }, + 273 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(2-2)], true); + }, + 274 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)], false); + }, + 275 => function ($stackPos) { + $this->semValue = array($this->fixupArrayDestructuring($this->semStack[$stackPos-(1-1)]), false); + }, + 276 => null, + 277 => function ($stackPos) { + $this->semValue = array(); + }, + 278 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 279 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 280 => function ($stackPos) { + $this->semValue = 0; + }, + 281 => function ($stackPos) { + $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; + }, + 282 => function ($stackPos) { + $this->semValue = Modifiers::PUBLIC; + }, + 283 => function ($stackPos) { + $this->semValue = Modifiers::PROTECTED; + }, + 284 => function ($stackPos) { + $this->semValue = Modifiers::PRIVATE; + }, + 285 => function ($stackPos) { + $this->semValue = Modifiers::READONLY; + }, + 286 => function ($stackPos) { + $this->semValue = new Node\Param($this->semStack[$stackPos-(6-6)], null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos]), $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); + $this->checkParam($this->semValue); + }, + 287 => function ($stackPos) { + $this->semValue = new Node\Param($this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-8)], $this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos]), $this->semStack[$stackPos-(8-2)], $this->semStack[$stackPos-(8-1)]); + $this->checkParam($this->semValue); + }, + 288 => function ($stackPos) { + $this->semValue = new Node\Param(new Expr\Error($this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos])), null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos]), $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); + }, + 289 => null, + 290 => function ($stackPos) { + $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 291 => function ($stackPos) { + $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 292 => null, + 293 => null, + 294 => function ($stackPos) { + $this->semValue = new Node\Name('static', $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 295 => function ($stackPos) { + $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos-(1-1)]); + }, + 296 => function ($stackPos) { + $this->semValue = new Node\Identifier('array', $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 297 => function ($stackPos) { + $this->semValue = new Node\Identifier('callable', $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 298 => null, + 299 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 300 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + }, + 301 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 302 => null, + 303 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 304 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + }, + 305 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 306 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + }, + 307 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 308 => function ($stackPos) { + $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 309 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + }, + 310 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 311 => function ($stackPos) { + $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 312 => null, + 313 => function ($stackPos) { + $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 314 => function ($stackPos) { + $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 315 => null, + 316 => function ($stackPos) { + $this->semValue = null; + }, + 317 => null, + 318 => function ($stackPos) { + $this->semValue = null; + }, + 319 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-2)]; + }, + 320 => function ($stackPos) { + $this->semValue = null; + }, + 321 => function ($stackPos) { + $this->semValue = array(); + }, + 322 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 323 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(3-2)]); + }, + 324 => function ($stackPos) { + $this->semValue = new Node\VariadicPlaceholder($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 325 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 326 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 327 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 328 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 329 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 330 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos-(3-3)], false, false, $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos]), $this->semStack[$stackPos-(3-1)]); + }, + 331 => null, + 332 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 333 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 334 => null, + 335 => null, + 336 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 337 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 338 => function ($stackPos) { + $this->semValue = new Node\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 339 => function ($stackPos) { + $this->semValue = new Node\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 340 => function ($stackPos) { + if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } else { $this->semValue = $this->semStack[$stackPos-(2-1)]; } + }, + 341 => function ($stackPos) { + $this->semValue = array(); + }, + 342 => function ($stackPos) { + $nop = $this->maybeCreateZeroLengthNop($this->tokenPos);; + if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 343 => function ($stackPos) { + $this->semValue = new Stmt\Property($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos]), $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-1)]); + $this->checkProperty($this->semValue, $stackPos-(5-2)); + }, + 344 => function ($stackPos) { + $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos]), $this->semStack[$stackPos-(5-1)]); + $this->checkClassConst($this->semValue, $stackPos-(5-2)); + }, + 345 => function ($stackPos) { + $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos]), $this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-4)]); + $this->checkClassConst($this->semValue, $stackPos-(6-2)); + }, + 346 => function ($stackPos) { + $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(10-5)], ['type' => $this->semStack[$stackPos-(10-2)], 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-7)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(10-1)], $this->tokenEndStack[$stackPos])); + $this->checkClassMethod($this->semValue, $stackPos-(10-2)); + }, + 347 => function ($stackPos) { + $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 348 => function ($stackPos) { + $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); + }, + 349 => function ($stackPos) { + $this->semValue = null; /* will be skipped */ + }, + 350 => function ($stackPos) { + $this->semValue = array(); + }, + 351 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 352 => function ($stackPos) { + $this->semValue = array(); + }, + 353 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 354 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 355 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); + }, + 356 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 357 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 358 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 359 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + }, + 360 => null, + 361 => function ($stackPos) { + $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); + }, + 362 => function ($stackPos) { + $this->semValue = null; + }, + 363 => null, + 364 => null, + 365 => function ($stackPos) { + $this->semValue = 0; + }, + 366 => function ($stackPos) { + $this->semValue = 0; + }, + 367 => null, + 368 => null, + 369 => function ($stackPos) { + $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; + }, + 370 => function ($stackPos) { + $this->semValue = Modifiers::PUBLIC; + }, + 371 => function ($stackPos) { + $this->semValue = Modifiers::PROTECTED; + }, + 372 => function ($stackPos) { + $this->semValue = Modifiers::PRIVATE; + }, + 373 => function ($stackPos) { + $this->semValue = Modifiers::STATIC; + }, + 374 => function ($stackPos) { + $this->semValue = Modifiers::ABSTRACT; + }, + 375 => function ($stackPos) { + $this->semValue = Modifiers::FINAL; + }, + 376 => function ($stackPos) { + $this->semValue = Modifiers::READONLY; + }, + 377 => null, + 378 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 379 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 380 => function ($stackPos) { + $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 381 => function ($stackPos) { + $this->semValue = new Node\PropertyItem($this->semStack[$stackPos-(1-1)], null, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 382 => function ($stackPos) { + $this->semValue = new Node\PropertyItem($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 383 => null, + 384 => null, + 385 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 386 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 387 => function ($stackPos) { + $this->semValue = array(); + }, + 388 => null, + 389 => null, + 390 => function ($stackPos) { + $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 391 => function ($stackPos) { + $this->semValue = new Expr\Assign($this->fixupArrayDestructuring($this->semStack[$stackPos-(3-1)]), $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 392 => function ($stackPos) { + $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 393 => function ($stackPos) { + $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 394 => function ($stackPos) { + $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + if (!$this->phpVersion->allowsAssignNewByReference()) { + $this->emitError(new Error('Cannot assign new by reference', $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos]))); + } + + }, + 395 => null, + 396 => null, + 397 => function ($stackPos) { + $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 398 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 399 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 400 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 401 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 402 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 403 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 404 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 405 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 406 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 407 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 408 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 409 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 410 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 411 => function ($stackPos) { + $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 412 => function ($stackPos) { + $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 413 => function ($stackPos) { + $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 414 => function ($stackPos) { + $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 415 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 416 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 417 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 418 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 419 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 420 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 421 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 422 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 423 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 424 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 425 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 426 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 427 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 428 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 429 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 430 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 431 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 432 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 433 => function ($stackPos) { + $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 434 => function ($stackPos) { + $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 435 => function ($stackPos) { + $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 436 => function ($stackPos) { + $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 437 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 438 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 439 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 440 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 441 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 442 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 443 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 444 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 445 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 446 => function ($stackPos) { + $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 447 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 448 => function ($stackPos) { + $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); + }, + 449 => function ($stackPos) { + $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 450 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 451 => function ($stackPos) { + $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 452 => function ($stackPos) { + $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 453 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 454 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 455 => function ($stackPos) { + $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 456 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 457 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 458 => function ($stackPos) { + $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 459 => function ($stackPos) { + $attrs = $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos]); + $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]); + $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs); + }, + 460 => function ($stackPos) { + $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 461 => function ($stackPos) { + $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 462 => function ($stackPos) { + $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 463 => function ($stackPos) { + $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 464 => function ($stackPos) { + $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 465 => function ($stackPos) { + $attrs = $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos]); + $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; + $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs); + }, + 466 => function ($stackPos) { + $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 467 => null, + 468 => function ($stackPos) { + $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 469 => function ($stackPos) { + $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 470 => function ($stackPos) { + $this->semValue = new Expr\Yield_(null, null, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 471 => function ($stackPos) { + $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 472 => function ($stackPos) { + $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 473 => function ($stackPos) { + $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 474 => function ($stackPos) { + $this->semValue = new Expr\Throw_($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 475 => function ($stackPos) { + $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'returnType' => $this->semStack[$stackPos-(8-6)], 'expr' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos])); + }, + 476 => function ($stackPos) { + $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->getAttributes($this->tokenStartStack[$stackPos-(9-1)], $this->tokenEndStack[$stackPos])); + }, + 477 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'uses' => $this->semStack[$stackPos-(8-6)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos])); + }, + 478 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->getAttributes($this->tokenStartStack[$stackPos-(9-1)], $this->tokenEndStack[$stackPos])); + }, + 479 => function ($stackPos) { + $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(9-1)], $this->tokenEndStack[$stackPos])); + }, + 480 => function ($stackPos) { + $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-8)], 'expr' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(10-1)], $this->tokenEndStack[$stackPos])); + }, + 481 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(9-1)], $this->tokenEndStack[$stackPos])); + }, + 482 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'uses' => $this->semStack[$stackPos-(10-8)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(10-1)], $this->tokenEndStack[$stackPos])); + }, + 483 => function ($stackPos) { + $this->semValue = array(new Stmt\Class_(null, ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->getAttributes($this->tokenStartStack[$stackPos-(8-1)], $this->tokenEndStack[$stackPos])), $this->semStack[$stackPos-(8-3)]); + $this->checkClass($this->semValue[0], -1); + }, + 484 => function ($stackPos) { + $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 485 => function ($stackPos) { + list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 486 => function ($stackPos) { + $this->semValue = array(); + }, + 487 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-3)]; + }, + 488 => null, + 489 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 490 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 491 => function ($stackPos) { + $this->semValue = new Node\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 492 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 493 => function ($stackPos) { + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 494 => function ($stackPos) { + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 495 => function ($stackPos) { + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 496 => function ($stackPos) { + $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 497 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 498 => null, + 499 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 500 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 501 => function ($stackPos) { + $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 502 => function ($stackPos) { + $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 503 => null, + 504 => null, + 505 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 506 => function ($stackPos) { + $this->semValue = new Expr\Error($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); $this->errorState = 2; + }, + 507 => null, + 508 => null, + 509 => function ($stackPos) { + $this->semValue = null; + }, + 510 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 511 => function ($stackPos) { + $this->semValue = array(); + }, + 512 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); foreach ($this->semValue as $s) { if ($s instanceof Node\InterpolatedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', $this->phpVersion->supportsUnicodeEscapes()); } }; + }, + 513 => function ($stackPos) { + foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\InterpolatedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', $this->phpVersion->supportsUnicodeEscapes()); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 514 => function ($stackPos) { + $this->semValue = array(); + }, + 515 => null, + 516 => function ($stackPos) { + $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 517 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Line($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 518 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\File($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 519 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Dir($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 520 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Class_($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 521 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Trait_($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 522 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Method($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 523 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Function_($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 524 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Namespace_($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 525 => function ($stackPos) { + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 526 => function ($stackPos) { + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(5-1)], $this->tokenEndStack[$stackPos])); + }, + 527 => function ($stackPos) { + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], new Expr\Error($this->getAttributes($this->tokenStartStack[$stackPos-(3-3)], $this->tokenEndStack[$stackPos-(3-3)])), $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); $this->errorState = 2; + }, + 528 => function ($stackPos) { + $attrs = $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos]); $attrs['kind'] = Expr\Array_::KIND_SHORT; + $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); + }, + 529 => function ($stackPos) { + $attrs = $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos]); $attrs['kind'] = Expr\Array_::KIND_LONG; + $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); + $this->createdArrays->attach($this->semValue); + }, + 530 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->createdArrays->attach($this->semValue); + }, + 531 => function ($stackPos) { + $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos]), $this->phpVersion->supportsUnicodeEscapes()); + }, + 532 => function ($stackPos) { + $attrs = $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos]); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; + foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\InterpolatedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', $this->phpVersion->supportsUnicodeEscapes()); } }; $this->semValue = new Scalar\InterpolatedString($this->semStack[$stackPos-(3-2)], $attrs); + }, + 533 => function ($stackPos) { + $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos]), $this->phpVersion->allowsInvalidOctals()); + }, + 534 => function ($stackPos) { + $this->semValue = Scalar\Float_::fromString($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 535 => null, + 536 => null, + 537 => null, + 538 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos]), $this->getAttributes($this->tokenStartStack[$stackPos-(3-3)], $this->tokenEndStack[$stackPos-(3-3)]), true); + }, + 539 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos]), $this->getAttributes($this->tokenStartStack[$stackPos-(2-2)], $this->tokenEndStack[$stackPos-(2-2)]), true); + }, + 540 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos]), $this->getAttributes($this->tokenStartStack[$stackPos-(3-3)], $this->tokenEndStack[$stackPos-(3-3)]), true); + }, + 541 => function ($stackPos) { + $this->semValue = null; + }, + 542 => null, + 543 => null, + 544 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 545 => null, + 546 => null, + 547 => null, + 548 => null, + 549 => null, + 550 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 551 => null, + 552 => null, + 553 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 554 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 555 => null, + 556 => function ($stackPos) { + $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 557 => function ($stackPos) { + $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 558 => function ($stackPos) { + $this->semValue = null; + }, + 559 => null, + 560 => null, + 561 => null, + 562 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 563 => function ($stackPos) { + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 564 => null, + 565 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 566 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 567 => function ($stackPos) { + $this->semValue = new Expr\Variable(new Expr\Error($this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])), $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); $this->errorState = 2; + }, + 568 => function ($stackPos) { + $var = $this->semStack[$stackPos-(1-1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])) : $var; + }, + 569 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 570 => null, + 571 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 572 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 573 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 574 => function ($stackPos) { + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 575 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 576 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 577 => null, + 578 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 579 => null, + 580 => null, + 581 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 582 => null, + 583 => function ($stackPos) { + $this->semValue = new Expr\Error($this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); $this->errorState = 2; + }, + 584 => function ($stackPos) { + $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); $this->semValue->setAttribute('kind', Expr\List_::KIND_LIST); + $this->postprocessList($this->semValue); + }, + 585 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; $end = count($this->semValue)-1; if ($this->semValue[$end]->value instanceof Expr\Error) array_pop($this->semValue); + }, + 586 => null, + 587 => function ($stackPos) { + /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ + }, + 588 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 589 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 590 => function ($stackPos) { + $this->semValue = new Node\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 591 => function ($stackPos) { + $this->semValue = new Node\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 592 => function ($stackPos) { + $this->semValue = new Node\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 593 => function ($stackPos) { + $this->semValue = new Node\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 594 => function ($stackPos) { + $this->semValue = new Node\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 595 => function ($stackPos) { + $this->semValue = new Node\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 596 => function ($stackPos) { + $this->semValue = new Node\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos]), true); + }, + 597 => function ($stackPos) { + /* Create an Error node now to remember the position. We'll later either report an error, + or convert this into a null element, depending on whether this is a creation or destructuring context. */ + $attrs = $this->createEmptyElemAttributes($this->tokenPos); + $this->semValue = new Node\ArrayItem(new Expr\Error($attrs), null, false, $attrs); + }, + 598 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 599 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 600 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 601 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); + }, + 602 => function ($stackPos) { + $attrs = $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos]); $attrs['rawValue'] = $this->semStack[$stackPos-(1-1)]; $this->semValue = new Node\InterpolatedStringPart($this->semStack[$stackPos-(1-1)], $attrs); + }, + 603 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 604 => null, + 605 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(4-1)], $this->tokenEndStack[$stackPos])); + }, + 606 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 607 => function ($stackPos) { + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 608 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 609 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(3-1)], $this->tokenEndStack[$stackPos])); + }, + 610 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->getAttributes($this->tokenStartStack[$stackPos-(6-1)], $this->tokenEndStack[$stackPos])); + }, + 611 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 612 => function ($stackPos) { + $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 613 => function ($stackPos) { + $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->getAttributes($this->tokenStartStack[$stackPos-(1-1)], $this->tokenEndStack[$stackPos])); + }, + 614 => function ($stackPos) { + $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos-(2-2)], $this->getAttributes($this->tokenStartStack[$stackPos-(2-1)], $this->tokenEndStack[$stackPos])); + }, + 615 => null, + ]; + } +} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php deleted file mode 100644 index b76a5d94..00000000 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php +++ /dev/null @@ -1,148 +0,0 @@ - Map of PHP token IDs to drop */ + protected array $dropTokens; + /** @var int[] Map of external symbols (static::T_*) to internal symbols */ + protected array $tokenToSymbol; /** @var string[] Map of symbols to their names */ - protected $symbolToName; - /** @var array Names of the production rules (only necessary for debugging) */ - protected $productions; + protected array $symbolToName; + /** @var array Names of the production rules (only necessary for debugging) */ + protected array $productions; /** @var int[] Map of states to a displacement into the $action table. The corresponding action for this * state/symbol pair is $action[$actionBase[$state] + $symbol]. If $actionBase[$state] is 0, the * action is defaulted, i.e. $actionDefault[$state] should be used instead. */ - protected $actionBase; + protected array $actionBase; /** @var int[] Table of actions. Indexed according to $actionBase comment. */ - protected $action; + protected array $action; /** @var int[] Table indexed analogously to $action. If $actionCheck[$actionBase[$state] + $symbol] != $symbol * then the action is defaulted, i.e. $actionDefault[$state] should be used instead. */ - protected $actionCheck; + protected array $actionCheck; /** @var int[] Map of states to their default action */ - protected $actionDefault; + protected array $actionDefault; /** @var callable[] Semantic action callbacks */ - protected $reduceCallbacks; + protected array $reduceCallbacks; /** @var int[] Map of non-terminals to a displacement into the $goto table. The corresponding goto state for this * non-terminal/state pair is $goto[$gotoBase[$nonTerminal] + $state] (unless defaulted) */ - protected $gotoBase; + protected array $gotoBase; /** @var int[] Table of states to goto after reduction. Indexed according to $gotoBase comment. */ - protected $goto; + protected array $goto; /** @var int[] Table indexed analogously to $goto. If $gotoCheck[$gotoBase[$nonTerminal] + $state] != $nonTerminal * then the goto state is defaulted, i.e. $gotoDefault[$nonTerminal] should be used. */ - protected $gotoCheck; + protected array $gotoCheck; /** @var int[] Map of non-terminals to the default state to goto after their reduction */ - protected $gotoDefault; + protected array $gotoDefault; /** @var int[] Map of rules to the non-terminal on their left-hand side, i.e. the non-terminal to use for * determining the state to goto after reduction. */ - protected $ruleToNonTerminal; + protected array $ruleToNonTerminal; /** @var int[] Map of rules to the length of their right-hand side, which is the number of elements that have to * be popped from the stack(s) on reduction. */ - protected $ruleToLength; + protected array $ruleToLength; /* * The following members are part of the parser state: */ - /** @var Lexer Lexer that is used when parsing */ - protected $lexer; /** @var mixed Temporary value containing the result of last semantic action (reduction) */ protected $semValue; - /** @var array Semantic value stack (contains values of tokens and semantic action results) */ - protected $semStack; - /** @var array[] Start attribute stack */ - protected $startAttributeStack; - /** @var array[] End attribute stack */ - protected $endAttributeStack; - /** @var array End attributes of last *shifted* token */ - protected $endAttributes; - /** @var array Start attributes of last *read* token */ - protected $lookaheadStartAttributes; + /** @var mixed[] Semantic value stack (contains values of tokens and semantic action results) */ + protected array $semStack; + /** @var int[] Token start position stack */ + protected array $tokenStartStack; + /** @var int[] Token end position stack */ + protected array $tokenEndStack; /** @var ErrorHandler Error handler */ - protected $errorHandler; + protected ErrorHandler $errorHandler; /** @var int Error state, used to avoid error floods */ - protected $errorState; + protected int $errorState; + + /** @var \SplObjectStorage|null Array nodes created during parsing, for postprocessing of empty elements. */ + protected ?\SplObjectStorage $createdArrays; + + /** @var Token[] Tokens for the current parse */ + protected array $tokens; + /** @var int Current position in token array */ + protected int $tokenPos; /** * Initialize $reduceCallbacks map. */ - abstract protected function initReduceCallbacks(); + abstract protected function initReduceCallbacks(): void; /** * Creates a parser instance. * - * Options: Currently none. + * Options: + * * phpVersion: ?PhpVersion, * * @param Lexer $lexer A lexer - * @param array $options Options array. + * @param PhpVersion $phpVersion PHP version to target, defaults to latest supported. This + * option is best-effort: Even if specified, parsing will generally assume the latest + * supported version and only adjust behavior in minor ways, for example by omitting + * errors in older versions and interpreting type hints as a name or identifier depending + * on version. */ - public function __construct(Lexer $lexer, array $options = []) { + public function __construct(Lexer $lexer, ?PhpVersion $phpVersion = null) { $this->lexer = $lexer; - - if (isset($options['throwOnError'])) { - throw new \LogicException( - '"throwOnError" is no longer supported, use "errorHandler" instead'); - } + $this->phpVersion = $phpVersion ?? PhpVersion::getNewestSupported(); $this->initReduceCallbacks(); + $this->phpTokenToSymbol = $this->createTokenMap(); + $this->dropTokens = array_fill_keys( + [\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT, \T_BAD_CHARACTER], true + ); } /** @@ -155,36 +175,55 @@ abstract class ParserAbstract implements Parser * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and * the parser was unable to recover from an error). */ - public function parse(string $code, ErrorHandler $errorHandler = null) { - $this->errorHandler = $errorHandler ?: new ErrorHandler\Throwing; + public function parse(string $code, ?ErrorHandler $errorHandler = null): ?array { + $this->errorHandler = $errorHandler ?: new ErrorHandler\Throwing(); + $this->createdArrays = new \SplObjectStorage(); - $this->lexer->startLexing($code, $this->errorHandler); + $this->tokens = $this->lexer->tokenize($code, $this->errorHandler); $result = $this->doParse(); + // Report errors for any empty elements used inside arrays. This is delayed until after the main parse, + // because we don't know a priori whether a given array expression will be used in a destructuring context + // or not. + foreach ($this->createdArrays as $node) { + foreach ($node->items as $item) { + if ($item->value instanceof Expr\Error) { + $this->errorHandler->handleError( + new Error('Cannot use empty array elements in arrays', $item->getAttributes())); + } + } + } + // Clear out some of the interior state, so we don't hold onto unnecessary // memory between uses of the parser - $this->startAttributeStack = []; - $this->endAttributeStack = []; + $this->tokenStartStack = []; + $this->tokenEndStack = []; $this->semStack = []; $this->semValue = null; + $this->createdArrays = null; + + if ($result !== null) { + $traverser = new NodeTraverser(new CommentAnnotatingVisitor($this->tokens)); + $traverser->traverse($result); + } return $result; } - protected function doParse() { + public function getTokens(): array { + return $this->tokens; + } + + /** @return Stmt[]|null */ + protected function doParse(): ?array { // We start off with no lookahead-token $symbol = self::SYMBOL_NONE; - - // The attributes for a node are taken from the first and last token of the node. - // From the first token only the startAttributes are taken and from the last only - // the endAttributes. Both are merged using the array union operator (+). - $startAttributes = []; - $endAttributes = []; - $this->endAttributes = $endAttributes; + $tokenValue = null; + $this->tokenPos = -1; // Keep stack of start and end attributes - $this->startAttributeStack = []; - $this->endAttributeStack = [$endAttributes]; + $this->tokenStartStack = []; + $this->tokenEndStack = [0]; // Start off in the initial state and keep a stack of previous states $state = 0; @@ -205,26 +244,20 @@ abstract class ParserAbstract implements Parser $rule = $this->actionDefault[$state]; } else { if ($symbol === self::SYMBOL_NONE) { - // Fetch the next token id from the lexer and fetch additional info by-ref. - // The end attributes are fetched into a temporary variable and only set once the token is really - // shifted (not during read). Otherwise you would sometimes get off-by-one errors, when a rule is - // reduced after a token was read but not yet shifted. - $tokenId = $this->lexer->getNextToken($tokenValue, $startAttributes, $endAttributes); - - // map the lexer token id to the internally used symbols - $symbol = $tokenId >= 0 && $tokenId < $this->tokenToSymbolMapSize - ? $this->tokenToSymbol[$tokenId] - : $this->invalidSymbol; - - if ($symbol === $this->invalidSymbol) { + do { + $token = $this->tokens[++$this->tokenPos]; + $tokenId = $token->id; + } while (isset($this->dropTokens[$tokenId])); + + // Map the lexer token id to the internally used symbols. + $tokenValue = $token->text; + if (!isset($this->phpTokenToSymbol[$tokenId])) { throw new \RangeException(sprintf( 'The lexer returned an invalid token (id=%d, value=%s)', $tokenId, $tokenValue )); } - - // Allow productions to access the start attributes of the lookahead token. - $this->lookaheadStartAttributes = $startAttributes; + $symbol = $this->phpTokenToSymbol[$tokenId]; //$this->traceRead($symbol); } @@ -249,9 +282,8 @@ abstract class ParserAbstract implements Parser ++$stackPos; $stateStack[$stackPos] = $state = $action; $this->semStack[$stackPos] = $tokenValue; - $this->startAttributeStack[$stackPos] = $startAttributes; - $this->endAttributeStack[$stackPos] = $endAttributes; - $this->endAttributes = $endAttributes; + $this->tokenStartStack[$stackPos] = $this->tokenPos; + $this->tokenEndStack[$stackPos] = $this->tokenPos; $symbol = self::SYMBOL_NONE; if ($this->errorState) { @@ -277,15 +309,22 @@ abstract class ParserAbstract implements Parser /* accept */ //$this->traceAccept(); return $this->semValue; - } elseif ($rule !== $this->unexpectedTokenRule) { + } + if ($rule !== $this->unexpectedTokenRule) { /* reduce */ //$this->traceReduce($rule); + $ruleLength = $this->ruleToLength[$rule]; try { - $this->reduceCallbacks[$rule]($stackPos); + $callback = $this->reduceCallbacks[$rule]; + if ($callback !== null) { + $callback($stackPos); + } elseif ($ruleLength > 0) { + $this->semValue = $this->semStack[$stackPos - $ruleLength + 1]; + } } catch (Error $e) { - if (-1 === $e->getStartLine() && isset($startAttributes['startLine'])) { - $e->setStartLine($startAttributes['startLine']); + if (-1 === $e->getStartLine()) { + $e->setStartLine($this->tokens[$this->tokenPos]->line); } $this->emitError($e); @@ -294,8 +333,7 @@ abstract class ParserAbstract implements Parser } /* Goto - shift nonterminal */ - $lastEndAttributes = $this->endAttributeStack[$stackPos]; - $ruleLength = $this->ruleToLength[$rule]; + $lastTokenEnd = $this->tokenEndStack[$stackPos]; $stackPos -= $ruleLength; $nonTerminal = $this->ruleToNonTerminal[$rule]; $idx = $this->gotoBase[$nonTerminal] + $stateStack[$stackPos]; @@ -308,18 +346,19 @@ abstract class ParserAbstract implements Parser ++$stackPos; $stateStack[$stackPos] = $state; $this->semStack[$stackPos] = $this->semValue; - $this->endAttributeStack[$stackPos] = $lastEndAttributes; + $this->tokenEndStack[$stackPos] = $lastTokenEnd; if ($ruleLength === 0) { // Empty productions use the start attributes of the lookahead token. - $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; + $this->tokenStartStack[$stackPos] = $this->tokenPos; } } else { /* error */ switch ($this->errorState) { case 0: $msg = $this->getErrorMessage($symbol, $state); - $this->emitError(new Error($msg, $startAttributes + $endAttributes)); + $this->emitError(new Error($msg, $this->getAttributesForToken($this->tokenPos))); // Break missing intentionally + // no break case 1: case 2: $this->errorState = 3; @@ -346,9 +385,8 @@ abstract class ParserAbstract implements Parser // We treat the error symbol as being empty, so we reset the end attributes // to the end attributes of the last non-error symbol - $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; - $this->endAttributeStack[$stackPos] = $this->endAttributeStack[$stackPos - 1]; - $this->endAttributes = $this->endAttributeStack[$stackPos - 1]; + $this->tokenStartStack[$stackPos] = $this->tokenPos; + $this->tokenEndStack[$stackPos] = $this->tokenEndStack[$stackPos - 1]; break; case 3: @@ -375,7 +413,7 @@ abstract class ParserAbstract implements Parser throw new \RuntimeException('Reached end of parser loop'); } - protected function emitError(Error $error) { + protected function emitError(Error $error): void { $this->errorHandler->handleError($error); } @@ -383,11 +421,11 @@ abstract class ParserAbstract implements Parser * Format error message including expected tokens. * * @param int $symbol Unexpected symbol - * @param int $state State at time of error + * @param int $state State at time of error * * @return string Formatted error message */ - protected function getErrorMessage(int $symbol, int $state) : string { + protected function getErrorMessage(int $symbol, int $state): string { $expectedString = ''; if ($expected = $this->getExpectedTokens($state)) { $expectedString = ', expecting ' . implode(' or ', $expected); @@ -403,7 +441,7 @@ abstract class ParserAbstract implements Parser * * @return string[] Expected tokens. If too many, an empty array is returned. */ - protected function getExpectedTokens(int $state) : array { + protected function getExpectedTokens(int $state): array { $expected = []; $base = $this->actionBase[$state]; @@ -431,37 +469,79 @@ abstract class ParserAbstract implements Parser return $expected; } + /** + * Get attributes for a node with the given start and end token positions. + * + * @param int $tokenStartPos Token position the node starts at + * @param int $tokenEndPos Token position the node ends at + * @return array Attributes + */ + protected function getAttributes(int $tokenStartPos, int $tokenEndPos): array { + $startToken = $this->tokens[$tokenStartPos]; + $afterEndToken = $this->tokens[$tokenEndPos + 1]; + return [ + 'startLine' => $startToken->line, + 'startTokenPos' => $tokenStartPos, + 'startFilePos' => $startToken->pos, + 'endLine' => $afterEndToken->line, + 'endTokenPos' => $tokenEndPos, + 'endFilePos' => $afterEndToken->pos - 1, + ]; + } + + /** + * Get attributes for a single token at the given token position. + * + * @return array Attributes + */ + protected function getAttributesForToken(int $tokenPos): array { + if ($tokenPos < \count($this->tokens) - 1) { + return $this->getAttributes($tokenPos, $tokenPos); + } + + // Get attributes for the sentinel token. + $token = $this->tokens[$tokenPos]; + return [ + 'startLine' => $token->line, + 'startTokenPos' => $tokenPos, + 'startFilePos' => $token->pos, + 'endLine' => $token->line, + 'endTokenPos' => $tokenPos, + 'endFilePos' => $token->pos, + ]; + } + /* * Tracing functions used for debugging the parser. */ /* - protected function traceNewState($state, $symbol) { + protected function traceNewState($state, $symbol): void { echo '% State ' . $state . ', Lookahead ' . ($symbol == self::SYMBOL_NONE ? '--none--' : $this->symbolToName[$symbol]) . "\n"; } - protected function traceRead($symbol) { + protected function traceRead($symbol): void { echo '% Reading ' . $this->symbolToName[$symbol] . "\n"; } - protected function traceShift($symbol) { + protected function traceShift($symbol): void { echo '% Shift ' . $this->symbolToName[$symbol] . "\n"; } - protected function traceAccept() { + protected function traceAccept(): void { echo "% Accepted.\n"; } - protected function traceReduce($n) { + protected function traceReduce($n): void { echo '% Reduce by (' . $n . ') ' . $this->productions[$n] . "\n"; } - protected function tracePop($state) { + protected function tracePop($state): void { echo '% Recovering, uncovered state ' . $state . "\n"; } - protected function traceDiscard($symbol) { + protected function traceDiscard($symbol): void { echo '% Discard ' . $this->symbolToName[$symbol] . "\n"; } */ @@ -476,13 +556,14 @@ abstract class ParserAbstract implements Parser * @param Node\Stmt[] $stmts * @return Node\Stmt[] */ - protected function handleNamespaces(array $stmts) : array { + protected function handleNamespaces(array $stmts): array { $hasErrored = false; $style = $this->getNamespacingStyle($stmts); if (null === $style) { // not namespaced, nothing to do return $stmts; - } elseif ('brace' === $style) { + } + if ('brace' === $style) { // For braced namespaces we only have to check that there are no invalid statements between the namespaces $afterFirstNamespace = false; foreach ($stmts as $stmt) { @@ -500,7 +581,7 @@ abstract class ParserAbstract implements Parser } else { // For semicolon namespaces we have to move the statements after a namespace declaration into ->stmts $resultStmts = []; - $targetStmts =& $resultStmts; + $targetStmts = &$resultStmts; $lastNs = null; foreach ($stmts as $stmt) { if ($stmt instanceof Node\Stmt\Namespace_) { @@ -509,12 +590,12 @@ abstract class ParserAbstract implements Parser } if ($stmt->stmts === null) { $stmt->stmts = []; - $targetStmts =& $stmt->stmts; + $targetStmts = &$stmt->stmts; $resultStmts[] = $stmt; } else { // This handles the invalid case of mixed style namespaces $resultStmts[] = $stmt; - $targetStmts =& $resultStmts; + $targetStmts = &$resultStmts; } $lastNs = $stmt; } elseif ($stmt instanceof Node\Stmt\HaltCompiler) { @@ -531,7 +612,7 @@ abstract class ParserAbstract implements Parser } } - private function fixupNamespaceAttributes(Node\Stmt\Namespace_ $stmt) { + private function fixupNamespaceAttributes(Node\Stmt\Namespace_ $stmt): void { // We moved the statements into the namespace node, as such the end of the namespace node // needs to be extended to the end of the statements. if (empty($stmt->stmts)) { @@ -549,6 +630,22 @@ abstract class ParserAbstract implements Parser } } + /** @return array */ + private function getNamespaceErrorAttributes(Namespace_ $node): array { + $attrs = $node->getAttributes(); + // Adjust end attributes to only cover the "namespace" keyword, not the whole namespace. + if (isset($attrs['startLine'])) { + $attrs['endLine'] = $attrs['startLine']; + } + if (isset($attrs['startTokenPos'])) { + $attrs['endTokenPos'] = $attrs['startTokenPos']; + } + if (isset($attrs['startFilePos'])) { + $attrs['endFilePos'] = $attrs['startFilePos'] + \strlen('namespace') - 1; + } + return $attrs; + } + /** * Determine namespacing style (semicolon or brace) * @@ -556,7 +653,7 @@ abstract class ParserAbstract implements Parser * * @return null|string One of "semicolon", "brace" or null (no namespaces) */ - private function getNamespacingStyle(array $stmts) { + private function getNamespacingStyle(array $stmts): ?string { $style = null; $hasNotAllowedStmts = false; foreach ($stmts as $i => $stmt) { @@ -567,13 +664,13 @@ abstract class ParserAbstract implements Parser if ($hasNotAllowedStmts) { $this->emitError(new Error( 'Namespace declaration statement has to be the very first statement in the script', - $stmt->getLine() // Avoid marking the entire namespace as an error + $this->getNamespaceErrorAttributes($stmt) )); } } elseif ($style !== $currentStyle) { $this->emitError(new Error( 'Cannot mix bracketed namespace declarations with unbracketed namespace declarations', - $stmt->getLine() // Avoid marking the entire namespace as an error + $this->getNamespaceErrorAttributes($stmt) )); // Treat like semicolon style for namespace normalization return 'semicolon'; @@ -599,83 +696,14 @@ abstract class ParserAbstract implements Parser return $style; } - /** - * Fix up parsing of static property calls in PHP 5. - * - * In PHP 5 A::$b[c][d] and A::$b[c][d]() have very different interpretation. The former is - * interpreted as (A::$b)[c][d], while the latter is the same as A::{$b[c][d]}(). We parse the - * latter as the former initially and this method fixes the AST into the correct form when we - * encounter the "()". - * - * @param Node\Expr\StaticPropertyFetch|Node\Expr\ArrayDimFetch $prop - * @param Node\Arg[] $args - * @param array $attributes - * - * @return Expr\StaticCall - */ - protected function fixupPhp5StaticPropCall($prop, array $args, array $attributes) : Expr\StaticCall { - if ($prop instanceof Node\Expr\StaticPropertyFetch) { - $name = $prop->name instanceof VarLikeIdentifier - ? $prop->name->toString() : $prop->name; - $var = new Expr\Variable($name, $prop->name->getAttributes()); - return new Expr\StaticCall($prop->class, $var, $args, $attributes); - } elseif ($prop instanceof Node\Expr\ArrayDimFetch) { - $tmp = $prop; - while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { - $tmp = $tmp->var; - } - - /** @var Expr\StaticPropertyFetch $staticProp */ - $staticProp = $tmp->var; - - // Set start attributes to attributes of innermost node - $tmp = $prop; - $this->fixupStartAttributes($tmp, $staticProp->name); - while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { - $tmp = $tmp->var; - $this->fixupStartAttributes($tmp, $staticProp->name); - } - - $name = $staticProp->name instanceof VarLikeIdentifier - ? $staticProp->name->toString() : $staticProp->name; - $tmp->var = new Expr\Variable($name, $staticProp->name->getAttributes()); - return new Expr\StaticCall($staticProp->class, $prop, $args, $attributes); - } else { - throw new \Exception; - } - } - - protected function fixupStartAttributes(Node $to, Node $from) { - $startAttributes = ['startLine', 'startFilePos', 'startTokenPos']; - foreach ($startAttributes as $startAttribute) { - if ($from->hasAttribute($startAttribute)) { - $to->setAttribute($startAttribute, $from->getAttribute($startAttribute)); - } - } - } - + /** @return Name|Identifier */ protected function handleBuiltinTypes(Name $name) { - $builtinTypes = [ - 'bool' => true, - 'int' => true, - 'float' => true, - 'string' => true, - 'iterable' => true, - 'void' => true, - 'object' => true, - 'null' => true, - 'false' => true, - 'mixed' => true, - 'never' => true, - 'true' => true, - ]; - if (!$name->isUnqualified()) { return $name; } $lowerName = $name->toLowerString(); - if (!isset($builtinTypes[$lowerName])) { + if (!$this->phpVersion->supportsBuiltinType($lowerName)) { return $name; } @@ -685,16 +713,15 @@ abstract class ParserAbstract implements Parser /** * Get combined start and end attributes at a stack location * - * @param int $pos Stack location + * @param int $stackPos Stack location * - * @return array Combined start and end attributes + * @return array Combined start and end attributes */ - protected function getAttributesAt(int $pos) : array { - return $this->startAttributeStack[$pos] + $this->endAttributeStack[$pos]; + protected function getAttributesAt(int $stackPos): array { + return $this->getAttributes($this->tokenStartStack[$stackPos], $this->tokenEndStack[$stackPos]); } - protected function getFloatCastKind(string $cast): int - { + protected function getFloatCastKind(string $cast): int { $cast = strtolower($cast); if (strpos($cast, 'float') !== false) { return Double::KIND_FLOAT; @@ -707,23 +734,24 @@ abstract class ParserAbstract implements Parser return Double::KIND_DOUBLE; } - protected function parseLNumber($str, $attributes, $allowInvalidOctal = false) { + /** @param array $attributes */ + protected function parseLNumber(string $str, array $attributes, bool $allowInvalidOctal = false): Int_ { try { - return LNumber::fromString($str, $attributes, $allowInvalidOctal); + return Int_::fromString($str, $attributes, $allowInvalidOctal); } catch (Error $error) { $this->emitError($error); // Use dummy value - return new LNumber(0, $attributes); + return new Int_(0, $attributes); } } /** * Parse a T_NUM_STRING token into either an integer or string node. * - * @param string $str Number string - * @param array $attributes Attributes + * @param string $str Number string + * @param array $attributes Attributes * - * @return LNumber|String_ Integer or string node. + * @return Int_|String_ Integer or string node. */ protected function parseNumString(string $str, array $attributes) { if (!preg_match('/^(?:0|-?[1-9][0-9]*)$/', $str)) { @@ -735,13 +763,14 @@ abstract class ParserAbstract implements Parser return new String_($str, $attributes); } - return new LNumber($num, $attributes); + return new Int_($num, $attributes); } + /** @param array $attributes */ protected function stripIndentation( string $string, int $indentLen, string $indentChar, bool $newlineAtStart, bool $newlineAtEnd, array $attributes - ) { + ): string { if ($indentLen === 0) { return $string; } @@ -770,10 +799,15 @@ abstract class ParserAbstract implements Parser ); } + /** + * @param string|(Expr|InterpolatedStringPart)[] $contents + * @param array $attributes + * @param array $endTokenAttributes + */ protected function parseDocString( string $startToken, $contents, string $endToken, array $attributes, array $endTokenAttributes, bool $parseUnicodeEscape - ) { + ): Expr { $kind = strpos($startToken, "'") === false ? String_::KIND_HEREDOC : String_::KIND_NOWDOC; @@ -807,6 +841,7 @@ abstract class ParserAbstract implements Parser if (\is_string($contents)) { if ($contents === '') { + $attributes['rawValue'] = $contents; return new String_('', $attributes); } @@ -814,6 +849,7 @@ abstract class ParserAbstract implements Parser $contents, $indentLen, $indentChar, true, true, $attributes ); $contents = preg_replace('~(\r\n|\n|\r)\z~', '', $contents); + $attributes['rawValue'] = $contents; if ($kind === String_::KIND_HEREDOC) { $contents = String_::parseEscapeSequences($contents, null, $parseUnicodeEscape); @@ -822,7 +858,7 @@ abstract class ParserAbstract implements Parser return new String_($contents, $attributes); } else { assert(count($contents) > 0); - if (!$contents[0] instanceof Node\Scalar\EncapsedStringPart) { + if (!$contents[0] instanceof Node\InterpolatedStringPart) { // If there is no leading encapsed string part, pretend there is an empty one $this->stripIndentation( '', $indentLen, $indentChar, true, false, $contents[0]->getAttributes() @@ -831,56 +867,139 @@ abstract class ParserAbstract implements Parser $newContents = []; foreach ($contents as $i => $part) { - if ($part instanceof Node\Scalar\EncapsedStringPart) { + if ($part instanceof Node\InterpolatedStringPart) { $isLast = $i === \count($contents) - 1; $part->value = $this->stripIndentation( $part->value, $indentLen, $indentChar, $i === 0, $isLast, $part->getAttributes() ); - $part->value = String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape); if ($isLast) { $part->value = preg_replace('~(\r\n|\n|\r)\z~', '', $part->value); } + $part->setAttribute('rawValue', $part->value); + $part->value = String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape); if ('' === $part->value) { continue; } } $newContents[] = $part; } - return new Encapsed($newContents, $attributes); + return new InterpolatedString($newContents, $attributes); } } + protected function createCommentFromToken(Token $token, int $tokenPos): Comment { + assert($token->id === \T_COMMENT || $token->id == \T_DOC_COMMENT); + return \T_DOC_COMMENT === $token->id + ? new Comment\Doc($token->text, $token->line, $token->pos, $tokenPos, + $token->getEndLine(), $token->getEndPos() - 1, $tokenPos) + : new Comment($token->text, $token->line, $token->pos, $tokenPos, + $token->getEndLine(), $token->getEndPos() - 1, $tokenPos); + } + /** - * Create attributes for a zero-length common-capturing nop. - * - * @param Comment[] $comments - * @return array + * Get last comment before the given token position, if any */ - protected function createCommentNopAttributes(array $comments) { - $comment = $comments[count($comments) - 1]; + protected function getCommentBeforeToken(int $tokenPos): ?Comment { + while (--$tokenPos >= 0) { + $token = $this->tokens[$tokenPos]; + if (!isset($this->dropTokens[$token->id])) { + break; + } + + if ($token->id === \T_COMMENT || $token->id === \T_DOC_COMMENT) { + return $this->createCommentFromToken($token, $tokenPos); + } + } + return null; + } + + /** + * Create a zero-length nop to capture preceding comments, if any. + */ + protected function maybeCreateZeroLengthNop(int $tokenPos): ?Nop { + $comment = $this->getCommentBeforeToken($tokenPos); + if ($comment === null) { + return null; + } + $commentEndLine = $comment->getEndLine(); $commentEndFilePos = $comment->getEndFilePos(); $commentEndTokenPos = $comment->getEndTokenPos(); + $attributes = [ + 'startLine' => $commentEndLine, + 'endLine' => $commentEndLine, + 'startFilePos' => $commentEndFilePos + 1, + 'endFilePos' => $commentEndFilePos, + 'startTokenPos' => $commentEndTokenPos + 1, + 'endTokenPos' => $commentEndTokenPos, + ]; + return new Nop($attributes); + } - $attributes = ['comments' => $comments]; - if (-1 !== $commentEndLine) { - $attributes['startLine'] = $commentEndLine; - $attributes['endLine'] = $commentEndLine; + protected function maybeCreateNop(int $tokenStartPos, int $tokenEndPos): ?Nop { + if ($this->getCommentBeforeToken($tokenStartPos) === null) { + return null; } - if (-1 !== $commentEndFilePos) { - $attributes['startFilePos'] = $commentEndFilePos + 1; - $attributes['endFilePos'] = $commentEndFilePos; + return new Nop($this->getAttributes($tokenStartPos, $tokenEndPos)); + } + + protected function handleHaltCompiler(): string { + // Prevent the lexer from returning any further tokens. + $nextToken = $this->tokens[$this->tokenPos + 1]; + $this->tokenPos = \count($this->tokens) - 2; + + // Return text after __halt_compiler. + return $nextToken->id === \T_INLINE_HTML ? $nextToken->text : ''; + } + + protected function inlineHtmlHasLeadingNewline(int $stackPos): bool { + $tokenPos = $this->tokenStartStack[$stackPos]; + $token = $this->tokens[$tokenPos]; + assert($token->id == \T_INLINE_HTML); + if ($tokenPos > 0) { + $prevToken = $this->tokens[$tokenPos - 1]; + assert($prevToken->id == \T_CLOSE_TAG); + return false !== strpos($prevToken->text, "\n") + || false !== strpos($prevToken->text, "\r"); } - if (-1 !== $commentEndTokenPos) { - $attributes['startTokenPos'] = $commentEndTokenPos + 1; - $attributes['endTokenPos'] = $commentEndTokenPos; + return true; + } + + /** + * @return array + */ + protected function createEmptyElemAttributes(int $tokenPos): array { + return $this->getAttributesForToken($tokenPos); + } + + protected function fixupArrayDestructuring(Array_ $node): Expr\List_ { + $this->createdArrays->detach($node); + return new Expr\List_(array_map(function (Node\ArrayItem $item) { + if ($item->value instanceof Expr\Error) { + // We used Error as a placeholder for empty elements, which are legal for destructuring. + return null; + } + if ($item->value instanceof Array_) { + return new Node\ArrayItem( + $this->fixupArrayDestructuring($item->value), + $item->key, $item->byRef, $item->getAttributes()); + } + return $item; + }, $node->items), ['kind' => Expr\List_::KIND_ARRAY] + $node->getAttributes()); + } + + protected function postprocessList(Expr\List_ $node): void { + foreach ($node->items as $i => $item) { + if ($item->value instanceof Expr\Error) { + // We used Error as a placeholder for empty elements, which are legal for destructuring. + $node->items[$i] = null; + } } - return $attributes; } /** @param ElseIf_|Else_ $node */ - protected function fixupAlternativeElse($node) { + protected function fixupAlternativeElse($node): void { // Make sure a trailing nop statement carrying comments is part of the node. $numStmts = \count($node->stmts); if ($numStmts !== 0 && $node->stmts[$numStmts - 1] instanceof Nop) { @@ -897,26 +1016,26 @@ abstract class ParserAbstract implements Parser } } - protected function checkClassModifier($a, $b, $modifierPos) { + protected function checkClassModifier(int $a, int $b, int $modifierPos): void { try { - Class_::verifyClassModifier($a, $b); + Modifiers::verifyClassModifier($a, $b); } catch (Error $error) { $error->setAttributes($this->getAttributesAt($modifierPos)); $this->emitError($error); } } - protected function checkModifier($a, $b, $modifierPos) { + protected function checkModifier(int $a, int $b, int $modifierPos): void { // Jumping through some hoops here because verifyModifier() is also used elsewhere try { - Class_::verifyModifier($a, $b); + Modifiers::verifyModifier($a, $b); } catch (Error $error) { $error->setAttributes($this->getAttributesAt($modifierPos)); $this->emitError($error); } } - protected function checkParam(Param $node) { + protected function checkParam(Param $node): void { if ($node->variadic && null !== $node->default) { $this->emitError(new Error( 'Variadic parameter cannot have a default value', @@ -925,7 +1044,7 @@ abstract class ParserAbstract implements Parser } } - protected function checkTryCatch(TryCatch $node) { + protected function checkTryCatch(TryCatch $node): void { if (empty($node->catches) && null === $node->finally) { $this->emitError(new Error( 'Cannot use try without catch or finally', $node->getAttributes() @@ -933,7 +1052,7 @@ abstract class ParserAbstract implements Parser } } - protected function checkNamespace(Namespace_ $node) { + protected function checkNamespace(Namespace_ $node): void { if (null !== $node->stmts) { foreach ($node->stmts as $stmt) { if ($stmt instanceof Namespace_) { @@ -945,7 +1064,7 @@ abstract class ParserAbstract implements Parser } } - private function checkClassName($name, $namePos) { + private function checkClassName(?Identifier $name, int $namePos): void { if (null !== $name && $name->isSpecialClassName()) { $this->emitError(new Error( sprintf('Cannot use \'%s\' as class name as it is reserved', $name), @@ -954,7 +1073,8 @@ abstract class ParserAbstract implements Parser } } - private function checkImplementedInterfaces(array $interfaces) { + /** @param Name[] $interfaces */ + private function checkImplementedInterfaces(array $interfaces): void { foreach ($interfaces as $interface) { if ($interface->isSpecialClassName()) { $this->emitError(new Error( @@ -965,7 +1085,7 @@ abstract class ParserAbstract implements Parser } } - protected function checkClass(Class_ $node, $namePos) { + protected function checkClass(Class_ $node, int $namePos): void { $this->checkClassName($node->name, $namePos); if ($node->extends && $node->extends->isSpecialClassName()) { @@ -978,18 +1098,18 @@ abstract class ParserAbstract implements Parser $this->checkImplementedInterfaces($node->implements); } - protected function checkInterface(Interface_ $node, $namePos) { + protected function checkInterface(Interface_ $node, int $namePos): void { $this->checkClassName($node->name, $namePos); $this->checkImplementedInterfaces($node->extends); } - protected function checkEnum(Enum_ $node, $namePos) { + protected function checkEnum(Enum_ $node, int $namePos): void { $this->checkClassName($node->name, $namePos); $this->checkImplementedInterfaces($node->implements); } - protected function checkClassMethod(ClassMethod $node, $modifierPos) { - if ($node->flags & Class_::MODIFIER_STATIC) { + protected function checkClassMethod(ClassMethod $node, int $modifierPos): void { + if ($node->flags & Modifiers::STATIC) { switch ($node->name->toLowerString()) { case '__construct': $this->emitError(new Error( @@ -1009,44 +1129,44 @@ abstract class ParserAbstract implements Parser } } - if ($node->flags & Class_::MODIFIER_READONLY) { + if ($node->flags & Modifiers::READONLY) { $this->emitError(new Error( sprintf('Method %s() cannot be readonly', $node->name), $this->getAttributesAt($modifierPos))); } } - protected function checkClassConst(ClassConst $node, $modifierPos) { - if ($node->flags & Class_::MODIFIER_STATIC) { + protected function checkClassConst(ClassConst $node, int $modifierPos): void { + if ($node->flags & Modifiers::STATIC) { $this->emitError(new Error( "Cannot use 'static' as constant modifier", $this->getAttributesAt($modifierPos))); } - if ($node->flags & Class_::MODIFIER_ABSTRACT) { + if ($node->flags & Modifiers::ABSTRACT) { $this->emitError(new Error( "Cannot use 'abstract' as constant modifier", $this->getAttributesAt($modifierPos))); } - if ($node->flags & Class_::MODIFIER_READONLY) { + if ($node->flags & Modifiers::READONLY) { $this->emitError(new Error( "Cannot use 'readonly' as constant modifier", $this->getAttributesAt($modifierPos))); } } - protected function checkProperty(Property $node, $modifierPos) { - if ($node->flags & Class_::MODIFIER_ABSTRACT) { + protected function checkProperty(Property $node, int $modifierPos): void { + if ($node->flags & Modifiers::ABSTRACT) { $this->emitError(new Error('Properties cannot be declared abstract', $this->getAttributesAt($modifierPos))); } - if ($node->flags & Class_::MODIFIER_FINAL) { + if ($node->flags & Modifiers::FINAL) { $this->emitError(new Error('Properties cannot be declared final', $this->getAttributesAt($modifierPos))); } } - protected function checkUseUse(UseUse $node, $namePos) { + protected function checkUseUse(UseItem $node, int $namePos): void { if ($node->alias && $node->alias->isSpecialClassName()) { $this->emitError(new Error( sprintf( @@ -1057,4 +1177,65 @@ abstract class ParserAbstract implements Parser )); } } + + /** + * Creates the token map. + * + * The token map maps the PHP internal token identifiers + * to the identifiers used by the Parser. Additionally it + * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'. + * + * @return array The token map + */ + protected function createTokenMap(): array { + $tokenMap = []; + + for ($i = 0; $i < 1000; ++$i) { + if ($i < 256) { + // Single-char tokens use an identity mapping. + $tokenMap[$i] = $i; + } elseif (\T_DOUBLE_COLON === $i) { + // T_DOUBLE_COLON is equivalent to T_PAAMAYIM_NEKUDOTAYIM + $tokenMap[$i] = static::T_PAAMAYIM_NEKUDOTAYIM; + } elseif (\T_OPEN_TAG_WITH_ECHO === $i) { + // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO + $tokenMap[$i] = static::T_ECHO; + } elseif (\T_CLOSE_TAG === $i) { + // T_CLOSE_TAG is equivalent to ';' + $tokenMap[$i] = ord(';'); + } elseif ('UNKNOWN' !== $name = token_name($i)) { + if (defined($name = static::class . '::' . $name)) { + // Other tokens can be mapped directly + $tokenMap[$i] = constant($name); + } + } + } + + // Assign tokens for which we define compatibility constants, as token_name() does not know them. + $tokenMap[\T_FN] = static::T_FN; + $tokenMap[\T_COALESCE_EQUAL] = static::T_COALESCE_EQUAL; + $tokenMap[\T_NAME_QUALIFIED] = static::T_NAME_QUALIFIED; + $tokenMap[\T_NAME_FULLY_QUALIFIED] = static::T_NAME_FULLY_QUALIFIED; + $tokenMap[\T_NAME_RELATIVE] = static::T_NAME_RELATIVE; + $tokenMap[\T_MATCH] = static::T_MATCH; + $tokenMap[\T_NULLSAFE_OBJECT_OPERATOR] = static::T_NULLSAFE_OBJECT_OPERATOR; + $tokenMap[\T_ATTRIBUTE] = static::T_ATTRIBUTE; + $tokenMap[\T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG] = static::T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG; + $tokenMap[\T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG] = static::T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG; + $tokenMap[\T_ENUM] = static::T_ENUM; + $tokenMap[\T_READONLY] = static::T_READONLY; + + // We have create a map from PHP token IDs to external symbol IDs. + // Now map them to the internal symbol ID. + $fullTokenMap = []; + foreach ($tokenMap as $phpToken => $extSymbol) { + $intSymbol = $this->tokenToSymbol[$extSymbol]; + if ($intSymbol === $this->invalidSymbol) { + continue; + } + $fullTokenMap[$phpToken] = $intSymbol; + } + + return $fullTokenMap; + } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php index f041e7ff..3a7586ea 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php @@ -2,43 +2,41 @@ namespace PhpParser; -class ParserFactory -{ - const PREFER_PHP7 = 1; - const PREFER_PHP5 = 2; - const ONLY_PHP7 = 3; - const ONLY_PHP5 = 4; +use PhpParser\Parser\Php7; +use PhpParser\Parser\Php8; +class ParserFactory { /** - * Creates a Parser instance, according to the provided kind. - * - * @param int $kind One of ::PREFER_PHP7, ::PREFER_PHP5, ::ONLY_PHP7 or ::ONLY_PHP5 - * @param Lexer|null $lexer Lexer to use. Defaults to emulative lexer when not specified - * @param array $parserOptions Parser options. See ParserAbstract::__construct() argument - * - * @return Parser The parser instance + * Create a parser targeting the given version on a best-effort basis. The parser will generally + * accept code for the newest supported version, but will try to accommodate code that becomes + * invalid in newer versions or changes in interpretation. */ - public function create(int $kind, Lexer $lexer = null, array $parserOptions = []) : Parser { - if (null === $lexer) { - $lexer = new Lexer\Emulative(); + public function createForVersion(PhpVersion $version): Parser { + if ($version->isHostVersion()) { + $lexer = new Lexer(); + } else { + $lexer = new Lexer\Emulative($version); } - switch ($kind) { - case self::PREFER_PHP7: - return new Parser\Multiple([ - new Parser\Php7($lexer, $parserOptions), new Parser\Php5($lexer, $parserOptions) - ]); - case self::PREFER_PHP5: - return new Parser\Multiple([ - new Parser\Php5($lexer, $parserOptions), new Parser\Php7($lexer, $parserOptions) - ]); - case self::ONLY_PHP7: - return new Parser\Php7($lexer, $parserOptions); - case self::ONLY_PHP5: - return new Parser\Php5($lexer, $parserOptions); - default: - throw new \LogicException( - 'Kind must be one of ::PREFER_PHP7, ::PREFER_PHP5, ::ONLY_PHP7 or ::ONLY_PHP5' - ); + if ($version->id >= 80000) { + return new Php8($lexer, $version); } + return new Php7($lexer, $version); + } + + /** + * Create a parser targeting the newest version supported by this library. Code for older + * versions will be accepted if there have been no relevant backwards-compatibility breaks in + * PHP. + */ + public function createForNewestSupportedVersion(): Parser { + return $this->createForVersion(PhpVersion::getNewestSupported()); + } + + /** + * Create a parser targeting the host PHP version, that is the PHP version we're currently + * running on. This parser will not use any token emulation. + */ + public function createForHostVersion(): Parser { + return $this->createForVersion(PhpVersion::getHostVersion()); } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/PhpVersion.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/PhpVersion.php new file mode 100644 index 00000000..a6fbb58e --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/PhpVersion.php @@ -0,0 +1,164 @@ + 50100, + 'callable' => 50400, + 'bool' => 70000, + 'int' => 70000, + 'float' => 70000, + 'string' => 70000, + 'iterable' => 70100, + 'void' => 70100, + 'object' => 70200, + 'null' => 80000, + 'false' => 80000, + 'mixed' => 80000, + 'never' => 80100, + 'true' => 80200, + ]; + + private function __construct(int $id) { + $this->id = $id; + } + + /** + * Create a PhpVersion object from major and minor version components. + */ + public static function fromComponents(int $major, int $minor): self { + return new self($major * 10000 + $minor * 100); + } + + /** + * Get the newest PHP version supported by this library. Support for this version may be partial, + * if it is still under development. + */ + public static function getNewestSupported(): self { + return self::fromComponents(8, 2); + } + + /** + * Get the host PHP version, that is the PHP version we're currently running on. + */ + public static function getHostVersion(): self { + return self::fromComponents(\PHP_MAJOR_VERSION, \PHP_MINOR_VERSION); + } + + /** + * Parse the version from a string like "8.1". + */ + public static function fromString(string $version): self { + if (!preg_match('/^(\d+)\.(\d+)/', $version, $matches)) { + throw new \LogicException("Invalid PHP version \"$version\""); + } + return self::fromComponents((int) $matches[1], (int) $matches[2]); + } + + /** + * Check whether two versions are the same. + */ + public function equals(PhpVersion $other): bool { + return $this->id === $other->id; + } + + /** + * Check whether this version is greater than or equal to the argument. + */ + public function newerOrEqual(PhpVersion $other): bool { + return $this->id >= $other->id; + } + + /** + * Check whether this version is older than the argument. + */ + public function older(PhpVersion $other): bool { + return $this->id < $other->id; + } + + /** + * Check whether this is the host PHP version. + */ + public function isHostVersion(): bool { + return $this->equals(self::getHostVersion()); + } + + /** + * Check whether this PHP version supports the given builtin type. Type name must be lowercase. + */ + public function supportsBuiltinType(string $type): bool { + $minVersion = self::BUILTIN_TYPE_VERSIONS[$type] ?? null; + return $minVersion !== null && $this->id >= $minVersion; + } + + /** + * Whether this version supports [] array literals. + */ + public function supportsShortArraySyntax(): bool { + return $this->id >= 50400; + } + + /** + * Whether this version supports [] for destructuring. + */ + public function supportsShortArrayDestructuring(): bool { + return $this->id >= 70100; + } + + /** + * Whether this version supports flexible heredoc/nowdoc. + */ + public function supportsFlexibleHeredoc(): bool { + return $this->id >= 70300; + } + + /** + * Whether this version supports trailing commas in parameter lists. + */ + public function supportsTrailingCommaInParamList(): bool { + return $this->id >= 80000; + } + + /** + * Whether this version allows "$var =& new Obj". + */ + public function allowsAssignNewByReference(): bool { + return $this->id < 70000; + } + + /** + * Whether this version allows invalid octals like "08". + */ + public function allowsInvalidOctals(): bool { + return $this->id < 70000; + } + + /** + * Whether this version allows DEL (\x7f) to occur in identifiers. + */ + public function allowsDelInIdentifiers(): bool { + return $this->id < 70100; + } + + /** + * Whether this version supports yield in expression context without parentheses. + */ + public function supportsYieldWithoutParentheses(): bool { + return $this->id >= 70000; + } + + /** + * Whether this version supports unicode escape sequences in strings. + */ + public function supportsUnicodeEscapes(): bool { + return $this->id >= 70000; + } +} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter.php new file mode 100644 index 00000000..892c686e --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter.php @@ -0,0 +1,51 @@ +pAttrGroups($node->attrGroups, true) . $this->pModifiers($node->flags) . ($node->type ? $this->p($node->type) . ' ' : '') @@ -27,25 +26,25 @@ class Standard extends PrettyPrinterAbstract . ($node->default ? ' = ' . $this->p($node->default) : ''); } - protected function pArg(Node\Arg $node) { + protected function pArg(Node\Arg $node): string { return ($node->name ? $node->name->toString() . ': ' : '') . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); } - protected function pVariadicPlaceholder(Node\VariadicPlaceholder $node) { + protected function pVariadicPlaceholder(Node\VariadicPlaceholder $node): string { return '...'; } - protected function pConst(Node\Const_ $node) { + protected function pConst(Node\Const_ $node): string { return $node->name . ' = ' . $this->p($node->value); } - protected function pNullableType(Node\NullableType $node) { + protected function pNullableType(Node\NullableType $node): string { return '?' . $this->p($node->type); } - protected function pUnionType(Node\UnionType $node) { + protected function pUnionType(Node\UnionType $node): string { $types = []; foreach ($node->types as $typeNode) { if ($typeNode instanceof Node\IntersectionType) { @@ -57,138 +56,150 @@ class Standard extends PrettyPrinterAbstract return implode('|', $types); } - protected function pIntersectionType(Node\IntersectionType $node) { + protected function pIntersectionType(Node\IntersectionType $node): string { return $this->pImplode($node->types, '&'); } - protected function pIdentifier(Node\Identifier $node) { + protected function pIdentifier(Node\Identifier $node): string { return $node->name; } - protected function pVarLikeIdentifier(Node\VarLikeIdentifier $node) { + protected function pVarLikeIdentifier(Node\VarLikeIdentifier $node): string { return '$' . $node->name; } - protected function pAttribute(Node\Attribute $node) { + protected function pAttribute(Node\Attribute $node): string { return $this->p($node->name) . ($node->args ? '(' . $this->pCommaSeparated($node->args) . ')' : ''); } - protected function pAttributeGroup(Node\AttributeGroup $node) { + protected function pAttributeGroup(Node\AttributeGroup $node): string { return '#[' . $this->pCommaSeparated($node->attrs) . ']'; } // Names - protected function pName(Name $node) { - return implode('\\', $node->parts); + protected function pName(Name $node): string { + return $node->name; } - protected function pName_FullyQualified(Name\FullyQualified $node) { - return '\\' . implode('\\', $node->parts); + protected function pName_FullyQualified(Name\FullyQualified $node): string { + return '\\' . $node->name; } - protected function pName_Relative(Name\Relative $node) { - return 'namespace\\' . implode('\\', $node->parts); + protected function pName_Relative(Name\Relative $node): string { + return 'namespace\\' . $node->name; } // Magic Constants - protected function pScalar_MagicConst_Class(MagicConst\Class_ $node) { + protected function pScalar_MagicConst_Class(MagicConst\Class_ $node): string { return '__CLASS__'; } - protected function pScalar_MagicConst_Dir(MagicConst\Dir $node) { + protected function pScalar_MagicConst_Dir(MagicConst\Dir $node): string { return '__DIR__'; } - protected function pScalar_MagicConst_File(MagicConst\File $node) { + protected function pScalar_MagicConst_File(MagicConst\File $node): string { return '__FILE__'; } - protected function pScalar_MagicConst_Function(MagicConst\Function_ $node) { + protected function pScalar_MagicConst_Function(MagicConst\Function_ $node): string { return '__FUNCTION__'; } - protected function pScalar_MagicConst_Line(MagicConst\Line $node) { + protected function pScalar_MagicConst_Line(MagicConst\Line $node): string { return '__LINE__'; } - protected function pScalar_MagicConst_Method(MagicConst\Method $node) { + protected function pScalar_MagicConst_Method(MagicConst\Method $node): string { return '__METHOD__'; } - protected function pScalar_MagicConst_Namespace(MagicConst\Namespace_ $node) { + protected function pScalar_MagicConst_Namespace(MagicConst\Namespace_ $node): string { return '__NAMESPACE__'; } - protected function pScalar_MagicConst_Trait(MagicConst\Trait_ $node) { + protected function pScalar_MagicConst_Trait(MagicConst\Trait_ $node): string { return '__TRAIT__'; } // Scalars - protected function pScalar_String(Scalar\String_ $node) { + private function indentString(string $str): string { + return str_replace("\n", $this->nl, $str); + } + + protected function pScalar_String(Scalar\String_ $node): string { $kind = $node->getAttribute('kind', Scalar\String_::KIND_SINGLE_QUOTED); switch ($kind) { case Scalar\String_::KIND_NOWDOC: $label = $node->getAttribute('docLabel'); if ($label && !$this->containsEndLabel($node->value, $label)) { + $shouldIdent = $this->phpVersion->supportsFlexibleHeredoc(); + $nl = $shouldIdent ? $this->nl : $this->newline; if ($node->value === '') { - return "<<<'$label'\n$label" . $this->docStringEndToken; + return "<<<'$label'$nl$label{$this->docStringEndToken}"; } - return "<<<'$label'\n$node->value\n$label" - . $this->docStringEndToken; + // Make sure trailing \r is not combined with following \n into CRLF. + if ($node->value[strlen($node->value) - 1] !== "\r") { + $value = $shouldIdent ? $this->indentString($node->value) : $node->value; + return "<<<'$label'$nl$value$nl$label{$this->docStringEndToken}"; + } } /* break missing intentionally */ + // no break case Scalar\String_::KIND_SINGLE_QUOTED: return $this->pSingleQuotedString($node->value); case Scalar\String_::KIND_HEREDOC: $label = $node->getAttribute('docLabel'); - if ($label && !$this->containsEndLabel($node->value, $label)) { - if ($node->value === '') { - return "<<<$label\n$label" . $this->docStringEndToken; + $escaped = $this->escapeString($node->value, null); + if ($label && !$this->containsEndLabel($escaped, $label)) { + $nl = $this->phpVersion->supportsFlexibleHeredoc() ? $this->nl : $this->newline; + if ($escaped === '') { + return "<<<$label$nl$label{$this->docStringEndToken}"; } - $escaped = $this->escapeString($node->value, null); - return "<<<$label\n" . $escaped . "\n$label" - . $this->docStringEndToken; + return "<<<$label$nl$escaped$nl$label{$this->docStringEndToken}"; } - /* break missing intentionally */ + /* break missing intentionally */ + // no break case Scalar\String_::KIND_DOUBLE_QUOTED: return '"' . $this->escapeString($node->value, '"') . '"'; } throw new \Exception('Invalid string kind'); } - protected function pScalar_Encapsed(Scalar\Encapsed $node) { + protected function pScalar_InterpolatedString(Scalar\InterpolatedString $node): string { if ($node->getAttribute('kind') === Scalar\String_::KIND_HEREDOC) { $label = $node->getAttribute('docLabel'); if ($label && !$this->encapsedContainsEndLabel($node->parts, $label)) { + $nl = $this->phpVersion->supportsFlexibleHeredoc() ? $this->nl : $this->newline; if (count($node->parts) === 1 - && $node->parts[0] instanceof Scalar\EncapsedStringPart + && $node->parts[0] instanceof Node\InterpolatedStringPart && $node->parts[0]->value === '' ) { - return "<<<$label\n$label" . $this->docStringEndToken; + return "<<<$label$nl$label{$this->docStringEndToken}"; } - return "<<<$label\n" . $this->pEncapsList($node->parts, null) . "\n$label" - . $this->docStringEndToken; + return "<<<$label$nl" . $this->pEncapsList($node->parts, null) + . "$nl$label{$this->docStringEndToken}"; } } return '"' . $this->pEncapsList($node->parts, '"') . '"'; } - protected function pScalar_LNumber(Scalar\LNumber $node) { - if ($node->value === -\PHP_INT_MAX-1) { + protected function pScalar_Int(Scalar\Int_ $node): string { + if ($node->value === -\PHP_INT_MAX - 1) { // PHP_INT_MIN cannot be represented as a literal, // because the sign is not part of the literal return '(-' . \PHP_INT_MAX . '-1)'; } - $kind = $node->getAttribute('kind', Scalar\LNumber::KIND_DEC); - if (Scalar\LNumber::KIND_DEC === $kind) { + $kind = $node->getAttribute('kind', Scalar\Int_::KIND_DEC); + if (Scalar\Int_::KIND_DEC === $kind) { return (string) $node->value; } @@ -200,22 +211,23 @@ class Standard extends PrettyPrinterAbstract $str = (string) $node->value; } switch ($kind) { - case Scalar\LNumber::KIND_BIN: + case Scalar\Int_::KIND_BIN: return $sign . '0b' . base_convert($str, 10, 2); - case Scalar\LNumber::KIND_OCT: + case Scalar\Int_::KIND_OCT: return $sign . '0' . base_convert($str, 10, 8); - case Scalar\LNumber::KIND_HEX: + case Scalar\Int_::KIND_HEX: return $sign . '0x' . base_convert($str, 10, 16); } throw new \Exception('Invalid number kind'); } - protected function pScalar_DNumber(Scalar\DNumber $node) { + protected function pScalar_Float(Scalar\Float_ $node): string { if (!is_finite($node->value)) { if ($node->value === \INF) { - return '\INF'; - } elseif ($node->value === -\INF) { - return '-\INF'; + return '1.0E+1000'; + } + if ($node->value === -\INF) { + return '-1.0E+1000'; } else { return '\NAN'; } @@ -223,7 +235,7 @@ class Standard extends PrettyPrinterAbstract // Try to find a short full-precision representation $stringValue = sprintf('%.16G', $node->value); - if ($node->value !== (double) $stringValue) { + if ($node->value !== (float) $stringValue) { $stringValue = sprintf('%.17G', $node->value); } @@ -236,299 +248,288 @@ class Standard extends PrettyPrinterAbstract return preg_match('/^-?[0-9]+$/', $stringValue) ? $stringValue . '.0' : $stringValue; } - protected function pScalar_EncapsedStringPart(Scalar\EncapsedStringPart $node) { - throw new \LogicException('Cannot directly print EncapsedStringPart'); - } - // Assignments - protected function pExpr_Assign(Expr\Assign $node) { - return $this->pInfixOp(Expr\Assign::class, $node->var, ' = ', $node->expr); + protected function pExpr_Assign(Expr\Assign $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Expr\Assign::class, $this->p($node->var) . ' = ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignRef(Expr\AssignRef $node) { - return $this->pInfixOp(Expr\AssignRef::class, $node->var, ' =& ', $node->expr); + protected function pExpr_AssignRef(Expr\AssignRef $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Expr\AssignRef::class, $this->p($node->var) . ' =& ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Plus(AssignOp\Plus $node) { - return $this->pInfixOp(AssignOp\Plus::class, $node->var, ' += ', $node->expr); + protected function pExpr_AssignOp_Plus(AssignOp\Plus $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(AssignOp\Plus::class, $this->p($node->var) . ' += ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Minus(AssignOp\Minus $node) { - return $this->pInfixOp(AssignOp\Minus::class, $node->var, ' -= ', $node->expr); + protected function pExpr_AssignOp_Minus(AssignOp\Minus $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(AssignOp\Minus::class, $this->p($node->var) . ' -= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Mul(AssignOp\Mul $node) { - return $this->pInfixOp(AssignOp\Mul::class, $node->var, ' *= ', $node->expr); + protected function pExpr_AssignOp_Mul(AssignOp\Mul $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(AssignOp\Mul::class, $this->p($node->var) . ' *= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Div(AssignOp\Div $node) { - return $this->pInfixOp(AssignOp\Div::class, $node->var, ' /= ', $node->expr); + protected function pExpr_AssignOp_Div(AssignOp\Div $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(AssignOp\Div::class, $this->p($node->var) . ' /= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Concat(AssignOp\Concat $node) { - return $this->pInfixOp(AssignOp\Concat::class, $node->var, ' .= ', $node->expr); + protected function pExpr_AssignOp_Concat(AssignOp\Concat $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(AssignOp\Concat::class, $this->p($node->var) . ' .= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Mod(AssignOp\Mod $node) { - return $this->pInfixOp(AssignOp\Mod::class, $node->var, ' %= ', $node->expr); + protected function pExpr_AssignOp_Mod(AssignOp\Mod $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(AssignOp\Mod::class, $this->p($node->var) . ' %= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_BitwiseAnd(AssignOp\BitwiseAnd $node) { - return $this->pInfixOp(AssignOp\BitwiseAnd::class, $node->var, ' &= ', $node->expr); + protected function pExpr_AssignOp_BitwiseAnd(AssignOp\BitwiseAnd $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(AssignOp\BitwiseAnd::class, $this->p($node->var) . ' &= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_BitwiseOr(AssignOp\BitwiseOr $node) { - return $this->pInfixOp(AssignOp\BitwiseOr::class, $node->var, ' |= ', $node->expr); + protected function pExpr_AssignOp_BitwiseOr(AssignOp\BitwiseOr $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(AssignOp\BitwiseOr::class, $this->p($node->var) . ' |= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_BitwiseXor(AssignOp\BitwiseXor $node) { - return $this->pInfixOp(AssignOp\BitwiseXor::class, $node->var, ' ^= ', $node->expr); + protected function pExpr_AssignOp_BitwiseXor(AssignOp\BitwiseXor $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(AssignOp\BitwiseXor::class, $this->p($node->var) . ' ^= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_ShiftLeft(AssignOp\ShiftLeft $node) { - return $this->pInfixOp(AssignOp\ShiftLeft::class, $node->var, ' <<= ', $node->expr); + protected function pExpr_AssignOp_ShiftLeft(AssignOp\ShiftLeft $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(AssignOp\ShiftLeft::class, $this->p($node->var) . ' <<= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_ShiftRight(AssignOp\ShiftRight $node) { - return $this->pInfixOp(AssignOp\ShiftRight::class, $node->var, ' >>= ', $node->expr); + protected function pExpr_AssignOp_ShiftRight(AssignOp\ShiftRight $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(AssignOp\ShiftRight::class, $this->p($node->var) . ' >>= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Pow(AssignOp\Pow $node) { - return $this->pInfixOp(AssignOp\Pow::class, $node->var, ' **= ', $node->expr); + protected function pExpr_AssignOp_Pow(AssignOp\Pow $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(AssignOp\Pow::class, $this->p($node->var) . ' **= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Coalesce(AssignOp\Coalesce $node) { - return $this->pInfixOp(AssignOp\Coalesce::class, $node->var, ' ??= ', $node->expr); + protected function pExpr_AssignOp_Coalesce(AssignOp\Coalesce $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(AssignOp\Coalesce::class, $this->p($node->var) . ' ??= ', $node->expr, $precedence, $lhsPrecedence); } // Binary expressions - protected function pExpr_BinaryOp_Plus(BinaryOp\Plus $node) { - return $this->pInfixOp(BinaryOp\Plus::class, $node->left, ' + ', $node->right); + protected function pExpr_BinaryOp_Plus(BinaryOp\Plus $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\Plus::class, $node->left, ' + ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Minus(BinaryOp\Minus $node) { - return $this->pInfixOp(BinaryOp\Minus::class, $node->left, ' - ', $node->right); + protected function pExpr_BinaryOp_Minus(BinaryOp\Minus $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\Minus::class, $node->left, ' - ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Mul(BinaryOp\Mul $node) { - return $this->pInfixOp(BinaryOp\Mul::class, $node->left, ' * ', $node->right); + protected function pExpr_BinaryOp_Mul(BinaryOp\Mul $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\Mul::class, $node->left, ' * ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Div(BinaryOp\Div $node) { - return $this->pInfixOp(BinaryOp\Div::class, $node->left, ' / ', $node->right); + protected function pExpr_BinaryOp_Div(BinaryOp\Div $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\Div::class, $node->left, ' / ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Concat(BinaryOp\Concat $node) { - return $this->pInfixOp(BinaryOp\Concat::class, $node->left, ' . ', $node->right); + protected function pExpr_BinaryOp_Concat(BinaryOp\Concat $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\Concat::class, $node->left, ' . ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Mod(BinaryOp\Mod $node) { - return $this->pInfixOp(BinaryOp\Mod::class, $node->left, ' % ', $node->right); + protected function pExpr_BinaryOp_Mod(BinaryOp\Mod $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\Mod::class, $node->left, ' % ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_BooleanAnd(BinaryOp\BooleanAnd $node) { - return $this->pInfixOp(BinaryOp\BooleanAnd::class, $node->left, ' && ', $node->right); + protected function pExpr_BinaryOp_BooleanAnd(BinaryOp\BooleanAnd $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\BooleanAnd::class, $node->left, ' && ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_BooleanOr(BinaryOp\BooleanOr $node) { - return $this->pInfixOp(BinaryOp\BooleanOr::class, $node->left, ' || ', $node->right); + protected function pExpr_BinaryOp_BooleanOr(BinaryOp\BooleanOr $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\BooleanOr::class, $node->left, ' || ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_BitwiseAnd(BinaryOp\BitwiseAnd $node) { - return $this->pInfixOp(BinaryOp\BitwiseAnd::class, $node->left, ' & ', $node->right); + protected function pExpr_BinaryOp_BitwiseAnd(BinaryOp\BitwiseAnd $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\BitwiseAnd::class, $node->left, ' & ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_BitwiseOr(BinaryOp\BitwiseOr $node) { - return $this->pInfixOp(BinaryOp\BitwiseOr::class, $node->left, ' | ', $node->right); + protected function pExpr_BinaryOp_BitwiseOr(BinaryOp\BitwiseOr $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\BitwiseOr::class, $node->left, ' | ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_BitwiseXor(BinaryOp\BitwiseXor $node) { - return $this->pInfixOp(BinaryOp\BitwiseXor::class, $node->left, ' ^ ', $node->right); + protected function pExpr_BinaryOp_BitwiseXor(BinaryOp\BitwiseXor $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\BitwiseXor::class, $node->left, ' ^ ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_ShiftLeft(BinaryOp\ShiftLeft $node) { - return $this->pInfixOp(BinaryOp\ShiftLeft::class, $node->left, ' << ', $node->right); + protected function pExpr_BinaryOp_ShiftLeft(BinaryOp\ShiftLeft $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\ShiftLeft::class, $node->left, ' << ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_ShiftRight(BinaryOp\ShiftRight $node) { - return $this->pInfixOp(BinaryOp\ShiftRight::class, $node->left, ' >> ', $node->right); + protected function pExpr_BinaryOp_ShiftRight(BinaryOp\ShiftRight $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\ShiftRight::class, $node->left, ' >> ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Pow(BinaryOp\Pow $node) { - return $this->pInfixOp(BinaryOp\Pow::class, $node->left, ' ** ', $node->right); + protected function pExpr_BinaryOp_Pow(BinaryOp\Pow $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\Pow::class, $node->left, ' ** ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_LogicalAnd(BinaryOp\LogicalAnd $node) { - return $this->pInfixOp(BinaryOp\LogicalAnd::class, $node->left, ' and ', $node->right); + protected function pExpr_BinaryOp_LogicalAnd(BinaryOp\LogicalAnd $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\LogicalAnd::class, $node->left, ' and ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_LogicalOr(BinaryOp\LogicalOr $node) { - return $this->pInfixOp(BinaryOp\LogicalOr::class, $node->left, ' or ', $node->right); + protected function pExpr_BinaryOp_LogicalOr(BinaryOp\LogicalOr $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\LogicalOr::class, $node->left, ' or ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_LogicalXor(BinaryOp\LogicalXor $node) { - return $this->pInfixOp(BinaryOp\LogicalXor::class, $node->left, ' xor ', $node->right); + protected function pExpr_BinaryOp_LogicalXor(BinaryOp\LogicalXor $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\LogicalXor::class, $node->left, ' xor ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Equal(BinaryOp\Equal $node) { - return $this->pInfixOp(BinaryOp\Equal::class, $node->left, ' == ', $node->right); + protected function pExpr_BinaryOp_Equal(BinaryOp\Equal $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\Equal::class, $node->left, ' == ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_NotEqual(BinaryOp\NotEqual $node) { - return $this->pInfixOp(BinaryOp\NotEqual::class, $node->left, ' != ', $node->right); + protected function pExpr_BinaryOp_NotEqual(BinaryOp\NotEqual $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\NotEqual::class, $node->left, ' != ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Identical(BinaryOp\Identical $node) { - return $this->pInfixOp(BinaryOp\Identical::class, $node->left, ' === ', $node->right); + protected function pExpr_BinaryOp_Identical(BinaryOp\Identical $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\Identical::class, $node->left, ' === ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_NotIdentical(BinaryOp\NotIdentical $node) { - return $this->pInfixOp(BinaryOp\NotIdentical::class, $node->left, ' !== ', $node->right); + protected function pExpr_BinaryOp_NotIdentical(BinaryOp\NotIdentical $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\NotIdentical::class, $node->left, ' !== ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Spaceship(BinaryOp\Spaceship $node) { - return $this->pInfixOp(BinaryOp\Spaceship::class, $node->left, ' <=> ', $node->right); + protected function pExpr_BinaryOp_Spaceship(BinaryOp\Spaceship $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\Spaceship::class, $node->left, ' <=> ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Greater(BinaryOp\Greater $node) { - return $this->pInfixOp(BinaryOp\Greater::class, $node->left, ' > ', $node->right); + protected function pExpr_BinaryOp_Greater(BinaryOp\Greater $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\Greater::class, $node->left, ' > ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\GreaterOrEqual $node) { - return $this->pInfixOp(BinaryOp\GreaterOrEqual::class, $node->left, ' >= ', $node->right); + protected function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\GreaterOrEqual $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\GreaterOrEqual::class, $node->left, ' >= ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Smaller(BinaryOp\Smaller $node) { - return $this->pInfixOp(BinaryOp\Smaller::class, $node->left, ' < ', $node->right); + protected function pExpr_BinaryOp_Smaller(BinaryOp\Smaller $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\Smaller::class, $node->left, ' < ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\SmallerOrEqual $node) { - return $this->pInfixOp(BinaryOp\SmallerOrEqual::class, $node->left, ' <= ', $node->right); + protected function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\SmallerOrEqual $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\SmallerOrEqual::class, $node->left, ' <= ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Coalesce(BinaryOp\Coalesce $node) { - return $this->pInfixOp(BinaryOp\Coalesce::class, $node->left, ' ?? ', $node->right); + protected function pExpr_BinaryOp_Coalesce(BinaryOp\Coalesce $node, int $precedence, int $lhsPrecedence): string { + return $this->pInfixOp(BinaryOp\Coalesce::class, $node->left, ' ?? ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_Instanceof(Expr\Instanceof_ $node) { - list($precedence, $associativity) = $this->precedenceMap[Expr\Instanceof_::class]; - return $this->pPrec($node->expr, $precedence, $associativity, -1) - . ' instanceof ' - . $this->pNewVariable($node->class); + protected function pExpr_Instanceof(Expr\Instanceof_ $node, int $precedence, int $lhsPrecedence): string { + return $this->pPostfixOp( + Expr\Instanceof_::class, $node->expr, + ' instanceof ' . $this->pNewOperand($node->class), + $precedence, $lhsPrecedence); } // Unary expressions - protected function pExpr_BooleanNot(Expr\BooleanNot $node) { - return $this->pPrefixOp(Expr\BooleanNot::class, '!', $node->expr); + protected function pExpr_BooleanNot(Expr\BooleanNot $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Expr\BooleanNot::class, '!', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_BitwiseNot(Expr\BitwiseNot $node) { - return $this->pPrefixOp(Expr\BitwiseNot::class, '~', $node->expr); + protected function pExpr_BitwiseNot(Expr\BitwiseNot $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Expr\BitwiseNot::class, '~', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_UnaryMinus(Expr\UnaryMinus $node) { - if ($node->expr instanceof Expr\UnaryMinus || $node->expr instanceof Expr\PreDec) { - // Enforce -(-$expr) instead of --$expr - return '-(' . $this->p($node->expr) . ')'; - } - return $this->pPrefixOp(Expr\UnaryMinus::class, '-', $node->expr); + protected function pExpr_UnaryMinus(Expr\UnaryMinus $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Expr\UnaryMinus::class, '-', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_UnaryPlus(Expr\UnaryPlus $node) { - if ($node->expr instanceof Expr\UnaryPlus || $node->expr instanceof Expr\PreInc) { - // Enforce +(+$expr) instead of ++$expr - return '+(' . $this->p($node->expr) . ')'; - } - return $this->pPrefixOp(Expr\UnaryPlus::class, '+', $node->expr); + protected function pExpr_UnaryPlus(Expr\UnaryPlus $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Expr\UnaryPlus::class, '+', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_PreInc(Expr\PreInc $node) { - return $this->pPrefixOp(Expr\PreInc::class, '++', $node->var); + protected function pExpr_PreInc(Expr\PreInc $node): string { + return '++' . $this->p($node->var); } - protected function pExpr_PreDec(Expr\PreDec $node) { - return $this->pPrefixOp(Expr\PreDec::class, '--', $node->var); + protected function pExpr_PreDec(Expr\PreDec $node): string { + return '--' . $this->p($node->var); } - protected function pExpr_PostInc(Expr\PostInc $node) { - return $this->pPostfixOp(Expr\PostInc::class, $node->var, '++'); + protected function pExpr_PostInc(Expr\PostInc $node): string { + return $this->p($node->var) . '++'; } - protected function pExpr_PostDec(Expr\PostDec $node) { - return $this->pPostfixOp(Expr\PostDec::class, $node->var, '--'); + protected function pExpr_PostDec(Expr\PostDec $node): string { + return $this->p($node->var) . '--'; } - protected function pExpr_ErrorSuppress(Expr\ErrorSuppress $node) { - return $this->pPrefixOp(Expr\ErrorSuppress::class, '@', $node->expr); + protected function pExpr_ErrorSuppress(Expr\ErrorSuppress $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Expr\ErrorSuppress::class, '@', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_YieldFrom(Expr\YieldFrom $node) { - return $this->pPrefixOp(Expr\YieldFrom::class, 'yield from ', $node->expr); + protected function pExpr_YieldFrom(Expr\YieldFrom $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Expr\YieldFrom::class, 'yield from ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Print(Expr\Print_ $node) { - return $this->pPrefixOp(Expr\Print_::class, 'print ', $node->expr); + protected function pExpr_Print(Expr\Print_ $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Expr\Print_::class, 'print ', $node->expr, $precedence, $lhsPrecedence); } // Casts - protected function pExpr_Cast_Int(Cast\Int_ $node) { - return $this->pPrefixOp(Cast\Int_::class, '(int) ', $node->expr); + protected function pExpr_Cast_Int(Cast\Int_ $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Cast\Int_::class, '(int) ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Cast_Double(Cast\Double $node) { + protected function pExpr_Cast_Double(Cast\Double $node, int $precedence, int $lhsPrecedence): string { $kind = $node->getAttribute('kind', Cast\Double::KIND_DOUBLE); if ($kind === Cast\Double::KIND_DOUBLE) { $cast = '(double)'; } elseif ($kind === Cast\Double::KIND_FLOAT) { $cast = '(float)'; - } elseif ($kind === Cast\Double::KIND_REAL) { + } else { + assert($kind === Cast\Double::KIND_REAL); $cast = '(real)'; } - return $this->pPrefixOp(Cast\Double::class, $cast . ' ', $node->expr); + return $this->pPrefixOp(Cast\Double::class, $cast . ' ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Cast_String(Cast\String_ $node) { - return $this->pPrefixOp(Cast\String_::class, '(string) ', $node->expr); + protected function pExpr_Cast_String(Cast\String_ $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Cast\String_::class, '(string) ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Cast_Array(Cast\Array_ $node) { - return $this->pPrefixOp(Cast\Array_::class, '(array) ', $node->expr); + protected function pExpr_Cast_Array(Cast\Array_ $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Cast\Array_::class, '(array) ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Cast_Object(Cast\Object_ $node) { - return $this->pPrefixOp(Cast\Object_::class, '(object) ', $node->expr); + protected function pExpr_Cast_Object(Cast\Object_ $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Cast\Object_::class, '(object) ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Cast_Bool(Cast\Bool_ $node) { - return $this->pPrefixOp(Cast\Bool_::class, '(bool) ', $node->expr); + protected function pExpr_Cast_Bool(Cast\Bool_ $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Cast\Bool_::class, '(bool) ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Cast_Unset(Cast\Unset_ $node) { - return $this->pPrefixOp(Cast\Unset_::class, '(unset) ', $node->expr); + protected function pExpr_Cast_Unset(Cast\Unset_ $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Cast\Unset_::class, '(unset) ', $node->expr, $precedence, $lhsPrecedence); } // Function calls and similar constructs - protected function pExpr_FuncCall(Expr\FuncCall $node) { + protected function pExpr_FuncCall(Expr\FuncCall $node): string { return $this->pCallLhs($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } - protected function pExpr_MethodCall(Expr\MethodCall $node) { + protected function pExpr_MethodCall(Expr\MethodCall $node): string { return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } - protected function pExpr_NullsafeMethodCall(Expr\NullsafeMethodCall $node) { + protected function pExpr_NullsafeMethodCall(Expr\NullsafeMethodCall $node): string { return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } - protected function pExpr_StaticCall(Expr\StaticCall $node) { + protected function pExpr_StaticCall(Expr\StaticCall $node): string { return $this->pStaticDereferenceLhs($node->class) . '::' . ($node->name instanceof Expr ? ($node->name instanceof Expr\Variable @@ -538,19 +539,19 @@ class Standard extends PrettyPrinterAbstract . '(' . $this->pMaybeMultiline($node->args) . ')'; } - protected function pExpr_Empty(Expr\Empty_ $node) { + protected function pExpr_Empty(Expr\Empty_ $node): string { return 'empty(' . $this->p($node->expr) . ')'; } - protected function pExpr_Isset(Expr\Isset_ $node) { + protected function pExpr_Isset(Expr\Isset_ $node): string { return 'isset(' . $this->pCommaSeparated($node->vars) . ')'; } - protected function pExpr_Eval(Expr\Eval_ $node) { + protected function pExpr_Eval(Expr\Eval_ $node): string { return 'eval(' . $this->p($node->expr) . ')'; } - protected function pExpr_Include(Expr\Include_ $node) { + protected function pExpr_Include(Expr\Include_ $node, int $precedence, int $lhsPrecedence): string { static $map = [ Expr\Include_::TYPE_INCLUDE => 'include', Expr\Include_::TYPE_INCLUDE_ONCE => 'include_once', @@ -558,20 +559,26 @@ class Standard extends PrettyPrinterAbstract Expr\Include_::TYPE_REQUIRE_ONCE => 'require_once', ]; - return $map[$node->type] . ' ' . $this->p($node->expr); + return $this->pPrefixOp(Expr\Include_::class, $map[$node->type] . ' ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_List(Expr\List_ $node) { - return 'list(' . $this->pCommaSeparated($node->items) . ')'; + protected function pExpr_List(Expr\List_ $node): string { + $syntax = $node->getAttribute('kind', + $this->phpVersion->supportsShortArrayDestructuring() ? Expr\List_::KIND_ARRAY : Expr\List_::KIND_LIST); + if ($syntax === Expr\List_::KIND_ARRAY) { + return '[' . $this->pMaybeMultiline($node->items, true) . ']'; + } else { + return 'list(' . $this->pMaybeMultiline($node->items, true) . ')'; + } } // Other - protected function pExpr_Error(Expr\Error $node) { + protected function pExpr_Error(Expr\Error $node): string { throw new \LogicException('Cannot pretty-print AST with Error nodes'); } - protected function pExpr_Variable(Expr\Variable $node) { + protected function pExpr_Variable(Expr\Variable $node): string { if ($node->name instanceof Expr) { return '${' . $this->p($node->name) . '}'; } else { @@ -579,9 +586,9 @@ class Standard extends PrettyPrinterAbstract } } - protected function pExpr_Array(Expr\Array_ $node) { + protected function pExpr_Array(Expr\Array_ $node): string { $syntax = $node->getAttribute('kind', - $this->options['shortArraySyntax'] ? Expr\Array_::KIND_SHORT : Expr\Array_::KIND_LONG); + $this->shortArraySyntax ? Expr\Array_::KIND_SHORT : Expr\Array_::KIND_LONG); if ($syntax === Expr\Array_::KIND_SHORT) { return '[' . $this->pMaybeMultiline($node->items, true) . ']'; } else { @@ -589,124 +596,152 @@ class Standard extends PrettyPrinterAbstract } } - protected function pExpr_ArrayItem(Expr\ArrayItem $node) { - return (null !== $node->key ? $this->p($node->key) . ' => ' : '') + protected function pKey(?Node $node): string { + if ($node === null) { + return ''; + } + + // => is not really an operator and does not typically participate in precedence resolution. + // However, there is an exception if yield expressions with keys are involved: + // [yield $a => $b] is interpreted as [(yield $a => $b)], so we need to ensure that + // [(yield $a) => $b] is printed with parentheses. We approximate this by lowering the LHS + // precedence to that of yield (which will also print unnecessary parentheses for rare low + // precedence unary operators like include). + $yieldPrecedence = $this->precedenceMap[Expr\Yield_::class][0]; + return $this->p($node, self::MAX_PRECEDENCE, $yieldPrecedence) . ' => '; + } + + protected function pArrayItem(Node\ArrayItem $node): string { + return $this->pKey($node->key) . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); } - protected function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node) { + protected function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node): string { return $this->pDereferenceLhs($node->var) . '[' . (null !== $node->dim ? $this->p($node->dim) : '') . ']'; } - protected function pExpr_ConstFetch(Expr\ConstFetch $node) { + protected function pExpr_ConstFetch(Expr\ConstFetch $node): string { return $this->p($node->name); } - protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node) { + protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node): string { return $this->pStaticDereferenceLhs($node->class) . '::' . $this->pObjectProperty($node->name); } - protected function pExpr_PropertyFetch(Expr\PropertyFetch $node) { + protected function pExpr_PropertyFetch(Expr\PropertyFetch $node): string { return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name); } - protected function pExpr_NullsafePropertyFetch(Expr\NullsafePropertyFetch $node) { + protected function pExpr_NullsafePropertyFetch(Expr\NullsafePropertyFetch $node): string { return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name); } - protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node) { + protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node): string { return $this->pStaticDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name); } - protected function pExpr_ShellExec(Expr\ShellExec $node) { + protected function pExpr_ShellExec(Expr\ShellExec $node): string { return '`' . $this->pEncapsList($node->parts, '`') . '`'; } - protected function pExpr_Closure(Expr\Closure $node) { + protected function pExpr_Closure(Expr\Closure $node): string { return $this->pAttrGroups($node->attrGroups, true) - . ($node->static ? 'static ' : '') + . $this->pStatic($node->static) . 'function ' . ($node->byRef ? '&' : '') - . '(' . $this->pCommaSeparated($node->params) . ')' - . (!empty($node->uses) ? ' use(' . $this->pCommaSeparated($node->uses) . ')' : '') - . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') + . '(' . $this->pMaybeMultiline($node->params, $this->phpVersion->supportsTrailingCommaInParamList()) . ')' + . (!empty($node->uses) ? ' use (' . $this->pCommaSeparated($node->uses) . ')' : '') + . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pExpr_Match(Expr\Match_ $node) { + protected function pExpr_Match(Expr\Match_ $node): string { return 'match (' . $this->p($node->cond) . ') {' . $this->pCommaSeparatedMultiline($node->arms, true) . $this->nl . '}'; } - protected function pMatchArm(Node\MatchArm $node) { - return ($node->conds ? $this->pCommaSeparated($node->conds) : 'default') - . ' => ' . $this->p($node->body); + protected function pMatchArm(Node\MatchArm $node): string { + $result = ''; + if ($node->conds) { + for ($i = 0, $c = \count($node->conds); $i + 1 < $c; $i++) { + $result .= $this->p($node->conds[$i]) . ', '; + } + $result .= $this->pKey($node->conds[$i]); + } else { + $result = 'default => '; + } + return $result . $this->p($node->body); } - protected function pExpr_ArrowFunction(Expr\ArrowFunction $node) { - return $this->pAttrGroups($node->attrGroups, true) - . ($node->static ? 'static ' : '') + protected function pExpr_ArrowFunction(Expr\ArrowFunction $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp( + Expr\ArrowFunction::class, + $this->pAttrGroups($node->attrGroups, true) + . $this->pStatic($node->static) . 'fn' . ($node->byRef ? '&' : '') - . '(' . $this->pCommaSeparated($node->params) . ')' + . '(' . $this->pMaybeMultiline($node->params, $this->phpVersion->supportsTrailingCommaInParamList()) . ')' . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') - . ' => ' - . $this->p($node->expr); + . ' => ', + $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_ClosureUse(Expr\ClosureUse $node) { + protected function pClosureUse(Node\ClosureUse $node): string { return ($node->byRef ? '&' : '') . $this->p($node->var); } - protected function pExpr_New(Expr\New_ $node) { + protected function pExpr_New(Expr\New_ $node): string { if ($node->class instanceof Stmt\Class_) { $args = $node->args ? '(' . $this->pMaybeMultiline($node->args) . ')' : ''; return 'new ' . $this->pClassCommon($node->class, $args); } - return 'new ' . $this->pNewVariable($node->class) + return 'new ' . $this->pNewOperand($node->class) . '(' . $this->pMaybeMultiline($node->args) . ')'; } - protected function pExpr_Clone(Expr\Clone_ $node) { - return 'clone ' . $this->p($node->expr); + protected function pExpr_Clone(Expr\Clone_ $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Expr\Clone_::class, 'clone ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Ternary(Expr\Ternary $node) { + protected function pExpr_Ternary(Expr\Ternary $node, int $precedence, int $lhsPrecedence): string { // a bit of cheating: we treat the ternary as a binary op where the ?...: part is the operator. // this is okay because the part between ? and : never needs parentheses. return $this->pInfixOp(Expr\Ternary::class, - $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else + $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else, + $precedence, $lhsPrecedence ); } - protected function pExpr_Exit(Expr\Exit_ $node) { + protected function pExpr_Exit(Expr\Exit_ $node): string { $kind = $node->getAttribute('kind', Expr\Exit_::KIND_DIE); return ($kind === Expr\Exit_::KIND_EXIT ? 'exit' : 'die') . (null !== $node->expr ? '(' . $this->p($node->expr) . ')' : ''); } - protected function pExpr_Throw(Expr\Throw_ $node) { - return 'throw ' . $this->p($node->expr); + protected function pExpr_Throw(Expr\Throw_ $node, int $precedence, int $lhsPrecedence): string { + return $this->pPrefixOp(Expr\Throw_::class, 'throw ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Yield(Expr\Yield_ $node) { + protected function pExpr_Yield(Expr\Yield_ $node, int $precedence, int $lhsPrecedence): string { if ($node->value === null) { - return 'yield'; + $opPrecedence = $this->precedenceMap[Expr\Yield_::class][0]; + return $opPrecedence >= $lhsPrecedence ? '(yield)' : 'yield'; } else { - // this is a bit ugly, but currently there is no way to detect whether the parentheses are necessary - return '(yield ' - . ($node->key !== null ? $this->p($node->key) . ' => ' : '') - . $this->p($node->value) - . ')'; + if (!$this->phpVersion->supportsYieldWithoutParentheses()) { + return '(yield ' . $this->pKey($node->key) . $this->p($node->value) . ')'; + } + return $this->pPrefixOp( + Expr\Yield_::class, 'yield ' . $this->pKey($node->key), + $node->value, $precedence, $lhsPrecedence); } } // Declarations - protected function pStmt_Namespace(Stmt\Namespace_ $node) { + protected function pStmt_Namespace(Stmt\Namespace_ $node): string { if ($this->canUseSemicolonNamespaces) { return 'namespace ' . $this->p($node->name) . ';' . $this->nl . $this->pStmts($node->stmts, false); @@ -716,102 +751,102 @@ class Standard extends PrettyPrinterAbstract } } - protected function pStmt_Use(Stmt\Use_ $node) { + protected function pStmt_Use(Stmt\Use_ $node): string { return 'use ' . $this->pUseType($node->type) . $this->pCommaSeparated($node->uses) . ';'; } - protected function pStmt_GroupUse(Stmt\GroupUse $node) { + protected function pStmt_GroupUse(Stmt\GroupUse $node): string { return 'use ' . $this->pUseType($node->type) . $this->pName($node->prefix) . '\{' . $this->pCommaSeparated($node->uses) . '};'; } - protected function pStmt_UseUse(Stmt\UseUse $node) { + protected function pUseItem(Node\UseItem $node): string { return $this->pUseType($node->type) . $this->p($node->name) . (null !== $node->alias ? ' as ' . $node->alias : ''); } - protected function pUseType($type) { + protected function pUseType(int $type): string { return $type === Stmt\Use_::TYPE_FUNCTION ? 'function ' : ($type === Stmt\Use_::TYPE_CONSTANT ? 'const ' : ''); } - protected function pStmt_Interface(Stmt\Interface_ $node) { + protected function pStmt_Interface(Stmt\Interface_ $node): string { return $this->pAttrGroups($node->attrGroups) . 'interface ' . $node->name . (!empty($node->extends) ? ' extends ' . $this->pCommaSeparated($node->extends) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Enum(Stmt\Enum_ $node) { + protected function pStmt_Enum(Stmt\Enum_ $node): string { return $this->pAttrGroups($node->attrGroups) . 'enum ' . $node->name - . ($node->scalarType ? " : $node->scalarType" : '') + . ($node->scalarType ? ' : ' . $this->p($node->scalarType) : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Class(Stmt\Class_ $node) { + protected function pStmt_Class(Stmt\Class_ $node): string { return $this->pClassCommon($node, ' ' . $node->name); } - protected function pStmt_Trait(Stmt\Trait_ $node) { + protected function pStmt_Trait(Stmt\Trait_ $node): string { return $this->pAttrGroups($node->attrGroups) . 'trait ' . $node->name . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_EnumCase(Stmt\EnumCase $node) { + protected function pStmt_EnumCase(Stmt\EnumCase $node): string { return $this->pAttrGroups($node->attrGroups) . 'case ' . $node->name . ($node->expr ? ' = ' . $this->p($node->expr) : '') . ';'; } - protected function pStmt_TraitUse(Stmt\TraitUse $node) { + protected function pStmt_TraitUse(Stmt\TraitUse $node): string { return 'use ' . $this->pCommaSeparated($node->traits) . (empty($node->adaptations) ? ';' : ' {' . $this->pStmts($node->adaptations) . $this->nl . '}'); } - protected function pStmt_TraitUseAdaptation_Precedence(Stmt\TraitUseAdaptation\Precedence $node) { + protected function pStmt_TraitUseAdaptation_Precedence(Stmt\TraitUseAdaptation\Precedence $node): string { return $this->p($node->trait) . '::' . $node->method . ' insteadof ' . $this->pCommaSeparated($node->insteadof) . ';'; } - protected function pStmt_TraitUseAdaptation_Alias(Stmt\TraitUseAdaptation\Alias $node) { + protected function pStmt_TraitUseAdaptation_Alias(Stmt\TraitUseAdaptation\Alias $node): string { return (null !== $node->trait ? $this->p($node->trait) . '::' : '') . $node->method . ' as' . (null !== $node->newModifier ? ' ' . rtrim($this->pModifiers($node->newModifier), ' ') : '') - . (null !== $node->newName ? ' ' . $node->newName : '') + . (null !== $node->newName ? ' ' . $node->newName : '') . ';'; } - protected function pStmt_Property(Stmt\Property $node) { + protected function pStmt_Property(Stmt\Property $node): string { return $this->pAttrGroups($node->attrGroups) . (0 === $node->flags ? 'var ' : $this->pModifiers($node->flags)) . ($node->type ? $this->p($node->type) . ' ' : '') . $this->pCommaSeparated($node->props) . ';'; } - protected function pStmt_PropertyProperty(Stmt\PropertyProperty $node) { + protected function pPropertyItem(Node\PropertyItem $node): string { return '$' . $node->name . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); } - protected function pStmt_ClassMethod(Stmt\ClassMethod $node) { + protected function pStmt_ClassMethod(Stmt\ClassMethod $node): string { return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'function ' . ($node->byRef ? '&' : '') . $node->name - . '(' . $this->pMaybeMultiline($node->params) . ')' - . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') + . '(' . $this->pMaybeMultiline($node->params, $this->phpVersion->supportsTrailingCommaInParamList()) . ')' + . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . (null !== $node->stmts ? $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); } - protected function pStmt_ClassConst(Stmt\ClassConst $node) { + protected function pStmt_ClassConst(Stmt\ClassConst $node): string { return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'const ' @@ -819,46 +854,50 @@ class Standard extends PrettyPrinterAbstract . $this->pCommaSeparated($node->consts) . ';'; } - protected function pStmt_Function(Stmt\Function_ $node) { + protected function pStmt_Function(Stmt\Function_ $node): string { return $this->pAttrGroups($node->attrGroups) . 'function ' . ($node->byRef ? '&' : '') . $node->name - . '(' . $this->pCommaSeparated($node->params) . ')' - . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') + . '(' . $this->pMaybeMultiline($node->params, $this->phpVersion->supportsTrailingCommaInParamList()) . ')' + . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Const(Stmt\Const_ $node) { + protected function pStmt_Const(Stmt\Const_ $node): string { return 'const ' . $this->pCommaSeparated($node->consts) . ';'; } - protected function pStmt_Declare(Stmt\Declare_ $node) { + protected function pStmt_Declare(Stmt\Declare_ $node): string { return 'declare (' . $this->pCommaSeparated($node->declares) . ')' . (null !== $node->stmts ? ' {' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); } - protected function pStmt_DeclareDeclare(Stmt\DeclareDeclare $node) { + protected function pDeclareItem(Node\DeclareItem $node): string { return $node->key . '=' . $this->p($node->value); } // Control flow - protected function pStmt_If(Stmt\If_ $node) { + protected function pStmt_If(Stmt\If_ $node): string { return 'if (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->elseifs ? ' ' . $this->pImplode($node->elseifs, ' ') : '') . (null !== $node->else ? ' ' . $this->p($node->else) : ''); } - protected function pStmt_ElseIf(Stmt\ElseIf_ $node) { + protected function pStmt_ElseIf(Stmt\ElseIf_ $node): string { return 'elseif (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Else(Stmt\Else_ $node) { + protected function pStmt_Else(Stmt\Else_ $node): string { + if (\count($node->stmts) === 1 && $node->stmts[0] instanceof Stmt\If_) { + // Print as "else if" rather than "else { if }" + return 'else ' . $this->p($node->stmts[0]); + } return 'else {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_For(Stmt\For_ $node) { + protected function pStmt_For(Stmt\For_ $node): string { return 'for (' . $this->pCommaSeparated($node->init) . ';' . (!empty($node->cond) ? ' ' : '') . $this->pCommaSeparated($node->cond) . ';' . (!empty($node->loop) ? ' ' : '') @@ -866,116 +905,116 @@ class Standard extends PrettyPrinterAbstract . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Foreach(Stmt\Foreach_ $node) { + protected function pStmt_Foreach(Stmt\Foreach_ $node): string { return 'foreach (' . $this->p($node->expr) . ' as ' . (null !== $node->keyVar ? $this->p($node->keyVar) . ' => ' : '') . ($node->byRef ? '&' : '') . $this->p($node->valueVar) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_While(Stmt\While_ $node) { + protected function pStmt_While(Stmt\While_ $node): string { return 'while (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Do(Stmt\Do_ $node) { + protected function pStmt_Do(Stmt\Do_ $node): string { return 'do {' . $this->pStmts($node->stmts) . $this->nl . '} while (' . $this->p($node->cond) . ');'; } - protected function pStmt_Switch(Stmt\Switch_ $node) { + protected function pStmt_Switch(Stmt\Switch_ $node): string { return 'switch (' . $this->p($node->cond) . ') {' . $this->pStmts($node->cases) . $this->nl . '}'; } - protected function pStmt_Case(Stmt\Case_ $node) { + protected function pStmt_Case(Stmt\Case_ $node): string { return (null !== $node->cond ? 'case ' . $this->p($node->cond) : 'default') . ':' . $this->pStmts($node->stmts); } - protected function pStmt_TryCatch(Stmt\TryCatch $node) { + protected function pStmt_TryCatch(Stmt\TryCatch $node): string { return 'try {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->catches ? ' ' . $this->pImplode($node->catches, ' ') : '') . ($node->finally !== null ? ' ' . $this->p($node->finally) : ''); } - protected function pStmt_Catch(Stmt\Catch_ $node) { + protected function pStmt_Catch(Stmt\Catch_ $node): string { return 'catch (' . $this->pImplode($node->types, '|') . ($node->var !== null ? ' ' . $this->p($node->var) : '') . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Finally(Stmt\Finally_ $node) { + protected function pStmt_Finally(Stmt\Finally_ $node): string { return 'finally {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Break(Stmt\Break_ $node) { + protected function pStmt_Break(Stmt\Break_ $node): string { return 'break' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; } - protected function pStmt_Continue(Stmt\Continue_ $node) { + protected function pStmt_Continue(Stmt\Continue_ $node): string { return 'continue' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; } - protected function pStmt_Return(Stmt\Return_ $node) { + protected function pStmt_Return(Stmt\Return_ $node): string { return 'return' . (null !== $node->expr ? ' ' . $this->p($node->expr) : '') . ';'; } - protected function pStmt_Throw(Stmt\Throw_ $node) { - return 'throw ' . $this->p($node->expr) . ';'; - } - - protected function pStmt_Label(Stmt\Label $node) { + protected function pStmt_Label(Stmt\Label $node): string { return $node->name . ':'; } - protected function pStmt_Goto(Stmt\Goto_ $node) { + protected function pStmt_Goto(Stmt\Goto_ $node): string { return 'goto ' . $node->name . ';'; } // Other - protected function pStmt_Expression(Stmt\Expression $node) { + protected function pStmt_Expression(Stmt\Expression $node): string { return $this->p($node->expr) . ';'; } - protected function pStmt_Echo(Stmt\Echo_ $node) { + protected function pStmt_Echo(Stmt\Echo_ $node): string { return 'echo ' . $this->pCommaSeparated($node->exprs) . ';'; } - protected function pStmt_Static(Stmt\Static_ $node) { + protected function pStmt_Static(Stmt\Static_ $node): string { return 'static ' . $this->pCommaSeparated($node->vars) . ';'; } - protected function pStmt_Global(Stmt\Global_ $node) { + protected function pStmt_Global(Stmt\Global_ $node): string { return 'global ' . $this->pCommaSeparated($node->vars) . ';'; } - protected function pStmt_StaticVar(Stmt\StaticVar $node) { + protected function pStaticVar(Node\StaticVar $node): string { return $this->p($node->var) . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); } - protected function pStmt_Unset(Stmt\Unset_ $node) { + protected function pStmt_Unset(Stmt\Unset_ $node): string { return 'unset(' . $this->pCommaSeparated($node->vars) . ');'; } - protected function pStmt_InlineHTML(Stmt\InlineHTML $node) { - $newline = $node->getAttribute('hasLeadingNewline', true) ? "\n" : ''; + protected function pStmt_InlineHTML(Stmt\InlineHTML $node): string { + $newline = $node->getAttribute('hasLeadingNewline', true) ? $this->newline : ''; return '?>' . $newline . $node->value . 'remaining; } - protected function pStmt_Nop(Stmt\Nop $node) { + protected function pStmt_Nop(Stmt\Nop $node): string { return ''; } + protected function pStmt_Block(Stmt\Block $node): string { + return '{' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + // Helpers - protected function pClassCommon(Stmt\Class_ $node, $afterClassToken) { + protected function pClassCommon(Stmt\Class_ $node, string $afterClassToken): string { return $this->pAttrGroups($node->attrGroups, $node->name === null) . $this->pModifiers($node->flags) . 'class' . $afterClassToken @@ -984,18 +1023,20 @@ class Standard extends PrettyPrinterAbstract . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pObjectProperty($node) { + protected function pObjectProperty(Node $node): string { if ($node instanceof Expr) { return '{' . $this->p($node) . '}'; } else { - return $node; + assert($node instanceof Node\Identifier); + return $node->name; } } - protected function pEncapsList(array $encapsList, $quote) { + /** @param (Expr|Node\InterpolatedStringPart)[] $encapsList */ + protected function pEncapsList(array $encapsList, ?string $quote): string { $return = ''; foreach ($encapsList as $element) { - if ($element instanceof Scalar\EncapsedStringPart) { + if ($element instanceof Node\InterpolatedStringPart) { $return .= $this->escapeString($element->value, $quote); } else { $return .= '{' . $this->p($element) . '}'; @@ -1005,14 +1046,25 @@ class Standard extends PrettyPrinterAbstract return $return; } - protected function pSingleQuotedString(string $string) { - return '\'' . addcslashes($string, '\'\\') . '\''; + protected function pSingleQuotedString(string $string): string { + // It is idiomatic to only escape backslashes when necessary, i.e. when followed by ', \ or + // the end of the string ('Foo\Bar' instead of 'Foo\\Bar'). However, we also don't want to + // produce an odd number of backslashes, so '\\\\a' should not get rendered as '\\\a', even + // though that would be legal. + $regex = '/\'|\\\\(?=[\'\\\\]|$)|(?<=\\\\)\\\\/'; + return '\'' . preg_replace($regex, '\\\\$0', $string) . '\''; } - protected function escapeString($string, $quote) { + protected function escapeString(string $string, ?string $quote): string { if (null === $quote) { // For doc strings, don't escape newlines $escaped = addcslashes($string, "\t\f\v$\\"); + // But do escape isolated \r. Combined with the terminating newline, it might get + // interpreted as \r\n and dropped from the string contents. + $escaped = preg_replace('/\r(?!\n)/', '\\r', $escaped); + if ($this->phpVersion->supportsFlexibleHeredoc()) { + $escaped = $this->indentString($escaped); + } } else { $escaped = addcslashes($string, "\n\r\t\f\v$" . $quote . "\\"); } @@ -1034,26 +1086,24 @@ class Standard extends PrettyPrinterAbstract | (?<=[\xF0-\xF4])[\x80-\xBF](?![\x80-\xBF]{2}) # Short 4 byte sequence | (?<=[\xF0-\xF4][\x80-\xBF])[\x80-\xBF](?![\x80-\xBF]) # Short 4 byte sequence (2) )/x'; - return preg_replace_callback($regex, function ($matches) { + return preg_replace_callback($regex, function ($matches): string { assert(strlen($matches[0]) === 1); - $hex = dechex(ord($matches[0]));; + $hex = dechex(ord($matches[0])); return '\\x' . str_pad($hex, 2, '0', \STR_PAD_LEFT); }, $escaped); } - protected function containsEndLabel($string, $label, $atStart = true, $atEnd = true) { - $start = $atStart ? '(?:^|[\r\n])' : '[\r\n]'; - $end = $atEnd ? '(?:$|[;\r\n])' : '[;\r\n]'; + protected function containsEndLabel(string $string, string $label, bool $atStart = true): bool { + $start = $atStart ? '(?:^|[\r\n])[ \t]*' : '[\r\n][ \t]*'; return false !== strpos($string, $label) - && preg_match('/' . $start . $label . $end . '/', $string); + && preg_match('/' . $start . $label . '(?:$|[^_A-Za-z0-9\x80-\xff])/', $string); } - protected function encapsedContainsEndLabel(array $parts, $label) { + /** @param (Expr|Node\InterpolatedStringPart)[] $parts */ + protected function encapsedContainsEndLabel(array $parts, string $label): bool { foreach ($parts as $i => $part) { - $atStart = $i === 0; - $atEnd = $i === count($parts) - 1; - if ($part instanceof Scalar\EncapsedStringPart - && $this->containsEndLabel($part->value, $label, $atStart, $atEnd) + if ($part instanceof Node\InterpolatedStringPart + && $this->containsEndLabel($this->escapeString($part->value, null), $label, $i === 0) ) { return true; } @@ -1061,15 +1111,15 @@ class Standard extends PrettyPrinterAbstract return false; } - protected function pDereferenceLhs(Node $node) { + protected function pDereferenceLhs(Node $node): string { if (!$this->dereferenceLhsRequiresParens($node)) { return $this->p($node); - } else { + } else { return '(' . $this->p($node) . ')'; } } - protected function pStaticDereferenceLhs(Node $node) { + protected function pStaticDereferenceLhs(Node $node): string { if (!$this->staticDereferenceLhsRequiresParens($node)) { return $this->p($node); } else { @@ -1077,15 +1127,15 @@ class Standard extends PrettyPrinterAbstract } } - protected function pCallLhs(Node $node) { + protected function pCallLhs(Node $node): string { if (!$this->callLhsRequiresParens($node)) { return $this->p($node); - } else { + } else { return '(' . $this->p($node) . ')'; } } - protected function pNewVariable(Node $node): string { + protected function pNewOperand(Node $node): string { if (!$this->newOperandRequiresParens($node)) { return $this->p($node); } else { @@ -1095,9 +1145,8 @@ class Standard extends PrettyPrinterAbstract /** * @param Node[] $nodes - * @return bool */ - protected function hasNodeWithComments(array $nodes) { + protected function hasNodeWithComments(array $nodes): bool { foreach ($nodes as $node) { if ($node && $node->getComments()) { return true; @@ -1106,7 +1155,8 @@ class Standard extends PrettyPrinterAbstract return false; } - protected function pMaybeMultiline(array $nodes, bool $trailingComma = false) { + /** @param Node[] $nodes */ + protected function pMaybeMultiline(array $nodes, bool $trailingComma = false): string { if (!$this->hasNodeWithComments($nodes)) { return $this->pCommaSeparated($nodes); } else { @@ -1114,6 +1164,7 @@ class Standard extends PrettyPrinterAbstract } } + /** @param Node\AttributeGroup[] $nodes */ protected function pAttrGroups(array $nodes, bool $inline = false): string { $result = ''; $sep = $inline ? ' ' : $this->nl; diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php index 770d5009..8303c427 100644 --- a/Sources/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php @@ -3,162 +3,200 @@ namespace PhpParser; use PhpParser\Internal\DiffElem; +use PhpParser\Internal\Differ; use PhpParser\Internal\PrintableNewAnonClassNode; use PhpParser\Internal\TokenStream; +use PhpParser\Node\AttributeGroup; use PhpParser\Node\Expr; use PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\Cast; +use PhpParser\Node\IntersectionType; +use PhpParser\Node\MatchArm; +use PhpParser\Node\Param; use PhpParser\Node\Scalar; use PhpParser\Node\Stmt; - -abstract class PrettyPrinterAbstract -{ - const FIXUP_PREC_LEFT = 0; // LHS operand affected by precedence - const FIXUP_PREC_RIGHT = 1; // RHS operand affected by precedence - const FIXUP_CALL_LHS = 2; // LHS of call - const FIXUP_DEREF_LHS = 3; // LHS of dereferencing operation - const FIXUP_BRACED_NAME = 4; // Name operand that may require bracing - const FIXUP_VAR_BRACED_NAME = 5; // Name operand that may require ${} bracing - const FIXUP_ENCAPSED = 6; // Encapsed string part - const FIXUP_NEW = 7; // New/instanceof operand - const FIXUP_STATIC_DEREF_LHS = 8; // LHS of static dereferencing operation - - protected $precedenceMap = [ - // [precedence, associativity] - // where for precedence -1 is %left, 0 is %nonassoc and 1 is %right - BinaryOp\Pow::class => [ 0, 1], - Expr\BitwiseNot::class => [ 10, 1], - Expr\PreInc::class => [ 10, 1], - Expr\PreDec::class => [ 10, 1], - Expr\PostInc::class => [ 10, -1], - Expr\PostDec::class => [ 10, -1], - Expr\UnaryPlus::class => [ 10, 1], - Expr\UnaryMinus::class => [ 10, 1], - Cast\Int_::class => [ 10, 1], - Cast\Double::class => [ 10, 1], - Cast\String_::class => [ 10, 1], - Cast\Array_::class => [ 10, 1], - Cast\Object_::class => [ 10, 1], - Cast\Bool_::class => [ 10, 1], - Cast\Unset_::class => [ 10, 1], - Expr\ErrorSuppress::class => [ 10, 1], - Expr\Instanceof_::class => [ 20, 0], - Expr\BooleanNot::class => [ 30, 1], - BinaryOp\Mul::class => [ 40, -1], - BinaryOp\Div::class => [ 40, -1], - BinaryOp\Mod::class => [ 40, -1], - BinaryOp\Plus::class => [ 50, -1], - BinaryOp\Minus::class => [ 50, -1], - BinaryOp\Concat::class => [ 50, -1], - BinaryOp\ShiftLeft::class => [ 60, -1], - BinaryOp\ShiftRight::class => [ 60, -1], - BinaryOp\Smaller::class => [ 70, 0], - BinaryOp\SmallerOrEqual::class => [ 70, 0], - BinaryOp\Greater::class => [ 70, 0], - BinaryOp\GreaterOrEqual::class => [ 70, 0], - BinaryOp\Equal::class => [ 80, 0], - BinaryOp\NotEqual::class => [ 80, 0], - BinaryOp\Identical::class => [ 80, 0], - BinaryOp\NotIdentical::class => [ 80, 0], - BinaryOp\Spaceship::class => [ 80, 0], - BinaryOp\BitwiseAnd::class => [ 90, -1], - BinaryOp\BitwiseXor::class => [100, -1], - BinaryOp\BitwiseOr::class => [110, -1], - BinaryOp\BooleanAnd::class => [120, -1], - BinaryOp\BooleanOr::class => [130, -1], - BinaryOp\Coalesce::class => [140, 1], - Expr\Ternary::class => [150, 0], - // parser uses %left for assignments, but they really behave as %right - Expr\Assign::class => [160, 1], - Expr\AssignRef::class => [160, 1], - AssignOp\Plus::class => [160, 1], - AssignOp\Minus::class => [160, 1], - AssignOp\Mul::class => [160, 1], - AssignOp\Div::class => [160, 1], - AssignOp\Concat::class => [160, 1], - AssignOp\Mod::class => [160, 1], - AssignOp\BitwiseAnd::class => [160, 1], - AssignOp\BitwiseOr::class => [160, 1], - AssignOp\BitwiseXor::class => [160, 1], - AssignOp\ShiftLeft::class => [160, 1], - AssignOp\ShiftRight::class => [160, 1], - AssignOp\Pow::class => [160, 1], - AssignOp\Coalesce::class => [160, 1], - Expr\YieldFrom::class => [165, 1], - Expr\Print_::class => [168, 1], - BinaryOp\LogicalAnd::class => [170, -1], - BinaryOp\LogicalXor::class => [180, -1], - BinaryOp\LogicalOr::class => [190, -1], - Expr\Include_::class => [200, -1], +use PhpParser\Node\UnionType; + +abstract class PrettyPrinterAbstract implements PrettyPrinter { + protected const FIXUP_PREC_LEFT = 0; // LHS operand affected by precedence + protected const FIXUP_PREC_RIGHT = 1; // RHS operand affected by precedence + protected const FIXUP_PREC_UNARY = 2; // Only operand affected by precedence + protected const FIXUP_CALL_LHS = 3; // LHS of call + protected const FIXUP_DEREF_LHS = 4; // LHS of dereferencing operation + protected const FIXUP_STATIC_DEREF_LHS = 5; // LHS of static dereferencing operation + protected const FIXUP_BRACED_NAME = 6; // Name operand that may require bracing + protected const FIXUP_VAR_BRACED_NAME = 7; // Name operand that may require ${} bracing + protected const FIXUP_ENCAPSED = 8; // Encapsed string part + protected const FIXUP_NEW = 9; // New/instanceof operand + + protected const MAX_PRECEDENCE = 1000; + + /** @var array */ + protected array $precedenceMap = [ + // [precedence, precedenceLHS, precedenceRHS] + // Where the latter two are the precedences to use for the LHS and RHS of a binary operator, + // where 1 is added to one of the sides depending on associativity. This information is not + // used for unary operators and set to -1. + Expr\Clone_::class => [-10, 0, 1], + BinaryOp\Pow::class => [ 0, 0, 1], + Expr\BitwiseNot::class => [ 10, -1, -1], + Expr\UnaryPlus::class => [ 10, -1, -1], + Expr\UnaryMinus::class => [ 10, -1, -1], + Cast\Int_::class => [ 10, -1, -1], + Cast\Double::class => [ 10, -1, -1], + Cast\String_::class => [ 10, -1, -1], + Cast\Array_::class => [ 10, -1, -1], + Cast\Object_::class => [ 10, -1, -1], + Cast\Bool_::class => [ 10, -1, -1], + Cast\Unset_::class => [ 10, -1, -1], + Expr\ErrorSuppress::class => [ 10, -1, -1], + Expr\Instanceof_::class => [ 20, -1, -1], + Expr\BooleanNot::class => [ 30, -1, -1], + BinaryOp\Mul::class => [ 40, 41, 40], + BinaryOp\Div::class => [ 40, 41, 40], + BinaryOp\Mod::class => [ 40, 41, 40], + BinaryOp\Plus::class => [ 50, 51, 50], + BinaryOp\Minus::class => [ 50, 51, 50], + BinaryOp\Concat::class => [ 50, 51, 50], + BinaryOp\ShiftLeft::class => [ 60, 61, 60], + BinaryOp\ShiftRight::class => [ 60, 61, 60], + BinaryOp\Smaller::class => [ 70, 70, 70], + BinaryOp\SmallerOrEqual::class => [ 70, 70, 70], + BinaryOp\Greater::class => [ 70, 70, 70], + BinaryOp\GreaterOrEqual::class => [ 70, 70, 70], + BinaryOp\Equal::class => [ 80, 80, 80], + BinaryOp\NotEqual::class => [ 80, 80, 80], + BinaryOp\Identical::class => [ 80, 80, 80], + BinaryOp\NotIdentical::class => [ 80, 80, 80], + BinaryOp\Spaceship::class => [ 80, 80, 80], + BinaryOp\BitwiseAnd::class => [ 90, 91, 90], + BinaryOp\BitwiseXor::class => [100, 101, 100], + BinaryOp\BitwiseOr::class => [110, 111, 110], + BinaryOp\BooleanAnd::class => [120, 121, 120], + BinaryOp\BooleanOr::class => [130, 131, 130], + BinaryOp\Coalesce::class => [140, 140, 141], + Expr\Ternary::class => [150, -1, -1], + Expr\Assign::class => [160, -1, -1], + Expr\AssignRef::class => [160, -1, -1], + AssignOp\Plus::class => [160, -1, -1], + AssignOp\Minus::class => [160, -1, -1], + AssignOp\Mul::class => [160, -1, -1], + AssignOp\Div::class => [160, -1, -1], + AssignOp\Concat::class => [160, -1, -1], + AssignOp\Mod::class => [160, -1, -1], + AssignOp\BitwiseAnd::class => [160, -1, -1], + AssignOp\BitwiseOr::class => [160, -1, -1], + AssignOp\BitwiseXor::class => [160, -1, -1], + AssignOp\ShiftLeft::class => [160, -1, -1], + AssignOp\ShiftRight::class => [160, -1, -1], + AssignOp\Pow::class => [160, -1, -1], + AssignOp\Coalesce::class => [160, -1, -1], + Expr\YieldFrom::class => [170, -1, -1], + Expr\Yield_::class => [175, -1, -1], + Expr\Print_::class => [180, -1, -1], + BinaryOp\LogicalAnd::class => [190, 191, 190], + BinaryOp\LogicalXor::class => [200, 201, 200], + BinaryOp\LogicalOr::class => [210, 211, 210], + Expr\Include_::class => [220, -1, -1], + Expr\ArrowFunction::class => [230, -1, -1], + Expr\Throw_::class => [240, -1, -1], ]; /** @var int Current indentation level. */ - protected $indentLevel; + protected int $indentLevel; + /** @var string Newline style. Does not include current indentation. */ + protected string $newline; /** @var string Newline including current indentation. */ - protected $nl; - /** @var string Token placed at end of doc string to ensure it is followed by a newline. */ - protected $docStringEndToken; + protected string $nl; + /** @var string|null Token placed at end of doc string to ensure it is followed by a newline. + * Null if flexible doc strings are used. */ + protected ?string $docStringEndToken; /** @var bool Whether semicolon namespaces can be used (i.e. no global namespace is used) */ - protected $canUseSemicolonNamespaces; - /** @var array Pretty printer options */ - protected $options; - - /** @var TokenStream Original tokens for use in format-preserving pretty print */ - protected $origTokens; - /** @var Internal\Differ Differ for node lists */ - protected $nodeListDiffer; - /** @var bool[] Map determining whether a certain character is a label character */ - protected $labelCharMap; + protected bool $canUseSemicolonNamespaces; + /** @var bool Whether to use short array syntax if the node specifies no preference */ + protected bool $shortArraySyntax; + /** @var PhpVersion PHP version to target */ + protected PhpVersion $phpVersion; + + /** @var TokenStream|null Original tokens for use in format-preserving pretty print */ + protected ?TokenStream $origTokens; + /** @var Internal\Differ Differ for node lists */ + protected Differ $nodeListDiffer; + /** @var array Map determining whether a certain character is a label character */ + protected array $labelCharMap; /** - * @var int[][] Map from token classes and subnode names to FIXUP_* constants. This is used - * during format-preserving prints to place additional parens/braces if necessary. + * @var array> Map from token classes and subnode names to FIXUP_* constants. + * This is used during format-preserving prints to place additional parens/braces if necessary. */ - protected $fixupMap; + protected array $fixupMap; /** - * @var int[][] Map from "{$node->getType()}->{$subNode}" to ['left' => $l, 'right' => $r], - * where $l and $r specify the token type that needs to be stripped when removing - * this node. + * @var array Map from "{$node->getType()}->{$subNode}" + * to ['left' => $l, 'right' => $r], where $l and $r specify the token type that needs to be stripped + * when removing this node. */ - protected $removalMap; + protected array $removalMap; /** - * @var mixed[] Map from "{$node->getType()}->{$subNode}" to [$find, $beforeToken, $extraLeft, $extraRight]. - * $find is an optional token after which the insertion occurs. $extraLeft/Right - * are optionally added before/after the main insertions. + * @var array Map from + * "{$node->getType()}->{$subNode}" to [$find, $beforeToken, $extraLeft, $extraRight]. + * $find is an optional token after which the insertion occurs. $extraLeft/Right + * are optionally added before/after the main insertions. */ - protected $insertionMap; + protected array $insertionMap; /** - * @var string[] Map From "{$node->getType()}->{$subNode}" to string that should be inserted - * between elements of this list subnode. + * @var array Map From "{$class}->{$subNode}" to string that should be inserted + * between elements of this list subnode. */ - protected $listInsertionMap; - protected $emptyListInsertionMap; - /** @var int[] Map from "{$node->getType()}->{$subNode}" to token before which the modifiers - * should be reprinted. */ - protected $modifierChangeMap; + protected array $listInsertionMap; + + /** + * @var array + */ + protected array $emptyListInsertionMap; + /** @var array Map from "{$class}->{$subNode}" to [$printFn, $token] + * where $printFn is the function to print the modifiers and $token is the token before which + * the modifiers should be reprinted. */ + protected array $modifierChangeMap; /** * Creates a pretty printer instance using the given options. * * Supported options: - * * bool $shortArraySyntax = false: Whether to use [] instead of array() as the default array - * syntax, if the node does not specify a format. + * * PhpVersion $phpVersion: The PHP version to target (default to PHP 7.4). This option + * controls compatibility of the generated code with older PHP + * versions in cases where a simple stylistic choice exists (e.g. + * array() vs []). It is safe to pretty-print an AST for a newer + * PHP version while specifying an older target (but the result will + * of course not be compatible with the older version in that case). + * * string $newline: The newline style to use. Should be "\n" (default) or "\r\n". + * * bool $shortArraySyntax: Whether to use [] instead of array() as the default array + * syntax, if the node does not specify a format. Defaults to whether + * the phpVersion support short array syntax. * - * @param array $options Dictionary of formatting options + * @param array{ + * phpVersion?: PhpVersion, newline?: string, shortArraySyntax?: bool + * } $options Dictionary of formatting options */ public function __construct(array $options = []) { - $this->docStringEndToken = '_DOC_STRING_END_' . mt_rand(); + $this->phpVersion = $options['phpVersion'] ?? PhpVersion::fromComponents(7, 4); - $defaultOptions = ['shortArraySyntax' => false]; - $this->options = $options + $defaultOptions; + $this->newline = $options['newline'] ?? "\n"; + if ($this->newline !== "\n" && $this->newline != "\r\n") { + throw new \LogicException('Option "newline" must be one of "\n" or "\r\n"'); + } + + $this->shortArraySyntax = + $options['shortArraySyntax'] ?? $this->phpVersion->supportsShortArraySyntax(); + $this->docStringEndToken = + $this->phpVersion->supportsFlexibleHeredoc() ? null : '_DOC_STRING_END_' . mt_rand(); } /** * Reset pretty printing state. */ - protected function resetState() { + protected function resetState(): void { $this->indentLevel = 0; - $this->nl = "\n"; + $this->nl = $this->newline; $this->origTokens = null; } @@ -167,15 +205,15 @@ abstract class PrettyPrinterAbstract * * @param int $level Level in number of spaces */ - protected function setIndentLevel(int $level) { + protected function setIndentLevel(int $level): void { $this->indentLevel = $level; - $this->nl = "\n" . \str_repeat(' ', $level); + $this->nl = $this->newline . \str_repeat(' ', $level); } /** * Increase indentation level. */ - protected function indent() { + protected function indent(): void { $this->indentLevel += 4; $this->nl .= ' '; } @@ -183,10 +221,10 @@ abstract class PrettyPrinterAbstract /** * Decrease indentation level. */ - protected function outdent() { + protected function outdent(): void { assert($this->indentLevel >= 4); $this->indentLevel -= 4; - $this->nl = "\n" . str_repeat(' ', $this->indentLevel); + $this->nl = $this->newline . str_repeat(' ', $this->indentLevel); } /** @@ -196,7 +234,7 @@ abstract class PrettyPrinterAbstract * * @return string Pretty printed statements */ - public function prettyPrint(array $stmts) : string { + public function prettyPrint(array $stmts): string { $this->resetState(); $this->preprocessNodes($stmts); @@ -210,7 +248,7 @@ abstract class PrettyPrinterAbstract * * @return string Pretty printed node */ - public function prettyPrintExpr(Expr $node) : string { + public function prettyPrintExpr(Expr $node): string { $this->resetState(); return $this->handleMagicTokens($this->p($node)); } @@ -222,15 +260,15 @@ abstract class PrettyPrinterAbstract * * @return string Pretty printed statements */ - public function prettyPrintFile(array $stmts) : string { + public function prettyPrintFile(array $stmts): string { if (!$stmts) { - return "newline . $this->newline; } - $p = "prettyPrint($stmts); + $p = "newline . $this->newline . $this->prettyPrint($stmts); if ($stmts[0] instanceof Stmt\InlineHTML) { - $p = preg_replace('/^<\?php\s+\?>\n?/', '', $p); + $p = preg_replace('/^<\?php\s+\?>\r?\n?/', '', $p); } if ($stmts[count($stmts) - 1] instanceof Stmt\InlineHTML) { $p = preg_replace('/<\?php$/', '', rtrim($p)); @@ -244,7 +282,7 @@ abstract class PrettyPrinterAbstract * * @param Node[] $nodes Array of nodes */ - protected function preprocessNodes(array $nodes) { + protected function preprocessNodes(array $nodes): void { /* We can use semicolon-namespaces unless there is a global namespace declaration */ $this->canUseSemicolonNamespaces = true; foreach ($nodes as $node) { @@ -256,15 +294,17 @@ abstract class PrettyPrinterAbstract } /** - * Handles (and removes) no-indent and doc-string-end tokens. - * - * @param string $str - * @return string + * Handles (and removes) doc-string-end tokens. */ - protected function handleMagicTokens(string $str) : string { - // Replace doc-string-end tokens with nothing or a newline - $str = str_replace($this->docStringEndToken . ";\n", ";\n", $str); - $str = str_replace($this->docStringEndToken, "\n", $str); + protected function handleMagicTokens(string $str): string { + if ($this->docStringEndToken !== null) { + // Replace doc-string-end tokens with nothing or a newline + $str = str_replace( + $this->docStringEndToken . ';' . $this->newline, + ';' . $this->newline, + $str); + $str = str_replace($this->docStringEndToken, $this->newline, $str); + } return $str; } @@ -272,12 +312,12 @@ abstract class PrettyPrinterAbstract /** * Pretty prints an array of nodes (statements) and indents them optionally. * - * @param Node[] $nodes Array of nodes - * @param bool $indent Whether to indent the printed nodes + * @param Node[] $nodes Array of nodes + * @param bool $indent Whether to indent the printed nodes * * @return string Pretty printed statements */ - protected function pStmts(array $nodes, bool $indent = true) : string { + protected function pStmts(array $nodes, bool $indent = true): string { if ($indent) { $this->indent(); } @@ -305,84 +345,96 @@ abstract class PrettyPrinterAbstract /** * Pretty-print an infix operation while taking precedence into account. * - * @param string $class Node class of operator - * @param Node $leftNode Left-hand side node + * @param string $class Node class of operator + * @param Node $leftNode Left-hand side node * @param string $operatorString String representation of the operator - * @param Node $rightNode Right-hand side node + * @param Node $rightNode Right-hand side node + * @param int $precedence Precedence of parent operator + * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator * * @return string Pretty printed infix operation */ - protected function pInfixOp(string $class, Node $leftNode, string $operatorString, Node $rightNode) : string { - list($precedence, $associativity) = $this->precedenceMap[$class]; - - return $this->pPrec($leftNode, $precedence, $associativity, -1) - . $operatorString - . $this->pPrec($rightNode, $precedence, $associativity, 1); + protected function pInfixOp( + string $class, Node $leftNode, string $operatorString, Node $rightNode, + int $precedence, int $lhsPrecedence + ): string { + list($opPrecedence, $newPrecedenceLHS, $newPrecedenceRHS) = $this->precedenceMap[$class]; + $prefix = ''; + $suffix = ''; + if ($opPrecedence >= $precedence) { + $prefix = '('; + $suffix = ')'; + $lhsPrecedence = self::MAX_PRECEDENCE; + } + return $prefix . $this->p($leftNode, $newPrecedenceLHS, $newPrecedenceLHS) + . $operatorString . $this->p($rightNode, $newPrecedenceRHS, $lhsPrecedence) . $suffix; } /** * Pretty-print a prefix operation while taking precedence into account. * - * @param string $class Node class of operator + * @param string $class Node class of operator * @param string $operatorString String representation of the operator - * @param Node $node Node + * @param Node $node Node + * @param int $precedence Precedence of parent operator + * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator * * @return string Pretty printed prefix operation */ - protected function pPrefixOp(string $class, string $operatorString, Node $node) : string { - list($precedence, $associativity) = $this->precedenceMap[$class]; - return $operatorString . $this->pPrec($node, $precedence, $associativity, 1); + protected function pPrefixOp(string $class, string $operatorString, Node $node, int $precedence, int $lhsPrecedence): string { + $opPrecedence = $this->precedenceMap[$class][0]; + $prefix = ''; + $suffix = ''; + if ($opPrecedence >= $lhsPrecedence) { + $prefix = '('; + $suffix = ')'; + $lhsPrecedence = self::MAX_PRECEDENCE; + } + $printedArg = $this->p($node, $opPrecedence, $lhsPrecedence); + if (($operatorString === '+' && $printedArg[0] === '+') || + ($operatorString === '-' && $printedArg[0] === '-') + ) { + // Avoid printing +(+$a) as ++$a and similar. + $printedArg = '(' . $printedArg . ')'; + } + return $prefix . $operatorString . $printedArg . $suffix; } /** * Pretty-print a postfix operation while taking precedence into account. * - * @param string $class Node class of operator + * @param string $class Node class of operator * @param string $operatorString String representation of the operator - * @param Node $node Node + * @param Node $node Node + * @param int $precedence Precedence of parent operator + * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator * * @return string Pretty printed postfix operation */ - protected function pPostfixOp(string $class, Node $node, string $operatorString) : string { - list($precedence, $associativity) = $this->precedenceMap[$class]; - return $this->pPrec($node, $precedence, $associativity, -1) . $operatorString; - } - - /** - * Prints an expression node with the least amount of parentheses necessary to preserve the meaning. - * - * @param Node $node Node to pretty print - * @param int $parentPrecedence Precedence of the parent operator - * @param int $parentAssociativity Associativity of parent operator - * (-1 is left, 0 is nonassoc, 1 is right) - * @param int $childPosition Position of the node relative to the operator - * (-1 is left, 1 is right) - * - * @return string The pretty printed node - */ - protected function pPrec(Node $node, int $parentPrecedence, int $parentAssociativity, int $childPosition) : string { - $class = \get_class($node); - if (isset($this->precedenceMap[$class])) { - $childPrecedence = $this->precedenceMap[$class][0]; - if ($childPrecedence > $parentPrecedence - || ($parentPrecedence === $childPrecedence && $parentAssociativity !== $childPosition) - ) { - return '(' . $this->p($node) . ')'; - } + protected function pPostfixOp(string $class, Node $node, string $operatorString, int $precedence, int $lhsPrecedence): string { + $opPrecedence = $this->precedenceMap[$class][0]; + $prefix = ''; + $suffix = ''; + if ($opPrecedence >= $precedence) { + $prefix = '('; + $suffix = ')'; + $lhsPrecedence = self::MAX_PRECEDENCE; } - - return $this->p($node); + if ($opPrecedence < $lhsPrecedence) { + $lhsPrecedence = $opPrecedence; + } + return $prefix . $this->p($node, $opPrecedence, $lhsPrecedence) . $operatorString . $suffix; } /** * Pretty prints an array of nodes and implodes the printed values. * * @param Node[] $nodes Array of Nodes to be printed - * @param string $glue Character to implode with + * @param string $glue Character to implode with * - * @return string Imploded pretty printed nodes + * @return string Imploded pretty printed nodes> $pre */ - protected function pImplode(array $nodes, string $glue = '') : string { + protected function pImplode(array $nodes, string $glue = ''): string { $pNodes = []; foreach ($nodes as $node) { if (null === $node) { @@ -402,7 +454,7 @@ abstract class PrettyPrinterAbstract * * @return string Comma separated pretty printed nodes */ - protected function pCommaSeparated(array $nodes) : string { + protected function pCommaSeparated(array $nodes): string { return $this->pImplode($nodes, ', '); } @@ -411,12 +463,12 @@ abstract class PrettyPrinterAbstract * * The result includes a leading newline and one level of indentation (same as pStmts). * - * @param Node[] $nodes Array of Nodes to be printed - * @param bool $trailingComma Whether to use a trailing comma + * @param Node[] $nodes Array of Nodes to be printed + * @param bool $trailingComma Whether to use a trailing comma * * @return string Comma separated pretty printed nodes in multiline style */ - protected function pCommaSeparatedMultiline(array $nodes, bool $trailingComma) : string { + protected function pCommaSeparatedMultiline(array $nodes, bool $trailingComma): string { $this->indent(); $result = ''; @@ -448,7 +500,7 @@ abstract class PrettyPrinterAbstract * * @return string Reformatted text of comments */ - protected function pComments(array $comments) : string { + protected function pComments(array $comments): string { $formattedComments = []; foreach ($comments as $comment) { @@ -469,13 +521,11 @@ abstract class PrettyPrinterAbstract * * The CloningVisitor must be run on the AST prior to modification. * * The original tokens must be provided, using the getTokens() method on the lexer. * - * @param Node[] $stmts Modified AST with links to original AST - * @param Node[] $origStmts Original AST with token offset information - * @param array $origTokens Tokens of the original code - * - * @return string + * @param Node[] $stmts Modified AST with links to original AST + * @param Node[] $origStmts Original AST with token offset information + * @param Token[] $origTokens Tokens of the original code */ - public function printFormatPreserving(array $stmts, array $origStmts, array $origTokens) : string { + public function printFormatPreserving(array $stmts, array $origStmts, array $origTokens): string { $this->initializeNodeListDiffer(); $this->initializeLabelCharMap(); $this->initializeFixupMap(); @@ -493,18 +543,18 @@ abstract class PrettyPrinterAbstract $pos = 0; $result = $this->pArray($stmts, $origStmts, $pos, 0, 'File', 'stmts', null); if (null !== $result) { - $result .= $this->origTokens->getTokenCode($pos, count($origTokens), 0); + $result .= $this->origTokens->getTokenCode($pos, count($origTokens) - 1, 0); } else { // Fallback // TODO Add pStmts($stmts, false); + $result = "newline . $this->pStmts($stmts, false); } - return ltrim($this->handleMagicTokens($result)); + return $this->handleMagicTokens($result); } - protected function pFallback(Node $node) { - return $this->{'p' . $node->getType()}($node); + protected function pFallback(Node $node, int $precedence, int $lhsPrecedence): string { + return $this->{'p' . $node->getType()}($node, $precedence, $lhsPrecedence); } /** @@ -513,20 +563,25 @@ abstract class PrettyPrinterAbstract * This method also handles formatting preservation for nodes. * * @param Node $node Node to be pretty printed + * @param int $precedence Precedence of parent operator + * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator * @param bool $parentFormatPreserved Whether parent node has preserved formatting * * @return string Pretty printed node */ - protected function p(Node $node, $parentFormatPreserved = false) : string { + protected function p( + Node $node, int $precedence = self::MAX_PRECEDENCE, int $lhsPrecedence = self::MAX_PRECEDENCE, + bool $parentFormatPreserved = false + ): string { // No orig tokens means this is a normal pretty print without preservation of formatting if (!$this->origTokens) { - return $this->{'p' . $node->getType()}($node); + return $this->{'p' . $node->getType()}($node, $precedence, $lhsPrecedence); } - /** @var Node $origNode */ + /** @var Node|null $origNode */ $origNode = $node->getAttribute('origNode'); if (null === $origNode) { - return $this->pFallback($node); + return $this->pFallback($node, $precedence, $lhsPrecedence); } $class = \get_class($node); @@ -539,15 +594,17 @@ abstract class PrettyPrinterAbstract $fallbackNode = $node; if ($node instanceof Expr\New_ && $node->class instanceof Stmt\Class_) { // Normalize node structure of anonymous classes + assert($origNode instanceof Expr\New_); $node = PrintableNewAnonClassNode::fromNewNode($node); $origNode = PrintableNewAnonClassNode::fromNewNode($origNode); + $class = PrintableNewAnonClassNode::class; } // InlineHTML node does not contain closing and opening PHP tags. If the parent formatting // is not preserved, then we need to use the fallback code to make sure the tags are // printed. if ($node instanceof Stmt\InlineHTML && !$parentFormatPreserved) { - return $this->pFallback($fallbackNode); + return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } $indentAdjustment = $this->indentLevel - $this->origTokens->getIndentationBefore($startPos); @@ -572,34 +629,27 @@ abstract class PrettyPrinterAbstract if (is_array($subNode) && is_array($origSubNode)) { // Array subnode changed, we might be able to reconstruct it $listResult = $this->pArray( - $subNode, $origSubNode, $pos, $indentAdjustment, $type, $subNodeName, + $subNode, $origSubNode, $pos, $indentAdjustment, $class, $subNodeName, $fixupInfo[$subNodeName] ?? null ); if (null === $listResult) { - return $this->pFallback($fallbackNode); + return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } $result .= $listResult; continue; } - if (is_int($subNode) && is_int($origSubNode)) { - // Check if this is a modifier change - $key = $type . '->' . $subNodeName; - if (!isset($this->modifierChangeMap[$key])) { - return $this->pFallback($fallbackNode); - } - - $findToken = $this->modifierChangeMap[$key]; - $result .= $this->pModifiers($subNode); - $pos = $this->origTokens->findRight($pos, $findToken); - continue; + // Check if this is a modifier change + $key = $class . '->' . $subNodeName; + if (!isset($this->modifierChangeMap[$key])) { + return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } - // If a non-node, non-array subnode changed, we don't be able to do a partial - // reconstructions, as we don't have enough offset information. Pretty print the - // whole node instead. - return $this->pFallback($fallbackNode); + [$printFn, $findToken] = $this->modifierChangeMap[$key]; + $result .= $this->$printFn($subNode); + $pos = $this->origTokens->findRight($pos, $findToken); + continue; } $extraLeft = ''; @@ -617,7 +667,7 @@ abstract class PrettyPrinterAbstract // A node has been inserted, check if we have insertion information for it $key = $type . '->' . $subNodeName; if (!isset($this->insertionMap[$key])) { - return $this->pFallback($fallbackNode); + return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } list($findToken, $beforeToken, $extraLeft, $extraRight) = $this->insertionMap[$key]; @@ -639,7 +689,7 @@ abstract class PrettyPrinterAbstract // A node has been removed, check if we have removal information for it $key = $type . '->' . $subNodeName; if (!isset($this->removalMap[$key])) { - return $this->pFallback($fallbackNode); + return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } // Adjust positions to account for additional tokens that must be skipped @@ -669,7 +719,7 @@ abstract class PrettyPrinterAbstract $fixup = $fixupInfo[$subNodeName]; $res = $this->pFixup($fixup, $subNode, $class, $subStartPos, $subEndPos); } else { - $res = $this->p($subNode, true); + $res = $this->p($subNode, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, true); } $this->safeAppend($result, $res); @@ -688,23 +738,23 @@ abstract class PrettyPrinterAbstract /** * Perform a format-preserving pretty print of an array. * - * @param array $nodes New nodes - * @param array $origNodes Original nodes - * @param int $pos Current token position (updated by reference) - * @param int $indentAdjustment Adjustment for indentation - * @param string $parentNodeType Type of the containing node. - * @param string $subNodeName Name of array subnode. - * @param null|int $fixup Fixup information for array item nodes + * @param Node[] $nodes New nodes + * @param Node[] $origNodes Original nodes + * @param int $pos Current token position (updated by reference) + * @param int $indentAdjustment Adjustment for indentation + * @param string $parentNodeClass Class of the containing node. + * @param string $subNodeName Name of array subnode. + * @param null|int $fixup Fixup information for array item nodes * * @return null|string Result of pretty print or null if cannot preserve formatting */ protected function pArray( - array $nodes, array $origNodes, int &$pos, int $indentAdjustment, - string $parentNodeType, string $subNodeName, $fixup - ) { + array $nodes, array $origNodes, int &$pos, int $indentAdjustment, + string $parentNodeClass, string $subNodeName, ?int $fixup + ): ?string { $diff = $this->nodeListDiffer->diffWithReplacements($origNodes, $nodes); - $mapKey = $parentNodeType . '->' . $subNodeName; + $mapKey = $parentNodeClass . '->' . $subNodeName; $insertStr = $this->listInsertionMap[$mapKey] ?? null; $isStmtList = $subNodeName === 'stmts'; @@ -735,9 +785,9 @@ abstract class PrettyPrinterAbstract $result = ''; foreach ($diff as $i => $diffElem) { $diffType = $diffElem->type; - /** @var Node|null $arrItem */ + /** @var Node|string|null $arrItem */ $arrItem = $diffElem->new; - /** @var Node|null $origArrItem */ + /** @var Node|string|null $origArrItem */ $origArrItem = $diffElem->old; if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { @@ -776,9 +826,8 @@ abstract class PrettyPrinterAbstract } if ($skipRemovedNode) { - if ($isStmtList && ($this->origTokens->haveBracesInRange($pos, $itemStartPos) || - $this->origTokens->haveTagInRange($pos, $itemStartPos))) { - // We'd remove the brace of a code block. + if ($isStmtList && $this->origTokens->haveTagInRange($pos, $itemStartPos)) { + // We'd remove an opening/closing PHP tag. // TODO: Preserve formatting. $this->setIndentLevel($origIndentLevel); return null; @@ -798,7 +847,7 @@ abstract class PrettyPrinterAbstract } } - $this->safeAppend($result, $this->p($delayedAddNode, true)); + $this->safeAppend($result, $this->p($delayedAddNode, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, true)); if ($insertNewline) { $result .= $insertStr . $this->nl; @@ -827,10 +876,17 @@ abstract class PrettyPrinterAbstract return null; } + if (!$arrItem instanceof Node) { + // We only support list insertion of nodes. + return null; + } + // We go multiline if the original code was multiline, // or if it's an array item with a comment above it. + // Match always uses multiline formatting. if ($insertStr === ', ' && - ($this->isMultiline($origNodes) || $arrItem->getComments()) + ($this->isMultiline($origNodes) || $arrItem->getComments() || + $parentNodeClass === Expr\Match_::class) ) { $insertStr = ','; $insertNewline = true; @@ -880,9 +936,8 @@ abstract class PrettyPrinterAbstract $pos, $itemStartPos, $indentAdjustment); $skipRemovedNode = true; } else { - if ($isStmtList && ($this->origTokens->haveBracesInRange($pos, $itemStartPos) || - $this->origTokens->haveTagInRange($pos, $itemStartPos))) { - // We'd remove the brace of a code block. + if ($isStmtList && $this->origTokens->haveTagInRange($pos, $itemStartPos)) { + // We'd remove an opening/closing PHP tag. // TODO: Preserve formatting. return null; } @@ -897,7 +952,7 @@ abstract class PrettyPrinterAbstract if (null !== $fixup && $arrItem->getAttribute('origNode') !== $origArrItem) { $res = $this->pFixup($fixup, $arrItem, null, $itemStartPos, $itemEndPos); } else { - $res = $this->p($arrItem, true); + $res = $this->p($arrItem, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, true); } $this->safeAppend($result, $res); @@ -931,7 +986,7 @@ abstract class PrettyPrinterAbstract $result .= $this->nl; } } - $result .= $this->p($delayedAddNode, true); + $result .= $this->p($delayedAddNode, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, true); $first = false; } $result .= $extraRight === "\n" ? $this->nl : $extraRight; @@ -947,22 +1002,33 @@ abstract class PrettyPrinterAbstract * are required to preserve program semantics in a certain context (e.g. to maintain precedence * or because only certain expressions are allowed in certain places). * - * @param int $fixup Fixup type - * @param Node $subNode Subnode to print + * @param int $fixup Fixup type + * @param Node $subNode Subnode to print * @param string|null $parentClass Class of parent node - * @param int $subStartPos Original start pos of subnode - * @param int $subEndPos Original end pos of subnode + * @param int $subStartPos Original start pos of subnode + * @param int $subEndPos Original end pos of subnode * * @return string Result of fixed-up print of subnode */ - protected function pFixup(int $fixup, Node $subNode, $parentClass, int $subStartPos, int $subEndPos) : string { + protected function pFixup(int $fixup, Node $subNode, ?string $parentClass, int $subStartPos, int $subEndPos): string { switch ($fixup) { case self::FIXUP_PREC_LEFT: + // We use a conservative approximation where lhsPrecedence == precedence. + if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { + $precedence = $this->precedenceMap[$parentClass][1]; + return $this->p($subNode, $precedence, $precedence); + } + break; case self::FIXUP_PREC_RIGHT: if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { - list($precedence, $associativity) = $this->precedenceMap[$parentClass]; - return $this->pPrec($subNode, $precedence, $associativity, - $fixup === self::FIXUP_PREC_LEFT ? -1 : 1); + $precedence = $this->precedenceMap[$parentClass][2]; + return $this->p($subNode, $precedence, $precedence); + } + break; + case self::FIXUP_PREC_UNARY: + if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { + $precedence = $this->precedenceMap[$parentClass][0]; + return $this->p($subNode, $precedence, $precedence); } break; case self::FIXUP_CALL_LHS: @@ -1002,7 +1068,7 @@ abstract class PrettyPrinterAbstract } break; case self::FIXUP_ENCAPSED: - if (!$subNode instanceof Scalar\EncapsedStringPart + if (!$subNode instanceof Node\InterpolatedStringPart && !$this->origTokens->haveBraces($subStartPos, $subEndPos) ) { return '{' . $this->p($subNode) . '}'; @@ -1021,11 +1087,8 @@ abstract class PrettyPrinterAbstract * * Example: "echo" and "$x" result in "echo$x", but "echo" and "x" result in "echo x". * Without safeAppend the result would be "echox", which does not preserve semantics. - * - * @param string $str - * @param string $append */ - protected function safeAppend(string &$str, string $append) { + protected function safeAppend(string &$str, string $append): void { if ($str === "") { $str = $append; return; @@ -1050,7 +1113,7 @@ abstract class PrettyPrinterAbstract * * @return bool Whether parentheses are required */ - protected function callLhsRequiresParens(Node $node) : bool { + protected function callLhsRequiresParens(Node $node): bool { return !($node instanceof Node\Name || $node instanceof Expr\Variable || $node instanceof Expr\ArrayDimFetch @@ -1068,7 +1131,7 @@ abstract class PrettyPrinterAbstract * * @return bool Whether parentheses are required */ - protected function dereferenceLhsRequiresParens(Node $node) : bool { + protected function dereferenceLhsRequiresParens(Node $node): bool { // A constant can occur on the LHS of an array/object deref, but not a static deref. return $this->staticDereferenceLhsRequiresParens($node) && !$node instanceof Expr\ConstFetch; @@ -1126,14 +1189,18 @@ abstract class PrettyPrinterAbstract * * @return string Printed modifiers */ - protected function pModifiers(int $modifiers) { - return ($modifiers & Stmt\Class_::MODIFIER_PUBLIC ? 'public ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_PROTECTED ? 'protected ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_PRIVATE ? 'private ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_STATIC ? 'static ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_ABSTRACT ? 'abstract ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_FINAL ? 'final ' : '') - . ($modifiers & Stmt\Class_::MODIFIER_READONLY ? 'readonly ' : ''); + protected function pModifiers(int $modifiers): string { + return ($modifiers & Modifiers::FINAL ? 'final ' : '') + . ($modifiers & Modifiers::ABSTRACT ? 'abstract ' : '') + . ($modifiers & Modifiers::PUBLIC ? 'public ' : '') + . ($modifiers & Modifiers::PROTECTED ? 'protected ' : '') + . ($modifiers & Modifiers::PRIVATE ? 'private ' : '') + . ($modifiers & Modifiers::STATIC ? 'static ' : '') + . ($modifiers & Modifiers::READONLY ? 'readonly ' : ''); + } + + protected function pStatic(bool $static): string { + return $static ? 'static ' : ''; } /** @@ -1143,7 +1210,7 @@ abstract class PrettyPrinterAbstract * * @return bool Whether multiline formatting is used */ - protected function isMultiline(array $nodes) : bool { + protected function isMultiline(array $nodes): bool { if (\count($nodes) < 2) { return false; } @@ -1175,15 +1242,19 @@ abstract class PrettyPrinterAbstract * * The label char map determines whether a certain character may occur in a label. */ - protected function initializeLabelCharMap() { - if ($this->labelCharMap) return; + protected function initializeLabelCharMap(): void { + if (isset($this->labelCharMap)) { + return; + } $this->labelCharMap = []; for ($i = 0; $i < 256; $i++) { - // Since PHP 7.1 The lower range is 0x80. However, we also want to support code for - // older versions. $chr = chr($i); - $this->labelCharMap[$chr] = $i >= 0x7f || ctype_alnum($chr); + $this->labelCharMap[$chr] = $i >= 0x80 || ctype_alnum($chr); + } + + if ($this->phpVersion->allowsDelInIdentifiers()) { + $this->labelCharMap["\x7f"] = true; } } @@ -1192,8 +1263,10 @@ abstract class PrettyPrinterAbstract * * The node list differ is used to determine differences between two array subnodes. */ - protected function initializeNodeListDiffer() { - if ($this->nodeListDiffer) return; + protected function initializeNodeListDiffer(): void { + if (isset($this->nodeListDiffer)) { + return; + } $this->nodeListDiffer = new Internal\Differ(function ($a, $b) { if ($a instanceof Node && $b instanceof Node) { @@ -1210,22 +1283,21 @@ abstract class PrettyPrinterAbstract * The fixup map is used to determine whether a certain subnode of a certain node may require * some kind of "fixup" operation, e.g. the addition of parenthesis or braces. */ - protected function initializeFixupMap() { - if ($this->fixupMap) return; + protected function initializeFixupMap(): void { + if (isset($this->fixupMap)) { + return; + } $this->fixupMap = [ - Expr\PreInc::class => ['var' => self::FIXUP_PREC_RIGHT], - Expr\PreDec::class => ['var' => self::FIXUP_PREC_RIGHT], - Expr\PostInc::class => ['var' => self::FIXUP_PREC_LEFT], - Expr\PostDec::class => ['var' => self::FIXUP_PREC_LEFT], Expr\Instanceof_::class => [ - 'expr' => self::FIXUP_PREC_LEFT, + 'expr' => self::FIXUP_PREC_UNARY, 'class' => self::FIXUP_NEW, ], Expr\Ternary::class => [ 'cond' => self::FIXUP_PREC_LEFT, 'else' => self::FIXUP_PREC_RIGHT, ], + Expr\Yield_::class => ['value' => self::FIXUP_PREC_UNARY], Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS], Expr\StaticCall::class => ['class' => self::FIXUP_STATIC_DEREF_LHS], @@ -1255,7 +1327,7 @@ abstract class PrettyPrinterAbstract 'var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME, ], - Scalar\Encapsed::class => [ + Scalar\InterpolatedString::class => [ 'parts' => self::FIXUP_ENCAPSED, ], ]; @@ -1278,27 +1350,19 @@ abstract class PrettyPrinterAbstract ]; } - $assignOps = [ - Expr\Assign::class, Expr\AssignRef::class, AssignOp\Plus::class, AssignOp\Minus::class, - AssignOp\Mul::class, AssignOp\Div::class, AssignOp\Concat::class, AssignOp\Mod::class, - AssignOp\BitwiseAnd::class, AssignOp\BitwiseOr::class, AssignOp\BitwiseXor::class, - AssignOp\ShiftLeft::class, AssignOp\ShiftRight::class, AssignOp\Pow::class, AssignOp\Coalesce::class - ]; - foreach ($assignOps as $assignOp) { - $this->fixupMap[$assignOp] = [ - 'var' => self::FIXUP_PREC_LEFT, - 'expr' => self::FIXUP_PREC_RIGHT, - ]; - } - $prefixOps = [ - Expr\BitwiseNot::class, Expr\BooleanNot::class, Expr\UnaryPlus::class, Expr\UnaryMinus::class, + Expr\Clone_::class, Expr\BitwiseNot::class, Expr\BooleanNot::class, Expr\UnaryPlus::class, Expr\UnaryMinus::class, Cast\Int_::class, Cast\Double::class, Cast\String_::class, Cast\Array_::class, Cast\Object_::class, Cast\Bool_::class, Cast\Unset_::class, Expr\ErrorSuppress::class, Expr\YieldFrom::class, Expr\Print_::class, Expr\Include_::class, + Expr\Assign::class, Expr\AssignRef::class, AssignOp\Plus::class, AssignOp\Minus::class, + AssignOp\Mul::class, AssignOp\Div::class, AssignOp\Concat::class, AssignOp\Mod::class, + AssignOp\BitwiseAnd::class, AssignOp\BitwiseOr::class, AssignOp\BitwiseXor::class, + AssignOp\ShiftLeft::class, AssignOp\ShiftRight::class, AssignOp\Pow::class, AssignOp\Coalesce::class, + Expr\ArrowFunction::class, Expr\Throw_::class, ]; foreach ($prefixOps as $prefixOp) { - $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_RIGHT]; + $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_UNARY]; } } @@ -1308,8 +1372,10 @@ abstract class PrettyPrinterAbstract * The removal map is used to determine which additional tokens should be removed when a * certain node is replaced by null. */ - protected function initializeRemovalMap() { - if ($this->removalMap) return; + protected function initializeRemovalMap(): void { + if (isset($this->removalMap)) { + return; + } $stripBoth = ['left' => \T_WHITESPACE, 'right' => \T_WHITESPACE]; $stripLeft = ['left' => \T_WHITESPACE]; @@ -1319,7 +1385,7 @@ abstract class PrettyPrinterAbstract $stripEquals = ['left' => '=']; $this->removalMap = [ 'Expr_ArrayDimFetch->dim' => $stripBoth, - 'Expr_ArrayItem->key' => $stripDoubleArrow, + 'ArrayItem->key' => $stripDoubleArrow, 'Expr_ArrowFunction->returnType' => $stripColon, 'Expr_Closure->returnType' => $stripColon, 'Expr_Exit->expr' => $stripBoth, @@ -1342,7 +1408,7 @@ abstract class PrettyPrinterAbstract 'Stmt_If->else' => $stripLeft, 'Stmt_Namespace->name' => $stripLeft, 'Stmt_Property->type' => $stripRight, - 'Stmt_PropertyProperty->default' => $stripEquals, + 'PropertyItem->default' => $stripEquals, 'Stmt_Return->expr' => $stripBoth, 'Stmt_StaticVar->default' => $stripEquals, 'Stmt_TraitUseAdaptation_Alias->newName' => $stripLeft, @@ -1354,16 +1420,18 @@ abstract class PrettyPrinterAbstract ]; } - protected function initializeInsertionMap() { - if ($this->insertionMap) return; + protected function initializeInsertionMap(): void { + if (isset($this->insertionMap)) { + return; + } // TODO: "yield" where both key and value are inserted doesn't work // [$find, $beforeToken, $extraLeft, $extraRight] $this->insertionMap = [ 'Expr_ArrayDimFetch->dim' => ['[', false, null, null], - 'Expr_ArrayItem->key' => [null, false, null, ' => '], - 'Expr_ArrowFunction->returnType' => [')', false, ' : ', null], - 'Expr_Closure->returnType' => [')', false, ' : ', null], + 'ArrayItem->key' => [null, false, null, ' => '], + 'Expr_ArrowFunction->returnType' => [')', false, ': ', null], + 'Expr_Closure->returnType' => [')', false, ': ', null], 'Expr_Ternary->if' => ['?', false, ' ', ' '], 'Expr_Yield->key' => [\T_YIELD, false, null, ' => '], 'Expr_Yield->value' => [\T_YIELD, false, ' ', null], @@ -1371,19 +1439,19 @@ abstract class PrettyPrinterAbstract 'Param->default' => [null, false, ' = ', null], 'Stmt_Break->num' => [\T_BREAK, false, ' ', null], 'Stmt_Catch->var' => [null, false, ' ', null], - 'Stmt_ClassMethod->returnType' => [')', false, ' : ', null], + 'Stmt_ClassMethod->returnType' => [')', false, ': ', null], 'Stmt_ClassConst->type' => [\T_CONST, false, ' ', null], 'Stmt_Class->extends' => [null, false, ' extends ', null], 'Stmt_Enum->scalarType' => [null, false, ' : ', null], 'Stmt_EnumCase->expr' => [null, false, ' = ', null], - 'Expr_PrintableNewAnonClass->extends' => [null, ' extends ', null], + 'Expr_PrintableNewAnonClass->extends' => [null, false, ' extends ', null], 'Stmt_Continue->num' => [\T_CONTINUE, false, ' ', null], 'Stmt_Foreach->keyVar' => [\T_AS, false, null, ' => '], - 'Stmt_Function->returnType' => [')', false, ' : ', null], + 'Stmt_Function->returnType' => [')', false, ': ', null], 'Stmt_If->else' => [null, false, ' ', null], 'Stmt_Namespace->name' => [\T_NAMESPACE, false, ' ', null], 'Stmt_Property->type' => [\T_VARIABLE, true, null, ' '], - 'Stmt_PropertyProperty->default' => [null, false, ' = ', null], + 'PropertyItem->default' => [null, false, ' = ', null], 'Stmt_Return->expr' => [\T_RETURN, false, ' ', null], 'Stmt_StaticVar->default' => [null, false, ' = ', null], //'Stmt_TraitUseAdaptation_Alias->newName' => [T_AS, false, ' ', null], // TODO @@ -1397,132 +1465,139 @@ abstract class PrettyPrinterAbstract ]; } - protected function initializeListInsertionMap() { - if ($this->listInsertionMap) return; + protected function initializeListInsertionMap(): void { + if (isset($this->listInsertionMap)) { + return; + } $this->listInsertionMap = [ // special //'Expr_ShellExec->parts' => '', // TODO These need to be treated more carefully - //'Scalar_Encapsed->parts' => '', - 'Stmt_Catch->types' => '|', - 'UnionType->types' => '|', - 'IntersectionType->types' => '&', - 'Stmt_If->elseifs' => ' ', - 'Stmt_TryCatch->catches' => ' ', + //'Scalar_InterpolatedString->parts' => '', + Stmt\Catch_::class . '->types' => '|', + UnionType::class . '->types' => '|', + IntersectionType::class . '->types' => '&', + Stmt\If_::class . '->elseifs' => ' ', + Stmt\TryCatch::class . '->catches' => ' ', // comma-separated lists - 'Expr_Array->items' => ', ', - 'Expr_ArrowFunction->params' => ', ', - 'Expr_Closure->params' => ', ', - 'Expr_Closure->uses' => ', ', - 'Expr_FuncCall->args' => ', ', - 'Expr_Isset->vars' => ', ', - 'Expr_List->items' => ', ', - 'Expr_MethodCall->args' => ', ', - 'Expr_NullsafeMethodCall->args' => ', ', - 'Expr_New->args' => ', ', - 'Expr_PrintableNewAnonClass->args' => ', ', - 'Expr_StaticCall->args' => ', ', - 'Stmt_ClassConst->consts' => ', ', - 'Stmt_ClassMethod->params' => ', ', - 'Stmt_Class->implements' => ', ', - 'Stmt_Enum->implements' => ', ', - 'Expr_PrintableNewAnonClass->implements' => ', ', - 'Stmt_Const->consts' => ', ', - 'Stmt_Declare->declares' => ', ', - 'Stmt_Echo->exprs' => ', ', - 'Stmt_For->init' => ', ', - 'Stmt_For->cond' => ', ', - 'Stmt_For->loop' => ', ', - 'Stmt_Function->params' => ', ', - 'Stmt_Global->vars' => ', ', - 'Stmt_GroupUse->uses' => ', ', - 'Stmt_Interface->extends' => ', ', - 'Stmt_Match->arms' => ', ', - 'Stmt_Property->props' => ', ', - 'Stmt_StaticVar->vars' => ', ', - 'Stmt_TraitUse->traits' => ', ', - 'Stmt_TraitUseAdaptation_Precedence->insteadof' => ', ', - 'Stmt_Unset->vars' => ', ', - 'Stmt_Use->uses' => ', ', - 'MatchArm->conds' => ', ', - 'AttributeGroup->attrs' => ', ', + Expr\Array_::class . '->items' => ', ', + Expr\ArrowFunction::class . '->params' => ', ', + Expr\Closure::class . '->params' => ', ', + Expr\Closure::class . '->uses' => ', ', + Expr\FuncCall::class . '->args' => ', ', + Expr\Isset_::class . '->vars' => ', ', + Expr\List_::class . '->items' => ', ', + Expr\MethodCall::class . '->args' => ', ', + Expr\NullsafeMethodCall::class . '->args' => ', ', + Expr\New_::class . '->args' => ', ', + PrintableNewAnonClassNode::class . '->args' => ', ', + Expr\StaticCall::class . '->args' => ', ', + Stmt\ClassConst::class . '->consts' => ', ', + Stmt\ClassMethod::class . '->params' => ', ', + Stmt\Class_::class . '->implements' => ', ', + Stmt\Enum_::class . '->implements' => ', ', + PrintableNewAnonClassNode::class . '->implements' => ', ', + Stmt\Const_::class . '->consts' => ', ', + Stmt\Declare_::class . '->declares' => ', ', + Stmt\Echo_::class . '->exprs' => ', ', + Stmt\For_::class . '->init' => ', ', + Stmt\For_::class . '->cond' => ', ', + Stmt\For_::class . '->loop' => ', ', + Stmt\Function_::class . '->params' => ', ', + Stmt\Global_::class . '->vars' => ', ', + Stmt\GroupUse::class . '->uses' => ', ', + Stmt\Interface_::class . '->extends' => ', ', + Expr\Match_::class . '->arms' => ', ', + Stmt\Property::class . '->props' => ', ', + Stmt\StaticVar::class . '->vars' => ', ', + Stmt\TraitUse::class . '->traits' => ', ', + Stmt\TraitUseAdaptation\Precedence::class . '->insteadof' => ', ', + Stmt\Unset_::class . '->vars' => ', ', + Stmt\UseUse::class . '->uses' => ', ', + MatchArm::class . '->conds' => ', ', + AttributeGroup::class . '->attrs' => ', ', // statement lists - 'Expr_Closure->stmts' => "\n", - 'Stmt_Case->stmts' => "\n", - 'Stmt_Catch->stmts' => "\n", - 'Stmt_Class->stmts' => "\n", - 'Stmt_Enum->stmts' => "\n", - 'Expr_PrintableNewAnonClass->stmts' => "\n", - 'Stmt_Interface->stmts' => "\n", - 'Stmt_Trait->stmts' => "\n", - 'Stmt_ClassMethod->stmts' => "\n", - 'Stmt_Declare->stmts' => "\n", - 'Stmt_Do->stmts' => "\n", - 'Stmt_ElseIf->stmts' => "\n", - 'Stmt_Else->stmts' => "\n", - 'Stmt_Finally->stmts' => "\n", - 'Stmt_Foreach->stmts' => "\n", - 'Stmt_For->stmts' => "\n", - 'Stmt_Function->stmts' => "\n", - 'Stmt_If->stmts' => "\n", - 'Stmt_Namespace->stmts' => "\n", - 'Stmt_Class->attrGroups' => "\n", - 'Stmt_Enum->attrGroups' => "\n", - 'Stmt_EnumCase->attrGroups' => "\n", - 'Stmt_Interface->attrGroups' => "\n", - 'Stmt_Trait->attrGroups' => "\n", - 'Stmt_Function->attrGroups' => "\n", - 'Stmt_ClassMethod->attrGroups' => "\n", - 'Stmt_ClassConst->attrGroups' => "\n", - 'Stmt_Property->attrGroups' => "\n", - 'Expr_PrintableNewAnonClass->attrGroups' => ' ', - 'Expr_Closure->attrGroups' => ' ', - 'Expr_ArrowFunction->attrGroups' => ' ', - 'Param->attrGroups' => ' ', - 'Stmt_Switch->cases' => "\n", - 'Stmt_TraitUse->adaptations' => "\n", - 'Stmt_TryCatch->stmts' => "\n", - 'Stmt_While->stmts' => "\n", + Expr\Closure::class . '->stmts' => "\n", + Stmt\Case_::class . '->stmts' => "\n", + Stmt\Catch_::class . '->stmts' => "\n", + Stmt\Class_::class . '->stmts' => "\n", + Stmt\Enum_::class . '->stmts' => "\n", + PrintableNewAnonClassNode::class . '->stmts' => "\n", + Stmt\Interface_::class . '->stmts' => "\n", + Stmt\Trait_::class . '->stmts' => "\n", + Stmt\ClassMethod::class . '->stmts' => "\n", + Stmt\Declare_::class . '->stmts' => "\n", + Stmt\Do_::class . '->stmts' => "\n", + Stmt\ElseIf_::class . '->stmts' => "\n", + Stmt\Else_::class . '->stmts' => "\n", + Stmt\Finally_::class . '->stmts' => "\n", + Stmt\Foreach_::class . '->stmts' => "\n", + Stmt\For_::class . '->stmts' => "\n", + Stmt\Function_::class . '->stmts' => "\n", + Stmt\If_::class . '->stmts' => "\n", + Stmt\Namespace_::class . '->stmts' => "\n", + Stmt\Block::class . '->stmts' => "\n", + + // Attribute groups + Stmt\Class_::class . '->attrGroups' => "\n", + Stmt\Enum_::class . '->attrGroups' => "\n", + Stmt\EnumCase::class . '->attrGroups' => "\n", + Stmt\Interface_::class . '->attrGroups' => "\n", + Stmt\Trait_::class . '->attrGroups' => "\n", + Stmt\Function_::class . '->attrGroups' => "\n", + Stmt\ClassMethod::class . '->attrGroups' => "\n", + Stmt\ClassConst::class . '->attrGroups' => "\n", + Stmt\Property::class . '->attrGroups' => "\n", + PrintableNewAnonClassNode::class . '->attrGroups' => ' ', + Expr\Closure::class . '->attrGroups' => ' ', + Expr\ArrowFunction::class . '->attrGroups' => ' ', + Param::class . '->attrGroups' => ' ', + Stmt\Switch_::class . '->cases' => "\n", + Stmt\TraitUse::class . '->adaptations' => "\n", + Stmt\TryCatch::class . '->stmts' => "\n", + Stmt\While_::class . '->stmts' => "\n", // dummy for top-level context 'File->stmts' => "\n", ]; } - protected function initializeEmptyListInsertionMap() { - if ($this->emptyListInsertionMap) return; + protected function initializeEmptyListInsertionMap(): void { + if (isset($this->emptyListInsertionMap)) { + return; + } // TODO Insertion into empty statement lists. // [$find, $extraLeft, $extraRight] $this->emptyListInsertionMap = [ - 'Expr_ArrowFunction->params' => ['(', '', ''], - 'Expr_Closure->uses' => [')', ' use(', ')'], - 'Expr_Closure->params' => ['(', '', ''], - 'Expr_FuncCall->args' => ['(', '', ''], - 'Expr_MethodCall->args' => ['(', '', ''], - 'Expr_NullsafeMethodCall->args' => ['(', '', ''], - 'Expr_New->args' => ['(', '', ''], - 'Expr_PrintableNewAnonClass->args' => ['(', '', ''], - 'Expr_PrintableNewAnonClass->implements' => [null, ' implements ', ''], - 'Expr_StaticCall->args' => ['(', '', ''], - 'Stmt_Class->implements' => [null, ' implements ', ''], - 'Stmt_Enum->implements' => [null, ' implements ', ''], - 'Stmt_ClassMethod->params' => ['(', '', ''], - 'Stmt_Interface->extends' => [null, ' extends ', ''], - 'Stmt_Function->params' => ['(', '', ''], - 'Stmt_Interface->attrGroups' => [null, '', "\n"], - 'Stmt_Class->attrGroups' => [null, '', "\n"], - 'Stmt_ClassConst->attrGroups' => [null, '', "\n"], - 'Stmt_ClassMethod->attrGroups' => [null, '', "\n"], - 'Stmt_Function->attrGroups' => [null, '', "\n"], - 'Stmt_Property->attrGroups' => [null, '', "\n"], - 'Stmt_Trait->attrGroups' => [null, '', "\n"], - 'Expr_ArrowFunction->attrGroups' => [null, '', ' '], - 'Expr_Closure->attrGroups' => [null, '', ' '], - 'Expr_PrintableNewAnonClass->attrGroups' => [\T_NEW, ' ', ''], + Expr\ArrowFunction::class . '->params' => ['(', '', ''], + Expr\Closure::class . '->uses' => [')', ' use (', ')'], + Expr\Closure::class . '->params' => ['(', '', ''], + Expr\FuncCall::class . '->args' => ['(', '', ''], + Expr\MethodCall::class . '->args' => ['(', '', ''], + Expr\NullsafeMethodCall::class . '->args' => ['(', '', ''], + Expr\New_::class . '->args' => ['(', '', ''], + PrintableNewAnonClassNode::class . '->args' => ['(', '', ''], + PrintableNewAnonClassNode::class . '->implements' => [null, ' implements ', ''], + Expr\StaticCall::class . '->args' => ['(', '', ''], + Stmt\Class_::class . '->implements' => [null, ' implements ', ''], + Stmt\Enum_::class . '->implements' => [null, ' implements ', ''], + Stmt\ClassMethod::class . '->params' => ['(', '', ''], + Stmt\Interface_::class . '->extends' => [null, ' extends ', ''], + Stmt\Function_::class . '->params' => ['(', '', ''], + Stmt\Interface_::class . '->attrGroups' => [null, '', "\n"], + Stmt\Class_::class . '->attrGroups' => [null, '', "\n"], + Stmt\ClassConst::class . '->attrGroups' => [null, '', "\n"], + Stmt\ClassMethod::class . '->attrGroups' => [null, '', "\n"], + Stmt\Function_::class . '->attrGroups' => [null, '', "\n"], + Stmt\Property::class . '->attrGroups' => [null, '', "\n"], + Stmt\Trait_::class . '->attrGroups' => [null, '', "\n"], + Expr\ArrowFunction::class . '->attrGroups' => [null, '', ' '], + Expr\Closure::class . '->attrGroups' => [null, '', ' '], + PrintableNewAnonClassNode::class . '->attrGroups' => [\T_NEW, ' ', ''], /* These cannot be empty to start with: * Expr_Isset->vars @@ -1554,23 +1629,27 @@ abstract class PrettyPrinterAbstract ]; } - protected function initializeModifierChangeMap() { - if ($this->modifierChangeMap) return; + protected function initializeModifierChangeMap(): void { + if (isset($this->modifierChangeMap)) { + return; + } $this->modifierChangeMap = [ - 'Stmt_ClassConst->flags' => \T_CONST, - 'Stmt_ClassMethod->flags' => \T_FUNCTION, - 'Stmt_Class->flags' => \T_CLASS, - 'Stmt_Property->flags' => \T_VARIABLE, - 'Expr_PrintableNewAnonClass->flags' => \T_CLASS, - 'Param->flags' => \T_VARIABLE, - //'Stmt_TraitUseAdaptation_Alias->newModifier' => 0, // TODO + Stmt\ClassConst::class . '->flags' => ['pModifiers', \T_CONST], + Stmt\ClassMethod::class . '->flags' => ['pModifiers', \T_FUNCTION], + Stmt\Class_::class . '->flags' => ['pModifiers', \T_CLASS], + Stmt\Property::class . '->flags' => ['pModifiers', \T_VARIABLE], + PrintableNewAnonClassNode::class . '->flags' => ['pModifiers', \T_CLASS], + Param::class . '->flags' => ['pModifiers', \T_VARIABLE], + Expr\Closure::class . '->static' => ['pStatic', \T_FUNCTION], + Expr\ArrowFunction::class . '->static' => ['pStatic', \T_FN], + //Stmt\TraitUseAdaptation\Alias::class . '->newModifier' => 0, // TODO ]; // List of integer subnodes that are not modifiers: // Expr_Include->type // Stmt_GroupUse->type // Stmt_Use->type - // Stmt_UseUse->type + // UseItem->type } } diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/Token.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/Token.php new file mode 100644 index 00000000..6683310f --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/Token.php @@ -0,0 +1,18 @@ +pos + \strlen($this->text); + } + + /** Get 1-based end line number of the token. */ + public function getEndLine(): int { + return $this->line + \substr_count($this->text, "\n"); + } +} diff --git a/Sources/vendor/nikic/php-parser/lib/PhpParser/compatibility_tokens.php b/Sources/vendor/nikic/php-parser/lib/PhpParser/compatibility_tokens.php new file mode 100644 index 00000000..f33dd77d --- /dev/null +++ b/Sources/vendor/nikic/php-parser/lib/PhpParser/compatibility_tokens.php @@ -0,0 +1,56 @@ +\\|null but return statement is missing\\.$#" + count: 1 + path: lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php + + - + message: "#^Method PhpParser\\\\NodeVisitor\\\\NodeConnectingVisitor\\:\\:enterNode\\(\\) should return array\\\\|int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#" + count: 1 + path: lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php + + - + message: "#^Method PhpParser\\\\NodeVisitor\\\\NodeConnectingVisitor\\:\\:leaveNode\\(\\) should return array\\\\|int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#" + count: 1 + path: lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php + + - + message: "#^Method PhpParser\\\\NodeVisitor\\\\ParentConnectingVisitor\\:\\:beforeTraverse\\(\\) should return array\\\\|null but return statement is missing\\.$#" + count: 1 + path: lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php + + - + message: "#^Method PhpParser\\\\NodeVisitor\\\\ParentConnectingVisitor\\:\\:enterNode\\(\\) should return array\\\\|int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#" + count: 1 + path: lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php + + - + message: "#^Method PhpParser\\\\NodeVisitor\\\\ParentConnectingVisitor\\:\\:leaveNode\\(\\) should return array\\\\|int\\|PhpParser\\\\Node\\|null but return statement is missing\\.$#" + count: 1 + path: lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php + + - + message: "#^Access to undefined constant static\\(PhpParser\\\\ParserAbstract\\)\\:\\:T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Access to undefined constant static\\(PhpParser\\\\ParserAbstract\\)\\:\\:T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Access to undefined constant static\\(PhpParser\\\\ParserAbstract\\)\\:\\:T_ATTRIBUTE\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Access to undefined constant static\\(PhpParser\\\\ParserAbstract\\)\\:\\:T_COALESCE_EQUAL\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Access to undefined constant static\\(PhpParser\\\\ParserAbstract\\)\\:\\:T_ECHO\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Access to undefined constant static\\(PhpParser\\\\ParserAbstract\\)\\:\\:T_ENUM\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Access to undefined constant static\\(PhpParser\\\\ParserAbstract\\)\\:\\:T_FN\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Access to undefined constant static\\(PhpParser\\\\ParserAbstract\\)\\:\\:T_MATCH\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Access to undefined constant static\\(PhpParser\\\\ParserAbstract\\)\\:\\:T_NAME_FULLY_QUALIFIED\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Access to undefined constant static\\(PhpParser\\\\ParserAbstract\\)\\:\\:T_NAME_QUALIFIED\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Access to undefined constant static\\(PhpParser\\\\ParserAbstract\\)\\:\\:T_NAME_RELATIVE\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Access to undefined constant static\\(PhpParser\\\\ParserAbstract\\)\\:\\:T_NULLSAFE_OBJECT_OPERATOR\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Access to undefined constant static\\(PhpParser\\\\ParserAbstract\\)\\:\\:T_PAAMAYIM_NEKUDOTAYIM\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Access to undefined constant static\\(PhpParser\\\\ParserAbstract\\)\\:\\:T_READONLY\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Unary operation \"\\+\" on string results in an error\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php + + - + message: "#^Variable \\$action might not be defined\\.$#" + count: 1 + path: lib/PhpParser/ParserAbstract.php diff --git a/Sources/vendor/nikic/php-parser/phpstan.neon.dist b/Sources/vendor/nikic/php-parser/phpstan.neon.dist new file mode 100644 index 00000000..af910125 --- /dev/null +++ b/Sources/vendor/nikic/php-parser/phpstan.neon.dist @@ -0,0 +1,8 @@ +includes: + - phpstan-baseline.neon + +parameters: + level: 6 + paths: + - lib + treatPhpDocTypesAsCertain: false diff --git a/Sources/vendor/phpunit/php-code-coverage/ChangeLog-10.1.md b/Sources/vendor/phpunit/php-code-coverage/ChangeLog-10.1.md index f9502e8c..b7299e7b 100644 --- a/Sources/vendor/phpunit/php-code-coverage/ChangeLog-10.1.md +++ b/Sources/vendor/phpunit/php-code-coverage/ChangeLog-10.1.md @@ -2,6 +2,18 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [10.1.11] - 2023-12-21 + +### Changed + +* This component is now compatible with `nikic/php-parser` 5.0 + +## [10.1.10] - 2023-12-11 + +### Fixed + +* [#1023](https://github.com/sebastianbergmann/php-code-coverage/issues/1023): Branch Coverage and Path Coverage are not correctly reported for traits + ## [10.1.9] - 2023-11-23 ### Fixed @@ -71,6 +83,8 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt * The `SebastianBergmann\CodeCoverage\Filter::includeDirectory()`, `SebastianBergmann\CodeCoverage\Filter::excludeDirectory()`, and `SebastianBergmann\CodeCoverage\Filter::excludeFile()` methods are now deprecated +[10.1.11]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.10...10.1.11 +[10.1.10]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.9...10.1.10 [10.1.9]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.8...10.1.9 [10.1.8]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.7...10.1.8 [10.1.7]: https://github.com/sebastianbergmann/php-code-coverage/compare/10.1.6...10.1.7 diff --git a/Sources/vendor/phpunit/php-code-coverage/composer.json b/Sources/vendor/phpunit/php-code-coverage/composer.json index 92e9d5e2..6e2ed05e 100644 --- a/Sources/vendor/phpunit/php-code-coverage/composer.json +++ b/Sources/vendor/phpunit/php-code-coverage/composer.json @@ -33,7 +33,7 @@ "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^4.18 || ^5.0", "phpunit/php-file-iterator": "^4.0", "phpunit/php-text-template": "^3.0", "sebastian/code-unit-reverse-lookup": "^3.0", diff --git a/Sources/vendor/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php b/Sources/vendor/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php index 0d91745f..da7522df 100644 --- a/Sources/vendor/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php +++ b/Sources/vendor/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php @@ -19,7 +19,10 @@ use function explode; use function file_get_contents; use function in_array; use function is_file; +use function preg_replace; use function range; +use function str_ends_with; +use function str_starts_with; use function trim; use SebastianBergmann\CodeCoverage\Driver\Driver; use SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser; @@ -65,6 +68,15 @@ final class RawCodeCoverageData $functionCoverage = []; foreach ($rawCoverage as $file => $fileCoverageData) { + // Xdebug annotates the function name of traits, strip that off + foreach ($fileCoverageData['functions'] as $existingKey => $data) { + if (str_ends_with($existingKey, '}') && !str_starts_with($existingKey, '{')) { // don't want to catch {main} + $newKey = preg_replace('/\{.*}$/', '', $existingKey); + $fileCoverageData['functions'][$newKey] = $data; + unset($fileCoverageData['functions'][$existingKey]); + } + } + $lineCoverage[$file] = $fileCoverageData['lines']; $functionCoverage[$file] = $fileCoverageData['functions']; } diff --git a/Sources/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php b/Sources/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php index 54824314..8d6a5c25 100644 --- a/Sources/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php +++ b/Sources/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php @@ -107,6 +107,7 @@ final class ExecutableLinesFindingVisitor extends NodeVisitorAbstract $node instanceof Node\Expr\ConstFetch || $node instanceof Node\Expr\Match_ || $node instanceof Node\Expr\Variable || + $node instanceof Node\Expr\Throw_ || $node instanceof Node\ComplexType || $node instanceof Node\Const_ || $node instanceof Node\Identifier || @@ -116,12 +117,27 @@ final class ExecutableLinesFindingVisitor extends NodeVisitorAbstract return; } + /* + * nikic/php-parser ^4.18 represents throw statements + * as Stmt\Throw_ objects + */ if ($node instanceof Node\Stmt\Throw_) { $this->setLineBranch($node->expr->getEndLine(), $node->expr->getEndLine(), ++$this->nextBranch); return; } + /* + * nikic/php-parser ^5 represents throw statements + * as Stmt\Expression objects that contain an + * Expr\Throw_ object + */ + if ($node instanceof Node\Stmt\Expression && $node->expr instanceof Node\Expr\Throw_) { + $this->setLineBranch($node->expr->expr->getEndLine(), $node->expr->expr->getEndLine(), ++$this->nextBranch); + + return; + } + if ($node instanceof Node\Stmt\Enum_ || $node instanceof Node\Stmt\Function_ || $node instanceof Node\Stmt\Class_ || diff --git a/Sources/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php b/Sources/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php index 3d1b5c88..3190bb4e 100644 --- a/Sources/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php +++ b/Sources/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php @@ -22,7 +22,6 @@ use function substr_count; use function token_get_all; use function trim; use PhpParser\Error; -use PhpParser\Lexer; use PhpParser\NodeTraverser; use PhpParser\NodeVisitor\NameResolver; use PhpParser\NodeVisitor\ParentConnectingVisitor; @@ -140,10 +139,7 @@ final class ParsingFileAnalyser implements FileAnalyser assert($linesOfCode > 0); - $parser = (new ParserFactory)->create( - ParserFactory::PREFER_PHP7, - new Lexer - ); + $parser = (new ParserFactory)->createForHostVersion(); try { $nodes = $parser->parse($source); diff --git a/Sources/vendor/phpunit/php-code-coverage/src/Version.php b/Sources/vendor/phpunit/php-code-coverage/src/Version.php index 12404574..c7739dc6 100644 --- a/Sources/vendor/phpunit/php-code-coverage/src/Version.php +++ b/Sources/vendor/phpunit/php-code-coverage/src/Version.php @@ -19,7 +19,7 @@ final class Version public static function id(): string { if (self::$version === '') { - self::$version = (new VersionId('10.1.9', dirname(__DIR__)))->asString(); + self::$version = (new VersionId('10.1.11', dirname(__DIR__)))->asString(); } return self::$version; diff --git a/Sources/vendor/phpunit/phpunit/ChangeLog-10.4.md b/Sources/vendor/phpunit/phpunit/ChangeLog-10.4.md deleted file mode 100644 index b9f1a045..00000000 --- a/Sources/vendor/phpunit/phpunit/ChangeLog-10.4.md +++ /dev/null @@ -1,52 +0,0 @@ -# Changes in PHPUnit 10.4 - -All notable changes of the PHPUnit 10.4 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [10.4.2] - 2023-10-26 - -### Fixed - -* [#5048](https://github.com/sebastianbergmann/phpunit/issues/5048): Methods that return `never` cannot be doubled - -## [10.4.1] - 2023-10-08 - -### Fixed - -* [#5534](https://github.com/sebastianbergmann/phpunit/issues/5534): Cache for generated Test Double code was not updated for Test Stub and Mock Object distinction - -## [10.4.0] - 2023-10-06 - -### Added - -* [#5441](https://github.com/sebastianbergmann/phpunit/issues/5441): Baseline for `E_(USER_)DEPRECATED`, `E_(USER_)NOTICE`, `E_STRICT`, and `E_(USER_)WARNING` -* [#5462](https://github.com/sebastianbergmann/phpunit/pull/5462): Support for multiple arguments -* [#5471](https://github.com/sebastianbergmann/phpunit/issues/5471): `assertFileMatchesFormat()` and `assertFileMatchesFormatFile()` -* [#5515](https://github.com/sebastianbergmann/phpunit/issues/5515): `PHPUnit\Runner\Extension\Facade::requireExportOfObjects()` so that test runner extensions can indicate that they require the export of objects for events such as `Test\AssertionSucceeded` and `Test\AssertionFailed` -* `Test\PreparationFailed` event -* Attribute `id` attribute for `testCaseMethod` elements in the XML document generated by `--list-tests-xml` - -### Changed - -* [#5505](https://github.com/sebastianbergmann/phpunit/pull/5505): Improve the failure description of `StringContains`-based assertions when the strings are encoded differently -* [#5515](https://github.com/sebastianbergmann/phpunit/issues/5515): The `Test\AssertionSucceeded` and `Test\AssertionFailed` events are always emitted again -* [#5515](https://github.com/sebastianbergmann/phpunit/issues/5515): `--log-events-verbose-text` enables the export of non-scalar values for the `Test\AssertionSucceeded` and `Test\AssertionFailed` events -* [#5524](https://github.com/sebastianbergmann/phpunit/issues/5524): Do not export data passed to test for PHPUnit\Event\Code\TestMethod value object by default -* [#5526](https://github.com/sebastianbergmann/phpunit/issues/5526): Do not limit number of columns to 80 on non-interactive TTY -* Exceptions thrown by third-party event subscribers are now reported as test runner warnings -* The name of the top-level test suite that is created when a directory or file path is passed as an argument to the test runner is now `CLI Arguments` -* Simplified the failure description for `assertInstanceOf()` and `assertNotInstanceOf()` -* Simplified the failure description for `assertJson()` -* The `--enforce-time-limit` CLI option and the `enforceTimeLimit` XML configuration file attribute no longer affect the running of PHPT tests -* The `@codeCoverageIgnore`, `@codeCoverageIgnoreStart`, and `@codeCoverageIgnoreEnd` annotations are no longer deprecated - -### Deprecated - -* [#5472](https://github.com/sebastianbergmann/phpunit/issues/5472): `TestCase::assertStringNotMatchesFormat()` and `TestCase::assertStringNotMatchesFormatFile()` (these methods only have a `@deprecated` annotation for now; using these methods will trigger a deprecation warning in PHPUnit 11; these methods will be removed in PHPUnit 12) -* [#5481](https://github.com/sebastianbergmann/phpunit/issues/5481): `dataSet` attribute for `testCaseMethod` elements in the XML document generated by `--list-tests-xml` (the attribute will not be generated anymore starting with PHPUnit 11) -* [#5513](https://github.com/sebastianbergmann/phpunit/issues/5513): `IgnoreClassForCodeCoverage`, `IgnoreMethodForCodeCoverage`, and `IgnoreFunctionForCodeCoverage` attributes (these attributes will be removed in PHPUnit 11) -* `PHPUnit\TextUI\Configuration\Configuration::cliArgument()` and `PHPUnit\TextUI\Configuration\Configuration::hasCliArgument()` -* `PHPUnit\Framework\Constraint\Constraint::exporter()` - -[10.4.2]: https://github.com/sebastianbergmann/phpunit/compare/10.4.1...10.4.2 -[10.4.1]: https://github.com/sebastianbergmann/phpunit/compare/10.4.0...10.4.1 -[10.4.0]: https://github.com/sebastianbergmann/phpunit/compare/10.3.5...10.4.0 diff --git a/Sources/vendor/phpunit/phpunit/ChangeLog-10.5.md b/Sources/vendor/phpunit/phpunit/ChangeLog-10.5.md new file mode 100644 index 00000000..af8e7071 --- /dev/null +++ b/Sources/vendor/phpunit/phpunit/ChangeLog-10.5.md @@ -0,0 +1,70 @@ +# Changes in PHPUnit 10.5 + +All notable changes of the PHPUnit 10.5 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. + +## [10.5.5] - 2023-12-27 + +### Fixed + +* [#5619](https://github.com/sebastianbergmann/phpunit/pull/5619): Reverted change introduced in PHPUnit 10.5.4 that broke backward compatibility + +## [10.5.4] - 2023-12-27 + +### Fixed + +* [#5592](https://github.com/sebastianbergmann/phpunit/issues/5592): Error Handler prevents `error_get_last()` usage in tests +* [#5592](https://github.com/sebastianbergmann/phpunit/issues/5592): `E_USER_ERROR` does not abort test execution +* [#5612](https://github.com/sebastianbergmann/phpunit/issues/5612): Empty `` element in XML configuration after migrating configuration +* [#5616](https://github.com/sebastianbergmann/phpunit/issues/5616): Values from data provider are not shown for failed test +* [#5619](https://github.com/sebastianbergmann/phpunit/pull/5619): Check and restore error/exception global handlers +* [#5621](https://github.com/sebastianbergmann/phpunit/issues/5621): Name of data set is missing from TeamCity output + +## [10.5.3] - 2023-12-13 + +### Deprecated + +* `Test\AssertionFailed` and `Test\AssertionSucceeded` events +* `PHPUnit\Runner\Extension\Facade::requireExportOfObjects()` and `PHPUnit\Runner\Extension\Facade::requiresExportOfObjects()` +* `registerMockObjectsFromTestArgumentsRecursively` attribute on the `` element of the XML configuration file +* `PHPUnit\TextUI\Configuration\Configuration::registerMockObjectsFromTestArgumentsRecursively()` + +### Fixed + +* [#5614](https://github.com/sebastianbergmann/phpunit/issues/5614): Infinite recursion when data provider provides recursive array + +## [10.5.2] - 2023-12-05 + +### Fixed + +* [#5561](https://github.com/sebastianbergmann/phpunit/issues/5561): JUnit XML logger does not handle assertion failures in before-test methods +* [#5567](https://github.com/sebastianbergmann/phpunit/issues/5567): Infinite recursion when recursive / self-referencing arrays are checked whether they contain only scalar values + +## [10.5.1] - 2023-12-01 + +### Fixed + +* [#5593](https://github.com/sebastianbergmann/phpunit/issues/5593): Return Value Generator fails to correctly create test stub for method with `static` return type declaration when used recursively +* [#5596](https://github.com/sebastianbergmann/phpunit/issues/5596): `PHPUnit\Framework\TestCase` has `@internal` annotation in PHAR + +## [10.5.0] - 2023-12-01 + +### Added + +* [#5532](https://github.com/sebastianbergmann/phpunit/issues/5532): `#[IgnoreDeprecations]` attribute to ignore `E_(USER_)DEPRECATED` issues on test class and test method level +* [#5551](https://github.com/sebastianbergmann/phpunit/issues/5551): Support for omitting parameter default values for `willReturnMap()` +* [#5577](https://github.com/sebastianbergmann/phpunit/issues/5577): `--composer-lock` CLI option for PHAR binary that displays the `composer.lock` used to build the PHAR + +### Changed + +* `MockBuilder::disableAutoReturnValueGeneration()` and `MockBuilder::enableAutoReturnValueGeneration()` are no longer deprecated + +### Fixed + +* [#5563](https://github.com/sebastianbergmann/phpunit/issues/5563): `createMockForIntersectionOfInterfaces()` does not automatically register mock object for expectation verification + +[10.5.5]: https://github.com/sebastianbergmann/phpunit/compare/10.5.4...10.5.5 +[10.5.4]: https://github.com/sebastianbergmann/phpunit/compare/10.5.3...10.5.4 +[10.5.3]: https://github.com/sebastianbergmann/phpunit/compare/10.5.2...10.5.3 +[10.5.2]: https://github.com/sebastianbergmann/phpunit/compare/10.5.1...10.5.2 +[10.5.1]: https://github.com/sebastianbergmann/phpunit/compare/10.5.0...10.5.1 +[10.5.0]: https://github.com/sebastianbergmann/phpunit/compare/10.4.2...10.5.0 diff --git a/Sources/vendor/phpunit/phpunit/DEPRECATIONS.md b/Sources/vendor/phpunit/phpunit/DEPRECATIONS.md index 56c77369..d66cef7e 100644 --- a/Sources/vendor/phpunit/phpunit/DEPRECATIONS.md +++ b/Sources/vendor/phpunit/phpunit/DEPRECATIONS.md @@ -34,8 +34,6 @@ This functionality is currently [soft-deprecated](https://phpunit.de/backward-co | [#5315](https://github.com/sebastianbergmann/phpunit/issues/5315) | `MockBuilder::disableArgumentCloning()` | 10.1.0 | | | [#5315](https://github.com/sebastianbergmann/phpunit/issues/5315) | `MockBuilder::enableArgumentCloning()` | 10.1.0 | | | [#5320](https://github.com/sebastianbergmann/phpunit/issues/5320) | `MockBuilder::addMethods()` | 10.1.0 | | -| [#5421](https://github.com/sebastianbergmann/phpunit/issues/5421) | `MockBuilder::disableAutoReturnValueGeneration()` | 10.3.0 | | -| [#5421](https://github.com/sebastianbergmann/phpunit/issues/5421) | `MockBuilder::enableAutoReturnValueGeneration()` | 10.3.0 | | | [#5423](https://github.com/sebastianbergmann/phpunit/issues/5423) | `TestCase::onConsecutiveCalls()` | 10.3.0 | Use `$double->willReturn()` instead of `$double->will($this->onConsecutiveCalls())` | | [#5423](https://github.com/sebastianbergmann/phpunit/issues/5423) | `TestCase::returnArgument()` | 10.3.0 | Use `$double->willReturnArgument()` instead of `$double->will($this->returnArgument())` | | [#5423](https://github.com/sebastianbergmann/phpunit/issues/5423) | `TestCase::returnCallback()` | 10.3.0 | Use `$double->willReturnCallback()` instead of `$double->will($this->returnCallback())` | @@ -62,20 +60,23 @@ This functionality is currently [soft-deprecated](https://phpunit.de/backward-co ### Extending PHPUnit -| Issue | Description | Since | Replacement | -|-------|--------------------------------------------------------------------------------------------------------|--------|--------------------------------------------------------------------------------| -| | `PHPUnit\TextUI\Configuration\Configuration::excludeDirectories()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->excludeDirectories()` | -| | `PHPUnit\TextUI\Configuration\Configuration::excludeFiles()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->excludeFiles()` | -| | `PHPUnit\TextUI\Configuration\Configuration::includeDirectories()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->includeDirectories()` | -| | `PHPUnit\TextUI\Configuration\Configuration::includeFiles()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->includeFiles()` | -| | `PHPUnit\TextUI\Configuration\Configuration::loadPharExtensions()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::noExtensions()` | -| | `PHPUnit\TextUI\Configuration\Configuration::hasNonEmptyListOfFilesToBeIncludedInCodeCoverageReport()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->notEmpty()` | -| | `PHPUnit\TextUI\Configuration\Configuration::restrictDeprecations()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->restrictDeprecations()` | -| | `PHPUnit\TextUI\Configuration\Configuration::restrictNotices()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->restrictNotices()` | -| | `PHPUnit\TextUI\Configuration\Configuration::restrictWarnings()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->restrictWarnings()` | -| | `PHPUnit\TextUI\Configuration\Configuration::cliArgument()` | 10.4.0 | `PHPUnit\TextUI\Configuration\Configuration::cliArguments()[0]` | -| | `PHPUnit\TextUI\Configuration\Configuration::hasCliArgument()` | 10.4.0 | `PHPUnit\TextUI\Configuration\Configuration::hasCliArguments()` | -| | `PHPUnit\Framework\Constraint\Constraint::exporter()` | 10.4.0 | | +| Issue | Description | Since | Replacement | +|-------|------------------------------------------------------------------------------------------------------------------------------|--------|--------------------------------------------------------------------------------| +| | `PHPUnit\TextUI\Configuration\Configuration::coverageExcludeDirectories()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->excludeDirectories()` | +| | `PHPUnit\TextUI\Configuration\Configuration::coverageExcludeFiles()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->excludeFiles()` | +| | `PHPUnit\TextUI\Configuration\Configuration::coverageIncludeDirectories()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->includeDirectories()` | +| | `PHPUnit\TextUI\Configuration\Configuration::coverageIncludeFiles()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->includeFiles()` | +| | `PHPUnit\TextUI\Configuration\Configuration::loadPharExtensions()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::noExtensions()` | +| | `PHPUnit\TextUI\Configuration\Configuration::hasNonEmptyListOfFilesToBeIncludedInCodeCoverageReport()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->notEmpty()` | +| | `PHPUnit\TextUI\Configuration\Configuration::restrictDeprecations()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->restrictDeprecations()` | +| | `PHPUnit\TextUI\Configuration\Configuration::restrictNotices()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->restrictNotices()` | +| | `PHPUnit\TextUI\Configuration\Configuration::restrictWarnings()` | 10.2.0 | `PHPUnit\TextUI\Configuration\Configuration::source()->restrictWarnings()` | +| | `PHPUnit\TextUI\Configuration\Configuration::cliArgument()` | 10.4.0 | `PHPUnit\TextUI\Configuration\Configuration::cliArguments()[0]` | +| | `PHPUnit\TextUI\Configuration\Configuration::hasCliArgument()` | 10.4.0 | `PHPUnit\TextUI\Configuration\Configuration::hasCliArguments()` | +| | `PHPUnit\Framework\Constraint\Constraint::exporter()` | 10.4.0 | | +| | `PHPUnit\TextUI\Configuration\Configuration::registerMockObjectsFromTestArgumentsRecursively()` | 10.5.3 | | +| | `Test\AssertionFailed` and `Test\AssertionSucceeded` events | 10.5.3 | | +| | `PHPUnit\Runner\Extension\Facade::requireExportOfObjects()` and `PHPUnit\Runner\Extension\Facade::requiresExportOfObjects()` | 10.5.3 | | ## Hard Deprecations diff --git a/Sources/vendor/phpunit/phpunit/README.md b/Sources/vendor/phpunit/phpunit/README.md index 0e4789a0..1ec859a1 100644 --- a/Sources/vendor/phpunit/phpunit/README.md +++ b/Sources/vendor/phpunit/phpunit/README.md @@ -1,5 +1,3 @@ - - # PHPUnit [![Latest Stable Version](https://poser.pugx.org/phpunit/phpunit/v/stable.png)](https://packagist.org/packages/phpunit/phpunit) diff --git a/Sources/vendor/phpunit/phpunit/SECURITY.md b/Sources/vendor/phpunit/phpunit/SECURITY.md index 965e5ed2..5f55c419 100644 --- a/Sources/vendor/phpunit/phpunit/SECURITY.md +++ b/Sources/vendor/phpunit/phpunit/SECURITY.md @@ -24,7 +24,7 @@ PHPUnit is a framework for writing as well as a command-line tool for running te **If you upload PHPUnit to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** -Please note that if you upload PHPUnit to a webserver "bad things" may happen. [You have been warned.](https://thephp.cc/articles/phpunit-a-security-risk) +Please note that if you upload PHPUnit to a webserver "bad things" may happen. [You have been warned.](https://thephp.cc/articles/phpunit-a-security-risk?ref=phpunit) PHPUnit is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using PHPUnit in an HTTP or web context or with untrusted input data is performed. PHPUnit might also contain functionality that intentionally exposes internal application data for debugging purposes. diff --git a/Sources/vendor/phpunit/phpunit/composer.json b/Sources/vendor/phpunit/phpunit/composer.json index bce9e30a..4f81fae0 100644 --- a/Sources/vendor/phpunit/phpunit/composer.json +++ b/Sources/vendor/phpunit/phpunit/composer.json @@ -84,7 +84,7 @@ }, "extra": { "branch-alias": { - "dev-main": "10.4-dev" + "dev-main": "10.5-dev" } } } diff --git a/Sources/vendor/phpunit/phpunit/composer.lock b/Sources/vendor/phpunit/phpunit/composer.lock new file mode 100644 index 00000000..d41087fd --- /dev/null +++ b/Sources/vendor/phpunit/phpunit/composer.lock @@ -0,0 +1,1542 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "e06728e5442edec84af96f94a889b4a7", + "packages": [ + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.18.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + }, + "time": "2023-12-10T21:03:43+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.11", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "78c3b7625965c2513ee96569a4dbb62601784145" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", + "reference": "78c3b7625965c2513ee96569a4dbb62601784145", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T15:38:30+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:15+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-14T13:18:12+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68ff824baeae169ec9f2137158ee529584553799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:37:17+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T10:55:06+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-04-11T05:39:26+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-09-24T13:22:09+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-07-19T07:19:23+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:38:20+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2023-11-20T00:12:19+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=8.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*" + }, + "platform-dev": [], + "platform-overrides": { + "php": "8.1.0" + }, + "plugin-api-version": "2.6.0" +} diff --git a/Sources/vendor/phpunit/phpunit/phpunit.xsd b/Sources/vendor/phpunit/phpunit/phpunit.xsd index bd22b2ca..42a84489 100644 --- a/Sources/vendor/phpunit/phpunit/phpunit.xsd +++ b/Sources/vendor/phpunit/phpunit/phpunit.xsd @@ -2,7 +2,7 @@ - This Schema file defines the rules by which the XML configuration file of PHPUnit 10.4 may be structured. + This Schema file defines the rules by which the XML configuration file of PHPUnit 10.5 may be structured. diff --git a/Sources/vendor/phpunit/phpunit/src/Event/Emitter/DispatchingEmitter.php b/Sources/vendor/phpunit/phpunit/src/Event/Emitter/DispatchingEmitter.php index 857a870c..254b7225 100644 --- a/Sources/vendor/phpunit/phpunit/src/Event/Emitter/DispatchingEmitter.php +++ b/Sources/vendor/phpunit/phpunit/src/Event/Emitter/DispatchingEmitter.php @@ -45,11 +45,17 @@ final class DispatchingEmitter implements Emitter $this->previousSnapshot = $system->snapshot(); } + /** + * @deprecated + */ public function exportObjects(): void { $this->exportObjects = true; } + /** + * @deprecated + */ public function exportsObjects(): bool { return $this->exportObjects; @@ -477,6 +483,8 @@ final class DispatchingEmitter implements Emitter /** * @throws InvalidArgumentException * @throws UnknownEventTypeException + * + * @deprecated */ public function testAssertionSucceeded(mixed $value, Constraint\Constraint $constraint, string $message): void { @@ -494,6 +502,8 @@ final class DispatchingEmitter implements Emitter /** * @throws InvalidArgumentException * @throws UnknownEventTypeException + * + * @deprecated */ public function testAssertionFailed(mixed $value, Constraint\Constraint $constraint, string $message): void { @@ -751,6 +761,8 @@ final class DispatchingEmitter implements Emitter } /** + * @psalm-param non-empty-string $message + * * @throws InvalidArgumentException * @throws UnknownEventTypeException */ @@ -766,10 +778,14 @@ final class DispatchingEmitter implements Emitter } /** + * @psalm-param non-empty-string $message + * @psalm-param non-empty-string $file + * @psalm-param positive-int $line + * * @throws InvalidArgumentException * @throws UnknownEventTypeException */ - public function testTriggeredPhpDeprecation(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void + public function testTriggeredPhpDeprecation(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, bool $ignoredByTest): void { $this->dispatcher->dispatch( new Test\PhpDeprecationTriggered( @@ -780,15 +796,20 @@ final class DispatchingEmitter implements Emitter $line, $suppressed, $ignoredByBaseline, + $ignoredByTest, ), ); } /** + * @psalm-param non-empty-string $message + * @psalm-param non-empty-string $file + * @psalm-param positive-int $line + * * @throws InvalidArgumentException * @throws UnknownEventTypeException */ - public function testTriggeredDeprecation(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void + public function testTriggeredDeprecation(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, bool $ignoredByTest): void { $this->dispatcher->dispatch( new Test\DeprecationTriggered( @@ -799,11 +820,16 @@ final class DispatchingEmitter implements Emitter $line, $suppressed, $ignoredByBaseline, + $ignoredByTest, ), ); } /** + * @psalm-param non-empty-string $message + * @psalm-param non-empty-string $file + * @psalm-param positive-int $line + * * @throws InvalidArgumentException * @throws UnknownEventTypeException */ @@ -822,6 +848,10 @@ final class DispatchingEmitter implements Emitter } /** + * @psalm-param non-empty-string $message + * @psalm-param non-empty-string $file + * @psalm-param positive-int $line + * * @throws InvalidArgumentException * @throws UnknownEventTypeException */ @@ -841,6 +871,10 @@ final class DispatchingEmitter implements Emitter } /** + * @psalm-param non-empty-string $message + * @psalm-param non-empty-string $file + * @psalm-param positive-int $line + * * @throws InvalidArgumentException * @throws UnknownEventTypeException */ @@ -860,6 +894,10 @@ final class DispatchingEmitter implements Emitter } /** + * @psalm-param non-empty-string $message + * @psalm-param non-empty-string $file + * @psalm-param positive-int $line + * * @throws InvalidArgumentException * @throws UnknownEventTypeException */ @@ -879,6 +917,10 @@ final class DispatchingEmitter implements Emitter } /** + * @psalm-param non-empty-string $message + * @psalm-param non-empty-string $file + * @psalm-param positive-int $line + * * @throws InvalidArgumentException * @throws UnknownEventTypeException */ @@ -898,6 +940,8 @@ final class DispatchingEmitter implements Emitter } /** + * @psalm-param non-empty-string $message + * * @throws InvalidArgumentException * @throws UnknownEventTypeException */ @@ -913,6 +957,8 @@ final class DispatchingEmitter implements Emitter } /** + * @psalm-param non-empty-string $message + * * @throws InvalidArgumentException * @throws UnknownEventTypeException */ diff --git a/Sources/vendor/phpunit/phpunit/src/Event/Emitter/Emitter.php b/Sources/vendor/phpunit/phpunit/src/Event/Emitter/Emitter.php index e9fb74e9..f56d64b8 100644 --- a/Sources/vendor/phpunit/phpunit/src/Event/Emitter/Emitter.php +++ b/Sources/vendor/phpunit/phpunit/src/Event/Emitter/Emitter.php @@ -21,8 +21,14 @@ use PHPUnit\TextUI\Configuration\Configuration; */ interface Emitter { + /** + * @deprecated + */ public function exportObjects(): void; + /** + * @deprecated + */ public function exportsObjects(): bool; public function applicationStarted(): void; @@ -109,8 +115,14 @@ interface Emitter */ public function testRegisteredComparator(string $className): void; + /** + * @deprecated + */ public function testAssertionSucceeded(mixed $value, Constraint\Constraint $constraint, string $message): void; + /** + * @deprecated + */ public function testAssertionFailed(mixed $value, Constraint\Constraint $constraint, string $message): void; /** @@ -165,30 +177,80 @@ interface Emitter public function testPassed(Code\Test $test): void; + /** + * @psalm-param non-empty-string $message + */ public function testConsideredRisky(Code\Test $test, string $message): void; public function testMarkedAsIncomplete(Code\Test $test, Throwable $throwable): void; + /** + * @psalm-param non-empty-string $message + */ public function testSkipped(Code\Test $test, string $message): void; + /** + * @psalm-param non-empty-string $message + */ public function testTriggeredPhpunitDeprecation(Code\Test $test, string $message): void; - public function testTriggeredPhpDeprecation(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void; + /** + * @psalm-param non-empty-string $message + * @psalm-param non-empty-string $file + * @psalm-param positive-int $line + */ + public function testTriggeredPhpDeprecation(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, bool $ignoredByTest): void; - public function testTriggeredDeprecation(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void; + /** + * @psalm-param non-empty-string $message + * @psalm-param non-empty-string $file + * @psalm-param positive-int $line + */ + public function testTriggeredDeprecation(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, bool $ignoredByTest): void; + /** + * @psalm-param non-empty-string $message + * @psalm-param non-empty-string $file + * @psalm-param positive-int $line + */ public function testTriggeredError(Code\Test $test, string $message, string $file, int $line, bool $suppressed): void; + /** + * @psalm-param non-empty-string $message + * @psalm-param non-empty-string $file + * @psalm-param positive-int $line + */ public function testTriggeredNotice(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void; + /** + * @psalm-param non-empty-string $message + * @psalm-param non-empty-string $file + * @psalm-param positive-int $line + */ public function testTriggeredPhpNotice(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void; + /** + * @psalm-param non-empty-string $message + * @psalm-param non-empty-string $file + * @psalm-param positive-int $line + */ public function testTriggeredWarning(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void; + /** + * @psalm-param non-empty-string $message + * @psalm-param non-empty-string $file + * @psalm-param positive-int $line + */ public function testTriggeredPhpWarning(Code\Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void; + /** + * @psalm-param non-empty-string $message + */ public function testTriggeredPhpunitError(Code\Test $test, string $message): void; + /** + * @psalm-param non-empty-string $message + */ public function testTriggeredPhpunitWarning(Code\Test $test, string $message): void; /** diff --git a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailed.php b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailed.php index cab77823..68954f20 100644 --- a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailed.php +++ b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailed.php @@ -15,6 +15,8 @@ use PHPUnit\Event\Telemetry; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @deprecated */ final class AssertionFailed implements Event { diff --git a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailedSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailedSubscriber.php index a14cd5f5..c569bcc2 100644 --- a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailedSubscriber.php +++ b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailedSubscriber.php @@ -13,6 +13,8 @@ use PHPUnit\Event\Subscriber; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @deprecated */ interface AssertionFailedSubscriber extends Subscriber { diff --git a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceeded.php b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceeded.php index 405753e8..d4f85484 100644 --- a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceeded.php +++ b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceeded.php @@ -15,6 +15,8 @@ use PHPUnit\Event\Telemetry; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @deprecated */ final class AssertionSucceeded implements Event { diff --git a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceededSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceededSubscriber.php index 535860a3..59d72c0f 100644 --- a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceededSubscriber.php +++ b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceededSubscriber.php @@ -13,6 +13,8 @@ use PHPUnit\Event\Subscriber; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @deprecated */ interface AssertionSucceededSubscriber extends Subscriber { diff --git a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggered.php b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggered.php index 7eeb2340..d4d495da 100644 --- a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggered.php +++ b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggered.php @@ -41,13 +41,14 @@ final class DeprecationTriggered implements Event private readonly int $line; private readonly bool $suppressed; private readonly bool $ignoredByBaseline; + private readonly bool $ignoredByTest; /** * @psalm-param non-empty-string $message * @psalm-param non-empty-string $file * @psalm-param positive-int $line */ - public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline) + public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, bool $ignoredByTest) { $this->telemetryInfo = $telemetryInfo; $this->test = $test; @@ -56,6 +57,7 @@ final class DeprecationTriggered implements Event $this->line = $line; $this->suppressed = $suppressed; $this->ignoredByBaseline = $ignoredByBaseline; + $this->ignoredByTest = $ignoredByTest; } public function telemetryInfo(): Telemetry\Info @@ -102,6 +104,11 @@ final class DeprecationTriggered implements Event return $this->ignoredByBaseline; } + public function ignoredByTest(): bool + { + return $this->ignoredByTest; + } + public function asString(): string { $message = $this->message; @@ -112,7 +119,9 @@ final class DeprecationTriggered implements Event $status = ''; - if ($this->ignoredByBaseline) { + if ($this->ignoredByTest) { + $status = 'Test-Ignored '; + } elseif ($this->ignoredByBaseline) { $status = 'Baseline-Ignored '; } elseif ($this->suppressed) { $status = 'Suppressed '; diff --git a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggered.php b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggered.php index a59e5c41..9c93fd42 100644 --- a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggered.php +++ b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggered.php @@ -41,13 +41,14 @@ final class PhpDeprecationTriggered implements Event private readonly int $line; private readonly bool $suppressed; private readonly bool $ignoredByBaseline; + private readonly bool $ignoredByTest; /** * @psalm-param non-empty-string $message * @psalm-param non-empty-string $file * @psalm-param positive-int $line */ - public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline) + public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, bool $ignoredByTest) { $this->telemetryInfo = $telemetryInfo; $this->test = $test; @@ -56,6 +57,7 @@ final class PhpDeprecationTriggered implements Event $this->line = $line; $this->suppressed = $suppressed; $this->ignoredByBaseline = $ignoredByBaseline; + $this->ignoredByTest = $ignoredByTest; } public function telemetryInfo(): Telemetry\Info @@ -102,6 +104,11 @@ final class PhpDeprecationTriggered implements Event return $this->ignoredByBaseline; } + public function ignoredByTest(): bool + { + return $this->ignoredByTest; + } + public function asString(): string { $message = $this->message; @@ -112,7 +119,9 @@ final class PhpDeprecationTriggered implements Event $status = ''; - if ($this->ignoredByBaseline) { + if ($this->ignoredByTest) { + $status = 'Test-Ignored '; + } elseif ($this->ignoredByBaseline) { $status = 'Baseline-Ignored '; } elseif ($this->suppressed) { $status = 'Suppressed '; diff --git a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggered.php b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggered.php index fadc46d2..3b1162f4 100644 --- a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggered.php +++ b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggered.php @@ -24,8 +24,15 @@ final class PhpunitDeprecationTriggered implements Event { private readonly Telemetry\Info $telemetryInfo; private readonly Test $test; + + /** + * @psalm-var non-empty-string + */ private readonly string $message; + /** + * @psalm-param non-empty-string $message + */ public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message) { $this->telemetryInfo = $telemetryInfo; @@ -43,6 +50,9 @@ final class PhpunitDeprecationTriggered implements Event return $this->test; } + /** + * @psalm-return non-empty-string + */ public function message(): string { return $this->message; diff --git a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggered.php b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggered.php index e5b75b4d..8e7d7d4d 100644 --- a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggered.php +++ b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggered.php @@ -25,8 +25,15 @@ final class PhpunitErrorTriggered implements Event { private readonly Telemetry\Info $telemetryInfo; private readonly Test $test; + + /** + * @psalm-var non-empty-string + */ private readonly string $message; + /** + * @psalm-param non-empty-string $message + */ public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message) { $this->telemetryInfo = $telemetryInfo; @@ -44,6 +51,9 @@ final class PhpunitErrorTriggered implements Event return $this->test; } + /** + * @psalm-return non-empty-string + */ public function message(): string { return $this->message; diff --git a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggered.php b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggered.php index 6a816ee4..164c6eb1 100644 --- a/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggered.php +++ b/Sources/vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggered.php @@ -24,8 +24,15 @@ final class PhpunitWarningTriggered implements Event { private readonly Telemetry\Info $telemetryInfo; private readonly Test $test; + + /** + * @psalm-var non-empty-string + */ private readonly string $message; + /** + * @psalm-param non-empty-string $message + */ public function __construct(Telemetry\Info $telemetryInfo, Test $test, string $message) { $this->telemetryInfo = $telemetryInfo; @@ -43,6 +50,9 @@ final class PhpunitWarningTriggered implements Event return $this->test; } + /** + * @psalm-return non-empty-string + */ public function message(): string { return $this->message; diff --git a/Sources/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromDataProvider.php b/Sources/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromDataProvider.php index 7ca96dd0..fb7d5610 100644 --- a/Sources/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromDataProvider.php +++ b/Sources/vendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromDataProvider.php @@ -17,15 +17,17 @@ namespace PHPUnit\Event\TestData; final class DataFromDataProvider extends TestData { private readonly int|string $dataSetName; + private readonly string $dataAsStringForResultOutput; - public static function from(int|string $dataSetName, string $data): self + public static function from(int|string $dataSetName, string $data, string $dataAsStringForResultOutput): self { - return new self($dataSetName, $data); + return new self($dataSetName, $data, $dataAsStringForResultOutput); } - protected function __construct(int|string $dataSetName, string $data) + protected function __construct(int|string $dataSetName, string $data, string $dataAsStringForResultOutput) { - $this->dataSetName = $dataSetName; + $this->dataSetName = $dataSetName; + $this->dataAsStringForResultOutput = $dataAsStringForResultOutput; parent::__construct($data); } @@ -35,6 +37,14 @@ final class DataFromDataProvider extends TestData return $this->dataSetName; } + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function dataAsStringForResultOutput(): string + { + return $this->dataAsStringForResultOutput; + } + /** * @psalm-assert-if-true DataFromDataProvider $this */ diff --git a/Sources/vendor/phpunit/phpunit/src/Event/Value/Test/TestMethod.php b/Sources/vendor/phpunit/phpunit/src/Event/Value/Test/TestMethod.php index 58b2e015..40330891 100644 --- a/Sources/vendor/phpunit/phpunit/src/Event/Value/Test/TestMethod.php +++ b/Sources/vendor/phpunit/phpunit/src/Event/Value/Test/TestMethod.php @@ -12,7 +12,6 @@ namespace PHPUnit\Event\Code; use function assert; use function is_int; use function sprintf; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; use PHPUnit\Event\TestData\TestDataCollection; use PHPUnit\Metadata\MetadataCollection; @@ -108,8 +107,6 @@ final class TestMethod extends Test /** * @psalm-return non-empty-string - * - * @throws NoDataSetFromDataProviderException */ public function id(): string { @@ -124,8 +121,6 @@ final class TestMethod extends Test /** * @psalm-return non-empty-string - * - * @throws NoDataSetFromDataProviderException */ public function nameWithClass(): string { @@ -134,8 +129,6 @@ final class TestMethod extends Test /** * @psalm-return non-empty-string - * - * @throws NoDataSetFromDataProviderException */ public function name(): string { diff --git a/Sources/vendor/phpunit/phpunit/src/Event/Value/Test/TestMethodBuilder.php b/Sources/vendor/phpunit/phpunit/src/Event/Value/Test/TestMethodBuilder.php index 8d413f63..59a9fef6 100644 --- a/Sources/vendor/phpunit/phpunit/src/Event/Value/Test/TestMethodBuilder.php +++ b/Sources/vendor/phpunit/phpunit/src/Event/Value/Test/TestMethodBuilder.php @@ -80,6 +80,7 @@ final class TestMethodBuilder $testData[] = DataFromDataProvider::from( $dataSetName, Exporter::export($testCase->providedData(), EventFacade::emitter()->exportsObjects()), + $testCase->dataSetAsStringWithData(), ); } diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php b/Sources/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php index b421d349..21a74a3f 100644 --- a/Sources/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php +++ b/Sources/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php @@ -1134,9 +1134,9 @@ if (!function_exists('PHPUnit\Framework\assertObjectHasProperty')) { * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * - * @see Assert::assertObjectHasProperty() + * @see Assert::assertObjectHasProperty */ - function assertObjectHasProperty(string $attributeName, object $object, string $message = ''): void + function assertObjectHasProperty(string $propertyName, object $object, string $message = ''): void { Assert::assertObjectHasProperty(...func_get_args()); } @@ -1150,9 +1150,9 @@ if (!function_exists('PHPUnit\Framework\assertObjectNotHasProperty')) { * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * - * @see Assert::assertObjectNotHasProperty() + * @see Assert::assertObjectNotHasProperty */ - function assertObjectNotHasProperty(string $attributeName, object $object, string $message = ''): void + function assertObjectNotHasProperty(string $propertyName, object $object, string $message = ''): void { Assert::assertObjectNotHasProperty(...func_get_args()); } @@ -1206,6 +1206,7 @@ if (!function_exists('PHPUnit\Framework\assertInstanceOf')) { * * @throws Exception * @throws ExpectationFailedException + * @throws UnknownClassOrInterfaceException * * @psalm-template ExpectedType of object * @@ -1856,10 +1857,11 @@ if (!function_exists('PHPUnit\Framework\assertStringNotMatchesFormat')) { * * @throws ExpectationFailedException * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5472 + * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringNotMatchesFormat - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5472 */ function assertStringNotMatchesFormat(string $format, string $string, string $message = ''): void { @@ -1889,10 +1891,11 @@ if (!function_exists('PHPUnit\Framework\assertStringNotMatchesFormatFile')) { * * @throws ExpectationFailedException * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5472 + * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringNotMatchesFormatFile - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5472 */ function assertStringNotMatchesFormatFile(string $formatFile, string $string, string $message = ''): void { @@ -2264,9 +2267,6 @@ if (!function_exists('PHPUnit\Framework\assertJsonFileNotEqualsJsonFile')) { } if (!function_exists('PHPUnit\Framework\logicalAnd')) { - /** - * @throws Exception - */ function logicalAnd(mixed ...$constraints): LogicalAnd { return Assert::logicalAnd(...func_get_args()); @@ -2372,9 +2372,6 @@ if (!function_exists('PHPUnit\Framework\containsIdentical')) { } if (!function_exists('PHPUnit\Framework\containsOnly')) { - /** - * @throws Exception - */ function containsOnly(string $type): TraversableContainsOnly { return Assert::containsOnly(...func_get_args()); @@ -2382,9 +2379,6 @@ if (!function_exists('PHPUnit\Framework\containsOnly')) { } if (!function_exists('PHPUnit\Framework\containsOnlyInstancesOf')) { - /** - * @throws Exception - */ function containsOnlyInstancesOf(string $className): TraversableContainsOnly { return Assert::containsOnlyInstancesOf(...func_get_args()); @@ -2490,9 +2484,6 @@ if (!function_exists('PHPUnit\Framework\identicalTo')) { } if (!function_exists('PHPUnit\Framework\isInstanceOf')) { - /** - * @throws UnknownClassOrInterfaceException - */ function isInstanceOf(string $className): IsInstanceOf { return Assert::isInstanceOf(...func_get_args()); @@ -2500,9 +2491,6 @@ if (!function_exists('PHPUnit\Framework\isInstanceOf')) { } if (!function_exists('PHPUnit\Framework\isType')) { - /** - * @throws Exception - */ function isType(string $type): IsType { return Assert::isType(...func_get_args()); @@ -2538,9 +2526,6 @@ if (!function_exists('PHPUnit\Framework\matches')) { } if (!function_exists('PHPUnit\Framework\stringStartsWith')) { - /** - * @throws InvalidArgumentException - */ function stringStartsWith(string $prefix): StringStartsWith { return Assert::stringStartsWith(...func_get_args()); @@ -2548,9 +2533,6 @@ if (!function_exists('PHPUnit\Framework\stringStartsWith')) { } if (!function_exists('PHPUnit\Framework\stringContains')) { - /** - * @throws InvalidArgumentException - */ function stringContains(string $string, bool $case = true): StringContains { return Assert::stringContains(...func_get_args()); @@ -2558,9 +2540,6 @@ if (!function_exists('PHPUnit\Framework\stringContains')) { } if (!function_exists('PHPUnit\Framework\stringEndsWith')) { - /** - * @throws InvalidArgumentException - */ function stringEndsWith(string $suffix): StringEndsWith { return Assert::stringEndsWith(...func_get_args()); diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php b/Sources/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php new file mode 100644 index 00000000..cf48aac1 --- /dev/null +++ b/Sources/vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Attributes; + +use Attribute; + +/** + * @psalm-immutable + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + */ +#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)] +final class IgnoreDeprecations +{ +} diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php b/Sources/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php index e4e9f3c9..f3cd3c3d 100644 --- a/Sources/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php +++ b/Sources/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php @@ -9,6 +9,7 @@ */ namespace PHPUnit\Framework\Constraint; +use Countable; use PHPUnit\Framework\Exception; /** @@ -17,7 +18,7 @@ use PHPUnit\Framework\Exception; final class SameSize extends Count { /** - * @psalm-param \Countable|iterable $expected + * @psalm-param Countable|iterable $expected * * @throws Exception */ diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php b/Sources/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php index 109438ec..425569d1 100644 --- a/Sources/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php +++ b/Sources/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php @@ -64,7 +64,6 @@ final class IsEqualCanonicalizing extends Constraint $other, 0.0, true, - false, ); } catch (ComparisonFailure $f) { if ($returnResult) { diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php b/Sources/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php index e3fa7a40..48be6317 100644 --- a/Sources/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php +++ b/Sources/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php @@ -16,6 +16,7 @@ use function sprintf; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Util\Exporter; use SebastianBergmann\Comparator\ComparisonFailure; +use UnitEnum; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit @@ -62,8 +63,8 @@ final class IsIdentical extends Constraint ); } - // if both values are array, make sure a diff is generated - if (is_array($this->value) && is_array($other)) { + // if both values are array or enums, make sure a diff is generated + if ((is_array($this->value) && is_array($other)) || ($this->value instanceof UnitEnum && $other instanceof UnitEnum)) { $f = new ComparisonFailure( $this->value, $other, diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php b/Sources/vendor/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php new file mode 100644 index 00000000..e645e69f --- /dev/null +++ b/Sources/vendor/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @psalm-immutable + * + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class PhptAssertionFailedError extends AssertionFailedError +{ + private readonly string $syntheticFile; + private readonly int $syntheticLine; + private readonly array $syntheticTrace; + private readonly string $diff; + + public function __construct(string $message, int $code, string $file, int $line, array $trace, string $diff) + { + parent::__construct($message, $code); + + $this->syntheticFile = $file; + $this->syntheticLine = $line; + $this->syntheticTrace = $trace; + $this->diff = $diff; + } + + public function syntheticFile(): string + { + return $this->syntheticFile; + } + + public function syntheticLine(): int + { + return $this->syntheticLine; + } + + public function syntheticTrace(): array + { + return $this->syntheticTrace; + } + + public function diff(): string + { + return $this->diff; + } +} diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php b/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php index d517ffde..d48d6fa1 100644 --- a/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php +++ b/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php @@ -20,15 +20,29 @@ final class ConfigurableMethod * @psalm-var non-empty-string */ private readonly string $name; + + /** + * @psalm-var array + */ + private readonly array $defaultParameterValues; + + /** + * @psalm-var non-negative-int + */ + private readonly int $numberOfParameters; private readonly Type $returnType; /** * @psalm-param non-empty-string $name + * @psalm-param array $defaultParameterValues + * @psalm-param non-negative-int $numberOfParameters */ - public function __construct(string $name, Type $returnType) + public function __construct(string $name, array $defaultParameterValues, int $numberOfParameters, Type $returnType) { - $this->name = $name; - $this->returnType = $returnType; + $this->name = $name; + $this->defaultParameterValues = $defaultParameterValues; + $this->numberOfParameters = $numberOfParameters; + $this->returnType = $returnType; } /** @@ -39,6 +53,22 @@ final class ConfigurableMethod return $this->name; } + /** + * @psalm-return array + */ + public function defaultParameterValues(): array + { + return $this->defaultParameterValues; + } + + /** + * @psalm-return non-negative-int + */ + public function numberOfParameters(): int + { + return $this->numberOfParameters; + } + public function mayReturn(mixed $value): bool { return $this->returnType->isAssignable(Type::fromValue($value, false)); diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Generator.php b/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Generator.php index 45d8460a..c140ca26 100644 --- a/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Generator.php +++ b/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Generator.php @@ -730,7 +730,13 @@ final class Generator foreach ($mockMethods->asArray() as $mockMethod) { $mockedMethods .= $mockMethod->generateCode(); - $configurable[] = new ConfigurableMethod($mockMethod->methodName(), $mockMethod->returnType()); + + $configurable[] = new ConfigurableMethod( + $mockMethod->methodName(), + $mockMethod->defaultParameterValues(), + $mockMethod->numberOfParameters(), + $mockMethod->returnType(), + ); } /** @psalm-var trait-string[] $traits */ diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethod.php b/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethod.php index e6955e51..4c58e8c6 100644 --- a/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethod.php +++ b/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethod.php @@ -9,6 +9,7 @@ */ namespace PHPUnit\Framework\MockObject\Generator; +use function count; use function explode; use function implode; use function is_object; @@ -54,6 +55,16 @@ final class MockMethod private readonly bool $static; private readonly ?string $deprecation; + /** + * @psalm-var array + */ + private readonly array $defaultParameterValues; + + /** + * @psalm-var non-negative-int + */ + private readonly int $numberOfParameters; + /** * @throws ReflectionException * @throws RuntimeException @@ -94,6 +105,8 @@ final class MockMethod $modifier, self::methodParametersForDeclaration($method), self::methodParametersForCall($method), + self::methodParametersDefaultValues($method), + count($method->getParameters()), (new ReflectionMapper)->fromReturnType($method), $reference, $callOriginalMethod, @@ -115,6 +128,8 @@ final class MockMethod 'public', '', '', + [], + 0, new UnknownType, '', false, @@ -124,10 +139,12 @@ final class MockMethod } /** - * @param class-string $className - * @param non-empty-string $methodName + * @psalm-param class-string $className + * @psalm-param non-empty-string $methodName + * @psalm-param array $defaultParameterValues + * @psalm-param non-negative-int $numberOfParameters */ - private function __construct(string $className, string $methodName, bool $cloneArguments, string $modifier, string $argumentsForDeclaration, string $argumentsForCall, Type $returnType, string $reference, bool $callOriginalMethod, bool $static, ?string $deprecation) + private function __construct(string $className, string $methodName, bool $cloneArguments, string $modifier, string $argumentsForDeclaration, string $argumentsForCall, array $defaultParameterValues, int $numberOfParameters, Type $returnType, string $reference, bool $callOriginalMethod, bool $static, ?string $deprecation) { $this->className = $className; $this->methodName = $methodName; @@ -135,6 +152,8 @@ final class MockMethod $this->modifier = $modifier; $this->argumentsForDeclaration = $argumentsForDeclaration; $this->argumentsForCall = $argumentsForCall; + $this->defaultParameterValues = $defaultParameterValues; + $this->numberOfParameters = $numberOfParameters; $this->returnType = $returnType; $this->reference = $reference; $this->callOriginalMethod = $callOriginalMethod; @@ -215,6 +234,22 @@ EOT; return $this->returnType; } + /** + * @psalm-return array + */ + public function defaultParameterValues(): array + { + return $this->defaultParameterValues; + } + + /** + * @psalm-return non-negative-int + */ + public function numberOfParameters(): int + { + return $this->numberOfParameters; + } + /** * Returns the parameters of a function or method. * @@ -329,4 +364,22 @@ EOT; } // @codeCoverageIgnoreEnd } + + /** + * @psalm-return array + */ + private static function methodParametersDefaultValues(ReflectionMethod $method): array + { + $result = []; + + foreach ($method->getParameters() as $i => $parameter) { + if (!$parameter->isDefaultValueAvailable()) { + continue; + } + + $result[$i] = $parameter->getDefaultValue(); + } + + return $result; + } } diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php b/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php index e5e78c86..ffd130c4 100644 --- a/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php +++ b/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php @@ -463,8 +463,6 @@ final class MockBuilder /** * @return $this - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5421 */ public function enableAutoReturnValueGeneration(): self { @@ -475,8 +473,6 @@ final class MockBuilder /** * @return $this - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5421 */ public function disableAutoReturnValueGeneration(): self { diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationMocker.php b/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationMocker.php index f7d1d168..fbff6cbd 100644 --- a/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationMocker.php +++ b/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationMocker.php @@ -13,8 +13,11 @@ use function array_flip; use function array_key_exists; use function array_map; use function array_merge; +use function array_pop; +use function assert; use function count; use function is_string; +use function range; use function strtolower; use PHPUnit\Framework\Constraint\Constraint; use PHPUnit\Framework\InvalidArgumentException; @@ -117,7 +120,45 @@ final class InvocationMocker implements InvocationStubber, MethodNameMatch public function willReturnMap(array $valueMap): self { - $stub = new ReturnValueMap($valueMap); + $method = $this->configuredMethod(); + + assert($method instanceof ConfigurableMethod); + + $numberOfParameters = $method->numberOfParameters(); + $defaultValues = $method->defaultParameterValues(); + $hasDefaultValues = !empty($defaultValues); + + $_valueMap = []; + + foreach ($valueMap as $mapping) { + $numberOfConfiguredParameters = count($mapping) - 1; + + if ($numberOfConfiguredParameters === $numberOfParameters || !$hasDefaultValues) { + $_valueMap[] = $mapping; + + continue; + } + + $_mapping = []; + $returnValue = array_pop($mapping); + + foreach (range(0, $numberOfParameters - 1) as $i) { + if (isset($mapping[$i])) { + $_mapping[] = $mapping[$i]; + + continue; + } + + if (isset($defaultValues[$i])) { + $_mapping[] = $defaultValues[$i]; + } + } + + $_mapping[] = $returnValue; + $_valueMap[] = $_mapping; + } + + $stub = new ReturnValueMap($_valueMap); return $this->will($stub); } diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/ReturnValueGenerator.php b/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/ReturnValueGenerator.php index 8338d425..8ae64c9b 100644 --- a/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/ReturnValueGenerator.php +++ b/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/ReturnValueGenerator.php @@ -178,7 +178,7 @@ final class ReturnValueGenerator * * @throws RuntimeException */ - private function newInstanceOf(string $stubClassName, string $className, string $methodName): MockObject + private function newInstanceOf(string $stubClassName, string $className, string $methodName): Stub { try { return (new ReflectionClass($stubClassName))->newInstanceWithoutConstructor(); diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/MethodName.php b/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/MethodName.php index 3c410128..d6eda846 100644 --- a/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/MethodName.php +++ b/Sources/vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/MethodName.php @@ -11,6 +11,7 @@ namespace PHPUnit\Framework\MockObject\Rule; use function is_string; use PHPUnit\Framework\Constraint\Constraint; +use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\InvalidArgumentException; use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; use PHPUnit\Framework\MockObject\MethodNameConstraint; @@ -40,7 +41,7 @@ final class MethodName } /** - * @throws \PHPUnit\Framework\ExpectationFailedException + * @throws ExpectationFailedException */ public function matches(BaseInvocation $invocation): bool { @@ -48,7 +49,7 @@ final class MethodName } /** - * @throws \PHPUnit\Framework\ExpectationFailedException + * @throws ExpectationFailedException */ public function matchesName(string $methodName): bool { diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/TestCase.php b/Sources/vendor/phpunit/phpunit/src/Framework/TestCase.php index c03ae295..9f9c0b0d 100644 --- a/Sources/vendor/phpunit/phpunit/src/Framework/TestCase.php +++ b/Sources/vendor/phpunit/phpunit/src/Framework/TestCase.php @@ -57,11 +57,11 @@ use DeepCopy\DeepCopy; use PHPUnit\Event; use PHPUnit\Event\NoPreviousThrowableException; use PHPUnit\Event\TestData\MoreThanOneDataSetFromDataProviderException; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; use PHPUnit\Framework\Constraint\Exception as ExceptionConstraint; use PHPUnit\Framework\Constraint\ExceptionCode; use PHPUnit\Framework\Constraint\ExceptionMessageIsOrContains; use PHPUnit\Framework\Constraint\ExceptionMessageMatchesRegularExpression; +use PHPUnit\Framework\MockObject\Exception as MockObjectException; use PHPUnit\Framework\MockObject\Generator\Generator as MockGenerator; use PHPUnit\Framework\MockObject\MockBuilder; use PHPUnit\Framework\MockObject\MockObject; @@ -471,7 +471,6 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T * @throws CodeCoverageException * @throws Exception * @throws MoreThanOneDataSetFromDataProviderException - * @throws NoDataSetFromDataProviderException * @throws NoPreviousThrowableException * @throws ProcessIsolationException * @throws StaticAnalysisCacheNotConfiguredException @@ -601,6 +600,8 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T /** * @internal This method is not covered by the backward compatibility promise for PHPUnit + * + * @deprecated */ final public function registerMockObjectsFromTestArgumentsRecursively(): void { @@ -720,7 +721,7 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T } if ($this->status->isSuccess()) { - Event\Facade::emitter()->testPassed( + $emitter->testPassed( $this->valueObjectForEvents(), ); @@ -1199,8 +1200,8 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T * * @psalm-return MockObject&RealInstanceType * - * @throws \PHPUnit\Framework\MockObject\Exception * @throws InvalidArgumentException + * @throws MockObjectException * @throws NoPreviousThrowableException */ protected function createMock(string $originalClassName): MockObject @@ -1227,16 +1228,18 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T /** * @psalm-param list $interfaces * - * @throws \PHPUnit\Framework\MockObject\Exception + * @throws MockObjectException */ protected function createMockForIntersectionOfInterfaces(array $interfaces): MockObject { $mock = (new MockGenerator)->testDoubleForInterfaceIntersection($interfaces, true); - Event\Facade::emitter()->testCreatedMockObjectForIntersectionOfInterfaces($interfaces); - assert($mock instanceof MockObject); + $this->registerMockObject($mock); + + Event\Facade::emitter()->testCreatedMockObjectForIntersectionOfInterfaces($interfaces); + return $mock; } @@ -1249,8 +1252,8 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T * * @psalm-return MockObject&RealInstanceType * - * @throws \PHPUnit\Framework\MockObject\Exception * @throws InvalidArgumentException + * @throws MockObjectException * @throws NoPreviousThrowableException */ protected function createConfiguredMock(string $originalClassName, array $configuration): MockObject @@ -1275,8 +1278,8 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T * * @psalm-return MockObject&RealInstanceType * - * @throws \PHPUnit\Framework\MockObject\Exception * @throws InvalidArgumentException + * @throws MockObjectException */ protected function createPartialMock(string $originalClassName, array $methods): MockObject { @@ -1305,8 +1308,8 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T * * @psalm-return MockObject&RealInstanceType * - * @throws \PHPUnit\Framework\MockObject\Exception * @throws InvalidArgumentException + * @throws MockObjectException * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5240 */ @@ -1336,8 +1339,8 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T * * @psalm-return MockObject&RealInstanceType * - * @throws \PHPUnit\Framework\MockObject\Exception * @throws InvalidArgumentException + * @throws MockObjectException * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5241 */ @@ -1367,7 +1370,7 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T /** * Creates a mock object based on the given WSDL file. * - * @throws \PHPUnit\Framework\MockObject\Exception + * @throws MockObjectException * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5242 */ @@ -1423,8 +1426,8 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T * * @psalm-param trait-string $traitName * - * @throws \PHPUnit\Framework\MockObject\Exception * @throws InvalidArgumentException + * @throws MockObjectException * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5243 */ @@ -1453,7 +1456,7 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T * * @psalm-param trait-string $traitName * - * @throws \PHPUnit\Framework\MockObject\Exception + * @throws MockObjectException * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5244 */ @@ -1825,6 +1828,9 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T return !in_array($mock, $enumerator->enumerate($this->testResult), true); } + /** + * @deprecated + */ private function registerMockObjectsFromTestArguments(array $testArguments, Context $context = new Context): void { if ($this->registerMockObjectsFromTestArgumentsRecursively) { @@ -1834,16 +1840,17 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T } } } else { - foreach ($testArguments as $testArgument) { + foreach ($testArguments as &$testArgument) { if ($testArgument instanceof MockObject) { $testArgument = Cloner::clone($testArgument); $this->registerMockObject($testArgument); } elseif (is_array($testArgument) && !$context->contains($testArgument)) { + $testArgumentCopy = $testArgument; $context->add($testArgument); $this->registerMockObjectsFromTestArguments( - $testArgument, + $testArgumentCopy, $context, ); } @@ -2231,8 +2238,8 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T * * @psalm-return Stub&RealInstanceType * - * @throws \PHPUnit\Framework\MockObject\Exception * @throws InvalidArgumentException + * @throws MockObjectException * @throws NoPreviousThrowableException */ protected static function createStub(string $originalClassName): Stub @@ -2257,7 +2264,7 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T /** * @psalm-param list $interfaces * - * @throws \PHPUnit\Framework\MockObject\Exception + * @throws MockObjectException */ protected static function createStubForIntersectionOfInterfaces(array $interfaces): Stub { @@ -2277,8 +2284,8 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T * * @psalm-return Stub&RealInstanceType * - * @throws \PHPUnit\Framework\MockObject\Exception * @throws InvalidArgumentException + * @throws MockObjectException * @throws NoPreviousThrowableException */ final protected static function createConfiguredStub(string $originalClassName, array $configuration): Stub diff --git a/Sources/vendor/phpunit/phpunit/src/Framework/TestRunner.php b/Sources/vendor/phpunit/phpunit/src/Framework/TestRunner.php index e5f5b033..c7f31d7c 100644 --- a/Sources/vendor/phpunit/phpunit/src/Framework/TestRunner.php +++ b/Sources/vendor/phpunit/phpunit/src/Framework/TestRunner.php @@ -13,6 +13,7 @@ use const PHP_EOL; use function assert; use function class_exists; use function defined; +use function error_clear_last; use function extension_loaded; use function get_include_path; use function hrtime; @@ -26,7 +27,6 @@ use AssertionError; use PHPUnit\Event; use PHPUnit\Event\NoPreviousThrowableException; use PHPUnit\Event\TestData\MoreThanOneDataSetFromDataProviderException; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; use PHPUnit\Metadata\Api\CodeCoverage as CodeCoverageMetadataApi; use PHPUnit\Metadata\Parser\Registry as MetadataRegistry; use PHPUnit\Runner\CodeCoverage; @@ -62,7 +62,6 @@ final class TestRunner * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException * @throws CodeCoverageException * @throws MoreThanOneDataSetFromDataProviderException - * @throws NoDataSetFromDataProviderException * @throws UnintentionallyCoveredCodeException */ public function run(TestCase $test): void @@ -84,6 +83,8 @@ final class TestRunner $risky = false; $skipped = false; + error_clear_last(); + if ($this->shouldErrorHandlerBeUsed($test)) { ErrorHandler::instance()->enable(); } diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/JunitXmlLogger.php b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/JunitXmlLogger.php index d200713d..ec173aff 100644 --- a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/JunitXmlLogger.php +++ b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/JunitXmlLogger.php @@ -28,9 +28,9 @@ use PHPUnit\Event\Test\Errored; use PHPUnit\Event\Test\Failed; use PHPUnit\Event\Test\Finished; use PHPUnit\Event\Test\MarkedIncomplete; +use PHPUnit\Event\Test\PreparationStarted; use PHPUnit\Event\Test\Prepared; use PHPUnit\Event\Test\Skipped; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; use PHPUnit\Event\TestSuite\Started; use PHPUnit\Event\UnknownSubscriberTypeException; use PHPUnit\TextUI\Output\Printer; @@ -83,6 +83,7 @@ final class JunitXmlLogger private ?DOMElement $currentTestCase = null; private ?HRTime $time = null; private bool $prepared = false; + private bool $preparationFailed = false; /** * @throws EventFacadeIsSealedException @@ -174,11 +175,25 @@ final class JunitXmlLogger /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ - public function testPrepared(Prepared $event): void + public function testPreparationStarted(PreparationStarted $event): void { $this->createTestCase($event); + } + + /** + * @throws InvalidArgumentException + */ + public function testPreparationFailed(): void + { + $this->preparationFailed = true; + } + + /** + * @throws InvalidArgumentException + */ + public function testPrepared(): void + { $this->prepared = true; } @@ -187,12 +202,15 @@ final class JunitXmlLogger */ public function testFinished(Finished $event): void { + if ($this->preparationFailed) { + return; + } + $this->handleFinish($event->telemetryInfo(), $event->numberOfAssertionsPerformed()); } /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ public function testMarkedIncomplete(MarkedIncomplete $event): void { @@ -201,7 +219,6 @@ final class JunitXmlLogger /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ public function testSkipped(Skipped $event): void { @@ -210,7 +227,6 @@ final class JunitXmlLogger /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ public function testErrored(Errored $event): void { @@ -221,7 +237,6 @@ final class JunitXmlLogger /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ public function testFailed(Failed $event): void { @@ -273,6 +288,8 @@ final class JunitXmlLogger $facade->registerSubscribers( new TestSuiteStartedSubscriber($this), new TestSuiteFinishedSubscriber($this), + new TestPreparationStartedSubscriber($this), + new TestPreparationFailedSubscriber($this), new TestPreparedSubscriber($this), new TestFinishedSubscriber($this), new TestErroredSubscriber($this), @@ -294,7 +311,6 @@ final class JunitXmlLogger /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ private function handleFault(Errored|Failed $event, string $type): void { @@ -328,7 +344,6 @@ final class JunitXmlLogger /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ private function handleIncompleteOrSkipped(MarkedIncomplete|Skipped $event): void { @@ -351,7 +366,6 @@ final class JunitXmlLogger /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ private function testAsString(Test $test): string { @@ -371,7 +385,6 @@ final class JunitXmlLogger /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ private function name(Test $test): string { @@ -404,11 +417,10 @@ final class JunitXmlLogger /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException * * @psalm-assert !null $this->currentTestCase */ - private function createTestCase(Errored|Failed|MarkedIncomplete|Prepared|Skipped $event): void + private function createTestCase(Errored|Failed|MarkedIncomplete|PreparationStarted|Prepared|Skipped $event): void { $testCase = $this->document->createElement('testcase'); diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestErroredSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestErroredSubscriber.php index a7127525..b790d8ab 100644 --- a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestErroredSubscriber.php +++ b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestErroredSubscriber.php @@ -12,7 +12,6 @@ namespace PHPUnit\Logging\JUnit; use PHPUnit\Event\InvalidArgumentException; use PHPUnit\Event\Test\Errored; use PHPUnit\Event\Test\ErroredSubscriber; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit @@ -21,7 +20,6 @@ final class TestErroredSubscriber extends Subscriber implements ErroredSubscribe { /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ public function notify(Errored $event): void { diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php index 6876fa65..0c99b913 100644 --- a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php +++ b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php @@ -12,7 +12,6 @@ namespace PHPUnit\Logging\JUnit; use PHPUnit\Event\InvalidArgumentException; use PHPUnit\Event\Test\Failed; use PHPUnit\Event\Test\FailedSubscriber; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit @@ -21,7 +20,6 @@ final class TestFailedSubscriber extends Subscriber implements FailedSubscriber { /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ public function notify(Failed $event): void { diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php index 75390707..bb69ee21 100644 --- a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php +++ b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php @@ -12,7 +12,6 @@ namespace PHPUnit\Logging\JUnit; use PHPUnit\Event\InvalidArgumentException; use PHPUnit\Event\Test\Finished; use PHPUnit\Event\Test\FinishedSubscriber; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit @@ -21,7 +20,6 @@ final class TestFinishedSubscriber extends Subscriber implements FinishedSubscri { /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ public function notify(Finished $event): void { diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php index 9517b3e7..84b16ef7 100644 --- a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php +++ b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php @@ -12,7 +12,6 @@ namespace PHPUnit\Logging\JUnit; use PHPUnit\Event\InvalidArgumentException; use PHPUnit\Event\Test\MarkedIncomplete; use PHPUnit\Event\Test\MarkedIncompleteSubscriber; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit @@ -21,7 +20,6 @@ final class TestMarkedIncompleteSubscriber extends Subscriber implements MarkedI { /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ public function notify(MarkedIncomplete $event): void { diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php new file mode 100644 index 00000000..11617225 --- /dev/null +++ b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Logging\JUnit; + +use PHPUnit\Event\InvalidArgumentException; +use PHPUnit\Event\Test\PreparationFailed; +use PHPUnit\Event\Test\PreparationFailedSubscriber; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class TestPreparationFailedSubscriber extends Subscriber implements PreparationFailedSubscriber +{ + /** + * @throws InvalidArgumentException + */ + public function notify(PreparationFailed $event): void + { + $this->logger()->testPreparationFailed(); + } +} diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php new file mode 100644 index 00000000..f2c4a908 --- /dev/null +++ b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Logging\JUnit; + +use PHPUnit\Event\InvalidArgumentException; +use PHPUnit\Event\Test\PreparationStarted; +use PHPUnit\Event\Test\PreparationStartedSubscriber; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class TestPreparationStartedSubscriber extends Subscriber implements PreparationStartedSubscriber +{ + /** + * @throws InvalidArgumentException + */ + public function notify(PreparationStarted $event): void + { + $this->logger()->testPreparationStarted($event); + } +} diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php index 98027dc9..90b3a0c2 100644 --- a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php +++ b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php @@ -12,7 +12,6 @@ namespace PHPUnit\Logging\JUnit; use PHPUnit\Event\InvalidArgumentException; use PHPUnit\Event\Test\Prepared; use PHPUnit\Event\Test\PreparedSubscriber; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit @@ -21,10 +20,9 @@ final class TestPreparedSubscriber extends Subscriber implements PreparedSubscri { /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ public function notify(Prepared $event): void { - $this->logger()->testPrepared($event); + $this->logger()->testPrepared(); } } diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php index 90df5c04..6b275073 100644 --- a/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php +++ b/Sources/vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php @@ -12,7 +12,6 @@ namespace PHPUnit\Logging\JUnit; use PHPUnit\Event\InvalidArgumentException; use PHPUnit\Event\Test\Skipped; use PHPUnit\Event\Test\SkippedSubscriber; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit @@ -21,7 +20,6 @@ final class TestSkippedSubscriber extends Subscriber implements SkippedSubscribe { /** * @throws InvalidArgumentException - * @throws NoDataSetFromDataProviderException */ public function notify(Skipped $event): void { diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php b/Sources/vendor/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php index 203e2337..a35b50de 100644 --- a/Sources/vendor/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php +++ b/Sources/vendor/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php @@ -129,7 +129,7 @@ final class TeamCityLogger 'php_qn://%s::\\%s::%s', $test->file(), $test->className(), - $test->methodName(), + $test->name(), ); } diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectForAbstractClassSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectForAbstractClassSubscriber.php deleted file mode 100644 index 0445a43c..00000000 --- a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectForAbstractClassSubscriber.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\MockObjectForAbstractClassCreated; -use PHPUnit\Event\Test\MockObjectForAbstractClassCreatedSubscriber; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestCreatedMockObjectForAbstractClassSubscriber extends Subscriber implements MockObjectForAbstractClassCreatedSubscriber -{ - public function notify(MockObjectForAbstractClassCreated $event): void - { - $this->collector()->testCreatedTestDouble($event); - } -} diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectForTraitSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectForTraitSubscriber.php deleted file mode 100644 index 86bb377c..00000000 --- a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectForTraitSubscriber.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\MockObjectForTraitCreated; -use PHPUnit\Event\Test\MockObjectForTraitCreatedSubscriber; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestCreatedMockObjectForTraitSubscriber extends Subscriber implements MockObjectForTraitCreatedSubscriber -{ - public function notify(MockObjectForTraitCreated $event): void - { - $this->collector()->testCreatedTestDouble($event); - } -} diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectFromWsdlSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectFromWsdlSubscriber.php deleted file mode 100644 index e0994bf2..00000000 --- a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectFromWsdlSubscriber.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\MockObjectFromWsdlCreated; -use PHPUnit\Event\Test\MockObjectFromWsdlCreatedSubscriber; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestCreatedMockObjectFromWsdlSubscriber extends Subscriber implements MockObjectFromWsdlCreatedSubscriber -{ - public function notify(MockObjectFromWsdlCreated $event): void - { - $this->collector()->testCreatedTestDouble($event); - } -} diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectSubscriber.php deleted file mode 100644 index f95327b6..00000000 --- a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedMockObjectSubscriber.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\MockObjectCreated; -use PHPUnit\Event\Test\MockObjectCreatedSubscriber; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestCreatedMockObjectSubscriber extends Subscriber implements MockObjectCreatedSubscriber -{ - public function notify(MockObjectCreated $event): void - { - $this->collector()->testCreatedTestDouble($event); - } -} diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedPartialMockObjectSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedPartialMockObjectSubscriber.php deleted file mode 100644 index eb14c24b..00000000 --- a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedPartialMockObjectSubscriber.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\PartialMockObjectCreated; -use PHPUnit\Event\Test\PartialMockObjectCreatedSubscriber; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestCreatedPartialMockObjectSubscriber extends Subscriber implements PartialMockObjectCreatedSubscriber -{ - public function notify(PartialMockObjectCreated $event): void - { - $this->collector()->testCreatedTestDouble($event); - } -} diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedTestProxySubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedTestProxySubscriber.php deleted file mode 100644 index acf05fd7..00000000 --- a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedTestProxySubscriber.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Logging\TestDox; - -use PHPUnit\Event\Test\TestProxyCreated; -use PHPUnit\Event\Test\TestProxyCreatedSubscriber; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestCreatedTestProxySubscriber extends Subscriber implements TestProxyCreatedSubscriber -{ - public function notify(TestProxyCreated $event): void - { - $this->collector()->testCreatedTestDouble($event); - } -} diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/Subscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/Subscriber.php similarity index 100% rename from Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/Subscriber.php rename to Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/Subscriber.php diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestConsideredRiskySubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestConsideredRiskySubscriber.php similarity index 100% rename from Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestConsideredRiskySubscriber.php rename to Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestConsideredRiskySubscriber.php diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestErroredSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestErroredSubscriber.php similarity index 100% rename from Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestErroredSubscriber.php rename to Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestErroredSubscriber.php diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestFailedSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFailedSubscriber.php similarity index 100% rename from Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestFailedSubscriber.php rename to Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFailedSubscriber.php diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestFinishedSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFinishedSubscriber.php similarity index 100% rename from Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestFinishedSubscriber.php rename to Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFinishedSubscriber.php diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestMarkedIncompleteSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php similarity index 100% rename from Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestMarkedIncompleteSubscriber.php rename to Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestPassedSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPassedSubscriber.php similarity index 100% rename from Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestPassedSubscriber.php rename to Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPassedSubscriber.php diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestPreparedSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPreparedSubscriber.php similarity index 100% rename from Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestPreparedSubscriber.php rename to Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPreparedSubscriber.php diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestSkippedSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestSkippedSubscriber.php similarity index 100% rename from Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestSkippedSubscriber.php rename to Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestSkippedSubscriber.php diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResult.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.php similarity index 56% rename from Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResult.php rename to Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.php index d2108344..59f325a1 100644 --- a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResult.php +++ b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.php @@ -11,7 +11,6 @@ namespace PHPUnit\Logging\TestDox; use PHPUnit\Event\Code\TestMethod; use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\Telemetry\Duration; use PHPUnit\Framework\TestStatus\TestStatus; /** @@ -22,25 +21,14 @@ use PHPUnit\Framework\TestStatus\TestStatus; final class TestResult { private readonly TestMethod $test; - private readonly Duration $duration; private readonly TestStatus $status; private readonly ?Throwable $throwable; - /** - * @psalm-var list - */ - private readonly array $testDoubles; - - /** - * @psalm-param list $testDoubles - */ - public function __construct(TestMethod $test, Duration $duration, TestStatus $status, ?Throwable $throwable, array $testDoubles) + public function __construct(TestMethod $test, TestStatus $status, ?Throwable $throwable) { - $this->test = $test; - $this->duration = $duration; - $this->status = $status; - $this->throwable = $throwable; - $this->testDoubles = $testDoubles; + $this->test = $test; + $this->status = $status; + $this->throwable = $throwable; } public function test(): TestMethod @@ -48,11 +36,6 @@ final class TestResult return $this->test; } - public function duration(): Duration - { - return $this->duration; - } - public function status(): TestStatus { return $this->status; @@ -70,12 +53,4 @@ final class TestResult { return $this->throwable; } - - /** - * @psalm-return list - */ - public function testDoubles(): array - { - return $this->testDoubles; - } } diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResultCollection.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollection.php similarity index 100% rename from Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResultCollection.php rename to Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollection.php diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResultCollectionIterator.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollectionIterator.php similarity index 100% rename from Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResultCollectionIterator.php rename to Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollectionIterator.php diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResultCollector.php b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.php similarity index 76% rename from Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResultCollector.php rename to Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.php index cba5ef21..63ba35d4 100644 --- a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/TestResultCollector.php +++ b/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.php @@ -21,27 +21,18 @@ use PHPUnit\Event\Code\Throwable; use PHPUnit\Event\EventFacadeIsSealedException; use PHPUnit\Event\Facade; use PHPUnit\Event\InvalidArgumentException; -use PHPUnit\Event\Telemetry\HRTime; use PHPUnit\Event\Test\ConsideredRisky; use PHPUnit\Event\Test\Errored; use PHPUnit\Event\Test\Failed; use PHPUnit\Event\Test\Finished; use PHPUnit\Event\Test\MarkedIncomplete; -use PHPUnit\Event\Test\MockObjectCreated; -use PHPUnit\Event\Test\MockObjectForAbstractClassCreated; -use PHPUnit\Event\Test\MockObjectForTraitCreated; -use PHPUnit\Event\Test\MockObjectFromWsdlCreated; -use PHPUnit\Event\Test\PartialMockObjectCreated; use PHPUnit\Event\Test\Passed; use PHPUnit\Event\Test\Prepared; use PHPUnit\Event\Test\Skipped; -use PHPUnit\Event\Test\TestProxyCreated; -use PHPUnit\Event\Test\TestStubCreated; use PHPUnit\Event\UnknownSubscriberTypeException; use PHPUnit\Framework\TestStatus\TestStatus; use PHPUnit\Logging\TestDox\TestResult as TestDoxTestMethod; use ReflectionMethod; -use SoapClient; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit @@ -52,15 +43,9 @@ final class TestResultCollector * @psalm-var array> */ private array $tests = []; - private ?HRTime $time = null; private ?TestStatus $status = null; private ?Throwable $throwable = null; - /** - * @psalm-var list - */ - private array $testDoubles = []; - /** * @throws EventFacadeIsSealedException * @throws UnknownSubscriberTypeException @@ -140,10 +125,8 @@ final class TestResultCollector return; } - $this->time = $event->telemetryInfo()->time(); - $this->status = TestStatus::unknown(); - $this->throwable = null; - $this->testDoubles = []; + $this->status = TestStatus::unknown(); + $this->throwable = null; } public function testErrored(Errored $event): void @@ -191,23 +174,6 @@ final class TestResultCollector $this->status = TestStatus::risky($event->message()); } - public function testCreatedTestDouble(MockObjectCreated|MockObjectForAbstractClassCreated|MockObjectForTraitCreated|MockObjectFromWsdlCreated|PartialMockObjectCreated|TestProxyCreated|TestStubCreated $event): void - { - if ($event instanceof MockObjectForTraitCreated) { - $this->testDoubles[] = $event->traitName(); - - return; - } - - if ($event instanceof MockObjectFromWsdlCreated) { - $this->testDoubles[] = SoapClient::class; - - return; - } - - $this->testDoubles[] = $event->className(); - } - /** * @throws InvalidArgumentException */ @@ -227,16 +193,12 @@ final class TestResultCollector $this->tests[$test->testDox()->prettifiedClassName()][] = new TestDoxTestMethod( $test, - $event->telemetryInfo()->time()->duration($this->time), $this->status, $this->throwable, - $this->testDoubles, ); - $this->time = null; - $this->status = null; - $this->throwable = null; - $this->testDoubles = []; + $this->status = null; + $this->throwable = null; } /** @@ -247,13 +209,6 @@ final class TestResultCollector { $facade->registerSubscribers( new TestConsideredRiskySubscriber($this), - new TestCreatedMockObjectForAbstractClassSubscriber($this), - new TestCreatedMockObjectForTraitSubscriber($this), - new TestCreatedMockObjectFromWsdlSubscriber($this), - new TestCreatedMockObjectSubscriber($this), - new TestCreatedPartialMockObjectSubscriber($this), - new TestCreatedTestProxySubscriber($this), - new TestCreatedTestStubSubscriber($this), new TestErroredSubscriber($this), new TestFailedSubscriber($this), new TestFinishedSubscriber($this), diff --git a/Sources/vendor/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php b/Sources/vendor/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php new file mode 100644 index 00000000..b84a868c --- /dev/null +++ b/Sources/vendor/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Metadata; + +/** + * @psalm-immutable + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + */ +final class IgnoreDeprecations extends Metadata +{ + /** + * @psalm-assert-if-true IgnoreDeprecations $this + */ + public function isIgnoreDeprecations(): bool + { + return true; + } +} diff --git a/Sources/vendor/phpunit/phpunit/src/Metadata/Metadata.php b/Sources/vendor/phpunit/phpunit/src/Metadata/Metadata.php index 5821cf61..4ac06b15 100644 --- a/Sources/vendor/phpunit/phpunit/src/Metadata/Metadata.php +++ b/Sources/vendor/phpunit/phpunit/src/Metadata/Metadata.php @@ -202,6 +202,16 @@ abstract class Metadata return new Group(self::METHOD_LEVEL, $groupName); } + public static function ignoreDeprecationsOnClass(): IgnoreDeprecations + { + return new IgnoreDeprecations(self::CLASS_LEVEL); + } + + public static function ignoreDeprecationsOnMethod(): IgnoreDeprecations + { + return new IgnoreDeprecations(self::METHOD_LEVEL); + } + /** * @psalm-param class-string $className */ @@ -615,6 +625,14 @@ abstract class Metadata return false; } + /** + * @psalm-assert-if-true IgnoreDeprecations $this + */ + public function isIgnoreDeprecations(): bool + { + return false; + } + /** * @psalm-assert-if-true IgnoreClassForCodeCoverage $this */ diff --git a/Sources/vendor/phpunit/phpunit/src/Metadata/MetadataCollection.php b/Sources/vendor/phpunit/phpunit/src/Metadata/MetadataCollection.php index 60799694..d0b96568 100644 --- a/Sources/vendor/phpunit/phpunit/src/Metadata/MetadataCollection.php +++ b/Sources/vendor/phpunit/phpunit/src/Metadata/MetadataCollection.php @@ -290,6 +290,16 @@ final class MetadataCollection implements Countable, IteratorAggregate ); } + public function isIgnoreDeprecations(): self + { + return new self( + ...array_filter( + $this->metadata, + static fn (Metadata $metadata): bool => $metadata->isIgnoreDeprecations(), + ), + ); + } + /** * @deprecated https://github.com/sebastianbergmann/phpunit/issues/5513 */ diff --git a/Sources/vendor/phpunit/phpunit/src/Metadata/Parser/AttributeParser.php b/Sources/vendor/phpunit/phpunit/src/Metadata/Parser/AttributeParser.php index 97e0f831..93e5f1af 100644 --- a/Sources/vendor/phpunit/phpunit/src/Metadata/Parser/AttributeParser.php +++ b/Sources/vendor/phpunit/phpunit/src/Metadata/Parser/AttributeParser.php @@ -38,6 +38,7 @@ use PHPUnit\Framework\Attributes\ExcludeGlobalVariableFromBackup; use PHPUnit\Framework\Attributes\ExcludeStaticPropertyFromBackup; use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\Attributes\IgnoreClassForCodeCoverage; +use PHPUnit\Framework\Attributes\IgnoreDeprecations; use PHPUnit\Framework\Attributes\IgnoreFunctionForCodeCoverage; use PHPUnit\Framework\Attributes\IgnoreMethodForCodeCoverage; use PHPUnit\Framework\Attributes\Large; @@ -170,6 +171,13 @@ final class AttributeParser implements Parser break; + case IgnoreDeprecations::class: + assert($attributeInstance instanceof IgnoreDeprecations); + + $result[] = Metadata::ignoreDeprecationsOnClass(); + + break; + case IgnoreMethodForCodeCoverage::class: assert($attributeInstance instanceof IgnoreMethodForCodeCoverage); @@ -482,6 +490,13 @@ final class AttributeParser implements Parser break; + case IgnoreDeprecations::class: + assert($attributeInstance instanceof IgnoreDeprecations); + + $result[] = Metadata::ignoreDeprecationsOnMethod(); + + break; + case PostCondition::class: $result[] = Metadata::postCondition(); diff --git a/Sources/vendor/phpunit/phpunit/src/Runner/CodeCoverage.php b/Sources/vendor/phpunit/phpunit/src/Runner/CodeCoverage.php index 55a8df84..371ff66f 100644 --- a/Sources/vendor/phpunit/phpunit/src/Runner/CodeCoverage.php +++ b/Sources/vendor/phpunit/phpunit/src/Runner/CodeCoverage.php @@ -13,7 +13,6 @@ use function file_put_contents; use function sprintf; use PHPUnit\Event\Facade as EventFacade; use PHPUnit\Event\TestData\MoreThanOneDataSetFromDataProviderException; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; use PHPUnit\Framework\TestCase; use PHPUnit\TextUI\Configuration\CodeCoverageFilterRegistry; use PHPUnit\TextUI\Configuration\Configuration; @@ -141,7 +140,6 @@ final class CodeCoverage /** * @throws MoreThanOneDataSetFromDataProviderException - * @throws NoDataSetFromDataProviderException */ public function start(TestCase $test): void { diff --git a/Sources/vendor/phpunit/phpunit/src/Runner/ErrorHandler.php b/Sources/vendor/phpunit/phpunit/src/Runner/ErrorHandler.php index f8ac78fc..ea3acfa5 100644 --- a/Sources/vendor/phpunit/phpunit/src/Runner/ErrorHandler.php +++ b/Sources/vendor/phpunit/phpunit/src/Runner/ErrorHandler.php @@ -9,10 +9,18 @@ */ namespace PHPUnit\Runner; +use const E_COMPILE_ERROR; +use const E_COMPILE_WARNING; +use const E_CORE_ERROR; +use const E_CORE_WARNING; use const E_DEPRECATED; +use const E_ERROR; use const E_NOTICE; +use const E_PARSE; +use const E_RECOVERABLE_ERROR; use const E_STRICT; use const E_USER_DEPRECATED; +use const E_USER_ERROR; use const E_USER_NOTICE; use const E_USER_WARNING; use const E_WARNING; @@ -30,9 +38,12 @@ use PHPUnit\Util\ExcludeList; */ final class ErrorHandler { - private static ?self $instance = null; - private ?Baseline $baseline = null; - private bool $enabled = false; + private const UNHANDLEABLE_LEVELS = E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING; + private const INSUPPRESSIBLE_LEVELS = E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR; + private static ?self $instance = null; + private ?Baseline $baseline = null; + private bool $enabled = false; + private ?int $originalErrorReportingLevel = null; public static function instance(): self { @@ -44,19 +55,22 @@ final class ErrorHandler */ public function __invoke(int $errorNumber, string $errorString, string $errorFile, int $errorLine): bool { - $suppressed = !($errorNumber & error_reporting()); + $suppressed = (error_reporting() & ~self::INSUPPRESSIBLE_LEVELS) === 0; if ($suppressed && (new ExcludeList)->isExcluded($errorFile)) { return false; } + $test = Event\Code\TestMethodBuilder::fromCallStack(); + $ignoredByBaseline = $this->ignoredByBaseline($errorFile, $errorLine, $errorString); + $ignoredByTest = $test->metadata()->isIgnoreDeprecations()->isNotEmpty(); switch ($errorNumber) { case E_NOTICE: case E_STRICT: Event\Facade::emitter()->testTriggeredPhpNotice( - Event\Code\TestMethodBuilder::fromCallStack(), + $test, $errorString, $errorFile, $errorLine, @@ -68,7 +82,7 @@ final class ErrorHandler case E_USER_NOTICE: Event\Facade::emitter()->testTriggeredNotice( - Event\Code\TestMethodBuilder::fromCallStack(), + $test, $errorString, $errorFile, $errorLine, @@ -80,7 +94,7 @@ final class ErrorHandler case E_WARNING: Event\Facade::emitter()->testTriggeredPhpWarning( - Event\Code\TestMethodBuilder::fromCallStack(), + $test, $errorString, $errorFile, $errorLine, @@ -92,7 +106,7 @@ final class ErrorHandler case E_USER_WARNING: Event\Facade::emitter()->testTriggeredWarning( - Event\Code\TestMethodBuilder::fromCallStack(), + $test, $errorString, $errorFile, $errorLine, @@ -104,44 +118,46 @@ final class ErrorHandler case E_DEPRECATED: Event\Facade::emitter()->testTriggeredPhpDeprecation( - Event\Code\TestMethodBuilder::fromCallStack(), + $test, $errorString, $errorFile, $errorLine, $suppressed, $ignoredByBaseline, + $ignoredByTest, ); break; case E_USER_DEPRECATED: Event\Facade::emitter()->testTriggeredDeprecation( - Event\Code\TestMethodBuilder::fromCallStack(), + $test, $errorString, $errorFile, $errorLine, $suppressed, $ignoredByBaseline, + $ignoredByTest, ); break; case E_USER_ERROR: Event\Facade::emitter()->testTriggeredError( - Event\Code\TestMethodBuilder::fromCallStack(), + $test, $errorString, $errorFile, $errorLine, $suppressed, ); - break; + throw new ErrorException('E_USER_ERROR was triggered'); default: return false; } - return true; + return false; } public function enable(): void @@ -150,15 +166,12 @@ final class ErrorHandler return; } - $oldErrorHandler = set_error_handler($this); - - if ($oldErrorHandler !== null) { - restore_error_handler(); + set_error_handler($this); - return; - } + $this->enabled = true; + $this->originalErrorReportingLevel = error_reporting(); - $this->enabled = true; + error_reporting($this->originalErrorReportingLevel & self::UNHANDLEABLE_LEVELS); } public function disable(): void @@ -169,7 +182,10 @@ final class ErrorHandler restore_error_handler(); - $this->enabled = false; + error_reporting(error_reporting() | $this->originalErrorReportingLevel); + + $this->enabled = false; + $this->originalErrorReportingLevel = null; } public function use(Baseline $baseline): void diff --git a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedTestStubSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Runner/Exception/ErrorException.php similarity index 50% rename from Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedTestStubSubscriber.php rename to Sources/vendor/phpunit/phpunit/src/Runner/Exception/ErrorException.php index ab5a48a5..c4a8cf4a 100644 --- a/Sources/vendor/phpunit/phpunit/src/Logging/TestDox/TestMethod/Subscriber/TestCreatedTestStubSubscriber.php +++ b/Sources/vendor/phpunit/phpunit/src/Runner/Exception/ErrorException.php @@ -7,18 +7,13 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\Logging\TestDox; +namespace PHPUnit\Runner; -use PHPUnit\Event\Test\TestStubCreated; -use PHPUnit\Event\Test\TestStubCreatedSubscriber; +use Error; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ -final class TestCreatedTestStubSubscriber extends Subscriber implements TestStubCreatedSubscriber +final class ErrorException extends Error implements Exception { - public function notify(TestStubCreated $event): void - { - $this->collector()->testCreatedTestDouble($event); - } } diff --git a/Sources/vendor/phpunit/phpunit/src/Runner/Extension/Facade.php b/Sources/vendor/phpunit/phpunit/src/Runner/Extension/Facade.php index 62ba4b23..b168eb62 100644 --- a/Sources/vendor/phpunit/phpunit/src/Runner/Extension/Facade.php +++ b/Sources/vendor/phpunit/phpunit/src/Runner/Extension/Facade.php @@ -92,11 +92,17 @@ final class Facade return $this->requiresCodeCoverageCollection; } + /** + * @deprecated + */ public function requireExportOfObjects(): void { $this->requiresExportOfObjects = true; } + /** + * @deprecated + */ public function requiresExportOfObjects(): bool { return $this->requiresExportOfObjects; diff --git a/Sources/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php b/Sources/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php index e732f000..20577a69 100644 --- a/Sources/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php +++ b/Sources/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php @@ -193,8 +193,6 @@ final class PhptTestCase implements Reorderable, SelfDescribing, Test $this->filename, true, TestStatus::unknown(), - [], - [], ); } diff --git a/Sources/vendor/phpunit/phpunit/src/Runner/TestResult/Collector.php b/Sources/vendor/phpunit/phpunit/src/Runner/TestResult/Collector.php index f6d3acc4..b676911e 100644 --- a/Sources/vendor/phpunit/phpunit/src/Runner/TestResult/Collector.php +++ b/Sources/vendor/phpunit/phpunit/src/Runner/TestResult/Collector.php @@ -33,7 +33,6 @@ use PHPUnit\Event\Test\PhpunitWarningTriggered; use PHPUnit\Event\Test\PhpWarningTriggered; use PHPUnit\Event\Test\Skipped as TestSkipped; use PHPUnit\Event\Test\WarningTriggered; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; use PHPUnit\Event\TestRunner\DeprecationTriggered as TestRunnerDeprecationTriggered; use PHPUnit\Event\TestRunner\ExecutionStarted; use PHPUnit\Event\TestRunner\WarningTriggered as TestRunnerWarningTriggered; @@ -245,9 +244,6 @@ final class Collector $this->currentTestSuiteForTestClassFailed = false; } - /** - * @throws NoDataSetFromDataProviderException - */ public function testSuiteFinished(TestSuiteFinished $event): void { if ($this->currentTestSuiteForTestClassFailed) { @@ -348,6 +344,10 @@ final class Collector public function testTriggeredDeprecation(DeprecationTriggered $event): void { + if ($event->ignoredByTest()) { + return; + } + if ($event->ignoredByBaseline()) { $this->numberOfIssuesIgnoredByBaseline++; @@ -380,6 +380,10 @@ final class Collector public function testTriggeredPhpDeprecation(PhpDeprecationTriggered $event): void { + if ($event->ignoredByTest()) { + return; + } + if ($event->ignoredByBaseline()) { $this->numberOfIssuesIgnoredByBaseline++; diff --git a/Sources/vendor/phpunit/phpunit/src/Runner/TestResult/PassedTests.php b/Sources/vendor/phpunit/phpunit/src/Runner/TestResult/PassedTests.php index 8462f97c..2bd0cf5c 100644 --- a/Sources/vendor/phpunit/phpunit/src/Runner/TestResult/PassedTests.php +++ b/Sources/vendor/phpunit/phpunit/src/Runner/TestResult/PassedTests.php @@ -13,7 +13,6 @@ use function array_merge; use function assert; use function in_array; use PHPUnit\Event\Code\TestMethod; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; use PHPUnit\Framework\TestSize\Known; use PHPUnit\Framework\TestSize\TestSize; use PHPUnit\Metadata\Api\Groups; @@ -54,9 +53,6 @@ final class PassedTests $this->passedTestClasses[] = $className; } - /** - * @throws NoDataSetFromDataProviderException - */ public function testMethodPassed(TestMethod $test, mixed $returnValue): void { $size = (new Groups)->size( diff --git a/Sources/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteFinishedSubscriber.php b/Sources/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteFinishedSubscriber.php index 5ad8c1a7..b4a51dac 100644 --- a/Sources/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteFinishedSubscriber.php +++ b/Sources/vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteFinishedSubscriber.php @@ -9,7 +9,6 @@ */ namespace PHPUnit\TestRunner\TestResult; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; use PHPUnit\Event\TestSuite\Finished; use PHPUnit\Event\TestSuite\FinishedSubscriber; @@ -18,9 +17,6 @@ use PHPUnit\Event\TestSuite\FinishedSubscriber; */ final class TestSuiteFinishedSubscriber extends Subscriber implements FinishedSubscriber { - /** - * @throws NoDataSetFromDataProviderException - */ public function notify(Finished $event): void { $this->collector()->testSuiteFinished($event); diff --git a/Sources/vendor/phpunit/phpunit/src/Runner/Version.php b/Sources/vendor/phpunit/phpunit/src/Runner/Version.php index 0d701fe4..bcabd74a 100644 --- a/Sources/vendor/phpunit/phpunit/src/Runner/Version.php +++ b/Sources/vendor/phpunit/phpunit/src/Runner/Version.php @@ -34,7 +34,7 @@ final class Version } if (self::$version === '') { - self::$version = (new VersionId('10.4.2', dirname(__DIR__, 2)))->asString(); + self::$version = (new VersionId('10.5.5', dirname(__DIR__, 2)))->asString(); } return self::$version; diff --git a/Sources/vendor/phpunit/phpunit/src/TextUI/Application.php b/Sources/vendor/phpunit/phpunit/src/TextUI/Application.php index fa4cbb79..7dc77d13 100644 --- a/Sources/vendor/phpunit/phpunit/src/TextUI/Application.php +++ b/Sources/vendor/phpunit/phpunit/src/TextUI/Application.php @@ -638,6 +638,10 @@ final class Application $first = true; + if ($t->getPrevious()) { + $t = $t->getPrevious(); + } + do { printf( '%s%s: %s:%d%s%s%s%s', diff --git a/Sources/vendor/phpunit/phpunit/src/TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php b/Sources/vendor/phpunit/phpunit/src/TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php index 8af15b65..86303e13 100644 --- a/Sources/vendor/phpunit/phpunit/src/TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php +++ b/Sources/vendor/phpunit/phpunit/src/TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php @@ -9,6 +9,7 @@ */ namespace PHPUnit\TextUI\Command; +use const PHP_EOL; use function printf; use PHPUnit\TextUI\Configuration\CodeCoverageFilterRegistry; use PHPUnit\TextUI\Configuration\Configuration; @@ -68,7 +69,7 @@ final class WarmCodeCoverageCacheCommand implements Command printf( '[%s]%s', $timer->stop()->asString(), - \PHP_EOL, + PHP_EOL, ); return Result::from(); diff --git a/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Configuration.php b/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Configuration.php index 72cea86e..ae18bbb6 100644 --- a/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Configuration.php +++ b/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Configuration.php @@ -926,6 +926,9 @@ final class Configuration return $this->requireCoverageMetadata; } + /** + * @deprecated + */ public function registerMockObjectsFromTestArgumentsRecursively(): bool { return $this->registerMockObjectsFromTestArgumentsRecursively; diff --git a/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Loader.php b/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Loader.php index 2c219292..3b8c8b7c 100644 --- a/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Loader.php +++ b/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Loader.php @@ -26,6 +26,7 @@ use function substr; use function trim; use DOMDocument; use DOMElement; +use DOMNode; use DOMXPath; use PHPUnit\Runner\TestSuiteSorter; use PHPUnit\Runner\Version; @@ -514,6 +515,8 @@ final class Loader $files = []; foreach ($xpath->query($query) as $file) { + assert($file instanceof DOMNode); + $filePath = $file->textContent; if ($filePath) { @@ -530,10 +533,14 @@ final class Loader $exclude = []; foreach ($xpath->query('groups/include/group') as $group) { + assert($group instanceof DOMNode); + $include[] = new Group($group->textContent); } foreach ($xpath->query('groups/exclude/group') as $group) { + assert($group instanceof DOMNode); + $exclude[] = new Group($group->textContent); } @@ -599,6 +606,8 @@ final class Loader $includePaths = []; foreach ($xpath->query('php/includePath') as $includePath) { + assert($includePath instanceof DOMNode); + $path = $includePath->textContent; if ($path) { diff --git a/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveCoverageDirectoriesToSource.php b/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveCoverageDirectoriesToSource.php index 3c32d2a3..bf87fcea 100644 --- a/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveCoverageDirectoriesToSource.php +++ b/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveCoverageDirectoriesToSource.php @@ -50,5 +50,13 @@ final class MoveCoverageDirectoriesToSource implements Migration $source->appendChild($node); } } + + if ($coverage->childElementCount !== 0) { + return; + } + + assert($coverage->parentNode !== null); + + $coverage->parentNode->removeChild($coverage); } } diff --git a/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/PHPUnit.php b/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/PHPUnit.php index 6c3ddd64..febe11df 100644 --- a/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/PHPUnit.php +++ b/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/PHPUnit.php @@ -453,6 +453,9 @@ final class PHPUnit return $this->backupStaticProperties; } + /** + * @deprecated + */ public function registerMockObjectsFromTestArgumentsRecursively(): bool { return $this->registerMockObjectsFromTestArgumentsRecursively; diff --git a/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/ValidationResult.php b/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/ValidationResult.php index fc4a0ee2..66b9aaab 100644 --- a/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/ValidationResult.php +++ b/Sources/vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/ValidationResult.php @@ -11,6 +11,7 @@ namespace PHPUnit\TextUI\XmlConfiguration; use function sprintf; use function trim; +use LibXMLError; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit @@ -25,7 +26,7 @@ final class ValidationResult private readonly array $validationErrors; /** - * @psalm-param array $errors + * @psalm-param array $errors */ public static function fromArray(array $errors): self { diff --git a/Sources/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/ProgressPrinter.php b/Sources/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/ProgressPrinter.php index f94f078e..03001477 100644 --- a/Sources/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/ProgressPrinter.php +++ b/Sources/vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/ProgressPrinter.php @@ -135,7 +135,7 @@ final class ProgressPrinter public function testTriggeredDeprecation(DeprecationTriggered $event): void { - if ($event->ignoredByBaseline()) { + if ($event->ignoredByBaseline() || $event->ignoredByTest()) { return; } @@ -153,7 +153,7 @@ final class ProgressPrinter public function testTriggeredPhpDeprecation(PhpDeprecationTriggered $event): void { - if ($event->ignoredByBaseline()) { + if ($event->ignoredByBaseline() || $event->ignoredByTest()) { return; } diff --git a/Sources/vendor/phpunit/phpunit/src/TextUI/Output/Default/ResultPrinter.php b/Sources/vendor/phpunit/phpunit/src/TextUI/Output/Default/ResultPrinter.php index 8383bd91..ea01b509 100644 --- a/Sources/vendor/phpunit/phpunit/src/TextUI/Output/Default/ResultPrinter.php +++ b/Sources/vendor/phpunit/phpunit/src/TextUI/Output/Default/ResultPrinter.php @@ -38,7 +38,6 @@ use PHPUnit\Event\Test\PhpunitErrorTriggered; use PHPUnit\Event\Test\PhpunitWarningTriggered; use PHPUnit\Event\Test\PhpWarningTriggered; use PHPUnit\Event\Test\WarningTriggered; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; use PHPUnit\TestRunner\TestResult\Issues\Issue; use PHPUnit\TestRunner\TestResult\TestResult; use PHPUnit\TextUI\Output\Printer; @@ -507,15 +506,16 @@ final class ResultPrinter ); } - /** - * @throws NoDataSetFromDataProviderException - */ private function name(Test $test): string { if ($test->isTestMethod()) { assert($test instanceof TestMethod); - return $test->nameWithClass(); + if (!$test->testData()->hasDataFromDataProvider()) { + return $test->nameWithClass(); + } + + return $test->className() . '::' . $test->methodName() . $test->testData()->dataFromDataProvider()->dataAsStringForResultOutput(); } return $test->name(); diff --git a/Sources/vendor/phpunit/phpunit/src/TextUI/Output/TestDox/ResultPrinter.php b/Sources/vendor/phpunit/phpunit/src/TextUI/Output/TestDox/ResultPrinter.php index d82d04df..320ce69f 100644 --- a/Sources/vendor/phpunit/phpunit/src/TextUI/Output/TestDox/ResultPrinter.php +++ b/Sources/vendor/phpunit/phpunit/src/TextUI/Output/TestDox/ResultPrinter.php @@ -20,7 +20,6 @@ use function rtrim; use function str_starts_with; use function trim; use PHPUnit\Event\Code\Throwable; -use PHPUnit\Event\TestData\NoDataSetFromDataProviderException; use PHPUnit\Framework\TestStatus\TestStatus; use PHPUnit\Logging\TestDox\TestResult as TestDoxTestResult; use PHPUnit\Logging\TestDox\TestResultCollection; @@ -76,18 +75,12 @@ final class ResultPrinter $this->printer->print($buffer . PHP_EOL); } - /** - * @throws NoDataSetFromDataProviderException - */ private function printTestResult(TestDoxTestResult $test): void { $this->printTestResultHeader($test); $this->printTestResultBody($test); } - /** - * @throws NoDataSetFromDataProviderException - */ private function printTestResultHeader(TestDoxTestResult $test): void { $buffer = ' ' . $this->symbolFor($test->status()) . ' '; diff --git a/Sources/vendor/phpunit/phpunit/src/Util/Exporter.php b/Sources/vendor/phpunit/phpunit/src/Util/Exporter.php index 4cbe4141..8906626d 100644 --- a/Sources/vendor/phpunit/phpunit/src/Util/Exporter.php +++ b/Sources/vendor/phpunit/phpunit/src/Util/Exporter.php @@ -11,24 +11,27 @@ namespace PHPUnit\Util; use function is_array; use function is_scalar; +use SebastianBergmann\RecursionContext\Context; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit + * + * @deprecated */ final class Exporter { public static function export(mixed $value, bool $exportObjects = false): string { - if (self::isScalarOrArrayOfScalars($value) || $exportObjects) { + if (self::isExportable($value) || $exportObjects) { return (new \SebastianBergmann\Exporter\Exporter)->export($value); } return '{enable export of objects to see this value}'; } - private static function isScalarOrArrayOfScalars(mixed $value): bool + private static function isExportable(mixed &$value, Context $context = null): bool { - if (is_scalar($value)) { + if (is_scalar($value) || $value === null) { return true; } @@ -36,8 +39,19 @@ final class Exporter return false; } - foreach ($value as $_value) { - if (!self::isScalarOrArrayOfScalars($_value)) { + if (!$context) { + $context = new Context; + } + + if ($context->contains($value) !== false) { + return true; + } + + $array = $value; + $context->add($value); + + foreach ($array as &$_value) { + if (!self::isExportable($_value, $context)) { return false; } } diff --git a/Sources/vendor/phpunit/phpunit/src/Util/ThrowableToStringMapper.php b/Sources/vendor/phpunit/phpunit/src/Util/ThrowableToStringMapper.php index a8f3eb86..358b7703 100644 --- a/Sources/vendor/phpunit/phpunit/src/Util/ThrowableToStringMapper.php +++ b/Sources/vendor/phpunit/phpunit/src/Util/ThrowableToStringMapper.php @@ -13,6 +13,7 @@ use function trim; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\PhptAssertionFailedError; use PHPUnit\Framework\SelfDescribing; +use PHPUnit\Runner\ErrorException; use Throwable; /** @@ -22,6 +23,10 @@ final class ThrowableToStringMapper { public static function map(Throwable $t): string { + if ($t instanceof ErrorException) { + return $t->getMessage(); + } + if ($t instanceof SelfDescribing) { $buffer = $t->toString(); diff --git a/Sources/vendor/sebastian/complexity/ChangeLog.md b/Sources/vendor/sebastian/complexity/ChangeLog.md index 3045ccbe..eb168af7 100644 --- a/Sources/vendor/sebastian/complexity/ChangeLog.md +++ b/Sources/vendor/sebastian/complexity/ChangeLog.md @@ -2,6 +2,16 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. +## [3.2.0] - 2023-12-21 + +### Added + +* `ComplexityCollection::sortByDescendingCyclomaticComplexity()` + +### Changed + +* This component is now compatible with `nikic/php-parser` 5.0 + ## [3.1.0] - 2023-09-28 ### Added @@ -48,6 +58,7 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt * Initial release +[3.2.0]: https://github.com/sebastianbergmann/complexity/compare/3.1.0...3.2.0 [3.1.0]: https://github.com/sebastianbergmann/complexity/compare/3.0.1...3.1.0 [3.0.1]: https://github.com/sebastianbergmann/complexity/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/complexity/compare/2.0.2...3.0.0 diff --git a/Sources/vendor/sebastian/complexity/composer.json b/Sources/vendor/sebastian/complexity/composer.json index 78f6ffb5..77001bb2 100644 --- a/Sources/vendor/sebastian/complexity/composer.json +++ b/Sources/vendor/sebastian/complexity/composer.json @@ -18,7 +18,7 @@ "prefer-stable": true, "require": { "php": ">=8.1", - "nikic/php-parser": "^4.10" + "nikic/php-parser": "^4.18 || ^5.0" }, "require-dev": { "phpunit/phpunit": "^10.0" @@ -37,7 +37,7 @@ }, "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.2-dev" } } } diff --git a/Sources/vendor/sebastian/complexity/src/Calculator.php b/Sources/vendor/sebastian/complexity/src/Calculator.php index 02f3270b..18580bdb 100644 --- a/Sources/vendor/sebastian/complexity/src/Calculator.php +++ b/Sources/vendor/sebastian/complexity/src/Calculator.php @@ -12,12 +12,10 @@ namespace SebastianBergmann\Complexity; use function assert; use function file_get_contents; use PhpParser\Error; -use PhpParser\Lexer; use PhpParser\Node; use PhpParser\NodeTraverser; use PhpParser\NodeVisitor\NameResolver; use PhpParser\NodeVisitor\ParentConnectingVisitor; -use PhpParser\Parser; use PhpParser\ParserFactory; final class Calculator @@ -36,7 +34,7 @@ final class Calculator public function calculateForSourceString(string $source): ComplexityCollection { try { - $nodes = $this->parser()->parse($source); + $nodes = (new ParserFactory)->createForHostVersion()->parse($source); assert($nodes !== null); @@ -82,9 +80,4 @@ final class Calculator return $complexityCalculatingVisitor->result(); } - - private function parser(): Parser - { - return (new ParserFactory)->create(ParserFactory::PREFER_PHP7, new Lexer); - } } diff --git a/Sources/vendor/sebastian/complexity/src/Complexity/ComplexityCollection.php b/Sources/vendor/sebastian/complexity/src/Complexity/ComplexityCollection.php index 341db6cd..0f851c2a 100644 --- a/Sources/vendor/sebastian/complexity/src/Complexity/ComplexityCollection.php +++ b/Sources/vendor/sebastian/complexity/src/Complexity/ComplexityCollection.php @@ -11,8 +11,10 @@ namespace SebastianBergmann\Complexity; use function array_filter; use function array_merge; +use function array_reverse; use function array_values; use function count; +use function usort; use Countable; use IteratorAggregate; @@ -112,4 +114,19 @@ final class ComplexityCollection implements Countable, IteratorAggregate ), ); } + + public function sortByDescendingCyclomaticComplexity(): self + { + $items = $this->items; + + usort( + $items, + static function (Complexity $a, Complexity $b): int + { + return $a->cyclomaticComplexity() <=> $b->cyclomaticComplexity(); + }, + ); + + return new self(array_reverse($items)); + } } diff --git a/Sources/vendor/sebastian/diff/ChangeLog.md b/Sources/vendor/sebastian/diff/ChangeLog.md index 9142e50f..8081b37f 100644 --- a/Sources/vendor/sebastian/diff/ChangeLog.md +++ b/Sources/vendor/sebastian/diff/ChangeLog.md @@ -2,6 +2,26 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [5.1.0] - 2023-12-22 + +### Added + +* `SebastianBergmann\Diff\Chunk::start()`, `SebastianBergmann\Diff\Chunk::startRange()`, `SebastianBergmann\Diff\Chunk::end()`, `SebastianBergmann\Diff\Chunk::endRange()`, and `SebastianBergmann\Diff\Chunk::lines()` +* `SebastianBergmann\Diff\Diff::from()`, `SebastianBergmann\Diff\Diff::to()`, and `SebastianBergmann\Diff\Diff::chunks()` +* `SebastianBergmann\Diff\Line::content()` and `SebastianBergmann\Diff\Diff::type()` +* `SebastianBergmann\Diff\Line::isAdded()`,`SebastianBergmann\Diff\Line::isRemoved()`, and `SebastianBergmann\Diff\Line::isUnchanged()` + +### Changed + +* `SebastianBergmann\Diff\Diff` now implements `IteratorAggregate`, iterating over it yields the aggregated `SebastianBergmann\Diff\Chunk` objects +* `SebastianBergmann\Diff\Chunk` now implements `IteratorAggregate`, iterating over it yields the aggregated `SebastianBergmann\Diff\Line` objects + +### Deprecated + +* `SebastianBergmann\Diff\Chunk::getStart()`, `SebastianBergmann\Diff\Chunk::getStartRange()`, `SebastianBergmann\Diff\Chunk::getEnd()`, `SebastianBergmann\Diff\Chunk::getEndRange()`, and `SebastianBergmann\Diff\Chunk::getLines()` +* `SebastianBergmann\Diff\Diff::getFrom()`, `SebastianBergmann\Diff\Diff::getTo()`, and `SebastianBergmann\Diff\Diff::getChunks()` +* `SebastianBergmann\Diff\Line::getContent()` and `SebastianBergmann\Diff\Diff::getType()` + ## [5.0.3] - 2023-05-01 ### Changed @@ -104,6 +124,7 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt * This component is no longer supported on PHP 5.6 +[5.1.0]: https://github.com/sebastianbergmann/diff/compare/5.0.3...5.1.0 [5.0.3]: https://github.com/sebastianbergmann/diff/compare/5.0.2...5.0.3 [5.0.2]: https://github.com/sebastianbergmann/diff/compare/5.0.1...5.0.2 [5.0.1]: https://github.com/sebastianbergmann/diff/compare/5.0.0...5.0.1 diff --git a/Sources/vendor/sebastian/diff/composer.json b/Sources/vendor/sebastian/diff/composer.json index cd37ef6b..bc6c3a43 100644 --- a/Sources/vendor/sebastian/diff/composer.json +++ b/Sources/vendor/sebastian/diff/composer.json @@ -45,7 +45,7 @@ }, "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } } } diff --git a/Sources/vendor/sebastian/diff/src/Chunk.php b/Sources/vendor/sebastian/diff/src/Chunk.php index cdfdf00b..a9568545 100644 --- a/Sources/vendor/sebastian/diff/src/Chunk.php +++ b/Sources/vendor/sebastian/diff/src/Chunk.php @@ -9,7 +9,14 @@ */ namespace SebastianBergmann\Diff; -final class Chunk +use ArrayIterator; +use IteratorAggregate; +use Traversable; + +/** + * @template-implements IteratorAggregate + */ +final class Chunk implements IteratorAggregate { private int $start; private int $startRange; @@ -26,22 +33,22 @@ final class Chunk $this->lines = $lines; } - public function getStart(): int + public function start(): int { return $this->start; } - public function getStartRange(): int + public function startRange(): int { return $this->startRange; } - public function getEnd(): int + public function end(): int { return $this->end; } - public function getEndRange(): int + public function endRange(): int { return $this->endRange; } @@ -49,7 +56,7 @@ final class Chunk /** * @psalm-return list */ - public function getLines(): array + public function lines(): array { return $this->lines; } @@ -67,4 +74,51 @@ final class Chunk $this->lines = $lines; } + + /** + * @deprecated Use start() instead + */ + public function getStart(): int + { + return $this->start; + } + + /** + * @deprecated Use startRange() instead + */ + public function getStartRange(): int + { + return $this->startRange; + } + + /** + * @deprecated Use end() instead + */ + public function getEnd(): int + { + return $this->end; + } + + /** + * @deprecated Use endRange() instead + */ + public function getEndRange(): int + { + return $this->endRange; + } + + /** + * @psalm-return list + * + * @deprecated Use lines() instead + */ + public function getLines(): array + { + return $this->lines; + } + + public function getIterator(): Traversable + { + return new ArrayIterator($this->lines); + } } diff --git a/Sources/vendor/sebastian/diff/src/Diff.php b/Sources/vendor/sebastian/diff/src/Diff.php index 3376b723..5dc8dd08 100644 --- a/Sources/vendor/sebastian/diff/src/Diff.php +++ b/Sources/vendor/sebastian/diff/src/Diff.php @@ -9,9 +9,23 @@ */ namespace SebastianBergmann\Diff; -final class Diff +use ArrayIterator; +use IteratorAggregate; +use Traversable; + +/** + * @template-implements IteratorAggregate + */ +final class Diff implements IteratorAggregate { + /** + * @psalm-var non-empty-string + */ private string $from; + + /** + * @psalm-var non-empty-string + */ private string $to; /** @@ -20,6 +34,8 @@ final class Diff private array $chunks; /** + * @psalm-param non-empty-string $from + * @psalm-param non-empty-string $to * @psalm-param list $chunks */ public function __construct(string $from, string $to, array $chunks = []) @@ -29,12 +45,18 @@ final class Diff $this->chunks = $chunks; } - public function getFrom(): string + /** + * @psalm-return non-empty-string + */ + public function from(): string { return $this->from; } - public function getTo(): string + /** + * @psalm-return non-empty-string + */ + public function to(): string { return $this->to; } @@ -42,7 +64,7 @@ final class Diff /** * @psalm-return list */ - public function getChunks(): array + public function chunks(): array { return $this->chunks; } @@ -54,4 +76,39 @@ final class Diff { $this->chunks = $chunks; } + + /** + * @psalm-return non-empty-string + * + * @deprecated + */ + public function getFrom(): string + { + return $this->from; + } + + /** + * @psalm-return non-empty-string + * + * @deprecated + */ + public function getTo(): string + { + return $this->to; + } + + /** + * @psalm-return list + * + * @deprecated + */ + public function getChunks(): array + { + return $this->chunks; + } + + public function getIterator(): Traversable + { + return new ArrayIterator($this->chunks); + } } diff --git a/Sources/vendor/sebastian/diff/src/Line.php b/Sources/vendor/sebastian/diff/src/Line.php index a9106a25..4e708abb 100644 --- a/Sources/vendor/sebastian/diff/src/Line.php +++ b/Sources/vendor/sebastian/diff/src/Line.php @@ -23,11 +23,42 @@ final class Line $this->content = $content; } + public function content(): string + { + return $this->content; + } + + public function type(): int + { + return $this->type; + } + + public function isAdded(): bool + { + return $this->type === self::ADDED; + } + + public function isRemoved(): bool + { + return $this->type === self::REMOVED; + } + + public function isUnchanged(): bool + { + return $this->type === self::UNCHANGED; + } + + /** + * @deprecated + */ public function getContent(): string { return $this->content; } + /** + * @deprecated + */ public function getType(): int { return $this->type; diff --git a/Sources/vendor/sebastian/diff/src/Parser.php b/Sources/vendor/sebastian/diff/src/Parser.php index 698b815c..6232c957 100644 --- a/Sources/vendor/sebastian/diff/src/Parser.php +++ b/Sources/vendor/sebastian/diff/src/Parser.php @@ -10,6 +10,7 @@ namespace SebastianBergmann\Diff; use function array_pop; +use function assert; use function count; use function max; use function preg_match; @@ -46,6 +47,9 @@ final class Parser $collected = []; } + assert(!empty($fromMatch['file'])); + assert(!empty($toMatch['file'])); + $diff = new Diff($fromMatch['file'], $toMatch['file']); $i++; diff --git a/Sources/vendor/sebastian/lines-of-code/ChangeLog.md b/Sources/vendor/sebastian/lines-of-code/ChangeLog.md index 3efbb1e0..27db5805 100644 --- a/Sources/vendor/sebastian/lines-of-code/ChangeLog.md +++ b/Sources/vendor/sebastian/lines-of-code/ChangeLog.md @@ -2,6 +2,12 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. +## [2.0.2] - 2023-12-21 + +### Changed + +* This component is now compatible with `nikic/php-parser` 5.0 + ## [2.0.1] - 2023-08-31 ### Changed @@ -40,6 +46,7 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt * Initial release +[2.0.2]: https://github.com/sebastianbergmann/lines-of-code/compare/2.0.1...2.0.2 [2.0.1]: https://github.com/sebastianbergmann/lines-of-code/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.3...2.0.0 [1.0.3]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.2...1.0.3 diff --git a/Sources/vendor/sebastian/lines-of-code/composer.json b/Sources/vendor/sebastian/lines-of-code/composer.json index e642bdb8..1f3b7479 100644 --- a/Sources/vendor/sebastian/lines-of-code/composer.json +++ b/Sources/vendor/sebastian/lines-of-code/composer.json @@ -18,7 +18,7 @@ "prefer-stable": true, "require": { "php": ">=8.1", - "nikic/php-parser": "^4.10" + "nikic/php-parser": "^4.18 || ^5.0" }, "require-dev": { "phpunit/phpunit": "^10.0" diff --git a/Sources/vendor/sebastian/lines-of-code/src/Counter.php b/Sources/vendor/sebastian/lines-of-code/src/Counter.php index d241adfc..9519268b 100644 --- a/Sources/vendor/sebastian/lines-of-code/src/Counter.php +++ b/Sources/vendor/sebastian/lines-of-code/src/Counter.php @@ -13,10 +13,8 @@ use function assert; use function file_get_contents; use function substr_count; use PhpParser\Error; -use PhpParser\Lexer; use PhpParser\Node; use PhpParser\NodeTraverser; -use PhpParser\Parser; use PhpParser\ParserFactory; final class Counter @@ -43,7 +41,7 @@ final class Counter assert($linesOfCode >= 0); try { - $nodes = $this->parser()->parse($source); + $nodes = (new ParserFactory)->createForHostVersion()->parse($source); assert($nodes !== null); @@ -89,9 +87,4 @@ final class Counter return $visitor->result(); } - - private function parser(): Parser - { - return (new ParserFactory)->create(ParserFactory::PREFER_PHP7, new Lexer); - } } From c9b2a2d6c932689bf2814743fbb25e6d9f143d23 Mon Sep 17 00:00:00 2001 From: anperederi Date: Sun, 21 Jan 2024 22:05:53 +0100 Subject: [PATCH 47/48] I don't know --- Sources/src/app/controller/ApiController.php | 131 ++++++++++++++++++ Sources/src/app/controller/AuthController.php | 45 ------ .../app/router/middleware/AuthMiddleware.php | 13 +- 3 files changed, 143 insertions(+), 46 deletions(-) create mode 100644 Sources/src/app/controller/ApiController.php diff --git a/Sources/src/app/controller/ApiController.php b/Sources/src/app/controller/ApiController.php new file mode 100644 index 00000000..c0a2c41c --- /dev/null +++ b/Sources/src/app/controller/ApiController.php @@ -0,0 +1,131 @@ +userMgr = $manager; + } + #[Route(path: '/api/activities', name: 'api-activities', methods: ['GET'])] + public function apiActivities(IRequest $request) + { + $activityGateway = new ActivityGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); + $listSearch = $activityGateway->getActivity(); + $map = new ActivityMapper(); + $activityGateway = $map->activitySqlToEntity($listSearch); + $listActivity = []; + foreach ($activityGateway as $entity) { + $activity = $map->activityEntityToModel($entity); + $listActivity[] = ['idactivity' => number_format($activity->getIdActivity()), 'type' => $activity->getType(), + 'date' => $activity->getDate()->format("Y-m-d"), 'heureDebut' => $activity->getHeureDebut()->format("Y-m-d"), 'heureFin' => $activity->getHeureFin()->format("Y-m-d"), + 'effortRessenti' => $activity->getEffortRessenti(), 'variabilite' => $activity->getVariability(), 'variance' => $activity->getVariance(), + 'ecartType' => $activity->getStandardDeviation(), 'moyenne' => $activity->getAverage(), + 'max' => $activity->getMaximum(), 'min' => $activity->getMinimum(), 'temperature' => $activity->getAvrTemperature()]; + } + + $jsonSerializer = new JsonSerializer(); + $jsonData = $jsonSerializer::serialize($listActivity); + + $response = new Response(); + $response->setContent($jsonData); + $response->setHeader('Content-Type', 'application/json'); + + return $response; + } + + // cela ne trouve pas la methode avec la route '/api/activities/1' + #[Route(path: '/api/activities/{id}', name: 'api-activities-by-id', methods: ['GET'])] + public function apiActivityById(IRequest $request, int $id) + { + $activityGateway = new ActivityGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); + $listSearch = $activityGateway->getActivityById($id); + Log::dd($listSearch); + $map = new ActivityMapper(); + $activityGateway = $map->activitySqlToEntity($listSearch); + $listActivity = []; + foreach ($activityGateway as $entity) { + $activity = $map->activityEntityToModel($entity); + $listActivity[] = ['idactivity' => number_format($activity->getIdActivity()), 'type' => $activity->getType(), + 'date' => $activity->getDate()->format("Y-m-d"), 'heureDebut' => $activity->getHeureDebut()->format("Y-m-d"), 'heureFin' => $activity->getHeureFin()->format("Y-m-d"), + 'effortRessenti' => $activity->getEffortRessenti(), 'variabilite' => $activity->getVariability(), 'variance' => $activity->getVariance(), + 'ecartType' => $activity->getStandardDeviation(), 'moyenne' => $activity->getAverage(), + 'max' => $activity->getMaximum(), 'min' => $activity->getMinimum(), 'temperature' => $activity->getAvrTemperature()]; + } + + $jsonSerializer = new JsonSerializer(); + $jsonData = $jsonSerializer::serialize($listActivity); + + $response = new Response(); + $response->setContent($jsonData); + $response->setHeader('Content-Type', 'application/json'); + // pour delete renvoyer 204 pour dire ok et supprimer + // update 200 + + + return $response; + } +// +// #[Route(path: '/api/activities', name: 'api-activities-post', methods: ['POST'])] +// public function apiAddActivity(IRequest $request) +// { +// $activityGateway = new ActivityGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); +// $listSearch = $activityGateway->getActivity(); +// $map = new ActivityMapper(); +// $activityGateway = $map->activitySqlToEntity($listSearch); +// $listActivity = []; +// foreach ($activityGateway as $entity) { +// $activity = $map->activityEntityToModel($entity); +// $listActivity[] = ['idactivity' => number_format($activity->getIdActivity()), 'type' => $activity->getType(), +// 'date' => $activity->getDate()->format("Y-m-d"), 'heureDebut' => $activity->getHeureDebut()->format("Y-m-d"), 'heureFin' => $activity->getHeureFin()->format("Y-m-d"), +// 'effortRessenti' => $activity->getEffortRessenti(), 'variabilite' => $activity->getVariability(), 'variance' => $activity->getVariance(), +// 'ecartType' => $activity->getStandardDeviation(), 'moyenne' => $activity->getAverage(), +// 'max' => $activity->getMaximum(), 'min' => $activity->getMinimum(), 'temperature' => $activity->getAvrTemperature()]; +// } +// +// $jsonSerializer = new JsonSerializer(); +// $jsonData = $jsonSerializer::serialize($listActivity); +// +// $response = new Response(); +// $response->setContent($jsonData); +// $response->setHeader('Content-Type', 'application/json'); +// +// return $response; +// } +// #[Route(path: '/api/activities/{id}', name: 'api-activities-post', methods: ['DELETE'])] +// public function apiDeleteActivity(IRequest $request, int $id) +// { +// $activityGateway = new ActivityGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); +// $listSearch = $activityGateway->removeActivityById($id); +// +// $response = new Response(); +// $response->setContent($jsonData); +// $response->setHeader('Content-Type', 'application/json'); +// +// return $response; +// } +// #[Route(path: '/api/activities/{id}', name: 'api-activities-post', methods: ['PUT'])] +// public function apiUpdateActivity(IRequest $request, int $id) +// { +// $activityGateway = new ActivityGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); +// $listSearch = $activityGateway->updateActivity($id); +// +// $response = new Response(); +// $response->setContent($jsonData); +// $response->setHeader('Content-Type', 'application/json'); +// +// return $response; +// } +} \ No newline at end of file diff --git a/Sources/src/app/controller/AuthController.php b/Sources/src/app/controller/AuthController.php index 3f22f634..64d37e1e 100644 --- a/Sources/src/app/controller/AuthController.php +++ b/Sources/src/app/controller/AuthController.php @@ -180,50 +180,5 @@ class AuthController extends BaseController return new RedirectResponse('/'); } } - #[Route(path: '/api', name: 'api', methods: ['GET'])] - public function api(IRequest $request) - { - // Récupérer les données de la base de données (exemple avec un modèle User) -// $user = $this->getUserDataFromDatabase(); - $activityGateway = new ActivityGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); - $listSearch = $activityGateway->getActivity(); - $map = new ActivityMapper(); - $activityGateway = $map->activitySqlToEntity($listSearch); - $listActivity = []; - foreach ($activityGateway as $entity) { - $activity = $map->activityEntityToModel($entity); - $listActivity[] = ['idactivity' => number_format($activity->getIdActivity()), 'type' => $activity->getType(), - 'date' => $activity->getDate()->format("Y-m-d"), 'heureDebut' => $activity->getHeureDebut()->format("Y-m-d"), 'heureFin' => $activity->getHeureFin()->format("Y-m-d"), - 'effortRessenti' => $activity->getEffortRessenti(), 'variabilite' => $activity->getVariability(), 'variance' => $activity->getVariance(), - 'ecartType' => $activity->getStandardDeviation(), 'moyenne' => $activity->getAverage(), - 'max' => $activity->getMaximum(), 'min' => $activity->getMinimum(), 'temperature' => $activity->getAvrTemperature()]; - } - - // Utiliser le sérialiseur JSON pour convertir le modèle en JSON -// Log::dd($listActivity); -// $jsonData = json_encode($listActivity); - $jsonSerializer = new JsonSerializer(); - $jsonData = $jsonSerializer::serialize($listActivity); - - // Configurer l'objet Response pour inclure le JSON - $response = new Response(); - $response->setContent($jsonData); - $response->setHeader('Content-Type', 'application/json'); - - // Retourner l'objet Response - return $response; - } -// #[Route(path: '/api', name: 'api', methods: ['GET'])] -// public function api(IRequest $request) -// { -// $data = 'Hello from Slim API!'; -// $response ??= new Response(); -// $response->setContent($data); -// -// return $response; -// } - - - } ?> \ No newline at end of file diff --git a/Sources/src/app/router/middleware/AuthMiddleware.php b/Sources/src/app/router/middleware/AuthMiddleware.php index b064cd92..ec1e7dee 100644 --- a/Sources/src/app/router/middleware/AuthMiddleware.php +++ b/Sources/src/app/router/middleware/AuthMiddleware.php @@ -13,8 +13,19 @@ class AuthMiddleware extends Middleware { $this->auth = $auth; } public function handle(IRequest $request, callable $next) { - $excludedUrls = ['/login', '/register','/forgetPassword', '/', '/api']; + $excludedUrls = ['/login', '/register','/forgetPassword', '/', '/api', '/api/activities']; // Log::dd($this->auth->getCurrentUser()); + $excludedPrefixes = ['/api/activities']; + + // Vérifier si l'URL actuelle commence par l'un des préfixes exclus, pour /api/activities/1 par exemple + foreach ($excludedPrefixes as $prefix) { +// Log::dd($request->getRequestUri()); + if (strpos($request->getRequestUri(), $prefix) === 0) { + // Si c'est le cas, passer à la requête suivante sans appliquer le middleware + return parent::handle($request, $next); + } + } + if ($this->auth->getCurrentUser() === null && !in_array($request->getRequestUri(), $excludedUrls)) { $resp = new RedirectResponse("/login"); $resp->send(); From 9d64b7de4024d543cdedfa2e56dbabb4b542ac32 Mon Sep 17 00:00:00 2001 From: anperederi Date: Mon, 29 Jan 2024 13:48:59 +0100 Subject: [PATCH 48/48] update some bugs --- Sources/public/index.php | 6 +-- Sources/src/app/controller/AuthController.php | 40 ++++++----------- .../app/router/middleware/AuthMiddleware.php | 17 ++----- Sources/src/data/core/network/AuthService.php | 45 ++++--------------- Sources/src/data/model/Training.php | 3 +- Sources/src/data/model/User.php | 6 +-- .../src/data/model/manager/UserManager.php | 2 +- .../data/stub/repository/UserRepository.php | 10 ++--- 8 files changed, 38 insertions(+), 91 deletions(-) diff --git a/Sources/public/index.php b/Sources/public/index.php index 3cd3a5da..64e21a2d 100755 --- a/Sources/public/index.php +++ b/Sources/public/index.php @@ -37,12 +37,11 @@ use Twig\Loader\FilesystemLoader; use Shared\IHashPassword; use Shared\HashPassword; use Shared\Log; - $appFactory = new AppCreator(); $appFactory->registerService(IArgumentResolver::class, ArgumentControllerResolver::class); -$appFactory->registerService(UserManager::class, UserManager::class); +$appFactory->registerSingleton(UserManager::class, UserManager::class); $appFactory->registerService(DataManager::class, StubData::class); -$appFactory->registerService(IAuthService::class, AuthService::class); +$appFactory->registerSingleton(IAuthService::class, AuthService::class); $appFactory->registerService(IFriendRequestService::class, RelationshipService::class); $appFactory->registerService(IHashPassword::class, HashPassword::class); $appFactory->registerService(INotificationService::class, NotificationService::class); @@ -70,6 +69,7 @@ if (!is_null($app)){ /*$app->use(new LoggingMiddleware());*/ $app->use(new AuthMiddleware($appFactory->getDicontainer()->get(IAuthService::class) )); $app->mapControllers(); + $app->run(RequestFactory::createFromGlobals()); } diff --git a/Sources/src/app/controller/AuthController.php b/Sources/src/app/controller/AuthController.php index 64d37e1e..b6ecfa0a 100644 --- a/Sources/src/app/controller/AuthController.php +++ b/Sources/src/app/controller/AuthController.php @@ -34,30 +34,16 @@ class AuthController extends BaseController #[Route('/login', name: 'login',methods: ['POST'])] public function login(string $email,string $password, IRequest $request): IResponse { $error = []; - try { $log=$email; // should check email with verrify email $mdp=Validation::clean_string($password); + if($this->userMgr->login($log,$mdp)){ -// Log::dd($this->userMgr->getCurrentUser()); -// $athleteGateway = new AthleteGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); -// $user = $athleteGateway->getUserByEmail($email); -// $map = new AthleteMapper(); -// $userEntity = $map->athleteSqlToEntity($user); -// -// $users = ['username' => $userEntity[0]->getUsername(), 'nom' => $userEntity[0]->getNom(), -// 'prenom' => $userEntity[0]->getPrenom(),'email' => $userEntity[0]->getEmail(), 'sexe' => $userEntity[0]->getSexe(), -// 'taille' => $userEntity[0]->getTaille(), 'poids' => $userEntity[0]->getPoids(), 'motdepasse' => $userEntity[0]->getMotDePasse(), -// 'datenaissance' => $userEntity[0]->getDateNaissance(), 'iscoach' => $userEntity[0]->getIsCoach(), 'img' => 'test']; - return $this->render('./page/home.html.twig', [ - 'css' => $this->preference->getCookie(), - 'pp' => 'test', -// 'user' => $this->userMgr->getCurrentUser()->getUsername(), -// 'role' => $this->userMgr->getCurrentUser()->getRole() - ]); +// Log::dd("gg"); + return new RedirectResponse('/home'); } else{ - $error [] = "Erreur de connexion. Essayez encore"; + $error [] = "Erreur de connexion. Essayez encore"; return $this->render('./page/login.html.twig',[ 'css' => $this->preference->getCookie(), @@ -72,17 +58,17 @@ class AuthController extends BaseController 'css' => $this->preference->getCookie(), 'login_error'=> $error, ]); - - } - + + } + } #[Route('/login', name: 'login2',methods: ['GET'])] public function login2(IRequest $request): IResponse { - + return $this->render('./page/login.html.twig',[ 'css' => $this->preference->getCookie() ]); - + } #[Route('/register', name: 'register2' , methods:['GET'])] public function register2(IRequest $request): IResponse{ @@ -136,7 +122,7 @@ class AuthController extends BaseController return $this->render('./page/register.html.twig', ['css' => $this->preference->getCookie(),"register_error" => $error ]); } - + } @@ -166,19 +152,19 @@ class AuthController extends BaseController $error = []; try { - + if($this->userMgr->deconnecter()){ return new RedirectResponse('/'); } else{ - $error [] = "Erreur de deconnexion. Essayez encore"; + $error [] = "Erreur de deconnexion. Essayez encore"; return new RedirectResponse('/'); } } catch (\Throwable $th) { $error [] =$th->getMessage(); return new RedirectResponse('/'); - } + } } } ?> \ No newline at end of file diff --git a/Sources/src/app/router/middleware/AuthMiddleware.php b/Sources/src/app/router/middleware/AuthMiddleware.php index ec1e7dee..c717989e 100644 --- a/Sources/src/app/router/middleware/AuthMiddleware.php +++ b/Sources/src/app/router/middleware/AuthMiddleware.php @@ -13,24 +13,13 @@ class AuthMiddleware extends Middleware { $this->auth = $auth; } public function handle(IRequest $request, callable $next) { - $excludedUrls = ['/login', '/register','/forgetPassword', '/', '/api', '/api/activities']; -// Log::dd($this->auth->getCurrentUser()); - $excludedPrefixes = ['/api/activities']; - - // Vérifier si l'URL actuelle commence par l'un des préfixes exclus, pour /api/activities/1 par exemple - foreach ($excludedPrefixes as $prefix) { -// Log::dd($request->getRequestUri()); - if (strpos($request->getRequestUri(), $prefix) === 0) { - // Si c'est le cas, passer à la requête suivante sans appliquer le middleware - return parent::handle($request, $next); - } - } - + $excludedUrls = ['/login', '/register','/forgetPassword', '/', '/mock']; if ($this->auth->getCurrentUser() === null && !in_array($request->getRequestUri(), $excludedUrls)) { $resp = new RedirectResponse("/login"); $resp->send(); exit; - } + } + return parent::handle($request, $next); } } \ No newline at end of file diff --git a/Sources/src/data/core/network/AuthService.php b/Sources/src/data/core/network/AuthService.php index 88c407d3..5dcae3ea 100644 --- a/Sources/src/data/core/network/AuthService.php +++ b/Sources/src/data/core/network/AuthService.php @@ -2,11 +2,6 @@ namespace Network; use App\Router\Session; -use Database\AthleteGateway; -use Database\AthleteMapper; -use Database\CoachMapper; -use Database\Connexion; -use Database\UserGateway; use Model\User; use Model\Athlete; use Model\CoachAthlete; @@ -29,40 +24,14 @@ class AuthService implements IAuthService public function login(string $email, string $password): bool { -// $user = $this->userRepository->getItemByEmail($email); - $userGateway = new UserGateway(new Connexion(DSN, DB_USER, DB_PASSWORD)); - $userRepository = $userGateway->getUserByEmail($email); -// Log::dd($userRepository[0]['isCoach']); - if($userRepository[0]['isCoach']) { - $map = new CoachMapper(); - $coachEntity = $map->coachSqlToEntity($userRepository); -// $user = []; - foreach($coachEntity as $coachs) { - $user = $map->CoachEntityToModel($coachs); - } - } else { - $map = new AthleteMapper(); - $athleteEntity = $map->athleteSqlToEntity($userRepository); - foreach($athleteEntity as $coachs) { - $user = $map->AthleteEntityToModel($coachs); - } - } - -// Log::dd($user); -// $map->athleteEntityToModel($userRepository) - -// $user = ['username' => $userEntity[0]->getUsername(), 'nom' => $userEntity[0]->getNom(), -// 'prenom' => $userEntity[0]->getPrenom(),'email' => $userEntity[0]->getEmail(), 'sexe' => $userEntity[0]->getSexe(), -// 'taille' => $userEntity[0]->getTaille(), 'poids' => $userEntity[0]->getPoids(), 'motdepasse' => $userEntity[0]->getMotDePasse(), -// 'datenaissance' => $userEntity[0]->getDateNaissance(), 'iscoach' => $userEntity[0]->getIsCoach(), 'img' => 'test']; -// Log::dd($this->passwordHacher->isPasswordValid($user->getMotDePasse(),$password)); - if ($user === null || !$this->passwordHacher->isPasswordValid($user->getMotDePasse(),$password)) { + $user = $this->userRepository->getItemByEmail($email); + if ($user === null || !$this->passwordHacher->isPasswordValid( $user->getMotDePasse(),$password)) { return false; } $this->currentUser = $user; -// Log::dd(Session::getInstance()->__get(USER)); - Session::getInstance()->__set(USER, $this->currentUser->getId()); -// Log::dd(Session::getInstance()->__set(USER, $this->currentUser->getId())); + $id = $this->currentUser->getId(); + Session::getInstance()->__set(USER, $id); + Session::getInstance()->__get(USER); return true; } @@ -91,6 +60,7 @@ class AuthService implements IAuthService } $user = new User( + random_int(0, 100), $nom, $prenom, $username, @@ -100,6 +70,7 @@ class AuthService implements IAuthService $taille, $poids, $dateNaissance, + //should use reflexion $role ); $this->userRepository->addItem($user); @@ -116,7 +87,7 @@ class AuthService implements IAuthService Session::getInstance()->destroy(); return true; } - + public function getCurrentUser(): ?User { if (!empty(Session::getInstance()->__get(USER)) && $this->currentUser === null) { diff --git a/Sources/src/data/model/Training.php b/Sources/src/data/model/Training.php index e422bc90..0fb4ba72 100644 --- a/Sources/src/data/model/Training.php +++ b/Sources/src/data/model/Training.php @@ -13,13 +13,14 @@ class Training private ?String $feedback; public function __construct( + int $id, \DateTime $date, float $latitude, float $longitude, ?String $description = null, ?String $feedback = null ) { - $this->idTraining = self::generateId(); + $this->idTraining = $id; $this->date = $date; $this->latitude = $latitude; $this->longitude = $longitude; diff --git a/Sources/src/data/model/User.php b/Sources/src/data/model/User.php index 0726aa4b..b6adfedd 100644 --- a/Sources/src/data/model/User.php +++ b/Sources/src/data/model/User.php @@ -16,7 +16,7 @@ namespace Model; * @brief Classe représentant un utilisateur. */ class User { - private static $lastId = 0; +// private static $lastId = 0; private int $id; private String $username; private string $nom; @@ -44,11 +44,11 @@ class User { * @param \DateTime $dateNaissance * @param \Model\Role $role */ - public function __construct(string $nom, string $prenom, string $username, string $email, + public function __construct(int $id, string $nom, string $prenom, string $username, string $email, string $motDePasse, string $sexe, float $taille, float $poids, \DateTime $dateNaissance, Role $role) { - $this->id = self::generateId(); + $this->id = $id; $this->nom = $nom; $this->prenom = $prenom; $this->username = $username; diff --git a/Sources/src/data/model/manager/UserManager.php b/Sources/src/data/model/manager/UserManager.php index 79e04dd2..69e0681a 100644 --- a/Sources/src/data/model/manager/UserManager.php +++ b/Sources/src/data/model/manager/UserManager.php @@ -42,7 +42,7 @@ class UserManager public function getCurrentUser(): ?User { - return $this->currentUser; + return $this->currentUser ?? $this->authService->getCurrentUser(); } /** diff --git a/Sources/src/data/stub/repository/UserRepository.php b/Sources/src/data/stub/repository/UserRepository.php index 2501b87d..cd506dbc 100644 --- a/Sources/src/data/stub/repository/UserRepository.php +++ b/Sources/src/data/stub/repository/UserRepository.php @@ -27,11 +27,11 @@ class UserRepository implements IUserRepository { * Constructeur de la classe UserRepository. */ public function __construct() { - $this->users[] = new User("Doe", "John", "Doe","john.doe@example.com", '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', 'M', 1.80, 75, new \DateTime("1985-05-15"), new CoachAthlete()); - $this->users[] = new User("Smith", "Jane","Smith", "jane.smith@example.com", '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', 'F', 1.65, 60, new \DateTime("1990-03-10"), new Athlete()); - $this->users[] = new User("Martin", "Paul","Martin", "paul.martin@example.com", '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', 'M', 1.75, 68, new \DateTime("1988-08-20"), new CoachAthlete()); - $this->users[] = new User("Brown", "Anna","Brown", "anna.brown@example.com", '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', 'F', 1.70, 58, new \DateTime("1992-11-25"), new Athlete()); - $this->users[] = new User("Lee", "Bruce","Lee", "bruce.lee@example.com", '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', 'M', 1.72, 70, new \DateTime("1970-02-05"), new Athlete()); + $this->users[] = new User(1, "Doe", "John", "Doe","john.doe@example.com", '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', 'M', 1.80, 75, new \DateTime("1985-05-15"), new CoachAthlete()); + $this->users[] = new User(2, "Smith", "Jane","Smith", "jane.smith@example.com", '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', 'F', 1.65, 60, new \DateTime("1990-03-10"), new Athlete()); + $this->users[] = new User(3, "Martin", "Paul","Martin", "paul.martin@example.com", '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', 'M', 1.75, 68, new \DateTime("1988-08-20"), new CoachAthlete()); + $this->users[] = new User(4, "Brown", "Anna","Brown", "anna.brown@example.com", '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', 'F', 1.70, 58, new \DateTime("1992-11-25"), new Athlete()); + $this->users[] = new User(5, "Lee", "Bruce","Lee", "bruce.lee@example.com", '$2y$10$U59ioMTGZBM2FGQv.3lcbuL0IkO4Fx1jQU7f5hF7o/hvCX2t46mby', 'M', 1.72, 70, new \DateTime("1970-02-05"), new Athlete()); // $this->users[] = new User(1, "Doe", "John", "Doe","john.doe@example.com", "password123", 'M', 1.80, 75, new \DateTime("1985-05-15"), new CoachAthlete()); // $this->users[] = new User(2, "Smith", "Jane","Smith", "jane.smith@example.com", "secure456", 'F', 1.65, 60, new \DateTime("1990-03-10"), new Athlete()); // $this->users[] = new User(3, "Martin", "Paul","Martin", "paul.martin@example.com", "super789", 'M', 1.75, 68, new \DateTime("1988-08-20"), new CoachAthlete());

    🇺🇦 UKRAINE NEEDS YOUR HELP NOW!

    Q_Ou^>6Zi54AN7DF$;bZKxSemv|ZML>3)BvgjV^YlPKe<8=h zOnGRSN^6d8M2sha2w7c|S~-GON%Jr#xGTKy*lQ+?UZMM483Mf}(QN>PznBF_UW35G z-$Mi+hb?AQ>W`i$>U>R{x^TZ02~b2R;|Eatd=F}>36ZnjPF2|5yAqV+bMknQTQkli zUdx6p_?4CWmsR(r$4YuK+H60vI>n^+7`z?EpxdO#6A}bht~DLtbWk6GXb;hF*o~va zz8X~o>P-=_cDDMviLMBWS!lLdnD-+%*KNzA!V6mGCDx`_O%F1jN;Ze077I=SYkbUN z!XRu&`%rBq@SHG(W1w#{iOe?KWLlyX|JU)-tM!8!2$qp=d=<826bIcv%!*Umxg5ys zOB-U&5$>jc?kI48GlG4axms8`3`C#ld^Nq)Fo;F{i^OKU$cuaSQvhrco8I-1D55MLZ#6P$7UH`P?A72<7+D#o9JsW%`=S{2Er^4Gza!?lJE zSy`ofXJU%6%ezt1m)EEa@rv$--(>pX+i58l6}l6^R!kE4WA4TJ!$}YonG$aNQ|80lWXFN2CG3)U2};aFrpn; zZep+lqIulTz=dRwYb;1`UdoW&v%g*}#Rg83`ZVw?GqkxVa^Mqvx}?jL>h#X8_|Yir zqATFz={-!ZO?(820dh?Dn?~=fUL~ci z{#~`y(;%q!d@NZZv@6L(DKGQ;a(i>_@Hh^2G_`~tgNYK!@KxUZ>bvw1hlSM!e)Jqj zR8F16f7qGYmhM=UuBLsGy`!l-ea{pZ^|KU}ITn85u+uzraGjcxrlXwe9J96ej}=Je8m;*+ng^jIQ^P+#J=D3}H@_rd*~mz3ZHJ`#&wp z)-&l$+IiNy^Ju<6wL|YEvbhit46Dwz&c|KNlakiC6*?9n;^X zbIz3NT5U)zYX;WLvSB$EH-3h=i=M7k6ua8+4Dq{LaR8v(*O=xWrcvosEAt1Q!nV?9 zys;;VDKH2#ft7qrZFPi)J6wy3_RLenas39jntrM?9TB(0Kh~mVuo(>|RE_hqFM{_- zc}1#RilRra7OJ!srYyE?W4(mJIHwc}mYQu1z{Bv6!ed_r3@vo<4?55oi#}j=_L(97=|HSg(lc1)j3ax@)Apl^3j)#i3GmHcukB z;ksy))z5bpQwLJ=vgN;g6-jOCF#cN z(^0;W3aw=AGjR+483~G_k1AHtz#q|fi+U<~tqDJYp#W?21DQPFHjGt6Jf1HQO- zU}<0I=^}-q_KV@DT7OTU>!&W&sNTJ~oWtxXFlz?1JYDuANH<8)Bx^n|yo@hB=u)OD zuc@WApaGMv(KI-hj2g=1B?RWb@5sBSVeM$R2-0XMklj9?+}hNYM( zRqv)tTUrVL_to)Eu9wz4`P|W=HeHuvG>CInYV}hAiUFS*-f#bA>}YSZVdUvuOnw+ zw+eoJ@|N_K5`kIP_G(N1BX%N@?>C4swpYcxC^-ZZi|raWkD^Mc?J!~{Bk*Swv8`a2 zA3Bu3Y@;?9XNt43!5D-Lb1K;Ka->okMpkX`4ukpP=QPeUyd)!W*YkLMZ68 ze?|By>#jmdufwFMQI|*xa1NgipP;c(vz z9xe1gmH-L_F0I*H@^Ffp(EF?TQ-?~mwW+F7hz9C1BURGRI+_=}NAc~+>0;x$O5w_l z&Ta$93Ys+7!Za0-kijbfWlg#^y=OK9r(xpd3?D6^R*n$sBxsPQq9+sHK)v^;-sBhK zTd6g(j+pR0i0mP3jECRY9*^F|ajVuw_}LF9W-f9WMSE7pdUQ->isq{dTW^Ye%@j>7 z&O07?yqvTfvJT7-+RL3;dnEnW{X{K-aEOci?Z&JcrH2x-lH zFBEPsiD)9Du8g@EuDbL^boki*Vd)byDBO8_J1W40W97IxTM@vVkYziL%}s#=;d$JK ziOf5x{}TW(N-_)E0gAfw0ugY|S6*m##QW?`Hb}Tzr)?;{`IAmSsMpQQ`-EAK%gYsJ z_XH+%Ypc`?zHXZ}4B77f)AHkSjBTFOU|&45N`|EfD`}zF>_#86aJnFQsg^(WB~ZcE z)~Q%1jJ*vrZB2M#72D1+nTsJc4HErY;u_!71>AEgTofD&4FyxCg9Pm4qe)$4JT+h& zKwfC-7%{;MA8AHS!2cYl3=pM5c>DtDnyYEkjh;2z88ZOL3=J2y4@QB3&6_&8cQ?$! zJ;VBL`Z(#^t>pL1b4oDmOp0Up;o{sUgg*(~Ei5BEW+I2g2l!Cd1E&J0ftKVjIj>ez z{tGN8<_r;^U3&ER0$Edw8}T5J3vN}PZp0pdenm;jITrj*skT3G_tF z(8+OnUq4fg+y)2WZs6>n9M=+%_U1lWI}fVKZM12YRt{ey7q$=;PFFjK%wYBCew4l6 zX-^PL@ksaWSGyy{$Iz(`0=I)-`?WH?s$g!5a!=zTwLWpEg%pqAhoI?7wJ}s&a_dVH zp{}{{avf0Ma>jKy2oZRSzLCb)HufYa6m_}vV+k`~{y}XWr&J#VB#e(upXc24TTC7b zzG0sLqWl(T!t>#FgII_%`kuBQwZ)OJRuJOricLgsf+pj@RqwhEdd~DVHmpQb#hT-N zw0EiHG7lXD*byB#0FE4Rj&EwE*70;uOxfXFg|ntOuzpaB!`<- z+%SBmAL2Ve+MMyyAQK+?D~?;Kk>@>qcwk)yfMh$&bPr*UZuCZ=+`fUiI)@z0-o9cr z+wB=C=DZHre0cM4fhu@xylobW+>`v_mb-2K*)i|r%-h3TGf6=oFc|>XmauAUXUm== z^z6W%8NG$vGpEIca$B?N7kg`KHAepmc6=Oq8(MvEzV-}YW$Gh(er znKxT7$HaD|?z>*0Sqc{f9ee-?{CksBGj%;qd1cM~-S8*s;MUM<2Feg5fh^KP$Bi|m zr!S-*3&6>?nM1OgBdkDYhrktooi3IVnjX&;SGC8Mgi?GJ(1jI}5te8vB5fprmS8^N zK)U(e!LBH&yVQA(QNuj*bBu^O-I?YgI(&XPapO7!R z_K%K^JJD*h6P9A>H|}#|<5qn9iT{TYtIYNFrh zvD_aQL;&`75rL?4YkdoDwksS>SV9#pFrP_W_$6=^tt4EZm+40mnmJ1W>BPj8laLhR zfI|mMx87i?~Bi=te0OD&AH&kIH671GHS@Tzg z;aMT*`D*T#Z>U>;KuCf0m>;zXC8ls9-dI(bnvG%VGBHjB3z#Co0q3Tm7?;(|;yjV- z1wtvU&Du34k8U)IY>6n|)EXUKimqI3!UG92$!~6a^7t{cnM2nzO5%whTo^Lr5AoBk z^(C%<*Vaiieu{IKRQ~1f>o3CX1b=~hw;>DsbkKerLbEMrePu*{k zLL}vFuqikcl7f@w{XZtD1hrWKoy=v}?ufbyoD3PR#er`QD9FpecAM*9YexyD2Z1N$ z_Zx`Aa}VHjO&g=^3#`hq?B*VHDCcz+62Qof7O0*X?k$>ZX9bm>^qj++Mt)|od})LV zF3C9XKWmA%=4k`~|NgZ1P72ePse~f(T01X<98ojr`z$vi{Rg!XTp3jfSi_BIp-j}p zjHgecV$HFfI6qjFc7x z(*`?2?A*sym3WkW{h=O(N2;#^toi7mi+*SYUYkcMf975n#;rn<8c1hY332aKSD$q^vMFvnF}uq4+#eGhN`I@o&sU}hvOHZ|98OlO z4zAU8v2GczIoR}=9>gmO7%Md#C%TcEXGB-sM|MdS8*XgA$CDKv<`5}~DR&GCG7H>w zPe74jgapL(z)m?lHQ$)6sRWTFS?d_ed=`VC1L@^-+GXvKw^O?4WuzZ`jW8-C&k=P+ zcjYcf8EO}K37>z{D= z^ynk)1zXwV-eo3Fg=)JK=$wPVuWDqA;kfIl$b4k~_rL6I{jMaF)(CuTf|84))lEga zwD133j$D0A8HHUts&_yxdTKTzGYhb}_tOQ))lbfJ%V&LL-2FY2peX-iRVQ-&u z=WTr1`RzJZpneMzENgaGInK*CdtKb=`EV)_FA3olNts@#k>qT?@2z44#R1 zpp>@Ux5~^C@kFeZD0t3x^n2I32OzQjgJQ*ds)L7dA_#ip^2`m%CEXfU47yfOB-a4T z+R}4fbdUEU9tNE5A|9K$ps)+Rlr7Y(xq~2}g$yR@k?YjshydkinC|;)K%x zZv!_a(@9#CuD;$iB>pY}&bc5)QBCt@@L=#Da zb-W|%rXFNkTn-}OYMu-hTotBo z!96P!2rNJs>GknCEyS}d@?)Z64M$dQN}#4{!rS=u8nuWjCiBtG-2G=nTmzOx$&3C- zJ+QqZJ&%nh6S8C4>RntTc7h3wmJFL#A|{{ z`P#saF!?>JsB-^9b6%8=J{VR_(9NYHjRu!as4#fR7#k?Ue_>%MKxTkdy+mq1$q?!g zv~c~r=KL~y%K-f9FJfTK7hCL9&#k^Lw7G$AqhR#_F6t7U6L+p(@L42w{>eNkg%~+ByIkm}u+#5>zIBF(CeNF| zBdU1(`N?}(8?wbGX9_9-{erWdA5PD4{-NUo-`HB-&FR#Hp&Z41HCOWJ{gq1YxW?(%gF7H*uZ`4$#fKiUGp0Hk zLwRv|)pnHSTZWan*LXL_@_~M(4Q;kMB6 z2S+5;791Z$iCIVXVk`;|nrohhtBKWVZ{)-d*~q(`CBW?rMm3863UM7jSz~Pp-0+o2 zHnux!W_@d`t3kTC?qqIfxk=-`O>_q#gQWdJJ2jW8V&#KID0kFZ%CRRZUEPHg`yK6y zDaRvJ_oj*qLg9nxn9KY%SX8|Xq3fWQH@?cz6_bZtO?Y`Nxkz@?w(2`EAd(t>W zZKR6s9UvoYp9xLY5lV`p(S*-SmC7V`X`J}wm0PO1`iqL_WsuCGJW%3Dr41Srtgfe} zEPo)xD(RxGzHGuz=~Gynj11mN;0%)o?;wE^&p^{L+Ziqz6r@`zIv8k?C?Ax3I?Wp` zdeaWUno^9|h_!MaPW#s$(aX%e3jw!gO)Q*o*P*#^2ki$2NdhaSe>GrD%fKD6SWIncm*qB~Ul1 z*G*&JpcVacoVl(~WGSPRMuaB#IszzGF0=VkKww))^dfo4TW;@tw zD!3Wc()(zTJO2)>&2n}^=$@Qm-La4J`U-!#=@$|mFYy6otb&(I(>D7FGHMW%t;)u7 zJHHxp?NPw+l&>k<*wwH*`xtH_%%j>S!J#~LvwjM{bCLBrobZawREm{tBuM_aMewQR zH8BwDZGhAWA`bkRpjN~*4AzQ#%*5^Dsh9XTUcjAz@tq$#8X`!UH~?o_0-y4^7l~+Nc5QysCXkgdF{8IqJaYXU(WmOm09p zq^6<{u{ zOu+!kY0iz{?&1P1-082G!Qd!$R1_(H_3Ws{k`0~`8TbBYj_R;Lnr9()Vj5!cusBx4 z3N&JIdrLgmpzmT)Lz41_6KwS+swty*@7#Fk)$mBB97E+vghj2%Il5y1B^Gr?G zM{&$^2@TPFmzv(Ptw5&ui%< ztfCtfA(Ia{Jk~7%#7AT;Z1I^1p=D;uu694W3^}9RXvU4XRNo6NMDD~w&xe1PKk6XDDsN>WUz~v;VVo4b<2p z;K?$@3t#`zPkk^OCbq)66Pjn$>fElHt`&5qD!Su%Ht!=H!hRlnlC%Cu(^qKr3#Fi` zFC%8Ql}v;OD-#y4a3?3<9_IVRE(xMT z+6^rcM4_wKOUR_5QA|snfSUyBM5X}o@awLr9Winpw$k0I5Rl@AWRLp{fD>hYO#dnV zDst55Md>zV&e9g?f5J0)kvDGfY55%)vXJTZDSAC>yOIXrx-}&A#EWOdE@93GP(gIdEhgxb*oug1KMimr&p_)Hi2h1Qkf61C|kIx@eBGj$Z| z$qkSgUGu+`iLX9U-R!q2Tarb91pZD5i}CX_7X21H`6$B}5sDBt!q~JG0&u{#d0jNL8-?;0_Se>WF{z;JsBTxhUyxP6{}Az!PIZIcEsGxJV=1j~ZyQ9xWYWi+IJv#sBAZNX@ij6^Lq$VN6l~F7sQ>v^zVo>5wq6ub7saH zxXpqly!DCWIJ?Dkox&_q|AdWGXqVXX@b)}m6EFDnV>pJMj;X*fdaX zWNA%+5g!J> zzyhRU8iPjaP)o5o!O?A=#hwA9)6fzuW~1}j)&xd&JI#7L7^k|8-wxhZec+pJTcQ|>TI>|zESWY(EJF_%sAEbf}U zAZuU9eQQKB)Xo;;ll9KnUnuz>0RoZq!RUqD$9bA;ML7z73*CIzW+hB(#-CyeKQ8fb zP=B3C7l68vOlS0SADnZaA~OTqiAezG?MahmmiZSQ4oHCU+NWjblDnWlVw%)8^dlwDMEMdVo{le`OIC@lJGJfC zu~nFb2!xH=%^&5_8$~<5gBZSzdfp3tqI*?*P+rp+#6U~E3}mhzBWx75nFO0b>)j?) zao#kL;Fc$hlDlvxcjq{euE#25)pyIFyu%JYk7CVmb(gF^HcyDA;f1v@J|#(;M=8+! z9gWT_f}_QrOoAS2av2`3y?Kc~O%L~Dq?fmh?VmdbHEY@bkV=eieyaWC4M*p4Ca4xe zBn7Fu8dQ``F*_wsUE~d*0NS3**QnsaiOM#YQy*(-gAoM0akdR<35@-gtaM10G%?2| zJ9>e&2Uy_=O#wKfeXh1^KgdR4GBTpqeQb0dvI3`r>U0t>DdmziYaaVwC@7pUJj|gL zq{Bc(Pqq81{NGF5K>|MJ(#0r;PBBTVW2xqv%EDCwkCTbk$GqhWXH|9voJw0IOW0Up z3N8YnEv&)zzjUN~M5VW{?i4S~Ij58LRGRxU)6=wsQUncVFBw&aN4uDc*oSYkOCAC!|{-2ab3KO1ytqr zyoAEAnE)MJ^d+b^I^HR_F043vwLV%p`pdD^sdBafUjyR*Ib<5yhtW{Z8#l!R0;+*P zZeXf(*4k1;ZTzc*?{e6HLS+-=k%oM#7?StEW-m7(-HaKnB|-P*typ~85|>9%rqeb4 zaa&yp@Qm(p@&JK;jL&``^!Hp;pN^z5k~Z4YeWHOf_?zi+_qw4;R+u+w1}x+M6Y*=S z(~;nB6_IwjpBc`DV16l9F_&)$NfGfdB5G7C<~fK0ZxU z)tE#tBAIBvjOiM}tj+|_69lm$b5c#ox_pJNTXU;=>Bh(I`M1)>@$1XZzngq`-FiE; zb<1{Chr`8S_ChZlJI%5y6~G|rHZt=UL%c=?p$I4R6NOeO^u`w&qT+Mmlid%%pKY|( z7XUw2SiubIgnFd52VE2XD38mr*cX{kh(BH-yuan*0AM!B5y{u_aZ)B49Zcm0(FD&& zyoXQj%tYs;D{G=93!I;3E2wI}RmE6i26lz&jtu${k@dc@3Phm_6NIwIbMkVALJKCj zCCpBm1Otn~K3*!7wxdtl@j1QF@em$Dpc}#3Lb`Fyml^WEw!LI0-Q%r9)T#U_?Us7^ z%7JMHb4G1uJm$~1y6DPpyweuRFS{V*9ZS zBJbW(u=349v|dESo|1Im~sYMCn}D*5!@e8st(GK(PW6k{BMPk@q0D7;d8@nTp5 z-@f}wGR#*E49~95VHbqCPwK&v`jM-Y%%ggtWniNS*@r+;)WQipjE&XHw7?*iT+!}s zz`LM|7gO8Vl)butKxJxdQqVc}dB#~?7*h z98qi^Q2xH56=TOID7iW9&*d~$8!>2M54yhR+HX+wLI*O%jq(^|fyR2svqQRD5viLC zOKv~tMxNc0@ks|aFUC@K8J*?hdjuK<(<3_H`-=fnnA%_U;v$%P*vxiA7q&)|0(Lls zoJR=ZA;l3SfQKlU?}_P4)D4G&G%4aj(SzKU?{&PHMIJOQ+H+qFQeNl{m}$xsanCuj zvfkF;Jvd~**dnMxL-~)ETgSPZdFzH{FwGpYXUg|2fjFp(@x2J3%VRZ8_=9<-r9omOZ?5CF zejm9OtDk>eZxfz(kEt2#nL?^10~;dR-AqZS+mwoVKDe~HLvmnt0CV0Es?`(_JbDCd zuz49f>!OM%P~@NngAn5E9) zw~?)VC0jTjtpH_lovNMa9ks&$ke>(9A=j{CiIICcfDg+2ciLIG-;M@oif_|TKL23g z#a*Q0S&}Df^1jS^o@cXE=o8p;=5fINzoYV6z;>mEy!s|e&zA#;GKF+OVf7Y3^xUs{ z1IbIB1$8Yf>P_fy*M-;+=DDzL`3m%Ck$yXy%Ec*imESEgLsVPCW9X`mX(Wr zB0yonI>!?(M?M-oYBMscm$x(hUe?VCS5lU|j$txv=MjIXVcdkLC!|)2VA#u^K?$fF zI4ix4gnK9WadZFZ7%am+-A(^tKt_L~aCu;o$=9S7-Zl$(C3)i%`H_S{M-nQui1p~< z#QHbc#bSRFLePaIyIr`CjAf&6F%|O3?%>Z1;;H9$l9R2V>;ghFgYM)Np9*46QZ$a5YvR8^K&9L zl8S<;#p#1FJ6?2A(Eqs$SAel^G6&J$!RO_NhpF7wSA{}GVenbXZ8++DH5pl5br{q< z&_o>)CMp={np4OSqpEUmAv)~9)G?=@Zhg1zL;8IwV+vPXs@lTvA&t)W6pD?l%sQbp zyG{K_4HJBAN!-KdZ!C}s%s~Wxq~Jy={ThR^n|_Z|ttDnC9z)1$@Q@eMHui*3v&ibG zb1cdH!}ne+gj2iZ*+`I0`uYt$oF`v2HuA*dm_7Jqx*`mPC!D!)`A}{*VvjE_!gJ&x z&%WW;?yWi0xt$?7jg&u3H+rff&}MLd=4v&93zRJfIVxS<7H^A_qHw1QX1SjDqdR@` z8}+p<-K{88Hws5XJAM&-yWV-Q@5HRO83-N3dR>`;f_{6gm>WI)%91e4r5d3$s>Xa+7)h%pvVlaa8Gsg4!|e0>qN(Z!jMZ8H<~@ zt54D=UQB_Dv}t~_C@$GQ44MncIMln#+}0!(z{*}BtwmLrC+V~nT#?dr>wxJYGmF2a z)d=Xc)}Tvh)TjCI3u`z{2jCbfo0_^j&d;juUt%WGy0SDZ-y)>kf_C;`@CrVX~a{x}!`N-;ctFtPtOpL5$X)#85X@Hk{&g#mTt zJ-sxiw#93*Sm@Q6OYWoK%dJJ7@$T>fAueQMnB6@hx0__R(yGL!j@A<@u=0GQC(1rc z+uFu)m|k3UqoYduZF3R9Mz2q_#54_mq=>= z+Ul2JE>4sfL03?~CqCsMwg0w^0K(@BnFutpvyw?`77}k~E3Sl^LTLM9;#(ZcDP(>w zHqrXV)o?xS*zBq;jVo0th<1)W9A8ZOpR#Q`1>&om&$hYm=a&kOlCQYvq*-|c1W(b7 z$>5G3qarGAS{aRnUsbTuZ70k{_vjPSAaD9?Ee7)dWuC?9o}{!ObMG_7X5DHApeXa~ z%MlpA?*2)?gNjbqEG3YGPW4<9Z!w>;lF(ZSiKwwF7@1oM>6K8)(x{L^QVw zIiifR;JNxZ5mDIQ>yPrz@;z6yuG&TiGNoU>CCm_t;Gxg zO$Y#QN-je+f!Yq-FIxqIz;ynnE@~(LexPLcRZ-ih#r(GhqS+UO?+FQFm?K(%dz$U7 zRQhgH95&3_32qpt0L9r1Q{oCj-CLGCfJ1>IZsd+&$K>TS`Wt4Z3_s^YaK0*A0Kd3_ zXn^looQ^a{b8Fr#+%t^VxUA5kh~t(w5^j2egf-2SFx0w>O1I(UjW0dUS(_llQP^r? z=myt7tZG|+M$KABtJoqG?JSKmQ-t?u&pGYy1T9u46kYJ$6Dr*VsguMi5qV!kFw3$~ zaa6V+T??VH<%hCnZ*yDg=E--1Wy?rzD5E^}KL#d1qUiRAFk?kYl5|%E0qek4;Nik1 z>JR2(K|jZejtZuH&@+2=Eh44IQIPX{YP9t5LGI#LtzsT5EJOX3VwN6gfb|)Ua)bC3 z)96?B_pJ+lOT&Q;CJmAc2a7%cjuBYJg_et~!ql9>N)9K)u%}7=&+w%iLYxWlFgQ5; z%p(n})6=S-?6!ir%fI9(j@sQSDm#n%-k#lQEGn!~er+036d6v^+S%O#VYrXwkLO(Z zp*avno52qb#g^Hu_lA6bgDhvSS}n$=+kRgF(QsO^ePTSYc9wNEQ{Mwxwetxj)_udK zcV4m9xbVH+I0?&Mh2e-XNTwuuxMiFMNYR$2aQe;BDi%0>=esh#sH21Hr*Wr|&@RtS z%stgh<``PQnL$C@Oj+Wlm1sCHN~&>;Ms_CX^@Zp$ic=Q^5*)x{Wys@PZ8w0*K$>$@ z%fK?nFTQ9kmW3mUW{w#0@(o*-}L#D*q@-SZ5dz78V{AIxYhM2{NbJHI%-L&uI3#O$agdVH1~WRLkT z|CworEYN`7bCB_BepXH`3j zJ(;hWQqo#JcoH7srx63BwH5~a z?rb9RDD~W&jqQ2JJ(6q;2f#b;H3{#{*zCe$Xk9`90(t}01=OPO!4d-m9>Iy2F47QK z&TljPT5XA5A)BOMgwx)lk(p>HhXub$D03fH9al*l2}hkr!PV@OkRYSuRR5oS_>5E3 zDSy*xj^}Ew5$qtfLTKV>XypF+f4gG7KM4e%2Q<7pOrC}4IYm4teA$eVPN&6Ip&5D5 z7YQ^?Fv%~9-y`tMlV=|MTcGmb}mU=ODp3N}|PHLAn zC`e965f8Y0zw`ZN3fxBb9>_Qe8sE(NI`Xj@tq{QraS+kcu7(mk*PzF2)W!DTVcOF1 zSUB$Jp-e>Ou9MWpi>-H!++&YLR35iUrb?ab@)n(Ck zmLkv2U9`zABB$<d!G3Dv@>frQLD%i!6D+GZB_rj}fmfd^T`=0O4T=f_XAy(N&EmZnLk} zNY}Hg_X6r`qp60T0XQ}{c|#L`aP{j%d!DfkCKBPT3-(M7~=@ zd1Kr|o}TU06?q?ZF{x7BJq`0NlTvElko&1UC_nzN-pU#wlC97{)Q<=$|G3aZJPWlQ zXqXMi_)6dcB+l<2y1Y*G8c(C;9)~_i{PvV|^+f^DF94;#!KgpfPCJpZ{vg+G{}T9lXa$w&%qm-YWXoEKF72o9u3O7r?lVp1xY_$ z(gM(6wS6WYYDg+<{?{FZ-~0KsJZs)0D?dtT*QwDwgr#DJL-wP51&%Yiyvyff{^8=z zjE!^zwRM|V?r#b^000yRL7Iq3;SVNL1w1SNgH=#P-SVYH5!5khILK;i7y4IerYp_y z4Vsv4!)&jFq$akU4(E&p%EM}0lVbs{SWdb?P5&qFGezrN589f#uPh?KKX>ohEuq89 z{@L{_CUax`=hZoW&Tjkfsf1PU7p9(#ptH`xw8|B{a@SlKwoAo=^>0BRd0RJO)A7xR zrGcLtbJZqPK9>e%miR{Ma5w#k8-2XwpVHj0{Z3sFUuXd`3x5`EOay zQ=0T(IFzf7c@I+56z7j^+mqAo!-vycAMBDCDKFTdkO}d?ThV|OFNvE}j;=I50tV0< z9wjxcn1zefy4F+~C@^Z9wj_i?KU~xCZQ$NVji><)5Vc0fZq%jq4eL* zo80p7B(4nLt9qIm+HDy1PzOFt+eb-es>l|_qx$gmyMHkbHcp6H$72o2KdHJ61TeeZ zoIHq4VQkSyAagn39N-N0_7UV6+KGjsipEk|rVk!*X9aBya1I#)93gWt*MT09cn${l z=9FeZJ+5Rv2hf$!>V`VQIWi|F5uwu{(5Adzn*W!ah!;!mOJ20-9)f|61Wb6da##vC za$=L;=1;J(SNW(3lIJk8%MA6M znWa>l^$+PZ^EUhk9Q=9q1jhpy-pc{QtyJ{{L?9*juoYJ%S4krbjm>SAA_G$S;pj3o zi>A@jh-~hfQHxC9z4K;v3K9p+nj|L4bF~Afp){8PE9wkkQfVEO&^cI>I*tkOXv-hL zQJrYiJeHqAx%^rL!$6cRKz$SV{A-PZv|x#z#s)N!n9lJ5Rr75vnchjj@=+PYQbGKk zV>-xnlMW_DPEJqFOidQN+3EwZ#a<1|E>LrPm8dj&qOdzEkRajCYcUWac#A%(nnBo6 zhw=|wDZN6Cn|^L>f~%7+165-Xh5*h7U~v1H%q5G%bgSFLpL{Ur+10*OE4Rip-> z`;Y$+DJ#g6{Kh^K@3=oALpQaZ?42h(ejc~J_#%3-)=(0_AX3;vT#z)BHr?6(cgoYJ*P-$+gRli<~GLj7A$3!svzPNuBn+i`fdJ z8k2GyLF&Xy@aio~;NRg|o(X`NhXh}=k`ndSZ|W!hKJa+E2n3iWW4GhBOImywSICb0 zts@+P?`zA;!udq5lc+o0rOV5%<2XV~-%kkA5`NFx403Ql)BqZ+0gni$l2t>Ne6_ls zmNm6<*iCnl#H?N=WU$78n+j$1lv${@Z#r&teTh|NPw;uy|DE5MR#d@m{eEo4+3S;x zDUNPDB4YTLrAh+V!U!hdsL1Ot)-dgs~>IXj3{bo5&~>jdPe|LaxUmpAe@f(}I>-XEIo zT^H5LfT)q?Y_cousDlD44$(NJKX7-Sn%T!wqO{V+tmiXt=z&_A-i-Y$igT=v-< zm^W&5>V`p8tMxJ07(z%vWysS+B10NCMBU8fu#T%EG#Q>Koh+Ii%z~WFg52G=zD-zl zKNY40ie|9pHL`_H32tZGrbGuTvh|s&`SP5tEYpVP-cQsP0s7g;q!G0jKUhui`cb=ms8y~>*|6lv%WAAn!UVs$W$QB^k zy^=gQqHYL1G4EL6uJv~CF2%pLw7A_j?l=!5)BG*y^zrBw{qZq~Yj#-RC$^?v8PUxGoFcC=L7RoHdp$=ts}|XG>bER~oHm z$of56>-|UNm9ih-#2>Z(r2IP9X*KOMV^4%#c>S#I^7_;Z&Fm3Vu|C^~ZB}zhvk8I5D+d<|*HMOTSZah=JxlukF=TZh;o6G6tN zxgH5@TzOtkOTt&o6+Buk*~$^v_cr4P5kh)C3JiiqKjC(zwQOT}VGN)LAVYD0(LM|g zoLxXa9Wu2VRRrX}v8&2q<2H2HF)$7i6Z3 zO^mv(*!Aym`t@fwGa&*U9~sDW8J$L;C0PYoLg4kAn!y+#-0M1F@_OwAQ^5iyeJNfx zR?hu(%HEVKn!dn{URmv_I|TS3aIjebc)ZdUh~^Yw z^+rMtH5#YR_Bo8x>S;8%b-F;sgQT1UCQ=G7Wt{ALyZcTjT>wbaqdI#}l^nQkGe36N zQifAU_s1taR>z02DQM&YZMuAd+ij#w;FlF)z3bG{Fg@J(Q~ea`1{0o7CLkmoA<3u% z%FUQqd(d$TEN~`+^C(cOKd_K|1*~i4c|oYxqd}2NU?W;QTJAeoL3;b($AxpWrP z@ZC$kC?!Vgteuj`JWl10V z9OAQ?0&YeNK4q2Mc7i&{`LMvh^}GDOo`)veT0JS^BfmJ3faj84A^Bd&m<2|kZ{PEcxW1~0sH}M1Wev01OyH>C5r`SN*-r%hc6(Mn z)7wH&Wn3gY2m)Xg9$=uN&$W7#ytFc@iw*0@C9z zjOw6xXTI@C`3S_XAs(r}U|a7$w~)MTMtX-d@B?T;;CS4&sD0g>mtWu|Dw7_>(YTshjy}x{8=b3mhNlf*vF4 zrw3sW#=@{FGw0TJVOyqA>;TPex&35sd+4LfC?0pT{h(8n74yiwY*oqZ{u8`K!@ZrU_lb8}ZlrhFMsibcB?-t+zW0JHh*(B<6 z00O@fShc_{?3f2gupC{6E{|EPW!37wBS=El%`*ujlXHGxt^3X>UX8a>H_57=?T6k{ z5FC9}jCSh#4`^hO>j&{)ILg~LIJSKB%<*|!ly;Zcdec7zw;4#Wg#k-9ci=yR1YohIFf!0CTj<}k& zTG$|Pve&1Ix7a|vj;I5VL>`f{*(4>y5J56RCZo+^(h&OS3qs?Y>?5}iVnyJQuzU9f z0M>&rTh|+Fq;}b7`0-X2D=aFzrFgzcb6=?~eEi)FOBv$SD`FTz%tjUY=Bu`y(TmSn zJ0(2I4;c;iwp=5HHUjxJlssh`1|v778fji{F{Z+DKq{1?{h$G|`EkVY_8jMxHhM!7 z9^$pN&Sv*vs(s3Bby%fv{V+rW;1A$ld6hm#gY)9L0w(qYl0u-bn>7X|PUqo&leKE1FB(K@j4TZsC z5DgYI@Kugp5x2W5p@yvn1ij|`4MTkz=~T}8V)eOS=n(ZPA~FX8)Wr@&TQ@-UK~CjK31c+NyWp33mXtqW?QA5HM=g6zi{23&*!9fPtnWa&PjWgl8I=K- z8g55O0$6;Ca^zkFmDw0P2hLoTjKy$&5r?n!_Sjnd1bhHltQ@U?6mv^(aJJZGiiwia z?v874+#rryuK9yuAC+_g+B_WTF17#ziT9bE2@lFyY5?2d9!JHclPPvCQve1xF{zIO zNvv2GSYl#Wyru}s@I$Pfdu&!y;9bF=~$ES8u?yiR37m|I8hNd>xDfiVuGxY-p7)XN4kqOtC#K!|g(>dy~5m z9=JNQ%LI>+_cKW@+8GcLt3Yhg5}gzvbioA>=ed59c1BDH2dY{uf+$Tkc!jQ$FTvqw zD!D}lqqMMRxWUMU;|D5iwse-p>Ka63J>Pyjf260VSqor!uo@>9y2^5etVpPN;srVL z_@3q%hcw{=Zyg0QoJ=AHF@?YPG#BhK2}KSKr(RH1iBrj^eD9g5G;9IznioMo|Davx5*QCQ=3*t5i9>LIpjrN<@ zNJSbC!T=KAS2tRn9%OU8cGaLg)~pR>IaD8&@vKY+G6`=D=woe3|Q{1 zh46)5Nzdi;vgj>eEv0`z;kzAAonE=~2US8Geqa^S=5~U@cbEq&NVt*1=Sr#Inl1K0 z{!4QKDRgI?QI2Yd1%R)8PVaDjT>I#9!riQGr= zY{QnIgxQ%D6y-BFj(SsRV7eIt<4b@RN&{U<0&<>}u6$2h3lzKm`seN2-wR_AN>2MA z$o_AO3Bk*qgz|D_vZ2RO5O0Z}BH3itsZQxG7ZRl;a!X1C>0tC`KRy%J$r93)l*(n- z);L*cF2av1be(&F1U1HW$gWR8(Kol4XRbTCq_FpWI<@uTDdjg_e7sES7Nw&imfTMm z;2J1%i!Y_vQ%8?~5MW@L2@Dt;pTx*Ef8A@ZY~rn5uwM$nK{@BR<=CmNz;$#?q4yk2 zuLHd6LBlm`HMUh!T(ymb)4ds!?D=UJ;(a}SgO`O7%m$JR<0{+Z@w}tS`!k__s0}If z0004t0iLI7MgOnWy2(R|ar|DioIzW48D2r?E;_X{4cE<17j2$n5dHj8QO$Qo%Mk>zmf zi5A8ZC+$YK2YXg@SH^521#4Zx9K)Yn;1xQv_c0GI5skq^0X=`0DRPp*2BFkJjTViLDg3ISQ6;R1~4ovPD{H zizRiq@vT3jh!5smLg^xx?5?K(acO7QHbK3j7CiiKn*=7(zD`X&GffxZpmmZ$)E(C$ z>dZ4Qc;!*rp$x0&NyOhor|ttlZdN7ScVt#H?UyMJ1^{0G02JmynyN|R4<=IuJS+cv z^vP_Fejfg-T;!5y`2@H8>O&}U@uK5bM1g*cGmkT<Xjtn<$1E{)!? zoaWf_A;6Bk0a=t3?9#PPmK!tkjnk}fK|)+}jblb(eep6pBM(23&sEGx&DZT=Vym6i z4agP;2nj!IF~?v@jCcPB$=<<&Z5%Du*(2KbRaCb6*^b#Mr>1r81o0K3?iV`1^#?_J zapoV6YagL>2cjFizz<2%nF(oga2($-ZNQ*Q44?y>R_jd&aoRXvoFmgcr{GQ5@amgr zrenk_U^Yye5Ce6(eKuN+?YZMDj;I=2ao_=AJ;;H5zln%=&C&MLsNXZX}d7n)sBrcB9)%SvjT&&mMXf2 zB_Zk)t$OxGsld9_HlscnRgg+KPCx@jU;Y-#A>9gp8`+iV#ynrVb;SG+v-N*-nbu8A z4}_=aVLCvpn4f=f{#?c03|w+vNxo`PUu)sLT&imhN2T7VLGSEx0K@3MAPMl0bUqmS z8`DM5X?6nfIK2lsHN+H*ZB+oZ!%D3jA`)knzP(x%J5ZMtOU>pfw;rK6Wp(<78R5Mt zeJxnRk8W3VsKhvp7TSY4;M5k1ng8}SN49t+sG|5 z_hF*{+TEBfZ1SD6X z*?2h?>}E3rLsm`2LUDbGg?Rei2^W^|!|F5an|Z&b|A^Uy_9GKz_)YWsqvXh+!s5|| z&2G#W6pPvk@8J!RWN1HK^HxQ*>>Xz8(5FIO%m(EU@N&#^ri(b^a@TMf0!}&S^J%#8 z_k)+Sd#5h&C0*b%{+96(T>m7$gTEjE7FNoV`Gt0xRn7v9(1V%I>(Z?E&j5!i+G>&kod-S;dclRR&1*>Z-#qHHje6Ut~0=@&!7Zo zE!74wLw5dK5iBa#s-xW(`2$*|ZFjf2*fJ8f_ zDb^9i4>sL84^vMvaaAwve&>(EM5xamD~QWg%N{EF~M>Op5K2EI&v z(}eIG5DO32Xluyby{8F5LZU>hR%q!H^pj`>?#j{iKW-BkbUR3jQUd7UYv*!Pe51m4 z=cnE#$<~m+`l3FL4$?2f2N$a>pNGf<@S?~bJZr`5A_UvBY#~oSev?g4MWG#}``HD2 zIylbe=gJ1LScryIbWla;Hr^Ct{%I@MB*o@B8Vp`)^E!mlaP3VkOQB;u*%n%MxHFa2 zf-ekpPHhWKXD#r&@`(}KapQe*o!#8zbR6Mn>ULy!C_NEoLdePL8OL7=3?>Lcz&VpQ z^l@rZmiZ3#SH;{7WAnGX`ju(O~C|7Ss81))VeD z8kanW3Hmj$E93QhSDkeK`6@}e@A>Jt13I9D9~u%`evlUbm7o9O(oT_jBqRUA+y<8Ux(P^mKUEN^hy^lWn-8jJ*v za~5vZ3Su1C*@y`$Dlq}T5vNG54~y7%)3Yc~m5DEnyMZbKzQff3Cfaaj+_yLZrz)io zR_VKsb7*G2Z=sec9!wh!2M>O!S|0cU%OsBLLSZ8M25QV|>TSfOj^|BP>9|M0ppGqC z5|rk0zI2C19X?*DZlH_i_M-&Kd0k|;YR`M4u{nF)M|gFmOBk$?Ofh3FX3&VU#+TFv zGKk7%E_O>>J?`zvGe1D)CmU><<@^5kSdldMWSgi_sqXlgLA@mWMU0V~k}l?F_Kh9h zZ5YFxg!yZ4%d~f8D*AwLgqi|KU=H`cSh|c#ETa=C4s}*tMV89T!hdsX{GljXdD{m( zhfo4_kD(b-h;bD3UO$Z%&)P2thI^s`xH<}`S_eH_J&~nbr1d5>swE%t-GX^fa?T3t zE%|jQ!Et5~(gW7)_H3oNKi~pIWQ;jrX$tE0=!unl-mWRv;I49L85(D{?Q%EfTS1jC|g@$s``ha~LcM!n10?>}|0$pRGfu8khf$@4@c-y8B*FYH2`N}&f z&rD9@e0Bj_7zqO?uY`1SMPsRNl5`y$0@jAXO{MBlF2JE}rFo@Cg?k;qL^Wr{?Z*bC zrPec}V`+!se)YUo_81`c9VP;9J8?uI^SU|sh@hs4tf!Q`g1|9WdZ2^<=&6TmKzeQ% zs@C8z`5I{&n@C%N1JC4}(|#)l+dlIv_q8^L+9D-*|;;gRjvrll>$dSp27f@%fi?l1g-hdT?FFFFwWEW!g`aN27}9 zwGYgDSPq%iZW}u0`QDfYD|73rOO+|$VftPDkD>ZKetf1MPr)mn({--cTiS^uq{j_R z)ubmK=_@Xoo0Xs7g{!Hh=-vfO7kHOYC^1KW3o!Yd623N~Lwc2hcZ1Bcx=XRChj5VP zHujVkhV1b3z|3Wm<{@j^a^Rjxm3;V*JujSAqIs#^o?-a{2z|B)QrCtjq90mu6vCEe z`j1b&a>*xl5)|cI)XR_|@4ud>4AKuGy6DI{D#b>gkt-zg@E|bm`SSu#!-cUt!Cgf@K4&6zVA!^3u!5Nk!X2eu(KdJqTFklSX;14C*80^5+e*I`c zIO}>FnZ-YeJeZfTx#|dcjX%>#nZ^OJ)Gffs2EZww<%+gn00$@TWf>uADkI%dtUS~j zx4MnfB$?(2b&3H7Tk)9^6%;j8jpXdNq^a6L#j`Y@B8zj1ynaqpK|yi42vGxuzR%^HTQW1b!&q@nv zWakL~rCpbQIDV#K$NdFGo`#Pp=L)A1qVo8EUH|yIaP$c~qPyru$dYt~Y!{lF4YA7O z!lfnB*T6&>ABZ`^WQva_X_AkB2^Mqb8jJId^A+rVO|?M z(6?k;f>l+X`Czwg^Ciap<`B%Rm$*QwSXMBmG$-3NsYZ$RAY^jre6p{+ZPMdXvzKxOVtEvj2)Y&u`7D2-U(g~wsvN&o|$kLznlt}n+R_J3TOY~OJF(oUtDJ&4cJ zf9Qxo48gsUi2ALGx8c2fqLNQ?c{)3$lb(x+u8)FnVWrllg}yPa=>xy5qdG~jPoVZB z3G5b=UCgp~S{bJtgNYKKjm&6#7;}nbMyiX4Hy5JmgmB^#{_L#6PXsHPAPY8i9ClW&CaHaz^$22a-fLRX5 z_FIB%Y*g1srw_iXeHrE6U*Z2JGXgRBINsPXOQI(|L>4#)FmibEG@O*8_jx0`s6bpO$y^LRJLsS@ zdpPeXGcu1yKlL@7o)dl@v^E>5FMQJ9ztAqS^uT}Tvwbd1*^m09%{&ux?AKwzS2w$D zd|v?RO&o}T{={dZAUkKS2S_KYTbcRr38kqpF|;?i7)!aSrgZ^C0mp~rgFO8>1)l?T zLGVopuRHd?7)crd>Ix1ZW!}!TOq>r6Vu10T7a^?BMeS;RJ0K>$h2kpa15qp=6j&A@ zs^B7ovDNnc=6i*=`0)m+B^7c9Pl*-oY9M~=HjL6RVeaCo-;Wt;@`ANBTVvf1Bq~(Y zDOo~3c<|5dpvI_FTn60S*IrD>FRT}h$ODa%fqmNp1$2@rhY6OW`50n8Pzw`=oqss$ z6F%)Gto!-|96yzW*kk3DivIvc@FfNi@!h(v2GbUOk68=Z4laZQVqhtKo2R_ZNj-Vrd(7bwLDu7{gyTCOWvEpggI8A0qat49zG4S8X& zTd1sXNVJ9;Gh6gPmv3z#@q7=6ljzh-K6!KRdwrRiX z>>-QPwsEBesEkG%_}@!%H9RVLr9mSZyC-e!MAZQIdDgh|U7m((P+Lq`AY{;UkC~Ip zP4Ajui;0k^1sCzgceI{tB~!slYFVvAnTvzIJcC9AuC>*wEqIag0B}V;k9hg^FwMJ+ z2K)kX`AUNRoBM|gRSc)3>1GD8cpabB{p-KIA;~Uz6OZh0V6$VH5=BuMt+80={X8(; zkSNMeV9K0D28dhsgGqmu0xS(GjufoNwOEGG60bsynv>4a(uQ4@B#(i2C}(enC5Mll zT%|V;V5EX_6cp5;1>32JmCS1{=W#|RZ`E5jb&@`!Cc}2W3pVHsGyThG93a`O$s%uX zhfsvIlS)-tpLiJMSNDYsh0@MCq;V+W?>ZhyYSn>1$|_bz;^R(K*vjs7OIwHWJ= zm}aTALo*VsVDRW($Za_eqLK-t5GXVPE!!7M<>01GpjmizjGfYDADKzI@iR`ut+_a5 zn)4wbg^BI!sc6_v2|>7AHs*771#S1m#_ZuMRr(NpEtNij4!n;Ps|hC|$ykmYwUFEW zE{pomK5JWGvu1N1r!;{a<^ly&;HkwohJ z;?d&TSCk?vUf|*E+pO(+#){~AdyvF#3Jk$@sS(HRqI9+M$9cdG<{dkh6*-iTQV%pI zshKqc&=5cJx-5YT7}ZCb3rd2~>f;ERI6)4LU{$izyu;5Nn;be#tr7TGMj8V_!tHAP z%Zw$cy-eRGhfsVzJu=IAjA#9^T+l5fHh8);m_!LJ=rVWCB zC}F%@!p7d4 zwp9cS*4qZtVy~t3kg4thF;c`*@O-IZ+)PK$12Xd<9KD!=yJ0dJX4b)G8KWX*<+{! zm`i*Pl8GM{T!L-jHJig$Q-zkI5G1D5DeU$yw_-}l?T7y*r9X`4;eSJ4ntW39DF&~lto{Y7HGrd>ihX#e(wc&Xg*J;^GFzdfdBvjssWzKYDND64z_$<$Y%vE z-iegksaAQw4-5(VlsVI{U=rr z(-{qXq5ZoZ5Ot;z2~nNu>YdqBOQzCRZ1dWlTfM_#WF{5qg6p{22sAdx%T^inJn%k< zAhQ*wtsmwHOB93q!WCiPfS!n*lvVDrA(_Jt)*%lv+MnKhqWL+lk4`N7l%T!*XIDIN z<$IVh9?f&{do`nNq$AiQl-hFlol8VViQ&31yU(9#Ot_@0R5_w6QbXe)5t`X$w@9>N zOvB}gY0-Z*6nd-cpbw5-cwHNRZOp>J{mh;vtq5^Jb5cv}-z0s}cCFm`PmpAE0+XYXE=%02A&( zn#@Vz4<=IuJS+c$V<1fP^!dyMy-6P>TyFYn#Dk|*4gnJmuT-))RWip#*r?)Z@mHeTP0bfjmMT~%U_{bKugC%2 zlR`X(Y(&)s$2}B@WNDL!H5r4!zxQ@1I~duz0W&yqHP>0@Uzw1i!hN~+-5LE@m^j{0 zgbGV99Z)YK^+eS3gM%2*u2;gai-HFU~mjwC-lyPPmri+dNAZ;_t|xpv*GW!n6be z=;Yhtw))d>Wp`UngL4}4l4wI#9nK3ZuFv+1jWyB1TfY;+2Q4b82wO}qUGX>Z+npG} zh0Py`IV9L-0mUc<6B6O&)tcYha0S)!7;@6axHSZd?8C}lfk&)|>kjGPqNDL>?&A^x zaFSQkXyG>P8?Z?7F<+rkQoLfZDsK-WjzPdw`CY>hFIey7E5-*pvVn+R#gl20r(GRVp>2&ws-5F>Eh1dmv?Z^etee4`!3Y=0tPin zEnm^b7vk~6IkL6SEo@?_*$SSqY)p?DCOh29k1t{2HNpvQSv`)p6Pu8OY`DK2jW>t- zL#B%-{gKW{P*CP9y&7OJry{f33CUZ_Ou%w7j(A)Kz;Y6WE!JkE3<+E2^I~zCCcH%3 zRqb6Pqrb1gKIm&`b<_=)y1333e=B$m!4mXx|NX;n@p}v7N$+Y!x-55+A`Sz}|>`=Lbn{hdu#bXA<6M^*kcrOVU z&6c0~#M#ag=QtI-u5xt8)B^Q118$#zSNwfV8wBu{XJucPv?yL~Jd0m30oKR#((5@U zKBIqto1wBj3_;_-h2w>}E^TS%hAcGk%Wwz(Qd|@{RW*mFGz!mQCG4mSRFH!0>6;v` z%S(Cw*XuP&QGPt@9tqzCyVswIK&GKof@4112nrRjrNF3b1OnY|;Ym$J_kP)o+d8+O zrG@nwVcJLnvTvFw&^t?w?zJu&k?pM&jPmI(q9VVyb8*ikvG{V;PKpk`D^RpHe8M=Xerb7W9E9XkIZf#L5e^Ud z^lzOL_!bs;N#M2Ad9)tRR>LJai{8t+QlYH2A9r~RXRaE_oqfv~Ey6)%10k7|x(etW zr;_JgQ)|2iRGDmMV@QCO8!(n1?5#@^Q{~#J^WwVjydS%~y}5O7$LCf@od2kn6Oabd z82oD$K^%YhBcoUoE7cZb_*dWcDVi8jB3So)Txp(24{9l{d1v2r^&eK~oeY zZIp9M5N;<3z>?sFIVJYCf8Z>}?<|-OOGc1fvQo4DNIAI_KPe-Z1cW(jjSotE0z8VVjafA zilW&AWfbrLY|@z$1>`!kVi?{G#X`yEVe`}U?t&bTETC+^kriX6!`^rEh(J)HAoTu4 z?7iAi!6CxeP@Wn_#BLTM!g-phN}ORI+j%_|yxUH6k0v8Bky!8$Nu@7PpJ4#=VNbSB z&2<6^9ZbcsIhOpKX;8yeT$BB0c!W@WfYbH~SaeI;5}*0SPjUm^n7ZOufqVM|KTJ3I z^_ii!=&3GfY|VcNFSf!AV8-GVYvyYxz|sdz$ zHj`(GQtD}V;XrbuA?>c`r<07kGk4K$rX!O6F|h(cbLEZgXc>0hzgisS5a)506|O`m zhsq7RoUf}_KnP>!>o#h4sq|de7mYX9Yea0;aoiy6i5_g~viIQ%i9{p!Y^NYH%8{!L zygr)Jb%ECbIiaI{Meqp@UJHmNc-b31uBW*vzQ1BdConu!$p%2%XdyIYo}W_nN5(pM z3|y^gK-f*Ed!6w|omnB=6bOltY+B!#!6l@tO&*gZj@GY!bKx7G3AK=mfxv&fsT#6@ znJYNbp2Q~60+n=g7z*KEhf!b2lLLTxnvcrqhhmw4WOGv0OHEY`!VTYHp=^6zVw`Y> z?Co_t8|^7jjSJib`Ce^;$y{8P?aw$DqJ=w>Jc=o+vJd6zjh^snlLEbmi7LC$H$4t% zMS#TWMSLE(4@Ju$pyttMrCy4VbHY&~mL3F{Z5VW>3w9BmQE$+#7uZ;2S;286J{pzKEWq33z}Iwx{svWU!3k<;_kE5YzQQ30z!gN6?;+(BNf`x;ER#@J-2fq~D81-y@}pP)L?= zW)%p5*D&A}_E*#6506q{!y)0i+`&^ERe@nnH3|r10+hxt(wYrhZm+7nLN$COmp34- z;mH+*g73DmM9na7Vz*o@Z4;#+kdwhY&U}S`}F3jW{6cb_gd=^%x!ro3QDEO0^k}=k_Uwwh9(b$ytk1j23o09~fwbTPpZ> zkNVQX zVe)haj*_OLy?Xx)J5GPJ86wX9cr@t7-`-5u7M`8vPGh7 zJQmb8@*fhd9I=Z`m#HyKjP*%2p><9@pWTiN3HALmuyNp^u@#O0%3w}HidKy{B}IZ( zdk_bP(9~*26WKYP(nfN-8EuOIG}j!ivf4xu1yfpUU@U4@M;v?H4LSc-SDuB9FgG)Z zbo-Jy4eIw^(wnE+t_XjXy9{fueYQMeJqV5wLtk4bfWc(FdMC(yK1rq|;OX0g{wcK3 zDKN34!EV-_uvk+$UqgK=qPaD^Q&MieFJ-y2`mkC&MVy6Zj@fQ?kr30xC*4dRndeAU z%mCZ6dwF9oL~~t*P6x1hdzFX#61Fdafn8Tq&8o&-(z9#Yj+iPgigaAVgj*sne&sLx zVh15Ue9&@J2&}@-GdfiAEd}YJ@`XN$)pa*;ko~|D=ozr_>OdSAkh6!uqdiQY0zj&X z*4H3?j!eN=(T?HneWbGD7@OL%G3`0q~FdKDY zB>q^k@djBuT!~X*&k%In;m<{Zy0?`iE$6Qvh1o7JE;sye(d*I9I))IE2p0bcox3Q+5T z#Rkz>N2b;xQFD#Pmw1=k7+b;q-1MjQ*!cZl#02B~{y_lm^E!B4CB8sAbtE;+6y_eQ zC-M`goIf{yHLF$wg+qH6TlJx@b01{l_A5e1ZRV`$UOz?WW641#BXhl`a)^h^R{oF! zw)x8`{HJAHt-}u4#gn}wQuue>`23ymrp+A(NWW9#z4KaaB*cnyK=%t&38!NqT)^k; zjElYeaXMD&vF|$-(+h%G-kCC{Ub7dmDy2t7M90b&q=d9%E!fQ*^#VE9Zk3~-sXd+B zUq!{=@XEh$9OhgtA;VYFh9l;4@=6f8tgRsK`Jjtmdb4n}WXg=LG2_29$=*D(57=J@ zHs64jn4=N=JK;0122;lvJ(9~!QdBBPPm8+VKnHm!|KcuzP5I{@Qi-?}#+t$jP*mc@ zyzSu$6L;{RhLTuLAv^6-Scl#9Ve9D%BGYqoeB})f^zecGv+Mr8Uf&A7MP>{kgcCJ9 zw<|&@EJkJ+yWQjd7pM&*BP0p{M_FCl19M*|qIJpoLPew}r!C_Elv*ppTfPKnB+2`v zPq^N$+P?I<=%~c|yA`}I9aJ$w{rPD@0zIExfRPm08I4iy5nVN_Y2^w$o?kU?IcdS? z#5P9c2BVVv%0`l!qR;e*5-~+(P#BXv(^+_H_URu{^mzF(#pzDl=hIg2JejPsX&55L zA^q@J<%!`CO)gpcyIhKvY6;G-jQAKfuO^GX{)QooGBLcNRy&=KODFf(du54AzYYB> z+20~g)y~P!;Wv_fVVvOui|@}Z;fjmYNG^sVr(#O3ipCGfjL)4OoMYJXE#tQkV`P+k z0O31#omVxPoIW53hui4Ei!e@l=xZ_IIFnvO2snc{+>dWFAKvK{-(wLn>p;Z}myxn8 zUc;(Y=$(iS&vSTi?TNS-nVn8Y=F$hOHoMqSzLrX5A>nK_hGK0ef-WUaZERDezHMuF zIv8%X!iTzX5Bl`~n6PvL#-K*y2)M?Htw_D@*{HSY+IB`NGR(eEU5Iq*Ggzpf@_2F^ z2Fqw;bH|$KO+?o5mf`lC`ei-WpRSc)sOdK}S%vLBZ*3)Gbzn80)`MTkA7+8Iv}Oj? z&K0D}zAwX`4$pS)gQ(JK$HI;1RAS#e5m&AtqdJf5HWK62SQS$>f34$We%6DNM)r-l zkFbze-?fkgjkxua+J_~IoHsdohfJ+?mQ4u~h>R$l)ufI?cKAxy=Rr2#w&kMp8h=?Q z8V7g4LBu#9o$dJ%<^R2os`&uy8|!F=V0+)x@tJfZqGYMH&*Y5Kpy&O6-oT*5aI+q0 z5<0lqim-G)V}l?QiHq)rT`-aaTGxmxspsliv0^eYPh`MF^HL(Yu^3iUON6nR92DS&OBLe{30|f-m(@=FKUJAMLFEbD$G{> zOx0M(d0=z)c_8`okZAmTrQ_5y!_zqWnk4(=O9|r5He7`6H?cvWTWqBISool!0DRcU zE6@bgENL(hFTZCYGMGo5goaW3*loH z2ef8p_v35tz1@uG9+U{Buu(2AbM#)IuK0}lOJRo|CF`#jXLJ>aoOx_b?`D&fjNeNE zeb}?k<#_LedB!#>q6e)vU3tVWeU45fGm@dJsMBpJc`!5Zm||KdYVIk@m;Nte9BM80 zx_~|u2xH~)xz9`%KBuz%v8mns%RH7<2}1oDepAosr;@mk6`??UU((w@60p^UI+Y~| z+wt4&OUcDC5A?%JupIJ7X-V9a0OP>5eHa2|XVQ$radE-d%CYlwGv$OPa&Kw6pWrvQ z`g?UDEn3qW%aMHu$wFC`0^&_Q6)8!A(u8aRr6!-{N%ZB7=2+OO=bqUwG8X=TE7%@n>G4;Sm3HZBQ?z7bTH)UW)g*? zUtc6Gsg5xEp6aif;}_d?P47)bjLGd7aL2naZ=E6aXoDS)qhd-<_S8|H|6uUEgr2BP;1eo zIuG5j8iYKN#jiBsgK?N%1f+)GPQen?=!(}trc7Q z$#HhiXK^@~L&}TDaxv8OW5wo+v!anX6K21zeTh|RuK~FtK~#si*~OWl(Vtv5DO$9f zA^b3dOOXo*d_zFHfpD^OougKi(24$^BIsj8FK`qS7Nw~ znGZNX-M`4{2uj1MRy0al1ebHKh()r%Oda`)xh)+ zbWYn&17hFe_t!^=$iVcRb^;2^^pbN-Gi@xgqXy~XwB(m&Pdu~xqJm7Gjw1zcL`8-(m37m`|J(JOPG*PoW+sWNNxBs z2Vdz3-^6)3Ucs9UEW>?PS&5bww~NNov$;6)`Zm(J1gGB{4g;gtBo8X8-^b)Ipl=N#PGBQw2OL z|MWAH^BkR-$stKEXEESy91!TjCCc=Prgn}RNAMJ#+VzRK1ag@}Ah3*PxW7YKh?4V& zVVUz}Wu~E**XMwVGKv?a6W%|j+2sKRYj(639zj?h5c2tUZ~Qc^^nL5Z`2ZZdJCX@O z(ynYI=;*m}ef@xjrQSpENRhpvLpK(4jexwwe(u~ksH8M2c@_6%Gbg(EO~bBIah~L2yw!NS=B>hN6K8lMyHDzc z+kJbPCzu*L-yJQd9}@B(97T9>L!7BqsfLy!8SQ)<4M5```P=cMr61D#;*^~1kYf%B zm^c^tXwE99$-F>DqF_Sd6+g7YvEo;q~HxTzq;eXhcI`a$2*tYc>SJ?~N8Kxp!F%KUI(oVzW*Sj7F6H$0@9M}D>~n)BGsz~(jUyz{ zON%;MRu}8V2fvY|VLjMGN1C2c3*iY?FiIaoTJ!tNUt-Oe0!D6y&Rr7pa&bCN$N?)M zcs1M^0w{%Aww~)x3Tv2Rn>$5r!@gy0RZOGzoe%15 zb9m|2S*6@tN!67CL8S?{IHTMdYZ7-H&@Ci;CFt6A2H8_r#1BN}Zrv*ir&b^&-#zNT zct}Jv(9~6YR!jm}S~?-hyc)|yqKdu#LzZ7!GAKru3!+wX9f~(QdFE&JbmDLZMN4=r zIhdl(jllNh9)s$g;ErI>*{Q`ay;i4j?861ao!|<1`$d(KozKrc8k64XB=~BsyWD8k zrWyr7RYD~bjKl+a-uD@(J+fMDy3aWPl5d%oU6|D#S(X4L0xkW7cPX)hfmW{s6Q zAp(IsEju`+0bNNdsaBnUbK{KqX{Mw*+;h2zetF?T?ee8s$>@9`b>iCTR`;V00t@om zPXadKd>^g;|E8dBM(Z{^LY)ydiC6cU)gxK}3ROm-T-J|}0h3qDwn}yNr*iW+@5aF9 z7}BHnCgu+`%tB}d+|9(O3K8%WyN!9!Ka)o`B`h^nr2?>*%`$oq85lhzi{(R8sDGhy z>^jD27vjvxby`joY7|ax zaJdpLV&M=vY+7-7loREvsV>?~#rz`18H=f4oFDYCkH@#R;cx2nN7JHPm0H8!+8IYv zp`_H)s`@;wH6#QsA|0@=Se_Z3Hr!`SdOls)HJkMk_h>>F^tahbkm9$D?6i}{XWB{- zM1i7DlUlWF{^DES?H|-~DbIx`U-V@*PZ!IIM*DFjlI0pF8xt4oyKu=fN_Iqx+da}E zq1#6S?c^L3)MSb~1_7hC{4rfjCZgZZwd^?S1({ zy$@jG`vb`6(9)E$xf6yhk)4q8y2_-r7DV!R9HK62Y5u#fjd1!0YozR&s-nbZ9noP@ zf$jhnIZGvRJMj66X6Z=kLhf)7+vqVkV7oYOG(sV}O%Uh`>6^ufKI4GgmDLpB5j6jt$21y1F(U^v{Ia`wR zm9_TEHOHmD)uYz^%i{7i2MCzFO3F_?XKi&3gifGJD!d1jaHTFOO81xtVc}7Ha(G+e zDBq1`AxTj(Q5Ctfoq*c^2chH=yPaaIwQ>k%MxdDI~?B77i zuo)~(+Rc0NDrkm2pSbeXi|JCuAwZf1t2z@WXYLZ2-M$nfGFaDumG40BE~8bNyG*h) zd<9iH{}Y2Jy_Z?nZ0uwuwZ_fHDTCgIM>a6bjhXPe3yzwYH0>2cEN%z#Ou0kPz-pF` z7pXoPM+Da%w73<@Ti{-@wdAa2smE69dy+_uX)KOack(>R(@?6{?At-E4!&@SBeG91 za8Bre{IgG`xS&+X0|G(iVm5Q*Ikk2*l>ewPlGc6u8UBjwviEVX1)hzOGvYkC;8H!& z$Nv-<1pBc+yzmv7)A{2C#7+QZ(rZse~?zKMz*$714ehQv%XmSWr*98XwLD)d8T& zrw0h?h+A>{%M(_xTVAM8&l;ivB*cQl*u9Jyg5%DQ_VFoMKipd<@oB~3IAUPA13+Zt zMMzuu@d8_E(4>2!GasC9cKro245M&o=h4hja%vCm0iHrXI%CnihS?e>kOq6hsXLqF zZ8&k8h!buiRBN(XxOStBBYuMNrKcBp2k4`P&Z4?2oD} zmLXrmeNA=|tNc0{pg#hQKA6Y)Mh{jFa+~u{T0f(t5|okWr0Y6e0yGoWeFZ8~>&Iuv z|0`U+&4OΞ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�qk?=a6p+=WRu86-pn{I^6=>!Ah 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 literal 0 HcmV?d00001 diff --git a/Sources/public/assets/img/portrait_black.png b/Sources/public/assets/img/portrait_black.png new file mode 100644 index 0000000000000000000000000000000000000000..31ad82a206a2a341cdbe1e51ad707b84fe40cad9 GIT binary patch literal 100367 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 z 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�eiN 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 literal 0 HcmV?d00001 diff --git a/Sources/public/css/styles2.css b/Sources/public/css/styles2.css new file mode 100644 index 00000000..91ca5131 --- /dev/null +++ b/Sources/public/css/styles2.css @@ -0,0 +1,11162 @@ +@charset "UTF-8"; +/*! +* Start Bootstrap - New Age v6.0.7 (https://startbootstrap.com/theme/new-age) +* Copyright 2013-2023 Start Bootstrap +* Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-new-age/blob/master/LICENSE) +*/ +/*! + * Bootstrap v5.2.3 (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors + * Copyright 2011-2022 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root { + --bs-blue: #2937f0; + --bs-indigo: #6610f2; + --bs-purple: #9f1ae2; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-black: #000; + --bs-white: #fff; + --bs-gray: #6c757d; + --bs-gray-dark: #343a40; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #6c757d; + --bs-gray-700: #495057; + --bs-gray-800: #343a40; + --bs-gray-900: #212529; + --bs-primary: #2937f0; + --bs-secondary: #9f1ae2; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + --bs-light: #f8f9fa; + --bs-dark: #212529; + --bs-primary-rgb: 41, 55, 240; + --bs-secondary-rgb: 159, 26, 226; + --bs-success-rgb: 25, 135, 84; + --bs-info-rgb: 13, 202, 240; + --bs-warning-rgb: 255, 193, 7; + --bs-danger-rgb: 220, 53, 69; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 33, 37, 41; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-body-color-rgb: 33, 37, 41; + --bs-body-bg-rgb: 255, 255, 255; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --bs-body-font-family: Mulish, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; + --bs-body-font-size: 1rem; + --bs-body-font-weight: 500; + --bs-body-line-height: 1.5; + --bs-body-color: #212529; + --bs-body-bg: #fff; + --bs-border-width: 1px; + --bs-border-style: solid; + --bs-border-color: #dee2e6; + --bs-border-color-translucent: rgba(0, 0, 0, 0.175); + --bs-border-radius: 0.375rem; + --bs-border-radius-sm: 0.25rem; + --bs-border-radius-lg: 0.5rem; + --bs-border-radius-xl: 1rem; + --bs-border-radius-2xl: 2rem; + --bs-border-radius-pill: 50rem; + --bs-link-color: #2937f0; + --bs-link-hover-color: #212cc0; + --bs-code-color: #d63384; + --bs-highlight-bg: #fff3cd; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth; + } +} + +body { + margin: 0; + font-family: var(--bs-body-font-family); + font-size: var(--bs-body-font-size); + font-weight: var(--bs-body-font-weight); + line-height: var(--bs-body-line-height); + color: var(--bs-body-color); + text-align: var(--bs-body-text-align); + background-color: var(--bs-body-bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +hr { + margin: 1rem 0; + color: inherit; + border: 0; + border-top: 1px solid; + opacity: 0.25; +} + +h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { + margin-top: 0; + margin-bottom: 0.5rem; + font-family: "Newsreader", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-weight: 600; + line-height: 1.2; +} + +h1, .h1 { + font-size: calc(1.375rem + 1.5vw); +} +@media (min-width: 1200px) { + h1, .h1 { + font-size: 2.5rem; + } +} + +h2, .h2 { + font-size: calc(1.325rem + 0.9vw); +} +@media (min-width: 1200px) { + h2, .h2 { + font-size: 2rem; + } +} + +h3, .h3 { + font-size: calc(1.3rem + 0.6vw); +} +@media (min-width: 1200px) { + h3, .h3 { + font-size: 1.75rem; + } +} + +h4, .h4 { + font-size: calc(1.275rem + 0.3vw); +} +@media (min-width: 1200px) { + h4, .h4 { + font-size: 1.5rem; + } +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul { + padding-left: 2rem; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small, .small { + font-size: 0.875em; +} + +mark, .mark { + padding: 0.1875em; + background-color: var(--bs-highlight-bg); +} + +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +a { + color: var(--bs-link-color); + text-decoration: underline; +} +a:hover { + color: var(--bs-link-hover-color); +} + +a:not([href]):not([class]), a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} + +pre, +code, +kbd, +samp { + font-family: var(--bs-font-monospace); + font-size: 1em; +} + +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +code { + font-size: 0.875em; + color: var(--bs-code-color); + word-wrap: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.1875rem 0.375rem; + font-size: 0.875em; + color: var(--bs-body-bg); + background-color: var(--bs-body-color); + border-radius: 0.25rem; +} +kbd kbd { + padding: 0; + font-size: 1em; +} + +figure { + margin: 0 0 1rem; +} + +img, +svg { + vertical-align: middle; +} + +table { + caption-side: bottom; + border-collapse: collapse; +} + +caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: #6c757d; + text-align: left; +} + +th { + text-align: inherit; + text-align: -webkit-match-parent; +} + +thead, +tbody, +tfoot, +tr, +td, +th { + border-color: inherit; + border-style: solid; + border-width: 0; +} + +label { + display: inline-block; +} + +button { + border-radius: 0; +} + +button:focus:not(:focus-visible) { + outline: 0; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +select { + text-transform: none; +} + +[role=button] { + cursor: pointer; +} + +select { + word-wrap: normal; +} +select:disabled { + opacity: 1; +} + +[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator { + display: none !important; +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} +button:not(:disabled), +[type=button]:not(:disabled), +[type=reset]:not(:disabled), +[type=submit]:not(:disabled) { + cursor: pointer; +} + +::-moz-focus-inner { + padding: 0; + border-style: none; +} + +textarea { + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + float: left; + width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: calc(1.275rem + 0.3vw); + line-height: inherit; +} +@media (min-width: 1200px) { + legend { + font-size: 1.5rem; + } +} +legend + * { + clear: left; +} + +::-webkit-datetime-edit-fields-wrapper, +::-webkit-datetime-edit-text, +::-webkit-datetime-edit-minute, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-year-field { + padding: 0; +} + +::-webkit-inner-spin-button { + height: auto; +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: textfield; +} + +/* rtl:raw: +[type="tel"], +[type="url"], +[type="email"], +[type="number"] { + direction: ltr; +} +*/ +::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-color-swatch-wrapper { + padding: 0; +} + +::file-selector-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +iframe { + border: 0; +} + +summary { + display: list-item; + cursor: pointer; +} + +progress { + vertical-align: baseline; +} + +[hidden] { + display: none !important; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: calc(1.625rem + 4.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-1 { + font-size: 5rem; + } +} + +.display-2 { + font-size: calc(1.575rem + 3.9vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-2 { + font-size: 4.5rem; + } +} + +.display-3 { + font-size: calc(1.525rem + 3.3vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-3 { + font-size: 4rem; + } +} + +.display-4 { + font-size: calc(1.475rem + 2.7vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-4 { + font-size: 3.5rem; + } +} + +.display-5 { + font-size: calc(1.425rem + 2.1vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-5 { + font-size: 3rem; + } +} + +.display-6 { + font-size: calc(1.375rem + 1.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-6 { + font-size: 2.5rem; + } +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 0.875em; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} +.blockquote > :last-child { + margin-bottom: 0; +} + +.blockquote-footer { + margin-top: -1rem; + margin-bottom: 1rem; + font-size: 0.875em; + color: #6c757d; +} +.blockquote-footer::before { + content: "— "; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid var(--bs-border-color); + border-radius: 0.375rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 0.875em; + color: #6c757d; +} + +.container, +.container-fluid, +.container-xxl, +.container-xl, +.container-lg, +.container-md, +.container-sm { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container-sm, .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container-md, .container-sm, .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container-lg, .container-md, .container-sm, .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1140px; + } +} +@media (min-width: 1400px) { + .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1320px; + } +} +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(-1 * var(--bs-gutter-y)); + margin-right: calc(-0.5 * var(--bs-gutter-x)); + margin-left: calc(-0.5 * var(--bs-gutter-x)); +} +.row > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-top: var(--bs-gutter-y); +} + +.col { + flex: 1 0 0%; +} + +.row-cols-auto > * { + flex: 0 0 auto; + width: auto; +} + +.row-cols-1 > * { + flex: 0 0 auto; + width: 100%; +} + +.row-cols-2 > * { + flex: 0 0 auto; + width: 50%; +} + +.row-cols-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; +} + +.row-cols-4 > * { + flex: 0 0 auto; + width: 25%; +} + +.row-cols-5 > * { + flex: 0 0 auto; + width: 20%; +} + +.row-cols-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; +} + +.col-1 { + flex: 0 0 auto; + width: 8.33333333%; +} + +.col-2 { + flex: 0 0 auto; + width: 16.66666667%; +} + +.col-3 { + flex: 0 0 auto; + width: 25%; +} + +.col-4 { + flex: 0 0 auto; + width: 33.33333333%; +} + +.col-5 { + flex: 0 0 auto; + width: 41.66666667%; +} + +.col-6 { + flex: 0 0 auto; + width: 50%; +} + +.col-7 { + flex: 0 0 auto; + width: 58.33333333%; +} + +.col-8 { + flex: 0 0 auto; + width: 66.66666667%; +} + +.col-9 { + flex: 0 0 auto; + width: 75%; +} + +.col-10 { + flex: 0 0 auto; + width: 83.33333333%; +} + +.col-11 { + flex: 0 0 auto; + width: 91.66666667%; +} + +.col-12 { + flex: 0 0 auto; + width: 100%; +} + +.offset-1 { + margin-left: 8.33333333%; +} + +.offset-2 { + margin-left: 16.66666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.33333333%; +} + +.offset-5 { + margin-left: 41.66666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.33333333%; +} + +.offset-8 { + margin-left: 66.66666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.33333333%; +} + +.offset-11 { + margin-left: 91.66666667%; +} + +.g-0, +.gx-0 { + --bs-gutter-x: 0; +} + +.g-0, +.gy-0 { + --bs-gutter-y: 0; +} + +.g-1, +.gx-1 { + --bs-gutter-x: 0.25rem; +} + +.g-1, +.gy-1 { + --bs-gutter-y: 0.25rem; +} + +.g-2, +.gx-2 { + --bs-gutter-x: 0.5rem; +} + +.g-2, +.gy-2 { + --bs-gutter-y: 0.5rem; +} + +.g-3, +.gx-3 { + --bs-gutter-x: 1rem; +} + +.g-3, +.gy-3 { + --bs-gutter-y: 1rem; +} + +.g-4, +.gx-4 { + --bs-gutter-x: 1.5rem; +} + +.g-4, +.gy-4 { + --bs-gutter-y: 1.5rem; +} + +.g-5, +.gx-5 { + --bs-gutter-x: 3rem; +} + +.g-5, +.gy-5 { + --bs-gutter-y: 3rem; +} + +@media (min-width: 576px) { + .col-sm { + flex: 1 0 0%; + } + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-sm-auto { + flex: 0 0 auto; + width: auto; + } + .col-sm-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-sm-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-sm-3 { + flex: 0 0 auto; + width: 25%; + } + .col-sm-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-sm-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-sm-6 { + flex: 0 0 auto; + width: 50%; + } + .col-sm-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-sm-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-sm-9 { + flex: 0 0 auto; + width: 75%; + } + .col-sm-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-sm-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-sm-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.33333333%; + } + .offset-sm-2 { + margin-left: 16.66666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.33333333%; + } + .offset-sm-5 { + margin-left: 41.66666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.33333333%; + } + .offset-sm-8 { + margin-left: 66.66666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.33333333%; + } + .offset-sm-11 { + margin-left: 91.66666667%; + } + .g-sm-0, + .gx-sm-0 { + --bs-gutter-x: 0; + } + .g-sm-0, + .gy-sm-0 { + --bs-gutter-y: 0; + } + .g-sm-1, + .gx-sm-1 { + --bs-gutter-x: 0.25rem; + } + .g-sm-1, + .gy-sm-1 { + --bs-gutter-y: 0.25rem; + } + .g-sm-2, + .gx-sm-2 { + --bs-gutter-x: 0.5rem; + } + .g-sm-2, + .gy-sm-2 { + --bs-gutter-y: 0.5rem; + } + .g-sm-3, + .gx-sm-3 { + --bs-gutter-x: 1rem; + } + .g-sm-3, + .gy-sm-3 { + --bs-gutter-y: 1rem; + } + .g-sm-4, + .gx-sm-4 { + --bs-gutter-x: 1.5rem; + } + .g-sm-4, + .gy-sm-4 { + --bs-gutter-y: 1.5rem; + } + .g-sm-5, + .gx-sm-5 { + --bs-gutter-x: 3rem; + } + .g-sm-5, + .gy-sm-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 768px) { + .col-md { + flex: 1 0 0%; + } + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-md-auto { + flex: 0 0 auto; + width: auto; + } + .col-md-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-md-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-md-3 { + flex: 0 0 auto; + width: 25%; + } + .col-md-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-md-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-md-6 { + flex: 0 0 auto; + width: 50%; + } + .col-md-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-md-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-md-9 { + flex: 0 0 auto; + width: 75%; + } + .col-md-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-md-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-md-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.33333333%; + } + .offset-md-2 { + margin-left: 16.66666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.33333333%; + } + .offset-md-5 { + margin-left: 41.66666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.33333333%; + } + .offset-md-8 { + margin-left: 66.66666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.33333333%; + } + .offset-md-11 { + margin-left: 91.66666667%; + } + .g-md-0, + .gx-md-0 { + --bs-gutter-x: 0; + } + .g-md-0, + .gy-md-0 { + --bs-gutter-y: 0; + } + .g-md-1, + .gx-md-1 { + --bs-gutter-x: 0.25rem; + } + .g-md-1, + .gy-md-1 { + --bs-gutter-y: 0.25rem; + } + .g-md-2, + .gx-md-2 { + --bs-gutter-x: 0.5rem; + } + .g-md-2, + .gy-md-2 { + --bs-gutter-y: 0.5rem; + } + .g-md-3, + .gx-md-3 { + --bs-gutter-x: 1rem; + } + .g-md-3, + .gy-md-3 { + --bs-gutter-y: 1rem; + } + .g-md-4, + .gx-md-4 { + --bs-gutter-x: 1.5rem; + } + .g-md-4, + .gy-md-4 { + --bs-gutter-y: 1.5rem; + } + .g-md-5, + .gx-md-5 { + --bs-gutter-x: 3rem; + } + .g-md-5, + .gy-md-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 992px) { + .col-lg { + flex: 1 0 0%; + } + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-lg-auto { + flex: 0 0 auto; + width: auto; + } + .col-lg-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-lg-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-lg-3 { + flex: 0 0 auto; + width: 25%; + } + .col-lg-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-lg-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-lg-6 { + flex: 0 0 auto; + width: 50%; + } + .col-lg-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-lg-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-lg-9 { + flex: 0 0 auto; + width: 75%; + } + .col-lg-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-lg-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-lg-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.33333333%; + } + .offset-lg-2 { + margin-left: 16.66666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.33333333%; + } + .offset-lg-5 { + margin-left: 41.66666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.33333333%; + } + .offset-lg-8 { + margin-left: 66.66666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.33333333%; + } + .offset-lg-11 { + margin-left: 91.66666667%; + } + .g-lg-0, + .gx-lg-0 { + --bs-gutter-x: 0; + } + .g-lg-0, + .gy-lg-0 { + --bs-gutter-y: 0; + } + .g-lg-1, + .gx-lg-1 { + --bs-gutter-x: 0.25rem; + } + .g-lg-1, + .gy-lg-1 { + --bs-gutter-y: 0.25rem; + } + .g-lg-2, + .gx-lg-2 { + --bs-gutter-x: 0.5rem; + } + .g-lg-2, + .gy-lg-2 { + --bs-gutter-y: 0.5rem; + } + .g-lg-3, + .gx-lg-3 { + --bs-gutter-x: 1rem; + } + .g-lg-3, + .gy-lg-3 { + --bs-gutter-y: 1rem; + } + .g-lg-4, + .gx-lg-4 { + --bs-gutter-x: 1.5rem; + } + .g-lg-4, + .gy-lg-4 { + --bs-gutter-y: 1.5rem; + } + .g-lg-5, + .gx-lg-5 { + --bs-gutter-x: 3rem; + } + .g-lg-5, + .gy-lg-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1200px) { + .col-xl { + flex: 1 0 0%; + } + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-xl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.33333333%; + } + .offset-xl-2 { + margin-left: 16.66666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.33333333%; + } + .offset-xl-5 { + margin-left: 41.66666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.33333333%; + } + .offset-xl-8 { + margin-left: 66.66666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.33333333%; + } + .offset-xl-11 { + margin-left: 91.66666667%; + } + .g-xl-0, + .gx-xl-0 { + --bs-gutter-x: 0; + } + .g-xl-0, + .gy-xl-0 { + --bs-gutter-y: 0; + } + .g-xl-1, + .gx-xl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xl-1, + .gy-xl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xl-2, + .gx-xl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xl-2, + .gy-xl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xl-3, + .gx-xl-3 { + --bs-gutter-x: 1rem; + } + .g-xl-3, + .gy-xl-3 { + --bs-gutter-y: 1rem; + } + .g-xl-4, + .gx-xl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xl-4, + .gy-xl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xl-5, + .gx-xl-5 { + --bs-gutter-x: 3rem; + } + .g-xl-5, + .gy-xl-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1400px) { + .col-xxl { + flex: 1 0 0%; + } + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xxl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xxl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xxl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xxl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xxl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xxl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xxl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xxl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xxl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xxl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xxl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xxl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xxl-0 { + margin-left: 0; + } + .offset-xxl-1 { + margin-left: 8.33333333%; + } + .offset-xxl-2 { + margin-left: 16.66666667%; + } + .offset-xxl-3 { + margin-left: 25%; + } + .offset-xxl-4 { + margin-left: 33.33333333%; + } + .offset-xxl-5 { + margin-left: 41.66666667%; + } + .offset-xxl-6 { + margin-left: 50%; + } + .offset-xxl-7 { + margin-left: 58.33333333%; + } + .offset-xxl-8 { + margin-left: 66.66666667%; + } + .offset-xxl-9 { + margin-left: 75%; + } + .offset-xxl-10 { + margin-left: 83.33333333%; + } + .offset-xxl-11 { + margin-left: 91.66666667%; + } + .g-xxl-0, + .gx-xxl-0 { + --bs-gutter-x: 0; + } + .g-xxl-0, + .gy-xxl-0 { + --bs-gutter-y: 0; + } + .g-xxl-1, + .gx-xxl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xxl-1, + .gy-xxl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xxl-2, + .gx-xxl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xxl-2, + .gy-xxl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xxl-3, + .gx-xxl-3 { + --bs-gutter-x: 1rem; + } + .g-xxl-3, + .gy-xxl-3 { + --bs-gutter-y: 1rem; + } + .g-xxl-4, + .gx-xxl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xxl-4, + .gy-xxl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xxl-5, + .gx-xxl-5 { + --bs-gutter-x: 3rem; + } + .g-xxl-5, + .gy-xxl-5 { + --bs-gutter-y: 3rem; + } +} +.table { + --bs-table-color: var(--bs-body-color); + --bs-table-bg: transparent; + --bs-table-border-color: var(--bs-border-color); + --bs-table-accent-bg: transparent; + --bs-table-striped-color: var(--bs-body-color); + --bs-table-striped-bg: rgba(0, 0, 0, 0.05); + --bs-table-active-color: var(--bs-body-color); + --bs-table-active-bg: rgba(0, 0, 0, 0.1); + --bs-table-hover-color: var(--bs-body-color); + --bs-table-hover-bg: rgba(0, 0, 0, 0.075); + width: 100%; + margin-bottom: 1rem; + color: var(--bs-table-color); + vertical-align: top; + border-color: var(--bs-table-border-color); +} +.table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + background-color: var(--bs-table-bg); + border-bottom-width: 1px; + box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); +} +.table > tbody { + vertical-align: inherit; +} +.table > thead { + vertical-align: bottom; +} + +.table-group-divider { + border-top: 2px solid currentcolor; +} + +.caption-top { + caption-side: top; +} + +.table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; +} + +.table-bordered > :not(caption) > * { + border-width: 1px 0; +} +.table-bordered > :not(caption) > * > * { + border-width: 0 1px; +} + +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0; +} +.table-borderless > :not(:first-child) { + border-top-width: 0; +} + +.table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color); +} + +.table-striped-columns > :not(caption) > tr > :nth-child(even) { + --bs-table-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color); +} + +.table-active { + --bs-table-accent-bg: var(--bs-table-active-bg); + color: var(--bs-table-active-color); +} + +.table-hover > tbody > tr:hover > * { + --bs-table-accent-bg: var(--bs-table-hover-bg); + color: var(--bs-table-hover-color); +} + +.table-primary { + --bs-table-color: #000; + --bs-table-bg: #d4d7fc; + --bs-table-border-color: #bfc2e3; + --bs-table-striped-bg: #c9ccef; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bfc2e3; + --bs-table-active-color: #000; + --bs-table-hover-bg: #c4c7e9; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-secondary { + --bs-table-color: #000; + --bs-table-bg: #ecd1f9; + --bs-table-border-color: #d4bce0; + --bs-table-striped-bg: #e0c7ed; + --bs-table-striped-color: #000; + --bs-table-active-bg: #d4bce0; + --bs-table-active-color: #000; + --bs-table-hover-bg: #dac1e6; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-success { + --bs-table-color: #000; + --bs-table-bg: #d1e7dd; + --bs-table-border-color: #bcd0c7; + --bs-table-striped-bg: #c7dbd2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bcd0c7; + --bs-table-active-color: #000; + --bs-table-hover-bg: #c1d6cc; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-info { + --bs-table-color: #000; + --bs-table-bg: #cff4fc; + --bs-table-border-color: #badce3; + --bs-table-striped-bg: #c5e8ef; + --bs-table-striped-color: #000; + --bs-table-active-bg: #badce3; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfe2e9; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-warning { + --bs-table-color: #000; + --bs-table-bg: #fff3cd; + --bs-table-border-color: #e6dbb9; + --bs-table-striped-bg: #f2e7c3; + --bs-table-striped-color: #000; + --bs-table-active-bg: #e6dbb9; + --bs-table-active-color: #000; + --bs-table-hover-bg: #ece1be; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-danger { + --bs-table-color: #000; + --bs-table-bg: #f8d7da; + --bs-table-border-color: #dfc2c4; + --bs-table-striped-bg: #eccccf; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfc2c4; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5c7ca; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-light { + --bs-table-color: #000; + --bs-table-bg: #f8f9fa; + --bs-table-border-color: #dfe0e1; + --bs-table-striped-bg: #ecedee; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfe0e1; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5e6e7; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-dark { + --bs-table-color: #fff; + --bs-table-bg: #212529; + --bs-table-border-color: #373b3e; + --bs-table-striped-bg: #2c3034; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #373b3e; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #323539; + --bs-table-hover-color: #fff; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-responsive { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1399.98px) { + .table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +.form-label { + margin-bottom: 0.5rem; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; +} + +.form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: #6c757d; +} + +.form-control { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 500; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 0.375rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control[type=file] { + overflow: hidden; +} +.form-control[type=file]:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control:focus { + color: #212529; + background-color: #fff; + border-color: #949bf8; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(41, 55, 240, 0.25); +} +.form-control::-webkit-date-and-time-value { + height: 1.5em; +} +.form-control::-moz-placeholder { + color: #6c757d; + opacity: 1; +} +.form-control::placeholder { + color: #6c757d; + opacity: 1; +} +.form-control:disabled { + background-color: #e9ecef; + opacity: 1; +} +.form-control::file-selector-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::file-selector-button { + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: #dde0e3; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} +.form-control-plaintext:focus { + outline: 0; +} +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.25rem; +} +.form-control-sm::file-selector-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} + +.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.5rem; +} +.form-control-lg::file-selector-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} + +textarea.form-control { + min-height: calc(1.5em + 0.75rem + 2px); +} +textarea.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); +} +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); +} + +.form-control-color { + width: 3rem; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + border: 0 !important; + border-radius: 0.375rem; +} +.form-control-color::-webkit-color-swatch { + border-radius: 0.375rem; +} +.form-control-color.form-control-sm { + height: calc(1.5em + 0.5rem + 2px); +} +.form-control-color.form-control-lg { + height: calc(1.5em + 1rem + 2px); +} + +.form-select { + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + -moz-padding-start: calc(0.75rem - 3px); + font-size: 1rem; + font-weight: 500; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: 1px solid #ced4da; + border-radius: 0.375rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-select { + transition: none; + } +} +.form-select:focus { + border-color: #949bf8; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(41, 55, 240, 0.25); +} +.form-select[multiple], .form-select[size]:not([size="1"]) { + padding-right: 0.75rem; + background-image: none; +} +.form-select:disabled { + background-color: #e9ecef; +} +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #212529; +} + +.form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; + border-radius: 0.25rem; +} + +.form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; + border-radius: 0.5rem; +} + +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} + +.form-check-reverse { + padding-right: 1.5em; + padding-left: 0; + text-align: right; +} +.form-check-reverse .form-check-input { + float: right; + margin-right: -1.5em; + margin-left: 0; +} + +.form-check-input { + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + background-color: #fff; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: 1px solid rgba(0, 0, 0, 0.25); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; +} +.form-check-input[type=checkbox] { + border-radius: 0.25em; +} +.form-check-input[type=radio] { + border-radius: 50%; +} +.form-check-input:active { + filter: brightness(90%); +} +.form-check-input:focus { + border-color: #949bf8; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(41, 55, 240, 0.25); +} +.form-check-input:checked { + background-color: #2937f0; + border-color: #2937f0; +} +.form-check-input:checked[type=checkbox] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type=radio] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-input[type=checkbox]:indeterminate { + background-color: #2937f0; + border-color: #2937f0; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} +.form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: 0.5; +} +.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { + cursor: default; + opacity: 0.5; +} + +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + width: 2em; + margin-left: -2.5em; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + background-position: left center; + border-radius: 2em; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none; + } +} +.form-switch .form-check-input:focus { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23949bf8'/%3e%3c/svg%3e"); +} +.form-switch .form-check-input:checked { + background-position: right center; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-switch.form-check-reverse { + padding-right: 2.5em; + padding-left: 0; +} +.form-switch.form-check-reverse .form-check-input { + margin-right: -2.5em; + margin-left: 0; +} + +.form-check-inline { + display: inline-block; + margin-right: 1rem; +} + +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.btn-check[disabled] + .btn, .btn-check:disabled + .btn { + pointer-events: none; + filter: none; + opacity: 0.65; +} + +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.form-range:focus { + outline: 0; +} +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(41, 55, 240, 0.25); +} +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(41, 55, 240, 0.25); +} +.form-range::-moz-focus-outer { + border: 0; +} +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #2937f0; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none; + } +} +.form-range::-webkit-slider-thumb:active { + background-color: #bfc3fb; +} +.form-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #2937f0; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none; + } +} +.form-range::-moz-range-thumb:active { + background-color: #bfc3fb; +} +.form-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range:disabled { + pointer-events: none; +} +.form-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; +} +.form-range:disabled::-moz-range-thumb { + background-color: #adb5bd; +} + +.form-floating { + position: relative; +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext, +.form-floating > .form-select { + height: calc(3.5rem + 2px); + line-height: 1.25; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + padding: 1rem 0.75rem; + overflow: hidden; + text-align: start; + text-overflow: ellipsis; + white-space: nowrap; + pointer-events: none; + border: 1px solid transparent; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none; + } +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext { + padding: 1rem 0.75rem; +} +.form-floating > .form-control::-moz-placeholder, .form-floating > .form-control-plaintext::-moz-placeholder { + color: transparent; +} +.form-floating > .form-control::placeholder, +.form-floating > .form-control-plaintext::placeholder { + color: transparent; +} +.form-floating > .form-control:not(:-moz-placeholder-shown), .form-floating > .form-control-plaintext:not(:-moz-placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown), +.form-floating > .form-control-plaintext:focus, +.form-floating > .form-control-plaintext:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:-webkit-autofill, +.form-floating > .form-control-plaintext:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-control-plaintext ~ label, +.form-floating > .form-select ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:-webkit-autofill ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control-plaintext ~ label { + border-width: 1px 0; +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-select, +.input-group > .form-floating { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, +.input-group > .form-select:focus, +.input-group > .form-floating:focus-within { + z-index: 5; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 5; +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 500; + line-height: 1.5; + color: #212529; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 0.375rem; +} + +.input-group-lg > .form-control, +.input-group-lg > .form-select, +.input-group-lg > .input-group-text, +.input-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.5rem; +} + +.input-group-sm > .form-control, +.input-group-sm > .form-select, +.input-group-sm > .input-group-text, +.input-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.25rem; +} + +.input-group-lg > .form-select, +.input-group-sm > .form-select { + padding-right: 3rem; +} + +.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3), +.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, +.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), +.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4), +.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control, +.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { + margin-left: -1px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .form-floating:not(:first-child) > .form-control, +.input-group > .form-floating:not(:first-child) > .form-select { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #198754; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(25, 135, 84, 0.9); + border-radius: 0.375rem; +} + +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #198754; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #198754; + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:valid, .form-select.is-valid { + border-color: #198754; +} +.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:valid:focus, .form-select.is-valid:focus { + border-color: #198754; + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} + +.was-validated .form-control-color:valid, .form-control-color.is-valid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} + +.was-validated .form-check-input:valid, .form-check-input.is-valid { + border-color: #198754; +} +.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { + background-color: #198754; +} +.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #198754; +} + +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid, +.was-validated .input-group > .form-select:not(:focus):valid, +.input-group > .form-select:not(:focus).is-valid, +.was-validated .input-group > .form-floating:not(:focus-within):valid, +.input-group > .form-floating:not(:focus-within).is-valid { + z-index: 3; +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #dc3545; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(220, 53, 69, 0.9); + border-radius: 0.375rem; +} + +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:invalid, .form-select.is-invalid { + border-color: #dc3545; +} +.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} + +.was-validated .form-control-color:invalid, .form-control-color.is-invalid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} + +.was-validated .form-check-input:invalid, .form-check-input.is-invalid { + border-color: #dc3545; +} +.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { + background-color: #dc3545; +} +.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} + +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid, +.was-validated .input-group > .form-select:not(:focus):invalid, +.input-group > .form-select:not(:focus).is-invalid, +.was-validated .input-group > .form-floating:not(:focus-within):invalid, +.input-group > .form-floating:not(:focus-within).is-invalid { + z-index: 4; +} + +.btn { + --bs-btn-padding-x: 0.75rem; + --bs-btn-padding-y: 0.375rem; + --bs-btn-font-family: ; + --bs-btn-font-size: 1rem; + --bs-btn-font-weight: 500; + --bs-btn-line-height: 1.5; + --bs-btn-color: #212529; + --bs-btn-bg: transparent; + --bs-btn-border-width: 1px; + --bs-btn-border-color: transparent; + --bs-btn-border-radius: 0.375rem; + --bs-btn-hover-border-color: transparent; + --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + --bs-btn-disabled-opacity: 0.65; + --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5); + display: inline-block; + padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); + font-family: var(--bs-btn-font-family); + font-size: var(--bs-btn-font-size); + font-weight: var(--bs-btn-font-weight); + line-height: var(--bs-btn-line-height); + color: var(--bs-btn-color); + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); + border-radius: var(--bs-btn-border-radius); + background-color: var(--bs-btn-bg); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); +} +.btn-check + .btn:hover { + color: var(--bs-btn-color); + background-color: var(--bs-btn-bg); + border-color: var(--bs-btn-border-color); +} +.btn:focus-visible { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:focus-visible + .btn { + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show { + color: var(--bs-btn-active-color); + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color); +} +.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible { + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn:disabled, .btn.disabled, fieldset:disabled .btn { + color: var(--bs-btn-disabled-color); + pointer-events: none; + background-color: var(--bs-btn-disabled-bg); + border-color: var(--bs-btn-disabled-border-color); + opacity: var(--bs-btn-disabled-opacity); +} + +.btn-primary { + --bs-btn-color: #fff; + --bs-btn-bg: #2937f0; + --bs-btn-border-color: #2937f0; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #232fcc; + --bs-btn-hover-border-color: #212cc0; + --bs-btn-focus-shadow-rgb: 73, 85, 242; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #212cc0; + --bs-btn-active-border-color: #1f29b4; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #2937f0; + --bs-btn-disabled-border-color: #2937f0; +} + +.btn-secondary { + --bs-btn-color: #fff; + --bs-btn-bg: #9f1ae2; + --bs-btn-border-color: #9f1ae2; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #8716c0; + --bs-btn-hover-border-color: #7f15b5; + --bs-btn-focus-shadow-rgb: 173, 60, 230; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #7f15b5; + --bs-btn-active-border-color: #7714aa; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #9f1ae2; + --bs-btn-disabled-border-color: #9f1ae2; +} + +.btn-success { + --bs-btn-color: #fff; + --bs-btn-bg: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #157347; + --bs-btn-hover-border-color: #146c43; + --bs-btn-focus-shadow-rgb: 60, 153, 110; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #146c43; + --bs-btn-active-border-color: #13653f; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #198754; + --bs-btn-disabled-border-color: #198754; +} + +.btn-info { + --bs-btn-color: #000; + --bs-btn-bg: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #31d2f2; + --bs-btn-hover-border-color: #25cff2; + --bs-btn-focus-shadow-rgb: 11, 172, 204; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #3dd5f3; + --bs-btn-active-border-color: #25cff2; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #0dcaf0; + --bs-btn-disabled-border-color: #0dcaf0; +} + +.btn-warning { + --bs-btn-color: #000; + --bs-btn-bg: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffca2c; + --bs-btn-hover-border-color: #ffc720; + --bs-btn-focus-shadow-rgb: 217, 164, 6; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffcd39; + --bs-btn-active-border-color: #ffc720; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #ffc107; + --bs-btn-disabled-border-color: #ffc107; +} + +.btn-danger { + --bs-btn-color: #fff; + --bs-btn-bg: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #bb2d3b; + --bs-btn-hover-border-color: #b02a37; + --bs-btn-focus-shadow-rgb: 225, 83, 97; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #b02a37; + --bs-btn-active-border-color: #a52834; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #dc3545; + --bs-btn-disabled-border-color: #dc3545; +} + +.btn-light { + --bs-btn-color: #000; + --bs-btn-bg: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #d3d4d5; + --bs-btn-hover-border-color: #c6c7c8; + --bs-btn-focus-shadow-rgb: 211, 212, 213; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #c6c7c8; + --bs-btn-active-border-color: #babbbc; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #f8f9fa; + --bs-btn-disabled-border-color: #f8f9fa; +} + +.btn-dark { + --bs-btn-color: #fff; + --bs-btn-bg: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #424649; + --bs-btn-hover-border-color: #373b3e; + --bs-btn-focus-shadow-rgb: 66, 70, 73; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #4d5154; + --bs-btn-active-border-color: #373b3e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #212529; + --bs-btn-disabled-border-color: #212529; +} + +.btn-outline-primary { + --bs-btn-color: #2937f0; + --bs-btn-border-color: #2937f0; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #2937f0; + --bs-btn-hover-border-color: #2937f0; + --bs-btn-focus-shadow-rgb: 41, 55, 240; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #2937f0; + --bs-btn-active-border-color: #2937f0; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #2937f0; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #2937f0; + --bs-gradient: none; +} + +.btn-outline-secondary { + --bs-btn-color: #9f1ae2; + --bs-btn-border-color: #9f1ae2; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #9f1ae2; + --bs-btn-hover-border-color: #9f1ae2; + --bs-btn-focus-shadow-rgb: 159, 26, 226; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #9f1ae2; + --bs-btn-active-border-color: #9f1ae2; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #9f1ae2; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #9f1ae2; + --bs-gradient: none; +} + +.btn-outline-success { + --bs-btn-color: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #198754; + --bs-btn-hover-border-color: #198754; + --bs-btn-focus-shadow-rgb: 25, 135, 84; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #198754; + --bs-btn-active-border-color: #198754; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #198754; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #198754; + --bs-gradient: none; +} + +.btn-outline-info { + --bs-btn-color: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #0dcaf0; + --bs-btn-hover-border-color: #0dcaf0; + --bs-btn-focus-shadow-rgb: 13, 202, 240; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #0dcaf0; + --bs-btn-active-border-color: #0dcaf0; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0dcaf0; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0dcaf0; + --bs-gradient: none; +} + +.btn-outline-warning { + --bs-btn-color: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffc107; + --bs-btn-hover-border-color: #ffc107; + --bs-btn-focus-shadow-rgb: 255, 193, 7; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffc107; + --bs-btn-active-border-color: #ffc107; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #ffc107; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #ffc107; + --bs-gradient: none; +} + +.btn-outline-danger { + --bs-btn-color: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #dc3545; + --bs-btn-hover-border-color: #dc3545; + --bs-btn-focus-shadow-rgb: 220, 53, 69; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #dc3545; + --bs-btn-active-border-color: #dc3545; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #dc3545; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #dc3545; + --bs-gradient: none; +} + +.btn-outline-light { + --bs-btn-color: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #f8f9fa; + --bs-btn-hover-border-color: #f8f9fa; + --bs-btn-focus-shadow-rgb: 248, 249, 250; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #f8f9fa; + --bs-btn-active-border-color: #f8f9fa; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #f8f9fa; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #f8f9fa; + --bs-gradient: none; +} + +.btn-outline-dark { + --bs-btn-color: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #212529; + --bs-btn-hover-border-color: #212529; + --bs-btn-focus-shadow-rgb: 33, 37, 41; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #212529; + --bs-btn-active-border-color: #212529; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #212529; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #212529; + --bs-gradient: none; +} + +.btn-link { + --bs-btn-font-weight: 500; + --bs-btn-color: var(--bs-link-color); + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-hover-color: var(--bs-link-hover-color); + --bs-btn-hover-border-color: transparent; + --bs-btn-active-color: var(--bs-link-hover-color); + --bs-btn-active-border-color: transparent; + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-border-color: transparent; + --bs-btn-box-shadow: none; + --bs-btn-focus-shadow-rgb: 73, 85, 242; + text-decoration: underline; +} +.btn-link:focus-visible { + color: var(--bs-btn-color); +} +.btn-link:hover { + color: var(--bs-btn-hover-color); +} + +.btn-lg, .btn-group-lg > .btn { + --bs-btn-padding-y: 0.5rem; + --bs-btn-padding-x: 1rem; + --bs-btn-font-size: 1.25rem; + --bs-btn-border-radius: 0.5rem; +} + +.btn-sm, .btn-group-sm > .btn { + --bs-btn-padding-y: 0.25rem; + --bs-btn-padding-x: 0.5rem; + --bs-btn-font-size: 0.875rem; + --bs-btn-border-radius: 0.25rem; +} + +.fade { + transition: opacity 0.15s linear; +} +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} +.collapsing.collapse-horizontal { + width: 0; + height: auto; + transition: width 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + transition: none; + } +} + +.dropup, +.dropend, +.dropdown, +.dropstart, +.dropup-center, +.dropdown-center { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + --bs-dropdown-zindex: 1000; + --bs-dropdown-min-width: 10rem; + --bs-dropdown-padding-x: 0; + --bs-dropdown-padding-y: 0.5rem; + --bs-dropdown-spacer: 0.125rem; + --bs-dropdown-font-size: 1rem; + --bs-dropdown-color: #212529; + --bs-dropdown-bg: #fff; + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-border-radius: 0.375rem; + --bs-dropdown-border-width: 1px; + --bs-dropdown-inner-border-radius: calc(0.375rem - 1px); + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-divider-margin-y: 0.5rem; + --bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-dropdown-link-color: #212529; + --bs-dropdown-link-hover-color: #1e2125; + --bs-dropdown-link-hover-bg: #e9ecef; + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #2937f0; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-item-padding-x: 1rem; + --bs-dropdown-item-padding-y: 0.25rem; + --bs-dropdown-header-color: #6c757d; + --bs-dropdown-header-padding-x: 1rem; + --bs-dropdown-header-padding-y: 0.5rem; + position: absolute; + z-index: var(--bs-dropdown-zindex); + display: none; + min-width: var(--bs-dropdown-min-width); + padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); + margin: 0; + font-size: var(--bs-dropdown-font-size); + color: var(--bs-dropdown-color); + text-align: left; + list-style: none; + background-color: var(--bs-dropdown-bg); + background-clip: padding-box; + border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); + border-radius: var(--bs-dropdown-border-radius); +} +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--bs-dropdown-spacer); +} + +.dropdown-menu-start { + --bs-position: start; +} +.dropdown-menu-start[data-bs-popper] { + right: auto; + left: 0; +} + +.dropdown-menu-end { + --bs-position: end; +} +.dropdown-menu-end[data-bs-popper] { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start; + } + .dropdown-menu-sm-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-sm-end { + --bs-position: end; + } + .dropdown-menu-sm-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start; + } + .dropdown-menu-md-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-md-end { + --bs-position: end; + } + .dropdown-menu-md-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start; + } + .dropdown-menu-lg-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-lg-end { + --bs-position: end; + } + .dropdown-menu-lg-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start; + } + .dropdown-menu-xl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xl-end { + --bs-position: end; + } + .dropdown-menu-xl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start; + } + .dropdown-menu-xxl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xxl-end { + --bs-position: end; + } + .dropdown-menu-xxl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +.dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: var(--bs-dropdown-spacer); +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: var(--bs-dropdown-spacer); +} +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropend .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropend .dropdown-toggle::after { + vertical-align: 0; +} + +.dropstart .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: var(--bs-dropdown-spacer); +} +.dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropstart .dropdown-toggle::after { + display: none; +} +.dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropstart .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropstart .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-divider { + height: 0; + margin: var(--bs-dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--bs-dropdown-divider-bg); + opacity: 1; +} + +.dropdown-item { + display: block; + width: 100%; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + clear: both; + font-weight: 500; + color: var(--bs-dropdown-link-color); + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.dropdown-item:hover, .dropdown-item:focus { + color: var(--bs-dropdown-link-hover-color); + background-color: var(--bs-dropdown-link-hover-bg); +} +.dropdown-item.active, .dropdown-item:active { + color: var(--bs-dropdown-link-active-color); + text-decoration: none; + background-color: var(--bs-dropdown-link-active-bg); +} +.dropdown-item.disabled, .dropdown-item:disabled { + color: var(--bs-dropdown-link-disabled-color); + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x); + margin-bottom: 0; + font-size: 0.875rem; + color: var(--bs-dropdown-header-color); + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + color: var(--bs-dropdown-link-color); +} + +.dropdown-menu-dark { + --bs-dropdown-color: #dee2e6; + --bs-dropdown-bg: #343a40; + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-box-shadow: ; + --bs-dropdown-link-color: #dee2e6; + --bs-dropdown-link-hover-color: #fff; + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #2937f0; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-header-color: #adb5bd; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group > .btn-check:checked + .btn, +.btn-group > .btn-check:focus + .btn, +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn-check:checked + .btn, +.btn-group-vertical > .btn-check:focus + .btn, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group { + border-radius: 0.375rem; +} +.btn-group > :not(.btn-check:first-child) + .btn, +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn.dropdown-toggle-split:first-child, +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:nth-child(n+3), +.btn-group > :not(.btn-check) + .btn, +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { + margin-left: 0; +} +.dropstart .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn ~ .btn, +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav { + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-link-color); + --bs-nav-link-hover-color: var(--bs-link-hover-color); + --bs-nav-link-disabled-color: #6c757d; + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); + font-size: var(--bs-nav-link-font-size); + font-weight: var(--bs-nav-link-font-weight); + color: var(--bs-nav-link-color); + text-decoration: none; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none; + } +} +.nav-link:hover, .nav-link:focus { + color: var(--bs-nav-link-hover-color); +} +.nav-link.disabled { + color: var(--bs-nav-link-disabled-color); + pointer-events: none; + cursor: default; +} + +.nav-tabs { + --bs-nav-tabs-border-width: 1px; + --bs-nav-tabs-border-color: #dee2e6; + --bs-nav-tabs-border-radius: 0.375rem; + --bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6; + --bs-nav-tabs-link-active-color: #495057; + --bs-nav-tabs-link-active-bg: #fff; + --bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff; + border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color); +} +.nav-tabs .nav-link { + margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); + background: none; + border: var(--bs-nav-tabs-border-width) solid transparent; + border-top-left-radius: var(--bs-nav-tabs-border-radius); + border-top-right-radius: var(--bs-nav-tabs-border-radius); +} +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + isolation: isolate; + border-color: var(--bs-nav-tabs-link-hover-border-color); +} +.nav-tabs .nav-link.disabled, .nav-tabs .nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + background-color: transparent; + border-color: transparent; +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: var(--bs-nav-tabs-link-active-color); + background-color: var(--bs-nav-tabs-link-active-bg); + border-color: var(--bs-nav-tabs-link-active-border-color); +} +.nav-tabs .dropdown-menu { + margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills { + --bs-nav-pills-border-radius: 0.375rem; + --bs-nav-pills-link-active-color: #fff; + --bs-nav-pills-link-active-bg: #2937f0; +} +.nav-pills .nav-link { + background: none; + border: 0; + border-radius: var(--bs-nav-pills-border-radius); +} +.nav-pills .nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + background-color: transparent; + border-color: transparent; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: var(--bs-nav-pills-link-active-color); + background-color: var(--bs-nav-pills-link-active-bg); +} + +.nav-fill > .nav-link, +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified > .nav-link, +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.nav-fill .nav-item .nav-link, +.nav-justified .nav-item .nav-link { + width: 100%; +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.navbar { + --bs-navbar-padding-x: 0; + --bs-navbar-padding-y: 0.5rem; + --bs-navbar-color: rgba(0, 0, 0, 0.55); + --bs-navbar-hover-color: rgba(0, 0, 0, 0.7); + --bs-navbar-disabled-color: rgba(0, 0, 0, 0.3); + --bs-navbar-active-color: rgba(0, 0, 0, 0.9); + --bs-navbar-brand-padding-y: 0.3125rem; + --bs-navbar-brand-margin-end: 1rem; + --bs-navbar-brand-font-size: 1.25rem; + --bs-navbar-brand-color: rgba(0, 0, 0, 0.9); + --bs-navbar-brand-hover-color: rgba(0, 0, 0, 0.9); + --bs-navbar-nav-link-padding-x: 0.5rem; + --bs-navbar-toggler-padding-y: 0.25rem; + --bs-navbar-toggler-padding-x: 0.75rem; + --bs-navbar-toggler-font-size: 1.25rem; + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + --bs-navbar-toggler-border-color: rgba(0, 0, 0, 0.1); + --bs-navbar-toggler-border-radius: 0.375rem; + --bs-navbar-toggler-focus-width: 0.25rem; + --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); +} +.navbar > .container, +.navbar > .container-fluid, +.navbar > .container-sm, +.navbar > .container-md, +.navbar > .container-lg, +.navbar > .container-xl, +.navbar > .container-xxl { + display: flex; + flex-wrap: inherit; + align-items: center; + justify-content: space-between; +} +.navbar-brand { + padding-top: var(--bs-navbar-brand-padding-y); + padding-bottom: var(--bs-navbar-brand-padding-y); + margin-right: var(--bs-navbar-brand-margin-end); + font-size: var(--bs-navbar-brand-font-size); + color: var(--bs-navbar-brand-color); + text-decoration: none; + white-space: nowrap; +} +.navbar-brand:hover, .navbar-brand:focus { + color: var(--bs-navbar-brand-hover-color); +} + +.navbar-nav { + --bs-nav-link-padding-x: 0; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-navbar-color); + --bs-nav-link-hover-color: var(--bs-navbar-hover-color); + --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .show > .nav-link, +.navbar-nav .nav-link.active { + color: var(--bs-navbar-active-color); +} +.navbar-nav .dropdown-menu { + position: static; +} + +.navbar-text { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-navbar-color); +} +.navbar-text a, +.navbar-text a:hover, +.navbar-text a:focus { + color: var(--bs-navbar-active-color); +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} + +.navbar-toggler { + padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); + font-size: var(--bs-navbar-toggler-font-size); + line-height: 1; + color: var(--bs-navbar-color); + background-color: transparent; + border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); + border-radius: var(--bs-navbar-toggler-border-radius); + transition: var(--bs-navbar-toggler-transition); +} +@media (prefers-reduced-motion: reduce) { + .navbar-toggler { + transition: none; + } +} +.navbar-toggler:hover { + text-decoration: none; +} +.navbar-toggler:focus { + text-decoration: none; + outline: 0; + box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-image: var(--bs-navbar-toggler-icon-bg); + background-repeat: no-repeat; + background-position: center; + background-size: 100%; +} + +.navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto; +} + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } + .navbar-expand-sm .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-sm .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-sm .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } + .navbar-expand-md .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-md .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-md .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } + .navbar-expand-lg .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-lg .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-lg .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } + .navbar-expand-xl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1400px) { + .navbar-expand-xxl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xxl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xxl .navbar-toggler { + display: none; + } + .navbar-expand-xxl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +.navbar-expand { + flex-wrap: nowrap; + justify-content: flex-start; +} +.navbar-expand .navbar-nav { + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); +} +.navbar-expand .navbar-nav-scroll { + overflow: visible; +} +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} +.navbar-expand .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; +} +.navbar-expand .offcanvas .offcanvas-header { + display: none; +} +.navbar-expand .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; +} + +.navbar-dark { + --bs-navbar-color: rgba(255, 255, 255, 0.55); + --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); + --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); + --bs-navbar-active-color: #fff; + --bs-navbar-brand-color: #fff; + --bs-navbar-brand-hover-color: #fff; + --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.card { + --bs-card-spacer-y: 1rem; + --bs-card-spacer-x: 1rem; + --bs-card-title-spacer-y: 0.5rem; + --bs-card-border-width: 1px; + --bs-card-border-color: var(--bs-border-color-translucent); + --bs-card-border-radius: 0.375rem; + --bs-card-box-shadow: ; + --bs-card-inner-border-radius: calc(0.375rem - 1px); + --bs-card-cap-padding-y: 0.5rem; + --bs-card-cap-padding-x: 1rem; + --bs-card-cap-bg: rgba(0, 0, 0, 0.03); + --bs-card-cap-color: ; + --bs-card-height: ; + --bs-card-color: ; + --bs-card-bg: #fff; + --bs-card-img-overlay-padding: 1rem; + --bs-card-group-margin: 0.75rem; + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + height: var(--bs-card-height); + word-wrap: break-word; + background-color: var(--bs-card-bg); + background-clip: border-box; + border: var(--bs-card-border-width) solid var(--bs-card-border-color); + border-radius: var(--bs-card-border-radius); +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); +} +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} + +.card-body { + flex: 1 1 auto; + padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); + color: var(--bs-card-color); +} + +.card-title { + margin-bottom: var(--bs-card-title-spacer-y); +} + +.card-subtitle { + margin-top: calc(-0.5 * var(--bs-card-title-spacer-y)); + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link + .card-link { + margin-left: var(--bs-card-spacer-x); +} + +.card-header { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + margin-bottom: 0; + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-header:first-child { + border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0; +} + +.card-footer { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-footer:last-child { + border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius); +} + +.card-header-tabs { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); + border-bottom: 0; +} +.card-header-tabs .nav-link.active { + background-color: var(--bs-card-bg); + border-bottom-color: var(--bs-card-bg); +} + +.card-header-pills { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--bs-card-img-overlay-padding); + border-radius: var(--bs-card-inner-border-radius); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; +} + +.card-img, +.card-img-top { + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); +} + +.card-img, +.card-img-bottom { + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); +} + +.card-group > .card { + margin-bottom: var(--bs-card-group-margin); +} +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} + +.accordion { + --bs-accordion-color: #212529; + --bs-accordion-bg: #fff; + --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; + --bs-accordion-border-color: var(--bs-border-color); + --bs-accordion-border-width: 1px; + --bs-accordion-border-radius: 0.375rem; + --bs-accordion-inner-border-radius: calc(0.375rem - 1px); + --bs-accordion-btn-padding-x: 1.25rem; + --bs-accordion-btn-padding-y: 1rem; + --bs-accordion-btn-color: #212529; + --bs-accordion-btn-bg: var(--bs-accordion-bg); + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-icon-width: 1.25rem; + --bs-accordion-btn-icon-transform: rotate(-180deg); + --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232532d8'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-focus-border-color: #949bf8; + --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(41, 55, 240, 0.25); + --bs-accordion-body-padding-x: 1.25rem; + --bs-accordion-body-padding-y: 1rem; + --bs-accordion-active-color: #2532d8; + --bs-accordion-active-bg: #eaebfe; +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); + font-size: 1rem; + color: var(--bs-accordion-btn-color); + text-align: left; + background-color: var(--bs-accordion-btn-bg); + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: var(--bs-accordion-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none; + } +} +.accordion-button:not(.collapsed) { + color: var(--bs-accordion-active-color); + background-color: var(--bs-accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color); +} +.accordion-button:not(.collapsed)::after { + background-image: var(--bs-accordion-btn-active-icon); + transform: var(--bs-accordion-btn-icon-transform); +} +.accordion-button::after { + flex-shrink: 0; + width: var(--bs-accordion-btn-icon-width); + height: var(--bs-accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--bs-accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--bs-accordion-btn-icon-width); + transition: var(--bs-accordion-btn-icon-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none; + } +} +.accordion-button:hover { + z-index: 2; +} +.accordion-button:focus { + z-index: 3; + border-color: var(--bs-accordion-btn-focus-border-color); + outline: 0; + box-shadow: var(--bs-accordion-btn-focus-box-shadow); +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + color: var(--bs-accordion-color); + background-color: var(--bs-accordion-bg); + border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color); +} +.accordion-item:first-of-type { + border-top-left-radius: var(--bs-accordion-border-radius); + border-top-right-radius: var(--bs-accordion-border-radius); +} +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: var(--bs-accordion-inner-border-radius); + border-top-right-radius: var(--bs-accordion-inner-border-radius); +} +.accordion-item:not(:first-of-type) { + border-top: 0; +} +.accordion-item:last-of-type { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); +} +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: var(--bs-accordion-inner-border-radius); + border-bottom-left-radius: var(--bs-accordion-inner-border-radius); +} +.accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); +} + +.accordion-body { + padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x); +} + +.accordion-flush .accordion-collapse { + border-width: 0; +} +.accordion-flush .accordion-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.accordion-flush .accordion-item:first-child { + border-top: 0; +} +.accordion-flush .accordion-item:last-child { + border-bottom: 0; +} +.accordion-flush .accordion-item .accordion-button, .accordion-flush .accordion-item .accordion-button.collapsed { + border-radius: 0; +} + +.breadcrumb { + --bs-breadcrumb-padding-x: 0; + --bs-breadcrumb-padding-y: 0; + --bs-breadcrumb-margin-bottom: 1rem; + --bs-breadcrumb-bg: ; + --bs-breadcrumb-border-radius: ; + --bs-breadcrumb-divider-color: #6c757d; + --bs-breadcrumb-item-padding-x: 0.5rem; + --bs-breadcrumb-item-active-color: #6c757d; + display: flex; + flex-wrap: wrap; + padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); + margin-bottom: var(--bs-breadcrumb-margin-bottom); + font-size: var(--bs-breadcrumb-font-size); + list-style: none; + background-color: var(--bs-breadcrumb-bg); + border-radius: var(--bs-breadcrumb-border-radius); +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: var(--bs-breadcrumb-item-padding-x); +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: var(--bs-breadcrumb-item-padding-x); + color: var(--bs-breadcrumb-divider-color); + content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; +} +.breadcrumb-item.active { + color: var(--bs-breadcrumb-item-active-color); +} + +.pagination { + --bs-pagination-padding-x: 0.75rem; + --bs-pagination-padding-y: 0.375rem; + --bs-pagination-font-size: 1rem; + --bs-pagination-color: var(--bs-link-color); + --bs-pagination-bg: #fff; + --bs-pagination-border-width: 1px; + --bs-pagination-border-color: #dee2e6; + --bs-pagination-border-radius: 0.375rem; + --bs-pagination-hover-color: var(--bs-link-hover-color); + --bs-pagination-hover-bg: #e9ecef; + --bs-pagination-hover-border-color: #dee2e6; + --bs-pagination-focus-color: var(--bs-link-hover-color); + --bs-pagination-focus-bg: #e9ecef; + --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(41, 55, 240, 0.25); + --bs-pagination-active-color: #fff; + --bs-pagination-active-bg: #2937f0; + --bs-pagination-active-border-color: #2937f0; + --bs-pagination-disabled-color: #6c757d; + --bs-pagination-disabled-bg: #fff; + --bs-pagination-disabled-border-color: #dee2e6; + display: flex; + padding-left: 0; + list-style: none; +} + +.page-link { + position: relative; + display: block; + padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); + font-size: var(--bs-pagination-font-size); + color: var(--bs-pagination-color); + text-decoration: none; + background-color: var(--bs-pagination-bg); + border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .page-link { + transition: none; + } +} +.page-link:hover { + z-index: 2; + color: var(--bs-pagination-hover-color); + background-color: var(--bs-pagination-hover-bg); + border-color: var(--bs-pagination-hover-border-color); +} +.page-link:focus { + z-index: 3; + color: var(--bs-pagination-focus-color); + background-color: var(--bs-pagination-focus-bg); + outline: 0; + box-shadow: var(--bs-pagination-focus-box-shadow); +} +.page-link.active, .active > .page-link { + z-index: 3; + color: var(--bs-pagination-active-color); + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color); +} +.page-link.disabled, .disabled > .page-link { + color: var(--bs-pagination-disabled-color); + pointer-events: none; + background-color: var(--bs-pagination-disabled-bg); + border-color: var(--bs-pagination-disabled-border-color); +} + +.page-item:not(:first-child) .page-link { + margin-left: -1px; +} +.page-item:first-child .page-link { + border-top-left-radius: var(--bs-pagination-border-radius); + border-bottom-left-radius: var(--bs-pagination-border-radius); +} +.page-item:last-child .page-link { + border-top-right-radius: var(--bs-pagination-border-radius); + border-bottom-right-radius: var(--bs-pagination-border-radius); +} + +.pagination-lg { + --bs-pagination-padding-x: 1.5rem; + --bs-pagination-padding-y: 0.75rem; + --bs-pagination-font-size: 1.25rem; + --bs-pagination-border-radius: 0.5rem; +} + +.pagination-sm { + --bs-pagination-padding-x: 0.5rem; + --bs-pagination-padding-y: 0.25rem; + --bs-pagination-font-size: 0.875rem; + --bs-pagination-border-radius: 0.25rem; +} + +.badge { + --bs-badge-padding-x: 0.65em; + --bs-badge-padding-y: 0.35em; + --bs-badge-font-size: 0.75em; + --bs-badge-font-weight: 700; + --bs-badge-color: #fff; + --bs-badge-border-radius: 0.375rem; + display: inline-block; + padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); + font-size: var(--bs-badge-font-size); + font-weight: var(--bs-badge-font-weight); + line-height: 1; + color: var(--bs-badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: var(--bs-badge-border-radius); +} +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.alert { + --bs-alert-bg: transparent; + --bs-alert-padding-x: 1rem; + --bs-alert-padding-y: 1rem; + --bs-alert-margin-bottom: 1rem; + --bs-alert-color: inherit; + --bs-alert-border-color: transparent; + --bs-alert-border: 1px solid var(--bs-alert-border-color); + --bs-alert-border-radius: 0.375rem; + position: relative; + padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); + margin-bottom: var(--bs-alert-margin-bottom); + color: var(--bs-alert-color); + background-color: var(--bs-alert-bg); + border: var(--bs-alert-border); + border-radius: var(--bs-alert-border-radius); +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 3rem; +} +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; +} + +.alert-primary { + --bs-alert-color: #192190; + --bs-alert-bg: #d4d7fc; + --bs-alert-border-color: #bfc3fb; +} +.alert-primary .alert-link { + color: #141a73; +} + +.alert-secondary { + --bs-alert-color: #5f1088; + --bs-alert-bg: #ecd1f9; + --bs-alert-border-color: #e2baf6; +} +.alert-secondary .alert-link { + color: #4c0d6d; +} + +.alert-success { + --bs-alert-color: #0f5132; + --bs-alert-bg: #d1e7dd; + --bs-alert-border-color: #badbcc; +} +.alert-success .alert-link { + color: #0c4128; +} + +.alert-info { + --bs-alert-color: #055160; + --bs-alert-bg: #cff4fc; + --bs-alert-border-color: #b6effb; +} +.alert-info .alert-link { + color: #04414d; +} + +.alert-warning { + --bs-alert-color: #664d03; + --bs-alert-bg: #fff3cd; + --bs-alert-border-color: #ffecb5; +} +.alert-warning .alert-link { + color: #523e02; +} + +.alert-danger { + --bs-alert-color: #842029; + --bs-alert-bg: #f8d7da; + --bs-alert-border-color: #f5c2c7; +} +.alert-danger .alert-link { + color: #6a1a21; +} + +.alert-light { + --bs-alert-color: #636464; + --bs-alert-bg: #fefefe; + --bs-alert-border-color: #fdfdfe; +} +.alert-light .alert-link { + color: #4f5050; +} + +.alert-dark { + --bs-alert-color: #141619; + --bs-alert-bg: #d3d3d4; + --bs-alert-border-color: #bcbebf; +} +.alert-dark .alert-link { + color: #101214; +} + +@keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} +.progress { + --bs-progress-height: 1rem; + --bs-progress-font-size: 0.75rem; + --bs-progress-bg: #e9ecef; + --bs-progress-border-radius: 0.375rem; + --bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075); + --bs-progress-bar-color: #fff; + --bs-progress-bar-bg: #2937f0; + --bs-progress-bar-transition: width 0.6s ease; + display: flex; + height: var(--bs-progress-height); + overflow: hidden; + font-size: var(--bs-progress-font-size); + background-color: var(--bs-progress-bg); + border-radius: var(--bs-progress-border-radius); +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: var(--bs-progress-bar-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-progress-bar-bg); + transition: var(--bs-progress-bar-transition); +} +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: var(--bs-progress-height) var(--bs-progress-height); +} + +.progress-bar-animated { + animation: 1s linear infinite progress-bar-stripes; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none; + } +} + +.list-group { + --bs-list-group-color: #212529; + --bs-list-group-bg: #fff; + --bs-list-group-border-color: rgba(0, 0, 0, 0.125); + --bs-list-group-border-width: 1px; + --bs-list-group-border-radius: 0.375rem; + --bs-list-group-item-padding-x: 1rem; + --bs-list-group-item-padding-y: 0.5rem; + --bs-list-group-action-color: #495057; + --bs-list-group-action-hover-color: #495057; + --bs-list-group-action-hover-bg: #f8f9fa; + --bs-list-group-action-active-color: #212529; + --bs-list-group-action-active-bg: #e9ecef; + --bs-list-group-disabled-color: #6c757d; + --bs-list-group-disabled-bg: #fff; + --bs-list-group-active-color: #fff; + --bs-list-group-active-bg: #2937f0; + --bs-list-group-active-border-color: #2937f0; + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: var(--bs-list-group-border-radius); +} + +.list-group-numbered { + list-style-type: none; + counter-reset: section; +} +.list-group-numbered > .list-group-item::before { + content: counters(section, ".") ". "; + counter-increment: section; +} + +.list-group-item-action { + width: 100%; + color: var(--bs-list-group-action-color); + text-align: inherit; +} +.list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: var(--bs-list-group-action-hover-color); + text-decoration: none; + background-color: var(--bs-list-group-action-hover-bg); +} +.list-group-item-action:active { + color: var(--bs-list-group-action-active-color); + background-color: var(--bs-list-group-action-active-bg); +} + +.list-group-item { + position: relative; + display: block; + padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x); + color: var(--bs-list-group-color); + text-decoration: none; + background-color: var(--bs-list-group-bg); + border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color); +} +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} +.list-group-item.disabled, .list-group-item:disabled { + color: var(--bs-list-group-disabled-color); + pointer-events: none; + background-color: var(--bs-list-group-disabled-bg); +} +.list-group-item.active { + z-index: 2; + color: var(--bs-list-group-active-color); + background-color: var(--bs-list-group-active-bg); + border-color: var(--bs-list-group-active-border-color); +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: calc(-1 * var(--bs-list-group-border-width)); + border-top-width: var(--bs-list-group-border-width); +} + +.list-group-horizontal { + flex-direction: row; +} +.list-group-horizontal > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; +} +.list-group-horizontal > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; +} +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +.list-group-flush { + border-radius: 0; +} +.list-group-flush > .list-group-item { + border-width: 0 0 var(--bs-list-group-border-width); +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} + +.list-group-item-primary { + color: #192190; + background-color: #d4d7fc; +} +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #192190; + background-color: #bfc2e3; +} +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #192190; + border-color: #192190; +} + +.list-group-item-secondary { + color: #5f1088; + background-color: #ecd1f9; +} +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #5f1088; + background-color: #d4bce0; +} +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #5f1088; + border-color: #5f1088; +} + +.list-group-item-success { + color: #0f5132; + background-color: #d1e7dd; +} +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #0f5132; + background-color: #bcd0c7; +} +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #0f5132; + border-color: #0f5132; +} + +.list-group-item-info { + color: #055160; + background-color: #cff4fc; +} +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #055160; + background-color: #badce3; +} +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #055160; + border-color: #055160; +} + +.list-group-item-warning { + color: #664d03; + background-color: #fff3cd; +} +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #664d03; + background-color: #e6dbb9; +} +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #664d03; + border-color: #664d03; +} + +.list-group-item-danger { + color: #842029; + background-color: #f8d7da; +} +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #842029; + background-color: #dfc2c4; +} +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #842029; + border-color: #842029; +} + +.list-group-item-light { + color: #636464; + background-color: #fefefe; +} +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #636464; + background-color: #e5e5e5; +} +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #636464; + border-color: #636464; +} + +.list-group-item-dark { + color: #141619; + background-color: #d3d3d4; +} +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #141619; + background-color: #bebebf; +} +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #141619; + border-color: #141619; +} + +.btn-close { + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: #000; + background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat; + border: 0; + border-radius: 0.375rem; + opacity: 0.5; +} +.btn-close:hover { + color: #000; + text-decoration: none; + opacity: 0.75; +} +.btn-close:focus { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(41, 55, 240, 0.25); + opacity: 1; +} +.btn-close:disabled, .btn-close.disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + opacity: 0.25; +} + +.btn-close-white { + filter: invert(1) grayscale(100%) brightness(200%); +} + +.toast { + --bs-toast-zindex: 1090; + --bs-toast-padding-x: 0.75rem; + --bs-toast-padding-y: 0.5rem; + --bs-toast-spacing: 1.5rem; + --bs-toast-max-width: 350px; + --bs-toast-font-size: 0.875rem; + --bs-toast-color: ; + --bs-toast-bg: rgba(255, 255, 255, 0.85); + --bs-toast-border-width: 1px; + --bs-toast-border-color: var(--bs-border-color-translucent); + --bs-toast-border-radius: 0.375rem; + --bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-toast-header-color: #6c757d; + --bs-toast-header-bg: rgba(255, 255, 255, 0.85); + --bs-toast-header-border-color: rgba(0, 0, 0, 0.05); + width: var(--bs-toast-max-width); + max-width: 100%; + font-size: var(--bs-toast-font-size); + color: var(--bs-toast-color); + pointer-events: auto; + background-color: var(--bs-toast-bg); + background-clip: padding-box; + border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); + box-shadow: var(--bs-toast-box-shadow); + border-radius: var(--bs-toast-border-radius); +} +.toast.showing { + opacity: 0; +} +.toast:not(.show) { + display: none; +} + +.toast-container { + --bs-toast-zindex: 1090; + position: absolute; + z-index: var(--bs-toast-zindex); + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none; +} +.toast-container > :not(:last-child) { + margin-bottom: var(--bs-toast-spacing); +} + +.toast-header { + display: flex; + align-items: center; + padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); + color: var(--bs-toast-header-color); + background-color: var(--bs-toast-header-bg); + background-clip: padding-box; + border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color); + border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); + border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); +} +.toast-header .btn-close { + margin-right: calc(-0.5 * var(--bs-toast-padding-x)); + margin-left: var(--bs-toast-padding-x); +} + +.toast-body { + padding: var(--bs-toast-padding-x); + word-wrap: break-word; +} + +.modal { + --bs-modal-zindex: 1055; + --bs-modal-width: 500px; + --bs-modal-padding: 1rem; + --bs-modal-margin: 0.5rem; + --bs-modal-color: ; + --bs-modal-bg: #fff; + --bs-modal-border-color: var(--bs-border-color-translucent); + --bs-modal-border-width: 1px; + --bs-modal-border-radius: 0.5rem; + --bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-modal-inner-border-radius: calc(0.5rem - 1px); + --bs-modal-header-padding-x: 1rem; + --bs-modal-header-padding-y: 1rem; + --bs-modal-header-padding: 1rem 1rem; + --bs-modal-header-border-color: var(--bs-border-color); + --bs-modal-header-border-width: 1px; + --bs-modal-title-line-height: 1.5; + --bs-modal-footer-gap: 0.5rem; + --bs-modal-footer-bg: ; + --bs-modal-footer-border-color: var(--bs-border-color); + --bs-modal-footer-border-width: 1px; + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-modal-zindex); + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: var(--bs-modal-margin); + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + transform: none; +} +.modal.modal-static .modal-dialog { + transform: scale(1.02); +} + +.modal-dialog-scrollable { + height: calc(100% - var(--bs-modal-margin) * 2); +} +.modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden; +} +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - var(--bs-modal-margin) * 2); +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + color: var(--bs-modal-color); + pointer-events: auto; + background-color: var(--bs-modal-bg); + background-clip: padding-box; + border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); + border-radius: var(--bs-modal-border-radius); + outline: 0; +} + +.modal-backdrop { + --bs-backdrop-zindex: 1050; + --bs-backdrop-bg: #000; + --bs-backdrop-opacity: 0.5; + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-backdrop-zindex); + width: 100vw; + height: 100vh; + background-color: var(--bs-backdrop-bg); +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: var(--bs-backdrop-opacity); +} + +.modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: space-between; + padding: var(--bs-modal-header-padding); + border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); + border-top-left-radius: var(--bs-modal-inner-border-radius); + border-top-right-radius: var(--bs-modal-inner-border-radius); +} +.modal-header .btn-close { + padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5); + margin: calc(-0.5 * var(--bs-modal-header-padding-y)) calc(-0.5 * var(--bs-modal-header-padding-x)) calc(-0.5 * var(--bs-modal-header-padding-y)) auto; +} + +.modal-title { + margin-bottom: 0; + line-height: var(--bs-modal-title-line-height); +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: var(--bs-modal-padding); +} + +.modal-footer { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5); + background-color: var(--bs-modal-footer-bg); + border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); + border-bottom-right-radius: var(--bs-modal-inner-border-radius); + border-bottom-left-radius: var(--bs-modal-inner-border-radius); +} +.modal-footer > * { + margin: calc(var(--bs-modal-footer-gap) * 0.5); +} + +@media (min-width: 576px) { + .modal { + --bs-modal-margin: 1.75rem; + --bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + } + .modal-dialog { + max-width: var(--bs-modal-width); + margin-right: auto; + margin-left: auto; + } + .modal-sm { + --bs-modal-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + --bs-modal-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + --bs-modal-width: 1140px; + } +} +.modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; +} +.modal-fullscreen .modal-content { + height: 100%; + border: 0; + border-radius: 0; +} +.modal-fullscreen .modal-header, +.modal-fullscreen .modal-footer { + border-radius: 0; +} +.modal-fullscreen .modal-body { + overflow-y: auto; +} + +@media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-header, + .modal-fullscreen-sm-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 767.98px) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-md-down .modal-header, + .modal-fullscreen-md-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-header, + .modal-fullscreen-lg-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-header, + .modal-fullscreen-xl-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-header, + .modal-fullscreen-xxl-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } +} +.tooltip { + --bs-tooltip-zindex: 1080; + --bs-tooltip-max-width: 200px; + --bs-tooltip-padding-x: 0.5rem; + --bs-tooltip-padding-y: 0.25rem; + --bs-tooltip-margin: ; + --bs-tooltip-font-size: 0.875rem; + --bs-tooltip-color: #fff; + --bs-tooltip-bg: #000; + --bs-tooltip-border-radius: 0.375rem; + --bs-tooltip-opacity: 0.9; + --bs-tooltip-arrow-width: 0.8rem; + --bs-tooltip-arrow-height: 0.4rem; + z-index: var(--bs-tooltip-zindex); + display: block; + padding: var(--bs-tooltip-arrow-height); + margin: var(--bs-tooltip-margin); + font-family: "Mulish", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 500; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-tooltip-font-size); + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: var(--bs-tooltip-opacity); +} +.tooltip .tooltip-arrow { + display: block; + width: var(--bs-tooltip-arrow-width); + height: var(--bs-tooltip-arrow-height); +} +.tooltip .tooltip-arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow { + bottom: 0; +} +.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { + top: -1px; + border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-top-color: var(--bs-tooltip-bg); +} + +/* rtl:begin:ignore */ +.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { + left: 0; + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { + right: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-right-color: var(--bs-tooltip-bg); +} + +/* rtl:end:ignore */ +.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow { + top: 0; +} +.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { + bottom: -1px; + border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-bottom-color: var(--bs-tooltip-bg); +} + +/* rtl:begin:ignore */ +.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { + right: 0; + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { + left: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-left-color: var(--bs-tooltip-bg); +} + +/* rtl:end:ignore */ +.tooltip-inner { + max-width: var(--bs-tooltip-max-width); + padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); + color: var(--bs-tooltip-color); + text-align: center; + background-color: var(--bs-tooltip-bg); + border-radius: var(--bs-tooltip-border-radius); +} + +.popover { + --bs-popover-zindex: 1070; + --bs-popover-max-width: 276px; + --bs-popover-font-size: 0.875rem; + --bs-popover-bg: #fff; + --bs-popover-border-width: 1px; + --bs-popover-border-color: var(--bs-border-color-translucent); + --bs-popover-border-radius: 0.5rem; + --bs-popover-inner-border-radius: calc(0.5rem - 1px); + --bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-popover-header-padding-x: 1rem; + --bs-popover-header-padding-y: 0.5rem; + --bs-popover-header-font-size: 1rem; + --bs-popover-header-color: ; + --bs-popover-header-bg: #f0f0f0; + --bs-popover-body-padding-x: 1rem; + --bs-popover-body-padding-y: 1rem; + --bs-popover-body-color: #212529; + --bs-popover-arrow-width: 1rem; + --bs-popover-arrow-height: 0.5rem; + --bs-popover-arrow-border: var(--bs-popover-border-color); + z-index: var(--bs-popover-zindex); + display: block; + max-width: var(--bs-popover-max-width); + font-family: "Mulish", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 500; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-popover-font-size); + word-wrap: break-word; + background-color: var(--bs-popover-bg); + background-clip: padding-box; + border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-radius: var(--bs-popover-border-radius); +} +.popover .popover-arrow { + display: block; + width: var(--bs-popover-arrow-width); + height: var(--bs-popover-arrow-height); +} +.popover .popover-arrow::before, .popover .popover-arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; + border-width: 0; +} + +.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow { + bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +} +.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { + border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; +} +.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before { + bottom: 0; + border-top-color: var(--bs-popover-arrow-border); +} +.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { + bottom: var(--bs-popover-border-width); + border-top-color: var(--bs-popover-bg); +} + +/* rtl:begin:ignore */ +.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow { + left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; +} +.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before { + left: 0; + border-right-color: var(--bs-popover-arrow-border); +} +.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { + left: var(--bs-popover-border-width); + border-right-color: var(--bs-popover-bg); +} + +/* rtl:end:ignore */ +.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow { + top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +} +.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { + border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); +} +.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before { + top: 0; + border-bottom-color: var(--bs-popover-arrow-border); +} +.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { + top: var(--bs-popover-border-width); + border-bottom-color: var(--bs-popover-bg); +} +.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: var(--bs-popover-arrow-width); + margin-left: calc(-0.5 * var(--bs-popover-arrow-width)); + content: ""; + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg); +} + +/* rtl:begin:ignore */ +.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow { + right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); +} +.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before { + right: 0; + border-left-color: var(--bs-popover-arrow-border); +} +.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { + right: var(--bs-popover-border-width); + border-left-color: var(--bs-popover-bg); +} + +/* rtl:end:ignore */ +.popover-header { + padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x); + margin-bottom: 0; + font-size: var(--bs-popover-header-font-size); + color: var(--bs-popover-header-color); + background-color: var(--bs-popover-header-bg); + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-top-left-radius: var(--bs-popover-inner-border-radius); + border-top-right-radius: var(--bs-popover-inner-border-radius); +} +.popover-header:empty { + display: none; +} + +.popover-body { + padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); + color: var(--bs-popover-body-color); +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-start, +.carousel-fade .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; +} +.carousel-fade .active.carousel-item-start, +.carousel-fade .active.carousel-item-end { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-start, + .carousel-fade .active.carousel-item-end { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + padding: 0; + color: #fff; + text-align: center; + background: none; + border: 0; + opacity: 0.5; + transition: opacity 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; + } +} +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 2rem; + height: 2rem; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +/* rtl:options: { + "autoRename": true, + "stringMap":[ { + "name" : "prev-next", + "search" : "prev", + "replace" : "next" + } ] +} */ +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + margin-right: 15%; + margin-bottom: 1rem; + margin-left: 15%; + list-style: none; +} +.carousel-indicators [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + padding: 0; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-indicators [data-bs-target] { + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 1.25rem; + left: 15%; + padding-top: 1.25rem; + padding-bottom: 1.25rem; + color: #fff; + text-align: center; +} + +.carousel-dark .carousel-control-prev-icon, +.carousel-dark .carousel-control-next-icon { + filter: invert(1) grayscale(100); +} +.carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000; +} +.carousel-dark .carousel-caption { + color: #000; +} + +.spinner-grow, +.spinner-border { + display: inline-block; + width: var(--bs-spinner-width); + height: var(--bs-spinner-height); + vertical-align: var(--bs-spinner-vertical-align); + border-radius: 50%; + animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name); +} + +@keyframes spinner-border { + to { + transform: rotate(360deg) /* rtl:ignore */; + } +} +.spinner-border { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-border-width: 0.25em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-border; + border: var(--bs-spinner-border-width) solid currentcolor; + border-right-color: transparent; +} + +.spinner-border-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; + --bs-spinner-border-width: 0.2em; +} + +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} +.spinner-grow { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-grow; + background-color: currentcolor; + opacity: 0; +} + +.spinner-grow-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; +} + +@media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + --bs-spinner-animation-speed: 1.5s; + } +} +.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm { + --bs-offcanvas-zindex: 1045; + --bs-offcanvas-width: 400px; + --bs-offcanvas-height: 30vh; + --bs-offcanvas-padding-x: 1rem; + --bs-offcanvas-padding-y: 1rem; + --bs-offcanvas-color: ; + --bs-offcanvas-bg: #fff; + --bs-offcanvas-border-width: 1px; + --bs-offcanvas-border-color: var(--bs-border-color-translucent); + --bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); +} + +@media (max-width: 575.98px) { + .offcanvas-sm { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-sm { + transition: none; + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show { + visibility: visible; + } +} +@media (min-width: 576px) { + .offcanvas-sm { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-sm .offcanvas-header { + display: none; + } + .offcanvas-sm .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 767.98px) { + .offcanvas-md { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-md { + transition: none; + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 767.98px) { + .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 767.98px) { + .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show { + visibility: visible; + } +} +@media (min-width: 768px) { + .offcanvas-md { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-md .offcanvas-header { + display: none; + } + .offcanvas-md .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 991.98px) { + .offcanvas-lg { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-lg { + transition: none; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show { + visibility: visible; + } +} +@media (min-width: 992px) { + .offcanvas-lg { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-lg .offcanvas-header { + display: none; + } + .offcanvas-lg .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 1199.98px) { + .offcanvas-xl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xl { + transition: none; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show { + visibility: visible; + } +} +@media (min-width: 1200px) { + .offcanvas-xl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xl .offcanvas-header { + display: none; + } + .offcanvas-xl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 1399.98px) { + .offcanvas-xxl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; + } +} +@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xxl { + transition: none; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) { + transform: none; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show { + visibility: visible; + } +} +@media (min-width: 1400px) { + .offcanvas-xxl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xxl .offcanvas-header { + display: none; + } + .offcanvas-xxl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +.offcanvas { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none; + } +} +.offcanvas.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); +} +.offcanvas.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); +} +.offcanvas.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); +} +.offcanvas.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); +} +.offcanvas.showing, .offcanvas.show:not(.hiding) { + transform: none; +} +.offcanvas.showing, .offcanvas.hiding, .offcanvas.show { + visibility: visible; +} + +.offcanvas-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} +.offcanvas-backdrop.fade { + opacity: 0; +} +.offcanvas-backdrop.show { + opacity: 0.5; +} + +.offcanvas-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); +} +.offcanvas-header .btn-close { + padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5); + margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y)); + margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x)); + margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y)); +} + +.offcanvas-title { + margin-bottom: 0; + line-height: 1.5; +} + +.offcanvas-body { + flex-grow: 1; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); + overflow-y: auto; +} + +.placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentcolor; + opacity: 0.5; +} +.placeholder.btn::before { + display: inline-block; + content: ""; +} + +.placeholder-xs { + min-height: 0.6em; +} + +.placeholder-sm { + min-height: 0.8em; +} + +.placeholder-lg { + min-height: 1.2em; +} + +.placeholder-glow .placeholder { + animation: placeholder-glow 2s ease-in-out infinite; +} + +@keyframes placeholder-glow { + 50% { + opacity: 0.2; + } +} +.placeholder-wave { + -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + -webkit-mask-size: 200% 100%; + mask-size: 200% 100%; + animation: placeholder-wave 2s linear infinite; +} + +@keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0%; + } +} +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.text-bg-primary { + color: #fff !important; + background-color: RGBA(41, 55, 240, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-secondary { + color: #fff !important; + background-color: RGBA(159, 26, 226, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-success { + color: #fff !important; + background-color: RGBA(25, 135, 84, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-info { + color: #000 !important; + background-color: RGBA(13, 202, 240, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-warning { + color: #000 !important; + background-color: RGBA(255, 193, 7, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-danger { + color: #fff !important; + background-color: RGBA(220, 53, 69, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-light { + color: #000 !important; + background-color: RGBA(248, 249, 250, var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-dark { + color: #fff !important; + background-color: RGBA(33, 37, 41, var(--bs-bg-opacity, 1)) !important; +} + +.link-primary { + color: #2937f0 !important; +} +.link-primary:hover, .link-primary:focus { + color: #212cc0 !important; +} + +.link-secondary { + color: #9f1ae2 !important; +} +.link-secondary:hover, .link-secondary:focus { + color: #7f15b5 !important; +} + +.link-success { + color: #198754 !important; +} +.link-success:hover, .link-success:focus { + color: #146c43 !important; +} + +.link-info { + color: #0dcaf0 !important; +} +.link-info:hover, .link-info:focus { + color: #3dd5f3 !important; +} + +.link-warning { + color: #ffc107 !important; +} +.link-warning:hover, .link-warning:focus { + color: #ffcd39 !important; +} + +.link-danger { + color: #dc3545 !important; +} +.link-danger:hover, .link-danger:focus { + color: #b02a37 !important; +} + +.link-light { + color: #f8f9fa !important; +} +.link-light:hover, .link-light:focus { + color: #f9fafb !important; +} + +.link-dark { + color: #212529 !important; +} +.link-dark:hover, .link-dark:focus { + color: #1a1e21 !important; +} + +.ratio { + position: relative; + width: 100%; +} +.ratio::before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: ""; +} +.ratio > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.ratio-1x1 { + --bs-aspect-ratio: 100%; +} + +.ratio-4x3 { + --bs-aspect-ratio: 75%; +} + +.ratio-16x9 { + --bs-aspect-ratio: 56.25%; +} + +.ratio-21x9 { + --bs-aspect-ratio: 42.8571428571%; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +.sticky-top { + position: sticky; + top: 0; + z-index: 1020; +} + +.sticky-bottom { + position: sticky; + bottom: 0; + z-index: 1020; +} + +@media (min-width: 576px) { + .sticky-sm-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-sm-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 768px) { + .sticky-md-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-md-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 992px) { + .sticky-lg-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-lg-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1200px) { + .sticky-xl-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xl-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1400px) { + .sticky-xxl-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xxl-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +.hstack { + display: flex; + flex-direction: row; + align-items: center; + align-self: stretch; +} + +.vstack { + display: flex; + flex: 1 1 auto; + flex-direction: column; + align-self: stretch; +} + +.visually-hidden, +.visually-hidden-focusable:not(:focus):not(:focus-within) { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: ""; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.vr { + display: inline-block; + align-self: stretch; + width: 1px; + min-height: 1em; + background-color: currentcolor; + opacity: 0.25; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.float-start { + float: left !important; +} + +.float-end { + float: right !important; +} + +.float-none { + float: none !important; +} + +.opacity-0 { + opacity: 0 !important; +} + +.opacity-25 { + opacity: 0.25 !important; +} + +.opacity-50 { + opacity: 0.5 !important; +} + +.opacity-75 { + opacity: 0.75 !important; +} + +.opacity-100 { + opacity: 1 !important; +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.overflow-visible { + overflow: visible !important; +} + +.overflow-scroll { + overflow: scroll !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-grid { + display: grid !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +.d-none { + display: none !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: sticky !important; +} + +.top-0 { + top: 0 !important; +} + +.top-50 { + top: 50% !important; +} + +.top-100 { + top: 100% !important; +} + +.bottom-0 { + bottom: 0 !important; +} + +.bottom-50 { + bottom: 50% !important; +} + +.bottom-100 { + bottom: 100% !important; +} + +.start-0 { + left: 0 !important; +} + +.start-50 { + left: 50% !important; +} + +.start-100 { + left: 100% !important; +} + +.end-0 { + right: 0 !important; +} + +.end-50 { + right: 50% !important; +} + +.end-100 { + right: 100% !important; +} + +.translate-middle { + transform: translate(-50%, -50%) !important; +} + +.translate-middle-x { + transform: translateX(-50%) !important; +} + +.translate-middle-y { + transform: translateY(-50%) !important; +} + +.border { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top { + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-end { + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-end-0 { + border-right: 0 !important; +} + +.border-bottom { + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-start { + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-start-0 { + border-left: 0 !important; +} + +.border-primary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important; +} + +.border-secondary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important; +} + +.border-success { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important; +} + +.border-info { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; +} + +.border-warning { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important; +} + +.border-danger { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important; +} + +.border-light { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important; +} + +.border-dark { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; +} + +.border-white { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important; +} + +.border-1 { + --bs-border-width: 1px; +} + +.border-2 { + --bs-border-width: 2px; +} + +.border-3 { + --bs-border-width: 3px; +} + +.border-4 { + --bs-border-width: 4px; +} + +.border-5 { + --bs-border-width: 5px; +} + +.border-opacity-10 { + --bs-border-opacity: 0.1; +} + +.border-opacity-25 { + --bs-border-opacity: 0.25; +} + +.border-opacity-50 { + --bs-border-opacity: 0.5; +} + +.border-opacity-75 { + --bs-border-opacity: 0.75; +} + +.border-opacity-100 { + --bs-border-opacity: 1; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.vw-100 { + width: 100vw !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.vh-100 { + height: 100vh !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.justify-content-evenly { + justify-content: space-evenly !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +.order-first { + order: -1 !important; +} + +.order-0 { + order: 0 !important; +} + +.order-1 { + order: 1 !important; +} + +.order-2 { + order: 2 !important; +} + +.order-3 { + order: 3 !important; +} + +.order-4 { + order: 4 !important; +} + +.order-5 { + order: 5 !important; +} + +.order-last { + order: 6 !important; +} + +.m-0 { + margin: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mt-3 { + margin-top: 1rem !important; +} + +.mt-4 { + margin-top: 1.5rem !important; +} + +.mt-5 { + margin-top: 3rem !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.me-0 { + margin-right: 0 !important; +} + +.me-1 { + margin-right: 0.25rem !important; +} + +.me-2 { + margin-right: 0.5rem !important; +} + +.me-3 { + margin-right: 1rem !important; +} + +.me-4 { + margin-right: 1.5rem !important; +} + +.me-5 { + margin-right: 3rem !important; +} + +.me-auto { + margin-right: auto !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.mb-3 { + margin-bottom: 1rem !important; +} + +.mb-4 { + margin-bottom: 1.5rem !important; +} + +.mb-5 { + margin-bottom: 3rem !important; +} + +.mb-auto { + margin-bottom: auto !important; +} + +.ms-0 { + margin-left: 0 !important; +} + +.ms-1 { + margin-left: 0.25rem !important; +} + +.ms-2 { + margin-left: 0.5rem !important; +} + +.ms-3 { + margin-left: 1rem !important; +} + +.ms-4 { + margin-left: 1.5rem !important; +} + +.ms-5 { + margin-left: 3rem !important; +} + +.ms-auto { + margin-left: auto !important; +} + +.p-0 { + padding: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pt-3 { + padding-top: 1rem !important; +} + +.pt-4 { + padding-top: 1.5rem !important; +} + +.pt-5 { + padding-top: 3rem !important; +} + +.pe-0 { + padding-right: 0 !important; +} + +.pe-1 { + padding-right: 0.25rem !important; +} + +.pe-2 { + padding-right: 0.5rem !important; +} + +.pe-3 { + padding-right: 1rem !important; +} + +.pe-4 { + padding-right: 1.5rem !important; +} + +.pe-5 { + padding-right: 3rem !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pb-3 { + padding-bottom: 1rem !important; +} + +.pb-4 { + padding-bottom: 1.5rem !important; +} + +.pb-5 { + padding-bottom: 3rem !important; +} + +.ps-0 { + padding-left: 0 !important; +} + +.ps-1 { + padding-left: 0.25rem !important; +} + +.ps-2 { + padding-left: 0.5rem !important; +} + +.ps-3 { + padding-left: 1rem !important; +} + +.ps-4 { + padding-left: 1.5rem !important; +} + +.ps-5 { + padding-left: 3rem !important; +} + +.gap-0 { + gap: 0 !important; +} + +.gap-1 { + gap: 0.25rem !important; +} + +.gap-2 { + gap: 0.5rem !important; +} + +.gap-3 { + gap: 1rem !important; +} + +.gap-4 { + gap: 1.5rem !important; +} + +.gap-5 { + gap: 3rem !important; +} + +.font-monospace { + font-family: var(--bs-font-monospace) !important; +} + +.fs-1 { + font-size: calc(1.375rem + 1.5vw) !important; +} + +.fs-2 { + font-size: calc(1.325rem + 0.9vw) !important; +} + +.fs-3 { + font-size: calc(1.3rem + 0.6vw) !important; +} + +.fs-4 { + font-size: calc(1.275rem + 0.3vw) !important; +} + +.fs-5 { + font-size: 1.25rem !important; +} + +.fs-6 { + font-size: 1rem !important; +} + +.fst-italic { + font-style: italic !important; +} + +.fst-normal { + font-style: normal !important; +} + +.fw-light { + font-weight: 300 !important; +} + +.fw-lighter { + font-weight: lighter !important; +} + +.fw-normal { + font-weight: 500 !important; +} + +.fw-bold { + font-weight: 700 !important; +} + +.fw-semibold { + font-weight: 600 !important; +} + +.fw-bolder { + font-weight: bolder !important; +} + +.lh-1 { + line-height: 1 !important; +} + +.lh-sm { + line-height: 1.25 !important; +} + +.lh-base { + line-height: 1.5 !important; +} + +.lh-lg { + line-height: 2 !important; +} + +.text-start { + text-align: left !important; +} + +.text-end { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-decoration-underline { + text-decoration: underline !important; +} + +.text-decoration-line-through { + text-decoration: line-through !important; +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +/* rtl:begin:remove */ +.text-break { + word-wrap: break-word !important; + word-break: break-word !important; +} + +/* rtl:end:remove */ +.text-primary { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; +} + +.text-secondary { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; +} + +.text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; +} + +.text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; +} + +.text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; +} + +.text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; +} + +.text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; +} + +.text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; +} + +.text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; +} + +.text-white { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; +} + +.text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; +} + +.text-muted { + --bs-text-opacity: 1; + color: #6c757d !important; +} + +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-reset { + --bs-text-opacity: 1; + color: inherit !important; +} + +.text-opacity-25 { + --bs-text-opacity: 0.25; +} + +.text-opacity-50 { + --bs-text-opacity: 0.5; +} + +.text-opacity-75 { + --bs-text-opacity: 0.75; +} + +.text-opacity-100 { + --bs-text-opacity: 1; +} + +.bg-primary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-success { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-warning { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-danger { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-light { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-black { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-white { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-body { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important; +} + +.bg-opacity-10 { + --bs-bg-opacity: 0.1; +} + +.bg-opacity-25 { + --bs-bg-opacity: 0.25; +} + +.bg-opacity-50 { + --bs-bg-opacity: 0.5; +} + +.bg-opacity-75 { + --bs-bg-opacity: 0.75; +} + +.bg-opacity-100 { + --bs-bg-opacity: 1; +} + +.bg-gradient { + background-image: var(--bs-gradient) !important; +} + +.user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + user-select: all !important; +} + +.user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + user-select: auto !important; +} + +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + user-select: none !important; +} + +.pe-none { + pointer-events: none !important; +} + +.pe-auto { + pointer-events: auto !important; +} + +.rounded { + border-radius: var(--bs-border-radius) !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.rounded-1 { + border-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-2 { + border-radius: var(--bs-border-radius) !important; +} + +.rounded-3 { + border-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-4 { + border-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-5 { + border-radius: var(--bs-border-radius-2xl) !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: var(--bs-border-radius-pill) !important; +} + +.rounded-top { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} + +.rounded-end { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} + +.rounded-bottom { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} + +.rounded-start { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media (min-width: 576px) { + .float-sm-start { + float: left !important; + } + .float-sm-end { + float: right !important; + } + .float-sm-none { + float: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-grid { + display: grid !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline-flex { + display: inline-flex !important; + } + .d-sm-none { + display: none !important; + } + .flex-sm-fill { + flex: 1 1 auto !important; + } + .flex-sm-row { + flex-direction: row !important; + } + .flex-sm-column { + flex-direction: column !important; + } + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + .flex-sm-wrap { + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-sm-start { + justify-content: flex-start !important; + } + .justify-content-sm-end { + justify-content: flex-end !important; + } + .justify-content-sm-center { + justify-content: center !important; + } + .justify-content-sm-between { + justify-content: space-between !important; + } + .justify-content-sm-around { + justify-content: space-around !important; + } + .justify-content-sm-evenly { + justify-content: space-evenly !important; + } + .align-items-sm-start { + align-items: flex-start !important; + } + .align-items-sm-end { + align-items: flex-end !important; + } + .align-items-sm-center { + align-items: center !important; + } + .align-items-sm-baseline { + align-items: baseline !important; + } + .align-items-sm-stretch { + align-items: stretch !important; + } + .align-content-sm-start { + align-content: flex-start !important; + } + .align-content-sm-end { + align-content: flex-end !important; + } + .align-content-sm-center { + align-content: center !important; + } + .align-content-sm-between { + align-content: space-between !important; + } + .align-content-sm-around { + align-content: space-around !important; + } + .align-content-sm-stretch { + align-content: stretch !important; + } + .align-self-sm-auto { + align-self: auto !important; + } + .align-self-sm-start { + align-self: flex-start !important; + } + .align-self-sm-end { + align-self: flex-end !important; + } + .align-self-sm-center { + align-self: center !important; + } + .align-self-sm-baseline { + align-self: baseline !important; + } + .align-self-sm-stretch { + align-self: stretch !important; + } + .order-sm-first { + order: -1 !important; + } + .order-sm-0 { + order: 0 !important; + } + .order-sm-1 { + order: 1 !important; + } + .order-sm-2 { + order: 2 !important; + } + .order-sm-3 { + order: 3 !important; + } + .order-sm-4 { + order: 4 !important; + } + .order-sm-5 { + order: 5 !important; + } + .order-sm-last { + order: 6 !important; + } + .m-sm-0 { + margin: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-sm-0 { + margin-top: 0 !important; + } + .mt-sm-1 { + margin-top: 0.25rem !important; + } + .mt-sm-2 { + margin-top: 0.5rem !important; + } + .mt-sm-3 { + margin-top: 1rem !important; + } + .mt-sm-4 { + margin-top: 1.5rem !important; + } + .mt-sm-5 { + margin-top: 3rem !important; + } + .mt-sm-auto { + margin-top: auto !important; + } + .me-sm-0 { + margin-right: 0 !important; + } + .me-sm-1 { + margin-right: 0.25rem !important; + } + .me-sm-2 { + margin-right: 0.5rem !important; + } + .me-sm-3 { + margin-right: 1rem !important; + } + .me-sm-4 { + margin-right: 1.5rem !important; + } + .me-sm-5 { + margin-right: 3rem !important; + } + .me-sm-auto { + margin-right: auto !important; + } + .mb-sm-0 { + margin-bottom: 0 !important; + } + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + .mb-sm-3 { + margin-bottom: 1rem !important; + } + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + .mb-sm-5 { + margin-bottom: 3rem !important; + } + .mb-sm-auto { + margin-bottom: auto !important; + } + .ms-sm-0 { + margin-left: 0 !important; + } + .ms-sm-1 { + margin-left: 0.25rem !important; + } + .ms-sm-2 { + margin-left: 0.5rem !important; + } + .ms-sm-3 { + margin-left: 1rem !important; + } + .ms-sm-4 { + margin-left: 1.5rem !important; + } + .ms-sm-5 { + margin-left: 3rem !important; + } + .ms-sm-auto { + margin-left: auto !important; + } + .p-sm-0 { + padding: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-sm-0 { + padding-top: 0 !important; + } + .pt-sm-1 { + padding-top: 0.25rem !important; + } + .pt-sm-2 { + padding-top: 0.5rem !important; + } + .pt-sm-3 { + padding-top: 1rem !important; + } + .pt-sm-4 { + padding-top: 1.5rem !important; + } + .pt-sm-5 { + padding-top: 3rem !important; + } + .pe-sm-0 { + padding-right: 0 !important; + } + .pe-sm-1 { + padding-right: 0.25rem !important; + } + .pe-sm-2 { + padding-right: 0.5rem !important; + } + .pe-sm-3 { + padding-right: 1rem !important; + } + .pe-sm-4 { + padding-right: 1.5rem !important; + } + .pe-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-0 { + padding-bottom: 0 !important; + } + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + .pb-sm-3 { + padding-bottom: 1rem !important; + } + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + .pb-sm-5 { + padding-bottom: 3rem !important; + } + .ps-sm-0 { + padding-left: 0 !important; + } + .ps-sm-1 { + padding-left: 0.25rem !important; + } + .ps-sm-2 { + padding-left: 0.5rem !important; + } + .ps-sm-3 { + padding-left: 1rem !important; + } + .ps-sm-4 { + padding-left: 1.5rem !important; + } + .ps-sm-5 { + padding-left: 3rem !important; + } + .gap-sm-0 { + gap: 0 !important; + } + .gap-sm-1 { + gap: 0.25rem !important; + } + .gap-sm-2 { + gap: 0.5rem !important; + } + .gap-sm-3 { + gap: 1rem !important; + } + .gap-sm-4 { + gap: 1.5rem !important; + } + .gap-sm-5 { + gap: 3rem !important; + } + .text-sm-start { + text-align: left !important; + } + .text-sm-end { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .float-md-start { + float: left !important; + } + .float-md-end { + float: right !important; + } + .float-md-none { + float: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-grid { + display: grid !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline-flex { + display: inline-flex !important; + } + .d-md-none { + display: none !important; + } + .flex-md-fill { + flex: 1 1 auto !important; + } + .flex-md-row { + flex-direction: row !important; + } + .flex-md-column { + flex-direction: column !important; + } + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + .flex-md-grow-0 { + flex-grow: 0 !important; + } + .flex-md-grow-1 { + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + .flex-md-wrap { + flex-wrap: wrap !important; + } + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-md-start { + justify-content: flex-start !important; + } + .justify-content-md-end { + justify-content: flex-end !important; + } + .justify-content-md-center { + justify-content: center !important; + } + .justify-content-md-between { + justify-content: space-between !important; + } + .justify-content-md-around { + justify-content: space-around !important; + } + .justify-content-md-evenly { + justify-content: space-evenly !important; + } + .align-items-md-start { + align-items: flex-start !important; + } + .align-items-md-end { + align-items: flex-end !important; + } + .align-items-md-center { + align-items: center !important; + } + .align-items-md-baseline { + align-items: baseline !important; + } + .align-items-md-stretch { + align-items: stretch !important; + } + .align-content-md-start { + align-content: flex-start !important; + } + .align-content-md-end { + align-content: flex-end !important; + } + .align-content-md-center { + align-content: center !important; + } + .align-content-md-between { + align-content: space-between !important; + } + .align-content-md-around { + align-content: space-around !important; + } + .align-content-md-stretch { + align-content: stretch !important; + } + .align-self-md-auto { + align-self: auto !important; + } + .align-self-md-start { + align-self: flex-start !important; + } + .align-self-md-end { + align-self: flex-end !important; + } + .align-self-md-center { + align-self: center !important; + } + .align-self-md-baseline { + align-self: baseline !important; + } + .align-self-md-stretch { + align-self: stretch !important; + } + .order-md-first { + order: -1 !important; + } + .order-md-0 { + order: 0 !important; + } + .order-md-1 { + order: 1 !important; + } + .order-md-2 { + order: 2 !important; + } + .order-md-3 { + order: 3 !important; + } + .order-md-4 { + order: 4 !important; + } + .order-md-5 { + order: 5 !important; + } + .order-md-last { + order: 6 !important; + } + .m-md-0 { + margin: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-md-0 { + margin-top: 0 !important; + } + .mt-md-1 { + margin-top: 0.25rem !important; + } + .mt-md-2 { + margin-top: 0.5rem !important; + } + .mt-md-3 { + margin-top: 1rem !important; + } + .mt-md-4 { + margin-top: 1.5rem !important; + } + .mt-md-5 { + margin-top: 3rem !important; + } + .mt-md-auto { + margin-top: auto !important; + } + .me-md-0 { + margin-right: 0 !important; + } + .me-md-1 { + margin-right: 0.25rem !important; + } + .me-md-2 { + margin-right: 0.5rem !important; + } + .me-md-3 { + margin-right: 1rem !important; + } + .me-md-4 { + margin-right: 1.5rem !important; + } + .me-md-5 { + margin-right: 3rem !important; + } + .me-md-auto { + margin-right: auto !important; + } + .mb-md-0 { + margin-bottom: 0 !important; + } + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + .mb-md-3 { + margin-bottom: 1rem !important; + } + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + .mb-md-5 { + margin-bottom: 3rem !important; + } + .mb-md-auto { + margin-bottom: auto !important; + } + .ms-md-0 { + margin-left: 0 !important; + } + .ms-md-1 { + margin-left: 0.25rem !important; + } + .ms-md-2 { + margin-left: 0.5rem !important; + } + .ms-md-3 { + margin-left: 1rem !important; + } + .ms-md-4 { + margin-left: 1.5rem !important; + } + .ms-md-5 { + margin-left: 3rem !important; + } + .ms-md-auto { + margin-left: auto !important; + } + .p-md-0 { + padding: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-md-0 { + padding-top: 0 !important; + } + .pt-md-1 { + padding-top: 0.25rem !important; + } + .pt-md-2 { + padding-top: 0.5rem !important; + } + .pt-md-3 { + padding-top: 1rem !important; + } + .pt-md-4 { + padding-top: 1.5rem !important; + } + .pt-md-5 { + padding-top: 3rem !important; + } + .pe-md-0 { + padding-right: 0 !important; + } + .pe-md-1 { + padding-right: 0.25rem !important; + } + .pe-md-2 { + padding-right: 0.5rem !important; + } + .pe-md-3 { + padding-right: 1rem !important; + } + .pe-md-4 { + padding-right: 1.5rem !important; + } + .pe-md-5 { + padding-right: 3rem !important; + } + .pb-md-0 { + padding-bottom: 0 !important; + } + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + .pb-md-3 { + padding-bottom: 1rem !important; + } + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + .pb-md-5 { + padding-bottom: 3rem !important; + } + .ps-md-0 { + padding-left: 0 !important; + } + .ps-md-1 { + padding-left: 0.25rem !important; + } + .ps-md-2 { + padding-left: 0.5rem !important; + } + .ps-md-3 { + padding-left: 1rem !important; + } + .ps-md-4 { + padding-left: 1.5rem !important; + } + .ps-md-5 { + padding-left: 3rem !important; + } + .gap-md-0 { + gap: 0 !important; + } + .gap-md-1 { + gap: 0.25rem !important; + } + .gap-md-2 { + gap: 0.5rem !important; + } + .gap-md-3 { + gap: 1rem !important; + } + .gap-md-4 { + gap: 1.5rem !important; + } + .gap-md-5 { + gap: 3rem !important; + } + .text-md-start { + text-align: left !important; + } + .text-md-end { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .float-lg-start { + float: left !important; + } + .float-lg-end { + float: right !important; + } + .float-lg-none { + float: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-grid { + display: grid !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline-flex { + display: inline-flex !important; + } + .d-lg-none { + display: none !important; + } + .flex-lg-fill { + flex: 1 1 auto !important; + } + .flex-lg-row { + flex-direction: row !important; + } + .flex-lg-column { + flex-direction: column !important; + } + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + .flex-lg-wrap { + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-lg-start { + justify-content: flex-start !important; + } + .justify-content-lg-end { + justify-content: flex-end !important; + } + .justify-content-lg-center { + justify-content: center !important; + } + .justify-content-lg-between { + justify-content: space-between !important; + } + .justify-content-lg-around { + justify-content: space-around !important; + } + .justify-content-lg-evenly { + justify-content: space-evenly !important; + } + .align-items-lg-start { + align-items: flex-start !important; + } + .align-items-lg-end { + align-items: flex-end !important; + } + .align-items-lg-center { + align-items: center !important; + } + .align-items-lg-baseline { + align-items: baseline !important; + } + .align-items-lg-stretch { + align-items: stretch !important; + } + .align-content-lg-start { + align-content: flex-start !important; + } + .align-content-lg-end { + align-content: flex-end !important; + } + .align-content-lg-center { + align-content: center !important; + } + .align-content-lg-between { + align-content: space-between !important; + } + .align-content-lg-around { + align-content: space-around !important; + } + .align-content-lg-stretch { + align-content: stretch !important; + } + .align-self-lg-auto { + align-self: auto !important; + } + .align-self-lg-start { + align-self: flex-start !important; + } + .align-self-lg-end { + align-self: flex-end !important; + } + .align-self-lg-center { + align-self: center !important; + } + .align-self-lg-baseline { + align-self: baseline !important; + } + .align-self-lg-stretch { + align-self: stretch !important; + } + .order-lg-first { + order: -1 !important; + } + .order-lg-0 { + order: 0 !important; + } + .order-lg-1 { + order: 1 !important; + } + .order-lg-2 { + order: 2 !important; + } + .order-lg-3 { + order: 3 !important; + } + .order-lg-4 { + order: 4 !important; + } + .order-lg-5 { + order: 5 !important; + } + .order-lg-last { + order: 6 !important; + } + .m-lg-0 { + margin: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-lg-0 { + margin-top: 0 !important; + } + .mt-lg-1 { + margin-top: 0.25rem !important; + } + .mt-lg-2 { + margin-top: 0.5rem !important; + } + .mt-lg-3 { + margin-top: 1rem !important; + } + .mt-lg-4 { + margin-top: 1.5rem !important; + } + .mt-lg-5 { + margin-top: 3rem !important; + } + .mt-lg-auto { + margin-top: auto !important; + } + .me-lg-0 { + margin-right: 0 !important; + } + .me-lg-1 { + margin-right: 0.25rem !important; + } + .me-lg-2 { + margin-right: 0.5rem !important; + } + .me-lg-3 { + margin-right: 1rem !important; + } + .me-lg-4 { + margin-right: 1.5rem !important; + } + .me-lg-5 { + margin-right: 3rem !important; + } + .me-lg-auto { + margin-right: auto !important; + } + .mb-lg-0 { + margin-bottom: 0 !important; + } + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + .mb-lg-3 { + margin-bottom: 1rem !important; + } + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + .mb-lg-5 { + margin-bottom: 3rem !important; + } + .mb-lg-auto { + margin-bottom: auto !important; + } + .ms-lg-0 { + margin-left: 0 !important; + } + .ms-lg-1 { + margin-left: 0.25rem !important; + } + .ms-lg-2 { + margin-left: 0.5rem !important; + } + .ms-lg-3 { + margin-left: 1rem !important; + } + .ms-lg-4 { + margin-left: 1.5rem !important; + } + .ms-lg-5 { + margin-left: 3rem !important; + } + .ms-lg-auto { + margin-left: auto !important; + } + .p-lg-0 { + padding: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-lg-0 { + padding-top: 0 !important; + } + .pt-lg-1 { + padding-top: 0.25rem !important; + } + .pt-lg-2 { + padding-top: 0.5rem !important; + } + .pt-lg-3 { + padding-top: 1rem !important; + } + .pt-lg-4 { + padding-top: 1.5rem !important; + } + .pt-lg-5 { + padding-top: 3rem !important; + } + .pe-lg-0 { + padding-right: 0 !important; + } + .pe-lg-1 { + padding-right: 0.25rem !important; + } + .pe-lg-2 { + padding-right: 0.5rem !important; + } + .pe-lg-3 { + padding-right: 1rem !important; + } + .pe-lg-4 { + padding-right: 1.5rem !important; + } + .pe-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-0 { + padding-bottom: 0 !important; + } + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + .pb-lg-3 { + padding-bottom: 1rem !important; + } + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + .pb-lg-5 { + padding-bottom: 3rem !important; + } + .ps-lg-0 { + padding-left: 0 !important; + } + .ps-lg-1 { + padding-left: 0.25rem !important; + } + .ps-lg-2 { + padding-left: 0.5rem !important; + } + .ps-lg-3 { + padding-left: 1rem !important; + } + .ps-lg-4 { + padding-left: 1.5rem !important; + } + .ps-lg-5 { + padding-left: 3rem !important; + } + .gap-lg-0 { + gap: 0 !important; + } + .gap-lg-1 { + gap: 0.25rem !important; + } + .gap-lg-2 { + gap: 0.5rem !important; + } + .gap-lg-3 { + gap: 1rem !important; + } + .gap-lg-4 { + gap: 1.5rem !important; + } + .gap-lg-5 { + gap: 3rem !important; + } + .text-lg-start { + text-align: left !important; + } + .text-lg-end { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .float-xl-start { + float: left !important; + } + .float-xl-end { + float: right !important; + } + .float-xl-none { + float: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-grid { + display: grid !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline-flex { + display: inline-flex !important; + } + .d-xl-none { + display: none !important; + } + .flex-xl-fill { + flex: 1 1 auto !important; + } + .flex-xl-row { + flex-direction: row !important; + } + .flex-xl-column { + flex-direction: column !important; + } + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xl-wrap { + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xl-start { + justify-content: flex-start !important; + } + .justify-content-xl-end { + justify-content: flex-end !important; + } + .justify-content-xl-center { + justify-content: center !important; + } + .justify-content-xl-between { + justify-content: space-between !important; + } + .justify-content-xl-around { + justify-content: space-around !important; + } + .justify-content-xl-evenly { + justify-content: space-evenly !important; + } + .align-items-xl-start { + align-items: flex-start !important; + } + .align-items-xl-end { + align-items: flex-end !important; + } + .align-items-xl-center { + align-items: center !important; + } + .align-items-xl-baseline { + align-items: baseline !important; + } + .align-items-xl-stretch { + align-items: stretch !important; + } + .align-content-xl-start { + align-content: flex-start !important; + } + .align-content-xl-end { + align-content: flex-end !important; + } + .align-content-xl-center { + align-content: center !important; + } + .align-content-xl-between { + align-content: space-between !important; + } + .align-content-xl-around { + align-content: space-around !important; + } + .align-content-xl-stretch { + align-content: stretch !important; + } + .align-self-xl-auto { + align-self: auto !important; + } + .align-self-xl-start { + align-self: flex-start !important; + } + .align-self-xl-end { + align-self: flex-end !important; + } + .align-self-xl-center { + align-self: center !important; + } + .align-self-xl-baseline { + align-self: baseline !important; + } + .align-self-xl-stretch { + align-self: stretch !important; + } + .order-xl-first { + order: -1 !important; + } + .order-xl-0 { + order: 0 !important; + } + .order-xl-1 { + order: 1 !important; + } + .order-xl-2 { + order: 2 !important; + } + .order-xl-3 { + order: 3 !important; + } + .order-xl-4 { + order: 4 !important; + } + .order-xl-5 { + order: 5 !important; + } + .order-xl-last { + order: 6 !important; + } + .m-xl-0 { + margin: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xl-0 { + margin-top: 0 !important; + } + .mt-xl-1 { + margin-top: 0.25rem !important; + } + .mt-xl-2 { + margin-top: 0.5rem !important; + } + .mt-xl-3 { + margin-top: 1rem !important; + } + .mt-xl-4 { + margin-top: 1.5rem !important; + } + .mt-xl-5 { + margin-top: 3rem !important; + } + .mt-xl-auto { + margin-top: auto !important; + } + .me-xl-0 { + margin-right: 0 !important; + } + .me-xl-1 { + margin-right: 0.25rem !important; + } + .me-xl-2 { + margin-right: 0.5rem !important; + } + .me-xl-3 { + margin-right: 1rem !important; + } + .me-xl-4 { + margin-right: 1.5rem !important; + } + .me-xl-5 { + margin-right: 3rem !important; + } + .me-xl-auto { + margin-right: auto !important; + } + .mb-xl-0 { + margin-bottom: 0 !important; + } + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xl-3 { + margin-bottom: 1rem !important; + } + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xl-5 { + margin-bottom: 3rem !important; + } + .mb-xl-auto { + margin-bottom: auto !important; + } + .ms-xl-0 { + margin-left: 0 !important; + } + .ms-xl-1 { + margin-left: 0.25rem !important; + } + .ms-xl-2 { + margin-left: 0.5rem !important; + } + .ms-xl-3 { + margin-left: 1rem !important; + } + .ms-xl-4 { + margin-left: 1.5rem !important; + } + .ms-xl-5 { + margin-left: 3rem !important; + } + .ms-xl-auto { + margin-left: auto !important; + } + .p-xl-0 { + padding: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xl-0 { + padding-top: 0 !important; + } + .pt-xl-1 { + padding-top: 0.25rem !important; + } + .pt-xl-2 { + padding-top: 0.5rem !important; + } + .pt-xl-3 { + padding-top: 1rem !important; + } + .pt-xl-4 { + padding-top: 1.5rem !important; + } + .pt-xl-5 { + padding-top: 3rem !important; + } + .pe-xl-0 { + padding-right: 0 !important; + } + .pe-xl-1 { + padding-right: 0.25rem !important; + } + .pe-xl-2 { + padding-right: 0.5rem !important; + } + .pe-xl-3 { + padding-right: 1rem !important; + } + .pe-xl-4 { + padding-right: 1.5rem !important; + } + .pe-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-0 { + padding-bottom: 0 !important; + } + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xl-3 { + padding-bottom: 1rem !important; + } + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xl-5 { + padding-bottom: 3rem !important; + } + .ps-xl-0 { + padding-left: 0 !important; + } + .ps-xl-1 { + padding-left: 0.25rem !important; + } + .ps-xl-2 { + padding-left: 0.5rem !important; + } + .ps-xl-3 { + padding-left: 1rem !important; + } + .ps-xl-4 { + padding-left: 1.5rem !important; + } + .ps-xl-5 { + padding-left: 3rem !important; + } + .gap-xl-0 { + gap: 0 !important; + } + .gap-xl-1 { + gap: 0.25rem !important; + } + .gap-xl-2 { + gap: 0.5rem !important; + } + .gap-xl-3 { + gap: 1rem !important; + } + .gap-xl-4 { + gap: 1.5rem !important; + } + .gap-xl-5 { + gap: 3rem !important; + } + .text-xl-start { + text-align: left !important; + } + .text-xl-end { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} +@media (min-width: 1400px) { + .float-xxl-start { + float: left !important; + } + .float-xxl-end { + float: right !important; + } + .float-xxl-none { + float: none !important; + } + .d-xxl-inline { + display: inline !important; + } + .d-xxl-inline-block { + display: inline-block !important; + } + .d-xxl-block { + display: block !important; + } + .d-xxl-grid { + display: grid !important; + } + .d-xxl-table { + display: table !important; + } + .d-xxl-table-row { + display: table-row !important; + } + .d-xxl-table-cell { + display: table-cell !important; + } + .d-xxl-flex { + display: flex !important; + } + .d-xxl-inline-flex { + display: inline-flex !important; + } + .d-xxl-none { + display: none !important; + } + .flex-xxl-fill { + flex: 1 1 auto !important; + } + .flex-xxl-row { + flex-direction: row !important; + } + .flex-xxl-column { + flex-direction: column !important; + } + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xxl-grow-0 { + flex-grow: 0 !important; + } + .flex-xxl-grow-1 { + flex-grow: 1 !important; + } + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xxl-wrap { + flex-wrap: wrap !important; + } + .flex-xxl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xxl-start { + justify-content: flex-start !important; + } + .justify-content-xxl-end { + justify-content: flex-end !important; + } + .justify-content-xxl-center { + justify-content: center !important; + } + .justify-content-xxl-between { + justify-content: space-between !important; + } + .justify-content-xxl-around { + justify-content: space-around !important; + } + .justify-content-xxl-evenly { + justify-content: space-evenly !important; + } + .align-items-xxl-start { + align-items: flex-start !important; + } + .align-items-xxl-end { + align-items: flex-end !important; + } + .align-items-xxl-center { + align-items: center !important; + } + .align-items-xxl-baseline { + align-items: baseline !important; + } + .align-items-xxl-stretch { + align-items: stretch !important; + } + .align-content-xxl-start { + align-content: flex-start !important; + } + .align-content-xxl-end { + align-content: flex-end !important; + } + .align-content-xxl-center { + align-content: center !important; + } + .align-content-xxl-between { + align-content: space-between !important; + } + .align-content-xxl-around { + align-content: space-around !important; + } + .align-content-xxl-stretch { + align-content: stretch !important; + } + .align-self-xxl-auto { + align-self: auto !important; + } + .align-self-xxl-start { + align-self: flex-start !important; + } + .align-self-xxl-end { + align-self: flex-end !important; + } + .align-self-xxl-center { + align-self: center !important; + } + .align-self-xxl-baseline { + align-self: baseline !important; + } + .align-self-xxl-stretch { + align-self: stretch !important; + } + .order-xxl-first { + order: -1 !important; + } + .order-xxl-0 { + order: 0 !important; + } + .order-xxl-1 { + order: 1 !important; + } + .order-xxl-2 { + order: 2 !important; + } + .order-xxl-3 { + order: 3 !important; + } + .order-xxl-4 { + order: 4 !important; + } + .order-xxl-5 { + order: 5 !important; + } + .order-xxl-last { + order: 6 !important; + } + .m-xxl-0 { + margin: 0 !important; + } + .m-xxl-1 { + margin: 0.25rem !important; + } + .m-xxl-2 { + margin: 0.5rem !important; + } + .m-xxl-3 { + margin: 1rem !important; + } + .m-xxl-4 { + margin: 1.5rem !important; + } + .m-xxl-5 { + margin: 3rem !important; + } + .m-xxl-auto { + margin: auto !important; + } + .mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xxl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xxl-0 { + margin-top: 0 !important; + } + .mt-xxl-1 { + margin-top: 0.25rem !important; + } + .mt-xxl-2 { + margin-top: 0.5rem !important; + } + .mt-xxl-3 { + margin-top: 1rem !important; + } + .mt-xxl-4 { + margin-top: 1.5rem !important; + } + .mt-xxl-5 { + margin-top: 3rem !important; + } + .mt-xxl-auto { + margin-top: auto !important; + } + .me-xxl-0 { + margin-right: 0 !important; + } + .me-xxl-1 { + margin-right: 0.25rem !important; + } + .me-xxl-2 { + margin-right: 0.5rem !important; + } + .me-xxl-3 { + margin-right: 1rem !important; + } + .me-xxl-4 { + margin-right: 1.5rem !important; + } + .me-xxl-5 { + margin-right: 3rem !important; + } + .me-xxl-auto { + margin-right: auto !important; + } + .mb-xxl-0 { + margin-bottom: 0 !important; + } + .mb-xxl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xxl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xxl-3 { + margin-bottom: 1rem !important; + } + .mb-xxl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xxl-5 { + margin-bottom: 3rem !important; + } + .mb-xxl-auto { + margin-bottom: auto !important; + } + .ms-xxl-0 { + margin-left: 0 !important; + } + .ms-xxl-1 { + margin-left: 0.25rem !important; + } + .ms-xxl-2 { + margin-left: 0.5rem !important; + } + .ms-xxl-3 { + margin-left: 1rem !important; + } + .ms-xxl-4 { + margin-left: 1.5rem !important; + } + .ms-xxl-5 { + margin-left: 3rem !important; + } + .ms-xxl-auto { + margin-left: auto !important; + } + .p-xxl-0 { + padding: 0 !important; + } + .p-xxl-1 { + padding: 0.25rem !important; + } + .p-xxl-2 { + padding: 0.5rem !important; + } + .p-xxl-3 { + padding: 1rem !important; + } + .p-xxl-4 { + padding: 1.5rem !important; + } + .p-xxl-5 { + padding: 3rem !important; + } + .px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xxl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xxl-0 { + padding-top: 0 !important; + } + .pt-xxl-1 { + padding-top: 0.25rem !important; + } + .pt-xxl-2 { + padding-top: 0.5rem !important; + } + .pt-xxl-3 { + padding-top: 1rem !important; + } + .pt-xxl-4 { + padding-top: 1.5rem !important; + } + .pt-xxl-5 { + padding-top: 3rem !important; + } + .pe-xxl-0 { + padding-right: 0 !important; + } + .pe-xxl-1 { + padding-right: 0.25rem !important; + } + .pe-xxl-2 { + padding-right: 0.5rem !important; + } + .pe-xxl-3 { + padding-right: 1rem !important; + } + .pe-xxl-4 { + padding-right: 1.5rem !important; + } + .pe-xxl-5 { + padding-right: 3rem !important; + } + .pb-xxl-0 { + padding-bottom: 0 !important; + } + .pb-xxl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xxl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xxl-3 { + padding-bottom: 1rem !important; + } + .pb-xxl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xxl-5 { + padding-bottom: 3rem !important; + } + .ps-xxl-0 { + padding-left: 0 !important; + } + .ps-xxl-1 { + padding-left: 0.25rem !important; + } + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + .ps-xxl-3 { + padding-left: 1rem !important; + } + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + .ps-xxl-5 { + padding-left: 3rem !important; + } + .gap-xxl-0 { + gap: 0 !important; + } + .gap-xxl-1 { + gap: 0.25rem !important; + } + .gap-xxl-2 { + gap: 0.5rem !important; + } + .gap-xxl-3 { + gap: 1rem !important; + } + .gap-xxl-4 { + gap: 1.5rem !important; + } + .gap-xxl-5 { + gap: 3rem !important; + } + .text-xxl-start { + text-align: left !important; + } + .text-xxl-end { + text-align: right !important; + } + .text-xxl-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .fs-1 { + font-size: 2.5rem !important; + } + .fs-2 { + font-size: 2rem !important; + } + .fs-3 { + font-size: 1.75rem !important; + } + .fs-4 { + font-size: 1.5rem !important; + } +} +@media print { + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-grid { + display: grid !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: flex !important; + } + .d-print-inline-flex { + display: inline-flex !important; + } + .d-print-none { + display: none !important; + } +} +html { + scroll-padding-top: 4.5rem; +} + +.bg-black { + background-color: #000 !important; +} + +.bg-gradient-primary-to-secondary { + background: linear-gradient(45deg, #2937f0, #9f1ae2) !important; +} + +.font-alt { + font-family: "Kanit", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !important; +} + +.text-gradient { + background: -webkit-linear-gradient(#2937f0, #9f1ae2); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +aside, +section { + padding-top: 5rem; + padding-bottom: 5rem; +} + +.app-badge { + height: 3rem; +} + +#mainNav { + padding-top: 1rem; + padding-bottom: 1rem; + background-color: #fff; +} +#mainNav .navbar-brand { + font-family: "Kanit", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; +} +#mainNav .navbar-brand:hover, #mainNav .navbar-brand:active { + color: #2937f0; +} +#mainNav .navbar-toggler { + font-size: 0.875rem; + padding: 0.75rem 1rem; + color: #212529; +} +#mainNav .navbar-nav .nav-item .nav-link { + color: #212529; +} +#mainNav .navbar-nav .nav-item .nav-link:hover { + color: #6c757d; +} +#mainNav .navbar-nav .nav-item .nav-link.active { + color: #2937f0; +} + +/*! + * html5-device-mockups (https://github.com/pixelsign/html5-device-mockups) + * Copyright 2013 - 2017 pixelsign + * Licensed under MIT (https://github.com/pixelsign/html5-device-mockups/blob/master/LICENSE.txt) + * Last Build: Tue Nov 14 2017 12:40:57 + */ +.device-wrapper { + max-width: 300px; + width: 100%; +} + +.device { + position: relative; + background-size: cover; +} + +.device::after { + position: absolute; + background-size: cover; + width: 100%; + height: 100%; + pointer-events: none; +} + +.device .screen { + position: absolute; + background-size: cover; + pointer-events: auto; +} + +.device .button { + position: absolute; + cursor: pointer; +} + +.device[data-device=iPhoneX][data-orientation=portrait][data-color=black] { + padding-bottom: 198.898071625%; +} + +.device[data-device=iPhoneX][data-orientation=portrait][data-color=black] .screen { + top: 3.1855955679%; + left: 6.8870523416%; + width: 86.2258953168%; + height: 93.6288088643%; +} + +.device[data-device=iPhoneX][data-orientation=portrait][data-color=black]::after { + content: ""; + background-image: url("../assets/img/portrait_black.png"); +} + +.device[data-device=iPhoneX][data-orientation=portrait][data-color=black] .button { + display: none; + top: 0%; + left: 0%; + width: 100%; + height: 100%; +} + +section.cta { + position: relative; + padding: 15rem 0; + background-image: url("https://img.freepik.com/photos-gratuite/homme-senior-athletique-s-entrainant-gymnastique_23-2150809355.jpg?w=1380&t=st=1701079471~exp=1701080071~hmac=baeec48b8d3a4c25cbbd821371bc8dcca048ba9c61d122963c1c0089bce690b3"); + background-position: center; + background-size: cover; +} +section.cta .cta-content { + position: relative; + z-index: 1; +} +section.cta:before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); +} + +.icon-feature { + font-size: 4rem; +} + +.features-device-mockup { + display: flex; + align-items: center; + justify-content: center; + position: relative; +} +.features-device-mockup .circle { + position: absolute; + left: 0; + fill: url(#circleGradient); + width: 70%; + display: none; +} +.features-device-mockup .circle .gradient-start-color { + stop-color: #2937f0; +} +.features-device-mockup .circle .gradient-end-color { + stop-color: #9f1ae2; +} +.features-device-mockup .shape-1 { + position: absolute; + height: 1rem; + width: 1rem; + transform: rotate(10deg); + fill: #2937f0; + top: 15%; + right: 10%; +} +.features-device-mockup .shape-2 { + position: absolute; + height: 0.75rem; + width: 0.75rem; + fill: #2937f0; + bottom: 15%; + left: 10%; +} +.features-device-mockup .device-wrapper { + max-width: 10rem; +} + +@media (min-width: 576px) { + .features-device-mockup .circle { + width: 70%; + display: block; + left: auto; + } + .features-device-mockup .device-wrapper { + max-width: 12.5rem; + } +} +@media (min-width: 768px) { + .features-device-mockup .circle { + width: 60%; + left: auto; + } + .features-device-mockup .device-wrapper { + max-width: 15rem; + } +} +@media (min-width: 992px) { + .features-device-mockup .circle { + width: 90%; + left: -25%; + } + .features-device-mockup .shape-1 { + top: 5%; + right: -15%; + } + .features-device-mockup .shape-2 { + bottom: 10%; + left: -10%; + } + .features-device-mockup .device-wrapper { + max-width: 15rem; + margin-left: auto; + } +} +@media (min-width: 1200px) { + .features-device-mockup .circle { + width: 75%; + left: 0; + } + .features-device-mockup .shape-2 { + bottom: 15%; + left: 10%; + } + .features-device-mockup .device-wrapper { + max-width: 15rem; + } +} +@media (min-width: 1400px) { + .features-device-mockup .circle { + width: 80%; + left: 0; + } + .features-device-mockup .device-wrapper { + max-width: 17rem; + } +} +footer a { + color: rgba(255, 255, 255, 0.5); + text-decoration: none; +} +footer a:hover, footer a:active, footer a:focus { + color: rgba(255, 255, 255, 0.75); + text-decoration: underline; +} + +.masthead { + background-color: #f8f9fa; + padding-top: 9.5rem; + padding-bottom: 5rem; +} +.masthead .masthead-device-mockup { + display: flex; + align-items: center; + justify-content: center; + position: relative; +} +.masthead .masthead-device-mockup .circle { + position: absolute; + fill: url(#circleGradient); + width: 70%; + display: none; +} +.masthead .masthead-device-mockup .circle .gradient-start-color { + stop-color: #2937f0; +} +.masthead .masthead-device-mockup .circle .gradient-end-color { + stop-color: #9f1ae2; +} +.masthead .masthead-device-mockup .shape-1 { + position: absolute; + height: 1rem; + width: 1rem; + transform: rotate(-10deg); + fill: #2937f0; + bottom: 15%; + left: 10%; +} +.masthead .masthead-device-mockup .shape-2 { + position: absolute; + height: 0.75rem; + width: 0.75rem; + fill: #2937f0; + top: 15%; + right: 10%; +} +.masthead .masthead-device-mockup .device-wrapper { + max-width: 10rem; +} +@media (min-width: 576px) { + .masthead .masthead-device-mockup .circle { + width: 70%; + display: block; + } + .masthead .masthead-device-mockup .device-wrapper { + max-width: 12.5rem; + } +} +@media (min-width: 768px) { + .masthead .masthead-device-mockup .circle { + width: 60%; + } + .masthead .masthead-device-mockup .device-wrapper { + max-width: 15rem; + } +} +@media (min-width: 992px) { + .masthead .masthead-device-mockup .circle { + width: 90%; + } + .masthead .masthead-device-mockup .device-wrapper { + max-width: 15rem; + } +} +@media (min-width: 1200px) { + .masthead .masthead-device-mockup .circle { + width: 75%; + } + .masthead .masthead-device-mockup .device-wrapper { + max-width: 15rem; + } +} +@media (min-width: 1400px) { + .masthead .masthead-device-mockup .circle { + width: 70%; + } + .masthead .masthead-device-mockup .device-wrapper { + max-width: 17rem; + } +} \ No newline at end of file diff --git a/Sources/public/js/scripts2.js b/Sources/public/js/scripts2.js new file mode 100644 index 00000000..19c62bf3 --- /dev/null +++ b/Sources/public/js/scripts2.js @@ -0,0 +1,34 @@ +/*! +* Start Bootstrap - New Age v6.0.7 (https://startbootstrap.com/theme/new-age) +* Copyright 2013-2023 Start Bootstrap +* Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-new-age/blob/master/LICENSE) +*/ +// +// Scripts +// + +window.addEventListener('DOMContentLoaded', event => { + + // Activate Bootstrap scrollspy on the main nav element + const mainNav = document.body.querySelector('#mainNav'); + if (mainNav) { + new bootstrap.ScrollSpy(document.body, { + target: '#mainNav', + offset: 74, + }); + }; + + // Collapse responsive navbar when toggler is visible + const navbarToggler = document.body.querySelector('.navbar-toggler'); + const responsiveNavItems = [].slice.call( + document.querySelectorAll('#navbarResponsive .nav-link') + ); + responsiveNavItems.map(function (responsiveNavItem) { + responsiveNavItem.addEventListener('click', () => { + if (window.getComputedStyle(navbarToggler).display !== 'none') { + navbarToggler.click(); + } + }); + }); + +}); diff --git a/Sources/src/app/controller/Controller.php b/Sources/src/app/controller/Controller.php index 7dddd5c5..7450300d 100644 --- a/Sources/src/app/controller/Controller.php +++ b/Sources/src/app/controller/Controller.php @@ -22,7 +22,7 @@ class Controller extends BaseController $this->preference = new Preferences(); } - #[Route(path: '/', name: 'home', methods: ['GET'])] + #[Route(path: '/', name: 'index', methods: ['GET'])] public function index(): Response { return $this->render('./page/index.html',[ @@ -40,6 +40,24 @@ class Controller extends BaseController ]); } + #[Route(path: '/home', name: 'home', methods: ['GET'])] + public function home(): Response + { + return $this->render('./page/home.html.twig',[ + 'css' => $this->preference->getCookie(), + 'pp' => "test2", + 'user' => "Doe", + 'role' => "Athlète", + 'friendship' => [], + 'analyzes' => [], + 'mails' => [], + 'users' => [], + 'infoUser' => [], + 'exos' => [], + 'member' => [] + ]); + } + #[Route(path: '/analyses', name: 'analyses', methods: ['GET'])] public function analyses(): Response { diff --git a/Sources/src/app/views/Templates/base.html.twig b/Sources/src/app/views/Templates/base.html.twig index f4ef8621..f40ff641 100755 --- a/Sources/src/app/views/Templates/base.html.twig +++ b/Sources/src/app/views/Templates/base.html.twig @@ -46,7 +46,7 @@