Files
taome/var/cache/dev/twig/8a/8a85a8ce15067cae68a441f3b37f8c9c7a74aa60bcb460f4d784b4deccf4da7b.php
2020-10-07 10:37:15 +02:00

1677 lines
76 KiB
PHP

<?php
use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Markup;
use Twig\Sandbox\SecurityError;
use Twig\Sandbox\SecurityNotAllowedTagError;
use Twig\Sandbox\SecurityNotAllowedFilterError;
use Twig\Sandbox\SecurityNotAllowedFunctionError;
use Twig\Source;
use Twig\Template;
/* @WebProfiler/Collector/time.html.twig */
class __TwigTemplate_f14da230cb9b54c3b53c47f850e8a23f6db94393da44206f34a39c821c87853a extends \Twig\Template
{
public function __construct(Environment $env)
{
parent::__construct($env);
// line 1
$this->parent = $this->loadTemplate("@WebProfiler/Profiler/layout.html.twig", "@WebProfiler/Collector/time.html.twig", 1);
$this->blocks = [
'toolbar' => [$this, 'block_toolbar'],
'menu' => [$this, 'block_menu'],
'panel' => [$this, 'block_panel'],
'panelContent' => [$this, 'block_panelContent'],
];
}
protected function doGetParent(array $context)
{
return "@WebProfiler/Profiler/layout.html.twig";
}
protected function doDisplay(array $context, array $blocks = [])
{
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->env->getExtension("Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension");
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "@WebProfiler/Collector/time.html.twig"));
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->env->getExtension("Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension");
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "@WebProfiler/Collector/time.html.twig"));
// line 3
$context["helper"] = $this;
// line 5
if ( !(isset($context["colors"]) || array_key_exists("colors", $context))) {
// line 6
$context["colors"] = ["default" => "#999", "section" => "#444", "event_listener" => "#00B8F5", "template" => "#66CC00", "doctrine" => "#FF6633"];
}
// line 1
$this->parent->display($context, array_merge($this->blocks, $blocks));
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
}
// line 16
public function block_toolbar($context, array $blocks = [])
{
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->env->getExtension("Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension");
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "toolbar"));
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->env->getExtension("Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension");
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "toolbar"));
// line 17
echo " ";
$context["has_time_events"] = (twig_length_filter($this->env, $this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "events", [])) > 0);
// line 18
echo "
";
// line 19
$context["total_time"] = ((($context["has_time_events"] ?? $this->getContext($context, "has_time_events"))) ? (sprintf("%.0f", $this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "duration", []))) : ("n/a"));
// line 20
echo " ";
$context["initialization_time"] = ((twig_length_filter($this->env, $this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "events", []))) ? (sprintf("%.0f", $this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "inittime", []))) : ("n/a"));
// line 21
echo " ";
$context["status_color"] = (((($context["has_time_events"] ?? $this->getContext($context, "has_time_events")) && ($this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "duration", []) > 1000))) ? ("yellow") : (""));
// line 22
echo "
";
// line 23
ob_start();
// line 24
echo " ";
echo twig_include($this->env, $context, "@WebProfiler/Icon/time.svg");
echo "
<span class=\"sf-toolbar-value\">";
// line 25
echo twig_escape_filter($this->env, ($context["total_time"] ?? $this->getContext($context, "total_time")), "html", null, true);
echo "</span>
<span class=\"sf-toolbar-label\">ms</span>
";
$context["icon"] = ('' === $tmp = ob_get_clean()) ? '' : new Markup($tmp, $this->env->getCharset());
// line 28
echo "
";
// line 29
ob_start();
// line 30
echo " <div class=\"sf-toolbar-info-piece\">
<b>Total time</b>
<span>";
// line 32
echo twig_escape_filter($this->env, ($context["total_time"] ?? $this->getContext($context, "total_time")), "html", null, true);
echo " ms</span>
</div>
<div class=\"sf-toolbar-info-piece\">
<b>Initialization time</b>
<span>";
// line 36
echo twig_escape_filter($this->env, ($context["initialization_time"] ?? $this->getContext($context, "initialization_time")), "html", null, true);
echo " ms</span>
</div>
";
$context["text"] = ('' === $tmp = ob_get_clean()) ? '' : new Markup($tmp, $this->env->getCharset());
// line 39
echo "
";
// line 40
echo twig_include($this->env, $context, "@WebProfiler/Profiler/toolbar_item.html.twig", ["link" => ($context["profiler_url"] ?? $this->getContext($context, "profiler_url")), "status" => ($context["status_color"] ?? $this->getContext($context, "status_color"))]);
echo "
";
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);
}
// line 43
public function block_menu($context, array $blocks = [])
{
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->env->getExtension("Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension");
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "menu"));
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->env->getExtension("Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension");
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "menu"));
// line 44
echo " <span class=\"label\">
<span class=\"icon\">";
// line 45
echo twig_include($this->env, $context, "@WebProfiler/Icon/time.svg");
echo "</span>
<strong>Performance</strong>
</span>
";
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);
}
// line 50
public function block_panel($context, array $blocks = [])
{
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->env->getExtension("Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension");
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "panel"));
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->env->getExtension("Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension");
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "panel"));
// line 51
echo " ";
$context["has_time_events"] = (twig_length_filter($this->env, $this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "events", [])) > 0);
// line 52
echo " <h2>Performance metrics</h2>
<div class=\"metrics\">
<div class=\"metric\">
<span class=\"value\">";
// line 56
echo twig_escape_filter($this->env, sprintf("%.0f", $this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "duration", [])), "html", null, true);
echo " <span class=\"unit\">ms</span></span>
<span class=\"label\">Total execution time</span>
</div>
<div class=\"metric\">
<span class=\"value\">";
// line 61
echo twig_escape_filter($this->env, sprintf("%.0f", $this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "inittime", [])), "html", null, true);
echo " <span class=\"unit\">ms</span></span>
<span class=\"label\">Symfony initialization</span>
</div>
";
// line 65
if ($this->getAttribute($this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "collectors", []), "memory", [])) {
// line 66
echo " <div class=\"metric\">
<span class=\"value\">";
// line 67
echo twig_escape_filter($this->env, sprintf("%.2f", (($this->getAttribute($this->getAttribute($this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "collectors", []), "memory", []), "memory", []) / 1024) / 1024)), "html", null, true);
echo " <span class=\"unit\">MB</span></span>
<span class=\"label\">Peak memory usage</span>
</div>
";
}
// line 71
echo "
";
// line 72
if ((twig_length_filter($this->env, $this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "children", [])) > 0)) {
// line 73
echo " <div class=\"metric-divider\"></div>
<div class=\"metric\">
<span class=\"value\">";
// line 76
echo twig_escape_filter($this->env, twig_length_filter($this->env, $this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "children", [])), "html", null, true);
echo "</span>
<span class=\"label\">Sub-Request";
// line 77
echo (((twig_length_filter($this->env, $this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "children", [])) > 1)) ? ("s") : (""));
echo "</span>
</div>
";
// line 80
if (($context["has_time_events"] ?? $this->getContext($context, "has_time_events"))) {
// line 81
echo " ";
$context["subrequests_time"] = 0;
// line 82
echo " ";
$context['_parent'] = $context;
$context['_seq'] = twig_ensure_traversable($this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "children", []));
foreach ($context['_seq'] as $context["_key"] => $context["child"]) {
// line 83
echo " ";
$context["subrequests_time"] = (($context["subrequests_time"] ?? $this->getContext($context, "subrequests_time")) + $this->getAttribute($this->getAttribute($this->getAttribute($this->getAttribute($context["child"], "getcollector", [0 => "time"], "method"), "events", []), "__section__", []), "duration", []));
// line 84
echo " ";
}
$_parent = $context['_parent'];
unset($context['_seq'], $context['_iterated'], $context['_key'], $context['child'], $context['_parent'], $context['loop']);
$context = array_intersect_key($context, $_parent) + $_parent;
// line 85
echo " ";
} else {
// line 86
echo " ";
$context["subrequests_time"] = "n/a";
// line 87
echo " ";
}
// line 88
echo "
<div class=\"metric\">
<span class=\"value\">";
// line 90
echo twig_escape_filter($this->env, ($context["subrequests_time"] ?? $this->getContext($context, "subrequests_time")), "html", null, true);
echo " <span class=\"unit\">ms</span></span>
<span class=\"label\">Sub-Request";
// line 91
echo (((twig_length_filter($this->env, $this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "children", [])) > 1)) ? ("s") : (""));
echo " time</span>
</div>
";
}
// line 94
echo " </div>
<h2>Execution timeline</h2>
";
// line 98
if ( !$this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "isStopwatchInstalled", [], "method")) {
// line 99
echo " <div class=\"empty\">
<p>The Stopwatch component is not installed. If you want to see timing events, run: <code>composer require symfony/stopwatch</code>.</p>
</div>
";
} elseif (twig_test_empty($this->getAttribute( // line 102
($context["collector"] ?? $this->getContext($context, "collector")), "events", []))) {
// line 103
echo " <div class=\"empty\">
<p>No timing events have been recorded. Are you sure that debugging is enabled in the kernel?</p>
</div>
";
} else {
// line 107
echo " ";
$this->displayBlock("panelContent", $context, $blocks);
echo "
";
}
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);
}
// line 111
public function block_panelContent($context, array $blocks = [])
{
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->env->getExtension("Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension");
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "panelContent"));
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->env->getExtension("Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension");
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "panelContent"));
// line 112
echo " <form id=\"timeline-control\" action=\"\" method=\"get\">
<input type=\"hidden\" name=\"panel\" value=\"time\">
<label for=\"threshold\">Threshold</label>
<input type=\"number\" size=\"3\" name=\"threshold\" id=\"threshold\" value=\"3\" min=\"0\"> ms
<span class=\"help\">(timeline only displays events with a duration longer than this threshold)</span>
</form>
";
// line 119
if ($this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "parent", [])) {
// line 120
echo " <h3 class=\"dump-inline\">
Sub-Request ";
// line 121
echo call_user_func_array($this->env->getFunction('profiler_dump')->getCallable(), [$this->env, $this->getAttribute($this->getAttribute($this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "getcollector", [0 => "request"], "method"), "requestattributes", []), "get", [0 => "_controller"], "method")]);
echo "
<small>
";
// line 123
echo twig_escape_filter($this->env, $this->getAttribute($this->getAttribute($this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "events", []), "__section__", []), "duration", []), "html", null, true);
echo " ms
<a class=\"newline\" href=\"";
// line 124
echo twig_escape_filter($this->env, $this->env->getExtension('Symfony\Bridge\Twig\Extension\RoutingExtension')->getPath("_profiler", ["token" => $this->getAttribute($this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "parent", []), "token", []), "panel" => "time"]), "html", null, true);
echo "\">Return to parent request</a>
</small>
</h3>
";
} elseif ((twig_length_filter($this->env, $this->getAttribute( // line 127
($context["profile"] ?? $this->getContext($context, "profile")), "children", [])) > 0)) {
// line 128
echo " <h3>
Main Request <small>";
// line 129
echo twig_escape_filter($this->env, $this->getAttribute($this->getAttribute($this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "events", []), "__section__", []), "duration", []), "html", null, true);
echo " ms</small>
</h3>
";
}
// line 132
echo "
";
// line 133
echo $context["helper"]->getdisplay_timeline(("timeline_" . ($context["token"] ?? $this->getContext($context, "token"))), $this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "events", []), ($context["colors"] ?? $this->getContext($context, "colors")));
echo "
";
// line 135
if (twig_length_filter($this->env, $this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "children", []))) {
// line 136
echo " <p class=\"help\">Note: sections with a striped background correspond to sub-requests.</p>
<h3>Sub-requests <small>(";
// line 138
echo twig_escape_filter($this->env, twig_length_filter($this->env, $this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "children", [])), "html", null, true);
echo ")</small></h3>
";
// line 140
$context['_parent'] = $context;
$context['_seq'] = twig_ensure_traversable($this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "children", []));
foreach ($context['_seq'] as $context["_key"] => $context["child"]) {
// line 141
echo " ";
$context["events"] = $this->getAttribute($this->getAttribute($context["child"], "getcollector", [0 => "time"], "method"), "events", []);
// line 142
echo " <h4>
<a href=\"";
// line 143
echo twig_escape_filter($this->env, $this->env->getExtension('Symfony\Bridge\Twig\Extension\RoutingExtension')->getPath("_profiler", ["token" => $this->getAttribute($context["child"], "token", []), "panel" => "time"]), "html", null, true);
echo "\">";
echo twig_escape_filter($this->env, $this->getAttribute($this->getAttribute($context["child"], "getcollector", [0 => "request"], "method"), "identifier", []), "html", null, true);
echo "</a>
<small>";
// line 144
echo twig_escape_filter($this->env, $this->getAttribute($this->getAttribute(($context["events"] ?? $this->getContext($context, "events")), "__section__", []), "duration", []), "html", null, true);
echo " ms</small>
</h4>
";
// line 147
echo $context["helper"]->getdisplay_timeline(("timeline_" . $this->getAttribute($context["child"], "token", [])), ($context["events"] ?? $this->getContext($context, "events")), ($context["colors"] ?? $this->getContext($context, "colors")));
echo "
";
}
$_parent = $context['_parent'];
unset($context['_seq'], $context['_iterated'], $context['_key'], $context['child'], $context['_parent'], $context['loop']);
$context = array_intersect_key($context, $_parent) + $_parent;
// line 149
echo " ";
}
// line 150
echo "
<script>";
// line 151
echo "//<![CDATA[
/**
* In-memory key-value cache manager
*/
var cache = new function() {
\"use strict\";
var dict = {};
this.get = function(key) {
return dict.hasOwnProperty(key)
? dict[key]
: null;
};
this.set = function(key, value) {
dict[key] = value;
return value;
};
};
/**
* Query an element with a CSS selector.
*
* @param {string} selector - a CSS-selector-compatible query string
*
* @return DOMElement|null
*/
function query(selector)
{
\"use strict\";
var key = 'SELECTOR: ' + selector;
return cache.get(key) || cache.set(key, document.querySelector(selector));
}
/**
* Canvas Manager
*/
function CanvasManager(requests, maxRequestTime) {
\"use strict\";
var _drawingColors = ";
// line 193
echo twig_jsonencode_filter(($context["colors"] ?? $this->getContext($context, "colors")));
echo ",
_storagePrefix = 'timeline/',
_threshold = 1,
_requests = requests,
_maxRequestTime = maxRequestTime;
/**
* Check whether this event is a child event.
*
* @return true if it is
*/
function isChildEvent(event)
{
return '__section__.child' === event.name;
}
/**
* Check whether this event is categorized in 'section'.
*
* @return true if it is
*/
function isSectionEvent(event)
{
return 'section' === event.category;
}
/**
* Get the width of the container.
*/
function getContainerWidth()
{
return query('#collector-content h2').clientWidth;
}
/**
* Draw one canvas.
*
* @param request the request object
* @param max <subjected for removal>
* @param threshold the threshold (lower bound) of the length of the timeline (in milliseconds)
* @param width the width of the canvas
*/
this.drawOne = function(request, max, threshold, width)
{
\"use strict\";
var text,
ms,
xc,
drawableEvents,
mainEvents,
elementId = 'timeline_' + request.id,
canvasHeight = 0,
gapPerEvent = 38,
colors = _drawingColors,
space = 10.5,
ratio = (width - space * 2) / max,
h = space,
x = request.left * ratio + space, // position
canvas = cache.get(elementId) || cache.set(elementId, document.getElementById(elementId)),
ctx = canvas.getContext(\"2d\"),
scaleRatio,
devicePixelRatio;
// Filter events whose total time is below the threshold.
drawableEvents = request.events.filter(function(event) {
return event.duration >= threshold;
});
canvasHeight += gapPerEvent * drawableEvents.length;
// For retina displays so text and boxes will be crisp
devicePixelRatio = window.devicePixelRatio == \"undefined\" ? 1 : window.devicePixelRatio;
scaleRatio = devicePixelRatio / 1;
canvas.width = width * scaleRatio;
canvas.height = canvasHeight * scaleRatio;
canvas.style.width = width + 'px';
canvas.style.height = canvasHeight + 'px';
ctx.scale(scaleRatio, scaleRatio);
ctx.textBaseline = \"middle\";
ctx.lineWidth = 0;
// For each event, draw a line.
ctx.strokeStyle = \"#CCC\";
drawableEvents.forEach(function(event) {
event.periods.forEach(function(period) {
var timelineHeadPosition = x + period.start * ratio;
if (isChildEvent(event)) {
/* create a striped background dynamically */
var img = new Image();
img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKBAMAAAB/HNKOAAAAIVBMVEX////w8PDd7h7d7h7d7h7d7h7w8PDw8PDw8PDw8PDw8PAOi84XAAAAKUlEQVQImWNI71zAwMBQMYuBgY0BxExnADErGEDMTgYQE8hnAKtCZwIAlcMNSR9a1OEAAAAASUVORK5CYII=';
var pattern = ctx.createPattern(img, 'repeat');
ctx.fillStyle = pattern;
ctx.fillRect(timelineHeadPosition, 0, (period.end - period.start) * ratio, canvasHeight);
} else if (isSectionEvent(event)) {
var timelineTailPosition = x + period.end * ratio;
ctx.beginPath();
ctx.moveTo(timelineHeadPosition, 0);
ctx.lineTo(timelineHeadPosition, canvasHeight);
ctx.moveTo(timelineTailPosition, 0);
ctx.lineTo(timelineTailPosition, canvasHeight);
ctx.fill();
ctx.closePath();
ctx.stroke();
}
});
});
// Filter for main events.
mainEvents = drawableEvents.filter(function(event) {
return !isChildEvent(event)
});
// For each main event, draw the visual presentation of timelines.
mainEvents.forEach(function(event) {
h += 8;
// For each sub event, ...
event.periods.forEach(function(period) {
// Set the drawing style.
ctx.fillStyle = colors['default'];
ctx.strokeStyle = colors['default'];
if (colors[event.name]) {
ctx.fillStyle = colors[event.name];
ctx.strokeStyle = colors[event.name];
} else if (colors[event.category]) {
ctx.fillStyle = colors[event.category];
ctx.strokeStyle = colors[event.category];
}
// Draw the timeline
var timelineHeadPosition = x + period.start * ratio;
if (!isSectionEvent(event)) {
ctx.fillRect(timelineHeadPosition, h + 3, 2, 8);
ctx.fillRect(timelineHeadPosition, h, (period.end - period.start) * ratio || 2, 6);
} else {
var timelineTailPosition = x + period.end * ratio;
ctx.beginPath();
ctx.moveTo(timelineHeadPosition, h);
ctx.lineTo(timelineHeadPosition, h + 11);
ctx.lineTo(timelineHeadPosition + 8, h);
ctx.lineTo(timelineHeadPosition, h);
ctx.fill();
ctx.closePath();
ctx.stroke();
ctx.beginPath();
ctx.moveTo(timelineTailPosition, h);
ctx.lineTo(timelineTailPosition, h + 11);
ctx.lineTo(timelineTailPosition - 8, h);
ctx.lineTo(timelineTailPosition, h);
ctx.fill();
ctx.closePath();
ctx.stroke();
ctx.beginPath();
ctx.moveTo(timelineHeadPosition, h);
ctx.lineTo(timelineTailPosition, h);
ctx.lineTo(timelineTailPosition, h + 2);
ctx.lineTo(timelineHeadPosition, h + 2);
ctx.lineTo(timelineHeadPosition, h);
ctx.fill();
ctx.closePath();
ctx.stroke();
}
});
h += 30;
ctx.beginPath();
ctx.strokeStyle = \"#E0E0E0\";
ctx.moveTo(0, h - 10);
ctx.lineTo(width, h - 10);
ctx.closePath();
ctx.stroke();
});
h = space;
// For each event, draw the label.
mainEvents.forEach(function(event) {
ctx.fillStyle = \"#444\";
ctx.font = \"12px sans-serif\";
text = event.name;
ms = \" \" + (event.duration < 1 ? event.duration : parseInt(event.duration, 10)) + \" ms / \" + event.memory + \" MB\";
if (x + event.starttime * ratio + ctx.measureText(text + ms).width > width) {
ctx.textAlign = \"end\";
ctx.font = \"10px sans-serif\";
ctx.fillStyle = \"#777\";
xc = x + event.endtime * ratio - 1;
ctx.fillText(ms, xc, h);
xc -= ctx.measureText(ms).width;
ctx.font = \"12px sans-serif\";
ctx.fillStyle = \"#222\";
ctx.fillText(text, xc, h);
} else {
ctx.textAlign = \"start\";
ctx.font = \"13px sans-serif\";
ctx.fillStyle = \"#222\";
xc = x + event.starttime * ratio + 1;
ctx.fillText(text, xc, h);
xc += ctx.measureText(text).width;
ctx.font = \"11px sans-serif\";
ctx.fillStyle = \"#777\";
ctx.fillText(ms, xc, h);
}
h += gapPerEvent;
});
};
this.drawAll = function(width, threshold)
{
\"use strict\";
width = width || getContainerWidth();
threshold = threshold || this.getThreshold();
var self = this;
_requests.forEach(function(request) {
self.drawOne(request, _maxRequestTime, threshold, width);
});
};
this.getThreshold = function() {
var threshold = Sfjs.getPreference(_storagePrefix + 'threshold');
if (null === threshold) {
return _threshold;
}
_threshold = parseInt(threshold);
return _threshold;
};
this.setThreshold = function(threshold)
{
_threshold = threshold;
Sfjs.setPreference(_storagePrefix + 'threshold', threshold);
return this;
};
}
function canvasAutoUpdateOnResizeAndSubmit(e) {
e.preventDefault();
canvasManager.drawAll();
}
function canvasAutoUpdateOnThresholdChange(e) {
canvasManager
.setThreshold(query('input[name=\"threshold\"]').value)
.drawAll();
}
var requests_data = {
\"max\": ";
// line 466
echo twig_escape_filter($this->env, sprintf("%F", $this->getAttribute($this->getAttribute($this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "events", []), "__section__", []), "endtime", [])), "js", null, true);
echo ",
\"requests\": [
";
// line 468
echo $context["helper"]->getdump_request_data(($context["token"] ?? $this->getContext($context, "token")), ($context["profile"] ?? $this->getContext($context, "profile")), $this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "events", []), $this->getAttribute($this->getAttribute($this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "events", []), "__section__", []), "origin", []));
echo "
";
// line 470
if (twig_length_filter($this->env, $this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "children", []))) {
// line 471
echo " ,
";
// line 472
$context['_parent'] = $context;
$context['_seq'] = twig_ensure_traversable($this->getAttribute(($context["profile"] ?? $this->getContext($context, "profile")), "children", []));
$context['loop'] = [
'parent' => $context['_parent'],
'index0' => 0,
'index' => 1,
'first' => true,
];
if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
$length = count($context['_seq']);
$context['loop']['revindex0'] = $length - 1;
$context['loop']['revindex'] = $length;
$context['loop']['length'] = $length;
$context['loop']['last'] = 1 === $length;
}
foreach ($context['_seq'] as $context["_key"] => $context["child"]) {
// line 473
echo $context["helper"]->getdump_request_data($this->getAttribute($context["child"], "token", []), $context["child"], $this->getAttribute($this->getAttribute($context["child"], "getcollector", [0 => "time"], "method"), "events", []), $this->getAttribute($this->getAttribute($this->getAttribute(($context["collector"] ?? $this->getContext($context, "collector")), "events", []), "__section__", []), "origin", []));
echo (($this->getAttribute($context["loop"], "last", [])) ? ("") : (","));
echo "
";
++$context['loop']['index0'];
++$context['loop']['index'];
$context['loop']['first'] = false;
if (isset($context['loop']['length'])) {
--$context['loop']['revindex0'];
--$context['loop']['revindex'];
$context['loop']['last'] = 0 === $context['loop']['revindex0'];
}
}
$_parent = $context['_parent'];
unset($context['_seq'], $context['_iterated'], $context['_key'], $context['child'], $context['_parent'], $context['loop']);
$context = array_intersect_key($context, $_parent) + $_parent;
}
// line 476
echo " ]
};
var canvasManager = new CanvasManager(requests_data.requests, requests_data.max);
query('input[name=\"threshold\"]').value = canvasManager.getThreshold();
canvasManager.drawAll();
// Update the colors of legends.
var timelineLegends = document.querySelectorAll('.sf-profiler-timeline > .legends > span[data-color]');
for (var i = 0; i < timelineLegends.length; ++i) {
var timelineLegend = timelineLegends[i];
timelineLegend.style.borderLeftColor = timelineLegend.getAttribute('data-color');
}
// Bind event handlers
var elementTimelineControl = query('#timeline-control'),
elementThresholdControl = query('input[name=\"threshold\"]');
window.onresize = canvasAutoUpdateOnResizeAndSubmit;
elementTimelineControl.onsubmit = canvasAutoUpdateOnResizeAndSubmit;
elementThresholdControl.onclick = canvasAutoUpdateOnThresholdChange;
elementThresholdControl.onchange = canvasAutoUpdateOnThresholdChange;
elementThresholdControl.onkeyup = canvasAutoUpdateOnThresholdChange;
window.setTimeout(function() {
canvasAutoUpdateOnThresholdChange(null);
}, 50);
//]]>";
// line 508
echo "</script>
";
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);
}
// line 511
public function getdump_request_data($__token__ = null, $__profile__ = null, $__events__ = null, $__origin__ = null, ...$__varargs__)
{
$context = $this->env->mergeGlobals([
"token" => $__token__,
"profile" => $__profile__,
"events" => $__events__,
"origin" => $__origin__,
"varargs" => $__varargs__,
]);
$blocks = [];
ob_start();
try {
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->env->getExtension("Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension");
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "macro", "dump_request_data"));
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->env->getExtension("Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension");
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "macro", "dump_request_data"));
// line 513
$context["__internal_c0f1a48f700124002ea05b7f418c981e388f8465386ea49d51c5f279e00ae239"] = $this;
// line 514
echo " {
\"id\": \"";
// line 515
echo twig_escape_filter($this->env, ($context["token"] ?? $this->getContext($context, "token")), "js", null, true);
echo "\",
\"left\": ";
// line 516
echo twig_escape_filter($this->env, sprintf("%F", ($this->getAttribute($this->getAttribute(($context["events"] ?? $this->getContext($context, "events")), "__section__", []), "origin", []) - ($context["origin"] ?? $this->getContext($context, "origin")))), "js", null, true);
echo ",
\"events\": [
";
// line 518
echo $context["__internal_c0f1a48f700124002ea05b7f418c981e388f8465386ea49d51c5f279e00ae239"]->getdump_events(($context["events"] ?? $this->getContext($context, "events")));
echo "
]
}
";
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);
} catch (\Exception $e) {
ob_end_clean();
throw $e;
} catch (\Throwable $e) {
ob_end_clean();
throw $e;
}
return ('' === $tmp = ob_get_clean()) ? '' : new Markup($tmp, $this->env->getCharset());
}
// line 524
public function getdump_events($__events__ = null, ...$__varargs__)
{
$context = $this->env->mergeGlobals([
"events" => $__events__,
"varargs" => $__varargs__,
]);
$blocks = [];
ob_start();
try {
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->env->getExtension("Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension");
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "macro", "dump_events"));
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->env->getExtension("Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension");
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "macro", "dump_events"));
// line 526
$context['_parent'] = $context;
$context['_seq'] = twig_ensure_traversable(($context["events"] ?? $this->getContext($context, "events")));
$context['loop'] = [
'parent' => $context['_parent'],
'index0' => 0,
'index' => 1,
'first' => true,
];
if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
$length = count($context['_seq']);
$context['loop']['revindex0'] = $length - 1;
$context['loop']['revindex'] = $length;
$context['loop']['length'] = $length;
$context['loop']['last'] = 1 === $length;
}
foreach ($context['_seq'] as $context["name"] => $context["event"]) {
// line 527
if (("__section__" != $context["name"])) {
// line 528
echo " {
\"name\": \"";
// line 529
echo twig_escape_filter($this->env, $context["name"], "js", null, true);
echo "\",
\"category\": \"";
// line 530
echo twig_escape_filter($this->env, $this->getAttribute($context["event"], "category", []), "js", null, true);
echo "\",
\"origin\": ";
// line 531
echo twig_escape_filter($this->env, sprintf("%F", $this->getAttribute($context["event"], "origin", [])), "js", null, true);
echo ",
\"starttime\": ";
// line 532
echo twig_escape_filter($this->env, sprintf("%F", $this->getAttribute($context["event"], "starttime", [])), "js", null, true);
echo ",
\"endtime\": ";
// line 533
echo twig_escape_filter($this->env, sprintf("%F", $this->getAttribute($context["event"], "endtime", [])), "js", null, true);
echo ",
\"duration\": ";
// line 534
echo twig_escape_filter($this->env, sprintf("%F", $this->getAttribute($context["event"], "duration", [])), "js", null, true);
echo ",
\"memory\": ";
// line 535
echo twig_escape_filter($this->env, sprintf("%.1F", (($this->getAttribute($context["event"], "memory", []) / 1024) / 1024)), "js", null, true);
echo ",
\"periods\": [";
// line 537
$context['_parent'] = $context;
$context['_seq'] = twig_ensure_traversable($this->getAttribute($context["event"], "periods", []));
$context['loop'] = [
'parent' => $context['_parent'],
'index0' => 0,
'index' => 1,
'first' => true,
];
if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
$length = count($context['_seq']);
$context['loop']['revindex0'] = $length - 1;
$context['loop']['revindex'] = $length;
$context['loop']['length'] = $length;
$context['loop']['last'] = 1 === $length;
}
foreach ($context['_seq'] as $context["_key"] => $context["period"]) {
// line 538
echo "{\"start\": ";
echo twig_escape_filter($this->env, sprintf("%F", $this->getAttribute($context["period"], "starttime", [])), "js", null, true);
echo ", \"end\": ";
echo twig_escape_filter($this->env, sprintf("%F", $this->getAttribute($context["period"], "endtime", [])), "js", null, true);
echo "}";
echo (($this->getAttribute($context["loop"], "last", [])) ? ("") : (", "));
++$context['loop']['index0'];
++$context['loop']['index'];
$context['loop']['first'] = false;
if (isset($context['loop']['length'])) {
--$context['loop']['revindex0'];
--$context['loop']['revindex'];
$context['loop']['last'] = 0 === $context['loop']['revindex0'];
}
}
$_parent = $context['_parent'];
unset($context['_seq'], $context['_iterated'], $context['_key'], $context['period'], $context['_parent'], $context['loop']);
$context = array_intersect_key($context, $_parent) + $_parent;
// line 540
echo "]
}";
// line 541
echo (($this->getAttribute($context["loop"], "last", [])) ? ("") : (","));
echo "
";
}
++$context['loop']['index0'];
++$context['loop']['index'];
$context['loop']['first'] = false;
if (isset($context['loop']['length'])) {
--$context['loop']['revindex0'];
--$context['loop']['revindex'];
$context['loop']['last'] = 0 === $context['loop']['revindex0'];
}
}
$_parent = $context['_parent'];
unset($context['_seq'], $context['_iterated'], $context['name'], $context['event'], $context['_parent'], $context['loop']);
$context = array_intersect_key($context, $_parent) + $_parent;
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);
} catch (\Exception $e) {
ob_end_clean();
throw $e;
} catch (\Throwable $e) {
ob_end_clean();
throw $e;
}
return ('' === $tmp = ob_get_clean()) ? '' : new Markup($tmp, $this->env->getCharset());
}
// line 547
public function getdisplay_timeline($__id__ = null, $__events__ = null, $__colors__ = null, ...$__varargs__)
{
$context = $this->env->mergeGlobals([
"id" => $__id__,
"events" => $__events__,
"colors" => $__colors__,
"varargs" => $__varargs__,
]);
$blocks = [];
ob_start();
try {
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->env->getExtension("Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension");
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "macro", "display_timeline"));
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->env->getExtension("Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension");
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "macro", "display_timeline"));
// line 548
echo " <div class=\"sf-profiler-timeline\">
<div class=\"legends\">
";
// line 550
$context['_parent'] = $context;
$context['_seq'] = twig_ensure_traversable(($context["colors"] ?? $this->getContext($context, "colors")));
foreach ($context['_seq'] as $context["category"] => $context["color"]) {
// line 551
echo " <span data-color=\"";
echo twig_escape_filter($this->env, $context["color"], "html", null, true);
echo "\">";
echo twig_escape_filter($this->env, $context["category"], "html", null, true);
echo "</span>
";
}
$_parent = $context['_parent'];
unset($context['_seq'], $context['_iterated'], $context['category'], $context['color'], $context['_parent'], $context['loop']);
$context = array_intersect_key($context, $_parent) + $_parent;
// line 553
echo " </div>
<canvas width=\"680\" height=\"\" id=\"";
// line 554
echo twig_escape_filter($this->env, ($context["id"] ?? $this->getContext($context, "id")), "html", null, true);
echo "\" class=\"timeline\"></canvas>
</div>
";
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
$__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);
} catch (\Exception $e) {
ob_end_clean();
throw $e;
} catch (\Throwable $e) {
ob_end_clean();
throw $e;
}
return ('' === $tmp = ob_get_clean()) ? '' : new Markup($tmp, $this->env->getCharset());
}
public function getTemplateName()
{
return "@WebProfiler/Collector/time.html.twig";
}
public function isTraitable()
{
return false;
}
public function getDebugInfo()
{
return array ( 1070 => 554, 1067 => 553, 1056 => 551, 1052 => 550, 1048 => 548, 1028 => 547, 992 => 541, 989 => 540, 970 => 538, 953 => 537, 949 => 535, 945 => 534, 941 => 533, 937 => 532, 933 => 531, 929 => 530, 925 => 529, 922 => 528, 920 => 527, 903 => 526, 885 => 524, 860 => 518, 855 => 516, 851 => 515, 848 => 514, 846 => 513, 825 => 511, 814 => 508, 780 => 476, 762 => 473, 745 => 472, 742 => 471, 740 => 470, 735 => 468, 730 => 466, 454 => 193, 410 => 151, 407 => 150, 404 => 149, 396 => 147, 390 => 144, 384 => 143, 381 => 142, 378 => 141, 374 => 140, 369 => 138, 365 => 136, 363 => 135, 358 => 133, 355 => 132, 349 => 129, 346 => 128, 344 => 127, 338 => 124, 334 => 123, 329 => 121, 326 => 120, 324 => 119, 315 => 112, 306 => 111, 292 => 107, 286 => 103, 284 => 102, 279 => 99, 277 => 98, 271 => 94, 265 => 91, 261 => 90, 257 => 88, 254 => 87, 251 => 86, 248 => 85, 242 => 84, 239 => 83, 234 => 82, 231 => 81, 229 => 80, 223 => 77, 219 => 76, 214 => 73, 212 => 72, 209 => 71, 202 => 67, 199 => 66, 197 => 65, 190 => 61, 182 => 56, 176 => 52, 173 => 51, 164 => 50, 150 => 45, 147 => 44, 138 => 43, 126 => 40, 123 => 39, 117 => 36, 110 => 32, 106 => 30, 104 => 29, 101 => 28, 95 => 25, 90 => 24, 88 => 23, 85 => 22, 82 => 21, 79 => 20, 77 => 19, 74 => 18, 71 => 17, 62 => 16, 52 => 1, 49 => 6, 47 => 5, 45 => 3, 22 => 1,);
}
/** @deprecated since 1.27 (to be removed in 2.0). Use getSourceContext() instead */
public function getSource()
{
@trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use getSourceContext() instead.', E_USER_DEPRECATED);
return $this->getSourceContext()->getCode();
}
public function getSourceContext()
{
return new Source("{% extends '@WebProfiler/Profiler/layout.html.twig' %}
{% import _self as helper %}
{% if colors is not defined %}
{% set colors = {
'default': '#999',
'section': '#444',
'event_listener': '#00B8F5',
'template': '#66CC00',
'doctrine': '#FF6633',
} %}
{% endif %}
{% block toolbar %}
{% set has_time_events = collector.events|length > 0 %}
{% set total_time = has_time_events ? '%.0f'|format(collector.duration) : 'n/a' %}
{% set initialization_time = collector.events|length ? '%.0f'|format(collector.inittime) : 'n/a' %}
{% set status_color = has_time_events and collector.duration > 1000 ? 'yellow' : '' %}
{% set icon %}
{{ include('@WebProfiler/Icon/time.svg') }}
<span class=\"sf-toolbar-value\">{{ total_time }}</span>
<span class=\"sf-toolbar-label\">ms</span>
{% endset %}
{% set text %}
<div class=\"sf-toolbar-info-piece\">
<b>Total time</b>
<span>{{ total_time }} ms</span>
</div>
<div class=\"sf-toolbar-info-piece\">
<b>Initialization time</b>
<span>{{ initialization_time }} ms</span>
</div>
{% endset %}
{{ include('@WebProfiler/Profiler/toolbar_item.html.twig', { link: profiler_url, status: status_color }) }}
{% endblock %}
{% block menu %}
<span class=\"label\">
<span class=\"icon\">{{ include('@WebProfiler/Icon/time.svg') }}</span>
<strong>Performance</strong>
</span>
{% endblock %}
{% block panel %}
{% set has_time_events = collector.events|length > 0 %}
<h2>Performance metrics</h2>
<div class=\"metrics\">
<div class=\"metric\">
<span class=\"value\">{{ '%.0f'|format(collector.duration) }} <span class=\"unit\">ms</span></span>
<span class=\"label\">Total execution time</span>
</div>
<div class=\"metric\">
<span class=\"value\">{{ '%.0f'|format(collector.inittime) }} <span class=\"unit\">ms</span></span>
<span class=\"label\">Symfony initialization</span>
</div>
{% if profile.collectors.memory %}
<div class=\"metric\">
<span class=\"value\">{{ '%.2f'|format(profile.collectors.memory.memory / 1024 / 1024) }} <span class=\"unit\">MB</span></span>
<span class=\"label\">Peak memory usage</span>
</div>
{% endif %}
{% if profile.children|length > 0 %}
<div class=\"metric-divider\"></div>
<div class=\"metric\">
<span class=\"value\">{{ profile.children|length }}</span>
<span class=\"label\">Sub-Request{{ profile.children|length > 1 ? 's' }}</span>
</div>
{% if has_time_events %}
{% set subrequests_time = 0 %}
{% for child in profile.children %}
{% set subrequests_time = subrequests_time + child.getcollector('time').events.__section__.duration %}
{% endfor %}
{% else %}
{% set subrequests_time = 'n/a' %}
{% endif %}
<div class=\"metric\">
<span class=\"value\">{{ subrequests_time }} <span class=\"unit\">ms</span></span>
<span class=\"label\">Sub-Request{{ profile.children|length > 1 ? 's' }} time</span>
</div>
{% endif %}
</div>
<h2>Execution timeline</h2>
{% if not collector.isStopwatchInstalled() %}
<div class=\"empty\">
<p>The Stopwatch component is not installed. If you want to see timing events, run: <code>composer require symfony/stopwatch</code>.</p>
</div>
{% elseif collector.events is empty %}
<div class=\"empty\">
<p>No timing events have been recorded. Are you sure that debugging is enabled in the kernel?</p>
</div>
{% else %}
{{ block('panelContent') }}
{% endif %}
{% endblock %}
{% block panelContent %}
<form id=\"timeline-control\" action=\"\" method=\"get\">
<input type=\"hidden\" name=\"panel\" value=\"time\">
<label for=\"threshold\">Threshold</label>
<input type=\"number\" size=\"3\" name=\"threshold\" id=\"threshold\" value=\"3\" min=\"0\"> ms
<span class=\"help\">(timeline only displays events with a duration longer than this threshold)</span>
</form>
{% if profile.parent %}
<h3 class=\"dump-inline\">
Sub-Request {{ profiler_dump(profile.getcollector('request').requestattributes.get('_controller')) }}
<small>
{{ collector.events.__section__.duration }} ms
<a class=\"newline\" href=\"{{ path('_profiler', { token: profile.parent.token, panel: 'time' }) }}\">Return to parent request</a>
</small>
</h3>
{% elseif profile.children|length > 0 %}
<h3>
Main Request <small>{{ collector.events.__section__.duration }} ms</small>
</h3>
{% endif %}
{{ helper.display_timeline('timeline_' ~ token, collector.events, colors) }}
{% if profile.children|length %}
<p class=\"help\">Note: sections with a striped background correspond to sub-requests.</p>
<h3>Sub-requests <small>({{ profile.children|length }})</small></h3>
{% for child in profile.children %}
{% set events = child.getcollector('time').events %}
<h4>
<a href=\"{{ path('_profiler', { token: child.token, panel: 'time' }) }}\">{{ child.getcollector('request').identifier }}</a>
<small>{{ events.__section__.duration }} ms</small>
</h4>
{{ helper.display_timeline('timeline_' ~ child.token, events, colors) }}
{% endfor %}
{% endif %}
<script>{% autoescape 'js' %}//<![CDATA[
/**
* In-memory key-value cache manager
*/
var cache = new function() {
\"use strict\";
var dict = {};
this.get = function(key) {
return dict.hasOwnProperty(key)
? dict[key]
: null;
};
this.set = function(key, value) {
dict[key] = value;
return value;
};
};
/**
* Query an element with a CSS selector.
*
* @param {string} selector - a CSS-selector-compatible query string
*
* @return DOMElement|null
*/
function query(selector)
{
\"use strict\";
var key = 'SELECTOR: ' + selector;
return cache.get(key) || cache.set(key, document.querySelector(selector));
}
/**
* Canvas Manager
*/
function CanvasManager(requests, maxRequestTime) {
\"use strict\";
var _drawingColors = {{ colors|json_encode|raw }},
_storagePrefix = 'timeline/',
_threshold = 1,
_requests = requests,
_maxRequestTime = maxRequestTime;
/**
* Check whether this event is a child event.
*
* @return true if it is
*/
function isChildEvent(event)
{
return '__section__.child' === event.name;
}
/**
* Check whether this event is categorized in 'section'.
*
* @return true if it is
*/
function isSectionEvent(event)
{
return 'section' === event.category;
}
/**
* Get the width of the container.
*/
function getContainerWidth()
{
return query('#collector-content h2').clientWidth;
}
/**
* Draw one canvas.
*
* @param request the request object
* @param max <subjected for removal>
* @param threshold the threshold (lower bound) of the length of the timeline (in milliseconds)
* @param width the width of the canvas
*/
this.drawOne = function(request, max, threshold, width)
{
\"use strict\";
var text,
ms,
xc,
drawableEvents,
mainEvents,
elementId = 'timeline_' + request.id,
canvasHeight = 0,
gapPerEvent = 38,
colors = _drawingColors,
space = 10.5,
ratio = (width - space * 2) / max,
h = space,
x = request.left * ratio + space, // position
canvas = cache.get(elementId) || cache.set(elementId, document.getElementById(elementId)),
ctx = canvas.getContext(\"2d\"),
scaleRatio,
devicePixelRatio;
// Filter events whose total time is below the threshold.
drawableEvents = request.events.filter(function(event) {
return event.duration >= threshold;
});
canvasHeight += gapPerEvent * drawableEvents.length;
// For retina displays so text and boxes will be crisp
devicePixelRatio = window.devicePixelRatio == \"undefined\" ? 1 : window.devicePixelRatio;
scaleRatio = devicePixelRatio / 1;
canvas.width = width * scaleRatio;
canvas.height = canvasHeight * scaleRatio;
canvas.style.width = width + 'px';
canvas.style.height = canvasHeight + 'px';
ctx.scale(scaleRatio, scaleRatio);
ctx.textBaseline = \"middle\";
ctx.lineWidth = 0;
// For each event, draw a line.
ctx.strokeStyle = \"#CCC\";
drawableEvents.forEach(function(event) {
event.periods.forEach(function(period) {
var timelineHeadPosition = x + period.start * ratio;
if (isChildEvent(event)) {
/* create a striped background dynamically */
var img = new Image();
img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKBAMAAAB/HNKOAAAAIVBMVEX////w8PDd7h7d7h7d7h7d7h7w8PDw8PDw8PDw8PDw8PAOi84XAAAAKUlEQVQImWNI71zAwMBQMYuBgY0BxExnADErGEDMTgYQE8hnAKtCZwIAlcMNSR9a1OEAAAAASUVORK5CYII=';
var pattern = ctx.createPattern(img, 'repeat');
ctx.fillStyle = pattern;
ctx.fillRect(timelineHeadPosition, 0, (period.end - period.start) * ratio, canvasHeight);
} else if (isSectionEvent(event)) {
var timelineTailPosition = x + period.end * ratio;
ctx.beginPath();
ctx.moveTo(timelineHeadPosition, 0);
ctx.lineTo(timelineHeadPosition, canvasHeight);
ctx.moveTo(timelineTailPosition, 0);
ctx.lineTo(timelineTailPosition, canvasHeight);
ctx.fill();
ctx.closePath();
ctx.stroke();
}
});
});
// Filter for main events.
mainEvents = drawableEvents.filter(function(event) {
return !isChildEvent(event)
});
// For each main event, draw the visual presentation of timelines.
mainEvents.forEach(function(event) {
h += 8;
// For each sub event, ...
event.periods.forEach(function(period) {
// Set the drawing style.
ctx.fillStyle = colors['default'];
ctx.strokeStyle = colors['default'];
if (colors[event.name]) {
ctx.fillStyle = colors[event.name];
ctx.strokeStyle = colors[event.name];
} else if (colors[event.category]) {
ctx.fillStyle = colors[event.category];
ctx.strokeStyle = colors[event.category];
}
// Draw the timeline
var timelineHeadPosition = x + period.start * ratio;
if (!isSectionEvent(event)) {
ctx.fillRect(timelineHeadPosition, h + 3, 2, 8);
ctx.fillRect(timelineHeadPosition, h, (period.end - period.start) * ratio || 2, 6);
} else {
var timelineTailPosition = x + period.end * ratio;
ctx.beginPath();
ctx.moveTo(timelineHeadPosition, h);
ctx.lineTo(timelineHeadPosition, h + 11);
ctx.lineTo(timelineHeadPosition + 8, h);
ctx.lineTo(timelineHeadPosition, h);
ctx.fill();
ctx.closePath();
ctx.stroke();
ctx.beginPath();
ctx.moveTo(timelineTailPosition, h);
ctx.lineTo(timelineTailPosition, h + 11);
ctx.lineTo(timelineTailPosition - 8, h);
ctx.lineTo(timelineTailPosition, h);
ctx.fill();
ctx.closePath();
ctx.stroke();
ctx.beginPath();
ctx.moveTo(timelineHeadPosition, h);
ctx.lineTo(timelineTailPosition, h);
ctx.lineTo(timelineTailPosition, h + 2);
ctx.lineTo(timelineHeadPosition, h + 2);
ctx.lineTo(timelineHeadPosition, h);
ctx.fill();
ctx.closePath();
ctx.stroke();
}
});
h += 30;
ctx.beginPath();
ctx.strokeStyle = \"#E0E0E0\";
ctx.moveTo(0, h - 10);
ctx.lineTo(width, h - 10);
ctx.closePath();
ctx.stroke();
});
h = space;
// For each event, draw the label.
mainEvents.forEach(function(event) {
ctx.fillStyle = \"#444\";
ctx.font = \"12px sans-serif\";
text = event.name;
ms = \" \" + (event.duration < 1 ? event.duration : parseInt(event.duration, 10)) + \" ms / \" + event.memory + \" MB\";
if (x + event.starttime * ratio + ctx.measureText(text + ms).width > width) {
ctx.textAlign = \"end\";
ctx.font = \"10px sans-serif\";
ctx.fillStyle = \"#777\";
xc = x + event.endtime * ratio - 1;
ctx.fillText(ms, xc, h);
xc -= ctx.measureText(ms).width;
ctx.font = \"12px sans-serif\";
ctx.fillStyle = \"#222\";
ctx.fillText(text, xc, h);
} else {
ctx.textAlign = \"start\";
ctx.font = \"13px sans-serif\";
ctx.fillStyle = \"#222\";
xc = x + event.starttime * ratio + 1;
ctx.fillText(text, xc, h);
xc += ctx.measureText(text).width;
ctx.font = \"11px sans-serif\";
ctx.fillStyle = \"#777\";
ctx.fillText(ms, xc, h);
}
h += gapPerEvent;
});
};
this.drawAll = function(width, threshold)
{
\"use strict\";
width = width || getContainerWidth();
threshold = threshold || this.getThreshold();
var self = this;
_requests.forEach(function(request) {
self.drawOne(request, _maxRequestTime, threshold, width);
});
};
this.getThreshold = function() {
var threshold = Sfjs.getPreference(_storagePrefix + 'threshold');
if (null === threshold) {
return _threshold;
}
_threshold = parseInt(threshold);
return _threshold;
};
this.setThreshold = function(threshold)
{
_threshold = threshold;
Sfjs.setPreference(_storagePrefix + 'threshold', threshold);
return this;
};
}
function canvasAutoUpdateOnResizeAndSubmit(e) {
e.preventDefault();
canvasManager.drawAll();
}
function canvasAutoUpdateOnThresholdChange(e) {
canvasManager
.setThreshold(query('input[name=\"threshold\"]').value)
.drawAll();
}
var requests_data = {
\"max\": {{ \"%F\"|format(collector.events.__section__.endtime) }},
\"requests\": [
{{ helper.dump_request_data(token, profile, collector.events, collector.events.__section__.origin) }}
{% if profile.children|length %}
,
{% for child in profile.children %}
{{ helper.dump_request_data(child.token, child, child.getcollector('time').events, collector.events.__section__.origin) }}{{ loop.last ? '' : ',' }}
{% endfor %}
{% endif %}
]
};
var canvasManager = new CanvasManager(requests_data.requests, requests_data.max);
query('input[name=\"threshold\"]').value = canvasManager.getThreshold();
canvasManager.drawAll();
// Update the colors of legends.
var timelineLegends = document.querySelectorAll('.sf-profiler-timeline > .legends > span[data-color]');
for (var i = 0; i < timelineLegends.length; ++i) {
var timelineLegend = timelineLegends[i];
timelineLegend.style.borderLeftColor = timelineLegend.getAttribute('data-color');
}
// Bind event handlers
var elementTimelineControl = query('#timeline-control'),
elementThresholdControl = query('input[name=\"threshold\"]');
window.onresize = canvasAutoUpdateOnResizeAndSubmit;
elementTimelineControl.onsubmit = canvasAutoUpdateOnResizeAndSubmit;
elementThresholdControl.onclick = canvasAutoUpdateOnThresholdChange;
elementThresholdControl.onchange = canvasAutoUpdateOnThresholdChange;
elementThresholdControl.onkeyup = canvasAutoUpdateOnThresholdChange;
window.setTimeout(function() {
canvasAutoUpdateOnThresholdChange(null);
}, 50);
//]]>{% endautoescape %}</script>
{% endblock %}
{% macro dump_request_data(token, profile, events, origin) %}
{% autoescape 'js' %}
{% from _self import dump_events %}
{
\"id\": \"{{ token }}\",
\"left\": {{ \"%F\"|format(events.__section__.origin - origin) }},
\"events\": [
{{ dump_events(events) }}
]
}
{% endautoescape %}
{% endmacro %}
{% macro dump_events(events) %}
{% autoescape 'js' %}
{% for name, event in events %}
{% if '__section__' != name %}
{
\"name\": \"{{ name }}\",
\"category\": \"{{ event.category }}\",
\"origin\": {{ \"%F\"|format(event.origin) }},
\"starttime\": {{ \"%F\"|format(event.starttime) }},
\"endtime\": {{ \"%F\"|format(event.endtime) }},
\"duration\": {{ \"%F\"|format(event.duration) }},
\"memory\": {{ \"%.1F\"|format(event.memory / 1024 / 1024) }},
\"periods\": [
{%- for period in event.periods -%}
{\"start\": {{ \"%F\"|format(period.starttime) }}, \"end\": {{ \"%F\"|format(period.endtime) }}}{{ loop.last ? '' : ', ' }}
{%- endfor -%}
]
}{{ loop.last ? '' : ',' }}
{% endif %}
{% endfor %}
{% endautoescape %}
{% endmacro %}
{% macro display_timeline(id, events, colors) %}
<div class=\"sf-profiler-timeline\">
<div class=\"legends\">
{% for category, color in colors %}
<span data-color=\"{{ color }}\">{{ category }}</span>
{% endfor %}
</div>
<canvas width=\"680\" height=\"\" id=\"{{ id }}\" class=\"timeline\"></canvas>
</div>
{% endmacro %}
", "@WebProfiler/Collector/time.html.twig", "/Volumes/Dev/Sources/Clients/taome/Nouveau_site/www/vendor/symfony/symfony/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/time.html.twig");
}
}