[Rt-commit] rt branch 5.0/lifecycle-viewer created. rt-5.0.4-247-g526ffb0ed3
BPS Git Server
git at git.bestpractical.com
Wed Oct 11 19:21:32 UTC 2023
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "rt".
The branch, 5.0/lifecycle-viewer has been created
at 526ffb0ed3e3f8a57b8dbbd6b8805065406efb4a (commit)
- Log -----------------------------------------------------------------
commit 526ffb0ed3e3f8a57b8dbbd6b8805065406efb4a
Author: sunnavy <sunnavy at bestpractical.com>
Date: Wed Jul 13 04:02:50 2022 +0800
Support to show lifecycle UI on ticket/asset display pages
diff --git a/etc/RT_Config.pm.in b/etc/RT_Config.pm.in
index 0cb6c5ad18..305b87946e 100644
--- a/etc/RT_Config.pm.in
+++ b/etc/RT_Config.pm.in
@@ -3029,6 +3029,14 @@ Set this option to C<0> to disable this feature.
Set($QuoteSelectedText, 1);
+=item C<$ShowLifecycleViewer>
+
+Set to 1 to show lifecycle viewer on ticket/asset display pages.
+
+=cut
+
+Set($ShowLifecycleViewer, 0);
+
=back
=head2 Group Summary Configuration
diff --git a/lib/RT/Config.pm b/lib/RT/Config.pm
index 1be99dfa86..95f789d2ef 100644
--- a/lib/RT/Config.pm
+++ b/lib/RT/Config.pm
@@ -650,6 +650,16 @@ our %META;
}
},
+ ShowLifecycleViewer => {
+ Section => 'Ticket display',
+ Overridable => 1,
+ SortOrder => 14,
+ Widget => '/Widgets/Form/Boolean',
+ WidgetArguments => {
+ Description => 'Show lifecycle viewer', #loc
+ },
+ },
+
# User overridable locale options
DateTimeFormat => {
Section => 'Locale', #loc
diff --git a/share/html/Asset/Elements/ShowSummary b/share/html/Asset/Elements/ShowSummary
index 3aa12a3b22..9840212d44 100644
--- a/share/html/Asset/Elements/ShowSummary
+++ b/share/html/Asset/Elements/ShowSummary
@@ -84,5 +84,19 @@ for my $section (@sections) {
TitleBoxARGS => { title_class => "inverse" },
GroupingClass => 'col-4'
&>
+
+% if ( RT->Config->Get( 'ShowLifecycleViewer', $session{CurrentUser} ) ) {
+% my $modify_url = RT->Config->Get('WebPath'). "/Admin/Lifecycles/Modify.html?Type=asset&Name=" . $AssetObj->LifecycleObj->Name;
+% my $expand = loc('Expand');
+ <div class="col-8">
+ <&| /Widgets/TitleBox, title => loc('Lifecycle'),
+ $session{'CurrentUser'}->HasRight(Object=> $RT::System, Right => 'SuperUser') ? (title_href => $modify_url) : (),
+ titleright_raw => qq{<a href="#" data-toggle="modal" data-target="#lifecycle-ui-viewer-modal"><span class="fas fa-expand-arrows-alt icon-bordered fa-2x" alt="$expand" data-toggle="tooltip" data-placement="top" data-original-title="$expand"></span></a>},
+ class => 'asset-info-lifecycle',
+ &>
+ <& /Elements/Lifecycle/Viewer, Object => $AssetObj &>
+ </&>
+ </div>
+% }
</div>
</div>
diff --git a/share/html/Elements/Lifecycle/Viewer b/share/html/Elements/Lifecycle/Viewer
new file mode 100644
index 0000000000..0ae4e683ac
--- /dev/null
+++ b/share/html/Elements/Lifecycle/Viewer
@@ -0,0 +1,184 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2022 Best Practical Solutions, LLC
+%# <sales at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+
+<div class="lifecycle-ui lifecycle-ui-viewer" id="lifecycle-ui-viewer" data-id="<% $Object->Id %>" data-status="<% $current_status %>">
+ <script type="text/javascript" src="<% RT->Config->Get('WebPath') %>/static/js/d3.min.js"></script>
+ <script type="text/javascript" src="<% RT->Config->Get('WebPath') %>/static/js/lifecycleui-viewer.js"></script>
+
+ <div class="lifecycle-ui-float">
+ <div id="lifecycle-ui-tooltip" data-toggle="tooltip" data-html="true"></div>
+
+% for my $status (keys %menus) {
+ <div class="lifecycle-ui-status-menu hidden" data-status="<% $status %>">
+% my $menu = $menus{$status};
+ <& /Elements/Menu, menu => $menu &>
+ </div>
+% }
+ </div>
+
+ <div class="form-row">
+ <div class="col-12">
+ <svg></svg>
+ </div>
+ </div>
+
+ <div class="modal fade" id="lifecycle-ui-viewer-modal" data-id="<% $Object->Id %>" data-status="<% $current_status %>">
+ <div class="modal-dialog modal-xl modal-dialog-centered" role="document">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h5 class="modal-title"><&|/l&>Lifecycle</&></h5>
+ <a href="javascript:void(0)" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">×</span>
+ </a>
+ </div>
+ <div class="modal-body">
+ <div class="form-row">
+ <div class="col-12">
+ <svg></svg>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+
+
+<script type="text/javascript">
+ jQuery(function () {
+ new RT.LifecycleViewer( document.getElementById('lifecycle-ui-viewer'), <% $config |n %> <% $layout ? ", $layout" : () |n %> );
+ // Move to body to avoid container's position style, which ruins the position calculation of actions/tooltips.
+ jQuery('.lifecycle-ui-float').detach().appendTo('body');
+
+ jQuery('#lifecycle-ui-viewer-modal').on('shown.bs.modal', function() {
+ if ( !jQuery(this).hasClass('expanded') ) {
+ new RT.LifecycleViewer( document.getElementById('lifecycle-ui-viewer-modal'), <% $config |n %> <% $layout ? ", $layout" : () |n %> );
+ jQuery(this).addClass('expanded');
+ }
+ });
+ });
+</script>
+<%INIT>
+
+my $name = $Object->LifecycleObj->Name;
+
+my $config = JSON( RT->Config->Get('Lifecycles')->{$name} );
+
+my $conf = RT::Configuration->new( $session{CurrentUser} );
+$conf->LoadByCols( 'Name' => "LifecycleLayout-$name", Disabled => 0 );
+my $layout = JSON( $conf->_DeserializeContent( $conf->Content ) ) if $conf->Id;
+
+my $lifecycle = $Object->LifecycleObj;
+
+my %menus;
+
+# largely borrowed from /Elements/Tabs
+my $current_status = $Object->Status;
+my $hide_resolve_with_deps = RT->Config->Get('HideResolveActionsWithDependencies')
+ && $Object->HasUnresolvedDependencies;
+my $query_string = sub {
+ my %args = @_;
+ my $u = URI->new();
+ $u->query_form( map { $_ => $args{$_} } sort keys %args );
+ return $u->query;
+};
+
+for my $status ( $lifecycle->Valid ) {
+ $menus{$status} = RT::Interface::Web::Menu->new();
+}
+
+my $add_menu = sub {
+ my $next = shift;
+ my $info = shift || {};
+
+ return unless $lifecycle->IsTransition( $current_status => $next );
+
+ my $check = $lifecycle->CheckRight( $current_status => $next );
+ return unless $Object->CurrentUserHasRight($check);
+
+ return
+ if $hide_resolve_with_deps
+ && $lifecycle->IsInactive($next)
+ && !$lifecycle->IsInactive($current_status);
+
+ my $action = $info->{'update'} || '';
+ my $url = '/Ticket/';
+ $url .= "Update.html?"
+ . $query_string->(
+ $action
+ ? ( Action => $action )
+ : ( SubmitTicket => 1, Status => $next ),
+ DefaultStatus => $next,
+ id => $Object->Id,
+ );
+ my $key = $info->{'label'};
+ $menus{$next}->child(
+ $key => title => loc($key),
+ path => $url,
+ attributes => {
+ $info->{description}
+ ? (
+ 'data-toggle' => 'tooltip',
+ 'data-original-title' => loc( $info->{description} ),
+ alt => loc( $info->{description} ),
+ )
+ : (),
+ }
+ );
+};
+
+foreach my $info ( $lifecycle->Actions($current_status) ) {
+ $add_menu->( $info->{to}, $info );
+}
+
+</%INIT>
+
+<%ARGS>
+$Object
+</%ARGS>
diff --git a/share/html/Ticket/Elements/ShowSummary b/share/html/Ticket/Elements/ShowSummary
index f5dcaee5c6..9765364fc0 100644
--- a/share/html/Ticket/Elements/ShowSummary
+++ b/share/html/Ticket/Elements/ShowSummary
@@ -126,6 +126,19 @@ my $people_behavior = $InlineEdit ? ($inline_edit_behavior{People} || $inline_ed
<& /Ticket/Elements/ShowAttachments, Ticket => $Ticket, Attachments => $Attachments, Count => RT->Config->Get('AttachmentListCount') &>
% $m->callback( %ARGS, CallbackName => 'AfterAttachments' );
<& /Ticket/Elements/ShowRequestor, Ticket => $Ticket &>
+
+% if ( RT->Config->Get( 'ShowLifecycleViewer', $session{CurrentUser} ) ) {
+% my $modify_url = RT->Config->Get('WebPath'). "/Admin/Lifecycles/Modify.html?Type=ticket&Name=" . $Ticket->LifecycleObj->Name;
+% my $expand = loc('Expand');
+ <&| /Widgets/TitleBox, title => loc('Lifecycle'),
+ $session{'CurrentUser'}->HasRight(Object=> $RT::System, Right => 'SuperUser') ? (title_href => $modify_url) : (),
+ titleright_raw => qq{<a href="#" data-toggle="modal" data-target="#lifecycle-ui-viewer-modal"><span class="fas fa-expand-arrows-alt icon-bordered fa-2x" alt="$expand" data-toggle="tooltip" data-placement="top" data-original-title="$expand"></span></a>},
+ class => 'ticket-info-lifecycle',
+ &>
+ <& /Elements/Lifecycle/Viewer, Object => $Ticket &>
+ </&>
+% }
+
% $m->callback( %ARGS, CallbackName => 'LeftColumn' );
</div>
<div class="boxcontainer col-md-6">
diff --git a/share/static/css/elevator-light/boxes.css b/share/static/css/elevator-light/boxes.css
index f1bc9c61e2..4c7062d808 100644
--- a/share/static/css/elevator-light/boxes.css
+++ b/share/static/css/elevator-light/boxes.css
@@ -142,6 +142,9 @@ div.results .titlebox .titlebox-content {
.titlebox.card.ticket-info-article {
border-top: 3px solid #E58F45;
}
+.titlebox.card.ticket-info-lifecycle, .titlebox.card.asset-info-lifecycle {
+ border-top: 3px solid #f3bf4c;
+}
/* reset to default border for .card-body */
#comp-Admin-Queues-DefaultValues .titlebox.card.ticket-info-cfs {
border-top: 1px solid #dde4eb;
diff --git a/share/static/css/elevator-light/lifecycleui.css b/share/static/css/elevator-light/lifecycleui.css
index 9f0717dd2c..d52d26ac1b 100644
--- a/share/static/css/elevator-light/lifecycleui.css
+++ b/share/static/css/elevator-light/lifecycleui.css
@@ -58,3 +58,32 @@ svg .rect {
position: absolute;
z-index: 999;
}
+
+.lifecycle-ui-status-menu {
+ position: absolute;
+ z-index: 99;
+}
+
+.lifecycle-ui-viewer .link {
+ stroke: #888;
+ cursor: crosshair;
+}
+
+.lifecycle-ui-viewer .marker {
+ fill: #888;
+}
+
+
+.lifecycle-ui-viewer .status-active {
+ cursor: pointer;
+}
+
+.lifecycle-ui-viewer .link-active {
+ stroke: #87a96b;
+ cursor: pointer;
+}
+
+.lifecycle-ui-viewer .marker-active,
+.lifecycle-ui-viewer .status-current {
+ fill: #87a96b;
+}
diff --git a/share/static/js/lifecycleui-viewer.js b/share/static/js/lifecycleui-viewer.js
new file mode 100644
index 0000000000..4ca03a3052
--- /dev/null
+++ b/share/static/js/lifecycleui-viewer.js
@@ -0,0 +1,452 @@
+jQuery(function () {
+ RT.LifecycleViewer = class LifecycleViewer {
+ constructor(container, config, layout) {
+ this.links_seq = 0;
+ this.nodes_seq = 0;
+ // Here we store the '' => transitions
+ this.create_nodes = [];
+
+ var self = this;
+ self.width = 900;
+ self.height = 350;
+ self.node_radius = 35;
+ self.layout = layout;
+ self.enableSimulation = 1;
+ self.current_status = container.getAttribute('data-status');
+ self.object_id = container.getAttribute('data-id');
+ self.container = container;
+
+ self.active_statuses = config.transitions[self.current_status];
+ if ( self.layout ) {
+ self.enableSimulation = 0;
+ }
+
+ self.svg = d3.select(container).select('svg')
+ .attr("preserveAspectRatio", "xMinYMin meet")
+ .attr("viewBox", "0 0 "+self.width+" "+self.height)
+ .classed("svg-content-responsive", true)
+ .attr("border", 1);
+
+ self.svg.append("rect")
+ .classed("rect", true)
+ .attr("x", 0)
+ .attr("y", 0)
+ .attr("height", self.height)
+ .attr("width", self.width)
+ .style("stroke", 'black')
+ .style("fill", "none")
+ .style("stroke-width", 1);
+
+ self.config = config;
+ self.links = [];
+ self.nodes = [];
+
+ self.NodesFromConfig(config);
+ self.nodes.forEach(function(source) {
+ self.LinksForNodeFromConfig(source.name).forEach(function(targetName) {
+ // Get our target node
+ var target = self.nodes.filter(function(source) { return source.name === targetName; })[0];
+ if (!target) { return };
+
+ if ( source.id < target.id ) {
+ self.links.push({
+ id: ++self.links_seq,
+ source: source,
+ target: target,
+ start: false,
+ end: true,
+ descriptions: {
+ [source.name + ' -> ' + target.name]: self.config.descriptions[source.name + ' -> ' + target.name],
+ [target.name + ' -> ' + source.name]: self.config.descriptions[target.name + ' -> ' + source.name],
+ }
+ });
+ return;
+ }
+ var link = self.links.filter(function(l) { return (l.source === target && l.target === source); })[0];
+ if (link) {
+ link.start = true;
+ } else {
+ self.links.push({
+ id: ++self.links_seq,
+ source: source,
+ target: target,
+ start: false,
+ end: true,
+ descriptions: {
+ [source.name + ' -> ' + target.name]: self.config.descriptions[source.name + ' -> ' + target.name],
+ [target.name + ' -> ' + source.name]: self.config.descriptions[target.name + ' -> ' + source.name],
+ }
+ });
+ }
+ });
+ if ( !self.enableSimulation ) {
+ if (self.layout[source.name][0]) source.x = parseInt(self.layout[source.name][0]);
+ if (self.layout[source.name][1]) source.y = parseInt(self.layout[source.name][1]);
+ }
+ });
+
+ self.simulation = d3.forceSimulation();
+ const link_size = self.nodes.length > 10 ? 300 : self.nodes.length * 35;
+ if ( !self.enableSimulation ) {
+ self.simulation
+ .force("link", null)
+ .force("charge", null)
+ .force("center", null)
+ .force('collision', null);
+ }
+ else {
+ self.simulation
+ .force("link", d3.forceLink().distance(link_size < 100 ? 200 : link_size).strength(0.2))
+ .force("charge", d3.forceManyBody().strength(-200))
+ .force("center", d3.forceCenter(self.width / 2, self.height / 2))
+ .force('collision', d3.forceCollide().radius(function(d) {
+ return d.radius
+ }));
+ }
+
+ self.SetUp();
+ self.RenderNode();
+ self.RenderLink();
+
+ self.simulation
+ .nodes(self.nodes)
+ .on("tick", function (t) {
+ self.node.attr("transform", function (d) {
+
+ var x = d.x, y = d.y;
+ if ( d.x + self.node_radius / 2 > self.width ) x = self.width - self.node_radius;
+ if ( d.x - self.node_radius / 2 <= 0 ) x = self.node_radius;
+ if ( d.y + self.node_radius / 2 > self.height ) y = self.height - self.node_radius;
+ if ( d.y - self.node_radius / 2 <= 0 ) y = self.node_radius;
+
+ if ( !self.enableSimulation ) {
+ d.fx = x;
+ d.fy = y;
+ }
+ else {
+ d.fx = null;
+ d.fy = null;
+ }
+
+ return "translate(" + x + "," + y + ")";
+ });
+
+ self.link.attr('d', (function(d) {
+ var sx = d.source.x,
+ sy = d.source.y,
+ tx = d.target.x,
+ ty = d.target.y;
+
+ if ( sx + self.node_radius / 2 > self.width ) sx = self.width - self.node_radius;
+ if ( sx - self.node_radius / 2 <= 0 ) sx = self.node_radius;
+ if ( sy + self.node_radius / 2 > self.height ) sy = self.height - self.node_radius;
+ if ( sy - self.node_radius / 2 <= 0 ) sy = self.node_radius;
+ if ( tx + self.node_radius / 2 > self.width ) tx = self.width - self.node_radius;
+ if ( tx - self.node_radius / 2 <= 0 ) tx = self.node_radius;
+ if ( ty + self.node_radius / 2 > self.height ) ty = self.height - self.node_radius;
+ if ( ty - self.node_radius / 2 <= 0 ) ty = self.node_radius;
+
+ var deltaX = tx - sx,
+ deltaY = ty - sy,
+ dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY),
+ normX = deltaX / dist,
+ normY = deltaY / dist,
+ sourcePadding = 45,
+ targetPadding = 45,
+ sourceX = sx + (sourcePadding * normX),
+ sourceY = sy + (sourcePadding * normY),
+ targetX = tx - (targetPadding * normX),
+ targetY = ty - (targetPadding * normY);
+ return 'M' + sourceX + ',' + sourceY + 'L' + targetX + ',' + targetY;
+ })
+ );
+ });
+ }
+
+ SetUp() {
+ var self = this;
+
+ // define arrow markers for graph links
+ self.svg.append('svg:defs').append('svg:marker')
+ .attr('id', 'end-arrow')
+ .attr('viewBox', '0 -5 10 10')
+ .attr('refX', 6)
+ .attr('markerWidth', 5)
+ .attr('markerHeight', 5)
+ .attr('orient', 'auto')
+ .append('svg:path')
+ .attr('d', 'M0,-5L10,0L0,5')
+ .attr('class', 'marker');
+
+ self.svg.append('svg:defs').append('svg:marker')
+ .attr('id', 'end-arrow-active')
+ .attr('viewBox', '0 -5 10 10')
+ .attr('refX', 6)
+ .attr('markerWidth', 5)
+ .attr('markerHeight', 5)
+ .attr('orient', 'auto')
+ .append('svg:path')
+ .attr('d', 'M0,-5L10,0L0,5')
+ .attr('class', 'marker marker-active');
+
+ self.svg.append('svg:defs').append('svg:marker')
+ .attr('id', 'start-arrow')
+ .attr('viewBox', '0 -5 10 10')
+ .attr('refX', 6)
+ .attr('markerWidth', 5)
+ .attr('markerHeight', 5)
+ .attr('orient', 'auto')
+ .append('svg:path')
+ .attr('d', 'M10,-5L0,0L10,5')
+ .attr('class', 'marker');
+
+ self.svg.append('svg:defs').append('svg:marker')
+ .attr('id', 'start-arrow-active')
+ .attr('viewBox', '0 -5 10 10')
+ .attr('refX', 6)
+ .attr('markerWidth', 5)
+ .attr('markerHeight', 5)
+ .attr('orient', 'auto')
+ .append('svg:path')
+ .attr('d', 'M10,-5L0,0L10,5')
+ .attr('class', 'marker marker-active');
+
+ self.svg
+ .on('click', function () {
+ d3.event.preventDefault();
+ d3.event.stopPropagation();
+
+ hide(jQuery('div.lifecycle-ui-status-menu'));
+ })
+ .on('contextmenu', function() { d3.event.preventDefault(); });
+ }
+
+ // Generate nodes from config
+ NodesFromConfig(config) {
+ var self = this;
+ self.nodes = [];
+ config.descriptions ||= {};
+
+ jQuery.each(['initial', 'active', 'inactive'], function (i, type) {
+ if ( config[type] ) {
+ config[type].forEach(function(element) {
+ self.nodes = self.nodes.concat({
+ id: ++self.nodes_seq,
+ name: element,
+ type: type,
+ description: config.descriptions[element],
+ transition_description: config.descriptions[self.current_status + ' -> ' + element]
+ });
+ });
+ }
+ });
+ }
+
+ // Find all links associated with node object
+ LinksForNodeFromConfig (node, config) {
+ var config = config || this.config;
+
+ for (let [fromNode, toList] of Object.entries(config.transitions)) {
+ if ( fromNode == '' ) {
+ this.create_nodes = toList;
+ }
+ else if ( fromNode.toLowerCase() == node.toLowerCase() ) {
+ return toList;
+ }
+ }
+ return [];
+ }
+
+ RenderNode() {
+ var self = this;
+
+ self.node = self.svg.selectAll(".node")
+ .data(self.nodes.filter(function(d) { return d.id >= 0 }));
+
+ // Add new nodes and draw them
+ var nodeEnter = self.node.enter().append("g")
+ .attr("class", "node");
+
+ nodeEnter.append("circle");
+ nodeEnter.append("text");
+ nodeEnter.append("title");
+
+ self.node = nodeEnter.merge(self.node)
+ .attr("id", function(d) { return d.id });
+
+ self.node.call(d3.drag()
+ .on("start", function(d) {
+ if (!d3.event.active) self.simulation.alphaTarget(0.3).restart();
+ d.fx = d.x, d.fy = d.y;
+ })
+ .on("drag", function(d) {
+ d.fx = d3.event.x, d.fy = d3.event.y;
+ })
+ .on("end", function(d) {
+ if (!d3.event.active) self.simulation.alphaTarget(0);
+ if ( !self.enableSimulation ) {
+ d.fx = null, d.fy = null;
+ }
+ }));
+
+ // Add our circle to our new node
+ self.node.select("circle")
+ .attr("r", self.node_radius)
+ .attr("stroke", "black")
+ .attr("class", function(d) {
+ let classes = ['status', 'status-type-' + d.type];
+
+ if ( d.name === self.current_status ) {
+ classes.push('status-current');
+ }
+
+ if (self.active_statuses.includes(d.name)) {
+ classes.push('status-active');
+ }
+ return classes.join(' ');
+ })
+ .on("click", function(d) {
+ d3.event.stopPropagation();
+ d3.event.preventDefault();
+ if (self.active_statuses.includes(d.name)) {
+ if ( self.config.type === 'asset' ) {
+ location.href = RT.Config.WebPath + '/Asset/Modify.html?Update=1;DisplayAfter=1;Status=' + d.name + ';id=' + self.object_id;
+ }
+ else {
+ location.href = RT.Config.WebPath + '/Ticket/Update.html?DefaultStatus=' + d.name + ';id=' + self.object_id;
+ }
+ }
+ })
+ .on('contextmenu', function(d) {
+ hide(jQuery('div.lifecycle-ui-status-menu[data-status!=' + d.name + ']'));
+ if (!self.active_statuses.includes(d.name)) return;
+
+ let menu = jQuery('div.lifecycle-ui-status-menu[data-status=' + d.name + ']');
+ menu.css('left', d3.event.pageX).css('top', d3.event.pageY);
+
+ if ( !menu.find('.toplevel').hasClass('sf-menu') ) {
+ menu.find('.toplevel').addClass('sf-menu sf-vertical sf-js-enabled sf-shadow').superfish({ speed: 'fast' });
+ }
+ show(menu);
+ })
+ .on('mouseover', function(d) {
+ if ( d.transition_description ) {
+ jQuery('#lifecycle-ui-tooltip').css('left', d3.event.pageX).css('top', d3.event.pageY);
+ jQuery('#lifecycle-ui-tooltip').attr('data-original-title', d.transition_description);
+ jQuery('#lifecycle-ui-tooltip').tooltip('show');
+ }
+ })
+ .on('mouseout', function() {
+ jQuery('#lifecycle-ui-tooltip').tooltip('hide');
+ });
+
+ self.node.select("text")
+ .text(function(d) { return d.name; })
+ .each(function () { self.TruncateLabel(this, self); })
+ .attr("x", function(d) {
+ var node = d3.select(this), textLength = node.node().getComputedTextLength();
+ if ( textLength > self.node_radius*2 ) textLength = self.node_radius*2;
+ return -textLength/2+5; // +5 visually makes text in the center.
+ })
+ .attr("y", 0)
+ .style("font-size", "10px");
+
+ self.node.select('text').on('mouseover', function(d) {
+ if ( d.description ) {
+ jQuery('#lifecycle-ui-tooltip').css('left', d3.event.pageX).css('top', d3.event.pageY);
+ jQuery('#lifecycle-ui-tooltip').attr('data-original-title', d.description);
+ jQuery('#lifecycle-ui-tooltip').tooltip('show');
+ }
+ })
+ .on('mouseout', function() {
+ jQuery('#lifecycle-ui-tooltip').tooltip('hide');
+ });
+ }
+
+ RenderLink() {
+ var self = this;
+
+ self.link = self.svg.selectAll(".link")
+ .data(self.links);
+
+ // Add new links and draw them
+ var linkEnter = self.link.enter().append("g")
+ .append("path")
+ .attr("class", 'link')
+ .style("marker-start", function(d) { return d.start ? 'url(#start-arrow)' : '' })
+ .style("marker-end", function(d) { return d.end ? 'url(#end-arrow)' : '' })
+ .attr("transform", "translate(0,0)");
+ self.link = linkEnter.merge(self.link);
+
+ self.link.filter(function(d) {
+ return d.source.name == self.current_status && self.active_statuses.includes(d.target.name)
+ }).style("marker-end", function(d) {
+ return d.end ? 'url(#end-arrow-active)' : ''
+ }).attr('class', 'link link-active');
+
+ self.link.filter(function(d) {
+ return d.target.name == self.current_status && self.active_statuses.includes(d.source.name)
+ }).style("marker-start", function(d) {
+ return d.end ? 'url(#start-arrow-active)' : ''
+ }).attr('class', 'link link-active');
+
+ self.link.on('mouseover', function(d) {
+ let descriptions = [];
+ let item = d.source.name + ' -> ' + d.target.name;
+ let reverse_item = d.target.name + ' -> ' + d.source.name;
+ // if it's bidirectional
+ if ( d.start ) {
+ for ( let i of [item, reverse_item] ) {
+ if ( d.descriptions[i] ) {
+ descriptions.push(i + ': ' + d.descriptions[i]);
+ }
+ }
+ }
+ else {
+ if ( d.descriptions[item] ) {
+ descriptions.push(d.descriptions[item]);
+ }
+ }
+
+ if ( descriptions.length ) {
+ jQuery('#lifecycle-ui-tooltip').css('left', d3.event.pageX).css('top', d3.event.pageY);
+ jQuery('#lifecycle-ui-tooltip').attr('data-original-title', descriptions.join('<br>'));
+ jQuery('#lifecycle-ui-tooltip').tooltip('show');
+ }
+ })
+ .on('mouseout', function() {
+ jQuery('#lifecycle-ui-tooltip').tooltip('hide');
+ })
+ .on("click", function(d) {
+ d3.event.stopPropagation();
+ d3.event.preventDefault();
+ let status;
+ if ( d.source.name === self.current_status ) {
+ status = d.target.name;
+ }
+ else if ( d.target.name === self.current_status ) {
+ status = d.source.name;
+ }
+
+ if (status && self.active_statuses.includes(status)) {
+ if ( self.config.type === 'asset' ) {
+ location.href = RT.Config.WebPath + '/Asset/Modify.html?Update=1;DisplayAfter=1;Status=' + status + ';id=' + self.object_id;
+ }
+ else {
+ location.href = RT.Config.WebPath + '/Ticket/Update.html?DefaultStatus=' + status + ';id=' + self.object_id;
+ }
+ }
+ });
+ }
+ TruncateLabel(element, self) {
+ var node = d3.select(element), textLength = node.node().getComputedTextLength(), text = node.text();
+ var diameter = self.node_radius * 2 - textLength/4;
+
+ while (textLength > diameter && text.length > 0) {
+ text = text.slice(0, -1);
+ node.text(text + '…');
+ textLength = node.node().getComputedTextLength();
+ }
+ }
+ }
+});
commit 1d2508b9ad67bd42742768c00a33cf8a7f906a8f
Author: sunnavy <sunnavy at bestpractical.com>
Date: Sun Jul 10 16:27:55 2022 +0800
Add fontawesome expand-arrows-alt icon for lifecycle modal viewer
diff --git a/devel/third-party/fontawesome-5.15.4/index.js b/devel/third-party/fontawesome-5.15.4/index.js
index 832318b971..014cf24ba0 100644
--- a/devel/third-party/fontawesome-5.15.4/index.js
+++ b/devel/third-party/fontawesome-5.15.4/index.js
@@ -24,6 +24,7 @@ import {
faSort as fasSort,
faSortDown as fasSortDown,
faSortUp as fasSortUp,
+ faExpandArrowsAlt as fasExpandArrowsAlt,
} from '@fortawesome/free-solid-svg-icons'
@@ -74,6 +75,7 @@ library.add(
fasSort,
fasSortDown,
fasSortUp,
+ fasExpandArrowsAlt,
// Regular
farEdit,
farBookmark,
diff --git a/share/static/js/fontawesome.min.js b/share/static/js/fontawesome.min.js
index af2df7f010..69b80ad6e0 100644
--- a/share/static/js/fontawesome.min.js
+++ b/share/static/js/fontawesome.min.js
@@ -1,2 +1,2 @@
/*! For license information please see fontawesome.js.LICENSE.txt */
-(()=>{"use strict";var t={};function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function e(t,n){for(var e=0;e<n.length;e++){var a=n[e];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(t,a.key,a)}}function a(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function r(t){for(var n=1;n<arguments.length;n++){var e=null!=arguments[n]?arguments[n]:{},r=Object.keys(e);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(e).filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})))),r.forEach((function(n){a(t,n,e[n])}))}return t}function i(t,n){return function(t){if(Array.isArray(t))return t}(t)||function(t,n){var e=[],a=!0,r=!1,i=void 0;try{for(var o,
c=t[Symbol.iterator]();!(a=(o=c.next()).done)&&(e.push(o.value),!n||e.length!==n);a=!0);}catch(t){r=!0,i=t}finally{try{a||null==c.return||c.return()}finally{if(r)throw i}}return e}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}();var o=function(){},c={},l={},s=null,f={mark:o,measure:o};try{"undefined"!=typeof window&&(c=window),"undefined"!=typeof document&&(l=document),"undefined"!=typeof MutationObserver&&(s=MutationObserver),"undefined"!=typeof performance&&(f=performance)}catch(t){}var u=(c.navigator||{}).userAgent,m=void 0===u?"":u,d=c,h=l,p=s,g=f,v=(d.document,!!h.documentElement&&!!h.head&&"function"==typeof h.addEventListener&&"function"==typeof h.createElement),b=~m.indexOf("MSIE")||~m.indexOf("Trident/"),y="svg-inline--fa",w="data-fa-i2svg",x="data-fa-pseudo-elemen
t",k="fontawesome-i2svg",z=["HTML","HEAD","STYLE","SCRIPT"],M=function(){try{return!0}catch(t){return!1}}(),N={fas:"solid",far:"regular",fal:"light",fad:"duotone",fab:"brands",fak:"kit",fa:"solid"},_={solid:"fas",regular:"far",light:"fal",duotone:"fad",brands:"fab",kit:"fak"},C="fa-layers-text",L=/Font Awesome ([5 ]*)(Solid|Regular|Light|Duotone|Brands|Free|Pro|Kit).*/i,A={900:"fas",400:"far",normal:"far",300:"fal"},O=[1,2,3,4,5,6,7,8,9,10],S=O.concat([11,12,13,14,15,16,17,18,19,20]),E=["class","data-prefix","data-icon","data-fa-transform","data-fa-mask"],P={GROUP:"group",SWAP_OPACITY:"swap-opacity",PRIMARY:"primary",SECONDARY:"secondary"},T=["xs","sm","lg","fw","ul","li","border","pull-left","pull-right","spin","pulse","rotate-90","rotate-180","rotate-270","flip-horizontal","flip-vertical","flip-both","stack","stack-1x","stack-2x","inverse","layers","layers-text","layers-counter",P.GROUP,P.SWAP_OPACITY,P.PRIMARY,P.SECONDARY].concat(O.map((function(t){return"".concat(t,"x")}))).conc
at(S.map((function(t){return"w-".concat(t)}))),I=d.FontAwesomeConfig||{};h&&"function"==typeof h.querySelector&&[["data-family-prefix","familyPrefix"],["data-replacement-class","replacementClass"],["data-auto-replace-svg","autoReplaceSvg"],["data-auto-add-css","autoAddCss"],["data-auto-a11y","autoA11y"],["data-search-pseudo-elements","searchPseudoElements"],["data-observe-mutations","observeMutations"],["data-mutate-approach","mutateApproach"],["data-keep-original-source","keepOriginalSource"],["data-measure-performance","measurePerformance"],["data-show-missing-icons","showMissingIcons"]].forEach((function(t){var n=i(t,2),e=n[0],a=n[1],r=function(t){return""===t||"false"!==t&&("true"===t||t)}(function(t){var n=h.querySelector("script["+t+"]");if(n)return n.getAttribute(t)}(e));null!=r&&(I[a]=r)}));var H=r({},{familyPrefix:"fa",replacementClass:y,autoReplaceSvg:!0,autoAddCss:!0,autoA11y:!0,searchPseudoElements:!1,observeMutations:!0,mutateApproach:"async",keepOriginalSource:!0,measu
rePerformance:!1,showMissingIcons:!0},I);H.autoReplaceSvg||(H.observeMutations=!1);var V=r({},H);d.FontAwesomeConfig=V;var j=d||{};j.___FONT_AWESOME___||(j.___FONT_AWESOME___={}),j.___FONT_AWESOME___.styles||(j.___FONT_AWESOME___.styles={}),j.___FONT_AWESOME___.hooks||(j.___FONT_AWESOME___.hooks={}),j.___FONT_AWESOME___.shims||(j.___FONT_AWESOME___.shims=[]);var R=j.___FONT_AWESOME___,F=[],D=!1;function Y(t){v&&(D?setTimeout(t,0):F.push(t))}v&&((D=(h.documentElement.doScroll?/^loaded|^c/:/^loaded|^i|^c/).test(h.readyState))||h.addEventListener("DOMContentLoaded",(function t(){h.removeEventListener("DOMContentLoaded",t),D=1,F.map((function(t){return t()}))})));var W,X="pending",B="settled",U="fulfilled",q="rejected",G=function(){},K=void 0!==t.g&&void 0!==t.g.process&&"function"==typeof t.g.process.emit,J="undefined"==typeof setImmediate?setTimeout:setImmediate,Q=[];function Z(){for(var t=0;t<Q.length;t++)Q[t][0](Q[t][1]);Q=[],W=!1}function $(t,n){Q.push([t,n]),W||(W=!0,J(Z,0))}funct
ion tt(t){var n=t.owner,e=n._state,a=n._data,r=t[e],i=t.then;if("function"==typeof r){e=U;try{a=r(a)}catch(t){rt(i,t)}}nt(i,a)||(e===U&&et(i,a),e===q&&rt(i,a))}function nt(t,e){var a;try{if(t===e)throw new TypeError("A promises callback cannot return that same promise.");if(e&&("function"==typeof e||"object"===n(e))){var r=e.then;if("function"==typeof r)return r.call(e,(function(n){a||(a=!0,e===n?at(t,n):et(t,n))}),(function(n){a||(a=!0,rt(t,n))})),!0}}catch(n){return a||rt(t,n),!0}return!1}function et(t,n){t!==n&&nt(t,n)||at(t,n)}function at(t,n){t._state===X&&(t._state=B,t._data=n,$(ot,t))}function rt(t,n){t._state===X&&(t._state=B,t._data=n,$(ct,t))}function it(t){t._then=t._then.forEach(tt)}function ot(t){t._state=U,it(t)}function ct(n){n._state=q,it(n),!n._handled&&K&&t.g.process.emit("unhandledRejection",n._data,n)}function lt(n){t.g.process.emit("rejectionHandled",n)}function st(t){if("function"!=typeof t)throw new TypeError("Promise resolver "+t+" is not a function");if(this
instanceof st==0)throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");this._then=[],function(t,n){function e(t){rt(n,t)}try{t((function(t){et(n,t)}),e)}catch(t){e(t)}}(t,this)}st.prototype={constructor:st,_state:X,_then:null,_data:void 0,_handled:!1,then:function(t,n){var e={owner:this,then:new this.constructor(G),fulfilled:t,rejected:n};return!n&&!t||this._handled||(this._handled=!0,this._state===q&&K&&$(lt,this)),this._state===U||this._state===q?$(tt,e):this._then.push(e),e.then},catch:function(t){return this.then(null,t)}},st.all=function(t){if(!Array.isArray(t))throw new TypeError("You must pass an array to Promise.all().");return new st((function(n,e){var a=[],r=0;function i(t){return r++,function(e){a[t]=e,--r||n(a)}}for(var o,c=0;c<t.length;c++)(o=t[c])&&"function"==typeof o.then?o.then(i(c),e):a[c]=o;r||n(a)}))},st.race=function(t){if(!Array.isArray(t))throw new TypeError("You must pass
an array to Promise.race().");return new st((function(n,e){for(var a,r=0;r<t.length;r++)(a=t[r])&&"function"==typeof a.then?a.then(n,e):n(a)}))},st.resolve=function(t){return t&&"object"===n(t)&&t.constructor===st?t:new st((function(n){n(t)}))},st.reject=function(t){return new st((function(n,e){e(t)}))};var ft="function"==typeof Promise?Promise:st,ut=16,mt={size:16,x:0,y:0,rotate:0,flipX:!1,flipY:!1};function dt(t){if(t&&v){var n=h.createElement("style");n.setAttribute("type","text/css"),n.innerHTML=t;for(var e=h.head.childNodes,a=null,r=e.length-1;r>-1;r--){var i=e[r],o=(i.tagName||"").toUpperCase();["STYLE","LINK"].indexOf(o)>-1&&(a=i)}return h.head.insertBefore(n,a),t}}function ht(){for(var t=12,n="";t-- >0;)n+="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[62*Math.random()|0];return n}function pt(t){for(var n=[],e=(t||[]).length>>>0;e--;)n[e]=t[e];return n}function gt(t){return t.classList?pt(t.classList):(t.getAttribute("class")||"").split(" ").filter((functio
n(t){return t}))}function vt(t){return"".concat(t).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function bt(t){return Object.keys(t||{}).reduce((function(n,e){return n+"".concat(e,": ").concat(t[e],";")}),"")}function yt(t){return t.size!==mt.size||t.x!==mt.x||t.y!==mt.y||t.rotate!==mt.rotate||t.flipX||t.flipY}function wt(t){var n=t.transform,e=t.containerWidth,a=t.iconWidth,r={transform:"translate(".concat(e/2," 256)")},i="translate(".concat(32*n.x,", ").concat(32*n.y,") "),o="scale(".concat(n.size/16*(n.flipX?-1:1),", ").concat(n.size/16*(n.flipY?-1:1),") "),c="rotate(".concat(n.rotate," 0 0)");return{outer:r,inner:{transform:"".concat(i," ").concat(o," ").concat(c)},path:{transform:"translate(".concat(a/2*-1," -256)")}}}var xt={x:0,y:0,width:"100%",height:"100%"};function kt(t){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return t.attributes&&(t.attributes.fill||n)&&(t.attributes.fill="black"),t}f
unction zt(t){var n=t.icons,e=n.main,a=n.mask,i=t.prefix,o=t.iconName,c=t.transform,l=t.symbol,s=t.title,f=t.maskId,u=t.titleId,m=t.extra,d=t.watchable,h=void 0!==d&&d,p=a.found?a:e,g=p.width,v=p.height,b="fak"===i,y=b?"":"fa-w-".concat(Math.ceil(g/v*16)),x=[V.replacementClass,o?"".concat(V.familyPrefix,"-").concat(o):"",y].filter((function(t){return-1===m.classes.indexOf(t)})).filter((function(t){return""!==t||!!t})).concat(m.classes).join(" "),k={children:[],attributes:r({},m.attributes,{"data-prefix":i,"data-icon":o,class:x,role:m.attributes.role||"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 ".concat(g," ").concat(v)})},z=b&&!~m.classes.indexOf("fa-fw")?{width:"".concat(g/v*16*.0625,"em")}:{};h&&(k.attributes[w]=""),s&&k.children.push({tag:"title",attributes:{id:k.attributes["aria-labelledby"]||"title-".concat(u||ht())},children:[s]});var M=r({},k,{prefix:i,iconName:o,main:e,mask:a,maskId:f,transform:c,symbol:l,styles:r({},z,m.styles)}),N=a.found&&e.found?function(t){var
n,e=t.children,a=t.attributes,i=t.main,o=t.mask,c=t.maskId,l=t.transform,s=i.width,f=i.icon,u=o.width,m=o.icon,d=wt({transform:l,containerWidth:u,iconWidth:s}),h={tag:"rect",attributes:r({},xt,{fill:"white"})},p=f.children?{children:f.children.map(kt)}:{},g={tag:"g",attributes:r({},d.inner),children:[kt(r({tag:f.tag,attributes:r({},f.attributes,d.path)},p))]},v={tag:"g",attributes:r({},d.outer),children:[g]},b="mask-".concat(c||ht()),y="clip-".concat(c||ht()),w={tag:"mask",attributes:r({},xt,{id:b,maskUnits:"userSpaceOnUse",maskContentUnits:"userSpaceOnUse"}),children:[h,v]},x={tag:"defs",children:[{tag:"clipPath",attributes:{id:y},children:(n=m,"g"===n.tag?n.children:[n])},w]};return e.push(x,{tag:"rect",attributes:r({fill:"currentColor","clip-path":"url(#".concat(y,")"),mask:"url(#".concat(b,")")},xt)}),{children:e,attributes:a}}(M):function(t){var n=t.children,e=t.attributes,a=t.main,i=t.transform,o=bt(t.styles);if(o.length>0&&(e.style=o),yt(i)){var c=wt({transform:i,containerWi
dth:a.width,iconWidth:a.width});n.push({tag:"g",attributes:r({},c.outer),children:[{tag:"g",attributes:r({},c.inner),children:[{tag:a.icon.tag,children:a.icon.children,attributes:r({},a.icon.attributes,c.path)}]}]})}else n.push(a.icon);return{children:n,attributes:e}}(M),_=N.children,C=N.attributes;return M.children=_,M.attributes=C,l?function(t){var n=t.prefix,e=t.iconName,a=t.children,i=t.attributes,o=t.symbol;return[{tag:"svg",attributes:{style:"display: none;"},children:[{tag:"symbol",attributes:r({},i,{id:!0===o?"".concat(n,"-").concat(V.familyPrefix,"-").concat(e):o}),children:a}]}]}(M):function(t){var n=t.children,e=t.main,a=t.mask,i=t.attributes,o=t.styles,c=t.transform;if(yt(c)&&e.found&&!a.found){var l={x:e.width/e.height/2,y:.5};i.style=bt(r({},o,{"transform-origin":"".concat(l.x+c.x/16,"em ").concat(l.y+c.y/16,"em")}))}return[{tag:"svg",attributes:i,children:n}]}(M)}function Mt(t){var n=t.content,e=t.width,a=t.height,i=t.transform,o=t.title,c=t.extra,l=t.watchable,s=void
0!==l&&l,f=r({},c.attributes,o?{title:o}:{},{class:c.classes.join(" ")});s&&(f[w]="");var u=r({},c.styles);yt(i)&&(u.transform=function(t){var n=t.transform,e=t.width,a=void 0===e?16:e,r=t.height,i=void 0===r?16:r,o=t.startCentered,c=void 0!==o&&o,l="";return l+=c&&b?"translate(".concat(n.x/ut-a/2,"em, ").concat(n.y/ut-i/2,"em) "):c?"translate(calc(-50% + ".concat(n.x/ut,"em), calc(-50% + ").concat(n.y/ut,"em)) "):"translate(".concat(n.x/ut,"em, ").concat(n.y/ut,"em) "),(l+="scale(".concat(n.size/ut*(n.flipX?-1:1),", ").concat(n.size/ut*(n.flipY?-1:1),") "))+"rotate(".concat(n.rotate,"deg) ")}({transform:i,startCentered:!0,width:e,height:a}),u["-webkit-transform"]=u.transform);var m=bt(u);m.length>0&&(f.style=m);var d=[];return d.push({tag:"span",attributes:f,children:[n]}),o&&d.push({tag:"span",attributes:{class:"sr-only"},children:[o]}),d}var Nt=function(){},_t=V.measurePerformance&&g&&g.mark&&g.measure?g:{mark:Nt,measure:Nt},Ct='FA "5.15.4"',Lt=function(t){return _t.mark("".conc
at(Ct," ").concat(t," begins")),function(){return function(t){_t.mark("".concat(Ct," ").concat(t," ends")),_t.measure("".concat(Ct," ").concat(t),"".concat(Ct," ").concat(t," begins"),"".concat(Ct," ").concat(t," ends"))}(t)}},At=function(t,n,e,a){var r,i,o,c=Object.keys(t),l=c.length,s=void 0!==a?function(t,n){return function(e,a,r,i){return t.call(n,e,a,r,i)}}(n,a):n;for(void 0===e?(r=1,o=t[c[0]]):(r=0,o=e);r<l;r++)o=s(o,t[i=c[r]],i,t);return o};function Ot(t){for(var n="",e=0;e<t.length;e++)n+=("000"+t.charCodeAt(e).toString(16)).slice(-4);return n}function St(t,n){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=e.skipHooks,i=void 0!==a&&a,o=Object.keys(n).reduce((function(t,e){var a=n[e];return a.icon?t[a.iconName]=a.icon:t[e]=a,t}),{});"function"!=typeof R.hooks.addPack||i?R.styles[t]=r({},R.styles[t]||{},o):R.hooks.addPack(t,o),"fas"===t&&St("fa",n)}var Et=R.styles,Pt=R.shims,Tt={},It={},Ht={},Vt=function(){var t=function(t){return At(Et,(function(n,e,a){retu
rn n[a]=At(e,t,{}),n}),{})};Tt=t((function(t,n,e){return n[3]&&(t[n[3]]=e),t})),It=t((function(t,n,e){var a=n[2];return t[e]=e,a.forEach((function(n){t[n]=e})),t}));var n="far"in Et;Ht=At(Pt,(function(t,e){var a=e[0],r=e[1],i=e[2];return"far"!==r||n||(r="fas"),t[a]={prefix:r,iconName:i},t}),{})};function jt(t,n){return(Tt[t]||{})[n]}Vt();var Rt=R.styles;function Ft(t){return t.reduce((function(t,n){var e=function(t,n){var e,a=n.split("-"),r=a[0],i=a.slice(1).join("-");return r!==t||""===i||(e=i,~T.indexOf(e))?null:i}(V.familyPrefix,n);if(Rt[n])t.prefix=n;else if(V.autoFetchSvg&&Object.keys(N).indexOf(n)>-1)t.prefix=n;else if(e){var a="fa"===t.prefix?Ht[e]||{prefix:null,iconName:null}:{};t.iconName=a.iconName||e,t.prefix=a.prefix||t.prefix}else n!==V.replacementClass&&0!==n.indexOf("fa-w-")&&t.rest.push(n);return t}),{prefix:null,iconName:null,rest:[]})}function Dt(t){var n=t.tag,e=t.attributes,a=void 0===e?{}:e,r=t.children,i=void 0===r?[]:r;return"string"==typeof t?vt(t):"<".concat
(n," ").concat(function(t){return Object.keys(t||{}).reduce((function(n,e){return n+"".concat(e,'="').concat(vt(t[e]),'" ')}),"").trim()}(a),">").concat(i.map(Dt).join(""),"</").concat(n,">")}var Yt=function(){};function Wt(t){return"string"==typeof(t.getAttribute?t.getAttribute(w):null)}var Xt={replace:function(t){var n=t[0],e=t[1].map((function(t){return Dt(t)})).join("\n");if(n.parentNode&&n.outerHTML)n.outerHTML=e+(V.keepOriginalSource&&"svg"!==n.tagName.toLowerCase()?"\x3c!-- ".concat(n.outerHTML," Font Awesome fontawesome.com --\x3e"):"");else if(n.parentNode){var a=document.createElement("span");n.parentNode.replaceChild(a,n),a.outerHTML=e}},nest:function(t){var n=t[0],e=t[1];if(~gt(n).indexOf(V.replacementClass))return Xt.replace(t);var a=new RegExp("".concat(V.familyPrefix,"-.*"));delete e[0].attributes.style,delete e[0].attributes.id;var r=e[0].attributes.class.split(" ").reduce((function(t,n){return n===V.replacementClass||n.match(a)?t.toSvg.push(n):t.toNode.push(n),t}),{
toNode:[],toSvg:[]});e[0].attributes.class=r.toSvg.join(" ");var i=e.map((function(t){return Dt(t)})).join("\n");n.setAttribute("class",r.toNode.join(" ")),n.setAttribute(w,""),n.innerHTML=i}};function Bt(t){t()}function Ut(t,n){var e="function"==typeof n?n:Yt;if(0===t.length)e();else{var a=Bt;"async"===V.mutateApproach&&(a=d.requestAnimationFrame||Bt),a((function(){var n=!0===V.autoReplaceSvg?Xt.replace:Xt[V.autoReplaceSvg]||Xt.replace,a=Lt("mutate");t.map(n),a(),e()}))}}var qt=!1;function Gt(){qt=!1}var Kt=null;function Jt(t){if(p&&V.observeMutations){var n=t.treeCallback,e=t.nodeCallback,a=t.pseudoElementsCallback,r=t.observeMutationsRoot,i=void 0===r?h:r;Kt=new p((function(t){qt||pt(t).forEach((function(t){if("childList"===t.type&&t.addedNodes.length>0&&!Wt(t.addedNodes[0])&&(V.searchPseudoElements&&a(t.target),n(t.target)),"attributes"===t.type&&t.target.parentNode&&V.searchPseudoElements&&a(t.target.parentNode),"attributes"===t.type&&Wt(t.target)&&~E.indexOf(t.attributeName))i
f("class"===t.attributeName){var r=Ft(gt(t.target)),i=r.prefix,o=r.iconName;i&&t.target.setAttribute("data-prefix",i),o&&t.target.setAttribute("data-icon",o)}else e(t.target)}))})),v&&Kt.observe(i,{childList:!0,attributes:!0,characterData:!0,subtree:!0})}}function Qt(t){var n=function(t){var n,e,a=t.getAttribute("data-prefix"),r=t.getAttribute("data-icon"),i=void 0!==t.innerText?t.innerText.trim():"",o=Ft(gt(t));return a&&r&&(o.prefix=a,o.iconName=r),o.prefix&&i.length>1?o.iconName=(n=o.prefix,e=t.innerText,(It[n]||{})[e]):o.prefix&&1===i.length&&(o.iconName=jt(o.prefix,Ot(t.innerText))),o}(t),e=n.iconName,a=n.prefix,r=n.rest,i=function(t){var n=t.getAttribute("style"),e=[];return n&&(e=n.split(";").reduce((function(t,n){var e=n.split(":"),a=e[0],r=e.slice(1);return a&&r.length>0&&(t[a]=r.join(":").trim()),t}),{})),e}(t),o=function(t){return function(t){var n={size:16,x:0,y:0,flipX:!1,flipY:!1,rotate:0};return t?t.toLowerCase().split(" ").reduce((function(t,n){var e=n.toLowerCase().
split("-"),a=e[0],r=e.slice(1).join("-");if(a&&"h"===r)return t.flipX=!0,t;if(a&&"v"===r)return t.flipY=!0,t;if(r=parseFloat(r),isNaN(r))return t;switch(a){case"grow":t.size=t.size+r;break;case"shrink":t.size=t.size-r;break;case"left":t.x=t.x-r;break;case"right":t.x=t.x+r;break;case"up":t.y=t.y-r;break;case"down":t.y=t.y+r;break;case"rotate":t.rotate=t.rotate+r}return t}),n):n}(t.getAttribute("data-fa-transform"))}(t),c=function(t){var n=t.getAttribute("data-fa-symbol");return null!==n&&(""===n||n)}(t),l=function(t){var n=pt(t.attributes).reduce((function(t,n){return"class"!==t.name&&"style"!==t.name&&(t[n.name]=n.value),t}),{}),e=t.getAttribute("title"),a=t.getAttribute("data-fa-title-id");return V.autoA11y&&(e?n["aria-labelledby"]="".concat(V.replacementClass,"-title-").concat(a||ht()):(n["aria-hidden"]="true",n.focusable="false")),n}(t),s=function(t){var n=t.getAttribute("data-fa-mask");return n?Ft(n.split(" ").map((function(t){return t.trim()}))):{prefix:null,iconName:null,rest:
[]}}(t);return{iconName:e,title:t.getAttribute("title"),titleId:t.getAttribute("data-fa-title-id"),prefix:a,transform:o,symbol:c,mask:s,maskId:t.getAttribute("data-fa-mask-id"),extra:{classes:r,styles:i,attributes:l}}}function Zt(t){this.name="MissingIcon",this.message=t||"Icon unavailable",this.stack=(new Error).stack}Zt.prototype=Object.create(Error.prototype),Zt.prototype.constructor=Zt;var $t={fill:"currentColor"},tn={attributeType:"XML",repeatCount:"indefinite",dur:"2s"},nn={tag:"path",attributes:r({},$t,{d:"M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,4
6.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z"})},en=r({},tn,{attributeName:"opacity"}),an={tag:"g",children:[nn
,{tag:"circle",attributes:r({},$t,{cx:"256",cy:"364",r:"28"}),children:[{tag:"animate",attributes:r({},tn,{attributeName:"r",values:"28;14;28;28;14;28;"})},{tag:"animate",attributes:r({},en,{values:"1;0;1;1;0;1;"})}]},{tag:"path",attributes:r({},$t,{opacity:"1",d:"M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z"}),children:[{tag:"animate",attributes:r({},en,{values:"1;0;0;0;0;1;"})}]},{tag:"path",attributes:r({},$t,{opacity:"0",d:"M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z"}),children:[{tag:"animate",attributes:r({},en,{values:"0;0;1;1;0;0;"})}]}]},rn=R.styles;function on(t){var n=t[0],e=t[1],a=i(t.slice(4),1)[0];return{found:!0,width:n,height:e,i
con:Array.isArray(a)?{tag:"g",attributes:{class:"".concat(V.familyPrefix,"-").concat(P.GROUP)},children:[{tag:"path",attributes:{class:"".concat(V.familyPrefix,"-").concat(P.SECONDARY),fill:"currentColor",d:a[0]}},{tag:"path",attributes:{class:"".concat(V.familyPrefix,"-").concat(P.PRIMARY),fill:"currentColor",d:a[1]}}]}:{tag:"path",attributes:{fill:"currentColor",d:a}}}}function cn(t,n){return new ft((function(e,a){var r={found:!1,width:512,height:512,icon:an};if(t&&n&&rn[n]&&rn[n][t])return e(on(rn[n][t]));t&&n&&!V.showMissingIcons?a(new Zt("Icon is missing for prefix ".concat(n," with icon name ").concat(t))):e(r)}))}var ln=R.styles;function sn(t){var n=Qt(t);return~n.extra.classes.indexOf(C)?function(t,n){var e=n.title,a=n.transform,r=n.extra,i=null,o=null;if(b){var c=parseInt(getComputedStyle(t).fontSize,10),l=t.getBoundingClientRect();i=l.width/c,o=l.height/c}return V.autoA11y&&!e&&(r.attributes["aria-hidden"]="true"),ft.resolve([t,Mt({content:t.innerHTML,width:i,height:o,tran
sform:a,title:e,extra:r,watchable:!0})])}(t,n):function(t,n){var e=n.iconName,a=n.title,r=n.titleId,o=n.prefix,c=n.transform,l=n.symbol,s=n.mask,f=n.maskId,u=n.extra;return new ft((function(n,m){ft.all([cn(e,o),cn(s.iconName,s.prefix)]).then((function(s){var m=i(s,2),d=m[0],h=m[1];n([t,zt({icons:{main:d,mask:h},prefix:o,iconName:e,transform:c,symbol:l,mask:h,maskId:f,title:a,titleId:r,extra:u,watchable:!0})])}))}))}(t,n)}function fn(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(v){var e=h.documentElement.classList,a=function(t){return e.add("".concat(k,"-").concat(t))},r=function(t){return e.remove("".concat(k,"-").concat(t))},i=V.autoFetchSvg?Object.keys(N):Object.keys(ln),o=[".".concat(C,":not([").concat(w,"])")].concat(i.map((function(t){return".".concat(t,":not([").concat(w,"])")}))).join(", ");if(0!==o.length){var c=[];try{c=pt(t.querySelectorAll(o))}catch(t){}if(c.length>0){a("pending"),r("complete");var l=Lt("onTree"),s=c.reduce((function(t,n){try{va
r e=sn(n);e&&t.push(e)}catch(t){M||t instanceof Zt&&console.error(t)}return t}),[]);return new ft((function(t,e){ft.all(s).then((function(e){Ut(e,(function(){a("active"),a("complete"),r("pending"),"function"==typeof n&&n(),l(),t()}))})).catch((function(){l(),e()}))}))}}}}function un(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;sn(t).then((function(t){t&&Ut([t],n)}))}function mn(t,n){var e="".concat("data-fa-pseudo-element-pending").concat(n.replace(":","-"));return new ft((function(a,i){if(null!==t.getAttribute(e))return a();var o=pt(t.children).filter((function(t){return t.getAttribute(x)===n}))[0],c=d.getComputedStyle(t,n),l=c.getPropertyValue("font-family").match(L),s=c.getPropertyValue("font-weight"),f=c.getPropertyValue("content");if(o&&!l)return t.removeChild(o),a();if(l&&"none"!==f&&""!==f){var u=c.getPropertyValue("content"),m=~["Solid","Regular","Light","Duotone","Brands","Kit"].indexOf(l[2])?_[l[2].toLowerCase()]:A[s],p=Ot(3===u.length?u.substr(1,1)
:u),g=jt(m,p),v=g;if(!g||o&&o.getAttribute("data-prefix")===m&&o.getAttribute("data-icon")===v)a();else{t.setAttribute(e,v),o&&t.removeChild(o);var b={iconName:null,title:null,titleId:null,prefix:null,transform:mt,symbol:!1,mask:null,maskId:null,extra:{classes:[],styles:{},attributes:{}}},y=b.extra;y.attributes[x]=n,cn(g,m).then((function(i){var o=zt(r({},b,{icons:{main:i,mask:{prefix:null,iconName:null,rest:[]}},prefix:m,iconName:v,extra:y,watchable:!0})),c=h.createElement("svg");":before"===n?t.insertBefore(c,t.firstChild):t.appendChild(c),c.outerHTML=o.map((function(t){return Dt(t)})).join("\n"),t.removeAttribute(e),a()})).catch(i)}}else a()}))}function dn(t){return ft.all([mn(t,":before"),mn(t,":after")])}function hn(t){return!(t.parentNode===document.head||~z.indexOf(t.tagName.toUpperCase())||t.getAttribute(x)||t.parentNode&&"svg"===t.parentNode.tagName)}function pn(t){if(v)return new ft((function(n,e){var a=pt(t.querySelectorAll("*")).filter(hn).map(dn),r=Lt("searchPseudoEleme
nts");qt=!0,ft.all(a).then((function(){r(),Gt(),n()})).catch((function(){r(),Gt(),e()}))}))}function gn(){var t="fa",n=y,e=V.familyPrefix,a=V.replacementClass,r='svg:not(:root).svg-inline--fa {\n overflow: visible;\n}\n\n.svg-inline--fa {\n display: inline-block;\n font-size: inherit;\n height: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n}\n.svg-inline--fa.fa-lg {\n vertical-align: -0.225em;\n}\n.svg-inline--fa.fa-w-1 {\n width: 0.0625em;\n}\n.svg-inline--fa.fa-w-2 {\n width: 0.125em;\n}\n.svg-inline--fa.fa-w-3 {\n width: 0.1875em;\n}\n.svg-inline--fa.fa-w-4 {\n width: 0.25em;\n}\n.svg-inline--fa.fa-w-5 {\n width: 0.3125em;\n}\n.svg-inline--fa.fa-w-6 {\n width: 0.375em;\n}\n.svg-inline--fa.fa-w-7 {\n width: 0.4375em;\n}\n.svg-inline--fa.fa-w-8 {\n width: 0.5em;\n}\n.svg-inline--fa.fa-w-9 {\n width: 0.5625em;\n}\n.svg-inline--fa.fa-w-10 {\n width: 0.625em;\n}\n.svg-inline--fa.fa-w-11 {\n width: 0.6875em;\n}\n.svg-inline--fa.fa-w-12 {\n width: 0.75em;\n}\
n.svg-inline--fa.fa-w-13 {\n width: 0.8125em;\n}\n.svg-inline--fa.fa-w-14 {\n width: 0.875em;\n}\n.svg-inline--fa.fa-w-15 {\n width: 0.9375em;\n}\n.svg-inline--fa.fa-w-16 {\n width: 1em;\n}\n.svg-inline--fa.fa-w-17 {\n width: 1.0625em;\n}\n.svg-inline--fa.fa-w-18 {\n width: 1.125em;\n}\n.svg-inline--fa.fa-w-19 {\n width: 1.1875em;\n}\n.svg-inline--fa.fa-w-20 {\n width: 1.25em;\n}\n.svg-inline--fa.fa-pull-left {\n margin-right: 0.3em;\n width: auto;\n}\n.svg-inline--fa.fa-pull-right {\n margin-left: 0.3em;\n width: auto;\n}\n.svg-inline--fa.fa-border {\n height: 1.5em;\n}\n.svg-inline--fa.fa-li {\n width: 2em;\n}\n.svg-inline--fa.fa-fw {\n width: 1.25em;\n}\n\n.fa-layers svg.svg-inline--fa {\n bottom: 0;\n left: 0;\n margin: auto;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.fa-layers {\n display: inline-block;\n height: 1em;\n position: relative;\n text-align: center;\n vertical-align: -0.125em;\n width: 1em;\n}\n.fa-layers svg.svg-inline--fa {\n -w
ebkit-transform-origin: center center;\n transform-origin: center center;\n}\n\n.fa-layers-counter, .fa-layers-text {\n display: inline-block;\n position: absolute;\n text-align: center;\n}\n\n.fa-layers-text {\n left: 50%;\n top: 50%;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n -webkit-transform-origin: center center;\n transform-origin: center center;\n}\n\n.fa-layers-counter {\n background-color: #ff253a;\n border-radius: 1em;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n color: #fff;\n height: 1.5em;\n line-height: 1;\n max-width: 5em;\n min-width: 1.5em;\n overflow: hidden;\n padding: 0.25em;\n right: 0;\n text-overflow: ellipsis;\n top: 0;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: top right;\n transform-origin: top right;\n}\n\n.fa-layers-bottom-right {\n bottom: 0;\n right: 0;\n top: auto;\n -webkit
-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: bottom right;\n transform-origin: bottom right;\n}\n\n.fa-layers-bottom-left {\n bottom: 0;\n left: 0;\n right: auto;\n top: auto;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: bottom left;\n transform-origin: bottom left;\n}\n\n.fa-layers-top-right {\n right: 0;\n top: 0;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: top right;\n transform-origin: top right;\n}\n\n.fa-layers-top-left {\n left: 0;\n right: auto;\n top: 0;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: top left;\n transform-origin: top left;\n}\n\n.fa-lg {\n font-size: 1.3333333333em;\n line-height: 0.75em;\n vertical-align: -0.0667em;\n}\n\n.fa-xs {\n font-size: 0.75em;\n}\n\n.fa-sm {\n font-size: 0.875em;\n}\n\n.fa-1x {\n
font-size: 1em;\n}\n\n.fa-2x {\n font-size: 2em;\n}\n\n.fa-3x {\n font-size: 3em;\n}\n\n.fa-4x {\n font-size: 4em;\n}\n\n.fa-5x {\n font-size: 5em;\n}\n\n.fa-6x {\n font-size: 6em;\n}\n\n.fa-7x {\n font-size: 7em;\n}\n\n.fa-8x {\n font-size: 8em;\n}\n\n.fa-9x {\n font-size: 9em;\n}\n\n.fa-10x {\n font-size: 10em;\n}\n\n.fa-fw {\n text-align: center;\n width: 1.25em;\n}\n\n.fa-ul {\n list-style-type: none;\n margin-left: 2.5em;\n padding-left: 0;\n}\n.fa-ul > li {\n position: relative;\n}\n\n.fa-li {\n left: -2em;\n position: absolute;\n text-align: center;\n width: 2em;\n line-height: inherit;\n}\n\n.fa-border {\n border: solid 0.08em #eee;\n border-radius: 0.1em;\n padding: 0.2em 0.25em 0.15em;\n}\n\n.fa-pull-left {\n float: left;\n}\n\n.fa-pull-right {\n float: right;\n}\n\n.fa.fa-pull-left,\n.fas.fa-pull-left,\n.far.fa-pull-left,\n.fal.fa-pull-left,\n.fab.fa-pull-left {\n margin-right: 0.3em;\n}\n.fa.fa-pull-right,\n.fas.fa-pull-right,\n.far.fa-pull-righ
t,\n.fal.fa-pull-right,\n.fab.fa-pull-right {\n margin-left: 0.3em;\n}\n\n.fa-spin {\n -webkit-animation: fa-spin 2s infinite linear;\n animation: fa-spin 2s infinite linear;\n}\n\n.fa-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8);\n}\n\n at -webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n at keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.fa-rotate-90 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";\n -webkit-transform: rotate(90deg);\n transform: rotate(90deg);\n}\n\n.fa-rotate-180 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotati
on=2)";\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.fa-rotate-270 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";\n -webkit-transform: rotate(270deg);\n transform: rotate(270deg);\n}\n\n.fa-flip-horizontal {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";\n -webkit-transform: scale(-1, 1);\n transform: scale(-1, 1);\n}\n\n.fa-flip-vertical {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";\n -webkit-transform: scale(1, -1);\n transform: scale(1, -1);\n}\n\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";\n -webkit-transform: scale(-1, -1);\n transform: scale(-1, -1);\n}\n\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical,\n:root .fa-flip-both {\n
-webkit-filter: none;\n filter: none;\n}\n\n.fa-stack {\n display: inline-block;\n height: 2em;\n position: relative;\n width: 2.5em;\n}\n\n.fa-stack-1x,\n.fa-stack-2x {\n bottom: 0;\n left: 0;\n margin: auto;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.svg-inline--fa.fa-stack-1x {\n height: 1em;\n width: 1.25em;\n}\n.svg-inline--fa.fa-stack-2x {\n height: 2em;\n width: 2.5em;\n}\n\n.fa-inverse {\n color: #fff;\n}\n\n.sr-only {\n border: 0;\n clip: rect(0, 0, 0, 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n clip: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n position: static;\n width: auto;\n}\n\n.svg-inline--fa .fa-primary {\n fill: var(--fa-primary-color, currentColor);\n opacity: 1;\n opacity: var(--fa-primary-opacity, 1);\n}\n\n.svg-inline--fa .fa-secondary {\n fill: var(--fa-secondary-color, curren
tColor);\n opacity: 0.4;\n opacity: var(--fa-secondary-opacity, 0.4);\n}\n\n.svg-inline--fa.fa-swap-opacity .fa-primary {\n opacity: 0.4;\n opacity: var(--fa-secondary-opacity, 0.4);\n}\n\n.svg-inline--fa.fa-swap-opacity .fa-secondary {\n opacity: 1;\n opacity: var(--fa-primary-opacity, 1);\n}\n\n.svg-inline--fa mask .fa-primary,\n.svg-inline--fa mask .fa-secondary {\n fill: black;\n}\n\n.fad.fa-inverse {\n color: #fff;\n}';if(e!==t||a!==n){var i=new RegExp("\\.".concat(t,"\\-"),"g"),o=new RegExp("\\--".concat(t,"\\-"),"g"),c=new RegExp("\\.".concat(n),"g");r=r.replace(i,".".concat(e,"-")).replace(o,"--".concat(e,"-")).replace(c,".".concat(a))}return r}function vn(){V.autoAddCss&&!wn&&(dt(gn()),wn=!0)}function bn(t,n){return Object.defineProperty(t,"abstract",{get:n}),Object.defineProperty(t,"html",{get:function(){return t.abstract.map((function(t){return Dt(t)}))}}),Object.defineProperty(t,"node",{get:function(){if(v){var n=h.createElement("div");return n.innerHTML=t.html,n
.children}}}),t}var yn=new(function(){function t(){!function(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}(this,t),this.definitions={}}var n,a;return n=t,a=[{key:"add",value:function(){for(var t=this,n=arguments.length,e=new Array(n),a=0;a<n;a++)e[a]=arguments[a];var i=e.reduce(this._pullDefinitions,{});Object.keys(i).forEach((function(n){t.definitions[n]=r({},t.definitions[n]||{},i[n]),St(n,i[n]),Vt()}))}},{key:"reset",value:function(){this.definitions={}}},{key:"_pullDefinitions",value:function(t,n){var e=n.prefix&&n.iconName&&n.icon?{0:n}:n;return Object.keys(e).map((function(n){var a=e[n],r=a.prefix,i=a.iconName,o=a.icon;t[r]||(t[r]={}),t[r][i]=o})),t}}],a&&e(n.prototype,a),t}()),wn=!1,xn={i2svg:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(v){vn();var n=t.node,e=void 0===n?h:n,a=t.callback,r=void 0===a?function(){}:a;return V.searchPseudoElements&&pn(e),fn(e,r)}return ft.reject("Operation requires a DOM of so
me kind.")},css:gn,insertCss:function(){wn||(dt(gn()),wn=!0)},watch:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.autoReplaceSvgRoot,e=t.observeMutationsRoot;!1===V.autoReplaceSvg&&(V.autoReplaceSvg=!0),V.observeMutations=!0,Y((function(){zn({autoReplaceSvgRoot:n}),Jt({treeCallback:fn,nodeCallback:un,pseudoElementsCallback:pn,observeMutationsRoot:e})}))}},kn=(function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=n.transform,a=void 0===e?mt:e,i=n.symbol,o=void 0!==i&&i,c=n.mask,l=void 0===c?null:c,s=n.maskId,f=void 0===s?null:s,u=n.title,m=void 0===u?null:u,d=n.titleId,h=void 0===d?null:d,p=n.classes,g=void 0===p?[]:p,v=n.attributes,b=void 0===v?{}:v,y=n.styles,w=void 0===y?{}:y;if(t){var x=t.prefix,k=t.iconName,z=t.icon;return bn(r({type:"icon"},t),(function(){return vn(),V.autoA11y&&(m?b["aria-labelledby"]="".concat(V.replacementClass,"-title-").concat(h||ht()):(b["aria-hidden"]="true",b.focusable="false")),zt({icons:{main:on
(z),mask:l?on(l.icon):{found:!1,width:null,height:null,icon:{}}},prefix:x,iconName:k,transform:r({},mt,a),symbol:o,title:m,maskId:f,titleId:h,extra:{attributes:b,styles:w,classes:g}})}))}},xn),zn=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.autoReplaceSvgRoot,e=void 0===n?h:n;(Object.keys(R.styles).length>0||V.autoFetchSvg)&&v&&V.autoReplaceSvg&&kn.i2svg({node:e})};yn.add({prefix:"fas",iconName:"cog",icon:[512,512,[],"f013","M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v4
9.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z"]},{prefix:"fas",iconName:"edit",icon:[576,512,[],"f044","M402.6 83.2l90.2 90.2c3.8 3.8 3.8 10 0 13.8L274.4 405.6l-92.8 10.3c-12.4 1.4-22.9-9.1-21.5-21.5l10.3-92.8L388.8 83.2c3.8-3.8 10-3.8 13.8 0zm162-22.9l-48.8-48.8c-15.2-15.2-39.9-15.2-55.2 0l-35.4 35.4c-3.8 3.8-3.8 10 0 13.8l90.2 90.2c3.8 3.8 10 3.8 13.8 0l35.4-35.4c15.2-15.3 15.2-40 0-55.2zM384 346.2V448H64V128h229.8c3.2 0 6.2-1.3 8.5-3.5l40-40c7.6-7.6 2.2-20.5-8.5-20.5H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V306.2c0-10.7-12.9-16-20.5-8.5l-40 40c-2.2 2.3-3.5 5.3-3.5 8.5z"]},{prefix:"fas",iconName:"bookmark",icon:[384,512,[],"f02e","M0 512V48C0 21.49 21.49 0 48 0h288c26.51 0 48 21.49 48 48v464L192 400 0 512z"]},{prefix:"fas
",iconName:"project-diagram",icon:[640,512,[],"f542","M384 320H256c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h128c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32zM192 32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v128c0 17.67 14.33 32 32 32h95.72l73.16 128.04C211.98 300.98 232.4 288 256 288h.28L192 175.51V128h224V64H192V32zM608 0H480c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h128c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32z"]},{prefix:"fas",iconName:"envelope-open-text",icon:[512,512,[],"f658","M176 216h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16H176c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16zm-16 80c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16H176c-8.84 0-16 7.16-16 16v16zm96 121.13c-16.42 0-32.84-5.06-46.86-15.19L0 250.86V464c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V250.86L302.86 401.94c-14.02 10.12-30.44 15.19-46.86 15.19zm237.61-254.18c-8.85-6.94-17.24-13.47-29.61-22.81V96c0-26.51-21.49-48-48-48h-77.55c-3.04-2
.2-5.87-4.26-9.04-6.56C312.6 29.17 279.2-.35 256 0c-23.2-.35-56.59 29.17-73.41 41.44-3.17 2.3-6 4.36-9.04 6.56H96c-26.51 0-48 21.49-48 48v44.14c-12.37 9.33-20.76 15.87-29.61 22.81A47.995 47.995 0 0 0 0 200.72v10.65l96 69.35V96h320v184.72l96-69.35v-10.65c0-14.74-6.78-28.67-18.39-37.77z"]},{prefix:"fas",iconName:"reply",icon:[512,512,[],"f3e5","M8.309 189.836L184.313 37.851C199.719 24.546 224 35.347 224 56.015v80.053c160.629 1.839 288 34.032 288 186.258 0 61.441-39.581 122.309-83.333 154.132-13.653 9.931-33.111-2.533-28.077-18.631 45.344-145.012-21.507-183.51-176.59-185.742V360c0 20.7-24.3 31.453-39.687 18.164l-176.004-152c-11.071-9.562-11.086-26.753 0-36.328z"]},{prefix:"fas",iconName:"comment",icon:[512,512,[],"f075","M256 32C114.6 32 0 125.1 0 240c0 49.6 21.4 95 57 130.7C44.5 421.1 2.7 466 2.2 466.5c-2.2 2.3-2.8 5.7-1.5 8.7S4.8 480 8 480c66.3 0 116-31.8 140.6-51.4 32.7 12.3 69 19.4 107.4 19.4 141.4 0 256-93.1 256-208S397.4 32 256 32z"]},{prefix:"fas",iconName:"forward",icon:[512,51
2,[],"f04e","M500.5 231.4l-192-160C287.9 54.3 256 68.6 256 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2zm-256 0l-192-160C31.9 54.3 0 68.6 0 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2z"]},{prefix:"fas",iconName:"link",icon:[512,512,[],"f0c1","M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37
-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"]},{prefix:"fas",iconName:"plus",icon:[448,512,[],"f067","M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z"]},{prefix:"fas",iconName:"key",icon:[512,512,[],"f084","M512 176.001C512 273.203 433.202 352 336 352c-11.22 0-22.19-1.062-32.827-3.069l-24.012 27.014A23.99
9 23.999 0 0 1 261.223 384H224v40c0 13.255-10.745 24-24 24h-40v40c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24v-78.059c0-6.365 2.529-12.47 7.029-16.971l161.802-161.802C163.108 213.814 160 195.271 160 176 160 78.798 238.797.001 335.999 0 433.488-.001 512 78.511 512 176.001zM336 128c0 26.51 21.49 48 48 48s48-21.49 48-48-21.49-48-48-48-48 21.49-48 48z"]},{prefix:"fas",iconName:"pencil-alt",icon:[512,512,[],"f303","M497.9 142.1l-46.1 46.1c-4.7 4.7-12.3 4.7-17 0l-111-111c-4.7-4.7-4.7-12.3 0-17l46.1-46.1c18.7-18.7 49.1-18.7 67.9 0l60.1 60.1c18.8 18.7 18.8 49.1 0 67.9zM284.2 99.8L21.6 362.4.4 483.9c-2.9 16.4 11.4 30.6 27.8 27.8l121.5-21.3 262.6-262.6c4.7-4.7 4.7-12.3 0-17l-111-111c-4.8-4.7-12.4-4.7-17.1 0zM124.1 339.9c-5.5-5.5-5.5-14.3 0-19.8l154-154c5.5-5.5 14.3-5.5 19.8 0s5.5 14.3 0 19.8l-154 154c-5.5 5.5-14.3 5.5-19.8 0zM88 424h48v36.3l-64.5 11.3-31.1-31.1L51.7 376H88v48z"]},{prefix:"fas",iconName:"times",icon:[352,512,[],"f00d","M242.72 256l100.07-100.07c12.28-12.28 12.28-32.1
9 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"]},{prefix:"fas",iconName:"paperclip",icon:[448,512,[],"f0c6","M43.246 466.142c-58.43-60.289-57.341-157.511 1.386-217.581L254.392 34c44.316-45.332 116.351-45.336 160.671 0 43.89 44.894 43.943 117.329 0 162.276L232.214 383.128c-29.855 30.537-78.633 30.111-107.982-.998-28.275-29.97-27.368-77.473 1.452-106.953l143.743-146.835c6.182-6.314 16.312-6.422 22.626-.241l22.861 22.379c6.315 6.182 6.422 16.312.241 22.626L171.427 319.927c-4.932 5.045-5.236 13.428-.648 18.292 4.372 4.634 11.245 4.711 15.688.165l182.849-186.851c19.613-20.062 19.613-52.725-.011-72.798-19.189-19.627-49.957-19.637-69.154 0L90.39 293.295c-34.763 35.56-35.299
93.12-1.191 128.313 34.01 35.093 88.985 35.137 123.058.286l172.06-175.999c6.177-6.319 16.307-6.433 22.626-.256l22.877 22.364c6.319 6.177 6.434 16.307.256 22.626l-172.06 175.998c-59.576 60.938-155.943 60.216-214.77-.485z"]},{prefix:"fas",iconName:"list",icon:[512,512,[],"f03a","M80 368H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm0-320H16A16 16 0 0 0 0 64v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16V64a16 16 0 0 0-16-16zm0 160H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm416 176H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z"]},{prefix:"fas",iconName:"angle-left",icon:[256,512,[],"f104","M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4
c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z"]},{prefix:"fas",iconName:"angle-double-left",icon:[448,512,[],"f100","M223.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L319.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L393.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34zm-192 34l136 136c9.4 9.4 24.6 9.4 33.9 0l22.6-22.6c9.4-9.4 9.4-24.6 0-33.9L127.9 256l96.4-96.4c9.4-9.4 9.4-24.6 0-33.9L201.7 103c-9.4-9.4-24.6-9.4-33.9 0l-136 136c-9.5 9.4-9.5 24.6-.1 34z"]},{prefix:"fas",iconName:"angle-right",icon:[256,512,[],"f105","M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z"]},{prefix:"fas",iconName:"angle-double-right",icon:[448,512,[],"f101","M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54
.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34zm192-34l-136-136c-9.4-9.4-24.6-9.4-33.9 0l-22.6 22.6c-9.4 9.4-9.4 24.6 0 33.9l96.4 96.4-96.4 96.4c-9.4 9.4-9.4 24.6 0 33.9l22.6 22.6c9.4 9.4 24.6 9.4 33.9 0l136-136c9.4-9.2 9.4-24.4 0-33.8z"]},{prefix:"fas",iconName:"sort",icon:[320,512,[],"f0dc","M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41zm255-105L177 64c-9.4-9.4-24.6-9.4-33.9 0L24 183c-15.1 15.1-4.4 41 17 41h238c21.4 0 32.1-25.9 17-41z"]},{prefix:"fas",iconName:"sort-down",icon:[320,512,[],"f0dd","M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41z"]},{prefix:"fas",iconName:"sort-up",icon:[320,512,[],"f0de","M279 224H41c-21.4 0-32.1-25.9-17-41L143 64c9.4-9.4 24.6-9.4 33.9 0l119 119c15.2 15.1 4.5 41-16.9 41z"]},{prefix:"far",iconName:"edit",icon:[576,512,[],"f044","M402.3 344.9l32-32c5-5 13.7-1.5 13.7 5.7V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5
-48 48-48h273.5c7.1 0 10.7 8.6 5.7 13.7l-32 32c-1.5 1.5-3.5 2.3-5.7 2.3H48v352h352V350.5c0-2.1.8-4.1 2.3-5.6zm156.6-201.8L296.3 405.7l-90.4 10c-26.2 2.9-48.5-19.2-45.6-45.6l10-90.4L432.9 17.1c22.9-22.9 59.9-22.9 82.7 0l43.2 43.2c22.9 22.9 22.9 60 .1 82.8zM460.1 174L402 115.9 216.2 301.8l-7.3 65.3 65.3-7.3L460.1 174zm64.8-79.7l-43.2-43.2c-4.1-4.1-10.8-4.1-14.8 0L436 82l58.1 58.1 30.9-30.9c4-4.2 4-10.8-.1-14.9z"]},{prefix:"far",iconName:"bookmark",icon:[384,512,[],"f02e","M336 0H48C21.49 0 0 21.49 0 48v464l192-112 192 112V48c0-26.51-21.49-48-48-48zm0 428.43l-144-84-144 84V54a6 6 0 0 1 6-6h276c3.314 0 6 2.683 6 5.996V428.43z"]},{prefix:"far",iconName:"clock",icon:[512,512,[],"f017","M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm61.8-104.4l-84.9-61.7c-3.1-2.3-4.9-5.9-4.9-9.7V116c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v141.7l66.8 48.6c5.4 3.9 6.5 11.4 2.6 16.8L334.6 349c-3.9 5.3-11
.4 6.5-16.8 2.6z"]},{prefix:"far",iconName:"calendar-alt",icon:[448,512,[],"f073","M148 288h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm108-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 96v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96-260v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"]},{prefix:"far",iconName:"play-circle",icon:[512,512,[],"
f144","M371.7 238l-176-107c-15.8-8.8-35.7 2.5-35.7 21v208c0 18.4 19.8 29.8 35.7 21l176-101c16.4-9.1 16.4-32.8 0-42zM504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256z"]},{prefix:"far",iconName:"pause-circle",icon:[512,512,[],"f28b","M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm96-280v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16zm-112 0v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16z"]},{prefix:"far",iconName:"arrow-alt-circle-up",icon:[512,512,[],"f35b","M256 504c137 0 248-111 248-248S393 8 256 8 8 119 8 256s111 248 248 248zm0-448c110.5 0 200 89.5 200 200s-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56zm20 328h-40c-6.6 0-12-5.4-12-12V256h-67c-10.7 0-16-12.9-8.5-20.5l99-99c4.7-4.7 1
2.3-4.7 17 0l99 99c7.6 7.6 2.2 20.5-8.5 20.5h-67v116c0 6.6-5.4 12-12 12z"]},{prefix:"far",iconName:"times-circle",icon:[512,512,[],"f057","M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm101.8-262.2L295.6 256l62.2 62.2c4.7 4.7 4.7 12.3 0 17l-22.6 22.6c-4.7 4.7-12.3 4.7-17 0L256 295.6l-62.2 62.2c-4.7 4.7-12.3 4.7-17 0l-22.6-22.6c-4.7-4.7-4.7-12.3 0-17l62.2-62.2-62.2-62.2c-4.7-4.7-4.7-12.3 0-17l22.6-22.6c4.7-4.7 12.3-4.7 17 0l62.2 62.2 62.2-62.2c4.7-4.7 12.3-4.7 17 0l22.6 22.6c4.7 4.7 4.7 12.3 0 17z"]},{prefix:"far",iconName:"question-circle",icon:[512,512,[],"f059","M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 448c-110.532 0-200-89.431-200-200 0-110.495 89.472-200 200-200 110.491 0 200 89.471 200 200 0 110.53-89.431 200-200 200zm107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647
c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516 17.561-9.845 28.324-16.541 28.324-29.579 0-17.246-21.999-28.693-39.784-28.693-23.189 0-33.894 10.977-48.942 29.969-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8zM298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42 18.841-42 42-42 42 18.841 42 42z"]},{prefix:"far",iconName:"file",icon:[384,512,[],"f15b","M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z"]},{prefix:"far",iconName:"check-circle",icon:[512,512,[],"f058","M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 48c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m140.204
130.267l-22.536-22.718c-4.667-4.705-12.265-4.736-16.97-.068L215.346 303.697l-59.792-60.277c-4.667-4.705-12.265-4.736-16.97-.069l-22.719 22.536c-4.705 4.667-4.736 12.265-.068 16.971l90.781 91.516c4.667 4.705 12.265 4.736 16.97.068l172.589-171.204c4.704-4.668 4.734-12.266.067-16.971z"]}),xn.watch()})();
\ No newline at end of file
+(()=>{"use strict";var t={};function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function e(t,n){for(var e=0;e<n.length;e++){var a=n[e];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(t,a.key,a)}}function a(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function r(t){for(var n=1;n<arguments.length;n++){var e=null!=arguments[n]?arguments[n]:{},r=Object.keys(e);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(e).filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})))),r.forEach((function(n){a(t,n,e[n])}))}return t}function i(t,n){return function(t){if(Array.isArray(t))return t}(t)||function(t,n){var e=[],a=!0,r=!1,i=void 0;try{for(var c,
o=t[Symbol.iterator]();!(a=(c=o.next()).done)&&(e.push(c.value),!n||e.length!==n);a=!0);}catch(t){r=!0,i=t}finally{try{a||null==o.return||o.return()}finally{if(r)throw i}}return e}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}();var c=function(){},o={},l={},s=null,f={mark:c,measure:c};try{"undefined"!=typeof window&&(o=window),"undefined"!=typeof document&&(l=document),"undefined"!=typeof MutationObserver&&(s=MutationObserver),"undefined"!=typeof performance&&(f=performance)}catch(t){}var u=(o.navigator||{}).userAgent,m=void 0===u?"":u,d=o,h=l,p=s,g=f,v=(d.document,!!h.documentElement&&!!h.head&&"function"==typeof h.addEventListener&&"function"==typeof h.createElement),b=~m.indexOf("MSIE")||~m.indexOf("Trident/"),y="___FONT_AWESOME___",w=16,x="fa",k="svg-inline--fa",z="data
-fa-i2svg",M="data-fa-pseudo-element",L="data-fa-pseudo-element-pending",C="data-prefix",N="data-icon",A="fontawesome-i2svg",S="async",O=["HTML","HEAD","STYLE","SCRIPT"],P=function(){try{return!0}catch(t){return!1}}(),E={fas:"solid",far:"regular",fal:"light",fad:"duotone",fab:"brands",fak:"kit",fa:"solid"},H={solid:"fas",regular:"far",light:"fal",duotone:"fad",brands:"fab",kit:"fak"},V="fa-layers-text",I=/Font Awesome ([5 ]*)(Solid|Regular|Light|Duotone|Brands|Free|Pro|Kit).*/i,j={900:"fas",400:"far",normal:"far",300:"fal"},T=[1,2,3,4,5,6,7,8,9,10],R=T.concat([11,12,13,14,15,16,17,18,19,20]),_=["class","data-prefix","data-icon","data-fa-transform","data-fa-mask"],D={GROUP:"group",SWAP_OPACITY:"swap-opacity",PRIMARY:"primary",SECONDARY:"secondary"},Y=["xs","sm","lg","fw","ul","li","border","pull-left","pull-right","spin","pulse","rotate-90","rotate-180","rotate-270","flip-horizontal","flip-vertical","flip-both","stack","stack-1x","stack-2x","inverse","layers","layers-text","layers-co
unter",D.GROUP,D.SWAP_OPACITY,D.PRIMARY,D.SECONDARY].concat(T.map((function(t){return"".concat(t,"x")}))).concat(R.map((function(t){return"w-".concat(t)}))),F=d.FontAwesomeConfig||{};h&&"function"==typeof h.querySelector&&[["data-family-prefix","familyPrefix"],["data-replacement-class","replacementClass"],["data-auto-replace-svg","autoReplaceSvg"],["data-auto-add-css","autoAddCss"],["data-auto-a11y","autoA11y"],["data-search-pseudo-elements","searchPseudoElements"],["data-observe-mutations","observeMutations"],["data-mutate-approach","mutateApproach"],["data-keep-original-source","keepOriginalSource"],["data-measure-performance","measurePerformance"],["data-show-missing-icons","showMissingIcons"]].forEach((function(t){var n=i(t,2),e=n[0],a=n[1],r=function(t){return""===t||"false"!==t&&("true"===t||t)}(function(t){var n=h.querySelector("script["+t+"]");if(n)return n.getAttribute(t)}(e));null!=r&&(F[a]=r)}));var X=r({},{familyPrefix:x,replacementClass:k,autoReplaceSvg:!0,autoAddCss:!0
,autoA11y:!0,searchPseudoElements:!1,observeMutations:!0,mutateApproach:"async",keepOriginalSource:!0,measurePerformance:!1,showMissingIcons:!0},F);X.autoReplaceSvg||(X.observeMutations=!1);var B=r({},X);d.FontAwesomeConfig=B;var U=d||{};U[y]||(U[y]={}),U[y].styles||(U[y].styles={}),U[y].hooks||(U[y].hooks={}),U[y].shims||(U[y].shims=[]);var W=U[y],q=[],G=!1;v&&((G=(h.documentElement.doScroll?/^loaded|^c/:/^loaded|^i|^c/).test(h.readyState))||h.addEventListener("DOMContentLoaded",(function t(){h.removeEventListener("DOMContentLoaded",t),G=1,q.map((function(t){return t()}))})));var K,J="pending",Q="settled",Z="fulfilled",$="rejected",tt=function(){},nt=void 0!==t.g&&void 0!==t.g.process&&"function"==typeof t.g.process.emit,et="undefined"==typeof setImmediate?setTimeout:setImmediate,at=[];function rt(){for(var t=0;t<at.length;t++)at[t][0](at[t][1]);at=[],K=!1}function it(t,n){at.push([t,n]),K||(K=!0,et(rt,0))}function ct(t){var n=t.owner,e=n._state,a=n._data,r=t[e],i=t.then;if("functi
on"==typeof r){e=Z;try{a=r(a)}catch(t){ft(i,t)}}ot(i,a)||(e===Z&<(i,a),e===$&&ft(i,a))}function ot(t,e){var a;try{if(t===e)throw new TypeError("A promises callback cannot return that same promise.");if(e&&("function"==typeof e||"object"===n(e))){var r=e.then;if("function"==typeof r)return r.call(e,(function(n){a||(a=!0,e===n?st(t,n):lt(t,n))}),(function(n){a||(a=!0,ft(t,n))})),!0}}catch(n){return a||ft(t,n),!0}return!1}function lt(t,n){t!==n&&ot(t,n)||st(t,n)}function st(t,n){t._state===J&&(t._state=Q,t._data=n,it(mt,t))}function ft(t,n){t._state===J&&(t._state=Q,t._data=n,it(dt,t))}function ut(t){t._then=t._then.forEach(ct)}function mt(t){t._state=Z,ut(t)}function dt(n){n._state=$,ut(n),!n._handled&&nt&&t.g.process.emit("unhandledRejection",n._data,n)}function ht(n){t.g.process.emit("rejectionHandled",n)}function pt(t){if("function"!=typeof t)throw new TypeError("Promise resolver "+t+" is not a function");if(this instanceof pt==0)throw new TypeError("Failed to construct 'Promise'
: Please use the 'new' operator, this object constructor cannot be called as a function.");this._then=[],function(t,n){function e(t){ft(n,t)}try{t((function(t){lt(n,t)}),e)}catch(t){e(t)}}(t,this)}pt.prototype={constructor:pt,_state:J,_then:null,_data:void 0,_handled:!1,then:function(t,n){var e={owner:this,then:new this.constructor(tt),fulfilled:t,rejected:n};return!n&&!t||this._handled||(this._handled=!0,this._state===$&&nt&&it(ht,this)),this._state===Z||this._state===$?it(ct,e):this._then.push(e),e.then},catch:function(t){return this.then(null,t)}},pt.all=function(t){if(!Array.isArray(t))throw new TypeError("You must pass an array to Promise.all().");return new pt((function(n,e){var a=[],r=0;function i(t){return r++,function(e){a[t]=e,--r||n(a)}}for(var c,o=0;o<t.length;o++)(c=t[o])&&"function"==typeof c.then?c.then(i(o),e):a[o]=c;r||n(a)}))},pt.race=function(t){if(!Array.isArray(t))throw new TypeError("You must pass an array to Promise.race().");return new pt((function(n,e){for(v
ar a,r=0;r<t.length;r++)(a=t[r])&&"function"==typeof a.then?a.then(n,e):n(a)}))},pt.resolve=function(t){return t&&"object"===n(t)&&t.constructor===pt?t:new pt((function(n){n(t)}))},pt.reject=function(t){return new pt((function(n,e){e(t)}))};var gt="function"==typeof Promise?Promise:pt,vt=w,bt={size:16,x:0,y:0,rotate:0,flipX:!1,flipY:!1};function yt(t){if(t&&v){var n=h.createElement("style");n.setAttribute("type","text/css"),n.innerHTML=t;for(var e=h.head.childNodes,a=null,r=e.length-1;r>-1;r--){var i=e[r],c=(i.tagName||"").toUpperCase();["STYLE","LINK"].indexOf(c)>-1&&(a=i)}return h.head.insertBefore(n,a),t}}var wt="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";function xt(){for(var t=12,n="";t-- >0;)n+=wt[62*Math.random()|0];return n}function kt(t){for(var n=[],e=(t||[]).length>>>0;e--;)n[e]=t[e];return n}function zt(t){return t.classList?kt(t.classList):(t.getAttribute("class")||"").split(" ").filter((function(t){return t}))}function Mt(t){return"".concat(t).repl
ace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function Lt(t){return Object.keys(t||{}).reduce((function(n,e){return n+"".concat(e,": ").concat(t[e],";")}),"")}function Ct(t){return t.size!==bt.size||t.x!==bt.x||t.y!==bt.y||t.rotate!==bt.rotate||t.flipX||t.flipY}function Nt(t){var n=t.transform,e=t.containerWidth,a=t.iconWidth,r={transform:"translate(".concat(e/2," 256)")},i="translate(".concat(32*n.x,", ").concat(32*n.y,") "),c="scale(".concat(n.size/16*(n.flipX?-1:1),", ").concat(n.size/16*(n.flipY?-1:1),") "),o="rotate(".concat(n.rotate," 0 0)");return{outer:r,inner:{transform:"".concat(i," ").concat(c," ").concat(o)},path:{transform:"translate(".concat(a/2*-1," -256)")}}}var At={x:0,y:0,width:"100%",height:"100%"};function St(t){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return t.attributes&&(t.attributes.fill||n)&&(t.attributes.fill="black"),t}function Ot(t){var n=t.icons,e=n.main,a=n.mask,i=t.prefi
x,c=t.iconName,o=t.transform,l=t.symbol,s=t.title,f=t.maskId,u=t.titleId,m=t.extra,d=t.watchable,h=void 0!==d&&d,p=a.found?a:e,g=p.width,v=p.height,b="fak"===i,y=b?"":"fa-w-".concat(Math.ceil(g/v*16)),w=[B.replacementClass,c?"".concat(B.familyPrefix,"-").concat(c):"",y].filter((function(t){return-1===m.classes.indexOf(t)})).filter((function(t){return""!==t||!!t})).concat(m.classes).join(" "),x={children:[],attributes:r({},m.attributes,{"data-prefix":i,"data-icon":c,class:w,role:m.attributes.role||"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 ".concat(g," ").concat(v)})},k=b&&!~m.classes.indexOf("fa-fw")?{width:"".concat(g/v*16*.0625,"em")}:{};h&&(x.attributes[z]=""),s&&x.children.push({tag:"title",attributes:{id:x.attributes["aria-labelledby"]||"title-".concat(u||xt())},children:[s]});var M=r({},x,{prefix:i,iconName:c,main:e,mask:a,maskId:f,transform:o,symbol:l,styles:r({},k,m.styles)}),L=a.found&&e.found?function(t){var n,e=t.children,a=t.attributes,i=t.main,c=t.mask,o=t.ma
skId,l=t.transform,s=i.width,f=i.icon,u=c.width,m=c.icon,d=Nt({transform:l,containerWidth:u,iconWidth:s}),h={tag:"rect",attributes:r({},At,{fill:"white"})},p=f.children?{children:f.children.map(St)}:{},g={tag:"g",attributes:r({},d.inner),children:[St(r({tag:f.tag,attributes:r({},f.attributes,d.path)},p))]},v={tag:"g",attributes:r({},d.outer),children:[g]},b="mask-".concat(o||xt()),y="clip-".concat(o||xt()),w={tag:"mask",attributes:r({},At,{id:b,maskUnits:"userSpaceOnUse",maskContentUnits:"userSpaceOnUse"}),children:[h,v]},x={tag:"defs",children:[{tag:"clipPath",attributes:{id:y},children:(n=m,"g"===n.tag?n.children:[n])},w]};return e.push(x,{tag:"rect",attributes:r({fill:"currentColor","clip-path":"url(#".concat(y,")"),mask:"url(#".concat(b,")")},At)}),{children:e,attributes:a}}(M):function(t){var n=t.children,e=t.attributes,a=t.main,i=t.transform,c=Lt(t.styles);if(c.length>0&&(e.style=c),Ct(i)){var o=Nt({transform:i,containerWidth:a.width,iconWidth:a.width});n.push({tag:"g",attribu
tes:r({},o.outer),children:[{tag:"g",attributes:r({},o.inner),children:[{tag:a.icon.tag,children:a.icon.children,attributes:r({},a.icon.attributes,o.path)}]}]})}else n.push(a.icon);return{children:n,attributes:e}}(M),C=L.children,N=L.attributes;return M.children=C,M.attributes=N,l?function(t){var n=t.prefix,e=t.iconName,a=t.children,i=t.attributes,c=t.symbol;return[{tag:"svg",attributes:{style:"display: none;"},children:[{tag:"symbol",attributes:r({},i,{id:!0===c?"".concat(n,"-").concat(B.familyPrefix,"-").concat(e):c}),children:a}]}]}(M):function(t){var n=t.children,e=t.main,a=t.mask,i=t.attributes,c=t.styles,o=t.transform;if(Ct(o)&&e.found&&!a.found){var l={x:e.width/e.height/2,y:.5};i.style=Lt(r({},c,{"transform-origin":"".concat(l.x+o.x/16,"em ").concat(l.y+o.y/16,"em")}))}return[{tag:"svg",attributes:i,children:n}]}(M)}function Pt(t){var n=t.content,e=t.width,a=t.height,i=t.transform,c=t.title,o=t.extra,l=t.watchable,s=void 0!==l&&l,f=r({},o.attributes,c?{title:c}:{},{class:o.c
lasses.join(" ")});s&&(f[z]="");var u=r({},o.styles);Ct(i)&&(u.transform=function(t){var n=t.transform,e=t.width,a=void 0===e?w:e,r=t.height,i=void 0===r?w:r,c=t.startCentered,o=void 0!==c&&c,l="";return l+=o&&b?"translate(".concat(n.x/vt-a/2,"em, ").concat(n.y/vt-i/2,"em) "):o?"translate(calc(-50% + ".concat(n.x/vt,"em), calc(-50% + ").concat(n.y/vt,"em)) "):"translate(".concat(n.x/vt,"em, ").concat(n.y/vt,"em) "),(l+="scale(".concat(n.size/vt*(n.flipX?-1:1),", ").concat(n.size/vt*(n.flipY?-1:1),") "))+"rotate(".concat(n.rotate,"deg) ")}({transform:i,startCentered:!0,width:e,height:a}),u["-webkit-transform"]=u.transform);var m=Lt(u);m.length>0&&(f.style=m);var d=[];return d.push({tag:"span",attributes:f,children:[n]}),c&&d.push({tag:"span",attributes:{class:"sr-only"},children:[c]}),d}var Et=function(){},Ht=B.measurePerformance&&g&&g.mark&&g.measure?g:{mark:Et,measure:Et},Vt='FA "5.15.4"',It=function(t){Ht.mark("".concat(Vt," ").concat(t," ends")),Ht.measure("".concat(Vt," ").conca
t(t),"".concat(Vt," ").concat(t," begins"),"".concat(Vt," ").concat(t," ends"))},jt={begin:function(t){return Ht.mark("".concat(Vt," ").concat(t," begins")),function(){return It(t)}},end:It},Tt=function(t,n,e,a){var r,i,c,o=Object.keys(t),l=o.length,s=void 0!==a?function(t,n){return function(e,a,r,i){return t.call(n,e,a,r,i)}}(n,a):n;for(void 0===e?(r=1,c=t[o[0]]):(r=0,c=e);r<l;r++)c=s(c,t[i=o[r]],i,t);return c};function Rt(t){for(var n="",e=0;e<t.length;e++)n+=("000"+t.charCodeAt(e).toString(16)).slice(-4);return n}function _t(t,n){var e=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).skipHooks,a=void 0!==e&&e,i=Object.keys(n).reduce((function(t,e){var a=n[e];return a.icon?t[a.iconName]=a.icon:t[e]=a,t}),{});"function"!=typeof W.hooks.addPack||a?W.styles[t]=r({},W.styles[t]||{},i):W.hooks.addPack(t,i),"fas"===t&&_t("fa",n)}var Dt=W.styles,Yt=W.shims,Ft={},Xt={},Bt={},Ut=function(){var t=function(t){return Tt(Dt,(function(n,e,a){return n[a]=Tt(e,t,{}),n}),{})};Ft=t((func
tion(t,n,e){return n[3]&&(t[n[3]]=e),t})),Xt=t((function(t,n,e){var a=n[2];return t[e]=e,a.forEach((function(n){t[n]=e})),t}));var n="far"in Dt;Bt=Tt(Yt,(function(t,e){var a=e[0],r=e[1],i=e[2];return"far"!==r||n||(r="fas"),t[a]={prefix:r,iconName:i},t}),{})};function Wt(t,n){return(Ft[t]||{})[n]}Ut();var qt=W.styles,Gt=function(){return{prefix:null,iconName:null,rest:[]}};function Kt(t){return t.reduce((function(t,n){var e=function(t,n){var e,a=n.split("-"),r=a[0],i=a.slice(1).join("-");return r!==t||""===i||(e=i,~Y.indexOf(e))?null:i}(B.familyPrefix,n);if(qt[n])t.prefix=n;else if(B.autoFetchSvg&&Object.keys(E).indexOf(n)>-1)t.prefix=n;else if(e){var a="fa"===t.prefix?Bt[e]||{prefix:null,iconName:null}:{};t.iconName=a.iconName||e,t.prefix=a.prefix||t.prefix}else n!==B.replacementClass&&0!==n.indexOf("fa-w-")&&t.rest.push(n);return t}),Gt())}function Jt(t){var n=t.tag,e=t.attributes,a=void 0===e?{}:e,r=t.children,i=void 0===r?[]:r;return"string"==typeof t?Mt(t):"<".concat(n," ").conc
at(function(t){return Object.keys(t||{}).reduce((function(n,e){return n+"".concat(e,'="').concat(Mt(t[e]),'" ')}),"").trim()}(a),">").concat(i.map(Jt).join(""),"</").concat(n,">")}var Qt=function(){};function Zt(t){return"string"==typeof(t.getAttribute?t.getAttribute(z):null)}var $t={replace:function(t){var n=t[0],e=t[1].map((function(t){return Jt(t)})).join("\n");if(n.parentNode&&n.outerHTML)n.outerHTML=e+(B.keepOriginalSource&&"svg"!==n.tagName.toLowerCase()?"\x3c!-- ".concat(n.outerHTML," Font Awesome fontawesome.com --\x3e"):"");else if(n.parentNode){var a=document.createElement("span");n.parentNode.replaceChild(a,n),a.outerHTML=e}},nest:function(t){var n=t[0],e=t[1];if(~zt(n).indexOf(B.replacementClass))return $t.replace(t);var a=new RegExp("".concat(B.familyPrefix,"-.*"));delete e[0].attributes.style,delete e[0].attributes.id;var r=e[0].attributes.class.split(" ").reduce((function(t,n){return n===B.replacementClass||n.match(a)?t.toSvg.push(n):t.toNode.push(n),t}),{toNode:[],to
Svg:[]});e[0].attributes.class=r.toSvg.join(" ");var i=e.map((function(t){return Jt(t)})).join("\n");n.setAttribute("class",r.toNode.join(" ")),n.setAttribute(z,""),n.innerHTML=i}};function tn(t){t()}function nn(t,n){var e="function"==typeof n?n:Qt;if(0===t.length)e();else{var a=tn;B.mutateApproach===S&&(a=d.requestAnimationFrame||tn),a((function(){var n=!0===B.autoReplaceSvg?$t.replace:$t[B.autoReplaceSvg]||$t.replace,a=jt.begin("mutate");t.map(n),a(),e()}))}}var en=!1;function an(){en=!1}var rn=null;var cn=function(t){var n={size:16,x:0,y:0,flipX:!1,flipY:!1,rotate:0};return t?t.toLowerCase().split(" ").reduce((function(t,n){var e=n.toLowerCase().split("-"),a=e[0],r=e.slice(1).join("-");if(a&&"h"===r)return t.flipX=!0,t;if(a&&"v"===r)return t.flipY=!0,t;if(r=parseFloat(r),isNaN(r))return t;switch(a){case"grow":t.size=t.size+r;break;case"shrink":t.size=t.size-r;break;case"left":t.x=t.x-r;break;case"right":t.x=t.x+r;break;case"up":t.y=t.y-r;break;case"down":t.y=t.y+r;break;case"rota
te":t.rotate=t.rotate+r}return t}),n):n};function on(t){var n=function(t){var n,e,a=t.getAttribute("data-prefix"),r=t.getAttribute("data-icon"),i=void 0!==t.innerText?t.innerText.trim():"",c=Kt(zt(t));return a&&r&&(c.prefix=a,c.iconName=r),c.prefix&&i.length>1?c.iconName=(n=c.prefix,e=t.innerText,(Xt[n]||{})[e]):c.prefix&&1===i.length&&(c.iconName=Wt(c.prefix,Rt(t.innerText))),c}(t),e=n.iconName,a=n.prefix,r=n.rest,i=function(t){var n=t.getAttribute("style"),e=[];return n&&(e=n.split(";").reduce((function(t,n){var e=n.split(":"),a=e[0],r=e.slice(1);return a&&r.length>0&&(t[a]=r.join(":").trim()),t}),{})),e}(t),c=function(t){return cn(t.getAttribute("data-fa-transform"))}(t),o=function(t){var n=t.getAttribute("data-fa-symbol");return null!==n&&(""===n||n)}(t),l=function(t){var n=kt(t.attributes).reduce((function(t,n){return"class"!==t.name&&"style"!==t.name&&(t[n.name]=n.value),t}),{}),e=t.getAttribute("title"),a=t.getAttribute("data-fa-title-id");return B.autoA11y&&(e?n["aria-labell
edby"]="".concat(B.replacementClass,"-title-").concat(a||xt()):(n["aria-hidden"]="true",n.focusable="false")),n}(t),s=function(t){var n=t.getAttribute("data-fa-mask");return n?Kt(n.split(" ").map((function(t){return t.trim()}))):Gt()}(t);return{iconName:e,title:t.getAttribute("title"),titleId:t.getAttribute("data-fa-title-id"),prefix:a,transform:c,symbol:o,mask:s,maskId:t.getAttribute("data-fa-mask-id"),extra:{classes:r,styles:i,attributes:l}}}function ln(t){this.name="MissingIcon",this.message=t||"Icon unavailable",this.stack=(new Error).stack}ln.prototype=Object.create(Error.prototype),ln.prototype.constructor=ln;var sn={fill:"currentColor"},fn={attributeType:"XML",repeatCount:"indefinite",dur:"2s"},un={tag:"path",attributes:r({},sn,{d:"M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7
,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,1
3.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z"})},mn=r({},fn,{attributeName:"opacity"}),dn={tag:"g",children:[un,{tag:"circle",attributes:r({},sn,{cx:"256",cy:"364",r:"28"}),children:[{tag:"animate",attributes:r({},fn,{attributeName:"r",values:"28;14;28;28;14;28;"})},{tag:"animate",attributes:r({},mn,{values:"1;0;1;1;0;1;"})}]},{tag:"path",attributes:r({},sn,{opacity:"1",d:"M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z"}),children:[{tag:"animate",attributes:r({},mn,{values:"1;0;0;0;0;1;"})}]},{tag:"path",attributes:r({},sn,{opacity:"0",d:"M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-
12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z"}),children:[{tag:"animate",attributes:r({},mn,{values:"0;0;1;1;0;0;"})}]}]},hn=W.styles;function pn(t){var n=t[0],e=t[1],a=i(t.slice(4),1)[0];return{found:!0,width:n,height:e,icon:Array.isArray(a)?{tag:"g",attributes:{class:"".concat(B.familyPrefix,"-").concat(D.GROUP)},children:[{tag:"path",attributes:{class:"".concat(B.familyPrefix,"-").concat(D.SECONDARY),fill:"currentColor",d:a[0]}},{tag:"path",attributes:{class:"".concat(B.familyPrefix,"-").concat(D.PRIMARY),fill:"currentColor",d:a[1]}}]}:{tag:"path",attributes:{fill:"currentColor",d:a}}}}function gn(t,n){return new gt((function(e,a){var r={found:!1,width:512,height:512,icon:dn};if(t&&n&&hn[n]&&hn[n][t])return e(pn(hn[n][t]));t&&n&&!B.showMissingIcons?a(new ln("Icon is missing for prefix ".concat(n," with icon name ").concat(t))):e(r)}))}var vn=W.styles;function bn(t){var n=on(t);return~n.extra.classes.indexOf(V)?function(t,n){var e=n.title,a=n.transform,r=n.extra,i=null,c=n
ull;if(b){var o=parseInt(getComputedStyle(t).fontSize,10),l=t.getBoundingClientRect();i=l.width/o,c=l.height/o}return B.autoA11y&&!e&&(r.attributes["aria-hidden"]="true"),gt.resolve([t,Pt({content:t.innerHTML,width:i,height:c,transform:a,title:e,extra:r,watchable:!0})])}(t,n):function(t,n){var e=n.iconName,a=n.title,r=n.titleId,c=n.prefix,o=n.transform,l=n.symbol,s=n.mask,f=n.maskId,u=n.extra;return new gt((function(n,m){gt.all([gn(e,c),gn(s.iconName,s.prefix)]).then((function(s){var m=i(s,2),d=m[0],h=m[1];n([t,Ot({icons:{main:d,mask:h},prefix:c,iconName:e,transform:o,symbol:l,mask:h,maskId:f,title:a,titleId:r,extra:u,watchable:!0})])}))}))}(t,n)}function yn(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(v){var e=h.documentElement.classList,a=function(t){return e.add("".concat(A,"-").concat(t))},r=function(t){return e.remove("".concat(A,"-").concat(t))},i=B.autoFetchSvg?Object.keys(E):Object.keys(vn),c=[".".concat(V,":not([").concat(z,"])")].concat(i.map((fu
nction(t){return".".concat(t,":not([").concat(z,"])")}))).join(", ");if(0!==c.length){var o=[];try{o=kt(t.querySelectorAll(c))}catch(t){}if(o.length>0){a("pending"),r("complete");var l=jt.begin("onTree"),s=o.reduce((function(t,n){try{var e=bn(n);e&&t.push(e)}catch(t){P||t instanceof ln&&console.error(t)}return t}),[]);return new gt((function(t,e){gt.all(s).then((function(e){nn(e,(function(){a("active"),a("complete"),r("pending"),"function"==typeof n&&n(),l(),t()}))})).catch((function(){l(),e()}))}))}}}}function wn(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;bn(t).then((function(t){t&&nn([t],n)}))}function xn(t,n){var e="".concat(L).concat(n.replace(":","-"));return new gt((function(a,i){if(null!==t.getAttribute(e))return a();var c=kt(t.children).filter((function(t){return t.getAttribute(M)===n}))[0],o=d.getComputedStyle(t,n),l=o.getPropertyValue("font-family").match(I),s=o.getPropertyValue("font-weight"),f=o.getPropertyValue("content");if(c&&!l)return t.remo
veChild(c),a();if(l&&"none"!==f&&""!==f){var u=o.getPropertyValue("content"),m=~["Solid","Regular","Light","Duotone","Brands","Kit"].indexOf(l[2])?H[l[2].toLowerCase()]:j[s],p=Rt(3===u.length?u.substr(1,1):u),g=Wt(m,p),v=g;if(!g||c&&c.getAttribute(C)===m&&c.getAttribute(N)===v)a();else{t.setAttribute(e,v),c&&t.removeChild(c);var b={iconName:null,title:null,titleId:null,prefix:null,transform:bt,symbol:!1,mask:null,maskId:null,extra:{classes:[],styles:{},attributes:{}}},y=b.extra;y.attributes[M]=n,gn(g,m).then((function(i){var c=Ot(r({},b,{icons:{main:i,mask:Gt()},prefix:m,iconName:v,extra:y,watchable:!0})),o=h.createElement("svg");":before"===n?t.insertBefore(o,t.firstChild):t.appendChild(o),o.outerHTML=c.map((function(t){return Jt(t)})).join("\n"),t.removeAttribute(e),a()})).catch(i)}}else a()}))}function kn(t){return gt.all([xn(t,":before"),xn(t,":after")])}function zn(t){return!(t.parentNode===document.head||~O.indexOf(t.tagName.toUpperCase())||t.getAttribute(M)||t.parentNode&&"sv
g"===t.parentNode.tagName)}function Mn(t){if(v)return new gt((function(n,e){var a=kt(t.querySelectorAll("*")).filter(zn).map(kn),r=jt.begin("searchPseudoElements");en=!0,gt.all(a).then((function(){r(),an(),n()})).catch((function(){r(),an(),e()}))}))}var Ln='svg:not(:root).svg-inline--fa {\n overflow: visible;\n}\n\n.svg-inline--fa {\n display: inline-block;\n font-size: inherit;\n height: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n}\n.svg-inline--fa.fa-lg {\n vertical-align: -0.225em;\n}\n.svg-inline--fa.fa-w-1 {\n width: 0.0625em;\n}\n.svg-inline--fa.fa-w-2 {\n width: 0.125em;\n}\n.svg-inline--fa.fa-w-3 {\n width: 0.1875em;\n}\n.svg-inline--fa.fa-w-4 {\n width: 0.25em;\n}\n.svg-inline--fa.fa-w-5 {\n width: 0.3125em;\n}\n.svg-inline--fa.fa-w-6 {\n width: 0.375em;\n}\n.svg-inline--fa.fa-w-7 {\n width: 0.4375em;\n}\n.svg-inline--fa.fa-w-8 {\n width: 0.5em;\n}\n.svg-inline--fa.fa-w-9 {\n width: 0.5625em;\n}\n.svg-inline--fa.fa-w-10 {\n width: 0.625em;\n}\n.
svg-inline--fa.fa-w-11 {\n width: 0.6875em;\n}\n.svg-inline--fa.fa-w-12 {\n width: 0.75em;\n}\n.svg-inline--fa.fa-w-13 {\n width: 0.8125em;\n}\n.svg-inline--fa.fa-w-14 {\n width: 0.875em;\n}\n.svg-inline--fa.fa-w-15 {\n width: 0.9375em;\n}\n.svg-inline--fa.fa-w-16 {\n width: 1em;\n}\n.svg-inline--fa.fa-w-17 {\n width: 1.0625em;\n}\n.svg-inline--fa.fa-w-18 {\n width: 1.125em;\n}\n.svg-inline--fa.fa-w-19 {\n width: 1.1875em;\n}\n.svg-inline--fa.fa-w-20 {\n width: 1.25em;\n}\n.svg-inline--fa.fa-pull-left {\n margin-right: 0.3em;\n width: auto;\n}\n.svg-inline--fa.fa-pull-right {\n margin-left: 0.3em;\n width: auto;\n}\n.svg-inline--fa.fa-border {\n height: 1.5em;\n}\n.svg-inline--fa.fa-li {\n width: 2em;\n}\n.svg-inline--fa.fa-fw {\n width: 1.25em;\n}\n\n.fa-layers svg.svg-inline--fa {\n bottom: 0;\n left: 0;\n margin: auto;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.fa-layers {\n display: inline-block;\n height: 1em;\n position: relative;\n text-alig
n: center;\n vertical-align: -0.125em;\n width: 1em;\n}\n.fa-layers svg.svg-inline--fa {\n -webkit-transform-origin: center center;\n transform-origin: center center;\n}\n\n.fa-layers-counter, .fa-layers-text {\n display: inline-block;\n position: absolute;\n text-align: center;\n}\n\n.fa-layers-text {\n left: 50%;\n top: 50%;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n -webkit-transform-origin: center center;\n transform-origin: center center;\n}\n\n.fa-layers-counter {\n background-color: #ff253a;\n border-radius: 1em;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n color: #fff;\n height: 1.5em;\n line-height: 1;\n max-width: 5em;\n min-width: 1.5em;\n overflow: hidden;\n padding: 0.25em;\n right: 0;\n text-overflow: ellipsis;\n top: 0;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: top right;\n transform-origin
: top right;\n}\n\n.fa-layers-bottom-right {\n bottom: 0;\n right: 0;\n top: auto;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: bottom right;\n transform-origin: bottom right;\n}\n\n.fa-layers-bottom-left {\n bottom: 0;\n left: 0;\n right: auto;\n top: auto;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: bottom left;\n transform-origin: bottom left;\n}\n\n.fa-layers-top-right {\n right: 0;\n top: 0;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: top right;\n transform-origin: top right;\n}\n\n.fa-layers-top-left {\n left: 0;\n right: auto;\n top: 0;\n -webkit-transform: scale(0.25);\n transform: scale(0.25);\n -webkit-transform-origin: top left;\n transform-origin: top left;\n}\n\n.fa-lg {\n font-size: 1.3333333333em;\n line-height: 0.75em;\n vertical-align: -0.0667e
m;\n}\n\n.fa-xs {\n font-size: 0.75em;\n}\n\n.fa-sm {\n font-size: 0.875em;\n}\n\n.fa-1x {\n font-size: 1em;\n}\n\n.fa-2x {\n font-size: 2em;\n}\n\n.fa-3x {\n font-size: 3em;\n}\n\n.fa-4x {\n font-size: 4em;\n}\n\n.fa-5x {\n font-size: 5em;\n}\n\n.fa-6x {\n font-size: 6em;\n}\n\n.fa-7x {\n font-size: 7em;\n}\n\n.fa-8x {\n font-size: 8em;\n}\n\n.fa-9x {\n font-size: 9em;\n}\n\n.fa-10x {\n font-size: 10em;\n}\n\n.fa-fw {\n text-align: center;\n width: 1.25em;\n}\n\n.fa-ul {\n list-style-type: none;\n margin-left: 2.5em;\n padding-left: 0;\n}\n.fa-ul > li {\n position: relative;\n}\n\n.fa-li {\n left: -2em;\n position: absolute;\n text-align: center;\n width: 2em;\n line-height: inherit;\n}\n\n.fa-border {\n border: solid 0.08em #eee;\n border-radius: 0.1em;\n padding: 0.2em 0.25em 0.15em;\n}\n\n.fa-pull-left {\n float: left;\n}\n\n.fa-pull-right {\n float: right;\n}\n\n.fa.fa-pull-left,\n.fas.fa-pull-left,\n.far.fa-pull-left,\n.fal.fa-pull-left,\n.fab.fa-pu
ll-left {\n margin-right: 0.3em;\n}\n.fa.fa-pull-right,\n.fas.fa-pull-right,\n.far.fa-pull-right,\n.fal.fa-pull-right,\n.fab.fa-pull-right {\n margin-left: 0.3em;\n}\n\n.fa-spin {\n -webkit-animation: fa-spin 2s infinite linear;\n animation: fa-spin 2s infinite linear;\n}\n\n.fa-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8);\n}\n\n at -webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n at keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.fa-rotate-90 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";\n -webkit-transform: rotate(90deg);\n transform: rotate(90
deg);\n}\n\n.fa-rotate-180 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.fa-rotate-270 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";\n -webkit-transform: rotate(270deg);\n transform: rotate(270deg);\n}\n\n.fa-flip-horizontal {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";\n -webkit-transform: scale(-1, 1);\n transform: scale(-1, 1);\n}\n\n.fa-flip-vertical {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";\n -webkit-transform: scale(1, -1);\n transform: scale(1, -1);\n}\n\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";\n -webkit-transform: scale(-1, -1);\n transform: scale(-1, -1);\n}\n\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root
.fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical,\n:root .fa-flip-both {\n -webkit-filter: none;\n filter: none;\n}\n\n.fa-stack {\n display: inline-block;\n height: 2em;\n position: relative;\n width: 2.5em;\n}\n\n.fa-stack-1x,\n.fa-stack-2x {\n bottom: 0;\n left: 0;\n margin: auto;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.svg-inline--fa.fa-stack-1x {\n height: 1em;\n width: 1.25em;\n}\n.svg-inline--fa.fa-stack-2x {\n height: 2em;\n width: 2.5em;\n}\n\n.fa-inverse {\n color: #fff;\n}\n\n.sr-only {\n border: 0;\n clip: rect(0, 0, 0, 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n clip: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n position: static;\n width: auto;\n}\n\n.svg-inline--fa .fa-primary {\n fill: var(--fa-primary-color, currentColor);\n opacity: 1;\n opacity: var(--fa-prim
ary-opacity, 1);\n}\n\n.svg-inline--fa .fa-secondary {\n fill: var(--fa-secondary-color, currentColor);\n opacity: 0.4;\n opacity: var(--fa-secondary-opacity, 0.4);\n}\n\n.svg-inline--fa.fa-swap-opacity .fa-primary {\n opacity: 0.4;\n opacity: var(--fa-secondary-opacity, 0.4);\n}\n\n.svg-inline--fa.fa-swap-opacity .fa-secondary {\n opacity: 1;\n opacity: var(--fa-primary-opacity, 1);\n}\n\n.svg-inline--fa mask .fa-primary,\n.svg-inline--fa mask .fa-secondary {\n fill: black;\n}\n\n.fad.fa-inverse {\n color: #fff;\n}';function Cn(){var t=x,n=k,e=B.familyPrefix,a=B.replacementClass,r=Ln;if(e!==t||a!==n){var i=new RegExp("\\.".concat(t,"\\-"),"g"),c=new RegExp("\\--".concat(t,"\\-"),"g"),o=new RegExp("\\.".concat(n),"g");r=r.replace(i,".".concat(e,"-")).replace(c,"--".concat(e,"-")).replace(o,".".concat(a))}return r}function Nn(){B.autoAddCss&&!Sn&&(yt(Cn()),Sn=!0)}var An=new(function(){function t(){!function(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class a
s a function")}(this,t),this.definitions={}}var n,a;return n=t,a=[{key:"add",value:function(){for(var t=this,n=arguments.length,e=new Array(n),a=0;a<n;a++)e[a]=arguments[a];var i=e.reduce(this._pullDefinitions,{});Object.keys(i).forEach((function(n){t.definitions[n]=r({},t.definitions[n]||{},i[n]),_t(n,i[n]),Ut()}))}},{key:"reset",value:function(){this.definitions={}}},{key:"_pullDefinitions",value:function(t,n){var e=n.prefix&&n.iconName&&n.icon?{0:n}:n;return Object.keys(e).map((function(n){var a=e[n],r=a.prefix,i=a.iconName,c=a.icon;t[r]||(t[r]={}),t[r][i]=c})),t}}],a&&e(n.prototype,a),t}()),Sn=!1,On={i2svg:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(v){Nn();var n=t.node,e=void 0===n?h:n,a=t.callback,r=void 0===a?function(){}:a;return B.searchPseudoElements&&Mn(e),yn(e,r)}return gt.reject("Operation requires a DOM of some kind.")},css:Cn,insertCss:function(){Sn||(yt(Cn()),Sn=!0)},watch:function(){var t,n=arguments.length>0&&void 0!==arguments[0]?
arguments[0]:{},e=n.autoReplaceSvgRoot,a=n.observeMutationsRoot;!1===B.autoReplaceSvg&&(B.autoReplaceSvg=!0),B.observeMutations=!0,t=function(){En({autoReplaceSvgRoot:e}),function(t){if(p&&B.observeMutations){var n=t.treeCallback,e=t.nodeCallback,a=t.pseudoElementsCallback,r=t.observeMutationsRoot,i=void 0===r?h:r;rn=new p((function(t){en||kt(t).forEach((function(t){if("childList"===t.type&&t.addedNodes.length>0&&!Zt(t.addedNodes[0])&&(B.searchPseudoElements&&a(t.target),n(t.target)),"attributes"===t.type&&t.target.parentNode&&B.searchPseudoElements&&a(t.target.parentNode),"attributes"===t.type&&Zt(t.target)&&~_.indexOf(t.attributeName))if("class"===t.attributeName){var r=Kt(zt(t.target)),i=r.prefix,c=r.iconName;i&&t.target.setAttribute("data-prefix",i),c&&t.target.setAttribute("data-icon",c)}else e(t.target)}))})),v&&rn.observe(i,{childList:!0,attributes:!0,characterData:!0,subtree:!0})}}({treeCallback:yn,nodeCallback:wn,pseudoElementsCallback:Mn,observeMutationsRoot:a})},v&&(G?set
Timeout(t,0):q.push(t))}},Pn=(function(t){var n,e,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=a.transform,c=void 0===i?bt:i,o=a.symbol,l=void 0!==o&&o,s=a.mask,f=void 0===s?null:s,u=a.maskId,m=void 0===u?null:u,d=a.title,p=void 0===d?null:d,g=a.titleId,b=void 0===g?null:g,y=a.classes,w=void 0===y?[]:y,x=a.attributes,k=void 0===x?{}:x,z=a.styles,M=void 0===z?{}:z;if(t){var L=t.prefix,C=t.iconName,N=t.icon;return n=r({type:"icon"},t),e=function(){return Nn(),B.autoA11y&&(p?k["aria-labelledby"]="".concat(B.replacementClass,"-title-").concat(b||xt()):(k["aria-hidden"]="true",k.focusable="false")),Ot({icons:{main:pn(N),mask:f?pn(f.icon):{found:!1,width:null,height:null,icon:{}}},prefix:L,iconName:C,transform:r({},bt,c),symbol:l,title:p,maskId:m,titleId:b,extra:{attributes:k,styles:M,classes:w}})},Object.defineProperty(n,"abstract",{get:e}),Object.defineProperty(n,"html",{get:function(){return n.abstract.map((function(t){return Jt(t)}))}}),Object.defineProperty(n,"node",
{get:function(){if(v){var t=h.createElement("div");return t.innerHTML=n.html,t.children}}}),n}},On),En=function(){var t=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).autoReplaceSvgRoot,n=void 0===t?h:t;(Object.keys(W.styles).length>0||B.autoFetchSvg)&&v&&B.autoReplaceSvg&&Pn.i2svg({node:n})};An.add({prefix:"fas",iconName:"cog",icon:[512,512,[],"f013","M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 4
2.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z"]},{prefix:"fas",iconName:"edit",icon:[576,512,[],"f044","M402.6 83.2l90.2 90.2c3.8 3.8 3.8 10 0 13.8L274.4 405.6l-92.8 10.3c-12.4 1.4-22.9-9.1-21.5-21.5l10.3-92.8L388.8 83.2c3.8-3.8 10-3.8 13.8 0zm162-22.9l-48.8-48.8c-15.2-15.2-39.9-15.2-55.2 0l-35.4 35.4c-3.8 3.8-3.8 10 0 13.8l90.2 90.2c3.8 3.8 10 3.8 13.8 0l35.4-35.4c15.2-15.3 15.2-40 0-55.2zM384 346.2V448H64V128h229.8c3.2 0 6.2-1.3 8.5-3.5l40-40c7.6-7.6 2.2-20.5-8.5-20.5H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V306.2c0-10.7-12.9-16-20.5-8.5l-40 40c-2.2 2.3-3.5 5.3-3.5 8.5z"]},{prefix:"fas",iconName:"bookmark",icon:[384,512,[],"f02e","M0 512V48C0 21.49 21.49 0 48 0h288c26.51 0 48 21.49 48 48v464L192 400 0 512z"]},{prefix:"fas",iconName:"project-diagram",icon:[640,512,[],"f542","M384 320H256c-17.67 0-32 14.33-32 32v128c
0 17.67 14.33 32 32 32h128c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32zM192 32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v128c0 17.67 14.33 32 32 32h95.72l73.16 128.04C211.98 300.98 232.4 288 256 288h.28L192 175.51V128h224V64H192V32zM608 0H480c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h128c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32z"]},{prefix:"fas",iconName:"envelope-open-text",icon:[512,512,[],"f658","M176 216h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16H176c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16zm-16 80c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16H176c-8.84 0-16 7.16-16 16v16zm96 121.13c-16.42 0-32.84-5.06-46.86-15.19L0 250.86V464c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V250.86L302.86 401.94c-14.02 10.12-30.44 15.19-46.86 15.19zm237.61-254.18c-8.85-6.94-17.24-13.47-29.61-22.81V96c0-26.51-21.49-48-48-48h-77.55c-3.04-2.2-5.87-4.26-9.04-6.56C312.6 29.17 279.2-.35 256 0c-23.2-.35-56.59 29.17-73.41 41.44-3.17 2.3-6
4.36-9.04 6.56H96c-26.51 0-48 21.49-48 48v44.14c-12.37 9.33-20.76 15.87-29.61 22.81A47.995 47.995 0 0 0 0 200.72v10.65l96 69.35V96h320v184.72l96-69.35v-10.65c0-14.74-6.78-28.67-18.39-37.77z"]},{prefix:"fas",iconName:"reply",icon:[512,512,[],"f3e5","M8.309 189.836L184.313 37.851C199.719 24.546 224 35.347 224 56.015v80.053c160.629 1.839 288 34.032 288 186.258 0 61.441-39.581 122.309-83.333 154.132-13.653 9.931-33.111-2.533-28.077-18.631 45.344-145.012-21.507-183.51-176.59-185.742V360c0 20.7-24.3 31.453-39.687 18.164l-176.004-152c-11.071-9.562-11.086-26.753 0-36.328z"]},{prefix:"fas",iconName:"comment",icon:[512,512,[],"f075","M256 32C114.6 32 0 125.1 0 240c0 49.6 21.4 95 57 130.7C44.5 421.1 2.7 466 2.2 466.5c-2.2 2.3-2.8 5.7-1.5 8.7S4.8 480 8 480c66.3 0 116-31.8 140.6-51.4 32.7 12.3 69 19.4 107.4 19.4 141.4 0 256-93.1 256-208S397.4 32 256 32z"]},{prefix:"fas",iconName:"forward",icon:[512,512,[],"f04e","M500.5 231.4l-192-160C287.9 54.3 256 68.6 256 96v320c0 27.4 31.9 41.8 52.5 24.6l19
2-160c15.3-12.8 15.3-36.4 0-49.2zm-256 0l-192-160C31.9 54.3 0 68.6 0 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2z"]},{prefix:"fas",iconName:"link",icon:[512,512,[],"f0c1","M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064
3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"]},{prefix:"fas",iconName:"plus",icon:[448,512,[],"f067","M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z"]},{prefix:"fas",iconName:"key",icon:[512,512,[],"f084","M512 176.001C512 273.203 433.202 352 336 352c-11.22 0-22.19-1.062-32.827-3.069l-24.012 27.014A23.999 23.999 0 0 1 261.223 384H224v40c0 13.255-10.745 24-24 24h-40v40c0 13.255-10.745 24-24 24H24c-
13.255 0-24-10.745-24-24v-78.059c0-6.365 2.529-12.47 7.029-16.971l161.802-161.802C163.108 213.814 160 195.271 160 176 160 78.798 238.797.001 335.999 0 433.488-.001 512 78.511 512 176.001zM336 128c0 26.51 21.49 48 48 48s48-21.49 48-48-21.49-48-48-48-48 21.49-48 48z"]},{prefix:"fas",iconName:"pencil-alt",icon:[512,512,[],"f303","M497.9 142.1l-46.1 46.1c-4.7 4.7-12.3 4.7-17 0l-111-111c-4.7-4.7-4.7-12.3 0-17l46.1-46.1c18.7-18.7 49.1-18.7 67.9 0l60.1 60.1c18.8 18.7 18.8 49.1 0 67.9zM284.2 99.8L21.6 362.4.4 483.9c-2.9 16.4 11.4 30.6 27.8 27.8l121.5-21.3 262.6-262.6c4.7-4.7 4.7-12.3 0-17l-111-111c-4.8-4.7-12.4-4.7-17.1 0zM124.1 339.9c-5.5-5.5-5.5-14.3 0-19.8l154-154c5.5-5.5 14.3-5.5 19.8 0s5.5 14.3 0 19.8l-154 154c-5.5 5.5-14.3 5.5-19.8 0zM88 424h48v36.3l-64.5 11.3-31.1-31.1L51.7 376H88v48z"]},{prefix:"fas",iconName:"times",icon:[352,512,[],"f00d","M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.
19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"]},{prefix:"fas",iconName:"paperclip",icon:[448,512,[],"f0c6","M43.246 466.142c-58.43-60.289-57.341-157.511 1.386-217.581L254.392 34c44.316-45.332 116.351-45.336 160.671 0 43.89 44.894 43.943 117.329 0 162.276L232.214 383.128c-29.855 30.537-78.633 30.111-107.982-.998-28.275-29.97-27.368-77.473 1.452-106.953l143.743-146.835c6.182-6.314 16.312-6.422 22.626-.241l22.861 22.379c6.315 6.182 6.422 16.312.241 22.626L171.427 319.927c-4.932 5.045-5.236 13.428-.648 18.292 4.372 4.634 11.245 4.711 15.688.165l182.849-186.851c19.613-20.062 19.613-52.725-.011-72.798-19.189-19.627-49.957-19.637-69.154 0L90.39 293.295c-34.763 35.56-35.299 93.12-1.191 128.313 34.01 35.093 88.985 35.137 123.058.286l172.06-175.999c6.177-6.319 16.307-6
.433 22.626-.256l22.877 22.364c6.319 6.177 6.434 16.307.256 22.626l-172.06 175.998c-59.576 60.938-155.943 60.216-214.77-.485z"]},{prefix:"fas",iconName:"list",icon:[512,512,[],"f03a","M80 368H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm0-320H16A16 16 0 0 0 0 64v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16V64a16 16 0 0 0-16-16zm0 160H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm416 176H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z"]},{prefix:"fas",iconName:"angle-left",icon:[256,512,[],"f104","M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z"]
},{prefix:"fas",iconName:"angle-double-left",icon:[448,512,[],"f100","M223.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L319.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L393.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34zm-192 34l136 136c9.4 9.4 24.6 9.4 33.9 0l22.6-22.6c9.4-9.4 9.4-24.6 0-33.9L127.9 256l96.4-96.4c9.4-9.4 9.4-24.6 0-33.9L201.7 103c-9.4-9.4-24.6-9.4-33.9 0l-136 136c-9.5 9.4-9.5 24.6-.1 34z"]},{prefix:"fas",iconName:"angle-right",icon:[256,512,[],"f105","M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z"]},{prefix:"fas",iconName:"angle-double-right",icon:[448,512,[],"f101","M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34zm192-34l-136-136c-9.4-9.4-24.6-9.4
-33.9 0l-22.6 22.6c-9.4 9.4-9.4 24.6 0 33.9l96.4 96.4-96.4 96.4c-9.4 9.4-9.4 24.6 0 33.9l22.6 22.6c9.4 9.4 24.6 9.4 33.9 0l136-136c9.4-9.2 9.4-24.4 0-33.8z"]},{prefix:"fas",iconName:"sort",icon:[320,512,[],"f0dc","M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41zm255-105L177 64c-9.4-9.4-24.6-9.4-33.9 0L24 183c-15.1 15.1-4.4 41 17 41h238c21.4 0 32.1-25.9 17-41z"]},{prefix:"fas",iconName:"sort-down",icon:[320,512,[],"f0dd","M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41z"]},{prefix:"fas",iconName:"sort-up",icon:[320,512,[],"f0de","M279 224H41c-21.4 0-32.1-25.9-17-41L143 64c9.4-9.4 24.6-9.4 33.9 0l119 119c15.2 15.1 4.5 41-16.9 41z"]},{prefix:"fas",iconName:"expand-arrows-alt",icon:[448,512,[],"f31e","M448 344v112a23.94 23.94 0 0 1-24 24H312c-21.39 0-32.09-25.9-17-41l36.2-36.2L224 295.6 116.77 402.9 153 439c15.09 15.1 4.39 41-17 41H24a23.94 23.94 0 0 1-24-24V344c0-21.4 25.89-32.1 41-17l
36.19 36.2L184.46 256 77.18 148.7 41 185c-15.1 15.1-41 4.4-41-17V56a23.94 23.94 0 0 1 24-24h112c21.39 0 32.09 25.9 17 41l-36.2 36.2L224 216.4l107.23-107.3L295 73c-15.09-15.1-4.39-41 17-41h112a23.94 23.94 0 0 1 24 24v112c0 21.4-25.89 32.1-41 17l-36.19-36.2L263.54 256l107.28 107.3L407 327.1c15.1-15.2 41-4.5 41 16.9z"]},{prefix:"far",iconName:"edit",icon:[576,512,[],"f044","M402.3 344.9l32-32c5-5 13.7-1.5 13.7 5.7V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h273.5c7.1 0 10.7 8.6 5.7 13.7l-32 32c-1.5 1.5-3.5 2.3-5.7 2.3H48v352h352V350.5c0-2.1.8-4.1 2.3-5.6zm156.6-201.8L296.3 405.7l-90.4 10c-26.2 2.9-48.5-19.2-45.6-45.6l10-90.4L432.9 17.1c22.9-22.9 59.9-22.9 82.7 0l43.2 43.2c22.9 22.9 22.9 60 .1 82.8zM460.1 174L402 115.9 216.2 301.8l-7.3 65.3 65.3-7.3L460.1 174zm64.8-79.7l-43.2-43.2c-4.1-4.1-10.8-4.1-14.8 0L436 82l58.1 58.1 30.9-30.9c4-4.2 4-10.8-.1-14.9z"]},{prefix:"far",iconName:"bookmark",icon:[384,512,[],"f02e","M336 0H48C21.49 0 0 21.49 0 48v464l192-112
192 112V48c0-26.51-21.49-48-48-48zm0 428.43l-144-84-144 84V54a6 6 0 0 1 6-6h276c3.314 0 6 2.683 6 5.996V428.43z"]},{prefix:"far",iconName:"clock",icon:[512,512,[],"f017","M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm61.8-104.4l-84.9-61.7c-3.1-2.3-4.9-5.9-4.9-9.7V116c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v141.7l66.8 48.6c5.4 3.9 6.5 11.4 2.6 16.8L334.6 349c-3.9 5.3-11.4 6.5-16.8 2.6z"]},{prefix:"far",iconName:"calendar-alt",icon:[448,512,[],"f073","M148 288h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm108-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 96v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6
0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96-260v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"]},{prefix:"far",iconName:"play-circle",icon:[512,512,[],"f144","M371.7 238l-176-107c-15.8-8.8-35.7 2.5-35.7 21v208c0 18.4 19.8 29.8 35.7 21l176-101c16.4-9.1 16.4-32.8 0-42zM504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256z"]},{prefix:"far",iconName:"pause-circle",icon:[512,512,[],"f28b","M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm96-280v160c0 8.8-7.2 16-16
16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16zm-112 0v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16z"]},{prefix:"far",iconName:"arrow-alt-circle-up",icon:[512,512,[],"f35b","M256 504c137 0 248-111 248-248S393 8 256 8 8 119 8 256s111 248 248 248zm0-448c110.5 0 200 89.5 200 200s-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56zm20 328h-40c-6.6 0-12-5.4-12-12V256h-67c-10.7 0-16-12.9-8.5-20.5l99-99c4.7-4.7 12.3-4.7 17 0l99 99c7.6 7.6 2.2 20.5-8.5 20.5h-67v116c0 6.6-5.4 12-12 12z"]},{prefix:"far",iconName:"times-circle",icon:[512,512,[],"f057","M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm101.8-262.2L295.6 256l62.2 62.2c4.7 4.7 4.7 12.3 0 17l-22.6 22.6c-4.7 4.7-12.3 4.7-17 0L256 295.6l-62.2 62.2c-4.7 4.7-12.3 4.7-17 0l-22.6-22.6c-4.7-4.7-4.7-12.3 0-17l62.2-62.2-62.2-62.2c-4.7-4.7-4.7-12.3 0-17l22.6-22.6c4.7-4.
7 12.3-4.7 17 0l62.2 62.2 62.2-62.2c4.7-4.7 12.3-4.7 17 0l22.6 22.6c4.7 4.7 4.7 12.3 0 17z"]},{prefix:"far",iconName:"question-circle",icon:[512,512,[],"f059","M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 448c-110.532 0-200-89.431-200-200 0-110.495 89.472-200 200-200 110.491 0 200 89.471 200 200 0 110.53-89.431 200-200 200zm107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516 17.561-9.845 28.324-16.541 28.324-29.579 0-17.246-21.999-28.693-39.784-28.693-23.189 0-33.894 10.977-48.942 29.969-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8zM298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42 18.841-42 42-42 42 18.841 42 42z"]},{prefix:"far",iconName:"file",icon:[384,512,[],"f15b","M369.9 97.9L286 14C277 5 264.
8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z"]},{prefix:"far",iconName:"check-circle",icon:[512,512,[],"f058","M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 48c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m140.204 130.267l-22.536-22.718c-4.667-4.705-12.265-4.736-16.97-.068L215.346 303.697l-59.792-60.277c-4.667-4.705-12.265-4.736-16.97-.069l-22.719 22.536c-4.705 4.667-4.736 12.265-.068 16.971l90.781 91.516c4.667 4.705 12.265 4.736 16.97.068l172.589-171.204c4.704-4.668 4.734-12.266.067-16.971z"]}),On.watch()})();
\ No newline at end of file
commit 3b2f8bb47e7a61614bfa4961f1621190d5e81e4b
Author: sunnavy <sunnavy at bestpractical.com>
Date: Sat Jul 9 12:23:40 2022 +0800
Set status colors in lifecycle UI via css to be more flexible
diff --git a/share/static/css/elevator-light/lifecycleui.css b/share/static/css/elevator-light/lifecycleui.css
index 1360daf755..9f0717dd2c 100644
--- a/share/static/css/elevator-light/lifecycleui.css
+++ b/share/static/css/elevator-light/lifecycleui.css
@@ -13,6 +13,18 @@ g circle.node-selected {
fill: #98b9eb !important;
}
+.status-type-active {
+ fill: #547CCC;
+}
+
+.status-type-inactive {
+ fill: #4bb2cc;
+}
+
+.status-type-initial {
+ fill: #599ACC;
+}
+
.dragline {
fill: none;
stroke: #000;
diff --git a/share/static/js/lifecycleui-editor.js b/share/static/js/lifecycleui-editor.js
index 9412839d67..a6b195ec4c 100644
--- a/share/static/js/lifecycleui-editor.js
+++ b/share/static/js/lifecycleui-editor.js
@@ -316,15 +316,8 @@ jQuery(function () {
self.node.select("circle")
.attr("r", self.node_radius)
.attr("stroke", "black")
- .attr("fill", function(d) {
- switch(d.type) {
- case 'active':
- return '#547CCC';
- case 'inactive':
- return '#4bb2cc';
- case 'initial':
- return '#599ACC';
- }
+ .attr("class", function(d) {
+ return 'status status-type-' + d.type;
})
.on("click", function() {
d3.event.stopPropagation();
commit 65528357122d60f9fca341fcea25f44b2ae9fba9
Author: sunnavy <sunnavy at bestpractical.com>
Date: Fri Jul 1 13:13:41 2022 +0800
Support to set descriptions on lifecycle admin pages
diff --git a/share/html/Admin/Lifecycles/Actions.html b/share/html/Admin/Lifecycles/Actions.html
index 99428ad7c9..583b8fbe76 100644
--- a/share/html/Admin/Lifecycles/Actions.html
+++ b/share/html/Admin/Lifecycles/Actions.html
@@ -68,6 +68,7 @@
<th class="collection-as-table"><&|/l&>From</&></th>
<th class="collection-as-table"><&|/l&>To</&></th>
<th class="collection-as-table"><&|/l&>Label</&></th>
+ <th class="collection-as-table"><&|/l&>Description</&></th>
<th class="collection-as-table"><&|/l&>Update Type</&></th>
<th class="collection-as-table text-left">
<div class="custom-control custom-checkbox">
@@ -88,6 +89,9 @@
<td class="collection-as-table">
<input type="text" value="<% $action->{'label'} %>" class="form-control" Name="Action-Label-<%$i%>" />
</td>
+ <td class="collection-as-table">
+ <input type="text" value="<% $action->{'description'} %>" class="form-control" name="Action-Description-<% $i %>" />
+ </td>
<td class="collection-as-table">
<select name="Action-Update-<% $i %>" class="form-control selectpicker">
<option <% !$action->{'update'} ? qq[selected='selected'] : '' %> value="">-</option>
@@ -110,6 +114,7 @@
<td class="collection-as-table"><& /Elements/SelectStatus, Statuses => [ @statuses, '*' ], Name => "Action-From-$i" &></td>
<td class="collection-as-table"><& /Elements/SelectStatus, Statuses => \@statuses, Name => "Action-To-$i" &></td>
<td class="collection-as-table"><input type="text" class="form-control" name='Action-Label-<% $i %>' /></td>
+ <td class="collection-as-table"><input type="text" class="form-control" name='Action-Description-<% $i %>' /></td>
<td class="collection-as-table">
<select name="Action-Update-<% $i %>" class="selectpicker form-control">
<option value="">-</option>
@@ -168,10 +173,12 @@ if ($Update) {
next unless $new_actions{$key}->{from} && $new_actions{$key}->{to} && $new_actions{$key}->{label};
push @new_actions, "$new_actions{$key}->{from} -> $new_actions{$key}->{to}";
- push @new_actions, {
- label => $new_actions{$key}->{label},
- $new_actions{$key}->{update} ? ( update => $new_actions{$key}->{update} ) : (),
- };
+ push @new_actions,
+ {
+ label => $new_actions{$key}->{label},
+ $new_actions{$key}->{description} ? ( description => $new_actions{$key}->{description} ) : (),
+ $new_actions{$key}->{update} ? ( update => $new_actions{$key}->{update} ) : (),
+ };
}
my $config = RT->Config->Get('Lifecycles')->{$LifecycleObj->Name};
diff --git a/share/html/Elements/Lifecycle/Graph b/share/html/Elements/Lifecycle/Graph
index 5623b00db9..1bfe099eaa 100644
--- a/share/html/Elements/Lifecycle/Graph
+++ b/share/html/Elements/Lifecycle/Graph
@@ -46,6 +46,7 @@
%#
%# END BPS TAGGED BLOCK }}}
<div class="lifecycle-ui" id="lifecycle-<% $id %>">
+ <div id="lifecycle-ui-tooltip" data-toggle="tooltip" data-html="true"></div>
<div id="lifeycycle-ui-edit-node" class="lifeycycle-ui-edit-node collapse card card-body">
<input type="hidden" name="id" />
<div class="alert alert-warning invalid-name hidden"><&|/l&>Invalid name</&></div>
@@ -60,6 +61,9 @@
<option value="inactive"><&|/l&>Inactive</&></option>
</select>
</&>
+ <&| /Elements/LabeledValue, Label => loc('Description') &>
+ <input class="form-control" type="text" id="description" name="description" value="" />
+ </&>
<div class="form-row">
<div class="col-12 text-right">
<button class="btn btn-light" id="CancelNode"><&|/l&>Cancel</&></button>
@@ -67,6 +71,33 @@
</div>
</div>
</div>
+ <div id="lifeycycle-ui-edit-link" class="lifeycycle-ui-edit-link collapse card card-body">
+ <input type="hidden" name="id" />
+ <h6 class="text-center mb-1"><&|/l&>Update Description</&></h6>
+ <div class="form-row">
+ <div class="col-4 label">
+ <label for="description_1"></label>
+ </div>
+ <div class="col-8 value">
+ <input class="form-control" type="text" id="description_1" name="description_1" value="" />
+ </div>
+ </div>
+ <div class="form-row">
+ <div class="col-4 label">
+ <label for="description_2"></label>
+ </div>
+ <div class="col-8 value">
+ <input class="form-control" type="text" id="description_2" name="description_2" value="" />
+ </div>
+ </div>
+
+ <div class="form-row">
+ <div class="col-12 text-right">
+ <button class="btn btn-light" id="CancelLink"><&|/l&>Cancel</&></button>
+ <button class="button btn btn-primary form-control" id="SaveLink"><&|/l&>Save</&></button>
+ </div>
+ </div>
+ </div>
<div class="form-row">
<div class="col-12">
@@ -100,7 +131,8 @@ Click on the status text to <strong>edit</strong> the status.<br>
Click and drag a status node to <strong>change the graph layout</strong>.<br>
Control + click on a status and drag to another to <strong>add a transition</strong>.<br>
Click on a status node to select it and press 'd' to <strong>delete</strong>.<br>
-<strong>Click on a transition line</strong> to delete.<br></&>
+Click on a transition to <strong>edit</strong> its description.<br>
+<strong>Control + click on a transition line</strong> to delete.<br></&>
</p>
</div>
</div>
diff --git a/share/static/css/elevator-light/lifecycleui.css b/share/static/css/elevator-light/lifecycleui.css
index afb1adc501..1360daf755 100644
--- a/share/static/css/elevator-light/lifecycleui.css
+++ b/share/static/css/elevator-light/lifecycleui.css
@@ -23,6 +23,13 @@ g circle.node-selected {
.lifeycycle-ui-edit-node {
position: absolute;
z-index: 99;
+ width: 400px;
+}
+
+.lifeycycle-ui-edit-link {
+ position: absolute;
+ z-index: 99;
+ width: 500px;
}
.svg-content-responsive {
@@ -34,3 +41,8 @@ svg .rect {
stroke: steelblue;
stroke-width: 5px;
}
+
+#lifecycle-ui-tooltip {
+ position: absolute;
+ z-index: 999;
+}
diff --git a/share/static/js/lifecycleui-editor.js b/share/static/js/lifecycleui-editor.js
index c61412dfce..9412839d67 100644
--- a/share/static/js/lifecycleui-editor.js
+++ b/share/static/js/lifecycleui-editor.js
@@ -30,6 +30,16 @@ jQuery(function () {
jQuery("#lifeycycle-ui-edit-node div.alert").addClass('hidden');
});
+ jQuery("#SaveLink").click(function(e) {
+ e.preventDefault();
+ self.UpdateLink();
+ });
+
+ jQuery("#CancelLink").click(function(e) {
+ e.preventDefault();
+ jQuery("#lifeycycle-ui-edit-link").toggle();
+ });
+
self.svg = d3.select(container).select('svg')
.attr("preserveAspectRatio", "xMinYMin meet")
.attr("viewBox", "0 0 "+self.width+" "+self.height)
@@ -66,12 +76,35 @@ jQuery(function () {
if (!target) { return };
if ( source.id < target.id ) {
- self.links.push({id: ++self.links_seq, source: source, target: target, start: false, end: true});
+ self.links.push({
+ id: ++self.links_seq,
+ source: source,
+ target: target,
+ start: false,
+ end: true,
+ descriptions: {
+ [source.name + ' -> ' + target.name]: self.config.descriptions[source.name + ' -> ' + target.name],
+ [target.name + ' -> ' + source.name]: self.config.descriptions[target.name + ' -> ' + source.name],
+ }
+ });
return;
}
var link = self.links.filter(function(l) { return (l.source === target && l.target === source); })[0];
- if(link) link.start = true;
- else self.links.push({id: ++self.links_seq, source: source, target: target, start: false, end: true});
+ if (link) {
+ link.start = true;
+ } else {
+ self.links.push({
+ id: ++self.links_seq,
+ source: source,
+ target: target,
+ start: false,
+ end: true,
+ descriptions: {
+ [source.name + ' -> ' + target.name]: self.config.descriptions[source.name + ' -> ' + target.name],
+ [target.name + ' -> ' + source.name]: self.config.descriptions[target.name + ' -> ' + source.name],
+ }
+ });
+ }
});
if ( !self.enableSimulation ) {
if (self.layout[source.name][0]) source.x = parseInt(self.layout[source.name][0]);
@@ -338,6 +371,17 @@ jQuery(function () {
self.node.select("title")
.text(function(d) { return d.type; });
+
+ self.node.select('text').on('mouseover', function(d) {
+ if ( d.description ) {
+ jQuery('#lifecycle-ui-tooltip').css('left', d3.event.pageX).css('top', d3.event.pageY);
+ jQuery('#lifecycle-ui-tooltip').attr('data-original-title', d.description);
+ jQuery('#lifecycle-ui-tooltip').tooltip('show');
+ }
+ })
+ .on('mouseout', function() {
+ jQuery('#lifecycle-ui-tooltip').tooltip('hide');
+ });
}
UpdateNode(element) {
@@ -413,17 +457,95 @@ jQuery(function () {
.attr("transform", "translate(0,0)")
.on("click", function(d) {
d3.event.stopPropagation();
+ d3.event.preventDefault();
self.simulation.stop();
- self.ToggleLink(d);
-
- self.ExportAsConfiguration();
-
- self.Refresh();
+ self.UpdateLink(d);
+ })
+ .on("mouseup", function(d) {
+ d3.event.stopPropagation();
+ d3.event.preventDefault();
+ if ( d3.event.ctrlKey ) {
+ self.ToggleLink(d);
+ self.ExportAsConfiguration();
+ self.Refresh();
+ }
});
self.link = linkEnter.merge(self.link);
self.link
.style("marker-start", function(d) { return d.start ? 'url(#start-arrow)' : '' })
.style("marker-end", function(d) { return d.end ? 'url(#end-arrow)' : '' });
+
+ self.link.on('mouseover', function(d) {
+ let descriptions = [];
+ let item = d.source.name + ' -> ' + d.target.name;
+ let reverse_item = d.target.name + ' -> ' + d.source.name;
+ // if it's bidirectional
+ if ( d.start ) {
+ for ( let i of [item, reverse_item] ) {
+ if ( d.descriptions[i] ) {
+ descriptions.push(i + ': ' + d.descriptions[i]);
+ }
+ }
+ }
+ else {
+ if ( d.descriptions[item] ) {
+ descriptions.push(d.descriptions[item]);
+ }
+ }
+
+ if ( descriptions.length ) {
+ jQuery('#lifecycle-ui-tooltip').css('left', d3.event.pageX).css('top', d3.event.pageY);
+ jQuery('#lifecycle-ui-tooltip').attr('data-original-title', descriptions.join('<br>'));
+ jQuery('#lifecycle-ui-tooltip').tooltip('show');
+ }
+ })
+ .on('mouseout', function() {
+ jQuery('#lifecycle-ui-tooltip').tooltip('hide');
+ });
+ }
+
+ UpdateLink(element) {
+ var self = this;
+ const linkInput = jQuery("#lifeycycle-ui-edit-link");
+
+ if ( event.pageX ) {
+ var posX = event.pageX;
+ var posY = event.pageY;
+ linkInput.css( {position:"absolute", top:posY - 50, left: posX - 200});
+ }
+ var list = document.getElementById('lifeycycle-ui-edit-link').querySelectorAll('input');
+
+ if ( element ) {
+ list[0].setAttribute('value', element.id);
+ let name = element.source.name + ' -> ' + element.target.name;
+ list[1].setAttribute('name', name);
+ list[1].setAttribute('value', element.descriptions[name] || '');
+ jQuery(list[1]).closest('div.form-row').find('div.label').text(name + ':');
+ if ( element.start ) {
+ let name = element.target.name + ' -> ' + element.source.name;
+ list[2].setAttribute('name', name);
+ list[2].setAttribute('value', element.descriptions[name] || '');
+ jQuery(list[2]).closest('div.form-row').find('div.label').text(name + ':');
+ jQuery(list[2]).closest('div.form-row').removeClass('hidden');
+ }
+ else {
+ list[2].setAttribute('name', '');
+ jQuery(list[2]).closest('div.form-row').addClass('hidden');
+ }
+ }
+ else {
+ var values = {};
+ for (let item of list) {
+ if ( item.name === 'id' ) {
+ values.index = self.links.findIndex(function(x) { return x.id == item.value });
+ }
+ values[item.name] = item.value;
+ }
+ self.links[values.index].descriptions = values;
+ self.ExportAsConfiguration();
+ self.Refresh();
+ }
+ linkInput.toggle();
}
Refresh() {
diff --git a/share/static/js/lifecycleui-model.js b/share/static/js/lifecycleui-model.js
index 93847fee88..7800d850e1 100644
--- a/share/static/js/lifecycleui-model.js
+++ b/share/static/js/lifecycleui-model.js
@@ -11,11 +11,12 @@ class LifecycleModel {
NodesFromConfig(config) {
var self = this;
self.nodes = [];
+ config.descriptions ||= {};
jQuery.each(['initial', 'active', 'inactive'], function (i, type) {
if ( config[type] ) {
config[type].forEach(function(element) {
- self.nodes = self.nodes.concat({id: ++self.nodes_seq, name: element, type: type});
+ self.nodes = self.nodes.concat({id: ++self.nodes_seq, name: element, type: type, description: config.descriptions[element]});
});
}
});
@@ -64,7 +65,7 @@ class LifecycleModel {
else {
link = self.links.filter(function(l) { return (l.source.id === source.id && l.target.id === target.id); })[0];
if (!link ) {
- self.links.push({id: ++self.links_seq, source: source, target: target, start: false, end: true});
+ self.links.push({id: ++self.links_seq, source: source, target: target, start: false, end: true, descriptions: {}});
}
}
}
@@ -299,6 +300,7 @@ class LifecycleModel {
active: [],
inactive: [],
transitions: {},
+ descriptions: {},
};
// Grab our status nodes
@@ -316,6 +318,10 @@ class LifecycleModel {
self.nodes.forEach(function(source) {
var links = self.LinksForNode(source);
var targets = links.map(link => {
+ config.descriptions[link.source.name + ' -> ' + link.target.name] = link.descriptions[link.source.name + ' -> ' + link.target.name];
+ if ( link.start ) {
+ config.descriptions[link.target.name + ' -> ' + link.source.name] = link.descriptions[link.target.name + ' -> ' + link.source.name];
+ }
if ( link.source.id === source.id ) {
return link.target.name;
}
@@ -324,6 +330,7 @@ class LifecycleModel {
}
});
config.transitions[source.name] = targets;
+ config.descriptions[source.name] = source.description;
seen[source.name] = 1;
});
@@ -339,6 +346,12 @@ class LifecycleModel {
self.config.defaults ||= {};
self.config.defaults.on_create ||= self.config.initial[0] || self.config.active[0] || null;
+ for ( let item in self.config.descriptions ) {
+ if ( !self.config.descriptions[item] ) {
+ delete self.config.descriptions[item];
+ }
+ }
+
var field = jQuery('form[name=ModifyLifecycle] input[name=Config]');
field.val(JSON.stringify(self.config));
commit 367623e48a653ceb51dd92afc5092a74862b2399
Author: sunnavy <sunnavy at bestpractical.com>
Date: Fri Jun 24 05:21:03 2022 +0800
Add description support to statuses, transitions and actions
diff --git a/etc/RT_Config.pm.in b/etc/RT_Config.pm.in
index 31e3163168..0cb6c5ad18 100644
--- a/etc/RT_Config.pm.in
+++ b/etc/RT_Config.pm.in
@@ -4636,6 +4636,39 @@ For example:
...
},
+Besides, you may add optional descriptions, which show up on hover.
+For example:
+
+ default => {
+ ...
+ actions => [
+ ...
+ 'new -> open' => { label => 'Open it', update => 'Respond', description => 'Open the ticket and reply' },
+ ...
+ ],
+ ...
+ },
+
+=head4 Additional descriptions
+
+You may optionally add descriptions to status and transitions, which show up
+on hover in lifecycle UI. The status ones also show up in Status view/edit
+columns.
+
+For example:
+
+ default => {
+ ...
+ descriptions => [
+ 'new' => 'initial',
+ 'open' => '<strong>working in progress</strong>',
+ 'resolved' => 'closed',
+ 'new -> open' => 'work on the ticket',
+ ...
+ ],
+ ...
+ },
+
=head3 Moving tickets between queues with different lifecycles
Unless there is an explicit mapping between statuses in two different
diff --git a/lib/RT/Interface/Web/MenuBuilder.pm b/lib/RT/Interface/Web/MenuBuilder.pm
index 19d0e68920..d412675edf 100644
--- a/lib/RT/Interface/Web/MenuBuilder.pm
+++ b/lib/RT/Interface/Web/MenuBuilder.pm
@@ -452,7 +452,19 @@ sub BuildMainNav {
id => $id,
);
my $key = $info->{'label'} || ucfirst($next);
- $actions->child( $key => title => loc( $key ), path => $url);
+ $actions->child(
+ $key => title => loc($key),
+ path => $url,
+ attributes => {
+ $info->{description}
+ ? (
+ 'data-toggle' => 'tooltip',
+ 'data-original-title' => loc( $info->{description} ),
+ alt => loc( $info->{description} ),
+ )
+ : (),
+ }
+ );
}
my ($can_take, $tmsg) = $obj->CurrentUserCanSetOwner( Type => 'Take' );
@@ -1076,6 +1088,13 @@ sub _BuildAssetMenuActionSubmenu {
attributes => {
'data-current-status' => $status,
'data-next-status' => $next,
+ $action->{description}
+ ? (
+ 'data-toggle' => 'tooltip',
+ 'data-original-title' => loc( $action->{description} ),
+ alt => loc( $action->{description} ),
+ )
+ : (),
},
);
}
diff --git a/lib/RT/Lifecycle.pm b/lib/RT/Lifecycle.pm
index 68f5f65245..0215dbf84f 100644
--- a/lib/RT/Lifecycle.pm
+++ b/lib/RT/Lifecycle.pm
@@ -734,6 +734,19 @@ sub FillCache {
from => ($lifecycle->{canonical_case}{lc $from} || lc $from),
to => ($lifecycle->{canonical_case}{lc $to} || lc $to), };
}
+
+ for my $item (keys %{ $lifecycle->{descriptions} || {} }) {
+ my $key;
+ if ( $item =~ /(.+?)\s*->\s*(.+)/ ) {
+ $key = lc($1) . ' -> ' . lc($2);
+ }
+ else {
+ $key = lc $item;
+ }
+
+ $lifecycle->{descriptions}{$key}
+ = HTML::Mason::Commands::ScrubHTML( delete $lifecycle->{descriptions}{$item} );
+ }
}
my ( $ret, @warnings ) = $self->ValidateLifecycleMaps();
@@ -1151,4 +1164,10 @@ sub UpdateLifecycleLayout {
return 1;
}
+sub Description {
+ my $self = shift;
+ my $status = shift;
+ return $self->{data}{descriptions}{$status};
+}
+
1;
diff --git a/share/html/Asset/Elements/ShowBasics b/share/html/Asset/Elements/ShowBasics
index 82fcb50905..9f9a57074a 100644
--- a/share/html/Asset/Elements/ShowBasics
+++ b/share/html/Asset/Elements/ShowBasics
@@ -53,7 +53,12 @@
<& /Elements/LabeledValue, Label => loc('Description'), Class => "asset-description", ValueSpanClass => 'current-value', Value => $AssetObj->Description &>
-<& /Elements/LabeledValue, Label => loc('Status'), Class => "asset-status", ValueSpanClass => 'current-value', Value => $AssetObj->Status &>
+<&| /Elements/LabeledValue, Label => loc('Status'), Class => "asset-status", ValueSpanClass => 'current-value' &>
+ <% $AssetObj->Status || '' %>
+% if ( my $desc = $AssetObj->LifecycleObj->Description($AssetObj->Status) ) {
+ <span class="far fa-question-circle icon-helper" data-toggle="tooltip" data-placement="top" data-html="true" data-original-title="<% loc($desc) |n %>"></span>
+% }
+</&>
<& /Elements/ShowCustomFields, Object => $AssetObj, Grouping => 'Basics', Table => 0 &>
% $m->callback(%ARGS, CallbackName => "AfterFields");
diff --git a/share/html/Elements/SelectStatus b/share/html/Elements/SelectStatus
index fceea5b06d..69291ae1a9 100644
--- a/share/html/Elements/SelectStatus
+++ b/share/html/Elements/SelectStatus
@@ -60,7 +60,11 @@
% foreach my $status (@{$statuses_by_lifecycle{$lifecycle}}) {
% next if ($SkipDeleted && lc $status eq 'deleted');
% my $selected = defined $Default && lc $status eq lc $Default ? 'selected="selected"' : '';
-<option value="<% $status %>" <% $selected |n %>><% loc($status) %></option>
+<option
+% if ( $desc{$lifecycle}{$status} ) {
+ data-content="<% $status %> <span class='far fa-question-circle icon-helper' data-toggle='tooltip' data-html='true' data-original-title='<% $desc{$lifecycle}{$status} %>'></span>"
+% }
+ value="<% $status %>" <% $selected |n %>><% loc($status) %></option>
% }
% if ($group_by_lifecycle) {
</optgroup>
@@ -71,13 +75,15 @@
### XXX: no cover for Tools/MyDay.html
my %statuses_by_lifecycle;
+my %desc;
if ( @Statuses ) {
$statuses_by_lifecycle{''} = \@Statuses;
} else {
if ( $Object ) {
my $lifecycle = $Object->LifecycleObj;
+ my $current;
if ($Object->_Accessible("Status", "read")) {
- my $current = $Object->Status;
+ $current = $Object->Status;
my @status;
push @status, $current;
@@ -89,17 +95,28 @@ if ( @Statuses ) {
push @status, $next if $has{ $check };
}
$statuses_by_lifecycle{$lifecycle->Name} = \@status;
+
} else {
$statuses_by_lifecycle{$lifecycle->Name} = [ $lifecycle->Transitions('') ];
}
+
+ for my $status ( @{$statuses_by_lifecycle{$lifecycle->Name}} ) {
+ $desc{ $lifecycle->Name }{$status} = loc($lifecycle->Description($status));
+ }
}
for my $lifecycle ( @Lifecycles ) {
$statuses_by_lifecycle{$lifecycle->Name} ||= [ $lifecycle->Valid ];
+ for my $status ( $lifecycle->Valid ) {
+ $desc{ $lifecycle->Name }{$status} = loc( $lifecycle->Description($status) );
+ }
}
if (not keys %statuses_by_lifecycle) {
for my $lifecycle (map { RT::Lifecycle->Load(Type => $Type, Name => $_) } RT::Lifecycle->List($Type)) {
$statuses_by_lifecycle{$lifecycle->Name} = [ $lifecycle->Valid ];
+ for my $status ( $lifecycle->Valid ) {
+ $desc{ $lifecycle->Name }{$status} = loc( $lifecycle->Description($status) );
+ }
}
}
}
@@ -107,15 +124,17 @@ if ( @Statuses ) {
if (keys %statuses_by_lifecycle) {
my %simplified;
my $key = sub {
- join "\0", sort @{$_[0]};
+ my ( $statuses, $desc ) = @_;
+ join "\0", sort @$statuses, sort map { $_ // '' } values %{ $desc || {} };
};
for my $name (sort keys %statuses_by_lifecycle) {
my $matched;
my $statuses = $statuses_by_lifecycle{$name};
for my $simple (sort keys %simplified) {
- if ($key->($statuses) eq $key->($simplified{$simple})) {
+ if ($key->($statuses, $desc{$name}) eq $key->($simplified{$simple}, $desc{$simple})) {
# Statuses are the same, join 'em!
$simplified{"$simple, $name"} = delete $simplified{$simple};
+ $desc{"$simple, $name"} = $desc{$simple};
$matched++;
last;
}
diff --git a/share/html/Ticket/Elements/ShowBasics b/share/html/Ticket/Elements/ShowBasics
index 35272098ef..630e8e84c9 100644
--- a/share/html/Ticket/Elements/ShowBasics
+++ b/share/html/Ticket/Elements/ShowBasics
@@ -47,7 +47,12 @@
%# END BPS TAGGED BLOCK }}}
<div>
<& /Elements/LabeledValue, Class => 'id',Label => loc("Id"), Value => $Ticket->id &>
- <& /Elements/LabeledValue, Class => 'status',Label => loc("Status"), Value => loc($Ticket->Status), ValueSpanClass => "current-value" &>
+ <&| /Elements/LabeledValue, Class => 'status',Label => loc("Status"), ValueSpanClass => "current-value" &>
+ <% loc($Ticket->Status) %>
+% if ( my $desc = $Ticket->LifecycleObj->Description($Ticket->Status) ) {
+ <span class="far fa-question-circle icon-helper" data-toggle="tooltip" data-placement="top" data-html="true" data-original-title="<% loc($desc) |n %>"></span>
+% }
+ </&>
% if ( !$Ticket->QueueObj->SLADisabled ) {
<& /Elements/LabeledValue, Class => "sla",Label => loc("SLA"), Value => loc($Ticket->SLA), ValueSpanClass => "current_value" &>
% }
diff --git a/share/static/js/util.js b/share/static/js/util.js
index 1c8a1aa6aa..301578d72c 100644
--- a/share/static/js/util.js
+++ b/share/static/js/util.js
@@ -1517,3 +1517,6 @@ function refreshSelectpicker (element) {
updateSelectpickerLiveSearch(element);
element.selectpicker('refresh');
}
+
+// Allow data-* attributes in select options to render tooltips(initially for status)
+jQuery.fn.selectpicker.Constructor.DEFAULTS.whiteList['*'].push(/^data-.+/);
-----------------------------------------------------------------------
hooks/post-receive
--
rt
More information about the rt-commit
mailing list