rallly/public/build/app.js
2015-02-02 23:34:44 +01:00

3 lines
No EOL
127 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

angular.module("rallly",["ui.router","ngResource","btford.modal","ngTagsInput","ngAnimate"]).config(["$stateProvider","$urlRouterProvider","$locationProvider",function(e,t,n){n.html5Mode(!0),t.otherwise("/notfound"),e.state("index",{url:"/",templateUrl:"templates/home.html",controller:"HomeCtrl"}).state("newevent",{url:"/new",templateUrl:"templates/newEvent/layout.html",controller:"NewEventCtrl"}).state("newevent.general",{templateUrl:"templates/newEvent/general.html"}).state("newevent.datetime",{templateUrl:"templates/newEvent/datetime.html"}).state("newevent.invite",{templateUrl:"templates/newEvent/invite.html"}).state("newevent.success",{templateUrl:"templates/newEvent/success.html"}).state("about",{url:"/about",templateUrl:"templates/about.html",controller:"AboutCtrl"}).state("notfound",{url:"/notfound",templateUrl:"templates/notfound.html"}).state("event",{url:"/:id",templateUrl:"templates/event.html",controller:"EventCtrl"}).state("editevent",{url:"/:id/edit",templateUrl:"templates/editevent.html",controller:"EditEventCtrl"}).state("verifyevent",{url:"/verify/:id/code/:code",controller:"VerificationCtrl"}).state("deleteevent",{url:"/delete/:id/code/:code",controller:"DeletionCtrl"})}]).factory("Event",["$resource",function(e){return e("/api/event/:id",{id:"@_id"},{update:{method:"PUT"},verify:{method:"GET",url:"/api/event/:id/code/:code"},destroy:{method:"DELETE",url:"/api/event/:id/code/:code"}})}]).factory("Participant",["$resource",function(e){return e("/api/event/:id/participant/:pid",{id:"@_id"},{update:{method:"PUT"}})}]).factory("Comment",["$resource",function(e){return e("/api/event/:id/comment/:cid",{id:"@_id"},{update:{method:"PUT"}})}]).factory("Title",function(){return{set:function(e){document.title=e}}}),angular.module("rallly").run(["$templateCache",function(e){e.put("templates/about.html",'<div style="max-width:600px">\n <h1>What is Rallly?</h1>\n <div class="rl-page-desc">Rallly is a collaborative scheduling service that makes deciding on a date fast and easy.</div>\n <h2>Hi, I\'m Luke!</h2>\n <p>\n I created Rallly as side project to help me learn some new technologies. I decided to publish it because I thought other people might find it useful. Rallly is a completely free service. In fact it is even open source. You can look at the latest source code on Github.\n </p>\n</div>\n'),e.put("templates/confirmmodal.html",'<div class="rl-modal-overlay" ng-click="modal.cancel()"></div>\n\n<div class="rl-modal">\n <div class="rl-modal-title">{{modal.title}}</div>\n <div class="rl-modal-message">\n {{modal.message}}\n </div>\n <div class="rl-modal-actions">\n <button type="button" ng-click="modal.confirm()" ng-show="modal.confirm" class="btn" ng-class="{danger : modal.isDestructive}">{{modal.confirmText}}</button>\n <button type="button" ng-click="modal.cancel()" class="btn">{{modal.cancelText}}</button>\n </div>\n</div>\n'),e.put("templates/editevent.html",'<div ng-show="event._id">\n <div class="box">\n\n <div class="box-title">Edit Event</div>\n <div class="box-description">\n You can makes changes to your existing event by changing the fields in the form below.\n </div>\n\n <form novalidate name="form" ng-submit="submit()">\n\n <section class="box-section" user-form form="form" event="event">\n\n </section>\n\n <section class="box-section" event-form form="form" event="event">\n\n </section>\n <section class="box-section" date-form form="form" event="event">\n\n </section>\n\n <section class="box-section" settings-form form="form" event="event">\n\n </section>\n\n <div class="box-controls box-bottom-sticky">\n <button type="submit" ng-show="didChange()" class="btn btn-primary" ng-class="{disabled : !didChange()}">\n Save Changes\n </button>\n <button type="button" ng-click="undoChanges()" class="btn" ng-show="didChange()">Undo Changes</button>\n <a href="/{{event._id}}" class="btn" ng-hide="didChange()">Done</a>\n </div>\n\n </form>\n\n </div>\n\n</div>\n'),e.put("templates/event.html",'<div ng-show="event._id && !event.isDeleted">\n <div class="box ">\n <div class="event-header">\n <div class="details">\n <div class="title">\n {{event.title}}\n <span class="title-label danger" ng-show="event.isClosed">Poll Closed</span>\n <span class="title-label success" ng-hide="event.isClosed">Poll Open</span>\n </div>\n <div class="subtitle">\n Created by <a href="mailto:{{event.creator.email}}">{{event.creator.name}}</a> &bull; {{event.created | elapsed}}\n </div>\n </div>\n <div class="actions">\n <button class="btn" ng-click="editEvent()">Edit Event</button>\n </div>\n </div>\n <div class="box-side-sticky event-description" ng-show="event.description">{{event.description}}</div>\n <div class="box-bottom-sticky event-location" ng-show="event.location">\n <img src="/images/location.png" width="18" /><a href="http://google.com/maps?q={{event.location}}" target="_blank">{{event.location}}</a>\n </div>\n\n </div>\n <div class="box box-x-scroll">\n <div poll event="event" class="poll">\n </div>\n </div>\n\n <div class="box" ng-hide="event.comments.length == 0 && event.isClosed">\n <div class="box-title">\n Discussion\n </div>\n <div class="box-description">\n You can discuss the event with your friends by leaving a comment below.\n </div>\n <div discussion event="event">\n\n </div>\n </div>\n</div>\n'),e.put("templates/home.html",'<div class="page-placeholder">\n <div class="image">\n <img src="/images/mark_large.png" width="67" />\n </div>\n <div class="title">\n Schedule an Event\n </div>\n <div class="content">\n Want to host an event but cant decide on a date? Click on the button below to start!\n </div>\n <button ng-click="newEvent()" class="btn">Schedule New Event</button>\n</div>\n'),e.put("templates/newevent.html",'<div ng-if="!eventUrl">\n <div class="box" ng-class="{\'animated shake\': form.$submitted && form.$invalid }">\n\n <div class="box-title">Schedule a New Event</div>\n <div class="box-description">\n Fill in the form below to create your event and share it with your friends and colleagues.\n </div>\n\n <form novalidate autocomplete="off" name="form" ng-submit="submit()">\n <div ng-if="page == 1">\n\n <section class="box-section" user-form form="form" event="event">\n\n </section>\n\n <section class="box-section" event-form form="form" event="event">\n\n </section>\n </div>\n <div ng-if="page==2">\n\n <section class="box-section" date-form form="form" event="event">\n\n </section>\n\n <section class="box-section" ng-show="event.dates.length" time-form form="form" event="event">\n\n </section>\n </div>\n\n <div ng-if="page==3">\n\n <section class="box-section" participants-form form="form" event="event">\n\n </section>\n\n </div>\n\n\n <div class="box-controls box-bottom-sticky">\n <button type="button" ng-if="page!=1" class="btn" ng-click="prevPage()">Back</button>\n <button type="button" ng-if="page!=3" class="btn" ng-click="nextPage()">Next</button>\n <button type="submit" ng-if="page==3" class="btn btn-primary">Create Event</button>\n </div>\n\n </form>\n </div>\n\n</div>\n<div ng-if="eventUrl" class="box">\n <div class="box-message">\n <div class="main-image">\n <img src="/images/success_large.png" width="100" />\n </div>\n <div class="title">Event Created</div>\n <div class="content">\n Your event has been created successfully! You should receive an email shortly with instructions to verify your email address.\n </div>\n <div class="mini-divider">\n </div>\n <div class="form-group">\n <input type="text" class="form-control" disabled="true" value="{{eventUrl}}" />\n <a href="{{eventUrl}}" class="btn form-btn">GO</a>\n </div>\n </div>\n</div>\n'),e.put("templates/notfound.html","<h1>Error 404</h1>\n<h2>Not Found</h2>\n"),e.put("templates/notification.html",'<div class="notification {{notification.type}}" ng-click="notification.close()">\n <div class="title">\n {{notification.title}}\n </div>\n <div class="message">\n {{notification.message}}\n </div>\n</div>\n'),e.put("templates/directives/discussion.html",'<ul class="comment-thread" ng-show="event.comments.length">\n <li ng-repeat="comment in event.comments" class="comment">\n <div class="avatar-section">\n <img src="/images/avatar.png" />\n </div>\n <div class="comment-section">\n <a href="#" class="comment-delete" ng-click="deleteComment(comment)">&times;</a>\n <div class="meta">\n <span class="name">{{comment.author.name}}</span>\n <span class="time">{{comment.created | elapsed}}</span>\n </div>\n <div class="content">{{comment.content}}</div>\n </div>\n </li>\n</ul>\n<form novalidate ng-submit="postComment()" name="commentForm" class="comment-form">\n <div class="avatar-section">\n <img src="/images/avatar.png" />\n </div>\n <div class="input-section form-group">\n <div class="content-section">\n <textarea class="form-control" required ng-model="comment.content" placeholder="Write a comment..."></textarea>\n </div>\n <div class="name-section">\n <div class="name-container">\n <input type="text" class="form-control" required placeholder="Your Name" ng-model="comment.author.name" />\n <button type="submit" class="btn">Post Comment</button>\n <span class="form-error" ng-show="commentForm.$submitted && commentForm.$error">\n <img src="/images/error.png" width="14" /> Make sure you fill in all the fields.\n </span>\n </div>\n </div>\n </div>\n</form>\n'),e.put("templates/directives/poll.html",'<div class="poll-header">\n <div class="header participants-header">\n {{event.participants.length}} participants\n </div>\n <div class="header date-header" ng-repeat="d in event.dates">\n <div class="daticon">\n <div class="dow">\n {{d.date | date: \'EEE\'}}\n </div>\n <div class="day">\n {{d.date | date: \'d\'}}\n </div>\n <div class="month">\n {{d.date | date : \'MMM\'}}\n </div>\n <span class="count" ng-show="selectedDate($index)" ng-class={top:isTopDate($index)}>{{selectedDate($index)}}</span>\n </div>\n </div>\n <div class="header actions-header">\n\n </div>\n</div>\n<div class="poll-body">\n <div class="poll-entry" ng-repeat="participant in event.participants">\n <form novalidate ng-submit="update(participant); editMode = false">\n <div class="cell name-cell">\n <span class="avatar style-{{$index + 1}}">\n <img src="/images/user.png" width="11" />\n </span>\n <input required autocomplete="off" type="text" class="form-control" ng-model="participant.name" ng-show="editMode" value="participant.name"/>\n <span ng-hide="editMode" class="name editable" ng-click="editMode = true && !event.isClosed; edit(participant)">{{participant.name}}</span>\n </div>\n <div class="cell vote-cell" ng-repeat="date in event.dates">\n <img src="/images/tick@2x.png" width="16" ng-hide="editMode" ng-if="participant.dates[$index]" />\n <img src="/images/nope@2x.png" width="8" ng-hide="editMode" ng-if="!participant.dates[$index]" />\n <input ng-model="participant.dates[$index]" ng-show="editMode" ng-false-value="false" type="checkbox" />\n <div class="overlay" ng-show="editMode" ng-click="participant.dates[$index] = !participant.dates[$index]"></div>\n </div>\n <div class="cell action-cell" ng-hide="event.isClosed">\n <button type="button" ng-hide="editMode" ng-click="editMode = true; edit(participant)" class="btn hover">Edit</button>\n <button type="button" ng-hide="editMode" ng-click="delete(participant)" class="btn danger hover">Delete</button>\n <button type="submit" ng-show="editMode" class="btn">Save</button>\n <button type="button" ng-show="editMode" ng-click="editMode = false; cancel($index)" class="btn">Cancel</button>\n </div>\n </form>\n </div>\n <div class="poll-example" ng-class="{hidden : event.participants.length > 0}">\n <div class="poll-entry" ng-repeat="example in examples">\n <div class="cell name-cell">\n <span class="avatar style-{{$index + 1}}">\n <img src="/images/user.png" width="11" />\n </span>\n <span class="name">{{example.name}}</span>\n </div>\n <div class="cell vote-cell" ng-repeat="date in event.dates">\n <img src="/images/tick@2x.png" width="16" ng-if="example.dates[$index]" />\n <img src="/images/nope@2x.png" width="8" ng-if="!example.dates[$index]" />\n </div>\n <div class="cell action-cell">\n\n </div>\n </div>\n <div class="overlay">\n <div class="overlay-text">\n Fill in the form below to get started\n </div>\n </div>\n </div>\n <div ng-hide="event.isClosed" class="poll-entry highlight">\n <form novalidate name="formnew" ng-submit="save()">\n <div class="cell name-cell">\n <span class="avatar style-{{participant.style}}">\n <img src="/images/user.png" width="11" />\n </span>\n <input autocomplete="off" name="username" type="text" class="form-control" placeholder="Your name..." ng-model="participant.name" required value="participant.name"/>\n </div>\n <div class="cell vote-cell" ng-repeat="date in event.dates">\n <input ng-model="participant.dates[$index]" ng-false-value="false" type="checkbox" />\n <div class="overlay" ng-click="participant.dates[$index] = !participant.dates[$index]"></div>\n </div>\n <div class="cell action-cell">\n <button type="submit" ng-class="{ \'animated shake\' : formnew.$submitted && formnew.$invalid }" class="btn">Save</button>\n </div>\n </form>\n </div>\n</div>\n'),e.put("templates/directives/timePicker.html",'<div class="time-picker">\n <div class="time-picker-col">\n <div class="daticon">\n <div class="dow">\n {{date | date: \'EEE\'}}\n </div>\n <div class="day">\n {{date | date: \'d\'}}\n </div>\n <div class="month">\n {{date | date : \'MMM\'}}\n </div>\n <!-- <span class="delete" ng-click="datepicker.unsetDate(date)"></span> -->\n </div>\n </div>\n <div class="time-picker-col" ng-repeat="time in date.times track by $index">\n <input type="text" class="time-picker-input" time-picker ng-model="time" ng-model-options="{ updateOn: \'blur\' }" />\n </div>\n</div>\n'),e.put("templates/form/dateForm.html",'<div class="section-details">\n <div class="section-title">Choose Dates</div>\n <ul class="daticon-list">\n <li ng-repeat="d in event.dates">\n <div class="daticon">\n <div class="dow">\n {{d.date | date: \'EEE\'}}\n </div>\n <div class="day">\n {{d.date | date: \'d\'}}\n </div>\n <div class="month">\n {{d.date | date : \'MMM\'}}\n </div>\n <span class="delete" ng-click="datepicker.unsetDate(d.date)"></span>\n </div>\n </li>\n </ul>\n</div>\n<div class="section-main">\n <div class="form-row">\n <div class="form-group">\n <label for="email">Calendar</label>\n <span class="form-error" ng-show="form.$submitted && form.datepicker.$error.required">\n <img src="/images/error.png" width="14" /> You need to select a few dates\n </span>\n <div datepicker required name="datepicker" control="datepicker" ng-model="event.dates">\n\n </div>\n </div>\n </div>\n</div>\n'),e.put("templates/form/eventForm.html",'<div class="section-details">\n <div class="section-title">Event Details</div>\n</div>\n<div class="section-main">\n <div class="form-row">\n <div class="form-col">\n <div class="form-group">\n <label for="title">Title</label>\n <span class="form-error" ng-show="(form.title.$touched || form.$submitted) && errors.title">\n <img src="/images/error.png" width="14" /> {{errors.title}}\n </span>\n <input id="title" name="title" ng-maxlength="30" required ng-model="event.title" type="text" placeholder="Monthly Meetup..." class="form-control extend"/>\n </div>\n </div>\n <div class="form-col">\n <div class="form-group optional">\n <label for="location">Location</label>\n <span class="form-error" ng-show="(form.location.$touched || form.$submitted) && errors.location">\n <img src="/images/error.png" width="14" /> {{errors.location}}\n </span>\n <input id="location" name="location" ng-model="event.location" ng-maxlength="50" type="text" placeholder="Rick\'s Cafe..." class="form-control extend"/>\n </div>\n </div>\n </div>\n <div class="form-row">\n <div class="form-group optional">\n <label for="description" >Description</label>\n <textarea id="description" name="description" ng-model="event.description" placeholder="Enter Description..." class="form-control extend"></textarea>\n </div>\n </div>\n</div>\n'),e.put("templates/form/participantsForm.html",'<div class="section-details">\n <div class="section-title">Invite Participants</div>\n</div>\n<div class="section-main">\n <div class="form-row">\n <div class="form-group optional">\n <label>Participant\'s Emails</label>\n <tags-input max-length="50" allowed-tags-pattern="{{emailRegex}}" display-property="email" ng-model="event.emails" placeholder="Add an Email" type="email" autocomplete="off"></tags-input>\n <input type="hidden" name="shouldCreate" value="true" />\n\n </div>\n </div>\n</div>\n</section>\n'),e.put("templates/form/settingsForm.html",'<div class="section-details">\n <div class="section-title">Settings</div>\n</div>\n<div class="section-main">\n <div class="switch-row">\n <div class="switch-details">\n <div class="title">\n Poll Status\n </div>\n <div class="description">\n Let people vote on the poll.\n </div>\n </div>\n <div class="switch">\n <div class="switch-value">\n {{event.isClosed ? \'Closed\' : \'Open\' }}\n </div>\n <div switch-toggle ng-model="event.isClosed" invert>\n </div>\n </div>\n </div>\n <div class="switch-row">\n <div class="switch-details">\n <div class="title">\n Notifications\n </div>\n <div class="description">\n Send email notifications to the creator of this event.\n </div>\n </div>\n <div class="switch">\n <div class="switch-value">\n {{event.creator.allowNotifications ? \'Enabled\' : \'Disabled\' }}\n </div>\n <div switch-toggle ng-model="event.creator.allowNotifications">\n </div>\n </div>\n </div>\n <div class="switch-row">\n <div class="switch-details">\n <div class="title">\n Delete Event\n </div>\n <div class="description">\n Once you delete an event it will no longer be accessible.\n </div>\n </div>\n <div class="switch">\n <button type="button" ng-click="deleteEvent()" class="btn" ng-class="{danger : !deleteRequestSent, disabled : deleteRequestSent}">{{deleteRequestSent ? \'Request Sent\' : \'Delete Event\' }}</button>\n </div>\n </div>\n</div>\n</section>\n'),e.put("templates/form/timeForm.html",'<div class="section-details">\n <div class="section-title">Choose Times</div>\n</div>\n<div class="section-main">\n <table class="time-form">\n <thead>\n <tr>\n <th>\n\n </th>\n <th>\n Time 1\n </th>\n <th>\n Time 2\n </th>\n <th>\n Time 3\n </th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="d in event.dates">\n <td>\n <div class="daticon">\n <div class="dow">\n {{d.date | date: \'EEE\'}}\n </div>\n <div class="day">\n {{d.date | date: \'d\'}}\n </div>\n <div class="month">\n {{d.date | date : \'MMM\'}}\n </div>\n <span class="delete" ng-click="unsetDate(d.date)"></span>\n </div>\n </td>\n <td ng-repeat="time in [1,2,3] track by $index">\n <input type="text" time-picker ng-model-options="{ updateOn: \'blur\' }" ng-model="d.times[$index]" class="time-picker-input" />\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n'),e.put("templates/form/userForm.html",'<div class="section-details">\n <div class="section-title">Your Details</div>\n</div>\n<div class="section-main">\n <div class="form-row">\n <div class="form-col">\n <div class="form-group">\n <label for="name">Name</label>\n <span class="form-error" ng-show="(form.name.$touched || form.$submitted) && errors.name">\n <img src="/images/error.png" width="14" /> {{errors.name}}\n </span>\n <input id="name" name="name" ng-maxlength="30" required ng-model="event.creator.name" type="text" placeholder="John Doe..." class="form-control extend"/>\n </div>\n </div>\n <div class="form-col">\n <div class="form-group">\n <label for="email">Email</label>\n <span class="form-error" ng-show="(form.email.$touched || form.$submitted) && errors.email">\n <img src="/images/error.png" width="14" /> {{errors.email}}\n </span>\n <input type="email" id="email" name="email" ng-pattern="emailRegex" required ng-model="event.creator.email" placeholder="john.doe@email.com..." class="form-control extend"/>\n </div>\n </div>\n </div>\n</div>\n'),e.put("templates/newEvent/datetime.html",'<section class="box-section" date-form form="form" event="event">\n\n</section>\n\n<div class="box-controls box-bottom-sticky">\n <button type="button" class="btn" ng-click="prevPage()">Previous</button>\n <button type="submit" class="btn">Next</button>\n</div>\n'),e.put("templates/newEvent/general.html",'<section class="box-section" user-form form="form" event="event">\n\n</section>\n\n<section class="box-section" event-form form="form" event="event">\n\n</section>\n\n<div class="box-controls box-bottom-sticky">\n <button type="submit" class="btn">Next Step</button>\n</div>\n'),e.put("templates/newEvent/invite.html",'<section class="box-section" participants-form form="form" event="event">\n\n</section>\n\n<div class="box-controls box-bottom-sticky">\n <button type="button" class="btn" ng-click="prevPage()">Previous</button>\n <button type="submit" class="btn">Create</button>\n</div>\n'),e.put("templates/newEvent/layout.html",'<div class="box">\n\n <div class="box-title">Schedule a New Event</div>\n <div class="box-description">\n Fill in the form below to create your event and share it with your friends and colleagues.\n </div>\n <ol class="box-steps">\n <li class="step active">\n General Details\n </li>\n <li class="step" ng-class="{ active : page > 1 }">\n Dates &amp; Times\n </li>\n <li class="step" ng-class="{ active : page > 2 }">\n Invites\n </li>\n <li class="step" ng-class="{ active : page > 3 }">\n Done\n </li>\n </ol>\n <form novalidate autocomplete="off" name="form" ng-submit="submit()">\n <div ui-view>\n\n </div>\n </form>\n</div>\n'),e.put("templates/newEvent/success.html",'<div class="box-message">\n <div class="main-image">\n <img src="/images/success_large.png" width="100" />\n </div>\n <div class="title">Event Created</div>\n <div class="content">\n Your event has been created successfully! You should receive an email shortly with instructions to verify your email address.\n </div>\n <div class="mini-divider">\n </div>\n <div class="form-group">\n <input type="text" class="form-control" disabled="true" value="{{eventUrl}}" />\n <a href="{{eventUrl}}" class="btn form-btn">GO</a>\n </div>\n</div>\n')}]),angular.module("rallly").controller("AboutCtrl",["Title",function(e){e.set("About Rallly")}]),angular.module("rallly").controller("AccountCtrl",["$scope","ConfirmModal",function(e){e.showNotice=function(){}}]),angular.module("rallly").controller("DeletionCtrl",["$state","Notification","Event",function(e,t,n){n.destroy({id:e.params.id,code:e.params.code},function(){new t({title:"Event deleted",message:"This event has been deleted",type:"success",timeout:5e3})},function(){new t({title:"Deletion Failed",message:"The event could not be deleted. Make sure that it exists and that the url is correct",type:"error"})}),e.go("event",{id:e.params.id})}]),angular.module("rallly").controller("EditEventCtrl",["$scope","$http","$state","$timeout","Event","ConfirmModal","Notification","Title",function(e,t,n,i,a,o,s,l){var r=n.params.id;e.event=a.get({id:r},function(){l.set("Edit: "+e.event.title),e.master=angular.copy(e.event)},function(){n.go("notfound")}),e.undoChanges=function(){e.event=angular.copy(e.master)},e.didChange=function(){return JSON.stringify(e.master)!=JSON.stringify(e.event)},e.didChangeDates=function(){return JSON.stringify(e.master.dates)!=JSON.stringify(e.event.dates)},e.submit=function(){if(e.form.$valid)if(e.didChangeDates()){new o({title:"Hold up!",message:"Changing the dates will reset all entries by the participants. Are you sure you want to do that?",confirmText:"Yes, I'm sure",isDestructive:!0,confirm:function(){e.event.participants=[],c()}})}else c();else{new s({title:"Not so fast",message:"Make sure you fill in all the required fields and try again.",type:"error"})}};var c=function(){a.update({id:r},e.event,function(){new s({title:"Changes Saved",message:"Your changes have been saved successfully.",type:"success"});e.master=angular.copy(e.event)})}}]),angular.module("rallly").controller("EventCtrl",["$scope","$http","$state","Title","Event","ConfirmModal",function(e,t,n,i,a,o){var s=n.params.id;e.event=a.get({id:s},function(){i.set(e.event.title),e.eventUrl=n.href("event",{id:e.event._id},{absolute:!0})},function(){n.go("notfound")}),e.openEvent=function(){e.event.isClosed=!1,a.update({id:s},e.event,function(){new o({title:"Event Open",message:"People can vote and comment on this event.",cancelText:"OK"})})},e.closeEvent=function(){e.event.isClosed=!0,a.update({id:s},e.event,function(){new o({title:"Event Closed",message:"People can no longer vote or comment on this event.",cancelText:"OK"})})},e.editEvent=function(){n.go("editevent",{id:e.event._id})}}]),angular.module("rallly").controller("HomeCtrl",["$scope","$state","Title",function(e,t,n){n.set("Rallly - Collaborative Scheduling"),e.newEvent=function(){t.go("newevent")}}]),angular.module("rallly").controller("NavigationCtrl",["$scope","$location",function(e,t){e.isActive=function(e){return t.path()==e?!0:!1}}]),angular.module("rallly").controller("NewEventCtrl",["$scope","$http","$state","Event","ConfirmModal","Notification",function(e,t,n,i,a){e.title="Schedule a New Event",e.description="Fill in the form below to create your event and share it with your friends and colleagues.",e.event={};var o=["newevent.general","newevent.datetime","newevent.invite"];e.page=1;var s=function(t){e.page=t,n.go(o[t-1])};s(e.page),e.submit=function(){e.form.$valid&&e.page==o.length?t.post("/api/event",e.event).success(function(t){e.event=t,e.eventUrl=n.href("event",{id:e.event._id},{absolute:!0}),e.page++,n.go("newevent.success")}).error(function(){new a({title:"Uh oh!",message:"There was an error creating your event. Please try again later.",cancelText:"OK"})}):e.form.$valid&&(e.form.$setPristine(),e.nextPage())},e.nextPage=function(){s(e.page+1)},e.prevPage=function(){s(e.page-1)}}]),angular.module("rallly").controller("VerificationCtrl",["Event","Notification","$state",function(e,t,n){e.verify({id:n.params.id,code:n.params.code},function(){new t({title:"Email Verified",message:"Your email has been verified. You will now be able to receive email notifications for this event",type:"success",timeout:5e3})},function(){new t({title:"Verification Failed",message:"Your verification code has expired.",type:"error"})}),n.go("event",{id:n.params.id})}]),angular.module("rallly").directive("backImg",function(){return function(e,t,n){var i=n.backImg;t.css({"background-image":"url(/images/"+i+".png)"})}}),angular.module("rallly").directive("datepicker",["DatePickerService",function(e){return{restrict:"A",require:"ngModel",scope:{model:"=ngModel",control:"="},link:function(t,n,i,a){var o=new e(t.model),s=o.getDatesArray();angular.element(n).datepicker({multidate:!0,todayHighlight:!0}).on("changeDate",function(e){var t=e.dates;if(t.length>s.length){var n=t[t.length-1];o.addDate(n)}else{var i=o.diffDates(s,t);i&&o.removeDate(i)}a.$setViewValue(o.getDates()),s=t}),t.control=t.control||{},t.$watchCollection("model",function(){var e=angular.element(n).datepicker("getDates"),t=o.getDatesArray();e.length!=t.length&&angular.element(n).datepicker("setDates",t)}),t.control.unsetDate=function(e){o.removeDate(e)},a.$validators.required=function(e){return e&&0!=e.length?!0:!1}}}}]).service("DatePickerService",function(){return function(e){var t=e||[];this.addDate=function(e){t.push({date:e}),t.sort(function(e,t){return Date.compare(e.date,t.date)>0?!0:!1})},this.removeDate=function(e){for(var n=0;n<t.length;n++)Date.equals(t[n].date,e)&&t.splice(n,1)
},this.getDates=function(){return t.length>0?t:null},this.getDatesArray=function(){for(var e=[],n=0;n<t.length;n++)e.push(t[n].date);return e},this.diffDates=function(e,t){for(var n=!0,i=0;i<e.length;i++){n=!0;for(var a=0;a<t.length;a++)Date.equals(e[i],t[a])&&(n=!1);if(n)return e[i]}}}}),angular.module("rallly").directive("discussion",["$timeout","Comment","ConfirmModal",function(e,t,n){return{restrict:"A",templateUrl:"templates/directives/discussion.html",scope:{event:"="},link:function(i){i.comment={};var a=angular.element(".comment-thread");e(function(){a.scrollTop(a.prop("scrollHeight"))}),i.deleteComment=function(e){new n({title:"Are you sure?",message:"Are you sure you want to remove this comment?",confirmText:"Yes - delete",cancelText:"No - nevermind",isDestructive:!0,confirm:function(){t.remove({id:i.event._id,cid:e._id},function(e){i.event=e})}})},i.postComment=function(){if(i.commentForm.$valid){var e=new t(i.comment);e.$save({id:i.event._id},function(e){i.event=e,i.comment={}}),i.commentForm.$setPristine()}}}}}]),angular.module("rallly").directive("dropdown",["$document",function(e){return{restrict:"A",link:function(t,n){n.addClass("dropdown"),t.open=!1;var i=function(e){var i=n.find(e.target).length>0;i||t.toggle()};t.toggle=function(){t.open=!t.open,t.open?(n.addClass("open"),e.bind("click",i)):(n.removeClass("open"),e.unbind("click",i))}}}}]),angular.module("rallly").service("FormHelper",function(){this.emailRegexString="^([\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4})?$",this.emailRegex=new RegExp(this.emailRegexString),this.prettyError=function(e,t){return e.required?t+" is required":e.pattern?t+" is invalid":e.maxlength?t+" is too long":!1}}).directive("userForm",["FormHelper",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/form/userForm.html",link:function(t){t.errors={},t.emailRegex=e.emailRegex,t.$watchCollection("form.name.$error",function(n){t.errors.name=e.prettyError(n,"Name")}),t.$watchCollection("form.email.$error",function(n){t.errors.email=e.prettyError(n,"Email")})}}}]).directive("eventForm",["FormHelper",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/form/eventForm.html",link:function(t){t.errors={},t.$watchCollection("form.title.$error",function(n){t.errors.title=e.prettyError(n,"Title")}),t.$watchCollection("form.location.$error",function(n){t.errors.location=e.prettyError(n,"Location")})}}}]).directive("dateForm",function(){return{scope:{event:"=",form:"="},templateUrl:"templates/form/dateForm.html"}}).directive("participantsForm",["FormHelper",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/form/participantsForm.html",link:function(t){t.emailRegex=e.emailRegexString}}}]).directive("settingsForm",["Event","ConfirmModal",function(e,t){return{scope:{event:"=",form:"="},templateUrl:"templates/form/settingsForm.html",link:function(n){n.deleteEvent=function(){n.deleteRequestSent||e.delete({id:n.event._id},function(){n.deleteRequestSent=!0;new t({title:"Delete Request Sent",message:"An email has been sent to the creator of this event with instructions to delete it.",cancelText:"OK"})})}}}}]).directive("switchToggle",function(){return{scope:{model:"=ngModel"},require:"ngModel",link:function(e,t,n,i){t.addClass("switch-toggle");var a=function(){e.model^"undefined"!=typeof n.invert?t.addClass("active"):t.removeClass("active")};e.$watch("model",a),t.bind("click",function(t){e.model=!e.model,i.$setViewValue(e.model,t)})}}}).directive("timeForm",["DatePickerService",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/form/timeForm.html",link:function(t){var n,i=!1,a=t.$watch("event.dates",function(o){o&&!i&&a(),i=!0,n=new e(t.event.dates),t.unsetDate=function(e){n.removeDate(e)}})}}}]).directive("timePicker",["$timeout",function(){return{scope:{model:"=ngModel"},require:"ngModel",link:function(e,t,n,i){i.$viewChangeListeners.push(function(){e.model=i.$modelValue}),i.$parsers.push(function(e){return e?Date.parse(e):void 0}),i.$validators.time=function(e){if(i.$isEmpty(e))return!0;var t=Date.parse(e);return t?(i.$setViewValue(t.toString("hh:mm tt")),i.$render(),!0):!1}}}}]),angular.module("rallly").directive("poll",["$timeout","Participant","ConfirmModal",function(e,t,n){return{restrict:"A",templateUrl:"templates/directives/poll.html",scope:{event:"="},link:function(e){e.defaults=[],e.participant={};var i=[];e.event.$promise.then(function(t){for(var n=["John Example","Jane Specimen","Mark Instance","Mary Case"],i=[],a=0;a<n.length;a++){var o={name:n[a]};o.dates=[];for(var s=0;s<t.dates.length;s++){var l=Math.random()<.5;o.dates[s]=l}i.push(o)}e.examples=i}),e.delete=function(i){new n({title:"Delete "+i.name+"?",message:"Are you sure you want to remove "+i.name+" from the poll?",confirmText:"Yes - delete",cancelText:"No - nevermind",isDestructive:!0,confirm:function(){t.remove({id:e.event._id,pid:i._id},function(t){e.event=t})}})},e.isTopDate=function(e){for(var t=i[e],n=0;n<i.length;n++)if(i[n]>t)return!1;return!0},e.selectedDate=function(t){i[t]=0;for(var n=0;n<e.event.participants.length;n++)e.event.participants[n].dates[t]&&i[t]++;return i[t]},e.update=function(n){t.update({id:e.event._id,pid:n._id},n)},e.edit=function(t){e.defaults[e.event.participants.indexOf(t)]=angular.copy(t)},e.cancel=function(t){e.event.participants[t]=e.defaults[t]},e.save=function(){if(e.formnew.$valid){var n=new t(e.participant);n.$save({id:e.event._id},function(t){e.event=t,e.participant={}}),e.formnew.$setPristine()}}}}}]),angular.module("rallly").filter("elapsed",["$filter",function(e){return function(t){if(t){var n=Date.parse(t),i=(new Date).getTime(),a=i-n,o=Math.floor(a/1e3),s=Math.floor(o/60),l=Math.floor(s/60),r=Math.floor(l/24);return r>30?"on "+e("date")(t,"MMMM d"):r>1?r+" days ago":1==r?"1 day ago":l>1?l+" hours ago":1==l?"an hour ago":s>1?s+" minutes ago":1==s?"a minute ago":"a few seconds ago"}}}]),angular.module("rallly").factory("ConfirmModal",["btfModal",function(e){return function(t){var n;n=e({templateUrl:"templates/confirmmodal.html",controllerAs:"modal",controller:function(){this.title=t.title,this.message=t.message,this.confirm=t.confirm?function(){t.confirm(),n.deactivate()}:!1,this.cancel=n.deactivate,this.confirmText=t.confirmText||"Confirm",this.cancelText=t.cancelText||"Cancel",this.isDestructive=t.isDestructive}}),n.activate(),this.destroy=function(){n.deactivate()}}}]),angular.module("rallly").factory("Notification",["$timeout","btfModal",function(e,t){return function(n){var i;i=t({templateUrl:"templates/notification.html",controllerAs:"notification",controller:function(){this.title=n.title,this.message=n.message,this.close=i.deactivate,this.type=n.type;var t=n.timeout||5e3;e(i.deactivate,t)}}),i.activate(),this.destroy=function(){i.deactivate()}}}]);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1haW4uanMiLCJ0ZW1wbGF0ZXMuanMiLCJjb250cm9sbGVycy9hYm91dC5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvYWNjb3VudC5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvZGVsZXRpb24uY29udHJvbGxlci5qcyIsImNvbnRyb2xsZXJzL2VkaXRldmVudC5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvZXZlbnQuY29udHJvbGxlci5qcyIsImNvbnRyb2xsZXJzL2hvbWUuY29udHJvbGxlci5qcyIsImNvbnRyb2xsZXJzL25hdmlnYXRpb24uY29udHJvbGxlci5qcyIsImNvbnRyb2xsZXJzL25ld2V2ZW50LmNvbnRyb2xsZXIuanMiLCJjb250cm9sbGVycy92ZXJpZmljYXRpb24uY29udHJvbGxlci5qcyIsImRpcmVjdGl2ZXMvYmFja0ltZy5kaXJlY3RpdmUuanMiLCJkaXJlY3RpdmVzL2RhdGVwaWNrZXIuZGlyZWN0aXZlLmpzIiwiZGlyZWN0aXZlcy9kaXNjdXNzaW9uLmRpcmVjdGl2ZS5qcyIsImRpcmVjdGl2ZXMvZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwiZGlyZWN0aXZlcy9mb3JtLmRpcmVjdGl2ZS5qcyIsImRpcmVjdGl2ZXMvcG9sbC5kaXJlY3RpdmUuanMiLCJmaWx0ZXJzL2VsYXBzZWQuZmlsdGVyLmpzIiwic2VydmljZXMvbW9kYWwuc2VydmljZS5qcyIsInNlcnZpY2VzL25vdGlmaWNhdGlvbi5zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQUEsT0FBQSxVQUFBLFlBQUEsYUFBQSxlQUFBLGNBQUEsY0FDQSxRQUFBLGlCQUFBLHFCQUFBLG9CQUFBLFNBQUEsRUFBQSxFQUFBLEdBQ0EsRUFBQSxXQUFBLEdBQ0EsRUFBQSxVQUFBLGFBQ0EsRUFDQSxNQUFBLFNBQ0EsSUFBQSxJQUNBLFlBQUEsc0JBQ0EsV0FBQSxhQUVBLE1BQUEsWUFDQSxJQUFBLE9BQ0EsWUFBQSxpQ0FDQSxXQUFBLGlCQUVBLE1BQUEsb0JBQ0EsWUFBQSxvQ0FFQSxNQUFBLHFCQUNBLFlBQUEscUNBRUEsTUFBQSxtQkFDQSxZQUFBLG1DQUVBLE1BQUEsb0JBQ0EsWUFBQSxvQ0FFQSxNQUFBLFNBQ0EsSUFBQSxTQUNBLFlBQUEsdUJBQ0EsV0FBQSxjQUVBLE1BQUEsWUFDQSxJQUFBLFlBQ0EsWUFBQSw0QkFFQSxNQUFBLFNBQ0EsSUFBQSxPQUNBLFlBQUEsdUJBQ0EsV0FBQSxjQUVBLE1BQUEsYUFDQSxJQUFBLFlBQ0EsWUFBQSwyQkFDQSxXQUFBLGtCQUVBLE1BQUEsZUFDQSxJQUFBLHlCQUNBLFdBQUEscUJBRUEsTUFBQSxlQUNBLElBQUEseUJBQ0EsV0FBQSxvQkFHQSxRQUFBLFNBQUEsWUFBQSxTQUFBLEdBQ0EsTUFBQSxHQUFBLGtCQUFBLEdBQUEsU0FDQSxRQUFBLE9BQUEsT0FDQSxRQUFBLE9BQUEsTUFBQSxJQUFBLDZCQUNBLFNBQUEsT0FBQSxTQUFBLElBQUEsa0NBR0EsUUFBQSxlQUFBLFlBQUEsU0FBQSxHQUNBLE1BQUEsR0FBQSxtQ0FBQSxHQUFBLFNBQ0EsUUFBQSxPQUFBLFlBR0EsUUFBQSxXQUFBLFlBQUEsU0FBQSxHQUNBLE1BQUEsR0FBQSwrQkFBQSxHQUFBLFNBQ0EsUUFBQSxPQUFBLFlBR0EsUUFBQSxRQUFBLFdBQ0EsT0FDQSxJQUFBLFNBQUEsR0FDQSxTQUFBLE1BQUEsTUMzRUEsUUFBQSxPQUFBLFVBQUEsS0FBQSxpQkFBQSxTQUFBLEdBQUEsRUFBQSxJQUFBLHVCQUFBLDhnQkFDQSxFQUFBLElBQUEsOEJBQUEsbWlCQUNBLEVBQUEsSUFBQSwyQkFBQSxpdkNBQ0EsRUFBQSxJQUFBLHVCQUFBLGlvREFDQSxFQUFBLElBQUEsc0JBQUEsMlpBQ0EsRUFBQSxJQUFBLDBCQUFBLHF2RUFDQSxFQUFBLElBQUEsMEJBQUEsNENBQ0EsRUFBQSxJQUFBLDhCQUFBLDRPQUNBLEVBQUEsSUFBQSx1Q0FBQSxra0RBQ0EsRUFBQSxJQUFBLGlDQUFBLCtpSkFDQSxFQUFBLElBQUEsdUNBQUEsbXRCQUNBLEVBQUEsSUFBQSwrQkFBQSwrb0NBQ0EsRUFBQSxJQUFBLGdDQUFBLGtrREFDQSxFQUFBLElBQUEsdUNBQUEsMmpCQUNBLEVBQUEsSUFBQSxtQ0FBQSxvekRBQ0EsRUFBQSxJQUFBLCtCQUFBLHM2Q0FDQSxFQUFBLElBQUEsK0JBQUEsdXZDQUNBLEVBQUEsSUFBQSxtQ0FBQSxpUkFDQSxFQUFBLElBQUEsa0NBQUEsMlJBQ0EsRUFBQSxJQUFBLGlDQUFBLDJSQUNBLEVBQUEsSUFBQSxpQ0FBQSx3d0JBQ0EsRUFBQSxJQUFBLGtDQUFBLHNsQkNyQkEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxhQUFBLFFBQUEsU0FBQSxHQUNBLEVBQUEsSUFBQSxtQkNGQSxRQUFBLE9BQUEsVUFDQSxXQUFBLGVBQUEsU0FBQSxlQUFBLFNBQUEsR0FDQSxFQUFBLFdBQUEsZ0JDRkEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxnQkFBQSxTQUFBLGVBQUEsUUFBQSxTQUFBLEVBQUEsRUFBQSxHQUNBLEVBQUEsU0FBQSxHQUFBLEVBQUEsT0FBQSxHQUFBLEtBQUEsRUFBQSxPQUFBLE1BQUEsV0FDQSxHQUFBLElBQ0EsTUFBQSxnQkFDQSxRQUFBLDhCQUNBLEtBQUEsVUFDQSxRQUFBLE9BRUEsV0FDQSxHQUFBLElBQ0EsTUFBQSxrQkFDQSxRQUFBLHVGQUNBLEtBQUEsWUFHQSxFQUFBLEdBQUEsU0FBQSxHQUFBLEVBQUEsT0FBQSxRQ2hCQSxRQUFBLE9BQUEsVUFDQSxXQUFBLGlCQUFBLFNBQUEsUUFBQSxTQUFBLFdBQUEsUUFBQSxlQUFBLGVBQUEsUUFBQSxTQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsR0FDQSxHQUFBLEdBQUEsRUFBQSxPQUFBLEVBQ0EsR0FBQSxNQUFBLEVBQUEsS0FBQSxHQUFBLEdBQUEsV0FDQSxFQUFBLElBQUEsU0FBQSxFQUFBLE1BQUEsT0FDQSxFQUFBLE9BQUEsUUFBQSxLQUFBLEVBQUEsUUFDQSxXQUNBLEVBQUEsR0FBQSxjQUVBLEVBQUEsWUFBQSxXQUNBLEVBQUEsTUFBQSxRQUFBLEtBQUEsRUFBQSxTQUVBLEVBQUEsVUFBQSxXQUNBLE1BQUEsTUFBQSxVQUFBLEVBQUEsU0FBQSxLQUFBLFVBQUEsRUFBQSxRQUVBLEVBQUEsZUFBQSxXQUNBLE1BQUEsTUFBQSxVQUFBLEVBQUEsT0FBQSxRQUFBLEtBQUEsVUFBQSxFQUFBLE1BQUEsUUFFQSxFQUFBLE9BQUEsV0FDQSxHQUFBLEVBQUEsS0FBQSxPQUNBLEdBQUEsRUFBQSxpQkFDQSxDQUFBLEdBQUEsSUFDQSxNQUFBLFdBQ0EsUUFBQSxtR0FDQSxZQUFBLGdCQUNBLGVBQUEsRUFDQSxRQUFBLFdBQ0EsRUFBQSxNQUFBLGdCQUNBLFdBS0EsU0FHQSxDQUFBLEdBQUEsSUFDQSxNQUFBLGNBQ0EsUUFBQSwrREFDQSxLQUFBLFdBSUEsSUFBQSxHQUFBLFdBQ0EsRUFBQSxRQUNBLEdBQUEsR0FDQSxFQUFBLE1BQ0EsV0FDQSxHQUFBLElBQ0EsTUFBQSxnQkFDQSxRQUFBLDZDQUNBLEtBQUEsV0FFQSxHQUFBLE9BQUEsUUFBQSxLQUFBLEVBQUEsYUNyREEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxhQUFBLFNBQUEsUUFBQSxTQUFBLFFBQUEsUUFBQSxlQUFBLFNBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQ0EsR0FBQSxHQUFBLEVBQUEsT0FBQSxFQUVBLEdBQUEsTUFBQSxFQUFBLEtBQUEsR0FBQSxHQUFBLFdBRUEsRUFBQSxJQUFBLEVBQUEsTUFBQSxPQUVBLEVBQUEsU0FBQSxFQUFBLEtBQUEsU0FDQSxHQUFBLEVBQUEsTUFBQSxNQUVBLFVBQUEsS0FFQSxXQUNBLEVBQUEsR0FBQSxjQUdBLEVBQUEsVUFBQSxXQUNBLEVBQUEsTUFBQSxVQUFBLEVBQ0EsRUFBQSxRQUNBLEdBQUEsR0FDQSxFQUFBLE1BQ0EsV0FDQSxHQUFBLElBQ0EsTUFBQSxhQUNBLFFBQUEsNkNBQ0EsV0FBQSxVQUtBLEVBQUEsV0FBQSxXQUNBLEVBQUEsTUFBQSxVQUFBLEVBQ0EsRUFBQSxRQUNBLEdBQUEsR0FDQSxFQUFBLE1BQ0EsV0FDQSxHQUFBLElBQ0EsTUFBQSxlQUNBLFFBQUEsc0RBQ0EsV0FBQSxVQUtBLEVBQUEsVUFBQSxXQUNBLEVBQUEsR0FBQSxhQUFBLEdBQUEsRUFBQSxNQUFBLFVDOUNBLFFBQUEsT0FBQSxVQUNBLFdBQUEsWUFBQSxTQUFBLFNBQUEsUUFBQSxTQUFBLEVBQUEsRUFBQSxHQUNBLEVBQUEsSUFBQSxxQ0FFQSxFQUFBLFNBQUEsV0FDQSxFQUFBLEdBQUEsZ0JDTEEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxrQkFBQSxTQUFBLFlBQUEsU0FBQSxFQUFBLEdBQ0EsRUFBQSxTQUFBLFNBQUEsR0FDQSxNQUFBLEdBQUEsUUFBQSxHQUNBLEdBRUEsTUNOQSxRQUFBLE9BQUEsVUFDQSxXQUFBLGdCQUFBLFNBQUEsUUFBQSxTQUFBLFFBQUEsZUFBQSxlQUFBLFNBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxHQUVBLEVBQUEsTUFBQSx1QkFDQSxFQUFBLFlBQUEsNkZBQ0EsRUFBQSxRQUVBLElBQUEsSUFDQSxtQkFDQSxvQkFDQSxrQkFHQSxHQUFBLEtBQUEsQ0FFQSxJQUFBLEdBQUEsU0FBQSxHQUNBLEVBQUEsS0FBQSxFQUNBLEVBQUEsR0FBQSxFQUFBLEVBQUEsSUFHQSxHQUFBLEVBQUEsTUFHQSxFQUFBLE9BQUEsV0FDQSxFQUFBLEtBQUEsUUFBQSxFQUFBLE1BQUEsRUFBQSxPQUNBLEVBQUEsS0FBQSxhQUFBLEVBQUEsT0FDQSxRQUFBLFNBQUEsR0FDQSxFQUFBLE1BQUEsRUFDQSxFQUFBLFNBQUEsRUFBQSxLQUFBLFNBQ0EsR0FBQSxFQUFBLE1BQUEsTUFFQSxVQUFBLElBRUEsRUFBQSxPQUNBLEVBQUEsR0FBQSxzQkFFQSxNQUFBLFdBQ0EsR0FBQSxJQUNBLE1BQUEsU0FDQSxRQUFBLGtFQUNBLFdBQUEsU0FHQSxFQUFBLEtBQUEsU0FDQSxFQUFBLEtBQUEsZUFDQSxFQUFBLGFBSUEsRUFBQSxTQUFBLFdBQ0EsRUFBQSxFQUFBLEtBQUEsSUFHQSxFQUFBLFNBQUEsV0FDQSxFQUFBLEVBQUEsS0FBQSxPQ3REQSxRQUFBLE9BQUEsVUFDQSxXQUFBLG9CQUFBLFFBQUEsZUFBQSxTQUFBLFNBQUEsRUFBQSxFQUFBLEdBQ0EsRUFBQSxRQUFBLEdBQUEsRUFBQSxPQUFBLEdBQUEsS0FBQSxFQUFBLE9BQUEsTUFBQSxXQUNBLEdBQUEsSUFDQSxNQUFBLGlCQUNBLFFBQUEsbUdBQ0EsS0FBQSxVQUNBLFFBQUEsT0FFQSxXQUNBLEdBQUEsSUFDQSxNQUFBLHNCQUNBLFFBQUEsc0NBQ0EsS0FBQSxZQUdBLEVBQUEsR0FBQSxTQUFBLEdBQUEsRUFBQSxPQUFBLFFDaEJBLFFBQUEsT0FBQSxVQUNBLFVBQUEsVUFBQSxXQUNBLE1BQUEsVUFBQSxFQUFBLEVBQUEsR0FDQSxHQUFBLEdBQUEsRUFBQSxPQUNBLEdBQUEsS0FDQSxtQkFBQSxlQUFBLEVBQUEsYUNMQSxRQUFBLE9BQUEsVUFDQSxVQUFBLGNBQUEsb0JBQUEsU0FBQSxHQUNBLE9BQ0EsU0FBQSxJQUNBLFFBQUEsVUFDQSxPQUNBLE1BQUEsV0FDQSxRQUFBLEtBRUEsS0FBQSxTQUFBLEVBQUEsRUFBQSxFQUFBLEdBQ0EsR0FBQSxHQUFBLEdBQUEsR0FBQSxFQUFBLE9BQ0EsRUFBQSxFQUFBLGVBRUEsU0FBQSxRQUFBLEdBQUEsWUFDQSxXQUFBLEVBQ0EsZ0JBQUEsSUFFQSxHQUFBLGFBQUEsU0FBQSxHQUNBLEdBQUEsR0FBQSxFQUFBLEtBQ0EsSUFBQSxFQUFBLE9BQUEsRUFBQSxPQUFBLENBQ0EsR0FBQSxHQUFBLEVBQUEsRUFBQSxPQUFBLEVBQ0EsR0FBQSxRQUFBLE9BQ0EsQ0FDQSxHQUFBLEdBQUEsRUFBQSxVQUFBLEVBQUEsRUFDQSxJQUNBLEVBQUEsV0FBQSxHQUVBLEVBQUEsY0FBQSxFQUFBLFlBQ0EsRUFBQSxJQUVBLEVBQUEsUUFBQSxFQUFBLFlBQ0EsRUFBQSxpQkFBQSxRQUFBLFdBQ0EsR0FBQSxHQUFBLFFBQUEsUUFBQSxHQUFBLFdBQUEsWUFDQSxFQUFBLEVBQUEsZUFDQSxHQUFBLFFBQUEsRUFBQSxRQUNBLFFBQUEsUUFBQSxHQUFBLFdBQUEsV0FBQSxLQUdBLEVBQUEsUUFBQSxVQUFBLFNBQUEsR0FDQSxFQUFBLFdBQUEsSUFHQSxFQUFBLFlBQUEsU0FBQSxTQUFBLEdBQ0EsTUFBQSxJQUFBLEdBQUEsRUFBQSxRQUdBLEdBRkEsUUFRQSxRQUFBLG9CQUFBLFdBQ0EsTUFBQSxVQUFBLEdBRUEsR0FBQSxHQUFBLEtBRUEsTUFBQSxRQUFBLFNBQUEsR0FDQSxFQUFBLE1BQUEsS0FBQSxJQUNBLEVBQUEsS0FBQSxTQUFBLEVBQUEsR0FDQSxNQUFBLE1BQUEsUUFBQSxFQUFBLEtBQUEsRUFBQSxNQUFBLEdBQUEsR0FDQSxLQUdBLEtBQUEsV0FBQSxTQUFBLEdBQ0EsSUFBQSxHQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsT0FBQSxJQUNBLEtBQUEsT0FBQSxFQUFBLEdBQUEsS0FBQSxJQUNBLEVBQUEsT0FBQSxFQUFBO0VBSUEsS0FBQSxTQUFBLFdBQ0EsTUFBQSxHQUFBLE9BQUEsRUFBQSxFQUFBLE1BRUEsS0FBQSxjQUFBLFdBRUEsSUFBQSxHQURBLE1BQ0EsRUFBQSxFQUFBLEVBQUEsRUFBQSxPQUFBLElBQ0EsRUFBQSxLQUFBLEVBQUEsR0FBQSxLQUVBLE9BQUEsSUFFQSxLQUFBLFVBQUEsU0FBQSxFQUFBLEdBRUEsSUFBQSxHQURBLElBQUEsRUFDQSxFQUFBLEVBQUEsRUFBQSxFQUFBLE9BQUEsSUFBQSxDQUNBLEdBQUEsQ0FDQSxLQUFBLEdBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxPQUFBLElBQ0EsS0FBQSxPQUFBLEVBQUEsR0FBQSxFQUFBLE1BQ0EsR0FBQSxFQUdBLElBQUEsRUFBQSxNQUFBLEdBQUEsUUMxRkEsUUFBQSxPQUFBLFVBQ0EsVUFBQSxjQUFBLFdBQUEsVUFBQSxlQUFBLFNBQUEsRUFBQSxFQUFBLEdBQ0EsT0FDQSxTQUFBLElBQ0EsWUFBQSx1Q0FDQSxPQUNBLE1BQUEsS0FFQSxLQUFBLFNBQUEsR0FDQSxFQUFBLFVBQ0EsSUFBQSxHQUFBLFFBQUEsUUFBQSxrQkFDQSxHQUFBLFdBQ0EsRUFBQSxVQUFBLEVBQUEsS0FBQSxtQkFFQSxFQUFBLGNBQUEsU0FBQSxHQUNBLEdBQUEsSUFDQSxNQUFBLGdCQUNBLFFBQUEsZ0RBQ0EsWUFBQSxlQUNBLFdBQUEsaUJBQ0EsZUFBQSxFQUNBLFFBQUEsV0FDQSxFQUFBLFFBQUEsR0FBQSxFQUFBLE1BQUEsSUFBQSxJQUFBLEVBQUEsS0FBQSxTQUFBLEdBQ0EsRUFBQSxNQUFBLFFBS0EsRUFBQSxZQUFBLFdBQ0EsR0FBQSxFQUFBLFlBQUEsT0FBQSxDQUNBLEdBQUEsR0FBQSxHQUFBLEdBQUEsRUFBQSxRQUNBLEdBQUEsT0FBQSxHQUFBLEVBQUEsTUFBQSxLQUFBLFNBQUEsR0FDQSxFQUFBLE1BQUEsRUFDQSxFQUFBLGFBRUEsRUFBQSxZQUFBLHNCQ25DQSxRQUFBLE9BQUEsVUFDQSxVQUFBLFlBQUEsWUFBQSxTQUFBLEdBQ0EsT0FDQSxTQUFBLElBQ0EsS0FBQSxTQUFBLEVBQUEsR0FDQSxFQUFBLFNBQUEsWUFDQSxFQUFBLE1BQUEsQ0FFQSxJQUFBLEdBQUEsU0FBQSxHQUNBLEdBQUEsR0FBQSxFQUFBLEtBQUEsRUFBQSxRQUFBLE9BQUEsQ0FDQSxJQUNBLEVBQUEsU0FHQSxHQUFBLE9BQUEsV0FDQSxFQUFBLE1BQUEsRUFBQSxLQUNBLEVBQUEsTUFDQSxFQUFBLFNBQUEsUUFDQSxFQUFBLEtBQUEsUUFBQSxLQUVBLEVBQUEsWUFBQSxRQUNBLEVBQUEsT0FBQSxRQUFBLFVDckJBLFFBQUEsT0FBQSxVQUNBLFFBQUEsYUFBQSxXQUNBLEtBQUEsaUJBQUEsMkNBQ0EsS0FBQSxXQUFBLEdBQUEsUUFBQSxLQUFBLGtCQUNBLEtBQUEsWUFBQSxTQUFBLEVBQUEsR0FDQSxNQUFBLEdBQUEsU0FBQSxFQUFBLGVBQ0EsRUFBQSxRQUFBLEVBQUEsY0FDQSxFQUFBLFVBQUEsRUFBQSxnQkFDQSxLQUdBLFVBQUEsWUFBQSxhQUFBLFNBQUEsR0FDQSxPQUNBLE9BQ0EsTUFBQSxJQUNBLEtBQUEsS0FFQSxZQUFBLCtCQUNBLEtBQUEsU0FBQSxHQUNBLEVBQUEsVUFFQSxFQUFBLFdBQUEsRUFBQSxXQUVBLEVBQUEsaUJBQUEsbUJBQUEsU0FBQSxHQUNBLEVBQUEsT0FBQSxLQUFBLEVBQUEsWUFBQSxFQUFBLFVBR0EsRUFBQSxpQkFBQSxvQkFBQSxTQUFBLEdBQ0EsRUFBQSxPQUFBLE1BQUEsRUFBQSxZQUFBLEVBQUEsZ0JBS0EsVUFBQSxhQUFBLGFBQUEsU0FBQSxHQUNBLE9BQ0EsT0FDQSxNQUFBLElBQ0EsS0FBQSxLQUVBLFlBQUEsZ0NBQ0EsS0FBQSxTQUFBLEdBQ0EsRUFBQSxVQUVBLEVBQUEsaUJBQUEsb0JBQUEsU0FBQSxHQUNBLEVBQUEsT0FBQSxNQUFBLEVBQUEsWUFBQSxFQUFBLFdBR0EsRUFBQSxpQkFBQSx1QkFBQSxTQUFBLEdBQ0EsRUFBQSxPQUFBLFNBQUEsRUFBQSxZQUFBLEVBQUEsbUJBTUEsVUFBQSxXQUFBLFdBQ0EsT0FDQSxPQUNBLE1BQUEsSUFDQSxLQUFBLEtBRUEsWUFBQSxrQ0FHQSxVQUFBLG9CQUFBLGFBQUEsU0FBQSxHQUNBLE9BQ0EsT0FDQSxNQUFBLElBQ0EsS0FBQSxLQUVBLFlBQUEsdUNBQ0EsS0FBQSxTQUFBLEdBQ0EsRUFBQSxXQUFBLEVBQUEsc0JBSUEsVUFBQSxnQkFBQSxRQUFBLGVBQUEsU0FBQSxFQUFBLEdBQ0EsT0FDQSxPQUNBLE1BQUEsSUFDQSxLQUFBLEtBRUEsWUFBQSxtQ0FDQSxLQUFBLFNBQUEsR0FDQSxFQUFBLFlBQUEsV0FDQSxFQUFBLG1CQUNBLEVBQUEsUUFBQSxHQUFBLEVBQUEsTUFBQSxLQUFBLFdBQ0EsRUFBQSxtQkFBQSxDQUNBLElBQUEsSUFDQSxNQUFBLHNCQUNBLFFBQUEsc0ZBQ0EsV0FBQSxlQU9BLFVBQUEsZUFBQSxXQUNBLE9BQ0EsT0FDQSxNQUFBLFlBRUEsUUFBQSxVQUNBLEtBQUEsU0FBQSxFQUFBLEVBQUEsRUFBQSxHQUNBLEVBQUEsU0FBQSxnQkFDQSxJQUFBLEdBQUEsV0FDQSxFQUFBLE1BQUEsbUJBQUEsR0FBQSxPQUNBLEVBQUEsU0FBQSxVQUVBLEVBQUEsWUFBQSxVQUdBLEdBQUEsT0FBQSxRQUFBLEdBQ0EsRUFBQSxLQUFBLFFBQUEsU0FBQSxHQUNBLEVBQUEsT0FBQSxFQUFBLE1BQ0EsRUFBQSxjQUFBLEVBQUEsTUFBQSxTQUtBLFVBQUEsWUFBQSxvQkFBQSxTQUFBLEdBQ0EsT0FDQSxPQUNBLE1BQUEsSUFDQSxLQUFBLEtBRUEsWUFBQSwrQkFDQSxLQUFBLFNBQUEsR0FDQSxHQUNBLEdBREEsR0FBQSxFQUVBLEVBQUEsRUFBQSxPQUFBLGNBQUEsU0FBQSxHQUNBLElBQUEsR0FDQSxJQUVBLEdBQUEsRUFDQSxFQUFBLEdBQUEsR0FBQSxFQUFBLE1BQUEsT0FDQSxFQUFBLFVBQUEsU0FBQSxHQUNBLEVBQUEsV0FBQSxXQU1BLFVBQUEsY0FBQSxXQUFBLFdBQ0EsT0FDQSxPQUNBLE1BQUEsWUFFQSxRQUFBLFVBQ0EsS0FBQSxTQUFBLEVBQUEsRUFBQSxFQUFBLEdBQ0EsRUFBQSxxQkFBQSxLQUFBLFdBQ0EsRUFBQSxNQUFBLEVBQUEsY0FHQSxFQUFBLFNBQUEsS0FBQSxTQUFBLEdBQ0EsTUFBQSxHQUNBLEtBQUEsTUFBQSxHQURBLFNBSUEsRUFBQSxZQUFBLEtBQUEsU0FBQSxHQUNBLEdBQUEsRUFBQSxTQUFBLEdBQUEsT0FBQSxDQUNBLElBQUEsR0FBQSxLQUFBLE1BQUEsRUFDQSxPQUFBLElBQ0EsRUFBQSxjQUFBLEVBQUEsU0FBQSxhQUNBLEVBQUEsV0FDQSxJQUVBLFFDdktBLFFBQUEsT0FBQSxVQUNBLFVBQUEsUUFBQSxXQUFBLGNBQUEsZUFBQSxTQUFBLEVBQUEsRUFBQSxHQUNBLE9BQ0EsU0FBQSxJQUNBLFlBQUEsaUNBQ0EsT0FDQSxNQUFBLEtBRUEsS0FBQSxTQUFBLEdBQ0EsRUFBQSxZQUNBLEVBQUEsY0FDQSxJQUFBLEtBRUEsR0FBQSxNQUFBLFNBQUEsS0FBQSxTQUFBLEdBR0EsSUFBQSxHQUZBLElBQUEsZUFBQSxnQkFBQSxnQkFBQSxhQUNBLEtBQ0EsRUFBQSxFQUFBLEVBQUEsRUFBQSxPQUFBLElBQUEsQ0FDQSxHQUFBLElBQUEsS0FBQSxFQUFBLEdBQ0EsR0FBQSxRQUNBLEtBQUEsR0FBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLE1BQUEsT0FBQSxJQUFBLENBQ0EsR0FBQSxHQUFBLEtBQUEsU0FBQSxFQUNBLEdBQUEsTUFBQSxHQUFBLEVBRUEsRUFBQSxLQUFBLEdBRUEsRUFBQSxTQUFBLElBRUEsRUFBQSxPQUFBLFNBQUEsR0FDQSxHQUFBLElBQ0EsTUFBQSxVQUFBLEVBQUEsS0FBQSxJQUNBLFFBQUEsbUNBQUEsRUFBQSxLQUFBLGtCQUNBLFlBQUEsZUFDQSxXQUFBLGlCQUNBLGVBQUEsRUFDQSxRQUFBLFdBQ0EsRUFBQSxRQUFBLEdBQUEsRUFBQSxNQUFBLElBQUEsSUFBQSxFQUFBLEtBQUEsU0FBQSxHQUNBLEVBQUEsTUFBQSxRQUtBLEVBQUEsVUFBQSxTQUFBLEdBRUEsSUFBQSxHQURBLEdBQUEsRUFBQSxHQUNBLEVBQUEsRUFBQSxFQUFBLEVBQUEsT0FBQSxJQUNBLEdBQUEsRUFBQSxHQUFBLEVBQUEsT0FBQSxDQUVBLFFBQUEsR0FFQSxFQUFBLGFBQUEsU0FBQSxHQUNBLEVBQUEsR0FBQSxDQUNBLEtBQUEsR0FBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLE1BQUEsYUFBQSxPQUFBLElBQ0EsRUFBQSxNQUFBLGFBQUEsR0FBQSxNQUFBLElBQUEsRUFBQSxJQUVBLE9BQUEsR0FBQSxJQUVBLEVBQUEsT0FBQSxTQUFBLEdBQ0EsRUFBQSxRQUNBLEdBQUEsRUFBQSxNQUFBLElBQ0EsSUFBQSxFQUFBLEtBQ0EsSUFFQSxFQUFBLEtBQUEsU0FBQSxHQUNBLEVBQUEsU0FBQSxFQUFBLE1BQUEsYUFBQSxRQUFBLElBQUEsUUFBQSxLQUFBLElBRUEsRUFBQSxPQUFBLFNBQUEsR0FDQSxFQUFBLE1BQUEsYUFBQSxHQUFBLEVBQUEsU0FBQSxJQUVBLEVBQUEsS0FBQSxXQUNBLEdBQUEsRUFBQSxRQUFBLE9BQUEsQ0FDQSxHQUFBLEdBQUEsR0FBQSxHQUFBLEVBQUEsWUFDQSxHQUFBLE9BQUEsR0FBQSxFQUFBLE1BQUEsS0FBQSxTQUFBLEdBQ0EsRUFBQSxNQUFBLEVBQ0EsRUFBQSxpQkFFQSxFQUFBLFFBQUEsc0JDMUVBLFFBQUEsT0FBQSxVQUNBLE9BQUEsV0FBQSxVQUFBLFNBQUEsR0FDQSxNQUFBLFVBQUEsR0FDQSxHQUFBLEVBQUEsQ0FDQSxHQUFBLEdBQUEsS0FBQSxNQUFBLEdBQ0EsR0FBQSxHQUFBLE9BQUEsVUFDQSxFQUFBLEVBQUEsRUFDQSxFQUFBLEtBQUEsTUFBQSxFQUFBLEtBQ0EsRUFBQSxLQUFBLE1BQUEsRUFBQSxJQUNBLEVBQUEsS0FBQSxNQUFBLEVBQUEsSUFDQSxFQUFBLEtBQUEsTUFBQSxFQUFBLEdBQ0EsT0FBQSxHQUFBLEdBQ0EsTUFBQSxFQUFBLFFBQUEsRUFBQSxVQUNBLEVBQUEsRUFDQSxFQUFBLFlBQ0EsR0FBQSxFQUNBLFlBQ0EsRUFBQSxFQUNBLEVBQUEsYUFDQSxHQUFBLEVBQ0EsY0FDQSxFQUFBLEVBQ0EsRUFBQSxlQUNBLEdBQUEsRUFDQSxlQUVBLHlCQzFCQSxRQUFBLE9BQUEsVUFDQSxRQUFBLGdCQUFBLFdBQUEsU0FBQSxHQUVBLE1BQUEsVUFBQSxHQUNBLEdBQUEsRUFDQSxHQUFBLEdBQ0EsWUFBQSw4QkFDQSxhQUFBLFFBQ0EsV0FBQSxXQUNBLEtBQUEsTUFBQSxFQUFBLE1BQ0EsS0FBQSxRQUFBLEVBQUEsUUFDQSxLQUFBLFFBQUEsRUFBQSxRQUFBLFdBQUEsRUFBQSxVQUFBLEVBQUEsZUFBQSxFQUNBLEtBQUEsT0FBQSxFQUFBLFdBQ0EsS0FBQSxZQUFBLEVBQUEsYUFBQSxVQUNBLEtBQUEsV0FBQSxFQUFBLFlBQUEsU0FDQSxLQUFBLGNBQUEsRUFBQSxpQkFHQSxFQUFBLFdBRUEsS0FBQSxRQUFBLFdBQ0EsRUFBQSxrQkNyQkEsUUFBQSxPQUFBLFVBQ0EsUUFBQSxnQkFBQSxXQUFBLFdBQUEsU0FBQSxFQUFBLEdBQ0EsTUFBQSxVQUFBLEdBQ0EsR0FBQSxFQUNBLEdBQUEsR0FDQSxZQUFBLDhCQUNBLGFBQUEsZUFDQSxXQUFBLFdBQ0EsS0FBQSxNQUFBLEVBQUEsTUFDQSxLQUFBLFFBQUEsRUFBQSxRQUNBLEtBQUEsTUFBQSxFQUFBLFdBQ0EsS0FBQSxLQUFBLEVBQUEsSUFDQSxJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQ0EsR0FBQSxFQUFBLFdBQUEsTUFHQSxFQUFBLFdBRUEsS0FBQSxRQUFBLFdBQ0EsRUFBQSIsImZpbGUiOiJwdWJsaWMvYnVpbGQvYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScsIFsndWkucm91dGVyJywnbmdSZXNvdXJjZScsJ2J0Zm9yZC5tb2RhbCcsJ25nVGFnc0lucHV0JywnbmdBbmltYXRlJ10pXG4gICAgLmNvbmZpZyhmdW5jdGlvbigkc3RhdGVQcm92aWRlciwgJHVybFJvdXRlclByb3ZpZGVyLCAkbG9jYXRpb25Qcm92aWRlcil7XG4gICAgICAgICRsb2NhdGlvblByb3ZpZGVyLmh0bWw1TW9kZSh0cnVlKTtcbiAgICAgICAgJHVybFJvdXRlclByb3ZpZGVyLm90aGVyd2lzZShcIi9ub3Rmb3VuZFwiKVxuICAgICAgICAkc3RhdGVQcm92aWRlclxuICAgICAgICAuc3RhdGUoJ2luZGV4Jyx7XG4gICAgICAgICAgICB1cmwgOiAnLycsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvaG9tZS5odG1sJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiAnSG9tZUN0cmwnXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgnbmV3ZXZlbnQnLHtcbiAgICAgICAgICAgIHVybCA6ICcvbmV3JyxcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9uZXdFdmVudC9sYXlvdXQuaHRtbCcsXG4gICAgICAgICAgICBjb250cm9sbGVyIDogJ05ld0V2ZW50Q3RybCcsXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgnbmV3ZXZlbnQuZ2VuZXJhbCcsIHtcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9uZXdFdmVudC9nZW5lcmFsLmh0bWwnXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgnbmV3ZXZlbnQuZGF0ZXRpbWUnLCB7XG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvbmV3RXZlbnQvZGF0ZXRpbWUuaHRtbCdcbiAgICAgICAgfSlcbiAgICAgICAgLnN0YXRlKCduZXdldmVudC5pbnZpdGUnLCB7XG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvbmV3RXZlbnQvaW52aXRlLmh0bWwnXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgnbmV3ZXZlbnQuc3VjY2VzcycsIHtcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9uZXdFdmVudC9zdWNjZXNzLmh0bWwnXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgnYWJvdXQnLCB7XG4gICAgICAgICAgICB1cmwgOiAnL2Fib3V0JyxcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9hYm91dC5odG1sJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiAnQWJvdXRDdHJsJ1xuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ25vdGZvdW5kJywge1xuICAgICAgICAgICAgdXJsIDogJy9ub3Rmb3VuZCcsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvbm90Zm91bmQuaHRtbCdcbiAgICAgICAgfSlcbiAgICAgICAgLnN0YXRlKCdldmVudCcse1xuICAgICAgICAgICAgdXJsIDogJy86aWQnLFxuICAgICAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2V2ZW50Lmh0bWwnLFxuICAgICAgICAgICAgY29udHJvbGxlciA6ICdFdmVudEN0cmwnXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgnZWRpdGV2ZW50Jywge1xuICAgICAgICAgICAgdXJsOiAnLzppZC9lZGl0JyxcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9lZGl0ZXZlbnQuaHRtbCcsXG4gICAgICAgICAgICBjb250cm9sbGVyIDogJ0VkaXRFdmVudEN0cmwnXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgndmVyaWZ5ZXZlbnQnLCB7XG4gICAgICAgICAgICB1cmwgOiAnL3ZlcmlmeS86aWQvY29kZS86Y29kZScsXG4gICAgICAgICAgICBjb250cm9sbGVyIDogJ1ZlcmlmaWNhdGlvbkN0cmwnXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgnZGVsZXRlZXZlbnQnLCB7XG4gICAgICAgICAgICB1cmwgOiAnL2RlbGV0ZS86aWQvY29kZS86Y29kZScsXG4gICAgICAgICAgICBjb250cm9sbGVyIDogJ0RlbGV0aW9uQ3RybCdcbiAgICAgICAgfSlcbiAgICB9KVxuICAgIC5mYWN0b3J5KCdFdmVudCcsIGZ1bmN0aW9uKCRyZXNvdXJjZSl7XG4gICAgICAgIHJldHVybiAkcmVzb3VyY2UoJy9hcGkvZXZlbnQvOmlkJywgeyBpZCA6ICdAX2lkJyB9LCB7XG4gICAgICAgICAgICAndXBkYXRlJyA6IHsgbWV0aG9kIDogJ1BVVCcgfSxcbiAgICAgICAgICAgICd2ZXJpZnknIDogeyBtZXRob2QgOiAnR0VUJywgdXJsIDogJy9hcGkvZXZlbnQvOmlkL2NvZGUvOmNvZGUnIH0sXG4gICAgICAgICAgICAnZGVzdHJveSc6IHsgbWV0aG9kIDogJ0RFTEVURScsIHVybDogJy9hcGkvZXZlbnQvOmlkL2NvZGUvOmNvZGUnIH1cbiAgICAgICAgfSk7XG4gICAgfSlcbiAgICAuZmFjdG9yeSgnUGFydGljaXBhbnQnLCBmdW5jdGlvbigkcmVzb3VyY2Upe1xuICAgICAgICByZXR1cm4gJHJlc291cmNlKCcvYXBpL2V2ZW50LzppZC9wYXJ0aWNpcGFudC86cGlkJywgeyBpZDogJ0BfaWQnfSwge1xuICAgICAgICAgICAgJ3VwZGF0ZScgOiB7IG1ldGhvZCA6ICdQVVQnIH1cbiAgICAgICAgfSk7XG4gICAgfSlcbiAgICAuZmFjdG9yeSgnQ29tbWVudCcsIGZ1bmN0aW9uKCRyZXNvdXJjZSl7XG4gICAgICAgIHJldHVybiAkcmVzb3VyY2UoJy9hcGkvZXZlbnQvOmlkL2NvbW1lbnQvOmNpZCcsIHsgaWQgOiAnQF9pZCcgfSwge1xuICAgICAgICAgICAgJ3VwZGF0ZScgOiB7IG1ldGhvZCA6ICdQVVQnIH1cbiAgICAgICAgfSlcbiAgICB9KVxuICAgIC5mYWN0b3J5KCdUaXRsZScsIGZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZXQgOiBmdW5jdGlvbih0aXRsZSl7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQudGl0bGUgPSB0aXRsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuIiwiYW5ndWxhci5tb2R1bGUoXCJyYWxsbHlcIikucnVuKFtcIiR0ZW1wbGF0ZUNhY2hlXCIsIGZ1bmN0aW9uKCR0ZW1wbGF0ZUNhY2hlKSB7JHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2Fib3V0Lmh0bWxcIixcIjxkaXYgc3R5bGU9XFxcIm1heC13aWR0aDo2MDBweFxcXCI+XFxuICAgIDxoMT5XaGF0IGlzIFJhbGxseT88L2gxPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJybC1wYWdlLWRlc2NcXFwiPlJhbGxseSBpcyBhIGNvbGxhYm9yYXRpdmUgc2NoZWR1bGluZyBzZXJ2aWNlIHRoYXQgbWFrZXMgZGVjaWRpbmcgb24gYSBkYXRlIGZhc3QgYW5kIGVhc3kuPC9kaXY+XFxuICAgIDxoMj5IaSwgSVxcJ20gTHVrZSE8L2gyPlxcbiAgICA8cD5cXG4gICAgICAgIEkgY3JlYXRlZCBSYWxsbHkgYXMgc2lkZSBwcm9qZWN0IHRvIGhlbHAgbWUgbGVhcm4gc29tZSBuZXcgdGVjaG5vbG9naWVzLiBJIGRlY2lkZWQgdG8gcHVibGlzaCBpdCBiZWNhdXNlIEkgdGhvdWdodCBvdGhlciBwZW9wbGUgbWlnaHQgZmluZCBpdCB1c2VmdWwuIFJhbGxseSBpcyBhIGNvbXBsZXRlbHkgZnJlZSBzZXJ2aWNlLiBJbiBmYWN0IGl0IGlzIGV2ZW4gb3BlbiBzb3VyY2UuIFlvdSBjYW4gbG9vayBhdCB0aGUgbGF0ZXN0IHNvdXJjZSBjb2RlIG9uIEdpdGh1Yi5cXG4gICAgPC9wPlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9jb25maXJtbW9kYWwuaHRtbFwiLFwiPGRpdiBjbGFzcz1cXFwicmwtbW9kYWwtb3ZlcmxheVxcXCIgbmctY2xpY2s9XFxcIm1vZGFsLmNhbmNlbCgpXFxcIj48L2Rpdj5cXG5cXG48ZGl2IGNsYXNzPVxcXCJybC1tb2RhbFxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInJsLW1vZGFsLXRpdGxlXFxcIj57e21vZGFsLnRpdGxlfX08L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwicmwtbW9kYWwtbWVzc2FnZVxcXCI+XFxuICAgICAgICB7e21vZGFsLm1lc3NhZ2V9fVxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwicmwtbW9kYWwtYWN0aW9uc1xcXCI+XFxuICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgbmctY2xpY2s9XFxcIm1vZGFsLmNvbmZpcm0oKVxcXCIgbmctc2hvdz1cXFwibW9kYWwuY29uZmlybVxcXCIgY2xhc3M9XFxcImJ0blxcXCIgbmctY2xhc3M9XFxcIntkYW5nZXIgOiBtb2RhbC5pc0Rlc3RydWN0aXZlfVxcXCI+e3ttb2RhbC5jb25maXJtVGV4dH19PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgbmctY2xpY2s9XFxcIm1vZGFsLmNhbmNlbCgpXFxcIiAgY2xhc3M9XFxcImJ0blxcXCI+e3ttb2RhbC5jYW5jZWxUZXh0fX08L2J1dHRvbj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2VkaXRldmVudC5odG1sXCIsXCI8ZGl2IG5nLXNob3c9XFxcImV2ZW50Ll9pZFxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImJveFxcXCI+XFxuXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtdGl0bGVcXFwiPkVkaXQgRXZlbnQ8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1kZXNjcmlwdGlvblxcXCI+XFxuICAgICAgICAgICAgWW91IGNhbiBtYWtlcyBjaGFuZ2VzIHRvIHlvdXIgZXhpc3RpbmcgZXZlbnQgYnkgY2hhbmdpbmcgdGhlIGZpZWxkcyBpbiB0aGUgZm9ybSBiZWxvdy5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPGZvcm0gbm92YWxpZGF0ZSBuYW1lPVxcXCJmb3JtXFxcIiBuZy1zdWJtaXQ9XFxcInN1Ym1pdCgpXFxcIj5cXG5cXG4gICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIHVzZXItZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cXG5cXG4gICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIGV2ZW50LWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG4gICAgICAgICAgICA8L3NlY3Rpb24+XFxuICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XFxcImJveC1zZWN0aW9uXFxcIiBkYXRlLWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG4gICAgICAgICAgICA8L3NlY3Rpb24+XFxuXFxuICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XFxcImJveC1zZWN0aW9uXFxcIiBzZXR0aW5ncy1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuICAgICAgICAgICAgPC9zZWN0aW9uPlxcblxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1jb250cm9scyBib3gtYm90dG9tLXN0aWNreVxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwic3VibWl0XFxcIiBuZy1zaG93PVxcXCJkaWRDaGFuZ2UoKVxcXCIgY2xhc3M9XFxcImJ0biBidG4tcHJpbWFyeVxcXCIgbmctY2xhc3M9XFxcIntkaXNhYmxlZCA6ICFkaWRDaGFuZ2UoKX1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgU2F2ZSBDaGFuZ2VzXFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgbmctY2xpY2s9XFxcInVuZG9DaGFuZ2VzKClcXFwiIGNsYXNzPVxcXCJidG5cXFwiIG5nLXNob3c9XFxcImRpZENoYW5nZSgpXFxcIj5VbmRvIENoYW5nZXM8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cXFwiL3t7ZXZlbnQuX2lkfX1cXFwiIGNsYXNzPVxcXCJidG5cXFwiIG5nLWhpZGU9XFxcImRpZENoYW5nZSgpXFxcIj5Eb25lPC9hPlxcbiAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPC9mb3JtPlxcblxcbiAgICA8L2Rpdj5cXG5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZXZlbnQuaHRtbFwiLFwiPGRpdiBuZy1zaG93PVxcXCJldmVudC5faWQgJiYgIWV2ZW50LmlzRGVsZXRlZFxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImJveCBcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZXZlbnQtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkZXRhaWxzXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAge3tldmVudC50aXRsZX19XFxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwidGl0bGUtbGFiZWwgZGFuZ2VyXFxcIiBuZy1zaG93PVxcXCJldmVudC5pc0Nsb3NlZFxcXCI+UG9sbCBDbG9zZWQ8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwidGl0bGUtbGFiZWwgc3VjY2Vzc1xcXCIgbmctaGlkZT1cXFwiZXZlbnQuaXNDbG9zZWRcXFwiPlBvbGwgT3Blbjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN1YnRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIENyZWF0ZWQgYnkgPGEgaHJlZj1cXFwibWFpbHRvOnt7ZXZlbnQuY3JlYXRvci5lbWFpbH19XFxcIj57e2V2ZW50LmNyZWF0b3IubmFtZX19PC9hPiAmYnVsbDsge3tldmVudC5jcmVhdGVkIHwgZWxhcHNlZH19XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFjdGlvbnNcXFwiPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJidG5cXFwiIG5nLWNsaWNrPVxcXCJlZGl0RXZlbnQoKVxcXCI+RWRpdCBFdmVudDwvYnV0dG9uPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtc2lkZS1zdGlja3kgZXZlbnQtZGVzY3JpcHRpb25cXFwiIG5nLXNob3c9XFxcImV2ZW50LmRlc2NyaXB0aW9uXFxcIj57e2V2ZW50LmRlc2NyaXB0aW9ufX08L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1ib3R0b20tc3RpY2t5IGV2ZW50LWxvY2F0aW9uXFxcIiBuZy1zaG93PVxcXCJldmVudC5sb2NhdGlvblxcXCI+XFxuICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvbG9jYXRpb24ucG5nXFxcIiB3aWR0aD1cXFwiMThcXFwiIC8+PGEgaHJlZj1cXFwiaHR0cDovL2dvb2dsZS5jb20vbWFwcz9xPXt7ZXZlbnQubG9jYXRpb259fVxcXCIgdGFyZ2V0PVxcXCJfYmxhbmtcXFwiPnt7ZXZlbnQubG9jYXRpb259fTwvYT5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYm94IGJveC14LXNjcm9sbFxcXCI+XFxuICAgICAgICA8ZGl2IHBvbGwgZXZlbnQ9XFxcImV2ZW50XFxcIiBjbGFzcz1cXFwicG9sbFxcXCI+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuXFxuICAgIDxkaXYgY2xhc3M9XFxcImJveFxcXCIgbmctaGlkZT1cXFwiZXZlbnQuY29tbWVudHMubGVuZ3RoID09IDAgJiYgZXZlbnQuaXNDbG9zZWRcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYm94LXRpdGxlXFxcIj5cXG4gICAgICAgICAgICBEaXNjdXNzaW9uXFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1kZXNjcmlwdGlvblxcXCI+XFxuICAgICAgICAgICAgWW91IGNhbiBkaXNjdXNzIHRoZSBldmVudCB3aXRoIHlvdXIgZnJpZW5kcyBieSBsZWF2aW5nIGEgY29tbWVudCBiZWxvdy5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBkaXNjdXNzaW9uIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2hvbWUuaHRtbFwiLFwiPGRpdiBjbGFzcz1cXFwicGFnZS1wbGFjZWhvbGRlclxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImltYWdlXFxcIj5cXG4gICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL21hcmtfbGFyZ2UucG5nXFxcIiB3aWR0aD1cXFwiNjdcXFwiIC8+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJ0aXRsZVxcXCI+XFxuICAgICAgICBTY2hlZHVsZSBhbiBFdmVudFxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiY29udGVudFxcXCI+XFxuICAgICAgICBXYW50IHRvIGhvc3QgYW4gZXZlbnQgYnV0IGNhbuKAmXQgZGVjaWRlIG9uIGEgZGF0ZT8gQ2xpY2sgb24gdGhlIGJ1dHRvbiBiZWxvdyB0byBzdGFydCFcXG4gICAgPC9kaXY+XFxuICAgIDxidXR0b24gbmctY2xpY2s9XFxcIm5ld0V2ZW50KClcXFwiIGNsYXNzPVxcXCJidG5cXFwiPlNjaGVkdWxlIE5ldyBFdmVudDwvYnV0dG9uPlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9uZXdldmVudC5odG1sXCIsXCI8ZGl2IG5nLWlmPVxcXCIhZXZlbnRVcmxcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJib3hcXFwiIG5nLWNsYXNzPVxcXCJ7XFwnYW5pbWF0ZWQgc2hha2VcXCc6IGZvcm0uJHN1Ym1pdHRlZCAmJiBmb3JtLiRpbnZhbGlkIH1cXFwiPlxcblxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYm94LXRpdGxlXFxcIj5TY2hlZHVsZSBhIE5ldyBFdmVudDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYm94LWRlc2NyaXB0aW9uXFxcIj5cXG4gICAgICAgICAgICBGaWxsIGluIHRoZSBmb3JtIGJlbG93IHRvIGNyZWF0ZSB5b3VyIGV2ZW50IGFuZCBzaGFyZSBpdCB3aXRoIHlvdXIgZnJpZW5kcyBhbmQgY29sbGVhZ3Vlcy5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPGZvcm0gbm92YWxpZGF0ZSBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgbmFtZT1cXFwiZm9ybVxcXCIgbmctc3VibWl0PVxcXCJzdWJtaXQoKVxcXCI+XFxuICAgICAgICAgICAgPGRpdiBuZy1pZj1cXFwicGFnZSA9PSAxXFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XFxcImJveC1zZWN0aW9uXFxcIiB1c2VyLWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgPC9zZWN0aW9uPlxcblxcbiAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIGV2ZW50LWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgPC9zZWN0aW9uPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgbmctaWY9XFxcInBhZ2U9PTJcXFwiPlxcblxcbiAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIGRhdGUtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+XFxuXFxuICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgbmctc2hvdz1cXFwiZXZlbnQuZGF0ZXMubGVuZ3RoXFxcIiB0aW1lLWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgPC9zZWN0aW9uPlxcbiAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgIDxkaXYgbmctaWY9XFxcInBhZ2U9PTNcXFwiPlxcblxcbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgcGFydGljaXBhbnRzLWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG4gICAgICAgICAgICA8L3NlY3Rpb24+XFxuXFxuICAgICAgICAgICAgPC9kaXY+XFxuXFxuXFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYm94LWNvbnRyb2xzIGJveC1ib3R0b20tc3RpY2t5XFxcIj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIG5nLWlmPVxcXCJwYWdlIT0xXFxcIiBjbGFzcz1cXFwiYnRuXFxcIiBuZy1jbGljaz1cXFwicHJldlBhZ2UoKVxcXCI+QmFjazwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgbmctaWY9XFxcInBhZ2UhPTNcXFwiIGNsYXNzPVxcXCJidG5cXFwiIG5nLWNsaWNrPVxcXCJuZXh0UGFnZSgpXFxcIj5OZXh0PC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwic3VibWl0XFxcIiBuZy1pZj1cXFwicGFnZT09M1xcXCIgY2xhc3M9XFxcImJ0biBidG4tcHJpbWFyeVxcXCI+Q3JlYXRlIEV2ZW50PC9idXR0b24+XFxuICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICA8L2Zvcm0+XFxuICAgIDwvZGl2PlxcblxcbjwvZGl2PlxcbjxkaXYgbmctaWY9XFxcImV2ZW50VXJsXFxcIiBjbGFzcz1cXFwiYm94XFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYm94LW1lc3NhZ2VcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1haW4taW1hZ2VcXFwiPlxcbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9zdWNjZXNzX2xhcmdlLnBuZ1xcXCIgd2lkdGg9XFxcIjEwMFxcXCIgLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPkV2ZW50IENyZWF0ZWQ8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiY29udGVudFxcXCI+XFxuICAgICAgICBZb3VyIGV2ZW50IGhhcyBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ISBZb3Ugc2hvdWxkIHJlY2VpdmUgYW4gZW1haWwgc2hvcnRseSB3aXRoIGluc3RydWN0aW9ucyB0byB2ZXJpZnkgeW91ciBlbWFpbCBhZGRyZXNzLlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwibWluaS1kaXZpZGVyXFxcIj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgPGlucHV0IHR5cGU9XFxcInRleHRcXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIGRpc2FibGVkPVxcXCJ0cnVlXFxcIiB2YWx1ZT1cXFwie3tldmVudFVybH19XFxcIiAvPlxcbiAgICAgICAgPGEgaHJlZj1cXFwie3tldmVudFVybH19XFxcIiBjbGFzcz1cXFwiYnRuIGZvcm0tYnRuXFxcIj5HTzwvYT5cXG4gICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9ub3Rmb3VuZC5odG1sXCIsXCI8aDE+RXJyb3IgNDA0PC9oMT5cXG48aDI+Tm90IEZvdW5kPC9oMj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvbm90aWZpY2F0aW9uLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcIm5vdGlmaWNhdGlvbiB7e25vdGlmaWNhdGlvbi50eXBlfX1cXFwiIG5nLWNsaWNrPVxcXCJub3RpZmljYXRpb24uY2xvc2UoKVxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInRpdGxlXFxcIj5cXG4gICAgICAgIHt7bm90aWZpY2F0aW9uLnRpdGxlfX1cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcIm1lc3NhZ2VcXFwiPlxcbiAgICAgICAge3tub3RpZmljYXRpb24ubWVzc2FnZX19XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9kaXJlY3RpdmVzL2Rpc2N1c3Npb24uaHRtbFwiLFwiPHVsIGNsYXNzPVxcXCJjb21tZW50LXRocmVhZFxcXCIgbmctc2hvdz1cXFwiZXZlbnQuY29tbWVudHMubGVuZ3RoXFxcIj5cXG4gICAgPGxpIG5nLXJlcGVhdD1cXFwiY29tbWVudCBpbiBldmVudC5jb21tZW50c1xcXCIgY2xhc3M9XFxcImNvbW1lbnRcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXZhdGFyLXNlY3Rpb25cXFwiPlxcbiAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL2F2YXRhci5wbmdcXFwiIC8+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbW1lbnQtc2VjdGlvblxcXCI+XFxuICAgICAgICAgICAgPGEgaHJlZj1cXFwiI1xcXCIgY2xhc3M9XFxcImNvbW1lbnQtZGVsZXRlXFxcIiBuZy1jbGljaz1cXFwiZGVsZXRlQ29tbWVudChjb21tZW50KVxcXCI+JnRpbWVzOzwvYT5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtZXRhXFxcIj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm5hbWVcXFwiPnt7Y29tbWVudC5hdXRob3IubmFtZX19PC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwidGltZVxcXCI+e3tjb21tZW50LmNyZWF0ZWQgfCBlbGFwc2VkfX08L3NwYW4+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29udGVudFxcXCI+e3tjb21tZW50LmNvbnRlbnR9fTwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvbGk+XFxuPC91bD5cXG48Zm9ybSBub3ZhbGlkYXRlIG5nLXN1Ym1pdD1cXFwicG9zdENvbW1lbnQoKVxcXCIgbmFtZT1cXFwiY29tbWVudEZvcm1cXFwiIGNsYXNzPVxcXCJjb21tZW50LWZvcm1cXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJhdmF0YXItc2VjdGlvblxcXCI+XFxuICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9hdmF0YXIucG5nXFxcIiAvPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiaW5wdXQtc2VjdGlvbiBmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbnRlbnQtc2VjdGlvblxcXCI+XFxuICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIHJlcXVpcmVkIG5nLW1vZGVsPVxcXCJjb21tZW50LmNvbnRlbnRcXFwiIHBsYWNlaG9sZGVyPVxcXCJXcml0ZSBhIGNvbW1lbnQuLi5cXFwiPjwvdGV4dGFyZWE+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm5hbWUtc2VjdGlvblxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibmFtZS1jb250YWluZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XFxcIllvdXIgTmFtZVxcXCIgbmctbW9kZWw9XFxcImNvbW1lbnQuYXV0aG9yLm5hbWVcXFwiIC8+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwic3VibWl0XFxcIiBjbGFzcz1cXFwiYnRuXFxcIj5Qb3N0IENvbW1lbnQ8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImZvcm0tZXJyb3JcXFwiIG5nLXNob3c9XFxcImNvbW1lbnRGb3JtLiRzdWJtaXR0ZWQgJiYgY29tbWVudEZvcm0uJGVycm9yXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL2Vycm9yLnBuZ1xcXCIgd2lkdGg9XFxcIjE0XFxcIiAvPiBNYWtlIHN1cmUgeW91IGZpbGwgaW4gYWxsIHRoZSBmaWVsZHMuXFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Zvcm0+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2RpcmVjdGl2ZXMvcG9sbC5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJwb2xsLWhlYWRlclxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImhlYWRlciBwYXJ0aWNpcGFudHMtaGVhZGVyXFxcIj5cXG4gICAgICAgIHt7ZXZlbnQucGFydGljaXBhbnRzLmxlbmd0aH19IHBhcnRpY2lwYW50c1xcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiaGVhZGVyIGRhdGUtaGVhZGVyXFxcIiBuZy1yZXBlYXQ9XFxcImQgaW4gZXZlbnQuZGF0ZXNcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0aWNvblxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZG93XFxcIj5cXG4gICAgICAgICAgICAgICAge3tkLmRhdGUgfCBkYXRlOiBcXCdFRUVcXCd9fVxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRheVxcXCI+XFxuICAgICAgICAgICAgICAgIHt7ZC5kYXRlIHwgZGF0ZTogXFwnZFxcJ319XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9udGhcXFwiPlxcbiAgICAgICAgICAgICAgICB7e2QuZGF0ZSB8IGRhdGUgOiBcXCdNTU1cXCd9fVxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJjb3VudFxcXCIgbmctc2hvdz1cXFwic2VsZWN0ZWREYXRlKCRpbmRleClcXFwiIG5nLWNsYXNzPXt0b3A6aXNUb3BEYXRlKCRpbmRleCl9Pnt7c2VsZWN0ZWREYXRlKCRpbmRleCl9fTwvc3Bhbj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiaGVhZGVyIGFjdGlvbnMtaGVhZGVyXFxcIj5cXG5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz1cXFwicG9sbC1ib2R5XFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwicG9sbC1lbnRyeVxcXCIgbmctcmVwZWF0PVxcXCJwYXJ0aWNpcGFudCBpbiBldmVudC5wYXJ0aWNpcGFudHNcXFwiPlxcbiAgICAgICAgPGZvcm0gbm92YWxpZGF0ZSBuZy1zdWJtaXQ9XFxcInVwZGF0ZShwYXJ0aWNpcGFudCk7IGVkaXRNb2RlID0gZmFsc2VcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNlbGwgbmFtZS1jZWxsXFxcIj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImF2YXRhciBzdHlsZS17eyRpbmRleCArIDF9fVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy91c2VyLnBuZ1xcXCIgd2lkdGg9XFxcIjExXFxcIiAvPlxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmctbW9kZWw9XFxcInBhcnRpY2lwYW50Lm5hbWVcXFwiIG5nLXNob3c9XFxcImVkaXRNb2RlXFxcIiB2YWx1ZT1cXFwicGFydGljaXBhbnQubmFtZVxcXCIvPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBuZy1oaWRlPVxcXCJlZGl0TW9kZVxcXCIgY2xhc3M9XFxcIm5hbWUgZWRpdGFibGVcXFwiIG5nLWNsaWNrPVxcXCJlZGl0TW9kZSA9IHRydWUgJiYgIWV2ZW50LmlzQ2xvc2VkOyBlZGl0KHBhcnRpY2lwYW50KVxcXCI+e3twYXJ0aWNpcGFudC5uYW1lfX08L3NwYW4+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCB2b3RlLWNlbGxcXFwiIG5nLXJlcGVhdD1cXFwiZGF0ZSBpbiBldmVudC5kYXRlc1xcXCI+XFxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3RpY2tAMngucG5nXFxcIiAgd2lkdGg9XFxcIjE2XFxcIiBuZy1oaWRlPVxcXCJlZGl0TW9kZVxcXCIgbmctaWY9XFxcInBhcnRpY2lwYW50LmRhdGVzWyRpbmRleF1cXFwiIC8+XFxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL25vcGVAMngucG5nXFxcIiB3aWR0aD1cXFwiOFxcXCIgbmctaGlkZT1cXFwiZWRpdE1vZGVcXFwiIG5nLWlmPVxcXCIhcGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XVxcXCIgLz5cXG4gICAgICAgICAgICAgICAgPGlucHV0IG5nLW1vZGVsPVxcXCJwYXJ0aWNpcGFudC5kYXRlc1skaW5kZXhdXFxcIiBuZy1zaG93PVxcXCJlZGl0TW9kZVxcXCIgbmctZmFsc2UtdmFsdWU9XFxcImZhbHNlXFxcIiB0eXBlPVxcXCJjaGVja2JveFxcXCIgLz5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwib3ZlcmxheVxcXCIgbmctc2hvdz1cXFwiZWRpdE1vZGVcXFwiIG5nLWNsaWNrPVxcXCJwYXJ0aWNpcGFudC5kYXRlc1skaW5kZXhdID0gIXBhcnRpY2lwYW50LmRhdGVzWyRpbmRleF1cXFwiPjwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNlbGwgYWN0aW9uLWNlbGxcXFwiIG5nLWhpZGU9XFxcImV2ZW50LmlzQ2xvc2VkXFxcIj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIG5nLWhpZGU9XFxcImVkaXRNb2RlXFxcIiBuZy1jbGljaz1cXFwiZWRpdE1vZGUgPSB0cnVlOyBlZGl0KHBhcnRpY2lwYW50KVxcXCIgY2xhc3M9XFxcImJ0biBob3ZlclxcXCI+RWRpdDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgbmctaGlkZT1cXFwiZWRpdE1vZGVcXFwiIG5nLWNsaWNrPVxcXCJkZWxldGUocGFydGljaXBhbnQpXFxcIiBjbGFzcz1cXFwiYnRuIGRhbmdlciBob3ZlclxcXCI+RGVsZXRlPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwic3VibWl0XFxcIiBuZy1zaG93PVxcXCJlZGl0TW9kZVxcXCIgY2xhc3M9XFxcImJ0blxcXCI+U2F2ZTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgbmctc2hvdz1cXFwiZWRpdE1vZGVcXFwiIG5nLWNsaWNrPVxcXCJlZGl0TW9kZSA9IGZhbHNlOyBjYW5jZWwoJGluZGV4KVxcXCIgY2xhc3M9XFxcImJ0blxcXCI+Q2FuY2VsPC9idXR0b24+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Zvcm0+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJwb2xsLWV4YW1wbGVcXFwiIG5nLWNsYXNzPVxcXCJ7aGlkZGVuIDogZXZlbnQucGFydGljaXBhbnRzLmxlbmd0aCA+IDB9XFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInBvbGwtZW50cnlcXFwiIG5nLXJlcGVhdD1cXFwiZXhhbXBsZSBpbiBleGFtcGxlc1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCBuYW1lLWNlbGxcXFwiPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiYXZhdGFyIHN0eWxlLXt7JGluZGV4ICsgMX19XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3VzZXIucG5nXFxcIiB3aWR0aD1cXFwiMTFcXFwiIC8+XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm5hbWVcXFwiPnt7ZXhhbXBsZS5uYW1lfX08L3NwYW4+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCB2b3RlLWNlbGxcXFwiIG5nLXJlcGVhdD1cXFwiZGF0ZSBpbiBldmVudC5kYXRlc1xcXCI+XFxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3RpY2tAMngucG5nXFxcIiAgd2lkdGg9XFxcIjE2XFxcIiBuZy1pZj1cXFwiZXhhbXBsZS5kYXRlc1skaW5kZXhdXFxcIiAvPlxcbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9ub3BlQDJ4LnBuZ1xcXCIgd2lkdGg9XFxcIjhcXFwiIG5nLWlmPVxcXCIhZXhhbXBsZS5kYXRlc1skaW5kZXhdXFxcIiAvPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNlbGwgYWN0aW9uLWNlbGxcXFwiPlxcblxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJvdmVybGF5XFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJvdmVybGF5LXRleHRcXFwiPlxcbiAgICAgICAgICAgICAgICBGaWxsIGluIHRoZSBmb3JtIGJlbG93IHRvIGdldCBzdGFydGVkXFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgbmctaGlkZT1cXFwiZXZlbnQuaXNDbG9zZWRcXFwiIGNsYXNzPVxcXCJwb2xsLWVudHJ5IGhpZ2hsaWdodFxcXCI+XFxuICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlIG5hbWU9XFxcImZvcm1uZXdcXFwiIG5nLXN1Ym1pdD1cXFwic2F2ZSgpXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjZWxsIG5hbWUtY2VsbFxcXCI+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJhdmF0YXIgc3R5bGUte3twYXJ0aWNpcGFudC5zdHlsZX19XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3VzZXIucG5nXFxcIiB3aWR0aD1cXFwiMTFcXFwiIC8+XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPGlucHV0IGF1dG9jb21wbGV0ZT1cXFwib2ZmXFxcIiBuYW1lPVxcXCJ1c2VybmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgcGxhY2Vob2xkZXI9XFxcIllvdXIgbmFtZS4uLlxcXCIgbmctbW9kZWw9XFxcInBhcnRpY2lwYW50Lm5hbWVcXFwiIHJlcXVpcmVkIHZhbHVlPVxcXCJwYXJ0aWNpcGFudC5uYW1lXFxcIi8+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCB2b3RlLWNlbGxcXFwiIG5nLXJlcGVhdD1cXFwiZGF0ZSBpbiBldmVudC5kYXRlc1xcXCI+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD1cXFwicGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XVxcXCIgbmctZmFsc2UtdmFsdWU9XFxcImZhbHNlXFxcIiB0eXBlPVxcXCJjaGVja2JveFxcXCIgLz5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwib3ZlcmxheVxcXCIgbmctY2xpY2s9XFxcInBhcnRpY2lwYW50LmRhdGVzWyRpbmRleF0gPSAhcGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCBhY3Rpb24tY2VsbFxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwic3VibWl0XFxcIiBuZy1jbGFzcz1cXFwieyBcXCdhbmltYXRlZCBzaGFrZVxcJyA6IGZvcm1uZXcuJHN1Ym1pdHRlZCAmJiBmb3JtbmV3LiRpbnZhbGlkICB9XFxcIiBjbGFzcz1cXFwiYnRuXFxcIj5TYXZlPC9idXR0b24+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Zvcm0+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9kaXJlY3RpdmVzL3RpbWVQaWNrZXIuaHRtbFwiLFwiPGRpdiBjbGFzcz1cXFwidGltZS1waWNrZXJcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJ0aW1lLXBpY2tlci1jb2xcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0aWNvblxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZG93XFxcIj5cXG4gICAgICAgICAgICAgICAge3tkYXRlIHwgZGF0ZTogXFwnRUVFXFwnfX1cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXlcXFwiPlxcbiAgICAgICAgICAgICAgICB7e2RhdGUgfCBkYXRlOiBcXCdkXFwnfX1cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb250aFxcXCI+XFxuICAgICAgICAgICAgICAgIHt7ZGF0ZSB8IGRhdGUgOiBcXCdNTU1cXCd9fVxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XFxcImRlbGV0ZVxcXCIgbmctY2xpY2s9XFxcImRhdGVwaWNrZXIudW5zZXREYXRlKGRhdGUpXFxcIj48L3NwYW4+IC0tPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJ0aW1lLXBpY2tlci1jb2xcXFwiIG5nLXJlcGVhdD1cXFwidGltZSBpbiBkYXRlLnRpbWVzIHRyYWNrIGJ5ICRpbmRleFxcXCI+XFxuICAgICAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcInRpbWUtcGlja2VyLWlucHV0XFxcIiB0aW1lLXBpY2tlciBuZy1tb2RlbD1cXFwidGltZVxcXCIgbmctbW9kZWwtb3B0aW9ucz1cXFwieyB1cGRhdGVPbjogXFwnYmx1clxcJyB9XFxcIiAvPlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZm9ybS9kYXRlRm9ybS5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLWRldGFpbHNcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5DaG9vc2UgRGF0ZXM8L2Rpdj5cXG4gICAgPHVsIGNsYXNzPVxcXCJkYXRpY29uLWxpc3RcXFwiPlxcbiAgICAgICAgPGxpIG5nLXJlcGVhdD1cXFwiZCBpbiBldmVudC5kYXRlc1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0aWNvblxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICB7e2QuZGF0ZSB8IGRhdGU6IFxcJ0VFRVxcJ319XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAge3tkLmRhdGUgfCBkYXRlOiBcXCdkXFwnfX1cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vbnRoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIHt7ZC5kYXRlIHwgZGF0ZSA6IFxcJ01NTVxcJ319XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZGVsZXRlXFxcIiBuZy1jbGljaz1cXFwiZGF0ZXBpY2tlci51bnNldERhdGUoZC5kYXRlKVxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9saT5cXG4gICAgPC91bD5cXG48L2Rpdj5cXG48ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLW1haW5cXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLXJvd1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVxcXCJlbWFpbFxcXCI+Q2FsZW5kYXI8L2xhYmVsPlxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJmb3JtLWVycm9yXFxcIiBuZy1zaG93PVxcXCJmb3JtLiRzdWJtaXR0ZWQgJiYgZm9ybS5kYXRlcGlja2VyLiRlcnJvci5yZXF1aXJlZFxcXCI+XFxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL2Vycm9yLnBuZ1xcXCIgd2lkdGg9XFxcIjE0XFxcIiAvPiBZb3UgbmVlZCB0byBzZWxlY3QgYSBmZXcgZGF0ZXNcXG4gICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgPGRpdiBkYXRlcGlja2VyIHJlcXVpcmVkIG5hbWU9XFxcImRhdGVwaWNrZXJcXFwiIGNvbnRyb2w9XFxcImRhdGVwaWNrZXJcXFwiIG5nLW1vZGVsPVxcXCJldmVudC5kYXRlc1xcXCI+XFxuXFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2Zvcm0vZXZlbnRGb3JtLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tZGV0YWlsc1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInNlY3Rpb24tdGl0bGVcXFwiPkV2ZW50IERldGFpbHM8L2Rpdj5cXG48L2Rpdj5cXG48ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLW1haW5cXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLXJvd1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWNvbFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcInRpdGxlXFxcIj5UaXRsZTwvbGFiZWw+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJmb3JtLWVycm9yXFxcIiBuZy1zaG93PVxcXCIoZm9ybS50aXRsZS4kdG91Y2hlZCB8fCBmb3JtLiRzdWJtaXR0ZWQpICYmIGVycm9ycy50aXRsZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9lcnJvci5wbmdcXFwiIHdpZHRoPVxcXCIxNFxcXCIgLz4ge3tlcnJvcnMudGl0bGV9fVxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwidGl0bGVcXFwiIG5hbWU9XFxcInRpdGxlXFxcIiBuZy1tYXhsZW5ndGg9XFxcIjMwXFxcIiByZXF1aXJlZCBuZy1tb2RlbD1cXFwiZXZlbnQudGl0bGVcXFwiIHR5cGU9XFxcInRleHRcXFwiIHBsYWNlaG9sZGVyPVxcXCJNb250aGx5IE1lZXR1cC4uLlxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBleHRlbmRcXFwiLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1jb2xcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXAgb3B0aW9uYWxcXFwiPlxcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVxcXCJsb2NhdGlvblxcXCI+TG9jYXRpb248L2xhYmVsPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZm9ybS1lcnJvclxcXCIgbmctc2hvdz1cXFwiKGZvcm0ubG9jYXRpb24uJHRvdWNoZWQgfHwgZm9ybS4kc3VibWl0dGVkKSAmJiBlcnJvcnMubG9jYXRpb25cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXJyb3IucG5nXFxcIiB3aWR0aD1cXFwiMTRcXFwiIC8+IHt7ZXJyb3JzLmxvY2F0aW9ufX1cXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XFxcImxvY2F0aW9uXFxcIiBuYW1lPVxcXCJsb2NhdGlvblxcXCIgbmctbW9kZWw9XFxcImV2ZW50LmxvY2F0aW9uXFxcIiBuZy1tYXhsZW5ndGg9XFxcIjUwXFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIiBwbGFjZWhvbGRlcj1cXFwiUmlja1xcJ3MgQ2FmZS4uLlxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBleHRlbmRcXFwiLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1yb3dcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cCBvcHRpb25hbFxcXCI+XFxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwiZGVzY3JpcHRpb25cXFwiID5EZXNjcmlwdGlvbjwvbGFiZWw+XFxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVxcXCJkZXNjcmlwdGlvblxcXCIgbmFtZT1cXFwiZGVzY3JpcHRpb25cXFwiIG5nLW1vZGVsPVxcXCJldmVudC5kZXNjcmlwdGlvblxcXCIgcGxhY2Vob2xkZXI9XFxcIkVudGVyIERlc2NyaXB0aW9uLi4uXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGV4dGVuZFxcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZm9ybS9wYXJ0aWNpcGFudHNGb3JtLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tZGV0YWlsc1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInNlY3Rpb24tdGl0bGVcXFwiPkludml0ZSBQYXJ0aWNpcGFudHM8L2Rpdj5cXG48L2Rpdj5cXG48ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLW1haW5cXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLXJvd1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwIG9wdGlvbmFsXFxcIj5cXG4gICAgICAgICAgICA8bGFiZWw+UGFydGljaXBhbnRcXCdzIEVtYWlsczwvbGFiZWw+XFxuICAgICAgICAgICAgPHRhZ3MtaW5wdXQgbWF4LWxlbmd0aD1cXFwiNTBcXFwiIGFsbG93ZWQtdGFncy1wYXR0ZXJuPVxcXCJ7e2VtYWlsUmVnZXh9fVxcXCIgZGlzcGxheS1wcm9wZXJ0eT1cXFwiZW1haWxcXFwiIG5nLW1vZGVsPVxcXCJldmVudC5lbWFpbHNcXFwiIHBsYWNlaG9sZGVyPVxcXCJBZGQgYW4gRW1haWxcXFwiIHR5cGU9XFxcImVtYWlsXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCI+PC90YWdzLWlucHV0PlxcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJoaWRkZW5cXFwiIG5hbWU9XFxcInNob3VsZENyZWF0ZVxcXCIgdmFsdWU9XFxcInRydWVcXFwiIC8+XFxuXFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuPC9zZWN0aW9uPlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9mb3JtL3NldHRpbmdzRm9ybS5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLWRldGFpbHNcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5TZXR0aW5nczwvZGl2PlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tbWFpblxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN3aXRjaC1yb3dcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3dpdGNoLWRldGFpbHNcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgUG9sbCBTdGF0dXNcXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkZXNjcmlwdGlvblxcXCI+XFxuICAgICAgICAgICAgICAgIExldCBwZW9wbGUgdm90ZSBvbiB0aGUgcG9sbC5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3dpdGNoXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2gtdmFsdWVcXFwiPlxcbiAgICAgICAgICAgICAgICB7e2V2ZW50LmlzQ2xvc2VkID8gXFwnQ2xvc2VkXFwnIDogXFwnT3BlblxcJyB9fVxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgc3dpdGNoLXRvZ2dsZSBuZy1tb2RlbD1cXFwiZXZlbnQuaXNDbG9zZWRcXFwiIGludmVydD5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3dpdGNoLXJvd1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2gtZGV0YWlsc1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25zXFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGVzY3JpcHRpb25cXFwiPlxcbiAgICAgICAgICAgICAgICBTZW5kIGVtYWlsIG5vdGlmaWNhdGlvbnMgdG8gdGhlIGNyZWF0b3Igb2YgdGhpcyBldmVudC5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3dpdGNoXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2gtdmFsdWVcXFwiPlxcbiAgICAgICAgICAgICAgICB7e2V2ZW50LmNyZWF0b3IuYWxsb3dOb3RpZmljYXRpb25zID8gXFwnRW5hYmxlZFxcJyA6IFxcJ0Rpc2FibGVkXFwnIH19XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBzd2l0Y2gtdG9nZ2xlIG5nLW1vZGVsPVxcXCJldmVudC5jcmVhdG9yLmFsbG93Tm90aWZpY2F0aW9uc1xcXCI+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN3aXRjaC1yb3dcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3dpdGNoLWRldGFpbHNcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgRGVsZXRlIEV2ZW50XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGVzY3JpcHRpb25cXFwiPlxcbiAgICAgICAgICAgICAgICBPbmNlIHlvdSBkZWxldGUgYW4gZXZlbnQgaXQgd2lsbCBubyBsb25nZXIgYmUgYWNjZXNzaWJsZS5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3dpdGNoXFxcIj5cXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgbmctY2xpY2s9XFxcImRlbGV0ZUV2ZW50KClcXFwiIGNsYXNzPVxcXCJidG5cXFwiIG5nLWNsYXNzPVxcXCJ7ZGFuZ2VyIDogIWRlbGV0ZVJlcXVlc3RTZW50LCBkaXNhYmxlZCA6IGRlbGV0ZVJlcXVlc3RTZW50fVxcXCI+e3tkZWxldGVSZXF1ZXN0U2VudCA/IFxcJ1JlcXVlc3QgU2VudFxcJyA6IFxcJ0RlbGV0ZSBFdmVudFxcJyB9fTwvYnV0dG9uPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2Plxcbjwvc2VjdGlvbj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZm9ybS90aW1lRm9ybS5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLWRldGFpbHNcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5DaG9vc2UgVGltZXM8L2Rpdj5cXG48L2Rpdj5cXG48ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLW1haW5cXFwiPlxcbiAgICA8dGFibGUgY2xhc3M9XFxcInRpbWUtZm9ybVxcXCI+XFxuICAgICAgICA8dGhlYWQ+XFxuICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICA8dGg+XFxuXFxuICAgICAgICAgICAgICAgIDwvdGg+XFxuICAgICAgICAgICAgICAgIDx0aD5cXG4gICAgICAgICAgICAgICAgICAgIFRpbWUgMVxcbiAgICAgICAgICAgICAgICA8L3RoPlxcbiAgICAgICAgICAgICAgICA8dGg+XFxuICAgICAgICAgICAgICAgICAgICBUaW1lIDJcXG4gICAgICAgICAgICAgICAgPC90aD5cXG4gICAgICAgICAgICAgICAgPHRoPlxcbiAgICAgICAgICAgICAgICAgICAgVGltZSAzXFxuICAgICAgICAgICAgICAgIDwvdGg+XFxuICAgICAgICAgICAgPC90cj5cXG4gICAgICAgIDwvdGhlYWQ+XFxuICAgICAgICA8dGJvZHk+XFxuICAgICAgICAgICAgPHRyIG5nLXJlcGVhdD1cXFwiZCBpbiBldmVudC5kYXRlc1xcXCI+XFxuICAgICAgICAgICAgICAgIDx0ZD5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGljb25cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZC5kYXRlIHwgZGF0ZTogXFwnRUVFXFwnfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2QuZGF0ZSB8IGRhdGU6IFxcJ2RcXCd9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vbnRoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkLmRhdGUgfCBkYXRlIDogXFwnTU1NXFwnfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZGVsZXRlXFxcIiBuZy1jbGljaz1cXFwidW5zZXREYXRlKGQuZGF0ZSlcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICA8dGQgbmctcmVwZWF0PVxcXCJ0aW1lIGluIFsxLDIsM10gdHJhY2sgYnkgJGluZGV4XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiB0aW1lLXBpY2tlciBuZy1tb2RlbC1vcHRpb25zPVxcXCJ7IHVwZGF0ZU9uOiBcXCdibHVyXFwnIH1cXFwiIG5nLW1vZGVsPVxcXCJkLnRpbWVzWyRpbmRleF1cXFwiIGNsYXNzPVxcXCJ0aW1lLXBpY2tlci1pbnB1dFxcXCIgLz5cXG4gICAgICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgPC90Ym9keT5cXG4gICAgPC90YWJsZT5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZm9ybS91c2VyRm9ybS5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLWRldGFpbHNcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5Zb3VyIERldGFpbHM8L2Rpdj5cXG48L2Rpdj5cXG48ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLW1haW5cXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLXJvd1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWNvbFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcIm5hbWVcXFwiPk5hbWU8L2xhYmVsPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZm9ybS1lcnJvclxcXCIgbmctc2hvdz1cXFwiKGZvcm0ubmFtZS4kdG91Y2hlZCB8fCBmb3JtLiRzdWJtaXR0ZWQpICYmIGVycm9ycy5uYW1lXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL2Vycm9yLnBuZ1xcXCIgd2lkdGg9XFxcIjE0XFxcIiAvPiB7e2Vycm9ycy5uYW1lfX1cXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XFxcIm5hbWVcXFwiIG5hbWU9XFxcIm5hbWVcXFwiIG5nLW1heGxlbmd0aD1cXFwiMzBcXFwiIHJlcXVpcmVkIG5nLW1vZGVsPVxcXCJldmVudC5jcmVhdG9yLm5hbWVcXFwiIHR5cGU9XFxcInRleHRcXFwiIHBsYWNlaG9sZGVyPVxcXCJKb2huIERvZS4uLlxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBleHRlbmRcXFwiLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1jb2xcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVxcXCJlbWFpbFxcXCI+RW1haWw8L2xhYmVsPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZm9ybS1lcnJvclxcXCIgbmctc2hvdz1cXFwiKGZvcm0uZW1haWwuJHRvdWNoZWQgfHwgZm9ybS4kc3VibWl0dGVkKSAmJiBlcnJvcnMuZW1haWxcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXJyb3IucG5nXFxcIiB3aWR0aD1cXFwiMTRcXFwiIC8+IHt7ZXJyb3JzLmVtYWlsfX1cXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwiZW1haWxcXFwiIGlkPVxcXCJlbWFpbFxcXCIgbmFtZT1cXFwiZW1haWxcXFwiIG5nLXBhdHRlcm49XFxcImVtYWlsUmVnZXhcXFwiIHJlcXVpcmVkIG5nLW1vZGVsPVxcXCJldmVudC5jcmVhdG9yLmVtYWlsXFxcIiBwbGFjZWhvbGRlcj1cXFwiam9obi5kb2VAZW1haWwuY29tLi4uXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGV4dGVuZFxcXCIvPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9uZXdFdmVudC9kYXRldGltZS5odG1sXCIsXCI8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIGRhdGUtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbjwvc2VjdGlvbj5cXG5cXG48ZGl2IGNsYXNzPVxcXCJib3gtY29udHJvbHMgYm94LWJvdHRvbS1zdGlja3lcXFwiPlxcbiAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0blxcXCIgbmctY2xpY2s9XFxcInByZXZQYWdlKClcXFwiPlByZXZpb3VzPC9idXR0b24+XFxuICAgIDxidXR0b24gdHlwZT1cXFwic3VibWl0XFxcIiBjbGFzcz1cXFwiYnRuXFxcIj5OZXh0PC9idXR0b24+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL25ld0V2ZW50L2dlbmVyYWwuaHRtbFwiLFwiPHNlY3Rpb24gY2xhc3M9XFxcImJveC1zZWN0aW9uXFxcIiB1c2VyLWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG48L3NlY3Rpb24+XFxuXFxuPHNlY3Rpb24gY2xhc3M9XFxcImJveC1zZWN0aW9uXFxcIiBldmVudC1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuPC9zZWN0aW9uPlxcblxcbjxkaXYgY2xhc3M9XFxcImJveC1jb250cm9scyBib3gtYm90dG9tLXN0aWNreVxcXCI+XFxuICAgIDxidXR0b24gdHlwZT1cXFwic3VibWl0XFxcIiBjbGFzcz1cXFwiYnRuXFxcIj5OZXh0IFN0ZXA8L2J1dHRvbj5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvbmV3RXZlbnQvaW52aXRlLmh0bWxcIixcIjxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgcGFydGljaXBhbnRzLWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG48L3NlY3Rpb24+XFxuXFxuPGRpdiBjbGFzcz1cXFwiYm94LWNvbnRyb2xzIGJveC1ib3R0b20tc3RpY2t5XFxcIj5cXG4gICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG5cXFwiIG5nLWNsaWNrPVxcXCJwcmV2UGFnZSgpXFxcIj5QcmV2aW91czwvYnV0dG9uPlxcbiAgICA8YnV0dG9uIHR5cGU9XFxcInN1Ym1pdFxcXCIgY2xhc3M9XFxcImJ0blxcXCI+Q3JlYXRlPC9idXR0b24+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL25ld0V2ZW50L2xheW91dC5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJib3hcXFwiPlxcblxcbiAgICA8ZGl2IGNsYXNzPVxcXCJib3gtdGl0bGVcXFwiPlNjaGVkdWxlIGEgTmV3IEV2ZW50PC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImJveC1kZXNjcmlwdGlvblxcXCI+XFxuICAgICAgICBGaWxsIGluIHRoZSBmb3JtIGJlbG93IHRvIGNyZWF0ZSB5b3VyIGV2ZW50IGFuZCBzaGFyZSBpdCB3aXRoIHlvdXIgZnJpZW5kcyBhbmQgY29sbGVhZ3Vlcy5cXG4gICAgPC9kaXY+XFxuICAgIDxvbCBjbGFzcz1cXFwiYm94LXN0ZXBzXFxcIj5cXG4gICAgICAgIDxsaSBjbGFzcz1cXFwic3RlcCBhY3RpdmVcXFwiPlxcbiAgICAgICAgICAgIEdlbmVyYWwgRGV0YWlsc1xcbiAgICAgICAgPC9saT5cXG4gICAgICAgIDxsaSBjbGFzcz1cXFwic3RlcFxcXCIgbmctY2xhc3M9XFxcInsgYWN0aXZlIDogcGFnZSA+IDEgfVxcXCI+XFxuICAgICAgICAgICAgRGF0ZXMgJmFtcDsgVGltZXNcXG4gICAgICAgIDwvbGk+XFxuICAgICAgICA8bGkgY2xhc3M9XFxcInN0ZXBcXFwiIG5nLWNsYXNzPVxcXCJ7IGFjdGl2ZSA6IHBhZ2UgPiAyIH1cXFwiPlxcbiAgICAgICAgICAgIEludml0ZXNcXG4gICAgICAgIDwvbGk+XFxuICAgICAgICA8bGkgY2xhc3M9XFxcInN0ZXBcXFwiIG5nLWNsYXNzPVxcXCJ7IGFjdGl2ZSA6IHBhZ2UgPiAzIH1cXFwiPlxcbiAgICAgICAgICAgIERvbmVcXG4gICAgICAgIDwvbGk+XFxuICAgIDwvb2w+XFxuICAgIDxmb3JtIG5vdmFsaWRhdGUgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiIG5hbWU9XFxcImZvcm1cXFwiIG5nLXN1Ym1pdD1cXFwic3VibWl0KClcXFwiPlxcbiAgICAgICAgPGRpdiB1aS12aWV3PlxcblxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZm9ybT5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvbmV3RXZlbnQvc3VjY2Vzcy5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJib3gtbWVzc2FnZVxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcIm1haW4taW1hZ2VcXFwiPlxcbiAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvc3VjY2Vzc19sYXJnZS5wbmdcXFwiIHdpZHRoPVxcXCIxMDBcXFwiIC8+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJ0aXRsZVxcXCI+RXZlbnQgQ3JlYXRlZDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJjb250ZW50XFxcIj5cXG4gICAgICAgIFlvdXIgZXZlbnQgaGFzIGJlZW4gY3JlYXRlZCBzdWNjZXNzZnVsbHkhIFlvdSBzaG91bGQgcmVjZWl2ZSBhbiBlbWFpbCBzaG9ydGx5IHdpdGggaW5zdHJ1Y3Rpb25zIHRvIHZlcmlmeSB5b3VyIGVtYWlsIGFkZHJlc3MuXFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJtaW5pLWRpdmlkZXJcXFwiPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgZGlzYWJsZWQ9XFxcInRydWVcXFwiIHZhbHVlPVxcXCJ7e2V2ZW50VXJsfX1cXFwiIC8+XFxuICAgICAgICA8YSBocmVmPVxcXCJ7e2V2ZW50VXJsfX1cXFwiIGNsYXNzPVxcXCJidG4gZm9ybS1idG5cXFwiPkdPPC9hPlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIik7fV0pOyIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ0Fib3V0Q3RybCcsIGZ1bmN0aW9uKFRpdGxlKXtcbiAgICBUaXRsZS5zZXQoJ0Fib3V0IFJhbGxseScpXG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ0FjY291bnRDdHJsJywgZnVuY3Rpb24oJHNjb3BlLCBDb25maXJtTW9kYWwpe1xuICAgICRzY29wZS5zaG93Tm90aWNlID0gZnVuY3Rpb24oKXtcbiAgICAgICAgXG4gICAgfVxufSlcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ0RlbGV0aW9uQ3RybCcsIGZ1bmN0aW9uKCRzdGF0ZSwgTm90aWZpY2F0aW9uLCBFdmVudCl7XG4gICAgRXZlbnQuZGVzdHJveSh7aWQgOiAkc3RhdGUucGFyYW1zLmlkLCBjb2RlIDokc3RhdGUucGFyYW1zLmNvZGV9LCBmdW5jdGlvbigpe1xuICAgICAgICB2YXIgbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICB0aXRsZSA6ICdFdmVudCBkZWxldGVkJyxcbiAgICAgICAgICAgIG1lc3NhZ2UgOiAnVGhpcyBldmVudCBoYXMgYmVlbiBkZWxldGVkJyxcbiAgICAgICAgICAgIHR5cGUgOiAnc3VjY2VzcycsXG4gICAgICAgICAgICB0aW1lb3V0IDogNTAwMFxuICAgICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbihlKXtcbiAgICAgICAgdmFyIG5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oe1xuICAgICAgICAgICAgdGl0bGUgOiAnRGVsZXRpb24gRmFpbGVkJyxcbiAgICAgICAgICAgIG1lc3NhZ2UgOiAnVGhlIGV2ZW50IGNvdWxkIG5vdCBiZSBkZWxldGVkLiBNYWtlIHN1cmUgdGhhdCBpdCBleGlzdHMgYW5kIHRoYXQgdGhlIHVybCBpcyBjb3JyZWN0JyxcbiAgICAgICAgICAgIHR5cGUgOiAnZXJyb3InXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgICRzdGF0ZS5nbygnZXZlbnQnLCB7IGlkIDogJHN0YXRlLnBhcmFtcy5pZCB9KTtcbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uY29udHJvbGxlcignRWRpdEV2ZW50Q3RybCcsIGZ1bmN0aW9uKCRzY29wZSwgJGh0dHAsICRzdGF0ZSwgJHRpbWVvdXQsIEV2ZW50LCBDb25maXJtTW9kYWwsIE5vdGlmaWNhdGlvbiwgVGl0bGUpe1xuICAgIHZhciBpZCA9ICRzdGF0ZS5wYXJhbXMuaWRcbiAgICAkc2NvcGUuZXZlbnQgPSBFdmVudC5nZXQoe2lkOmlkfSwgZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIFRpdGxlLnNldChcIkVkaXQ6IFwiICsgJHNjb3BlLmV2ZW50LnRpdGxlKTtcbiAgICAgICAgJHNjb3BlLm1hc3RlciA9IGFuZ3VsYXIuY29weSgkc2NvcGUuZXZlbnQpO1xuICAgIH0sIGZ1bmN0aW9uKGUpe1xuICAgICAgICAkc3RhdGUuZ28oJ25vdGZvdW5kJyk7XG4gICAgfSk7XG4gICAgJHNjb3BlLnVuZG9DaGFuZ2VzID0gZnVuY3Rpb24oKXtcbiAgICAgICAgJHNjb3BlLmV2ZW50ID0gYW5ndWxhci5jb3B5KCRzY29wZS5tYXN0ZXIpO1xuICAgIH1cbiAgICAkc2NvcGUuZGlkQ2hhbmdlID0gZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KCRzY29wZS5tYXN0ZXIpICE9IEpTT04uc3RyaW5naWZ5KCRzY29wZS5ldmVudCk7XG4gICAgfVxuICAgICRzY29wZS5kaWRDaGFuZ2VEYXRlcyA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSgkc2NvcGUubWFzdGVyLmRhdGVzKSAhPSBKU09OLnN0cmluZ2lmeSgkc2NvcGUuZXZlbnQuZGF0ZXMpO1xuICAgIH1cbiAgICAkc2NvcGUuc3VibWl0ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKCRzY29wZS5mb3JtLiR2YWxpZCl7XG4gICAgICAgICAgICBpZiAoJHNjb3BlLmRpZENoYW5nZURhdGVzKCkgKXtcbiAgICAgICAgICAgICAgICB2YXIgbW9kYWwgPSBuZXcgQ29uZmlybU1vZGFsKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUgOiAnSG9sZCB1cCEnLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogJ0NoYW5naW5nIHRoZSBkYXRlcyB3aWxsIHJlc2V0IGFsbCBlbnRyaWVzIGJ5IHRoZSBwYXJ0aWNpcGFudHMuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkbyB0aGF0PycsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0IDogJ1llcywgSVxcJ20gc3VyZScsXG4gICAgICAgICAgICAgICAgICAgIGlzRGVzdHJ1Y3RpdmUgOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maXJtIDogZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5ldmVudC5wYXJ0aWNpcGFudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgdGl0bGUgOiAnTm90IHNvIGZhc3QnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiAnTWFrZSBzdXJlIHlvdSBmaWxsIGluIGFsbCB0aGUgcmVxdWlyZWQgZmllbGRzIGFuZCB0cnkgYWdhaW4uJyxcbiAgICAgICAgICAgICAgICB0eXBlIDogJ2Vycm9yJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIHVwZGF0ZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIEV2ZW50LnVwZGF0ZSh7XG4gICAgICAgICAgICBpZCA6IGlkXG4gICAgICAgIH0sICRzY29wZS5ldmVudCxcbiAgICAgICAgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHZhciBub3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICB0aXRsZSA6ICdDaGFuZ2VzIFNhdmVkJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlIDogJ1lvdXIgY2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWQgc3VjY2Vzc2Z1bGx5LicsXG4gICAgICAgICAgICAgICAgdHlwZSA6ICdzdWNjZXNzJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkc2NvcGUubWFzdGVyID0gYW5ndWxhci5jb3B5KCRzY29wZS5ldmVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uY29udHJvbGxlcignRXZlbnRDdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkaHR0cCwgJHN0YXRlLCBUaXRsZSwgRXZlbnQsIENvbmZpcm1Nb2RhbCl7XG4gICAgdmFyIGlkID0gJHN0YXRlLnBhcmFtcy5pZDtcbiAgICAvLyBHZXQgRXZlbnRcbiAgICAkc2NvcGUuZXZlbnQgPSBFdmVudC5nZXQoe2lkOmlkfSwgZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIC8vIFNldCB0aGUgcGFnZSB0aXRsZSB0byB0aGUgZXZlbnQgdGl0bGVcbiAgICAgICAgVGl0bGUuc2V0KCRzY29wZS5ldmVudC50aXRsZSk7XG4gICAgICAgIC8vIEdlbmVyYXRlIGV2ZW50IHVybCAtIGkuZS4gaHR0cDovL3JhbGxseS5jby9qRjlGX0ZkXG4gICAgICAgICRzY29wZS5ldmVudFVybCA9ICRzdGF0ZS5ocmVmKCdldmVudCcsIHtcbiAgICAgICAgICAgIGlkOiAkc2NvcGUuZXZlbnQuX2lkXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGFic29sdXRlIDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbihlKXtcbiAgICAgICAgJHN0YXRlLmdvKCdub3Rmb3VuZCcpO1xuICAgIH0pO1xuXG4gICAgJHNjb3BlLm9wZW5FdmVudCA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICRzY29wZS5ldmVudC5pc0Nsb3NlZCA9IGZhbHNlO1xuICAgICAgICBFdmVudC51cGRhdGUoe1xuICAgICAgICAgICAgaWQgOiBpZFxuICAgICAgICB9LCAkc2NvcGUuZXZlbnQsXG4gICAgICAgIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICB2YXIgbW9kYWwgPSBuZXcgQ29uZmlybU1vZGFsKHtcbiAgICAgICAgICAgICAgICB0aXRsZSA6ICdFdmVudCBPcGVuJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlIDogJ1Blb3BsZSBjYW4gdm90ZSBhbmQgY29tbWVudCBvbiB0aGlzIGV2ZW50LicsXG4gICAgICAgICAgICAgICAgY2FuY2VsVGV4dCA6ICdPSycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgJHNjb3BlLmNsb3NlRXZlbnQgPSBmdW5jdGlvbigpe1xuICAgICAgICAkc2NvcGUuZXZlbnQuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICBFdmVudC51cGRhdGUoe1xuICAgICAgICAgICAgaWQgOiBpZFxuICAgICAgICB9LCAkc2NvcGUuZXZlbnQsXG4gICAgICAgIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICB2YXIgbW9kYWwgPSBuZXcgQ29uZmlybU1vZGFsKHtcbiAgICAgICAgICAgICAgICB0aXRsZSA6ICdFdmVudCBDbG9zZWQnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiAnUGVvcGxlIGNhbiBubyBsb25nZXIgdm90ZSBvciBjb21tZW50IG9uIHRoaXMgZXZlbnQuJyxcbiAgICAgICAgICAgICAgICBjYW5jZWxUZXh0IDogJ09LJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAkc2NvcGUuZWRpdEV2ZW50ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgJHN0YXRlLmdvKCdlZGl0ZXZlbnQnLCB7IGlkIDogJHNjb3BlLmV2ZW50Ll9pZCB9KTtcbiAgICB9XG5cbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uY29udHJvbGxlcignSG9tZUN0cmwnLCBmdW5jdGlvbigkc2NvcGUsICRzdGF0ZSwgVGl0bGUpe1xuICAgIFRpdGxlLnNldCgnUmFsbGx5IC0gQ29sbGFib3JhdGl2ZSBTY2hlZHVsaW5nJylcblxuICAgICRzY29wZS5uZXdFdmVudCA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICRzdGF0ZS5nbygnbmV3ZXZlbnQnKTtcbiAgICB9XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ05hdmlnYXRpb25DdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkbG9jYXRpb24pe1xuICAgICRzY29wZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgaWYgKCRsb2NhdGlvbi5wYXRoKCkgPT0gcGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cbn0pXG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5jb250cm9sbGVyKCdOZXdFdmVudEN0cmwnLCBmdW5jdGlvbigkc2NvcGUsICRodHRwLCAkc3RhdGUsIEV2ZW50LCBDb25maXJtTW9kYWwsIE5vdGlmaWNhdGlvbil7XG5cbiAgICAkc2NvcGUudGl0bGUgPSBcIlNjaGVkdWxlIGEgTmV3IEV2ZW50XCI7XG4gICAgJHNjb3BlLmRlc2NyaXB0aW9uID0gXCJGaWxsIGluIHRoZSBmb3JtIGJlbG93IHRvIGNyZWF0ZSB5b3VyIGV2ZW50IGFuZCBzaGFyZSBpdCB3aXRoIHlvdXIgZnJpZW5kcyBhbmQgY29sbGVhZ3Vlcy5cIjtcbiAgICAkc2NvcGUuZXZlbnQgPSB7fTtcblxuICAgIHZhciBzdGF0ZXMgPSBbXG4gICAgICAgICduZXdldmVudC5nZW5lcmFsJyxcbiAgICAgICAgJ25ld2V2ZW50LmRhdGV0aW1lJyxcbiAgICAgICAgJ25ld2V2ZW50Lmludml0ZSdcbiAgICBdO1xuXG4gICAgJHNjb3BlLnBhZ2UgPSAxO1xuXG4gICAgdmFyIGdvVG8gPSBmdW5jdGlvbihwYWdlKXtcbiAgICAgICAgJHNjb3BlLnBhZ2UgPSBwYWdlO1xuICAgICAgICAkc3RhdGUuZ28oc3RhdGVzW3BhZ2UtMV0pO1xuICAgIH1cblxuICAgIGdvVG8oJHNjb3BlLnBhZ2UpO1xuXG5cbiAgICAkc2NvcGUuc3VibWl0ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKCRzY29wZS5mb3JtLiR2YWxpZCAmJiAkc2NvcGUucGFnZSA9PSBzdGF0ZXMubGVuZ3RoKXtcbiAgICAgICAgICAgICRodHRwLnBvc3QoJy9hcGkvZXZlbnQnLCAkc2NvcGUuZXZlbnQpXG4gICAgICAgICAgICAuc3VjY2VzcyhmdW5jdGlvbihldmVudCwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpe1xuICAgICAgICAgICAgICAgICRzY29wZS5ldmVudCA9IGV2ZW50O1xuICAgICAgICAgICAgICAgICRzY29wZS5ldmVudFVybCA9ICRzdGF0ZS5ocmVmKCdldmVudCcsIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICRzY29wZS5ldmVudC5faWRcbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGFic29sdXRlIDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICRzY29wZS5wYWdlKys7XG4gICAgICAgICAgICAgICAgJHN0YXRlLmdvKCduZXdldmVudC5zdWNjZXNzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmVycm9yKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgdmFyIG1vZGFsID0gbmV3IENvbmZpcm1Nb2RhbCh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlIDogJ1VoIG9oIScsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiAnVGhlcmUgd2FzIGFuIGVycm9yIGNyZWF0aW5nIHlvdXIgZXZlbnQuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJyxcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dCA6ICdPSydcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCRzY29wZS5mb3JtLiR2YWxpZCkge1xuICAgICAgICAgICAgJHNjb3BlLmZvcm0uJHNldFByaXN0aW5lKCk7XG4gICAgICAgICAgICAkc2NvcGUubmV4dFBhZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgICRzY29wZS5uZXh0UGFnZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGdvVG8oJHNjb3BlLnBhZ2UrMSk7XG4gICAgfVxuXG4gICAgJHNjb3BlLnByZXZQYWdlID0gZnVuY3Rpb24oKXtcbiAgICAgICAgZ29Ubygkc2NvcGUucGFnZS0xKTtcbiAgICB9XG5cbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uY29udHJvbGxlcignVmVyaWZpY2F0aW9uQ3RybCcsIGZ1bmN0aW9uKEV2ZW50LCBOb3RpZmljYXRpb24sICRzdGF0ZSl7XG4gICAgRXZlbnQudmVyaWZ5KHtpZCA6ICRzdGF0ZS5wYXJhbXMuaWQsIGNvZGUgOiRzdGF0ZS5wYXJhbXMuY29kZX0sIGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBub3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgIHRpdGxlIDogJ0VtYWlsIFZlcmlmaWVkJyxcbiAgICAgICAgICAgIG1lc3NhZ2UgOiAnWW91ciBlbWFpbCBoYXMgYmVlbiB2ZXJpZmllZC4gWW91IHdpbGwgbm93IGJlIGFibGUgdG8gcmVjZWl2ZSBlbWFpbCBub3RpZmljYXRpb25zIGZvciB0aGlzIGV2ZW50JyxcbiAgICAgICAgICAgIHR5cGUgOiAnc3VjY2VzcycsXG4gICAgICAgICAgICB0aW1lb3V0IDogNTAwMFxuICAgICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbihlKXtcbiAgICAgICAgdmFyIG5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oe1xuICAgICAgICAgICAgdGl0bGUgOiAnVmVyaWZpY2F0aW9uIEZhaWxlZCcsXG4gICAgICAgICAgICBtZXNzYWdlIDogJ1lvdXIgdmVyaWZpY2F0aW9uIGNvZGUgaGFzIGV4cGlyZWQuJyxcbiAgICAgICAgICAgIHR5cGUgOiAnZXJyb3InXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgICRzdGF0ZS5nbygnZXZlbnQnLCB7IGlkIDogJHN0YXRlLnBhcmFtcy5pZCB9KTtcblxufSk7XG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5kaXJlY3RpdmUoJ2JhY2tJbWcnLCBmdW5jdGlvbigpe1xuICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpe1xuICAgICAgICB2YXIgdXJsID0gYXR0cnMuYmFja0ltZztcbiAgICAgICAgZWxlbWVudC5jc3Moe1xuICAgICAgICAgICAgJ2JhY2tncm91bmQtaW1hZ2UnOiAndXJsKC9pbWFnZXMvJyArIHVybCArJy5wbmcpJ1xuICAgICAgICB9KTtcbiAgICB9O1xufSlcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmRpcmVjdGl2ZSgnZGF0ZXBpY2tlcicsIGZ1bmN0aW9uKERhdGVQaWNrZXJTZXJ2aWNlKXtcbiAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdCA6ICdBJyxcbiAgICAgICAgcmVxdWlyZSA6ICduZ01vZGVsJyxcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICBtb2RlbCA6ICc9bmdNb2RlbCcsXG4gICAgICAgICAgICBjb250cm9sIDogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIGxpbmsgOiBmdW5jdGlvbihzY29wZSwgZWwsIGF0dHJzLCBuZ01vZGVsKXtcbiAgICAgICAgICAgIHZhciBkYXRlU2VydmljZSAgPSBuZXcgRGF0ZVBpY2tlclNlcnZpY2Uoc2NvcGUubW9kZWwpLFxuICAgICAgICAgICAgICAgIGRhdGVCdWZmZXIgPSBkYXRlU2VydmljZS5nZXREYXRlc0FycmF5KCk7XG5cbiAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudChlbCkuZGF0ZXBpY2tlcih7XG4gICAgICAgICAgICAgICAgbXVsdGlkYXRlIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0b2RheUhpZ2hsaWdodDogdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignY2hhbmdlRGF0ZScsIGZ1bmN0aW9uKGUpe1xuICAgICAgICAgICAgICAgIHZhciBkYXRlUGlja2VyRGF0ZXMgPSBlLmRhdGVzO1xuICAgICAgICAgICAgICAgIGlmIChkYXRlUGlja2VyRGF0ZXMubGVuZ3RoID4gZGF0ZUJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVBZGRlZCA9IGRhdGVQaWNrZXJEYXRlc1tkYXRlUGlja2VyRGF0ZXMubGVuZ3RoLTFdO1xuICAgICAgICAgICAgICAgICAgICBkYXRlU2VydmljZS5hZGREYXRlKGRhdGVBZGRlZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVSZW1vdmVkID0gZGF0ZVNlcnZpY2UuZGlmZkRhdGVzKGRhdGVCdWZmZXIsIGRhdGVQaWNrZXJEYXRlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRlUmVtb3ZlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVTZXJ2aWNlLnJlbW92ZURhdGUoZGF0ZVJlbW92ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZ01vZGVsLiRzZXRWaWV3VmFsdWUoZGF0ZVNlcnZpY2UuZ2V0RGF0ZXMoKSlcbiAgICAgICAgICAgICAgICBkYXRlQnVmZmVyID0gZGF0ZVBpY2tlckRhdGVzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzY29wZS5jb250cm9sID0gc2NvcGUuY29udHJvbCB8fCB7fTtcbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ21vZGVsJywgZnVuY3Rpb24obmV3VmFsdWUsIG9sZFZhbHVlKXtcbiAgICAgICAgICAgICAgICB2YXIgZGF0ZVBpY2tlckRhdGVzID0gYW5ndWxhci5lbGVtZW50KGVsKS5kYXRlcGlja2VyKCdnZXREYXRlcycpO1xuICAgICAgICAgICAgICAgIHZhciBtb2RlbERhdGVzID0gZGF0ZVNlcnZpY2UuZ2V0RGF0ZXNBcnJheSgpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRlUGlja2VyRGF0ZXMubGVuZ3RoICE9IG1vZGVsRGF0ZXMubGVuZ3RoKXtcbiAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5lbGVtZW50KGVsKS5kYXRlcGlja2VyKCdzZXREYXRlcycsIG1vZGVsRGF0ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2NvcGUuY29udHJvbC51bnNldERhdGUgPSBmdW5jdGlvbihkYXRlKXtcbiAgICAgICAgICAgICAgICBkYXRlU2VydmljZS5yZW1vdmVEYXRlKGRhdGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZ01vZGVsLiR2YWxpZGF0b3JzLnJlcXVpcmVkID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlKXtcbiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsVmFsdWUgfHwgbW9kZWxWYWx1ZS5sZW5ndGggPT0gMCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cbn0pXG4uc2VydmljZSgnRGF0ZVBpY2tlclNlcnZpY2UnLCBmdW5jdGlvbigpe1xuICAgIHJldHVybiBmdW5jdGlvbihkZWZhdWx0U3RvcmUpe1xuXG4gICAgICAgIHZhciBzdG9yZSA9IGRlZmF1bHRTdG9yZSB8fCBbXTtcblxuICAgICAgICB0aGlzLmFkZERhdGUgPSBmdW5jdGlvbihkYXRlKXtcbiAgICAgICAgICAgIHN0b3JlLnB1c2goeyBkYXRlIDogZGF0ZSB9KTtcbiAgICAgICAgICAgIHN0b3JlLnNvcnQoZnVuY3Rpb24oYSwgYil7XG4gICAgICAgICAgICAgICAgaWYgKERhdGUuY29tcGFyZShhLmRhdGUsIGIuZGF0ZSkgPiAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZURhdGUgPSBmdW5jdGlvbihkYXRlKXtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RvcmUubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIGlmIChEYXRlLmVxdWFscyhzdG9yZVtpXS5kYXRlLCBkYXRlKSl7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnNwbGljZShpLDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdldERhdGVzID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHJldHVybiAoc3RvcmUubGVuZ3RoID4gMCkgPyBzdG9yZSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZXREYXRlc0FycmF5ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHZhciBkYXRlcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdG9yZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgZGF0ZXMucHVzaChzdG9yZVtpXS5kYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkYXRlcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpZmZEYXRlcyA9IGZ1bmN0aW9uKGJpZ0Fyciwgc21hbGxBcnIpe1xuICAgICAgICAgICAgdmFyIHNob3VsZFJldHVybiA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJpZ0Fyci5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgc2hvdWxkUmV0dXJuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNtYWxsQXJyLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChEYXRlLmVxdWFscyhiaWdBcnJbaV0sIHNtYWxsQXJyW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmV0dXJuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFJldHVybikgcmV0dXJuIGJpZ0FycltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmRpcmVjdGl2ZSgnZGlzY3Vzc2lvbicsIGZ1bmN0aW9uKCR0aW1lb3V0LCBDb21tZW50LCBDb25maXJtTW9kYWwpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0IDogJ0EnLFxuICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9kaXNjdXNzaW9uLmh0bWwnLFxuICAgICAgICBzY29wZSA6IHtcbiAgICAgICAgICAgICdldmVudCcgOiAnPSdcbiAgICAgICAgfSxcbiAgICAgICAgbGluayA6IGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0cnMpe1xuICAgICAgICAgICAgc2NvcGUuY29tbWVudCA9IHt9O1xuICAgICAgICAgICAgdmFyIHRocmVhZCA9IGFuZ3VsYXIuZWxlbWVudCgnLmNvbW1lbnQtdGhyZWFkJyk7XG4gICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHRocmVhZC5zY3JvbGxUb3AodGhyZWFkLnByb3AoJ3Njcm9sbEhlaWdodCcpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2NvcGUuZGVsZXRlQ29tbWVudCA9IGZ1bmN0aW9uKGNvbW1lbnQpe1xuICAgICAgICAgICAgICAgIHZhciBtb2RhbCA9IG5ldyBDb25maXJtTW9kYWwoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZSA6ICdBcmUgeW91IHN1cmU/JyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgY29tbWVudD8nLFxuICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dCA6ICdZZXMgLSBkZWxldGUnLFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0IDogJ05vIC0gbmV2ZXJtaW5kJyxcbiAgICAgICAgICAgICAgICAgICAgaXNEZXN0cnVjdGl2ZSA6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm0gOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudC5yZW1vdmUoeyBpZCA6IHNjb3BlLmV2ZW50Ll9pZCAsIGNpZCA6IGNvbW1lbnQuX2lkIH0sIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5ldmVudCA9IGV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLnBvc3RDb21tZW50ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuY29tbWVudEZvcm0uJHZhbGlkKXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgQ29tbWVudChzY29wZS5jb21tZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudC4kc2F2ZSh7aWQ6c2NvcGUuZXZlbnQuX2lkfSwgZnVuY3Rpb24oZXZlbnQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuZXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmNvbW1lbnQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmNvbW1lbnRGb3JtLiRzZXRQcmlzdGluZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uZGlyZWN0aXZlKCdkcm9wZG93bicsIGZ1bmN0aW9uKCRkb2N1bWVudCl7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3QgOiAnQScsXG4gICAgICAgIGxpbmsgOiBmdW5jdGlvbihzY29wZSwgZWwsIGF0dHJzKXtcbiAgICAgICAgICAgIGVsLmFkZENsYXNzKCdkcm9wZG93bicpO1xuICAgICAgICAgICAgc2NvcGUub3BlbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICB2YXIgY2xpY2tIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQpe1xuICAgICAgICAgICAgICAgIHZhciBpc0NsaWNrZWRFbGVtZW50Q2hpbGRPZlBvcHVwID0gZWwuZmluZChldmVudC50YXJnZXQpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ2xpY2tlZEVsZW1lbnRDaGlsZE9mUG9wdXApIHJldHVybjtcbiAgICAgICAgICAgICAgICBzY29wZS50b2dnbGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2NvcGUudG9nZ2xlID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBzY29wZS5vcGVuID0gIXNjb3BlLm9wZW47XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLm9wZW4pe1xuICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcygnb3BlbicpO1xuICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnQuYmluZCgnY2xpY2snLCBjbGlja0hhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZUNsYXNzKCdvcGVuJyk7XG4gICAgICAgICAgICAgICAgICAgICRkb2N1bWVudC51bmJpbmQoJ2NsaWNrJywgY2xpY2tIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLnNlcnZpY2UoJ0Zvcm1IZWxwZXInLCBmdW5jdGlvbigpe1xuICAgIHRoaXMuZW1haWxSZWdleFN0cmluZyA9ICdeKFtcXFxcdy1cXFxcLl0rQChbXFxcXHctXStcXFxcLikrW1xcXFx3LV17Miw0fSk/JCc7XG4gICAgdGhpcy5lbWFpbFJlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLmVtYWlsUmVnZXhTdHJpbmcpO1xuICAgIHRoaXMucHJldHR5RXJyb3IgPSBmdW5jdGlvbihlcnJvcnMsIGZpZWxkKXtcbiAgICAgICAgaWYgKGVycm9ycy5yZXF1aXJlZCkgcmV0dXJuIGZpZWxkICsgXCIgaXMgcmVxdWlyZWRcIjtcbiAgICAgICAgaWYgKGVycm9ycy5wYXR0ZXJuKSByZXR1cm4gZmllbGQgKyBcIiBpcyBpbnZhbGlkXCIgO1xuICAgICAgICBpZiAoZXJyb3JzLm1heGxlbmd0aCkgcmV0dXJuIGZpZWxkICsgXCIgaXMgdG9vIGxvbmdcIjtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0pXG4uZGlyZWN0aXZlKCd1c2VyRm9ybScsIGZ1bmN0aW9uKEZvcm1IZWxwZXIpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgZXZlbnQgOiAnPScsXG4gICAgICAgICAgICBmb3JtIDogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9mb3JtL3VzZXJGb3JtLmh0bWwnLFxuICAgICAgICBsaW5rIDogZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRycykge1xuICAgICAgICAgICAgc2NvcGUuZXJyb3JzID0ge307XG5cbiAgICAgICAgICAgIHNjb3BlLmVtYWlsUmVnZXggPSBGb3JtSGVscGVyLmVtYWlsUmVnZXg7XG5cbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ2Zvcm0ubmFtZS4kZXJyb3InLGZ1bmN0aW9uKGVycm9ycyl7XG4gICAgICAgICAgICAgICAgc2NvcGUuZXJyb3JzLm5hbWUgPSBGb3JtSGVscGVyLnByZXR0eUVycm9yKGVycm9ycywgXCJOYW1lXCIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ2Zvcm0uZW1haWwuJGVycm9yJyxmdW5jdGlvbihlcnJvcnMpe1xuICAgICAgICAgICAgICAgIHNjb3BlLmVycm9ycy5lbWFpbCA9IEZvcm1IZWxwZXIucHJldHR5RXJyb3IoZXJyb3JzLCBcIkVtYWlsXCIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59KVxuLmRpcmVjdGl2ZSgnZXZlbnRGb3JtJywgZnVuY3Rpb24oRm9ybUhlbHBlcil7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICBldmVudCA6ICc9JyxcbiAgICAgICAgICAgIGZvcm0gOiAnPSdcbiAgICAgICAgfSxcbiAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2Zvcm0vZXZlbnRGb3JtLmh0bWwnLFxuICAgICAgICBsaW5rIDogZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRycykge1xuICAgICAgICAgICAgc2NvcGUuZXJyb3JzID0ge307XG5cbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ2Zvcm0udGl0bGUuJGVycm9yJyxmdW5jdGlvbihlcnJvcnMpe1xuICAgICAgICAgICAgICAgIHNjb3BlLmVycm9ycy50aXRsZSA9IEZvcm1IZWxwZXIucHJldHR5RXJyb3IoZXJyb3JzLCBcIlRpdGxlXCIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ2Zvcm0ubG9jYXRpb24uJGVycm9yJyxmdW5jdGlvbihlcnJvcnMpe1xuICAgICAgICAgICAgICAgIHNjb3BlLmVycm9ycy5sb2NhdGlvbiA9IEZvcm1IZWxwZXIucHJldHR5RXJyb3IoZXJyb3JzLCBcIkxvY2F0aW9uXCIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuICAgIH1cbn0pXG4uZGlyZWN0aXZlKCdkYXRlRm9ybScsIGZ1bmN0aW9uKCl7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICBldmVudCA6ICc9JyxcbiAgICAgICAgICAgIGZvcm0gOiAnPSdcbiAgICAgICAgfSxcbiAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2Zvcm0vZGF0ZUZvcm0uaHRtbCdcbiAgICB9XG59KVxuLmRpcmVjdGl2ZSgncGFydGljaXBhbnRzRm9ybScsIGZ1bmN0aW9uKEZvcm1IZWxwZXIpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgZXZlbnQgOiAnPScsXG4gICAgICAgICAgICBmb3JtIDogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9mb3JtL3BhcnRpY2lwYW50c0Zvcm0uaHRtbCcsXG4gICAgICAgIGxpbmsgOiBmdW5jdGlvbihzY29wZSwgZWwsIGF0dHJzKXtcbiAgICAgICAgICAgIHNjb3BlLmVtYWlsUmVnZXggPSBGb3JtSGVscGVyLmVtYWlsUmVnZXhTdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG59KVxuLmRpcmVjdGl2ZSgnc2V0dGluZ3NGb3JtJywgZnVuY3Rpb24oRXZlbnQsIENvbmZpcm1Nb2RhbCl7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICBldmVudCA6ICc9JyxcbiAgICAgICAgICAgIGZvcm0gOiAnPSdcbiAgICAgICAgfSxcbiAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2Zvcm0vc2V0dGluZ3NGb3JtLmh0bWwnLFxuICAgICAgICBsaW5rIDogZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRycyl7XG4gICAgICAgICAgICBzY29wZS5kZWxldGVFdmVudCA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmRlbGV0ZVJlcXVlc3RTZW50KSByZXR1cm47XG4gICAgICAgICAgICAgICAgRXZlbnQuZGVsZXRlKHsnaWQnIDogc2NvcGUuZXZlbnQuX2lkfSwgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuZGVsZXRlUmVxdWVzdFNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbW9kYWwgPSBuZXcgQ29uZmlybU1vZGFsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlIDogJ0RlbGV0ZSBSZXF1ZXN0IFNlbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6ICdBbiBlbWFpbCBoYXMgYmVlbiBzZW50IHRvIHRoZSBjcmVhdG9yIG9mIHRoaXMgZXZlbnQgd2l0aCBpbnN0cnVjdGlvbnMgdG8gZGVsZXRlIGl0LicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0IDogJ09LJ1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG4uZGlyZWN0aXZlKCdzd2l0Y2hUb2dnbGUnLCBmdW5jdGlvbigpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgbW9kZWwgOiAnPW5nTW9kZWwnXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVpcmUgOiAnbmdNb2RlbCcsXG4gICAgICAgIGxpbmsgOiBmdW5jdGlvbihzY29wZSwgZWwsIGF0dHJzLCBuZ01vZGVsKSB7XG4gICAgICAgICAgICBlbC5hZGRDbGFzcygnc3dpdGNoLXRvZ2dsZScpO1xuICAgICAgICAgICAgdmFyIHNldENsYXNzID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUubW9kZWwgXiB0eXBlb2YoYXR0cnMuaW52ZXJ0KSAhPT0gJ3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZWwucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaCgnbW9kZWwnLCBzZXRDbGFzcyk7XG4gICAgICAgICAgICBlbC5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKGUpe1xuICAgICAgICAgICAgICAgIHNjb3BlLm1vZGVsID0gIXNjb3BlLm1vZGVsO1xuICAgICAgICAgICAgICAgIG5nTW9kZWwuJHNldFZpZXdWYWx1ZShzY29wZS5tb2RlbCwgZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn0pXG4uZGlyZWN0aXZlKCd0aW1lRm9ybScsIGZ1bmN0aW9uKERhdGVQaWNrZXJTZXJ2aWNlKXtcbiAgICByZXR1cm4ge1xuICAgICAgICBzY29wZSA6IHtcbiAgICAgICAgICAgIGV2ZW50IDogJz0nLFxuICAgICAgICAgICAgZm9ybSA6ICc9J1xuICAgICAgICB9LFxuICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvZm9ybS90aW1lRm9ybS5odG1sJyxcbiAgICAgICAgbGluayA6IGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0cnMpe1xuICAgICAgICAgICAgdmFyIGluaXQgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBkYXRlU2VydmljZTtcbiAgICAgICAgICAgIHZhciBkZXJlZ2lzdGVyID0gc2NvcGUuJHdhdGNoKCdldmVudC5kYXRlcycsIGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgIWluaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVyZWdpc3RlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbml0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkYXRlU2VydmljZSA9IG5ldyBEYXRlUGlja2VyU2VydmljZShzY29wZS5ldmVudC5kYXRlcyk7XG4gICAgICAgICAgICAgICAgc2NvcGUudW5zZXREYXRlID0gZnVuY3Rpb24oZGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIGRhdGVTZXJ2aWNlLnJlbW92ZURhdGUoZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59KVxuLmRpcmVjdGl2ZSgndGltZVBpY2tlcicsIGZ1bmN0aW9uKCR0aW1lb3V0KXtcbiAgICByZXR1cm4ge1xuICAgICAgICBzY29wZSA6IHtcbiAgICAgICAgICAgIG1vZGVsIDogJz1uZ01vZGVsJ1xuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlIDogJ25nTW9kZWwnLFxuICAgICAgICBsaW5rIDogZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRycywgbmdNb2RlbCl7XG4gICAgICAgICAgICBuZ01vZGVsLiR2aWV3Q2hhbmdlTGlzdGVuZXJzLnB1c2goZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBzY29wZS5tb2RlbCA9IG5nTW9kZWwuJG1vZGVsVmFsdWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbmdNb2RlbC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHJldHVybjtcbiAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZS5wYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbmdNb2RlbC4kdmFsaWRhdG9ycy50aW1lID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlKXtcbiAgICAgICAgICAgICAgICBpZiAobmdNb2RlbC4kaXNFbXB0eShtb2RlbFZhbHVlKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIHRpbWUgPSBEYXRlLnBhcnNlKG1vZGVsVmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICh0aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIG5nTW9kZWwuJHNldFZpZXdWYWx1ZSh0aW1lLnRvU3RyaW5nKFwiaGg6bW0gdHRcIikpO1xuICAgICAgICAgICAgICAgICAgICBuZ01vZGVsLiRyZW5kZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uZGlyZWN0aXZlKCdwb2xsJywgZnVuY3Rpb24oJHRpbWVvdXQsIFBhcnRpY2lwYW50LCBDb25maXJtTW9kYWwpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0IDogJ0EnLFxuICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9wb2xsLmh0bWwnLFxuICAgICAgICBzY29wZSA6IHtcbiAgICAgICAgICAgICdldmVudCcgOiAnPSdcbiAgICAgICAgfSxcbiAgICAgICAgbGluayA6IGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0cnMpe1xuICAgICAgICAgICAgc2NvcGUuZGVmYXVsdHMgPSBbXTtcbiAgICAgICAgICAgIHNjb3BlLnBhcnRpY2lwYW50ID0ge307XG4gICAgICAgICAgICB2YXIgZGF0ZXNDb3VudCA9IFtdO1xuICAgICAgICAgICAgdmFyIHVuYmluZExpc3RlbmVyO1xuICAgICAgICAgICAgc2NvcGUuZXZlbnQuJHByb21pc2UudGhlbihmdW5jdGlvbihldmVudCl7XG4gICAgICAgICAgICAgICAgdmFyIGV4YW1wbGVzTmFtZXMgPSBbJ0pvaG4gRXhhbXBsZScsICdKYW5lIFNwZWNpbWVuJywnTWFyayBJbnN0YW5jZScsICdNYXJ5IENhc2UnXTtcbiAgICAgICAgICAgICAgICB2YXIgZXhhbXBsZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4YW1wbGVzTmFtZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhhbXBsZSA9IHsgbmFtZSA6IGV4YW1wbGVzTmFtZXNbaV0gfTtcbiAgICAgICAgICAgICAgICAgICAgZXhhbXBsZS5kYXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8ICBldmVudC5kYXRlcy5sZW5ndGg7IGorKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYW5zd2VyID0gTWF0aC5yYW5kb20oKTwuNTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGUuZGF0ZXNbal0gPSBhbnN3ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZXhhbXBsZXMucHVzaChleGFtcGxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2NvcGUuZXhhbXBsZXMgPSBleGFtcGxlcztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBzY29wZS5kZWxldGUgPSBmdW5jdGlvbihwYXJ0aWNpcGFudCl7XG4gICAgICAgICAgICAgICAgdmFyIG1vZGFsID0gbmV3IENvbmZpcm1Nb2RhbCh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlIDogJ0RlbGV0ZSAnICsgcGFydGljaXBhbnQubmFtZSArICc/JyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlICcrcGFydGljaXBhbnQubmFtZSsnIGZyb20gdGhlIHBvbGw/JyxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQgOiAnWWVzIC0gZGVsZXRlJyxcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dCA6ICdObyAtIG5ldmVybWluZCcsXG4gICAgICAgICAgICAgICAgICAgIGlzRGVzdHJ1Y3RpdmUgOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maXJtIDogZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpY2lwYW50LnJlbW92ZSh7IGlkIDogc2NvcGUuZXZlbnQuX2lkICwgcGlkIDogcGFydGljaXBhbnQuX2lkIH0sIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5ldmVudCA9IGV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLmlzVG9wRGF0ZSA9IGZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBkYXRlc0NvdW50W2luZGV4XTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGVzQ291bnQubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZXNDb3VudFtpXSA+IGNvdW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuc2VsZWN0ZWREYXRlID0gZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICAgICAgICAgIGRhdGVzQ291bnRbaW5kZXhdID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjb3BlLmV2ZW50LnBhcnRpY2lwYW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5ldmVudC5wYXJ0aWNpcGFudHNbaV0uZGF0ZXNbaW5kZXhdKSBkYXRlc0NvdW50W2luZGV4XSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXNDb3VudFtpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS51cGRhdGUgPSBmdW5jdGlvbihwYXJ0aWNpcGFudCl7XG4gICAgICAgICAgICAgICAgUGFydGljaXBhbnQudXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQgOiBzY29wZS5ldmVudC5faWQsXG4gICAgICAgICAgICAgICAgICAgIHBpZCA6IHBhcnRpY2lwYW50Ll9pZFxuICAgICAgICAgICAgICAgIH0sIHBhcnRpY2lwYW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLmVkaXQgPSBmdW5jdGlvbihwYXJ0aWNpcGFudCl7XG4gICAgICAgICAgICAgICAgc2NvcGUuZGVmYXVsdHNbc2NvcGUuZXZlbnQucGFydGljaXBhbnRzLmluZGV4T2YocGFydGljaXBhbnQpXSA9IGFuZ3VsYXIuY29weShwYXJ0aWNpcGFudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5jYW5jZWwgPSBmdW5jdGlvbihpbmRleCl7XG4gICAgICAgICAgICAgICAgc2NvcGUuZXZlbnQucGFydGljaXBhbnRzW2luZGV4XSA9IHNjb3BlLmRlZmF1bHRzW2luZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLnNhdmUgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS5mb3JtbmV3LiR2YWxpZCl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJ0aWNpcGFudCA9IG5ldyBQYXJ0aWNpcGFudChzY29wZS5wYXJ0aWNpcGFudCk7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50LiRzYXZlKHtpZDpzY29wZS5ldmVudC5faWR9LCBmdW5jdGlvbihldmVudCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5ldmVudCA9IGV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUucGFydGljaXBhbnQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmZvcm1uZXcuJHNldFByaXN0aW5lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSk7XG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5maWx0ZXIoJ2VsYXBzZWQnLCBmdW5jdGlvbigkZmlsdGVyKXtcbiAgICByZXR1cm4gZnVuY3Rpb24oZGF0ZSl7XG4gICAgICAgIGlmICghZGF0ZSkgcmV0dXJuO1xuICAgICAgICB2YXIgdGltZSA9IERhdGUucGFyc2UoZGF0ZSksXG4gICAgICAgICAgICB0aW1lTm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCksXG4gICAgICAgICAgICBkaWZmZXJlbmNlID0gdGltZU5vdyAtIHRpbWUsXG4gICAgICAgICAgICBzZWNvbmRzID0gTWF0aC5mbG9vcihkaWZmZXJlbmNlIC8gMTAwMCksXG4gICAgICAgICAgICBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApLFxuICAgICAgICAgICAgaG91cnMgPSBNYXRoLmZsb29yKG1pbnV0ZXMgLyA2MCksXG4gICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihob3VycyAvIDI0KTtcbiAgICAgICAgaWYgKGRheXMgPiAzMCkge1xuICAgICAgICAgICAgcmV0dXJuICdvbiAnICsgJGZpbHRlcignZGF0ZScpKGRhdGUsICdNTU1NIGQnKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXlzID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGRheXMgKyBcIiBkYXlzIGFnb1wiO1xuICAgICAgICB9IGVsc2UgaWYgKGRheXMgPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiMSBkYXkgYWdvXCJcbiAgICAgICAgfSBlbHNlIGlmIChob3VycyA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBob3VycyArIFwiIGhvdXJzIGFnb1wiO1xuICAgICAgICB9IGVsc2UgaWYgKGhvdXJzID09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBcImFuIGhvdXIgYWdvXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlcyA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBtaW51dGVzICsgXCIgbWludXRlcyBhZ29cIjtcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGVzID09IDEpe1xuICAgICAgICAgICAgcmV0dXJuIFwiYSBtaW51dGUgYWdvXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXCJhIGZldyBzZWNvbmRzIGFnb1wiO1xuICAgICAgICB9XG4gICAgfVxufSlcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmZhY3RvcnkoJ0NvbmZpcm1Nb2RhbCcsIGZ1bmN0aW9uKGJ0Zk1vZGFsKXtcblxuICAgIHJldHVybiBmdW5jdGlvbihjb25maWcpe1xuICAgICAgICB2YXIgbW9kYWw7XG4gICAgICAgIG1vZGFsID0gYnRmTW9kYWwoe1xuICAgICAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2NvbmZpcm1tb2RhbC5odG1sJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBcyA6ICdtb2RhbCcsXG4gICAgICAgICAgICBjb250cm9sbGVyIDogZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICB0aGlzLnRpdGxlID0gY29uZmlnLnRpdGxlXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gY29uZmlnLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maXJtID0gKGNvbmZpZy5jb25maXJtKSA/IGZ1bmN0aW9uKCl7Y29uZmlnLmNvbmZpcm0oKTsgbW9kYWwuZGVhY3RpdmF0ZSgpfSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsID0gbW9kYWwuZGVhY3RpdmF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpcm1UZXh0ID0gY29uZmlnLmNvbmZpcm1UZXh0IHx8ICdDb25maXJtJztcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbFRleHQgPSBjb25maWcuY2FuY2VsVGV4dCB8fCAnQ2FuY2VsJztcbiAgICAgICAgICAgICAgICB0aGlzLmlzRGVzdHJ1Y3RpdmUgPSBjb25maWcuaXNEZXN0cnVjdGl2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG1vZGFsLmFjdGl2YXRlKCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgbW9kYWwuZGVhY3RpdmF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5mYWN0b3J5KCdOb3RpZmljYXRpb24nLCBmdW5jdGlvbigkdGltZW91dCwgYnRmTW9kYWwpe1xuICAgIHJldHVybiBmdW5jdGlvbihjb25maWcpe1xuICAgICAgICB2YXIgbW9kYWw7XG4gICAgICAgIG1vZGFsID0gYnRmTW9kYWwoe1xuICAgICAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL25vdGlmaWNhdGlvbi5odG1sJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBcyA6ICdub3RpZmljYXRpb24nLFxuICAgICAgICAgICAgY29udHJvbGxlciA6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgdGhpcy50aXRsZSA9IGNvbmZpZy50aXRsZVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGNvbmZpZy5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UgPSBtb2RhbC5kZWFjdGl2YXRlO1xuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IGNvbmZpZy50eXBlO1xuICAgICAgICAgICAgICAgIHZhciB0aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQgfHwgNTAwMDtcbiAgICAgICAgICAgICAgICAkdGltZW91dChtb2RhbC5kZWFjdGl2YXRlLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG1vZGFsLmFjdGl2YXRlKCk7XG5cbiAgICAgICAgdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIG1vZGFsLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9