ng-jhipster
Version:
A Jhipster util library for Angular
147 lines (143 loc) • 18.4 kB
JavaScript
/*
Copyright 2013-2020 the original author or authors from the JHipster project.
This file is part of the JHipster project, see https://www.jhipster.tech/
for more information.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import { Component } from '@angular/core';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
export class JhiThreadModalComponent {
constructor(activeModal) {
this.activeModal = activeModal;
this.threadDumpAll = 0;
this.threadDumpBlocked = 0;
this.threadDumpRunnable = 0;
this.threadDumpTimedWaiting = 0;
this.threadDumpWaiting = 0;
}
ngOnInit() {
this.threadDump.forEach(value => {
if (value.threadState === 'RUNNABLE') {
this.threadDumpRunnable += 1;
}
else if (value.threadState === 'WAITING') {
this.threadDumpWaiting += 1;
}
else if (value.threadState === 'TIMED_WAITING') {
this.threadDumpTimedWaiting += 1;
}
else if (value.threadState === 'BLOCKED') {
this.threadDumpBlocked += 1;
}
});
this.threadDumpAll = this.threadDumpRunnable + this.threadDumpWaiting + this.threadDumpTimedWaiting + this.threadDumpBlocked;
}
getBadgeClass(threadState) {
if (threadState === 'RUNNABLE') {
return 'badge-success';
}
else if (threadState === 'WAITING') {
return 'badge-info';
}
else if (threadState === 'TIMED_WAITING') {
return 'badge-warning';
}
else if (threadState === 'BLOCKED') {
return 'badge-danger';
}
}
}
JhiThreadModalComponent.decorators = [
{ type: Component, args: [{
selector: 'jhi-thread-modal',
template: `
<div class="modal-header">
<h4 class="modal-title" jhiTranslate="metrics.jvm.threads.dump.title">Threads dump</h4>
<button type="button" class="close" (click)="activeModal.dismiss('closed')">×</button>
</div>
<div class="modal-body">
<span class="badge badge-primary" (click)="threadDumpFilter = {}">
All <span class="badge badge-pill badge-default">{{ threadDumpAll }}</span> </span
>
<span class="badge badge-success" (click)="threadDumpFilter = { threadState: 'RUNNABLE' }">
Runnable <span class="badge badge-pill badge-default">{{ threadDumpRunnable }}</span> </span
>
<span class="badge badge-info" (click)="threadDumpFilter = { threadState: 'WAITING' }"
>Waiting <span class="badge badge-pill badge-default">{{ threadDumpWaiting }}</span></span
>
<span class="badge badge-warning" (click)="threadDumpFilter = { threadState: 'TIMED_WAITING' }">
Timed Waiting <span class="badge badge-pill badge-default">{{ threadDumpTimedWaiting }}</span> </span
>
<span class="badge badge-danger" (click)="threadDumpFilter = { threadState: 'BLOCKED' }"
>Blocked <span class="badge badge-pill badge-default">{{ threadDumpBlocked }}</span></span
>
<div class="mt-2"> </div>
Filter
<input type="text" [(ngModel)]="threadDumpFilter" class="form-control" />
<div class="pad" *ngFor="let entry of (threadDump | pureFilter: threadDumpFilter:'lockName' | keys)">
<h6>
<span class="badge" [ngClass]="getBadgeClass(entry.value.threadState)">{{ entry.value.threadState }}</span
> {{ entry.value.threadName }}
(ID
{{ entry.value.threadId }})
<a (click)="entry.show = !entry.show" href="javascript:void(0);">
<span [hidden]="entry.show" jhiTranslate="metrics.jvm.threads.dump.show">Show StackTrace</span>
<span [hidden]="!entry.show" jhiTranslate="metrics.jvm.threads.dump.hide">Hide StackTrace</span>
</a>
</h6>
<div class="card" [hidden]="!entry.show">
<div class="card-body">
<div *ngFor="let st of (entry.value.stackTrace | keys)" class="break">
<samp
>{{ st.value.className }}.{{ st.value.methodName }}(<code
>{{ st.value.fileName }}:{{ st.value.lineNumber }}</code
>)</samp
>
<span class="mt-1"></span>
</div>
</div>
</div>
<table class="table table-sm table-responsive">
<thead>
<tr>
<th jhiTranslate="metrics.jvm.threads.dump.blockedtime">Blocked Time</th>
<th jhiTranslate="metrics.jvm.threads.dump.blockedcount">Blocked Count</th>
<th jhiTranslate="metrics.jvm.threads.dump.waitedtime">Waited Time</th>
<th jhiTranslate="metrics.jvm.threads.dump.waitedcount">Waited Count</th>
<th jhiTranslate="metrics.jvm.threads.dump.lockname">Lock Name</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ entry.value.blockedTime }}</td>
<td>{{ entry.value.blockedCount }}</td>
<td>{{ entry.value.waitedTime }}</td>
<td>{{ entry.value.waitedCount }}</td>
<td class="thread-dump-modal-lock" title="{{ entry.value.lockName }}">
<code>{{ entry.value.lockName }}</code>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary float-left" data-dismiss="modal" (click)="activeModal.dismiss('closed')">
Done
</button>
</div>
`
},] }
];
JhiThreadModalComponent.ctorParameters = () => [
{ type: NgbActiveModal }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamhpLW1ldHJpY3MtbW9kYWwtdGhyZWFkcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50L21ldHJpY3MvamhpLW1ldHJpY3MtbW9kYWwtdGhyZWFkcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFrRjVELE1BQU0sT0FBTyx1QkFBdUI7SUFTaEMsWUFBbUIsV0FBMkI7UUFBM0IsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBTjlDLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUN0Qix1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDdkIsMkJBQXNCLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLHNCQUFpQixHQUFHLENBQUMsQ0FBQztJQUUyQixDQUFDO0lBRWxELFFBQVE7UUFDSixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1QixJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssVUFBVSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxDQUFDO2FBQ2hDO2lCQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7YUFDL0I7aUJBQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLGVBQWUsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLENBQUMsQ0FBQzthQUNwQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO2dCQUN4QyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDO2FBQy9CO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNqSSxDQUFDO0lBRUQsYUFBYSxDQUFDLFdBQVc7UUFDckIsSUFBSSxXQUFXLEtBQUssVUFBVSxFQUFFO1lBQzVCLE9BQU8sZUFBZSxDQUFDO1NBQzFCO2FBQU0sSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE9BQU8sWUFBWSxDQUFDO1NBQ3ZCO2FBQU0sSUFBSSxXQUFXLEtBQUssZUFBZSxFQUFFO1lBQ3hDLE9BQU8sZUFBZSxDQUFDO1NBQzFCO2FBQU0sSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE9BQU8sY0FBYyxDQUFDO1NBQ3pCO0lBQ0wsQ0FBQzs7O1lBckhKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0E0RVQ7YUFDSjs7O1lBakZRLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIENvcHlyaWdodCAyMDEzLTIwMjAgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzIGZyb20gdGhlIEpIaXBzdGVyIHByb2plY3QuXG5cbiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSkhpcHN0ZXIgcHJvamVjdCwgc2VlIGh0dHBzOi8vd3d3LmpoaXBzdGVyLnRlY2gvXG4gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdqaGktdGhyZWFkLW1vZGFsJyxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGpoaVRyYW5zbGF0ZT1cIm1ldHJpY3MuanZtLnRocmVhZHMuZHVtcC50aXRsZVwiPlRocmVhZHMgZHVtcDwvaDQ+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgKGNsaWNrKT1cImFjdGl2ZU1vZGFsLmRpc21pc3MoJ2Nsb3NlZCcpXCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtcHJpbWFyeVwiIChjbGljayk9XCJ0aHJlYWREdW1wRmlsdGVyID0ge31cIj5cbiAgICAgICAgICAgICAgICBBbGwmbmJzcDs8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLXBpbGwgYmFkZ2UtZGVmYXVsdFwiPnt7IHRocmVhZER1bXBBbGwgfX08L3NwYW4+IDwvc3BhblxuICAgICAgICAgICAgPiZuYnNwO1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1zdWNjZXNzXCIgKGNsaWNrKT1cInRocmVhZER1bXBGaWx0ZXIgPSB7IHRocmVhZFN0YXRlOiAnUlVOTkFCTEUnIH1cIj5cbiAgICAgICAgICAgICAgICBSdW5uYWJsZSZuYnNwOzxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtcGlsbCBiYWRnZS1kZWZhdWx0XCI+e3sgdGhyZWFkRHVtcFJ1bm5hYmxlIH19PC9zcGFuPiA8L3NwYW5cbiAgICAgICAgICAgID4mbmJzcDtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtaW5mb1wiIChjbGljayk9XCJ0aHJlYWREdW1wRmlsdGVyID0geyB0aHJlYWRTdGF0ZTogJ1dBSVRJTkcnIH1cIlxuICAgICAgICAgICAgICAgID5XYWl0aW5nJm5ic3A7PHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1waWxsIGJhZGdlLWRlZmF1bHRcIj57eyB0aHJlYWREdW1wV2FpdGluZyB9fTwvc3Bhbj48L3NwYW5cbiAgICAgICAgICAgID4mbmJzcDtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2Utd2FybmluZ1wiIChjbGljayk9XCJ0aHJlYWREdW1wRmlsdGVyID0geyB0aHJlYWRTdGF0ZTogJ1RJTUVEX1dBSVRJTkcnIH1cIj5cbiAgICAgICAgICAgICAgICBUaW1lZCBXYWl0aW5nJm5ic3A7PHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1waWxsIGJhZGdlLWRlZmF1bHRcIj57eyB0aHJlYWREdW1wVGltZWRXYWl0aW5nIH19PC9zcGFuPiA8L3NwYW5cbiAgICAgICAgICAgID4mbmJzcDtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtZGFuZ2VyXCIgKGNsaWNrKT1cInRocmVhZER1bXBGaWx0ZXIgPSB7IHRocmVhZFN0YXRlOiAnQkxPQ0tFRCcgfVwiXG4gICAgICAgICAgICAgICAgPkJsb2NrZWQmbmJzcDs8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLXBpbGwgYmFkZ2UtZGVmYXVsdFwiPnt7IHRocmVhZER1bXBCbG9ja2VkIH19PC9zcGFuPjwvc3BhblxuICAgICAgICAgICAgPiZuYnNwO1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIj4mbmJzcDs8L2Rpdj5cbiAgICAgICAgICAgIEZpbHRlclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJ0aHJlYWREdW1wRmlsdGVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZFwiICpuZ0Zvcj1cImxldCBlbnRyeSBvZiAodGhyZWFkRHVtcCB8IHB1cmVGaWx0ZXI6IHRocmVhZER1bXBGaWx0ZXI6J2xvY2tOYW1lJyB8IGtleXMpXCI+XG4gICAgICAgICAgICAgICAgPGg2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlXCIgW25nQ2xhc3NdPVwiZ2V0QmFkZ2VDbGFzcyhlbnRyeS52YWx1ZS50aHJlYWRTdGF0ZSlcIj57eyBlbnRyeS52YWx1ZS50aHJlYWRTdGF0ZSB9fTwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+Jm5ic3A7e3sgZW50cnkudmFsdWUudGhyZWFkTmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAoSURcbiAgICAgICAgICAgICAgICAgICAge3sgZW50cnkudmFsdWUudGhyZWFkSWQgfX0pXG4gICAgICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJlbnRyeS5zaG93ID0gIWVudHJ5LnNob3dcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCJlbnRyeS5zaG93XCIgamhpVHJhbnNsYXRlPVwibWV0cmljcy5qdm0udGhyZWFkcy5kdW1wLnNob3dcIj5TaG93IFN0YWNrVHJhY2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cIiFlbnRyeS5zaG93XCIgamhpVHJhbnNsYXRlPVwibWV0cmljcy5qdm0udGhyZWFkcy5kdW1wLmhpZGVcIj5IaWRlIFN0YWNrVHJhY2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8L2g2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCIgW2hpZGRlbl09XCIhZW50cnkuc2hvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdCBvZiAoZW50cnkudmFsdWUuc3RhY2tUcmFjZSB8IGtleXMpXCIgY2xhc3M9XCJicmVha1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzYW1wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID57eyBzdC52YWx1ZS5jbGFzc05hbWUgfX0ue3sgc3QudmFsdWUubWV0aG9kTmFtZSB9fSg8Y29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7IHN0LnZhbHVlLmZpbGVOYW1lIH19Ont7IHN0LnZhbHVlLmxpbmVOdW1iZXIgfX08L2NvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPik8L3NhbXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdC0xXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXNtIHRhYmxlLXJlc3BvbnNpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBqaGlUcmFuc2xhdGU9XCJtZXRyaWNzLmp2bS50aHJlYWRzLmR1bXAuYmxvY2tlZHRpbWVcIj5CbG9ja2VkIFRpbWU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBqaGlUcmFuc2xhdGU9XCJtZXRyaWNzLmp2bS50aHJlYWRzLmR1bXAuYmxvY2tlZGNvdW50XCI+QmxvY2tlZCBDb3VudDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGpoaVRyYW5zbGF0ZT1cIm1ldHJpY3MuanZtLnRocmVhZHMuZHVtcC53YWl0ZWR0aW1lXCI+V2FpdGVkIFRpbWU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBqaGlUcmFuc2xhdGU9XCJtZXRyaWNzLmp2bS50aHJlYWRzLmR1bXAud2FpdGVkY291bnRcIj5XYWl0ZWQgQ291bnQ8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBqaGlUcmFuc2xhdGU9XCJtZXRyaWNzLmp2bS50aHJlYWRzLmR1bXAubG9ja25hbWVcIj5Mb2NrIE5hbWU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBlbnRyeS52YWx1ZS5ibG9ja2VkVGltZSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IGVudHJ5LnZhbHVlLmJsb2NrZWRDb3VudCB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IGVudHJ5LnZhbHVlLndhaXRlZFRpbWUgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBlbnRyeS52YWx1ZS53YWl0ZWRDb3VudCB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGhyZWFkLWR1bXAtbW9kYWwtbG9ja1wiIHRpdGxlPVwie3sgZW50cnkudmFsdWUubG9ja05hbWUgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+e3sgZW50cnkudmFsdWUubG9ja05hbWUgfX08L2NvZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBmbG9hdC1sZWZ0XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiAoY2xpY2spPVwiYWN0aXZlTW9kYWwuZGlzbWlzcygnY2xvc2VkJylcIj5cbiAgICAgICAgICAgICAgICBEb25lXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgYFxufSlcbmV4cG9ydCBjbGFzcyBKaGlUaHJlYWRNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgdGhyZWFkRHVtcEZpbHRlcjogYW55O1xuICAgIHRocmVhZER1bXA6IGFueTtcbiAgICB0aHJlYWREdW1wQWxsID0gMDtcbiAgICB0aHJlYWREdW1wQmxvY2tlZCA9IDA7XG4gICAgdGhyZWFkRHVtcFJ1bm5hYmxlID0gMDtcbiAgICB0aHJlYWREdW1wVGltZWRXYWl0aW5nID0gMDtcbiAgICB0aHJlYWREdW1wV2FpdGluZyA9IDA7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsKSB7fVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMudGhyZWFkRHVtcC5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS50aHJlYWRTdGF0ZSA9PT0gJ1JVTk5BQkxFJykge1xuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkRHVtcFJ1bm5hYmxlICs9IDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnRocmVhZFN0YXRlID09PSAnV0FJVElORycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZER1bXBXYWl0aW5nICs9IDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnRocmVhZFN0YXRlID09PSAnVElNRURfV0FJVElORycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZER1bXBUaW1lZFdhaXRpbmcgKz0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUudGhyZWFkU3RhdGUgPT09ICdCTE9DS0VEJykge1xuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkRHVtcEJsb2NrZWQgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50aHJlYWREdW1wQWxsID0gdGhpcy50aHJlYWREdW1wUnVubmFibGUgKyB0aGlzLnRocmVhZER1bXBXYWl0aW5nICsgdGhpcy50aHJlYWREdW1wVGltZWRXYWl0aW5nICsgdGhpcy50aHJlYWREdW1wQmxvY2tlZDtcbiAgICB9XG5cbiAgICBnZXRCYWRnZUNsYXNzKHRocmVhZFN0YXRlKSB7XG4gICAgICAgIGlmICh0aHJlYWRTdGF0ZSA9PT0gJ1JVTk5BQkxFJykge1xuICAgICAgICAgICAgcmV0dXJuICdiYWRnZS1zdWNjZXNzJztcbiAgICAgICAgfSBlbHNlIGlmICh0aHJlYWRTdGF0ZSA9PT0gJ1dBSVRJTkcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2JhZGdlLWluZm8nO1xuICAgICAgICB9IGVsc2UgaWYgKHRocmVhZFN0YXRlID09PSAnVElNRURfV0FJVElORycpIHtcbiAgICAgICAgICAgIHJldHVybiAnYmFkZ2Utd2FybmluZyc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhyZWFkU3RhdGUgPT09ICdCTE9DS0VEJykge1xuICAgICAgICAgICAgcmV0dXJuICdiYWRnZS1kYW5nZXInO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19