@discordeno/rest 19.0.0-next.024fbe3 → 19.0.0-next.05fc3fb

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/manager.js CHANGED
@@ -1,2 +1,1577 @@
1
- import{InteractionResponseTypes as e}from"@discordeno/types";import{camelize as t,delay as a,getBotIdFromToken as s,urlToBase64 as i}from"@discordeno/utils";import{createInvalidRequestBucket as n}from"./invalidBucket.js";import{Queue as o}from"./queue.js";export function createRestManager(r){let l={token:r.token,applicationId:r.applicationId?BigInt(r.applicationId):s(r.token),version:r.version??10,baseUrl:r.baseUrl??"https://discord.com/api",maxRetryCount:1/0,globallyRateLimited:!1,processingRateLimitedPaths:!1,queues:new Map,rateLimitedPaths:new Map,invalidBucket:n({}),routes:{webhooks:{id:e=>`/webhooks/${e}`,message:(e,t,a,s)=>{let i=`/webhooks/${e}/${t}/messages/${a}?`;return s&&s.threadId&&(i+=`thread_id=${s.threadId}`),i},original:(e,t,a)=>{let s=`/webhooks/${e}/${t}/messages/@original?`;return a&&a.threadId&&(s+=`thread_id=${a.threadId}`),s},webhook:(e,t,a)=>{let s=`/webhooks/${e}/${t}?`;return a&&(a?.wait!==void 0&&(s+=`wait=${a.wait.toString()}`),a.threadId&&(s+=`thread_id=${a.threadId}`)),s}},sessionInfo:()=>l.routes.gatewayBot(),channels:{dm:()=>"/users/@me/channels",webhooks:e=>`/channels/${e}/webhooks`,channel:e=>`/channels/${e}`,follow:e=>`/channels/${e}/followers`,forum:e=>`/channels/${e}/threads?has_message=true`,invites:e=>`/channels/${e}/invites`,message:(e,t)=>`/channels/${e}/messages/${t}`,messages:(e,t)=>{let a=`/channels/${e}/messages?`;return a},overwrite:(e,t)=>`/channels/${e}/permissions/${t}`,crosspost:(e,t)=>`/channels/${e}/messages/${t}/crosspost`,stages:()=>"/stage-instances",stage:e=>`/stage-instances/${e}`,threads:{message:(e,t)=>`/channels/${e}/messages/${t}/threads`,all:e=>`/channels/${e}/threads`,active:e=>`/guilds/${e}/threads/active`,members:e=>`/channels/${e}/thread-members`,me:e=>`/channels/${e}/thread-members/@me`,user:(e,t)=>`/channels/${e}/thread-members/${t}`,archived:e=>`/channels/${e}/threads/archived`,public:(e,t)=>{let a=`/channels/${e}/threads/archived/public?`;return t&&(t.before&&(a+=`before=${new Date(t.before).toISOString()}`),t.limit&&(a+=`&limit=${t.limit}`)),a},private:(e,t)=>{let a=`/channels/${e}/threads/archived/private?`;return t&&(t.before&&(a+=`before=${new Date(t.before).toISOString()}`),t.limit&&(a+=`&limit=${t.limit}`)),a},joined:(e,t)=>{let a=`/channels/${e}/users/@me/threads/archived/private?`;return t&&(t.before&&(a+=`before=${new Date(t.before).toISOString()}`),t.limit&&(a+=`&limit=${t.limit}`)),a}},typing:e=>`/channels/${e}/typing`},guilds:{automod:{rule:(e,t)=>`/guilds/${e}/auto-moderation/rules/${t}`,rules:e=>`/guilds/${e}/auto-moderation/rules`},channels:e=>`/guilds/${e}/channels`,emoji:(e,t)=>`/guilds/${e}/emojis/${t}`,emojis:e=>`/guilds/${e}/emojis`,events:{events:(e,t)=>{let a=`/guilds/${e}/scheduled-events?`;return void 0!==t&&(a+=`with_user_count=${t.toString()}`),a},event:(e,t,a)=>{let s=`/guilds/${e}/scheduled-events/${t}`;return void 0!==a&&(s+=`with_user_count=${a.toString()}`),s},users:(e,t,a)=>{let s=`/guilds/${e}/scheduled-events/${t}/users?`;return a&&(void 0!==a.limit&&(s+=`limit=${a.limit}`),void 0!==a.withMember&&(s+=`&with_member=${a.withMember.toString()}`),void 0!==a.after&&(s+=`&after=${a.after}`),void 0!==a.before&&(s+=`&before=${a.before}`)),s}},integration:(e,t)=>`/guilds/${e}/integrations/${t}`,integrations:e=>`/guilds/${e}/integrations?include_applications=true`,invite(e,t){let a=`/invites/${e}?`;return t&&(void 0!==t.withCounts&&(a+=`with_counts=${t.withCounts.toString()}`),void 0!==t.withExpiration&&(a+=`&with_expiration=${t.withExpiration.toString()}`),t.scheduledEventId&&(a+=`&guild_scheduled_event_id=${t.scheduledEventId}`)),a},invites:e=>`/guilds/${e}/invites`,members:{ban:(e,t)=>`/guilds/${e}/bans/${t}`,bot:e=>`/guilds/${e}/members/@me`,member:(e,t)=>`/guilds/${e}/members/${t}`,members:(e,t)=>{let a=`/guilds/${e}/members?`;return void 0!==t&&(t.limit&&(a+=`limit=${t.limit}`),t.after&&(a+=`&after=${t.after}`)),a},search:(e,t,a)=>{let s=`/guilds/${e}/members/search?query=${encodeURIComponent(t)}`;return a&&void 0!==a.limit&&(s+=`&limit=${a.limit}`),s},prune:(e,t)=>{let a=`/guilds/${e}/prune?`;return t&&(t.days&&(a+=`days=${t.days}`),Array.isArray(t.includeRoles)?a+=`&include_roles=${t.includeRoles.join(",")}`:t.includeRoles&&(a+=`&include_roles=${t.includeRoles}`)),a}},templates:{code:e=>`/guilds/templates/${e}`,guild:(e,t)=>`/guilds/${e}/templates/${t}`,all:e=>`/guilds/${e}/templates`},webhooks:e=>`/guilds/${e}/webhooks`},interactions:{commands:{commands:e=>`/applications/${e}/commands`,guilds:{all:(e,t)=>`/applications/${e}/guilds/${t}/commands`,one(e,t,a,s){let i=`/applications/${e}/guilds/${t}/commands/${a}?`;return void 0!==s&&(i+=`with_localizations=${s.toString()}`),i}},permissions:(e,t)=>`/applications/${e}/guilds/${t}/commands/permissions`,permission:(e,t,a)=>`/applications/${e}/guilds/${t}/commands/${a}/permissions`,command:(e,t,a)=>{let s=`/applications/${e}/commands/${t}?`;return void 0!==a&&(s+=`withLocalizations=${a.toString()}`),s}},responses:{callback:(e,t)=>`/interactions/${e}/${t}/callback`,original:(e,t)=>`/webhooks/${e}/${t}/messages/@original`,message:(e,t,a)=>`/webhooks/${e}/${t}/messages/${a}`}},user:e=>`/users/${e}`,userBot:()=>"/users/@me",oauth2Application:()=>"oauth2/applications/@me",gatewayBot:()=>"/gateway/bot",nitroStickerPacks:()=>"/sticker-packs"},checkRateLimits(e){let t=l.rateLimitedPaths.get(e),a=l.rateLimitedPaths.get("global"),s=Date.now();return t&&s<t.resetTimestamp?t.resetTimestamp-s:!!a&&s<a.resetTimestamp&&a.resetTimestamp-s},createRequest(e){let t={"user-agent":"DiscordBot (https://github.com/discordeno/discordeno, v19.0.0-alpha.1)"};if(e.unauthorized||(t.authorization=`Bot ${l.token}`),e.headers)for(let a in e.headers)t[a.toLowerCase()]=e.headers[a];return"GET"===e.method&&(e.body=void 0),e.body?.reason&&(t["X-Audit-Log-Reason"]=encodeURIComponent(e.body.reason),e.body.reason=void 0),e.body&&!["GET","DELETE"].includes(e.method)&&(t["Content-Type"]="application/json"),{headers:t,body:e.body?.file??JSON.stringify(e.body),method:e.method}},processRateLimitedPaths(){let e=Date.now();for(let[t,a]of l.rateLimitedPaths.entries())a.resetTimestamp>e||(l.rateLimitedPaths.delete(t),"global"!==t||(l.globallyRateLimited=!1));0===l.rateLimitedPaths.size?l.processingRateLimitedPaths=!1:(l.processingRateLimitedPaths=!0,setTimeout(()=>{l.processRateLimitedPaths()},1e3))},processHeaders(e,t){let a=!1,s=t.get("x-ratelimit-remaining"),i=t.get("x-ratelimit-reset-after"),n=Date.now()+1e3*Number(i),o=t.get("x-ratelimit-global"),r=t.get("x-ratelimit-bucket")??void 0,c=t.get("x-ratelimit-limit");if(l.queues.get(e)?.handleCompletedRequest({remaining:s?Number(s):void 0,interval:i?1e3*Number(i):void 0,max:c?Number(c):void 0}),"0"===s&&(a=!0,l.rateLimitedPaths.set(e,{url:e,resetTimestamp:n,bucketId:r}),r&&l.rateLimitedPaths.set(r,{url:e,resetTimestamp:n,bucketId:r})),o){let d=t.get("retry-after"),u=Date.now()+1e3*Number(d);l.globallyRateLimited=!0,a=!0,setTimeout(()=>{l.globallyRateLimited=!1},u),l.rateLimitedPaths.set("global",{url:"global",resetTimestamp:u,bucketId:r}),r&&l.rateLimitedPaths.set(r,{url:"global",resetTimestamp:u,bucketId:r})}return a&&!l.processingRateLimitedPaths&&l.processRateLimitedPaths(),a?r:void 0},async sendRequest(e){let t=await fetch(e.url,l.createRequest({method:e.method,url:e.url,body:e.body,...e.options})),s=l.processHeaders(l.simplifyUrl(e.url,e.method),t.headers);if(s&&(e.bucketId=s),(t.status<200||t.status>=400)&&429===t.status){if(e.retryCount++>=l.maxRetryCount)return e.reject?.({ok:!1,status:t.status,error:"The options was rate limited and it maxed out the retries limit."});l.invalidBucket.handleCompletedRequest(t.status,"shared"===t.headers.get("X-RateLimit-Scope"));let i=t.headers.get("x-ratelimit-reset-after");return i&&await a(1e3*Number(i)),await e.retryRequest?.(e)}e.resolve(await t.json())},simplifyUrl(e,t){let a=e.replace(/\/([a-z-]+)\/(?:[0-9]{17,19})/g,function(e,t){return["channels","guilds"].includes(t)?e:`/${t}/x`}).replace(/\/reactions\/[^/]+/g,"/reactions/x");return a.includes("/reactions")&&(a=a.substring(0,a.indexOf("/reactions")+10)),"DELETE"===t&&a.endsWith("/messages/x")&&(a=t+a),a},processRequest(e){let t=e.url.substring(e.url.indexOf("api/")),a=t.split("/");a.shift(),a[0]?.startsWith("v")&&a.shift(),e.url=`${l.baseUrl}/v${l.version}/${a.join("/")}`;let s=l.simplifyUrl(e.url,e.method),i=l.queues.get(s);if(void 0!==i)i.makeRequest(e);else{let n=new o(l,{url:s});n.makeRequest(e),l.queues.set(s,n)}},makeRequest:async(e,t,a,s)=>await new Promise((i,n)=>{l.processRequest({url:t,method:e,body:a,retryCount:0,retryRequest:async function(e){await l.sendRequest(e)},resolve:i,reject:n,options:s})}),get:async e=>t(await l.makeRequest("GET",e)),post:async(e,a)=>t(await l.makeRequest("POST",e,a)),delete:async(e,a)=>t(await l.makeRequest("DELETE",e,a)),patch:async(e,a)=>t(await l.makeRequest("PATCH",e,a)),put:async(e,a,s)=>t(await l.makeRequest("PUT",e,a,s)),channels:{messages:{delete:async(e,t,a)=>await l.deleteMessage(e,t,a),edit:async(e,t,a)=>await l.editMessage(e,t,a),send:async(e,t)=>await l.sendMessage(e,t),publish:async(e,t)=>await l.publishMessage(e,t)},get:async e=>await l.getChannel(e),create:async(e,t)=>await l.createChannel(e,t),delete:async(e,t)=>await l.deleteChannel(e,t),edit:async(e,t)=>await l.editChannel(e,t),follow:async(e,t)=>await l.followAnnouncement(e,t),forums:{post:async(e,t)=>await l.createForumThread(e,t)},permissions:{edit:async(e,t)=>await l.editChannelPermissionOverrides(e,t),delete:async(e,t)=>await l.deleteChannelPermissionOverride(e,t)},positions:async(e,t)=>await l.editChannelPositions(e,t),invites:async e=>await l.getChannelInvites(e),stages:{create:async e=>await l.createStageInstance(e),delete:async(e,t)=>await l.deleteStageInstance(e,t),edit:async(e,t)=>await l.editStageInstance(e,t),get:async e=>await l.getStageInstance(e)},threads:{create:{with:{message:async(e,t,a)=>await l.startThreadWithMessage(e,t,a)},without:{message:async(e,t)=>await l.startThreadWithoutMessage(e,t)}},get:{active:async e=>await l.getActiveThreads(e),archived:{private:async(e,t)=>await l.getPrivateArchivedThreads(e,t),joined:async(e,t)=>await l.getPrivateJoinedArchivedThreads(e,t),public:async(e,t)=>await l.getPublicArchivedThreads(e,t)},member:async(e,t)=>await l.getThreadMember(e,t),members:async e=>await l.getThreadMembers(e)},join:async e=>await l.joinThread(e),leave:async e=>await l.leaveThread(e),kick:async(e,t)=>await l.removeThreadMember(e,t)},typing:async e=>await l.triggerTypingIndicator(e)},emojis:{create:async(e,t)=>await l.createEmoji(e,t),delete:async(e,t,a)=>await l.deleteEmoji(e,t,a),edit:async(e,t,a)=>await l.editEmoji(e,t,a),get:async(e,t)=>await l.getEmoji(e,t)},guilds:{automod:{create:async(e,t)=>await l.createAutomodRule(e,t),delete:async(e,t)=>await l.deleteAutomodRule(e,t),edit:async(e,t,a)=>await l.editAutomodRule(e,t,a),get:{rule:async(e,t)=>await l.getAutomodRule(e,t),rules:async e=>await l.getAutomodRules(e)}},channels:async e=>await l.getChannels(e),emojis:async e=>await l.getEmojis(e),events:{create:async(e,t)=>await l.createScheduledEvent(e,t),delete:async(e,t)=>await l.deleteScheduledEvent(e,t),edit:async(e,t,a)=>await l.editScheduledEvent(e,t,a),get:{event:async(e,t,a)=>await l.getScheduledEvent(e,t,a),events:async(e,t)=>await l.getScheduledEvents(e,t),users:async(e,t,a)=>await l.getScheduledEventUsers(e,t,a)}},integrations:{get:async e=>await l.getIntegrations(e),delete:async(e,t)=>await l.deleteIntegration(e,t)},invites:{create:async(e,t)=>await l.createInvite(e,t),delete:async(e,t)=>await l.deleteInvite(e,t),get:async(e,t)=>await l.getInvite(e,t),list:async e=>await l.getInvites(e)},templates:{create:async(e,t)=>await l.createGuildTemplate(e,t),delete:async(e,t)=>await l.deleteGuildTemplate(e,t),edit:async(e,t,a)=>await l.editGuildTemplate(e,t,a),get:async e=>await l.getGuildTemplate(e),list:async e=>await l.getGuildTemplates(e),sync:async e=>await l.syncGuildTemplate(e)},members:{ban:async(e,t,a)=>await l.banMember(e,t,a),edit:async(e,t,a)=>await l.editMember(e,t,a),editSelf:async(e,t)=>await l.editBotMember(e,t),get:async(e,t)=>await l.getMember(e,t),dm:async e=>await l.getDmChannel(e),kick:async(e,t,a)=>await l.kickMember(e,t,a),list:async(e,t)=>await l.getMembers(e,t),prune:async(e,t)=>await l.pruneMembers(e,t),search:async(e,t,a)=>await l.searchMembers(e,t,a),unban:async(e,t)=>await l.unbanMember(e,t)},interactions:{commands:{create:{global:async e=>await l.createGlobalApplicationCommand(e),guild:async(e,t)=>await l.createGuildApplicationCommand(e,t)},delete:{global:async e=>await l.deleteGlobalApplicationCommand(e),guild:async(e,t)=>await l.deleteGuildApplicationCommand(e,t)},edit:{global:async(e,t)=>await l.editGlobalApplicationCommand(e,t),guild:async(e,t,a)=>await l.editGuildApplicationCommand(e,t,a),permissions:async(e,t,a,s)=>await l.editApplicationCommandPermissions(e,t,a,s)},get:{global:{all:async()=>await l.getGlobalApplicationCommands(),one:async e=>await l.getGlobalApplicationCommand(e)},guilds:{all:async e=>await l.getGuildApplicationCommands(e),one:async(e,t)=>await l.getGuildApplicationCommand(e,t)},permission:async(e,t)=>await l.getApplicationCommandPermission(e,t),permissions:async e=>await l.getApplicationCommandPermissions(e)},replace:{global:async e=>await l.upsertGlobalApplicationCommands(e),guild:async(e,t)=>await l.upsertGuildApplicationCommands(e,t)}},responses:{create:{followup:async(e,t)=>await l.sendFollowupMessage(e,t),original:async(e,t,a)=>await l.sendInteractionResponse(e,t,a)},delete:{followup:async(e,t)=>await l.deleteFollowupMessage(e,t),original:async e=>await l.deleteOriginalInteractionResponse(e)},edit:{followup:async(e,t,a)=>await l.editFollowupMessage(e,t,a),original:async(e,t)=>await l.editOriginalInteractionResponse(e,t)},get:{followup:async(e,t)=>await l.getFollowupMessage(e,t),original:async e=>await l.getOriginalInteractionResponse(e)}}}},users:{channel:async e=>await l.getDmChannel(e)},webhooks:{create:async(e,t)=>await l.createWebhook(e,t),delete:{with:{id:async(e,t)=>await l.deleteWebhook(e,t),token:async(e,t)=>await l.deleteWebhookWithToken(e,t)}},edit:{with:{id:async(e,t)=>await l.editWebhook(e,t),token:async(e,t,a)=>await l.editWebhookWithToken(e,t,a)}},execute:async(e,t,a)=>await l.executeWebhook(e,t,a),get:{channel:async e=>await l.getChannelWebhooks(e),guild:async e=>await l.getGuildWebhooks(e),message:async(e,t,a,s)=>await l.getWebhookMessage(e,t,a,s),with:{id:async e=>await l.getWebhook(e),token:async(e,t)=>await l.getWebhookWithToken(e,t)}},messages:{delete:async(e,t,a,s)=>await l.deleteWebhookMessage(e,t,a,s),edit:Object.assign(async(e,t,a,s)=>await l.editWebhookMessage(e,t,a,s),{original:async(e,t,a)=>await l.editOriginalWebhookMessage(e,t,a)})}},addThreadMember:async(e,t)=>await l.put(l.routes.channels.threads.user(e,t)),createAutomodRule:async(e,t)=>await l.post(l.routes.guilds.automod.rules(e),t),createChannel:async(e,t)=>await l.post(l.routes.guilds.channels(e),t),createEmoji:async(e,t)=>await l.post(l.routes.guilds.emojis(e),t),createGlobalApplicationCommand:async e=>await l.post(l.routes.interactions.commands.commands(l.applicationId),e),createGuildApplicationCommand:async(e,t)=>await l.post(l.routes.interactions.commands.guilds.all(l.applicationId,t),e),createGuildTemplate:async(e,t)=>await l.post(l.routes.guilds.templates.all(e),t),createForumThread:async(e,t)=>await l.post(l.routes.channels.forum(e),t),createInvite:async(e,t={})=>await l.post(l.routes.channels.invites(e),t),createScheduledEvent:async(e,t)=>await l.post(l.routes.guilds.events.events(e),t),createStageInstance:async e=>await l.post(l.routes.channels.stages(),e),createWebhook:async(e,t)=>await l.post(l.routes.channels.webhooks(e),{name:t.name,avatar:t.avatar?await i(t.avatar):void 0,reason:t.reason}),deleteAutomodRule:async(e,t,a)=>await l.delete(l.routes.guilds.automod.rule(e,t),{reason:a}),deleteChannel:async(e,t)=>await l.delete(l.routes.channels.channel(e),{reason:t}),deleteChannelPermissionOverride:async(e,t,a)=>await l.delete(l.routes.channels.overwrite(e,t),a?{reason:a}:void 0),deleteEmoji:async(e,t,a)=>await l.delete(l.routes.guilds.emoji(e,t),{reason:a}),deleteFollowupMessage:async(e,t)=>await l.delete(l.routes.interactions.responses.message(l.applicationId,e,t)),deleteGlobalApplicationCommand:async e=>await l.delete(l.routes.interactions.commands.command(l.applicationId,e)),deleteGuildApplicationCommand:async(e,t)=>await l.delete(l.routes.interactions.commands.guilds.one(l.applicationId,t,e)),deleteGuildTemplate:async(e,t)=>await l.delete(l.routes.guilds.templates.guild(e,t)),deleteIntegration:async(e,t)=>await l.delete(l.routes.guilds.integration(e,t)),deleteInvite:async(e,t)=>await l.delete(l.routes.guilds.invite(e),t?{reason:t}:void 0),deleteMessage:async(e,t,a)=>await l.delete(l.routes.channels.message(e,t),{reason:a}),deleteOriginalInteractionResponse:async e=>await l.delete(l.routes.interactions.responses.original(l.applicationId,e)),deleteScheduledEvent:async(e,t)=>await l.delete(l.routes.guilds.events.event(e,t)),deleteStageInstance:async(e,t)=>await l.delete(l.routes.channels.stage(e),t?{reason:t}:void 0),deleteWebhook:async(e,t)=>await l.delete(l.routes.webhooks.id(e),{reason:t}),deleteWebhookMessage:async(e,t,a,s)=>await l.delete(l.routes.webhooks.message(e,t,a,s)),deleteWebhookWithToken:async(e,t)=>await l.delete(l.routes.webhooks.webhook(e,t)),editApplicationCommandPermissions:async(e,t,a,s)=>await l.put(l.routes.interactions.commands.permission(l.applicationId,e,t),{permissions:s},{headers:{authorization:`Bearer ${a}`}}),editAutomodRule:async(e,t,a)=>await l.patch(l.routes.guilds.automod.rule(e,t),a),async editBotProfile(e){let t=e?.botAvatarURL?await i(e?.botAvatarURL):e?.botAvatarURL;return await l.patch(l.routes.userBot(),{username:e.username?.trim(),avatar:t})},editChannel:async(e,t)=>await l.patch(l.routes.channels.channel(e),t),editChannelPermissionOverrides:async(e,t)=>await l.put(l.routes.channels.overwrite(e,t.id),t),editChannelPositions:async(e,t)=>await l.patch(l.routes.guilds.channels(e),t),editEmoji:async(e,t,a)=>await l.patch(l.routes.guilds.emoji(e,t),a),editFollowupMessage:async(e,t,a)=>await l.patch(l.routes.interactions.responses.message(l.applicationId,e,t),a),editGlobalApplicationCommand:async(e,t)=>await l.patch(l.routes.interactions.commands.command(l.applicationId,e),t),editGuildApplicationCommand:async(e,t,a)=>await l.patch(l.routes.interactions.commands.guilds.one(l.applicationId,t,e),a),editGuildTemplate:async(e,t,a)=>await l.patch(l.routes.guilds.templates.guild(e,t),a),editMessage:async(e,t,a)=>await l.patch(l.routes.channels.message(e,t),a),editOriginalInteractionResponse:async(e,t)=>await l.patch(l.routes.interactions.responses.original(l.applicationId,e),t),editOriginalWebhookMessage:async(t,a,s)=>await l.patch(l.routes.webhooks.original(t,a,s),{type:e.UpdateMessage,data:s}),editScheduledEvent:async(e,t,a)=>await l.patch(l.routes.guilds.events.event(e,t),a),editStageInstance:async(e,t)=>await l.patch(l.routes.channels.stage(e),{topic:t.topic}),editWebhook:async(e,t)=>await l.patch(l.routes.webhooks.id(e),t),editWebhookMessage:async(t,a,s,i)=>await l.patch(l.routes.webhooks.message(t,a,s,i),{type:e.UpdateMessage,data:i}),editWebhookWithToken:async(e,t,a)=>await l.patch(l.routes.webhooks.webhook(e,t),a),executeWebhook:async(e,t,a)=>await l.post(l.routes.webhooks.webhook(e,t,a),a),followAnnouncement:async(e,t)=>await l.post(l.routes.channels.follow(e),{webhook_channel_id:t}),getActiveThreads:async e=>await l.get(l.routes.channels.threads.active(e)),getApplicationCommandPermission:async(e,t)=>await l.get(l.routes.interactions.commands.permission(l.applicationId,e,t)),getApplicationCommandPermissions:async e=>await l.get(l.routes.interactions.commands.permissions(l.applicationId,e)),getApplicationInfo:async()=>await l.get(l.routes.oauth2Application()),getAutomodRule:async(e,t)=>await l.get(l.routes.guilds.automod.rule(e,t)),getAutomodRules:async e=>await l.get(l.routes.guilds.automod.rules(e)),getChannel:async e=>await l.get(l.routes.channels.channel(e)),getChannelInvites:async e=>await l.get(l.routes.channels.invites(e)),getChannels:async e=>await l.get(l.routes.guilds.channels(e)),getChannelWebhooks:async e=>await l.get(l.routes.channels.webhooks(e)),getDmChannel:async e=>await l.post(l.routes.channels.dm(),{recipient_id:e.toString()}),getEmoji:async(e,t)=>await l.get(l.routes.guilds.emoji(e,t)),getEmojis:async e=>await l.get(l.routes.guilds.emojis(e)),getFollowupMessage:async(e,t)=>await l.get(l.routes.interactions.responses.message(l.applicationId,e,t)),getGatewayBot:async()=>await l.get(l.routes.gatewayBot()),getGlobalApplicationCommand:async e=>await l.get(l.routes.interactions.commands.command(l.applicationId,e)),getGlobalApplicationCommands:async()=>await l.get(l.routes.interactions.commands.commands(l.applicationId)),getGuildApplicationCommand:async(e,t)=>await l.get(l.routes.interactions.commands.guilds.one(l.applicationId,t,e)),getGuildApplicationCommands:async e=>await l.get(l.routes.interactions.commands.guilds.all(l.applicationId,e)),getGuildTemplate:async e=>await l.get(l.routes.guilds.templates.code(e)),getGuildTemplates:async e=>await l.get(l.routes.guilds.templates.all(e)),getGuildWebhooks:async e=>await l.get(l.routes.guilds.webhooks(e)),getIntegrations:async e=>await l.get(l.routes.guilds.integrations(e)),getInvite:async(e,t)=>await l.get(l.routes.guilds.invite(e,t)),getInvites:async e=>await l.get(l.routes.guilds.invites(e)),getNitroStickerPacks:async()=>await l.get(l.routes.nitroStickerPacks()),getOriginalInteractionResponse:async e=>await l.get(l.routes.interactions.responses.original(l.applicationId,e)),getPrivateArchivedThreads:async(e,t)=>await l.get(l.routes.channels.threads.private(e,t)),getPrivateJoinedArchivedThreads:async(e,t)=>await l.get(l.routes.channels.threads.joined(e,t)),getPublicArchivedThreads:async(e,t)=>await l.get(l.routes.channels.threads.public(e,t)),getScheduledEvent:async(e,t,a)=>await l.get(l.routes.guilds.events.event(e,t,a?.withUserCount)),getScheduledEvents:async(e,t)=>await l.get(l.routes.guilds.events.events(e,t?.withUserCount)),getScheduledEventUsers:async(e,t,a)=>await l.get(l.routes.guilds.events.users(e,t,a)),getSessionInfo:async()=>await l.getGatewayBot(),getStageInstance:async e=>await l.get(l.routes.channels.stage(e)),getThreadMember:async(e,t)=>await l.get(l.routes.channels.threads.user(e,t)),getThreadMembers:async e=>await l.get(l.routes.channels.threads.members(e)),getUser:async e=>await l.get(l.routes.user(e)),getWebhook:async e=>await l.get(l.routes.webhooks.id(e)),getWebhookMessage:async(e,t,a,s)=>await l.get(l.routes.webhooks.message(e,t,a,s)),getWebhookWithToken:async(e,t)=>await l.get(l.routes.webhooks.webhook(e,t)),joinThread:async e=>await l.put(l.routes.channels.threads.me(e)),leaveThread:async e=>await l.delete(l.routes.channels.threads.me(e)),publishMessage:async(e,t)=>await l.post(l.routes.channels.crosspost(e,t)),removeThreadMember:async(e,t)=>await l.delete(l.routes.channels.threads.user(e,t)),sendFollowupMessage:async(e,t)=>await new Promise((a,s)=>{l.sendRequest({url:l.routes.webhooks.webhook(l.applicationId,e),method:"POST",body:l.createRequest({method:"POST",body:{...t},headers:{Authorization:""}}),retryCount:0,retryRequest:async function(e){await l.sendRequest(e)},resolve:a,reject:s})}),sendInteractionResponse:async(e,t,a)=>await new Promise((s,i)=>{l.sendRequest({url:l.routes.interactions.responses.callback(e,t),method:"POST",body:l.createRequest({method:"POST",body:{...a},headers:{Authorization:""}}),retryCount:0,retryRequest:async function(e){await l.sendRequest(e)},resolve:s,reject:i})}),sendMessage:async(e,t)=>await l.post(l.routes.channels.messages(e),t),startThreadWithMessage:async(e,t,a)=>await l.post(l.routes.channels.threads.message(e,t),a),startThreadWithoutMessage:async(e,t)=>await l.post(l.routes.channels.threads.all(e),t),syncGuildTemplate:async e=>await l.put(l.routes.guilds.templates.all(e)),banMember:async(e,t,a)=>await l.put(l.routes.guilds.members.ban(e,t),a),editBotMember:async(e,t)=>await l.patch(l.routes.guilds.members.bot(e),t),editMember:async(e,t,a)=>await l.patch(l.routes.guilds.members.member(e,t),a),getMember:async(e,t)=>await l.get(l.routes.guilds.members.member(e,t)),getMembers:async(e,t)=>await l.get(l.routes.guilds.members.members(e,t)),kickMember:async(e,t,a)=>await l.delete(l.routes.guilds.members.member(e,t),{reason:a}),pruneMembers:async(e,t)=>await l.post(l.routes.guilds.members.prune(e),t),searchMembers:async(e,t,a)=>await l.get(l.routes.guilds.members.search(e,t,a)),unbanMember:async(e,t)=>await l.delete(l.routes.guilds.members.ban(e,t)),triggerTypingIndicator:async e=>await l.post(l.routes.channels.typing(e)),upsertGlobalApplicationCommands:async e=>await l.put(l.routes.interactions.commands.commands(l.applicationId),e),upsertGuildApplicationCommands:async(e,t)=>await l.put(l.routes.interactions.commands.guilds.all(l.applicationId,e),t)};return l}
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEludGVyYWN0aW9uUmVzcG9uc2VUeXBlcyB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgY2FtZWxpemUsIGRlbGF5LCBnZXRCb3RJZEZyb21Ub2tlbiwgdXJsVG9CYXNlNjQgfSBmcm9tICdAZGlzY29yZGVuby91dGlscydcblxuaW1wb3J0IHsgY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQgfSBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnXG5pbXBvcnQgeyBRdWV1ZSB9IGZyb20gJy4vcXVldWUuanMnXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMsXG4gIEJpZ1N0cmluZyxcbiAgQ2FtZWxpemUsXG4gIENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCxcbiAgQ3JlYXRlQXV0b01vZGVyYXRpb25SdWxlT3B0aW9ucyxcbiAgQ3JlYXRlQ2hhbm5lbEludml0ZSxcbiAgQ3JlYXRlRm9ydW1Qb3N0V2l0aE1lc3NhZ2UsXG4gIENyZWF0ZUd1aWxkQ2hhbm5lbCxcbiAgQ3JlYXRlR3VpbGRFbW9qaSxcbiAgQ3JlYXRlTWVzc2FnZU9wdGlvbnMsXG4gIENyZWF0ZVNjaGVkdWxlZEV2ZW50LFxuICBDcmVhdGVTdGFnZUluc3RhbmNlLFxuICBEZWxldGVXZWJob29rTWVzc2FnZU9wdGlvbnMsXG4gIERpc2NvcmRBY3RpdmVUaHJlYWRzLFxuICBEaXNjb3JkQXBwbGljYXRpb24sXG4gIERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQsXG4gIERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyxcbiAgRGlzY29yZEFyY2hpdmVkVGhyZWFkcyxcbiAgRGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZSxcbiAgRGlzY29yZENoYW5uZWwsXG4gIERpc2NvcmRDcmVhdGVXZWJob29rLFxuICBEaXNjb3JkRW1vamksXG4gIERpc2NvcmRGb2xsb3dBbm5vdW5jZW1lbnRDaGFubmVsLFxuICBEaXNjb3JkRm9sbG93ZWRDaGFubmVsLFxuICBEaXNjb3JkR2V0R2F0ZXdheUJvdCxcbiAgRGlzY29yZEludGVncmF0aW9uLFxuICBEaXNjb3JkSW52aXRlLFxuICBEaXNjb3JkSW52aXRlTWV0YWRhdGEsXG4gIERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcyxcbiAgRGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHMsXG4gIERpc2NvcmRNZW1iZXIsXG4gIERpc2NvcmRNZW1iZXJXaXRoVXNlcixcbiAgRGlzY29yZE1lc3NhZ2UsXG4gIERpc2NvcmRTY2hlZHVsZWRFdmVudCxcbiAgRGlzY29yZFN0YWdlSW5zdGFuY2UsXG4gIERpc2NvcmRTdGlja2VyUGFjayxcbiAgRGlzY29yZFRlbXBsYXRlLFxuICBEaXNjb3JkVGhyZWFkTWVtYmVyLFxuICBEaXNjb3JkVXNlcixcbiAgRGlzY29yZFdlYmhvb2ssXG4gIEVkaXRBdXRvTW9kZXJhdGlvblJ1bGVPcHRpb25zLFxuICBFZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXNPcHRpb25zLFxuICBFZGl0TWVzc2FnZSxcbiAgRWRpdFNjaGVkdWxlZEV2ZW50LFxuICBFZGl0U3RhZ2VJbnN0YW5jZU9wdGlvbnMsXG4gIEV4ZWN1dGVXZWJob29rLFxuICBHZXRHdWlsZFBydW5lQ291bnRRdWVyeSxcbiAgR2V0SW52aXRlLFxuICBHZXRNZXNzYWdlc09wdGlvbnMsXG4gIEdldFNjaGVkdWxlZEV2ZW50cyxcbiAgR2V0U2NoZWR1bGVkRXZlbnRVc2VycyxcbiAgR2V0V2ViaG9va01lc3NhZ2VPcHRpb25zLFxuICBJbnRlcmFjdGlvbkNhbGxiYWNrRGF0YSxcbiAgSW50ZXJhY3Rpb25SZXNwb25zZSxcbiAgTGlzdEFyY2hpdmVkVGhyZWFkcyxcbiAgTGlzdEd1aWxkTWVtYmVycyxcbiAgTW9kaWZ5Q2hhbm5lbCxcbiAgTW9kaWZ5R3VpbGRDaGFubmVsUG9zaXRpb25zLFxuICBNb2RpZnlHdWlsZEVtb2ppLFxuICBNb2RpZnlXZWJob29rLFxuICBTZWFyY2hNZW1iZXJzLFxuICBTdGFydFRocmVhZFdpdGhNZXNzYWdlLFxuICBTdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlLFxuICBXaXRoUmVhc29uLFxufSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB0eXBlIHsgSW52YWxpZFJlcXVlc3RCdWNrZXQgfSBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnXG5cbi8vIFRPRE86IG1ha2UgZHluYW1pYyBiYXNlZCBvbiBwYWNrYWdlLmpzb24gZmlsZVxuY29uc3QgdmVyc2lvbiA9ICcxOS4wLjAtYWxwaGEuMSdcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc3RNYW5hZ2VyKG9wdGlvbnM6IENyZWF0ZVJlc3RNYW5hZ2VyT3B0aW9ucyk6IFJlc3RNYW5hZ2VyIHtcbiAgY29uc3QgcmVzdDogUmVzdE1hbmFnZXIgPSB7XG4gICAgdG9rZW46IG9wdGlvbnMudG9rZW4sXG4gICAgYXBwbGljYXRpb25JZDogb3B0aW9ucy5hcHBsaWNhdGlvbklkID8gQmlnSW50KG9wdGlvbnMuYXBwbGljYXRpb25JZCkgOiBnZXRCb3RJZEZyb21Ub2tlbihvcHRpb25zLnRva2VuKSxcbiAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24gPz8gMTAsXG4gICAgYmFzZVVybDogb3B0aW9ucy5iYXNlVXJsID8/ICdodHRwczovL2Rpc2NvcmQuY29tL2FwaScsXG4gICAgbWF4UmV0cnlDb3VudDogSW5maW5pdHksXG4gICAgZ2xvYmFsbHlSYXRlTGltaXRlZDogZmFsc2UsXG4gICAgcHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHM6IGZhbHNlLFxuICAgIHF1ZXVlczogbmV3IE1hcCgpLFxuICAgIHJhdGVMaW1pdGVkUGF0aHM6IG5ldyBNYXAoKSxcbiAgICBpbnZhbGlkQnVja2V0OiBjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCh7fSksXG5cbiAgICByb3V0ZXM6IHtcbiAgICAgIHdlYmhvb2tzOiB7XG4gICAgICAgIGlkOiAod2ViaG9va0lkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvd2ViaG9va3MvJHt3ZWJob29rSWR9YFxuICAgICAgICB9LFxuICAgICAgICBtZXNzYWdlOiAod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgbGV0IHVybCA9IGAvd2ViaG9va3MvJHt3ZWJob29rSWR9LyR7dG9rZW59L21lc3NhZ2VzLyR7bWVzc2FnZUlkfT9gXG5cbiAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudGhyZWFkSWQpIHVybCArPSBgdGhyZWFkX2lkPSR7b3B0aW9ucy50aHJlYWRJZH1gXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICB9LFxuICAgICAgICBvcmlnaW5hbDogKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICBsZXQgdXJsID0gYC93ZWJob29rcy8ke3dlYmhvb2tJZH0vJHt0b2tlbn0vbWVzc2FnZXMvQG9yaWdpbmFsP2BcblxuICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy50aHJlYWRJZCkgdXJsICs9IGB0aHJlYWRfaWQ9JHtvcHRpb25zLnRocmVhZElkfWBcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH0sXG4gICAgICAgIHdlYmhvb2s6ICh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgbGV0IHVybCA9IGAvd2ViaG9va3MvJHt3ZWJob29rSWR9LyR7dG9rZW59P2BcblxuICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8ud2FpdCAhPT0gdW5kZWZpbmVkKSB1cmwgKz0gYHdhaXQ9JHtvcHRpb25zLndhaXQudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50aHJlYWRJZCkgdXJsICs9IGB0aHJlYWRfaWQ9JHtvcHRpb25zLnRocmVhZElkfWBcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvLyBNaXNjZWxsYW5lb3VzIEVuZHBvaW50c1xuICAgICAgc2Vzc2lvbkluZm86ICgpID0+IHJlc3Qucm91dGVzLmdhdGV3YXlCb3QoKSxcblxuICAgICAgLy8gQ2hhbm5lbCBFbmRwb2ludHNcbiAgICAgIGNoYW5uZWxzOiB7XG4gICAgICAgIGRtOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuICcvdXNlcnMvQG1lL2NoYW5uZWxzJ1xuICAgICAgICB9LFxuICAgICAgICB3ZWJob29rczogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS93ZWJob29rc2BcbiAgICAgICAgfSxcblxuICAgICAgICBjaGFubmVsOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9YFxuICAgICAgICB9LFxuXG4gICAgICAgIGZvbGxvdzogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9mb2xsb3dlcnNgXG4gICAgICAgIH0sXG5cbiAgICAgICAgZm9ydW06IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkcz9oYXNfbWVzc2FnZT10cnVlYFxuICAgICAgICB9LFxuXG4gICAgICAgIGludml0ZXM6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vaW52aXRlc2BcbiAgICAgICAgfSxcblxuICAgICAgICBtZXNzYWdlOiAoY2hhbm5lbElkLCBtZXNzYWdlSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9YFxuICAgICAgICB9LFxuXG4gICAgICAgIG1lc3NhZ2VzOiAoY2hhbm5lbElkLCBvcHRpb25zPzogR2V0TWVzc2FnZXNPcHRpb25zKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXJsID0gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXM/YFxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIGlmIChpc0dldE1lc3NhZ2VzQWZ0ZXIob3B0aW9ucykgJiYgb3B0aW9ucy5hZnRlcikge1xuICAgICAgICAgICAgLy8gICB1cmwgKz0gYGFmdGVyPSR7b3B0aW9ucy5hZnRlcn1gXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBpZiAoaXNHZXRNZXNzYWdlc0JlZm9yZShvcHRpb25zKSAmJiBvcHRpb25zLmJlZm9yZSkge1xuICAgICAgICAgICAgLy8gICB1cmwgKz0gYCZiZWZvcmU9JHtvcHRpb25zLmJlZm9yZX1gXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBpZiAoaXNHZXRNZXNzYWdlc0Fyb3VuZChvcHRpb25zKSAmJiBvcHRpb25zLmFyb3VuZCkge1xuICAgICAgICAgICAgLy8gICB1cmwgKz0gYCZhcm91bmQ9JHtvcHRpb25zLmFyb3VuZH1gXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBpZiAoaXNHZXRNZXNzYWdlc0xpbWl0KG9wdGlvbnMpICYmIG9wdGlvbnMubGltaXQpIHtcbiAgICAgICAgICAgIC8vICAgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH0sXG5cbiAgICAgICAgb3ZlcndyaXRlOiAoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9wZXJtaXNzaW9ucy8ke292ZXJ3cml0ZUlkfWBcbiAgICAgICAgfSxcblxuICAgICAgICBjcm9zc3Bvc3Q6IChjaGFubmVsSWQsIG1lc3NhZ2VJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH0vY3Jvc3Nwb3N0YFxuICAgICAgICB9LFxuXG4gICAgICAgIHN0YWdlczogKCkgPT4ge1xuICAgICAgICAgIHJldHVybiAnL3N0YWdlLWluc3RhbmNlcydcbiAgICAgICAgfSxcblxuICAgICAgICBzdGFnZTogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL3N0YWdlLWluc3RhbmNlcy8ke2NoYW5uZWxJZH1gXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gVGhyZWFkIEVuZHBvaW50c1xuICAgICAgICB0aHJlYWRzOiB7XG4gICAgICAgICAgbWVzc2FnZTogKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9L3RocmVhZHNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhbGw6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS90aHJlYWRzYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWN0aXZlOiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vdGhyZWFkcy9hY3RpdmVgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1iZXJzOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkLW1lbWJlcnNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZTogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZC1tZW1iZXJzL0BtZWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZXI6IChjaGFubmVsSWQsIHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZC1tZW1iZXJzLyR7dXNlcklkfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFyY2hpdmVkOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkcy9hcmNoaXZlZGBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHB1YmxpYzogKGNoYW5uZWxJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZHMvYXJjaGl2ZWQvcHVibGljP2BcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGBiZWZvcmU9JHtuZXcgRGF0ZShvcHRpb25zLmJlZm9yZSkudG9JU09TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJpdmF0ZTogKGNoYW5uZWxJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZHMvYXJjaGl2ZWQvcHJpdmF0ZT9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmJlZm9yZSkge1xuICAgICAgICAgICAgICAgIHVybCArPSBgYmVmb3JlPSR7bmV3IERhdGUob3B0aW9ucy5iZWZvcmUpLnRvSVNPU3RyaW5nKCl9YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXQpIHVybCArPSBgJmxpbWl0PSR7b3B0aW9ucy5saW1pdH1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGpvaW5lZDogKGNoYW5uZWxJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3VzZXJzL0BtZS90aHJlYWRzL2FyY2hpdmVkL3ByaXZhdGU/YFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmUpIHtcbiAgICAgICAgICAgICAgICB1cmwgKz0gYGJlZm9yZT0ke25ldyBEYXRlKG9wdGlvbnMuYmVmb3JlKS50b0lTT1N0cmluZygpfWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0KSB1cmwgKz0gYCZsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICB0eXBpbmc6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdHlwaW5nYFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLy8gR3VpbGQgRW5kcG9pbnRzXG4gICAgICBndWlsZHM6IHtcbiAgICAgICAgYXV0b21vZDoge1xuICAgICAgICAgIHJ1bGU6IChndWlsZElkLCBydWxlSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2F1dG8tbW9kZXJhdGlvbi9ydWxlcy8ke3J1bGVJZH1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBydWxlczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2F1dG8tbW9kZXJhdGlvbi9ydWxlc2BcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBjaGFubmVsczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9jaGFubmVsc2BcbiAgICAgICAgfSxcbiAgICAgICAgZW1vamk6IChndWlsZElkLCBlbW9qaUlkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vZW1vamlzLyR7ZW1vamlJZH1gXG4gICAgICAgIH0sXG4gICAgICAgIGVtb2ppczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9lbW9qaXNgXG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIGV2ZW50czogKGd1aWxkSWQsIHdpdGhVc2VyQ291bnQ/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9zY2hlZHVsZWQtZXZlbnRzP2BcblxuICAgICAgICAgICAgaWYgKHdpdGhVc2VyQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cmwgKz0gYHdpdGhfdXNlcl9jb3VudD0ke3dpdGhVc2VyQ291bnQudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBldmVudDogKGd1aWxkSWQsIGV2ZW50SWQsIHdpdGhVc2VyQ291bnQ/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9zY2hlZHVsZWQtZXZlbnRzLyR7ZXZlbnRJZH1gXG5cbiAgICAgICAgICAgIGlmICh3aXRoVXNlckNvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdXJsICs9IGB3aXRoX3VzZXJfY291bnQ9JHt3aXRoVXNlckNvdW50LnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VyczogKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnM/OiBHZXRTY2hlZHVsZWRFdmVudFVzZXJzKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9zY2hlZHVsZWQtZXZlbnRzLyR7ZXZlbnRJZH0vdXNlcnM/YFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0ICE9PSB1bmRlZmluZWQpIHVybCArPSBgbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMud2l0aE1lbWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICAgIHVybCArPSBgJndpdGhfbWVtYmVyPSR7b3B0aW9ucy53aXRoTWVtYmVyLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWZ0ZXIgIT09IHVuZGVmaW5lZCkgdXJsICs9IGAmYWZ0ZXI9JHtvcHRpb25zLmFmdGVyfWBcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmUgIT09IHVuZGVmaW5lZCkgdXJsICs9IGAmYmVmb3JlPSR7b3B0aW9ucy5iZWZvcmV9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgaW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCkge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2ludGVncmF0aW9ucy8ke2ludGVncmF0aW9uSWR9YFxuICAgICAgICB9LFxuICAgICAgICBpbnRlZ3JhdGlvbnM6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vaW50ZWdyYXRpb25zP2luY2x1ZGVfYXBwbGljYXRpb25zPXRydWVgXG4gICAgICAgIH0sXG4gICAgICAgIGludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSB7XG4gICAgICAgICAgbGV0IHVybCA9IGAvaW52aXRlcy8ke2ludml0ZUNvZGV9P2BcblxuICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy53aXRoQ291bnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICB1cmwgKz0gYHdpdGhfY291bnRzPSR7b3B0aW9ucy53aXRoQ291bnRzLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMud2l0aEV4cGlyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIHVybCArPSBgJndpdGhfZXhwaXJhdGlvbj0ke29wdGlvbnMud2l0aEV4cGlyYXRpb24udG9TdHJpbmcoKX1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zY2hlZHVsZWRFdmVudElkKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgdXJsICs9IGAmZ3VpbGRfc2NoZWR1bGVkX2V2ZW50X2lkPSR7b3B0aW9ucy5zY2hlZHVsZWRFdmVudElkfWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH0sXG4gICAgICAgIGludml0ZXM6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vaW52aXRlc2BcbiAgICAgICAgfSxcbiAgICAgICAgbWVtYmVyczoge1xuICAgICAgICAgIGJhbjogKGd1aWxkSWQsIHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vYmFucy8ke3VzZXJJZH1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBib3Q6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzL0BtZWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lbWJlcjogKGd1aWxkSWQsIHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vbWVtYmVycy8ke3VzZXJJZH1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1iZXJzOiAoZ3VpbGRJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvZ3VpbGRzLyR7Z3VpbGRJZH0vbWVtYmVycz9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGBsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmFmdGVyKSB1cmwgKz0gYCZhZnRlcj0ke29wdGlvbnMuYWZ0ZXJ9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZWFyY2g6IChndWlsZElkLCBxdWVyeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvZ3VpbGRzLyR7Z3VpbGRJZH0vbWVtYmVycy9zZWFyY2g/cXVlcnk9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWBcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXQgIT09IHVuZGVmaW5lZCkgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJ1bmU6IChndWlsZElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9wcnVuZT9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGF5cykgdXJsICs9IGBkYXlzPSR7b3B0aW9ucy5kYXlzfWBcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbmNsdWRlUm9sZXMpKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICAgIHVybCArPSBgJmluY2x1ZGVfcm9sZXM9JHtvcHRpb25zLmluY2x1ZGVSb2xlcy5qb2luKCcsJyl9YFxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaW5jbHVkZVJvbGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICAgIHVybCArPSBgJmluY2x1ZGVfcm9sZXM9JHtvcHRpb25zLmluY2x1ZGVSb2xlc31gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICAgIGNvZGU6IChjb2RlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvdGVtcGxhdGVzLyR7Y29kZX1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBndWlsZDogKGd1aWxkSWQsIGNvZGUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L3RlbXBsYXRlcy8ke2NvZGV9YFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWxsOiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vdGVtcGxhdGVzYFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHdlYmhvb2tzOiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L3dlYmhvb2tzYFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLy8gSW50ZXJhY3Rpb24gRW5kcG9pbnRzXG4gICAgICBpbnRlcmFjdGlvbnM6IHtcbiAgICAgICAgY29tbWFuZHM6IHtcbiAgICAgICAgICAvLyBBcHBsaWNhdGlvbiBFbmRwb2ludHNcbiAgICAgICAgICBjb21tYW5kczogKGFwcGxpY2F0aW9uSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2FwcGxpY2F0aW9ucy8ke2FwcGxpY2F0aW9uSWR9L2NvbW1hbmRzYFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBndWlsZHM6IHtcbiAgICAgICAgICAgIGFsbChhcHBsaWNhdGlvbklkLCBndWlsZElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBgL2FwcGxpY2F0aW9ucy8ke2FwcGxpY2F0aW9uSWR9L2d1aWxkcy8ke2d1aWxkSWR9L2NvbW1hbmRzYFxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25lKGFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCwgd2l0aExvY2FsaXphdGlvbnMpIHtcbiAgICAgICAgICAgICAgbGV0IHVybCA9IGAvYXBwbGljYXRpb25zLyR7YXBwbGljYXRpb25JZH0vZ3VpbGRzLyR7Z3VpbGRJZH0vY29tbWFuZHMvJHtjb21tYW5kSWR9P2BcblxuICAgICAgICAgICAgICBpZiAod2l0aExvY2FsaXphdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHVybCArPSBgd2l0aF9sb2NhbGl6YXRpb25zPSR7d2l0aExvY2FsaXphdGlvbnMudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGVybWlzc2lvbnM6IChhcHBsaWNhdGlvbklkLCBndWlsZElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9hcHBsaWNhdGlvbnMvJHthcHBsaWNhdGlvbklkfS9ndWlsZHMvJHtndWlsZElkfS9jb21tYW5kcy9wZXJtaXNzaW9uc2BcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBlcm1pc3Npb246IChhcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2FwcGxpY2F0aW9ucy8ke2FwcGxpY2F0aW9uSWR9L2d1aWxkcy8ke2d1aWxkSWR9L2NvbW1hbmRzLyR7Y29tbWFuZElkfS9wZXJtaXNzaW9uc2BcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IChhcHBsaWNhdGlvbklkLCBjb21tYW5kSWQsIHdpdGhMb2NhbGl6YXRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9hcHBsaWNhdGlvbnMvJHthcHBsaWNhdGlvbklkfS9jb21tYW5kcy8ke2NvbW1hbmRJZH0/YFxuXG4gICAgICAgICAgICBpZiAod2l0aExvY2FsaXphdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cmwgKz0gYHdpdGhMb2NhbGl6YXRpb25zPSR7d2l0aExvY2FsaXphdGlvbnMudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIHJlc3BvbnNlczoge1xuICAgICAgICAgIC8vIEludGVyYWN0aW9uIEVuZHBvaW50c1xuICAgICAgICAgIGNhbGxiYWNrOiAoaW50ZXJhY3Rpb25JZCwgdG9rZW4pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2ludGVyYWN0aW9ucy8ke2ludGVyYWN0aW9uSWR9LyR7dG9rZW59L2NhbGxiYWNrYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3JpZ2luYWw6IChpbnRlcmFjdGlvbklkLCB0b2tlbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvd2ViaG9va3MvJHtpbnRlcmFjdGlvbklkfS8ke3Rva2VufS9tZXNzYWdlcy9Ab3JpZ2luYWxgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZXNzYWdlOiAoYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvd2ViaG9va3MvJHthcHBsaWNhdGlvbklkfS8ke3Rva2VufS9tZXNzYWdlcy8ke21lc3NhZ2VJZH1gXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIFVzZXIgZW5kcG9pbnRzXG4gICAgICB1c2VyKHVzZXJJZCkge1xuICAgICAgICByZXR1cm4gYC91c2Vycy8ke3VzZXJJZH1gXG4gICAgICB9LFxuXG4gICAgICB1c2VyQm90KCkge1xuICAgICAgICByZXR1cm4gJy91c2Vycy9AbWUnXG4gICAgICB9LFxuXG4gICAgICBvYXV0aDJBcHBsaWNhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICdvYXV0aDIvYXBwbGljYXRpb25zL0BtZSdcbiAgICAgIH0sXG5cbiAgICAgIGdhdGV3YXlCb3QoKSB7XG4gICAgICAgIHJldHVybiAnL2dhdGV3YXkvYm90J1xuICAgICAgfSxcblxuICAgICAgbml0cm9TdGlja2VyUGFja3MoKSB7XG4gICAgICAgIHJldHVybiAnL3N0aWNrZXItcGFja3MnXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBjaGVja1JhdGVMaW1pdHModXJsKSB7XG4gICAgICBjb25zdCByYXRlbGltaXRlZCA9IHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5nZXQodXJsKVxuICAgICAgY29uc3QgZ2xvYmFsID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldCgnZ2xvYmFsJylcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAgICAgaWYgKHJhdGVsaW1pdGVkICYmIG5vdyA8IHJhdGVsaW1pdGVkLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiByYXRlbGltaXRlZC5yZXNldFRpbWVzdGFtcCAtIG5vd1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2xvYmFsICYmIG5vdyA8IGdsb2JhbC5yZXNldFRpbWVzdGFtcCkge1xuICAgICAgICByZXR1cm4gZ2xvYmFsLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBjcmVhdGVSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICd1c2VyLWFnZW50JzogYERpc2NvcmRCb3QgKGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkZW5vL2Rpc2NvcmRlbm8sIHYke3ZlcnNpb259KWAsXG4gICAgICB9XG5cbiAgICAgIGlmICghb3B0aW9ucy51bmF1dGhvcml6ZWQpIGhlYWRlcnMuYXV0aG9yaXphdGlvbiA9IGBCb3QgJHtyZXN0LnRva2VufWBcblxuICAgICAgLy8gU09NRVRJTUVTIFNQRUNJQUwgSEVBREVSUyAoRS5HLiBDVVNUT00gQVVUSE9SSVpBVElPTikgTkVFRCBUTyBCRSBVU0VEXG4gICAgICBpZiAob3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgIGhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gb3B0aW9ucy5oZWFkZXJzW2tleV1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHRVQgTUVUSE9EUyBTSE9VTEQgTk9UIEhBVkUgQSBCT0RZXG4gICAgICBpZiAob3B0aW9ucy5tZXRob2QgPT09ICdHRVQnKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICAvLyBJRiBBIFJFQVNPTiBJUyBQUk9WSURFRCBFTkNPREUgSVQgSU4gSEVBREVSU1xuICAgICAgaWYgKG9wdGlvbnMuYm9keT8ucmVhc29uKSB7XG4gICAgICAgIGhlYWRlcnNbJ1gtQXVkaXQtTG9nLVJlYXNvbiddID0gZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnMuYm9keS5yZWFzb24gYXMgc3RyaW5nKVxuICAgICAgICBvcHRpb25zLmJvZHkucmVhc29uID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmJvZHkgJiYgIVsnR0VUJywgJ0RFTEVURSddLmluY2x1ZGVzKG9wdGlvbnMubWV0aG9kKSkge1xuICAgICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBib2R5OiAob3B0aW9ucy5ib2R5Py5maWxlID8/IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuYm9keSkpIGFzIEZvcm1EYXRhIHwgc3RyaW5nLFxuICAgICAgICBtZXRob2Q6IG9wdGlvbnMubWV0aG9kLFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpIHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmVudHJpZXMoKSkge1xuICAgICAgICAvLyAgIHJlc3QuZGVidWcoXG4gICAgICAgIC8vIGBbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIGZvciBvZiBsb29wLiAke1xuICAgICAgICAvLyAgIHZhbHVlLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICAgIC8vIH1gXG4gICAgICAgIC8vICAgKVxuICAgICAgICAvLyBJZiB0aGUgdGltZSBoYXMgbm90IHJlYWNoZWQgY2FuY2VsXG4gICAgICAgIGlmICh2YWx1ZS5yZXNldFRpbWVzdGFtcCA+IG5vdykgY29udGludWVcblxuICAgICAgICAvLyBSYXRlIGxpbWl0IGlzIG92ZXIsIGRlbGV0ZSB0aGUgcmF0ZSBsaW1pdGVyXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5kZWxldGUoa2V5KVxuICAgICAgICAvLyBJZiBpdCB3YXMgZ2xvYmFsLCBhbHNvIG1hcmsgdGhlIGdsb2JhbCB2YWx1ZSBhcyBmYWxzZVxuICAgICAgICBpZiAoa2V5ID09PSAnZ2xvYmFsJykgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gQUxMIFBBVEhTIEFSRSBDTEVBUkVEIENBTiBDQU5DRUwgT1VUIVxuICAgICAgaWYgKHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zaXplID09PSAwKSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyA9IHRydWVcbiAgICAgICAgLy8gUkVDSEVDSyBJTiAxIFNFQ09ORFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvLyByZXN0LmRlYnVnKCdbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIHNldFRpbWVvdXQuJylcbiAgICAgICAgICByZXN0LnByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKClcbiAgICAgICAgfSwgMTAwMClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqIFByb2Nlc3NlcyB0aGUgcmF0ZSBsaW1pdCBoZWFkZXJzIGFuZCBkZXRlcm1pbmVzIGlmIGl0IG5lZWRzIHRvIGJlIHJhdGUgbGltaXRlZCBhbmQgcmV0dXJucyB0aGUgYnVja2V0IGlkIGlmIGF2YWlsYWJsZSAqL1xuICAgIHByb2Nlc3NIZWFkZXJzKHVybCwgaGVhZGVycykge1xuICAgICAgbGV0IHJhdGVMaW1pdGVkID0gZmFsc2VcblxuICAgICAgLy8gR0VUIEFMTCBORUNFU1NBUlkgSEVBREVSU1xuICAgICAgY29uc3QgcmVtYWluaW5nID0gaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LXJlbWFpbmluZycpXG4gICAgICBjb25zdCByZXRyeUFmdGVyID0gaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LXJlc2V0LWFmdGVyJylcbiAgICAgIGNvbnN0IHJlc2V0ID0gRGF0ZS5ub3coKSArIE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDBcbiAgICAgIGNvbnN0IGdsb2JhbCA9IGhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1nbG9iYWwnKVxuICAgICAgLy8gdW5kZWZpbmVkIG92ZXJyaWRlIG51bGwgbmVlZGVkIGZvciB0eXBpbmdzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IGhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1idWNrZXQnKSA/PyB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGxpbWl0ID0gaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LWxpbWl0JylcblxuICAgICAgcmVzdC5xdWV1ZXMuZ2V0KHVybCk/LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3Qoe1xuICAgICAgICByZW1haW5pbmc6IHJlbWFpbmluZyA/IE51bWJlcihyZW1haW5pbmcpIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcnZhbDogcmV0cnlBZnRlciA/IE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDAgOiB1bmRlZmluZWQsXG4gICAgICAgIG1heDogbGltaXQgPyBOdW1iZXIobGltaXQpIDogdW5kZWZpbmVkLFxuICAgICAgfSlcblxuICAgICAgLy8gSUYgVEhFUkUgSVMgTk8gUkVNQUlOSU5HIFJBVEUgTElNSVQsIE1BUksgSVQgQVMgUkFURSBMSU1JVEVEXG4gICAgICBpZiAocmVtYWluaW5nID09PSAnMCcpIHtcbiAgICAgICAgcmF0ZUxpbWl0ZWQgPSB0cnVlXG5cbiAgICAgICAgLy8gU0FWRSBUSEUgVVJMIEFTIExJTUlURUQsIElNUE9SVEFOVCBGT1IgTkVXIFJFUVVFU1RTIEJZIFVTRVIgV0lUSE9VVCBCVUNLRVRcbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldCh1cmwsIHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IHJlc2V0LFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNBVkUgVEhFIEJVQ0tFVCBBUyBMSU1JVEVEIFNJTkNFIERJRkZFUkVOVCBVUkxTIE1BWSBTSEFSRSBBIEJVQ0tFVFxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGJ1Y2tldElkLCB7XG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElGIFRIRVJFIElTIE5PIFJFTUFJTklORyBHTE9CQUwgTElNSVQsIE1BUksgSVQgUkFURSBMSU1JVEVEIEdMT0JBTExZXG4gICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBoZWFkZXJzLmdldCgncmV0cnktYWZ0ZXInKVxuICAgICAgICBjb25zdCBnbG9iYWxSZXNldCA9IERhdGUubm93KCkgKyBOdW1iZXIocmV0cnlBZnRlcikgKiAxMDAwXG4gICAgICAgIC8vICAgcmVzdC5kZWJ1ZyhcbiAgICAgICAgLy8gYFtSRVNUID0gR2xvYmFsbHkgUmF0ZSBMaW1pdGVkXSBVUkw6ICR7dXJsfSB8IEdsb2JhbCBSZXN0OiAke2dsb2JhbFJlc2V0fWBcbiAgICAgICAgLy8gICApXG4gICAgICAgIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IHRydWVcbiAgICAgICAgcmF0ZUxpbWl0ZWQgPSB0cnVlXG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gZmFsc2VcbiAgICAgICAgfSwgZ2xvYmFsUmVzZXQpXG5cbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldCgnZ2xvYmFsJywge1xuICAgICAgICAgIHVybDogJ2dsb2JhbCcsXG4gICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IGdsb2JhbFJlc2V0LFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChidWNrZXRJZCkge1xuICAgICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYnVja2V0SWQsIHtcbiAgICAgICAgICAgIHVybDogJ2dsb2JhbCcsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogZ2xvYmFsUmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyYXRlTGltaXRlZCAmJiAhcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocykge1xuICAgICAgICByZXN0LnByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKClcbiAgICAgIH1cbiAgICAgIHJldHVybiByYXRlTGltaXRlZCA/IGJ1Y2tldElkIDogdW5kZWZpbmVkXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdzZW5kaW5nIHJlcXVlc3QnLCBvcHRpb25zLnVybCwgcmVzdC5jcmVhdGVSZXF1ZXN0KHsgbWV0aG9kOiBvcHRpb25zLm1ldGhvZCwgdXJsOiBvcHRpb25zLnVybCwgYm9keTogb3B0aW9ucy5ib2R5IH0pKVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgb3B0aW9ucy51cmwsXG4gICAgICAgIHJlc3QuY3JlYXRlUmVxdWVzdCh7IG1ldGhvZDogb3B0aW9ucy5tZXRob2QsIHVybDogb3B0aW9ucy51cmwsIGJvZHk6IG9wdGlvbnMuYm9keSwgLi4ub3B0aW9ucy5vcHRpb25zIH0pLFxuICAgICAgKVxuXG4gICAgICAvLyBTZXQgdGhlIGJ1Y2tldCBpZCBpZiBpdCB3YXMgYXZhaWxhYmxlIG9uIHRoZSBoZWFkZXJzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IHJlc3QucHJvY2Vzc0hlYWRlcnMocmVzdC5zaW1wbGlmeVVybChvcHRpb25zLnVybCwgb3B0aW9ucy5tZXRob2QpLCByZXNwb25zZS5oZWFkZXJzKVxuICAgICAgaWYgKGJ1Y2tldElkKSBvcHRpb25zLmJ1Y2tldElkID0gYnVja2V0SWRcblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA8IDIwMCB8fCByZXNwb25zZS5zdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIC8vIElmIE5PVCByYXRlIGxpbWl0ZWQgcmVtb3ZlIGZyb20gcXVldWVcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgICAgLy8gVG9vIG1hbnkgYXR0ZW1wdHMsIGdldCByaWQgb2YgcmVxdWVzdCBmcm9tIHF1ZXVlLlxuICAgICAgICAgIGlmIChvcHRpb25zLnJldHJ5Q291bnQrKyA+PSByZXN0Lm1heFJldHJ5Q291bnQpIHtcbiAgICAgICAgICAgIC8vIHJlc3QuZGVidWcoYFtSRVNUIC0gUmV0cmllc01heGVkXSAke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMpfWApXG4gICAgICAgICAgICAvLyBSZW1vdmUgaXRlbSBmcm9tIHF1ZXVlIHRvIHByZXZlbnQgcmV0cnlcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnJlamVjdD8uKHtcbiAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgZXJyb3I6ICdUaGUgb3B0aW9ucyB3YXMgcmF0ZSBsaW1pdGVkIGFuZCBpdCBtYXhlZCBvdXQgdGhlIHJldHJpZXMgbGltaXQuJyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmF0ZSBsaW1pdGVkLCBhZGQgYmFjayB0byBxdWV1ZVxuICAgICAgICAgIHJlc3QuaW52YWxpZEJ1Y2tldC5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LVNjb3BlJykgPT09ICdzaGFyZWQnKVxuXG4gICAgICAgICAgY29uc3QgcmVzZXRBZnRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1yZXNldC1hZnRlcicpXG4gICAgICAgICAgaWYgKHJlc2V0QWZ0ZXIpIGF3YWl0IGRlbGF5KE51bWJlcihyZXNldEFmdGVyKSAqIDEwMDApXG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgb3B0aW9ucy5yZXRyeVJlcXVlc3Q/LihvcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9wdGlvbnMucmVzb2x2ZShhd2FpdCByZXNwb25zZS5qc29uKCkpXG4gICAgfSxcblxuICAgIC8vIENyZWRpdHM6IGdpdGh1Yi5jb20vYWJhbGFiYWhhaGEvZXJpcyBsaWIvcmVzdC9SZXF1ZXN0SGFuZGxlci5qcyNMMzk3XG4gICAgLy8gTW9kaWZpZWQgZm9yIG91ciB1c2UtY2FzZVxuICAgIHNpbXBsaWZ5VXJsKHVybCwgbWV0aG9kKSB7XG4gICAgICBsZXQgcm91dGUgPSB1cmxcbiAgICAgICAgLnJlcGxhY2UoL1xcLyhbYS16LV0rKVxcLyg/OlswLTldezE3LDE5fSkvZywgZnVuY3Rpb24gKG1hdGNoLCBwOiBzdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4gWydjaGFubmVscycsICdndWlsZHMnXS5pbmNsdWRlcyhwKSA/IG1hdGNoIDogYC8ke3B9L3hgXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXBsYWNlKC9cXC9yZWFjdGlvbnNcXC9bXi9dKy9nLCAnL3JlYWN0aW9ucy94JylcblxuICAgICAgLy8gR0VORVJBTCAvcmVhY3Rpb25zIGFuZCAvcmVhY3Rpb25zL2Vtb2ppL0BtZSBzaGFyZSB0aGUgYnVja2V0c1xuICAgICAgaWYgKHJvdXRlLmluY2x1ZGVzKCcvcmVhY3Rpb25zJykpIHtcbiAgICAgICAgcm91dGUgPSByb3V0ZS5zdWJzdHJpbmcoMCwgcm91dGUuaW5kZXhPZignL3JlYWN0aW9ucycpICsgJy9yZWFjdGlvbnMnLmxlbmd0aClcbiAgICAgIH1cblxuICAgICAgLy8gRGVsZXRlIE1lc3NhZ2UgZW5kcG9pbnQgaGFzIGl0cyBvd24gcmF0ZSBsaW1pdFxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ0RFTEVURScgJiYgcm91dGUuZW5kc1dpdGgoJy9tZXNzYWdlcy94JykpIHtcbiAgICAgICAgcm91dGUgPSBtZXRob2QgKyByb3V0ZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcm91dGVcbiAgICB9LFxuXG4gICAgcHJvY2Vzc1JlcXVlc3QocmVxdWVzdDogU2VuZFJlcXVlc3RPcHRpb25zKSB7XG4gICAgICBjb25zdCByb3V0ZSA9IHJlcXVlc3QudXJsLnN1YnN0cmluZyhyZXF1ZXN0LnVybC5pbmRleE9mKCdhcGkvJykpXG4gICAgICBjb25zdCBwYXJ0cyA9IHJvdXRlLnNwbGl0KCcvJylcbiAgICAgIC8vIFJlbW92ZSB0aGUgYXBpL1xuICAgICAgcGFydHMuc2hpZnQoKVxuICAgICAgLy8gUmVtb3ZlcyB0aGUgL3YjL1xuICAgICAgaWYgKHBhcnRzWzBdPy5zdGFydHNXaXRoKCd2JykpIHBhcnRzLnNoaWZ0KClcbiAgICAgIC8vIFNldCB0aGUgZnVsbCB1cmwgdG8gZGlzY29yZCBhcGkgaW4gY2FzZSBpdCB3YXMgcmVjaWV2ZWQgaW4gYSBwcm94eSByZXN0XG4gICAgICByZXF1ZXN0LnVybCA9IGAke3Jlc3QuYmFzZVVybH0vdiR7cmVzdC52ZXJzaW9ufS8ke3BhcnRzLmpvaW4oJy8nKX1gXG5cbiAgICAgIGNvbnN0IHVybCA9IHJlc3Quc2ltcGxpZnlVcmwocmVxdWVzdC51cmwsIHJlcXVlc3QubWV0aG9kKVxuICAgICAgY29uc3QgcXVldWUgPSByZXN0LnF1ZXVlcy5nZXQodXJsKVxuXG4gICAgICBpZiAocXVldWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBxdWV1ZS5tYWtlUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ1JFQVRFUyBBIE5FVyBRVUVVRVxuICAgICAgICBjb25zdCBidWNrZXRRdWV1ZSA9IG5ldyBRdWV1ZShyZXN0LCB7IHVybCB9KVxuICAgICAgICAvLyBBZGQgcmVxdWVzdCB0byBxdWV1ZVxuICAgICAgICBidWNrZXRRdWV1ZS5tYWtlUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgICAvLyBTYXZlIHF1ZXVlXG4gICAgICAgIHJlc3QucXVldWVzLnNldCh1cmwsIGJ1Y2tldFF1ZXVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBtYWtlUmVxdWVzdChtZXRob2QsIHVybCwgYm9keSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcmVzdC5wcm9jZXNzUmVxdWVzdCh7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIHJldHJ5Q291bnQ6IDAsXG4gICAgICAgICAgcmV0cnlSZXF1ZXN0OiBhc3luYyBmdW5jdGlvbiAob3B0aW9uczogU2VuZFJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgY2hhbmdlIHRvIHJlcHJvY2VzcyBxdWV1ZSBpdGVtXG4gICAgICAgICAgICBhd2FpdCByZXN0LnNlbmRSZXF1ZXN0KG9wdGlvbnMpXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdHRVQnLCB1cmwpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBwb3N0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSkpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZSh1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdERUxFVEUnLCB1cmwsIGJvZHkpKVxuICAgIH0sXG5cbiAgICBhc3luYyBwYXRjaDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHVybDogc3RyaW5nLCBib2R5PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BBVENIJywgdXJsLCBib2R5KSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgcHV0PFQgPSB2b2lkPih1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUFVUJywgdXJsLCBib2R5LCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgY2hhbm5lbHM6IHtcbiAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIGFzeW5jIGRlbGV0ZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhc29uPykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZU1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbilcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZWRpdChjaGFubmVsSWQsIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHNlbmQoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3Quc2VuZE1lc3NhZ2UoY2hhbm5lbElkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHB1Ymxpc2goY2hhbm5lbElkLCBtZXNzYWdlSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdWJsaXNoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZClcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGdldChpZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRDaGFubmVsKGlkKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgY3JlYXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuY3JlYXRlQ2hhbm5lbChndWlsZElkLCBvcHRpb25zKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZGVsZXRlKGlkLCByZWFzb24pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlQ2hhbm5lbChpZCwgcmVhc29uKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZWRpdChpZCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0Q2hhbm5lbChpZCwgb3B0aW9ucylcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGZvbGxvdyhzb3VyY2VDaGFubmVsSWQsIHRhcmdldENoYW5uZWxJZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5mb2xsb3dBbm5vdW5jZW1lbnQoc291cmNlQ2hhbm5lbElkLCB0YXJnZXRDaGFubmVsSWQpXG4gICAgICB9LFxuXG4gICAgICBmb3J1bXM6IHtcbiAgICAgICAgYXN5bmMgcG9zdChjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5jcmVhdGVGb3J1bVRocmVhZChjaGFubmVsSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICBhc3luYyBlZGl0KGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlcyhjaGFubmVsSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZGVsZXRlKGNoYW5uZWxJZCwgaWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlKGNoYW5uZWxJZCwgaWQpXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBwb3NpdGlvbnMoZ3VpbGRJZCwgY2hhbm5lbFBvc2l0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0Q2hhbm5lbFBvc2l0aW9ucyhndWlsZElkLCBjaGFubmVsUG9zaXRpb25zKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgaW52aXRlcyhpZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRDaGFubmVsSW52aXRlcyhpZClcbiAgICAgIH0sXG5cbiAgICAgIHN0YWdlczoge1xuICAgICAgICBhc3luYyBjcmVhdGUob3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZVN0YWdlSW5zdGFuY2Uob3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBkZWxldGUoY2hhbm5lbElkLCByZWFzb24pIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCwgcmVhc29uKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGVkaXQoY2hhbm5lbElkLCBkYXRhKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdFN0YWdlSW5zdGFuY2UoY2hhbm5lbElkLCBkYXRhKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGdldChjaGFubmVsSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZClcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIHRocmVhZHM6IHtcbiAgICAgICAgY3JlYXRlOiB7XG4gICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgYXN5bmMgbWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5zdGFydFRocmVhZFdpdGhNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdpdGhvdXQ6IHtcbiAgICAgICAgICAgIGFzeW5jIG1lc3NhZ2UoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnN0YXJ0VGhyZWFkV2l0aG91dE1lc3NhZ2UoY2hhbm5lbElkLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIGdldDoge1xuICAgICAgICAgIGFzeW5jIGFjdGl2ZShndWlsZElkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRBY3RpdmVUaHJlYWRzKGd1aWxkSWQpXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGFyY2hpdmVkOiB7XG4gICAgICAgICAgICBhc3luYyBwcml2YXRlKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRQcml2YXRlQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIGpvaW5lZChjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0UHJpdmF0ZUpvaW5lZEFyY2hpdmVkVGhyZWFkcyhjaGFubmVsSWQsIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBwdWJsaWMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFB1YmxpY0FyY2hpdmVkVGhyZWFkcyhjaGFubmVsSWQsIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyBtZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZClcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYXN5bmMgbWVtYmVycyhjaGFubmVsSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFRocmVhZE1lbWJlcnMoY2hhbm5lbElkKVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgam9pbihjaGFubmVsSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5qb2luVGhyZWFkKGNoYW5uZWxJZClcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBsZWF2ZShjaGFubmVsSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5sZWF2ZVRocmVhZChjaGFubmVsSWQpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMga2ljayhjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnJlbW92ZVRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZClcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIHR5cGluZyhpZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC50cmlnZ2VyVHlwaW5nSW5kaWNhdG9yKGlkKVxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgZW1vamlzOiB7XG4gICAgICBhc3luYyBjcmVhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5jcmVhdGVFbW9qaShndWlsZElkLCBvcHRpb25zKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZGVsZXRlKGd1aWxkSWQsIGlkLCByZWFzb24pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlRW1vamkoZ3VpbGRJZCwgaWQsIHJlYXNvbilcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGVkaXQoZ3VpbGRJZCwgaWQsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdEVtb2ppKGd1aWxkSWQsIGlkLCBvcHRpb25zKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZ2V0KGd1aWxkSWQsIGVtb2ppSWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0RW1vamkoZ3VpbGRJZCwgZW1vamlJZClcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIGd1aWxkczoge1xuICAgICAgYXV0b21vZDoge1xuICAgICAgICBhc3luYyBjcmVhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZGVsZXRlKGd1aWxkSWQsIGV2ZW50SWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVBdXRvbW9kUnVsZShndWlsZElkLCBldmVudElkKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGVkaXQoZ3VpbGRJZCwgcnVsZUlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdEF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQ6IHtcbiAgICAgICAgICBhc3luYyBydWxlKGd1aWxkSWQsIHJ1bGVJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyBydWxlcyhndWlsZElkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRBdXRvbW9kUnVsZXMoZ3VpbGRJZClcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgYXN5bmMgY2hhbm5lbHMoaWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0Q2hhbm5lbHMoaWQpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBlbW9qaXMoaWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0RW1vamlzKGlkKVxuICAgICAgfSxcblxuICAgICAgZXZlbnRzOiB7XG4gICAgICAgIGFzeW5jIGNyZWF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuY3JlYXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBkZWxldGUoZ3VpbGRJZCwgZXZlbnRJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZVNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZWRpdChndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdFNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0OiB7XG4gICAgICAgICAgYXN5bmMgZXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucylcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYXN5bmMgZXZlbnRzKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFNjaGVkdWxlZEV2ZW50cyhndWlsZElkLCBvcHRpb25zKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyB1c2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRTY2hlZHVsZWRFdmVudFVzZXJzKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGludGVncmF0aW9uczoge1xuICAgICAgICBhc3luYyBnZXQoZ3VpbGRJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEludGVncmF0aW9ucyhndWlsZElkKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGRlbGV0ZShndWlsZElkLCBpbnRlZ3JhdGlvbklkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlSW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZClcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGludml0ZXM6IHtcbiAgICAgICAgYXN5bmMgY3JlYXRlKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUludml0ZShjaGFubmVsSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZGVsZXRlKGludml0ZUNvZGUsIHJlYXNvbikge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZUludml0ZShpbnZpdGVDb2RlLCByZWFzb24pXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZ2V0KGludml0ZUNvZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRJbnZpdGUoaW52aXRlQ29kZSwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBsaXN0KGd1aWxkSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRJbnZpdGVzKGd1aWxkSWQpXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICB0ZW1wbGF0ZXM6IHtcbiAgICAgICAgYXN5bmMgY3JlYXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5jcmVhdGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGRlbGV0ZShndWlsZElkLCB0ZW1wbGF0ZUNvZGUpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSlcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZWRpdChndWlsZElkLCB0ZW1wbGF0ZUNvZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0R3VpbGRUZW1wbGF0ZShndWlsZElkLCB0ZW1wbGF0ZUNvZGUsIG9wdGlvbnMpXG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldCh0ZW1wbGF0ZUNvZGUpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHdWlsZFRlbXBsYXRlKHRlbXBsYXRlQ29kZSlcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgbGlzdChndWlsZElkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0R3VpbGRUZW1wbGF0ZXMoZ3VpbGRJZClcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgc3luYyhndWlsZElkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3Quc3luY0d1aWxkVGVtcGxhdGUoZ3VpbGRJZClcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIG1lbWJlcnM6IHtcbiAgICAgICAgYXN5bmMgYmFuKGd1aWxkSWQsIHVzZXJJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmJhbk1lbWJlcihndWlsZElkLCB1c2VySWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGVkaXQoZ3VpbGRJZCwgdXNlcklkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdE1lbWJlcihndWlsZElkLCB1c2VySWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZWRpdFNlbGYoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRCb3RNZW1iZXIoZ3VpbGRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBnZXQoZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0TWVtYmVyKGd1aWxkSWQsIHVzZXJJZClcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBkbSh1c2VySWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXREbUNoYW5uZWwodXNlcklkKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGtpY2soZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5raWNrTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgcmVhc29uKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGxpc3QoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldE1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBwcnVuZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHJ1bmVNZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgc2VhcmNoKGd1aWxkSWQsIHF1ZXJ5LCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3Quc2VhcmNoTWVtYmVycyhndWlsZElkLCBxdWVyeSwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyB1bmJhbihndWlsZElkLCB1c2VySWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC51bmJhbk1lbWJlcihndWlsZElkLCB1c2VySWQpXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBpbnRlcmFjdGlvbnM6IHtcbiAgICAgICAgY29tbWFuZHM6IHtcbiAgICAgICAgICBjcmVhdGU6IHtcbiAgICAgICAgICAgIGFzeW5jIGdsb2JhbChjb21tYW5kKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgZ3VpbGQoY29tbWFuZCwgZ3VpbGRJZCkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5jcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kLCBndWlsZElkKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZGVsZXRlOiB7XG4gICAgICAgICAgICBhc3luYyBnbG9iYWwoY29tbWFuZElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBndWlsZChjb21tYW5kSWQsIGd1aWxkSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZWRpdDoge1xuICAgICAgICAgICAgYXN5bmMgZ2xvYmFsKGNvbW1hbmRJZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgb3B0aW9ucylcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIGd1aWxkKGNvbW1hbmRJZCwgZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgcGVybWlzc2lvbnMoZ3VpbGRJZCwgY29tbWFuZElkLCBiZWFyZXJUb2tlbiwgb3B0aW9ucykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMoZ3VpbGRJZCwgY29tbWFuZElkLCBiZWFyZXJUb2tlbiwgb3B0aW9ucylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGdldDoge1xuICAgICAgICAgICAgZ2xvYmFsOiB7XG4gICAgICAgICAgICAgIGFzeW5jIGFsbCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzKClcbiAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICBhc3luYyBvbmUoY29tbWFuZElkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGd1aWxkczoge1xuICAgICAgICAgICAgICBhc3luYyBhbGwoZ3VpbGRJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyhndWlsZElkKVxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIGFzeW5jIG9uZShjb21tYW5kSWQsIGd1aWxkSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBwZXJtaXNzaW9uKGd1aWxkSWQsIGNvbW1hbmRJZCkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uKGd1aWxkSWQsIGNvbW1hbmRJZClcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIHBlcm1pc3Npb25zKGd1aWxkSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMoZ3VpbGRJZClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIHJlcGxhY2U6IHtcbiAgICAgICAgICAgIGFzeW5jIGdsb2JhbChjb21tYW5kcykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC51cHNlcnRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzKGNvbW1hbmRzKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgZ3VpbGQoZ3VpbGRJZCwgY29tbWFuZHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QudXBzZXJ0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQsIGNvbW1hbmRzKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIHJlc3BvbnNlczoge1xuICAgICAgICAgIGNyZWF0ZToge1xuICAgICAgICAgICAgYXN5bmMgZm9sbG93dXAodG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3Quc2VuZEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgb3B0aW9ucylcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIG9yaWdpbmFsKGludGVyYWN0aW9uSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnNlbmRJbnRlcmFjdGlvblJlc3BvbnNlKGludGVyYWN0aW9uSWQsIHRva2VuLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZGVsZXRlOiB7XG4gICAgICAgICAgICBhc3luYyBmb2xsb3d1cCh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZUZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgb3JpZ2luYWwodG9rZW4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlT3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZWRpdDoge1xuICAgICAgICAgICAgYXN5bmMgZm9sbG93dXAodG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBvcmlnaW5hbCh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZ2V0OiB7XG4gICAgICAgICAgICBhc3luYyBmb2xsb3d1cCh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgb3JpZ2luYWwodG9rZW4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgdXNlcnM6IHtcbiAgICAgIGFzeW5jIGNoYW5uZWwodXNlcklkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldERtQ2hhbm5lbCh1c2VySWQpXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICB3ZWJob29rczoge1xuICAgICAgYXN5bmMgY3JlYXRlKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5jcmVhdGVXZWJob29rKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgIH0sXG5cbiAgICAgIGRlbGV0ZToge1xuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgYXN5bmMgaWQoaWQsIHJlYXNvbikge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlV2ViaG9vayhpZCwgcmVhc29uKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyB0b2tlbihpZCwgdG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZVdlYmhvb2tXaXRoVG9rZW4oaWQsIHRva2VuKVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBlZGl0OiB7XG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICBhc3luYyBpZCh3ZWJob29rSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRXZWJob29rKHdlYmhvb2tJZCwgb3B0aW9ucylcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYXN5bmMgdG9rZW4oaWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0V2ViaG9va1dpdGhUb2tlbihpZCwgdG9rZW4sIG9wdGlvbnMpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGV4ZWN1dGUod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5leGVjdXRlV2ViaG9vayh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKVxuICAgICAgfSxcblxuICAgICAgZ2V0OiB7XG4gICAgICAgIGFzeW5jIGNoYW5uZWwoY2hhbm5lbElkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0Q2hhbm5lbFdlYmhvb2tzKGNoYW5uZWxJZClcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBndWlsZChndWlsZElkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0R3VpbGRXZWJob29rcyhndWlsZElkKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIG1lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0V2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICBhc3luYyBpZCh3ZWJob29rSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFdlYmhvb2sod2ViaG9va0lkKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyB0b2tlbih3ZWJob29rSWQsIHRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIGFzeW5jIGRlbGV0ZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8ganMgaGFjayBtYWtpbmcgaXQgcG9zc2libGUgdG8gZG8gd2ViaG9va3MubWVzc2FnZXMuZWRpdCgpIGFzIHdlbGwgYXMgd2ViaG9va3MubWVzc2FnZXMuZWRpdC5vcmlnaW5hbCgpXG4gICAgICAgIGVkaXQ6IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgLy8gVGhlIGJhc2UgZnVuY3Rpb24gZm9yIHdlYmhvb2tzLm1lc3NhZ2VzLmVkaXQoKVxuICAgICAgICAgIChhc3luYyAod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0V2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKVxuICAgICAgICAgIH0pIGFzIFdlYmhvb2tNZXNzYWdlRWRpdG9yLFxuICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0aWVzIHRoYXQgd2ViaG9va3MubWVzc2FnZXMuZWRpdC54eHggd2lsbCBoYXZlIGFyZSBsaXN0ZWQgaW4gdGhpcyBvYmplY3RcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvcmlnaW5hbDogYXN5bmMgKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdE9yaWdpbmFsV2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBXZWJob29rTWVzc2FnZUVkaXRvcixcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZXMoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUNoYW5uZWwoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmNoYW5uZWxzKGd1aWxkSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVFbW9qaShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppcyhndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCksIGNvbW1hbmQpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmQsIGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5hbGwocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSwgY29tbWFuZClcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRUZW1wbGF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUZvcnVtVGhyZWFkKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZm9ydW0oY2hhbm5lbElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlSW52aXRlKGNoYW5uZWxJZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRJbnZpdGU+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmludml0ZXMoY2hhbm5lbElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnRzKGd1aWxkSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTdGFnZUluc3RhbmNlKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlcygpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVXZWJob29rKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMud2ViaG9va3MoY2hhbm5lbElkKSwge1xuICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgIGF2YXRhcjogb3B0aW9ucy5hdmF0YXIgPyBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zLmF2YXRhcikgOiB1bmRlZmluZWQsXG4gICAgICAgIHJlYXNvbjogb3B0aW9ucy5yZWFzb24sXG4gICAgICB9IGFzIERpc2NvcmRDcmVhdGVXZWJob29rKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQ2hhbm5lbChjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlKGNoYW5uZWxJZCwgb3ZlcndyaXRlSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIG92ZXJ3cml0ZUlkKSwgcmVhc29uID8geyByZWFzb24gfSA6IHVuZGVmaW5lZClcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlRW1vamkoZ3VpbGRJZCwgaWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBpZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5tZXNzYWdlKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRUZW1wbGF0ZShndWlsZElkLCB0ZW1wbGF0ZUNvZGUpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmd1aWxkKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUludGVncmF0aW9uKGd1aWxkSWQsIGludGVncmF0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUludml0ZShpbnZpdGVDb2RlLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlKGludml0ZUNvZGUpLCByZWFzb24gPyB7IHJlYXNvbiB9IDogdW5kZWZpbmVkKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlT3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5vcmlnaW5hbChyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVN0YWdlSW5zdGFuY2UoY2hhbm5lbElkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpLCByZWFzb24gPyB7IHJlYXNvbiB9IDogdW5kZWZpbmVkKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rKHdlYmhvb2tJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMud2ViaG9va3MuaWQod2ViaG9va0lkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlV2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMoZ3VpbGRJZCwgY29tbWFuZElkLCBiZWFyZXJUb2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4oXG4gICAgICAgIHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9uKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSxcbiAgICAgICAge1xuICAgICAgICAgIHBlcm1pc3Npb25zOiBvcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogeyBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YmVhcmVyVG9rZW59YCB9LFxuICAgICAgICB9LFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlKGd1aWxkSWQsIHJ1bGVJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRCb3RQcm9maWxlKG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGF2YXRhciA9IG9wdGlvbnM/LmJvdEF2YXRhclVSTCA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnM/LmJvdEF2YXRhclVSTCkgOiBvcHRpb25zPy5ib3RBdmF0YXJVUkxcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLnVzZXJCb3QoKSwge1xuICAgICAgICB1c2VybmFtZTogb3B0aW9ucy51c2VybmFtZT8udHJpbSgpLFxuICAgICAgICBhdmF0YXIsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbChjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5jaGFubmVsKGNoYW5uZWxJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5vdmVyd3JpdGUoY2hhbm5lbElkLCBvcHRpb25zLmlkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQb3NpdGlvbnMoZ3VpbGRJZCwgY2hhbm5lbFBvc2l0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLmNoYW5uZWxzKGd1aWxkSWQpLCBjaGFubmVsUG9zaXRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0RW1vamkoZ3VpbGRJZCwgaWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGlkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRWRpdHMgYSBmb2xsb3ctdXAgbWVzc2FnZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGVkaXQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFVubGlrZSBgZWRpdE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dCBuZWVkaW5nIHRvIHNlZSB0aGUgY2hhbm5lbCB0aGUgbWVzc2FnZSBpcyBpbi5cbiAgICAgKlxuICAgICAqIERvZXMgbm90IHN1cHBvcnQgZXBoZW1lcmFsIGZvbGxvdy11cCBtZXNzYWdlcyBkdWUgdG8gdGhlc2UgYmVpbmcgc3RhdGVsZXNzLlxuICAgICAqXG4gICAgICogRmlyZXMgYSBfTWVzc2FnZSBVcGRhdGVfIGV2ZW50LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNlZGl0LWZvbGxvd3VwLW1lc3NhZ2V9XG4gICAgICovXG4gICAgYXN5bmMgZWRpdEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5tZXNzYWdlKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZFRlbXBsYXRlKGd1aWxkSWQ6IEJpZ1N0cmluZywgdGVtcGxhdGVDb2RlOiBzdHJpbmcsIG9wdGlvbnM6IE1vZGlmeUd1aWxkVGVtcGxhdGUpOiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5ndWlsZChndWlsZElkLCB0ZW1wbGF0ZUNvZGUpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0TWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5vcmlnaW5hbChyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE9yaWdpbmFsV2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLm9yaWdpbmFsKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpLCB7XG4gICAgICAgIHR5cGU6IEludGVyYWN0aW9uUmVzcG9uc2VUeXBlcy5VcGRhdGVNZXNzYWdlLFxuICAgICAgICBkYXRhOiBvcHRpb25zLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFN0YWdlSW5zdGFuY2UoY2hhbm5lbElkLCBkYXRhKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSwgeyB0b3BpYzogZGF0YS50b3BpYyB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9vayh3ZWJob29rSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpLCB7XG4gICAgICAgIHR5cGU6IEludGVyYWN0aW9uUmVzcG9uc2VUeXBlcy5VcGRhdGVNZXNzYWdlLFxuICAgICAgICBkYXRhOiBvcHRpb25zLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGV4ZWN1dGVXZWJob29rKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucyksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGZvbGxvd0Fubm91bmNlbWVudChzb3VyY2VDaGFubmVsSWQsIHRhcmdldENoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRm9sbG93ZWRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5mb2xsb3coc291cmNlQ2hhbm5lbElkKSwge1xuICAgICAgICB3ZWJob29rX2NoYW5uZWxfaWQ6IHRhcmdldENoYW5uZWxJZCxcbiAgICAgIH0gYXMgRGlzY29yZEZvbGxvd0Fubm91bmNlbWVudENoYW5uZWwpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFjdGl2ZVRocmVhZHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5hY3RpdmUoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24oZ3VpbGRJZCwgY29tbWFuZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9ucyhyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkluZm8oKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDJBcHBsaWNhdGlvbigpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlKGd1aWxkSWQsIHJ1bGVJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1dG9tb2RSdWxlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbChpZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5jaGFubmVsKGlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbEludml0ZXMoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmludml0ZXMoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDaGFubmVsW10+KHJlc3Qucm91dGVzLmd1aWxkcy5jaGFubmVscyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbFdlYmhvb2tzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLndlYmhvb2tzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldERtQ2hhbm5lbCh1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtKCksIHtcbiAgICAgICAgcmVjaXBpZW50X2lkOiB1c2VySWQudG9TdHJpbmcoKSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVtb2ppKGd1aWxkSWQsIGVtb2ppSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBlbW9qaUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RW1vamlzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW1vamlbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5tZXNzYWdlKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdhdGV3YXlCb3QoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEdldEdhdGV3YXlCb3Q+KHJlc3Qucm91dGVzLmdhdGV3YXlCb3QoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFRlbXBsYXRlKHRlbXBsYXRlQ29kZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5jb2RlKHRlbXBsYXRlQ29kZSkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkVGVtcGxhdGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGVtcGxhdGVbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkV2ViaG9va3MoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rW10+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWJob29rcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW50ZWdyYXRpb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW50ZWdyYXRpb25bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludGVncmF0aW9ucyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlKGludml0ZUNvZGUsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW52aXRlTWV0YWRhdGE+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGUoaW52aXRlQ29kZSwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEludml0ZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Tml0cm9TdGlja2VyUGFja3MoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJQYWNrW10+KHJlc3Qucm91dGVzLm5pdHJvU3RpY2tlclBhY2tzKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcml2YXRlQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnByaXZhdGUoY2hhbm5lbElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHJpdmF0ZUpvaW5lZEFyY2hpdmVkVGhyZWFkcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5qb2luZWQoY2hhbm5lbElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHVibGljQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnB1YmxpYyhjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnM/LndpdGhVc2VyQ291bnQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudHMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTY2hlZHVsZWRFdmVudFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50cyhndWlsZElkLCBvcHRpb25zPy53aXRoVXNlckNvdW50KSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnRVc2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8QXJyYXk8eyB1c2VyOiBEaXNjb3JkVXNlcjsgbWVtYmVyPzogRGlzY29yZE1lbWJlciB9Pj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy51c2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2Vzc2lvbkluZm8oKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHYXRld2F5Qm90KClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRocmVhZE1lbWJlcj4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGhyZWFkTWVtYmVycyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGhyZWFkTWVtYmVyW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWVtYmVycyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRVc2VyKGlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLnVzZXIoaWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rKHdlYmhvb2tJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgam9pblRocmVhZChjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlVGhyZWFkKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWUoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcHVibGlzaE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNyb3NzcG9zdChjaGFubmVsSWQsIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZVRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlc3Quc2VuZFJlcXVlc3Qoe1xuICAgICAgICAgIHVybDogcmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayhyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSxcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBib2R5OiByZXN0LmNyZWF0ZVJlcXVlc3Qoe1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBib2R5OiB7IC4uLm9wdGlvbnMgfSxcbiAgICAgICAgICAgIC8vIHJlbW92ZSBhdXRob3JpemF0aW9uIGhlYWRlclxuICAgICAgICAgICAgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiAnJyB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHJldHJ5Q291bnQ6IDAsXG4gICAgICAgICAgcmV0cnlSZXF1ZXN0OiBhc3luYyBmdW5jdGlvbiAob3B0aW9uczogU2VuZFJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgY2hhbmdlIHRvIHJlcHJvY2VzcyBxdWV1ZSBpdGVtXG4gICAgICAgICAgICBhd2FpdCByZXN0LnNlbmRSZXF1ZXN0KG9wdGlvbnMpXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRJbnRlcmFjdGlvblJlc3BvbnNlKGludGVyYWN0aW9uSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZXN0LnNlbmRSZXF1ZXN0KHtcbiAgICAgICAgICB1cmw6IHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMuY2FsbGJhY2soaW50ZXJhY3Rpb25JZCwgdG9rZW4pLFxuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IHJlc3QuY3JlYXRlUmVxdWVzdCh7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGJvZHk6IHsgLi4ub3B0aW9ucyB9LFxuICAgICAgICAgICAgLy8gcmVtb3ZlIGF1dGhvcml6YXRpb24gaGVhZGVyXG4gICAgICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246ICcnIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICByZXRyeVJlcXVlc3Q6IGFzeW5jIGZ1bmN0aW9uIChvcHRpb25zOiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBjaGFuZ2UgdG8gcmVwcm9jZXNzIHF1ZXVlIGl0ZW1cbiAgICAgICAgICAgIGF3YWl0IHJlc3Quc2VuZFJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZE1lc3NhZ2UoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlcyhjaGFubmVsSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5hbGwoY2hhbm5lbElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgc3luY0d1aWxkVGVtcGxhdGUoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGJhbk1lbWJlcihndWlsZElkLCB1c2VySWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDx2b2lkPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdE1lbWJlcihndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5ib3QoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVtYmVycyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGtpY2tNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBwcnVuZU1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDx7IHBydW5lZDogbnVtYmVyIHwgbnVsbCB9PihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5wcnVuZShndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VhcmNoTWVtYmVycyhndWlsZElkLCBxdWVyeSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5zZWFyY2goZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyB1bmJhbk1lbWJlcihndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdHJpZ2dlclR5cGluZ0luZGljYXRvcihjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuY2hhbm5lbHMudHlwaW5nKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHVwc2VydEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoY29tbWFuZHMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCBjb21tYW5kcylcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQsIGNvbW1hbmRzKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLCBjb21tYW5kcylcbiAgICB9LFxuICB9XG5cbiAgcmV0dXJuIHJlc3Rcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMge1xuICAvKiogVGhlIGJvdCB0b2tlbiB3aGljaCB3aWxsIGJlIHVzZWQgdG8gbWFrZSByZXF1ZXN0cy4gKi9cbiAgdG9rZW46IHN0cmluZ1xuICAvKipcbiAgICogRm9yIG9sZCBib3RzIHRoYXQgaGF2ZSBhIGRpZmZlcmVudCBib3QgaWQgYW5kIGFwcGxpY2F0aW9uIGlkLlxuICAgKiBAZGVmYXVsdCBib3QgaWQgZnJvbSB0b2tlblxuICAgKi9cbiAgYXBwbGljYXRpb25JZD86IEJpZ1N0cmluZ1xuICAvKipcbiAgICogVGhlIGJhc2UgdXJsIHRvIGNvbm5lY3QgdG8uIElmIHlvdSBjcmVhdGUgYSBwcm94eSByZXN0LCB0aGF0IHVybCB3b3VsZCBnbyBoZXJlLlxuICAgKiBJVCBTSE9VTEQgTk9UIEVORCBXSVRIIEEgL1xuICAgKiBAZGVmYXVsdCBodHRwczovL2Rpc2NvcmQuY29tL2FwaVxuICAgKi9cbiAgYmFzZVVybD86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIGFwaSB2ZXJzaW9ucyB3aGljaCBjYW4gYmUgdXNlZCB0byBtYWtlIHJlcXVlc3RzLlxuICAgKiBAZGVmYXVsdCAxMFxuICAgKi9cbiAgdmVyc2lvbj86IEFwaVZlcnNpb25zXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdE1hbmFnZXIge1xuICAvKiogVGhlIGJvdCB0b2tlbiB3aGljaCB3aWxsIGJlIHVzZWQgdG8gbWFrZSByZXF1ZXN0cy4gKi9cbiAgdG9rZW46IHN0cmluZ1xuICAvKiogVGhlIGFwcGxpY2F0aW9uIGlkLiBOb3JtYWxseSB0aGlzIGlzIG5vdCByZXF1aXJlZCBmb3IgcmVjZW50IGJvdHMgYnV0IG9sZCBib3QncyBhcHBsaWNhdGlvbiBpZCBpcyBzb21ldGltZXMgZGlmZmVyZW50IGZyb20gdGhlIGJvdCBpZCBzbyBpdCBpcyByZXF1aXJlZCBmb3IgdGhvc2UgYm90cy4gKi9cbiAgYXBwbGljYXRpb25JZDogYmlnaW50XG4gIC8qKiBUaGUgYXBpIHZlcnNpb24gdG8gdXNlIHdoZW4gbWFraW5nIHJlcXVlc3RzLiBPbmx5IHRoZSBsYXRlc3Qgc3VwcG9ydGVkIHZlcnNpb24gd2lsbCBiZSB0ZXN0ZWQuICovXG4gIHZlcnNpb246IEFwaVZlcnNpb25zXG4gIC8qKlxuICAgKiBUaGUgYmFzZSB1cmwgdG8gY29ubmVjdCB0by4gSWYgeW91IGNyZWF0ZSBhIHByb3h5IHJlc3QsIHRoYXQgdXJsIHdvdWxkIGdvIGhlcmUuXG4gICAqIElUIFNIT1VMRCBOT1QgRU5EIFdJVEggQSAvXG4gICAqIEBkZWZhdWx0IGh0dHBzOi8vZGlzY29yZC5jb20vYXBpXG4gICAqL1xuICBiYXNlVXJsOiBzdHJpbmdcbiAgLyoqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lcyBhIHJlcXVlc3Qgc2hvdWxkIGJlIHJldHJpZWQuIERlZmF1bHRzIHRvIEluZmluaXR5ICovXG4gIG1heFJldHJ5Q291bnQ6IG51bWJlclxuICAvKiogV2hldGhlciBvciBub3QgdGhlIG1hbmFnZXIgaXMgcmF0ZSBsaW1pdGVkIGdsb2JhbGx5IGFjcm9zcyBhbGwgcmVxdWVzdHMuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBnbG9iYWxseVJhdGVMaW1pdGVkOiBib29sZWFuXG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgcmF0ZSBsaW1pdGVkIHBhdGhzIGFyZSBiZWluZyBwcm9jZXNzZWQgdG8gYWxsb3cgcmVxdWVzdHMgdG8gYmUgbWFkZSBvbmNlIHRpbWUgaXMgdXAuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRoczogYm9vbGVhblxuICAvKiogVGhlIHF1ZXVlcyB0aGF0IGhvbGQgYWxsIHRoZSByZXF1ZXN0cyB0byBiZSBwcm9jZXNzZWQuICovXG4gIHF1ZXVlczogTWFwPHN0cmluZywgUXVldWU+XG4gIC8qKiBUaGUgcGF0aHMgdGhhdCBhcmUgY3VycmVudGx5IHJhdGUgbGltaXRlZC4gKi9cbiAgcmF0ZUxpbWl0ZWRQYXRoczogTWFwPHN0cmluZywgUmVzdFJhdGVMaW1pdGVkUGF0aD5cbiAgLyoqIFRoZSBidWNrZXQgZm9yIGhhbmRsaW5nIGFueSBpbnZhbGlkIHJlcXVlc3RzLiAgKi9cbiAgaW52YWxpZEJ1Y2tldDogSW52YWxpZFJlcXVlc3RCdWNrZXRcbiAgLyoqIFRoZSByb3V0ZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIG1hbmFnZXIuICovXG4gIHJvdXRlczoge1xuICAgIC8qKiBSb3V0ZSB0byBnZXQgYSBib3RzIHNlc3Npb24gaW5mby4gKi9cbiAgICBzZXNzaW9uSW5mbzogKCkgPT4gc3RyaW5nXG4gICAgLyoqIEEgc3BlY2lmaWMgdXNlciByb3V0ZS4gKi9cbiAgICB1c2VyOiAoaWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgLyoqIEN1cnJlbnQgYm90IHVzZXIgcm91dGUuICovXG4gICAgdXNlckJvdDogKCkgPT4gc3RyaW5nXG4gICAgLy8gT0F1dGgyXG4gICAgb2F1dGgyQXBwbGljYXRpb246ICgpID0+IHN0cmluZ1xuICAgIC8vIEdhdGV3YXkgQm90XG4gICAgZ2F0ZXdheUJvdDogKCkgPT4gc3RyaW5nXG4gICAgLy8gTml0cm8gU3RpY2tlciBQYWNrc1xuICAgIG5pdHJvU3RpY2tlclBhY2tzOiAoKSA9PiBzdHJpbmdcbiAgICAvKiogUm91dGVzIGZvciB3ZWJob29rIHJlbGF0ZWQgcm91dGVzLiAqL1xuICAgIHdlYmhvb2tzOiB7XG4gICAgICAvKiogUm91dGUgZm9yIG1hbmFnaW5nIHRoZSBvcmlnaW5hbCBtZXNzYWdlIHNlbnQgYnkgYSB3ZWJob29rLiAqL1xuICAgICAgb3JpZ2luYWw6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgb3B0aW9ucz86IHsgdGhyZWFkSWQ/OiBCaWdTdHJpbmcgfSkgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIHdlYmhvb2sgd2l0aCBhIGlkLiAqL1xuICAgICAgaWQ6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgd2ViaG9vayB3aXRoIGEgdG9rZW4uICovXG4gICAgICB3ZWJob29rOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHdhaXQ/OiBib29sZWFuOyB0aHJlYWRJZD86IEJpZ1N0cmluZyB9KSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBtZXNzYWdlIHRoYXQgd2FzIHNlbnQgdGhyb3VnaCBhIHdlYmhvb2suICovXG4gICAgICBtZXNzYWdlOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogeyB0aHJlYWRJZD86IEJpZ1N0cmluZyB9KSA9PiBzdHJpbmdcbiAgICB9XG4gICAgLyoqIFJvdXRlcyBmb3IgY2hhbm5lbCByZWxhdGVkIGVuZHBvaW50cy4gKi9cbiAgICBjaGFubmVsczoge1xuICAgICAgLyoqIFJvdXRlIGZvciBub24tc3BlY2lmaWMgZG0gY2hhbm5lbC4gKi9cbiAgICAgIGRtOiAoKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3Igbm9uLXNwZWNpZmljIHdlYmhvb2sgaW4gYSBjaGFubmVsLiAqL1xuICAgICAgd2ViaG9va3M6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGEgc3BlY2lmaWMgY2hhbm5lbC4gKi9cbiAgICAgIGNoYW5uZWw6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGZvbGxvd2luZyBhIHNwZWNpZmljIGNoYW5uZWwuICovXG4gICAgICBmb2xsb3c6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIG1hbmFnaW5nIGEgZm9ydW0gd2l0aCBhIG1lc3NhZ2UuICovXG4gICAgICBmb3J1bTogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgYSBzcGVjaWZpYyBjaGFubmVsJ3MgaW52aXRlcy4gKi9cbiAgICAgIGludml0ZXM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGEgc3BlY2lmaWMgbWVzc2FnZSAqL1xuICAgICAgbWVzc2FnZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBpZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIG1lc3NhZ2VzLiAqL1xuICAgICAgbWVzc2FnZXM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IEdldE1lc3NhZ2VzT3B0aW9ucykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgb3ZlcndyaXRlLiAqL1xuICAgICAgb3ZlcndyaXRlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG92ZXJ3cml0ZUlkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBjcm9zc3Bvc3RpbmcgYSBzcGVjaWZpYyBtZXNzYWdlLiAqL1xuICAgICAgY3Jvc3Nwb3N0OiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIHN0YWdlcyAqL1xuICAgICAgc3RhZ2VzOiAoKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZpYyBzdGFnZSAqL1xuICAgICAgc3RhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGVzIGZvciBoYW5kbGluZyB0aHJlYWQgcmVsYXRlZCB0byBhIGNoYW5uZWwuICovXG4gICAgICB0aHJlYWRzOiB7XG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgdGhyZWFkIGEgc3BlY2lmaWMgbWVzc2FnZS4gKi9cbiAgICAgICAgbWVzc2FnZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgdGhyZWFkIHdpdGhvdXQgYSBtZXNzYWdlLiAqL1xuICAgICAgICBhbGw6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgYWN0aXZlIHRocmVhZHMuICovXG4gICAgICAgIGFjdGl2ZTogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgbWVtYmVycyBpbiBhIHRocmVhZC4gKi9cbiAgICAgICAgbWVtYmVyczogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciB0aGUgYm90IG1lbWJlciBpbiBhIHRocmVhZC4gKi9cbiAgICAgICAgbWU6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgYSBzcGVjaWZpYyBtZW1iZXIgaW4gYSB0aHJlYWQuICovXG4gICAgICAgIHVzZXI6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGFyY2hpdmVkIHRocmVhZHMuICovXG4gICAgICAgIGFyY2hpdmVkOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIHB1YmxpY2FsbHkgYXJjaGl2ZWQgdGhyZWFkcy4gKi9cbiAgICAgICAgcHVibGljOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBMaXN0QXJjaGl2ZWRUaHJlYWRzKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBwcml2YXRlIGFyY2hpdmVkIHRocmVhZHMuICovXG4gICAgICAgIHByaXZhdGU6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RBcmNoaXZlZFRocmVhZHMpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIHByaXZhdGUgYXJjaGl2ZWQgdGhyZWFkcyB0aGF0IHRoZSBib3QgaGFzIGpvaW5lZC4gKi9cbiAgICAgICAgam9pbmVkOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBMaXN0QXJjaGl2ZWRUaHJlYWRzKSA9PiBzdHJpbmdcbiAgICAgIH1cbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgdHlwaW5nIGluZGljYXRvcnMgaW4gYSBjwqtoYW5uZWwuICovXG4gICAgICB0eXBpbmc6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgfVxuICAgIC8qKiBSb3V0ZXMgZm9yIGd1aWxkIHJlbGF0ZWQgZW5kcG9pbnRzLiAqL1xuICAgIGd1aWxkczoge1xuICAgICAgLyoqIFJvdXRlcyBmb3IgYSBndWlsZHMgYXV0b21vZGVyYXRpb24uICovXG4gICAgICBhdXRvbW9kOiB7XG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBndWlsZCdzIGF1dG9tb2RlcmF0aW9uLiAqL1xuICAgICAgICBydWxlczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZpYyBhdXRvbW9kZXJhdGlvbiBydWxlIGd1aWxkJ3MgKi9cbiAgICAgICAgcnVsZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcnVsZUlkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgfVxuICAgICAgLyoqIFJvdXRlcyBmb3IgaGFuZGxpbmcgYSBndWlsZCdzIHNjaGVkdWxlZCBldmVudHMuICovXG4gICAgICBldmVudHM6IHtcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBub24tc3BlY2lmaWMgc2NoZWR1bGVkIGV2ZW50LiAqL1xuICAgICAgICBldmVudHM6IChndWlsZElkOiBCaWdTdHJpbmcsIHdpdGhVc2VyQ291bnQ/OiBib29sZWFuKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHNwZWNpZmljIHNjaGVkdWxlZCBldmVudC4gKi9cbiAgICAgICAgZXZlbnQ6IChndWlsZElkOiBCaWdTdHJpbmcsIGV2ZW50SWQ6IEJpZ1N0cmluZywgd2l0aFVzZXJDb3VudD86IGJvb2xlYW4pID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc2NoZWR1bGVkIGV2ZW50IHVzZXJzLiAqL1xuICAgICAgICB1c2VyczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgZXZlbnRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogR2V0U2NoZWR1bGVkRXZlbnRVc2VycykgPT4gc3RyaW5nXG4gICAgICB9XG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBjaGFubmVscyBpbiBhIGd1aWxkICovXG4gICAgICBjaGFubmVsczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgZW1vamkuICovXG4gICAgICBlbW9qaTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgaWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBlbW9qaXMuICovXG4gICAgICBlbW9qaXM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHNwZWNpZmljIGludGVncmF0aW9uLiAqL1xuICAgICAgaW50ZWdyYXRpb246IChndWlsZElkOiBCaWdTdHJpbmcsIGludGVncmF0aW9uSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBpbnRlZ3JhdGlvbnMuICovXG4gICAgICBpbnRlZ3JhdGlvbnM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHNwZWNpZmljIGd1aWxkIGludml0ZS4gKi9cbiAgICAgIGludml0ZTogKGludml0ZUNvZGU6IHN0cmluZywgb3B0aW9ucz86IEdldEludml0ZSkgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBpbnZpdGVzIGluIGEgZ3VpbGQuICovXG4gICAgICBpbnZpdGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIHdlYmhvb2tzIGluIGEgZ3VpbGQgKi9cbiAgICAgIHdlYmhvb2tzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZXMgZm9yIGhhbmRsaW5nIGEgZ3VpbGQncyBtZW1iZXJzLiAqL1xuICAgICAgbWVtYmVyczoge1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgZ3VpbGQgbWVtYmVyJ3MgYmFuLiAqL1xuICAgICAgICBiYW46IChndWlsZElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHRoZSBib3QgZ3VpbGQgbWVtYmVyLiAqL1xuICAgICAgICBib3Q6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgZ3VpbGQgbWVtYmVyLiAqL1xuICAgICAgICBtZW1iZXI6IChndWlsZElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBub24tc3BlY2lmaWMgZ3VpbGQgbWVtYmVycy4gKi9cbiAgICAgICAgbWVtYmVyczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RHdWlsZE1lbWJlcnMpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG1lbWJlciBzZWFyY2hpbmcgaW4gYSBndWlsZC4gKi9cbiAgICAgICAgc2VhcmNoOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBxdWVyeTogc3RyaW5nLCBvcHRpb25zPzogeyBsaW1pdD86IG51bWJlciB9KSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBwcnVuaW5nIGd1aWxkIG1lbWJlcnMuICovXG4gICAgICAgIHBydW5lOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogR2V0R3VpbGRQcnVuZUNvdW50UXVlcnkpID0+IHN0cmluZ1xuICAgICAgfVxuICAgICAgLyoqIFJvdXRlcyBmb3IgaGFuZGxpbmcgYSBndWlsZCdzIHRlbXBsYXRlcy4gKi9cbiAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmYyBndWlsZCdzIHRlbXBsYXRlcyB3aXRoIGEgY29kZSBvbmx5LiAqL1xuICAgICAgICBjb2RlOiAoY29kZTogc3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHNwZWNpZmljIGd1aWxkJ3MgdGVtcGxhdGUgd2l0aCBhIGd1aWxkIGlkIGFuZCBjb2RlLiAqL1xuICAgICAgICBndWlsZDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgY29kZTogc3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBub24tc3BlY2lmaWMgZ3VpbGQncyB0ZW1wbGF0ZXMuICovXG4gICAgICAgIGFsbDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICB9XG4gICAgfVxuICAgIC8qKiBSb3V0ZXMgZm9yIGludGVyYWN0aW9uIHJlbGF0ZWQgZW5kcG9pbnRzLiAqL1xuICAgIGludGVyYWN0aW9uczoge1xuICAgICAgLyoqIFJvdXRlcyBmb3IgaW50ZXJhY3Rpb24gY29tbWFuZCByZWxhdGVkIGVuZHBvaW50cy4gKi9cbiAgICAgIGNvbW1hbmRzOiB7XG4gICAgICAgIC8qKiBSb3V0ZSBmb3Igbm9uLXNwZWNpZmljIGNvbW1hbmRzLiAqL1xuICAgICAgICBjb21tYW5kczogKGFwcGxpY2F0aW9uSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgZ3VpbGQgcmVsYXRlZCBjb21tYW5kcy4gKi9cbiAgICAgICAgZ3VpbGRzOiB7XG4gICAgICAgICAgLyoqIFJvdXRlIGZvciBub24tc3BlY2lmaWMgZ3VpbGQgY29tbWFuZHMuICovXG4gICAgICAgICAgYWxsOiAoYXBwbGljYXRpb25JZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAgIC8qKiBSb3V0ZSBmb3IgYSBzcGVjaWZpYyBndWlsZCBjb21tYW5kLiAqL1xuICAgICAgICAgIG9uZTogKGFwcGxpY2F0aW9uSWQ6IEJpZ1N0cmluZywgZ3VpbGRJZDogQmlnU3RyaW5nLCBjb21tYW5kSWQ6IEJpZ1N0cmluZywgd2l0aExvY2FsaXphdGlvbnM/OiBib29sZWFuKSA9PiBzdHJpbmdcbiAgICAgICAgfVxuICAgICAgICAvKiogUm91dGUgZm9yIG5vbi1zcGVjaWZpYyBjb21tYW5kIHBlcm1pc3Npb25zLiAqL1xuICAgICAgICBwZXJtaXNzaW9uczogKGFwcGxpY2F0aW9uSWQ6IEJpZ1N0cmluZywgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBhIHNwZWNpZmljIGNvbW1hbmQncyBwZXJtaXNzaW9uLiAqL1xuICAgICAgICBwZXJtaXNzaW9uOiAoYXBwbGljYXRpb25JZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcsIGNvbW1hbmRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBhIHNwZWNpZmljIGNvbW1hbmQuICovXG4gICAgICAgIGNvbW1hbmQ6IChhcHBsaWNhdGlvbklkOiBCaWdTdHJpbmcsIGNvbW1hbmRJZDogQmlnU3RyaW5nLCB3aXRoTG9jYWxpemF0aW9ucz86IGJvb2xlYW4pID0+IHN0cmluZ1xuICAgICAgfVxuICAgICAgLyoqIFJvdXRlcyBmb3IgaW50ZXJhY3Rpb24gcmVzcG9uc2UgcmVsYXRlZCBlbmRwb2ludHMuICovXG4gICAgICByZXNwb25zZXM6IHtcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIGNhbGxiYWNrIHJlc3BvbnNlIHdpdGggaWQgYW5kIHRva2VuLiAqL1xuICAgICAgICBjYWxsYmFjazogKGludGVyYWN0aW9uSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgdGhlIG9yaWdpbmFsIHJlc3BvbnNlIHVzaW5nIGlkIGFuZCB0b2tlbi4gKi9cbiAgICAgICAgb3JpZ2luYWw6IChpbnRlcmFjdGlvbklkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgZm9sbG93dXAgbWVzc2FnZSBmcm9tIGEgaW50ZXJhY3Rpb24gcmVzcG9uc2UuICovXG4gICAgICAgIG1lc3NhZ2U6IChhcHBsaWNhdGlvbklkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqIENoZWNrIHRoZSByYXRlIGxpbWl0cyBmb3IgYSB1cmwgb3IgYSBidWNrZXQuICovXG4gIGNoZWNrUmF0ZUxpbWl0czogKHVybDogc3RyaW5nKSA9PiBudW1iZXIgfCBmYWxzZVxuICAvKiogQ3JlYXRlcyB0aGUgcmVxdWVzdCBib2R5IGFuZCBoZWFkZXJzIHRoYXQgYXJlIG5lY2Vzc2FyeSB0byBzZW5kIGEgcmVxdWVzdC4gV2lsbCBoYW5kbGUgZGlmZmVyZW50IHR5cGVzIG9mIG1ldGhvZHMgYW5kIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IGZvciBkaXNjb3JkLiAqL1xuICBjcmVhdGVSZXF1ZXN0OiAob3B0aW9uczogQ3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zKSA9PiBSZXF1ZXN0Qm9keVxuICAvKiogVGhpcyB3aWxsIGNyZWF0ZSBhIGluZmluaXRlIGxvb3AgcnVubmluZyBpbiAxIHNlY29uZHMgdXNpbmcgdGFpbCByZWN1cnNpb24gdG8ga2VlcCByYXRlIGxpbWl0cyBjbGVhbi4gV2hlbiBhIHJhdGUgbGltaXQgcmVzZXRzLCB0aGlzIHdpbGwgcmVtb3ZlIGl0IHNvIHRoZSBxdWV1ZSBjYW4gcHJvY2VlZC4gKi9cbiAgcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHM6ICgpID0+IHZvaWRcbiAgLyoqIFByb2Nlc3NlcyB0aGUgcmF0ZSBsaW1pdCBoZWFkZXJzIGFuZCBkZXRlcm1pbmVzIGlmIGl0IG5lZWRzIHRvIGJlIHJhdGUgbGltaXRlZCBhbmQgcmV0dXJucyB0aGUgYnVja2V0IGlkIGlmIGF2YWlsYWJsZSAqL1xuICBwcm9jZXNzSGVhZGVyczogKHVybDogc3RyaW5nLCBoZWFkZXJzOiBIZWFkZXJzKSA9PiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgLyoqIFNlbmRzIGEgcmVxdWVzdCB0byB0aGUgYXBpLiAqL1xuICBzZW5kUmVxdWVzdDogKG9wdGlvbnM6IFNlbmRSZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogU3BsaXQgYSB1cmwgdG8gc2VwYXJhdGUgcmF0ZSBsaW1pdCBidWNrZXRzIGJhc2VkIG9uIG1ham9yL21pbm9yIHBhcmFtZXRlcnMuICovXG4gIHNpbXBsaWZ5VXJsOiAodXJsOiBzdHJpbmcsIG1ldGhvZDogUmVxdWVzdE1ldGhvZHMpID0+IHN0cmluZ1xuICAvKiogTWFrZSBhIHJlcXVlc3QgdG8gYmUgc2VudCB0byB0aGUgYXBpLiAqL1xuICBtYWtlUmVxdWVzdDogPFQgPSB1bmtub3duPihtZXRob2Q6IFJlcXVlc3RNZXRob2RzLCB1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBQcm9taXNlPFQ+XG4gIC8qKiBUYWtlcyBhIHJlcXVlc3QgYW5kIHByb2Nlc3NlcyBpdCBpbnRvIGEgcXVldWUuICovXG4gIHByb2Nlc3NSZXF1ZXN0OiAocmVxdWVzdDogU2VuZFJlcXVlc3RPcHRpb25zKSA9PiB2b2lkXG4gIC8qKiBNYWtlIGEgZ2V0IHJlcXVlc3QgdG8gdGhlIGFwaSAqL1xuICBnZXQ6IDxUID0gdm9pZD4odXJsOiBzdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8VD4+XG4gIC8qKiBNYWtlIGEgcG9zdCByZXF1ZXN0IHRvIHRoZSBhcGkuICovXG4gIHBvc3Q6IDxUID0gdm9pZD4odXJsOiBzdHJpbmcsIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBQcm9taXNlPENhbWVsaXplPFQ+PlxuICAvKiogTWFrZSBhIHB1dCByZXF1ZXN0IHRvIHRoZSBhcGkuICovXG4gIHB1dDogPFQgPSB2b2lkPih1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBQcm9taXNlPENhbWVsaXplPFQ+PlxuICAvKiogTWFrZSBhIGRlbGV0ZSByZXF1ZXN0IHRvIHRoZSBhcGkuICovXG4gIGRlbGV0ZTogKHVybDogc3RyaW5nLCBib2R5PzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogTWFrZSBhIHBhdGNoIHJlcXVlc3QgdG8gdGhlIGFwaS4gKi9cbiAgcGF0Y2g6IDxUID0gdm9pZD4odXJsOiBzdHJpbmcsIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBQcm9taXNlPENhbWVsaXplPFQ+PlxuICAvKiogSGVscGVyIG1ldGhvZHMgcmVsYXRlZCB0byBjaGFubmVscyAqL1xuICBjaGFubmVsczoge1xuICAgIC8qKiBNZXRob2RzIHJlbGF0ZWQgdG8gbWVzc2FnZXMgaW4gYSBjaGFubmVsICovXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGEgY2hhbm5lbC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIHNlbmQgdGhlIG1lc3NhZ2UgaW4uXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIG1lc3NhZ2UuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGF0IHRoZSBib3QgdXNlciBiZSBhYmxlIHRvIHNlZSB0aGUgY29udGVudHMgb2YgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgdG8gYmUgc2VudCBpbi5cbiAgICAgICAqXG4gICAgICAgKiBJZiBzZW5kaW5nIGEgbWVzc2FnZSB0byBhIGd1aWxkIGNoYW5uZWw6XG4gICAgICAgKiAtIFJlcXVpcmVzIHRoZSBgU0VORF9NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBJZiBzZW5kaW5nIGEgVFRTIG1lc3NhZ2U6XG4gICAgICAgKiAtIFJlcXVpcmVzIHRoZSBgU0VORF9UVFNfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogSWYgc2VuZGluZyBhIG1lc3NhZ2UgYXMgYSByZXBseSB0byBhbm90aGVyIG1lc3NhZ2U6XG4gICAgICAgKiAtIFJlcXVpcmVzIHRoZSBgUkVBRF9NRVNTQUdFX0hJU1RPUllgIHBlcm1pc3Npb24uXG4gICAgICAgKiAtIFRoZSBtZXNzYWdlIGJlaW5nIHJlcGxpZWQgdG8gY2Fubm90IGJlIGEgc3lzdGVtIG1lc3NhZ2UuXG4gICAgICAgKlxuICAgICAgICog4pqg77iPIFRoZSBtYXhpbXVtIHNpemUgb2YgYSByZXF1ZXN0IChhY2NvdW50aW5nIGZvciBhbnkgYXR0YWNobWVudHMgYW5kIG1lc3NhZ2UgY29udGVudCkgZm9yIGJvdCB1c2VycyBpcyBfOCBNaUJfLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2NyZWF0ZS1tZXNzYWdlfVxuICAgICAgICovXG4gICAgICBzZW5kOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZU1lc3NhZ2VPcHRpb25zKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgICAgIC8qKlxuICAgICAgICogRWRpdHMgYSBtZXNzYWdlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZWRpdCB0aGUgbWVzc2FnZSBpbi5cbiAgICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSURzIG9mIHRoZSBtZXNzYWdlIHRvIGVkaXQuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBJZiBlZGl0aW5nIGFub3RoZXIgdXNlcidzIG1lc3NhZ2U6XG4gICAgICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX01FU1NBR0VTYCBwZXJtaXNzaW9uLlxuICAgICAgICogLSBPbmx5IHRoZSB7QGxpbmsgRWRpdE1lc3NhZ2UuZmxhZ3MgfCBmbGFnc30gcHJvcGVydHkgb2YgdGhlIHtAbGluayBvcHRpb25zfSBvYmplY3QgcGFyYW1ldGVyIGNhbiBiZSBlZGl0ZWQuXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZWRpdC1tZXNzYWdlfVxuICAgICAgICovXG4gICAgICBlZGl0OiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBFZGl0TWVzc2FnZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gICAgICAvKipcbiAgICAgICAqIENyb3NzLXBvc3RzIGEgbWVzc2FnZSBwb3N0ZWQgaW4gYW4gYW5ub3VuY2VtZW50IGNoYW5uZWwgdG8gc3Vic2NyaWJlZCBjaGFubmVscy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBhbm5vdW5jZW1lbnQgY2hhbm5lbC5cbiAgICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gY3Jvc3MtcG9zdC5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcm9zcy1wb3N0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYFNFTkRfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogSWYgbm90IGNyb3NzLXBvc3Rpbmcgb3duIG1lc3NhZ2U6XG4gICAgICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX01FU1NBR0VTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgQ3JlYXRlXyBldmVudCBpbiB0aGUgZ3VpbGRzIHRoZSBzdWJzY3JpYmVkIGNoYW5uZWxzIGFyZSBpbi5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNjcm9zc3Bvc3QtbWVzc2FnZX1cbiAgICAgICAqL1xuICAgICAgcHVibGlzaDogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYSBtZXNzYWdlIGZyb20gYSBjaGFubmVsLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGZyb20uXG4gICAgICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGRlbGV0ZSBmcm9tIHRoZSBjaGFubmVsLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBJZiBub3QgZGVsZXRpbmcgb3duIG1lc3NhZ2U6XG4gICAgICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX01FU1NBR0VTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2RlbGV0ZS1tZXNzYWdlfVxuICAgICAgICovXG4gICAgICBkZWxldGU6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgY2hhbm5lbCBieSBpdHMgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQ2hhbm5lbH0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIHRoZSBjaGFubmVsIGlzIGEgdGhyZWFkLCBhIHtAbGluayBUaHJlYWRNZW1iZXJ9IG9iamVjdCBpcyBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZ2V0LWNoYW5uZWx9XG4gICAgICovXG4gICAgZ2V0OiAoaWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQ2hhbm5lbD4+XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNoYW5uZWwgd2l0aGluIGEgZ3VpbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gY3JlYXRlIHRoZSBjaGFubmVsIHdpdGhpbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGNoYW5uZWwuXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiBJZiBzZXR0aW5nIHBlcm1pc3Npb24gb3ZlcndyaXRlcywgb25seSB0aGUgcGVybWlzc2lvbnMgdGhlIGJvdCB1c2VyIGhhcyBpbiB0aGUgZ3VpbGQgY2FuIGJlIGFsbG93ZWQgb3IgZGVuaWVkLlxuICAgICAqXG4gICAgICogU2V0dGluZyB0aGUgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbiBpcyBvbmx5IHBvc3NpYmxlIGZvciBndWlsZCBhZG1pbmlzdHJhdG9ycy5cbiAgICAgKlxuICAgICAqIEZpcmVzIGEgX0NoYW5uZWwgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2NyZWF0ZS1ndWlsZC1jaGFubmVsfVxuICAgICAqL1xuICAgIGNyZWF0ZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlR3VpbGRDaGFubmVsKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIGEgY2hhbm5lbCBmcm9tIHdpdGhpbiBhIGd1aWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBkZWxldGUuXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZWQge0BsaW5rIENoYW5uZWx9LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBGb3IgY29tbXVuaXR5IGd1aWxkcywgdGhlIF9SdWxlc18sIF9HdWlkZWxpbmVzXyBhbmQgX0NvbW11bml0eSBVcGRhdGVfIGNoYW5uZWxzIGNhbm5vdCBiZSBkZWxldGVkLlxuICAgICAqXG4gICAgICogSWYgdGhlIGNoYW5uZWwgaXMgYSB0aHJlYWQ6XG4gICAgICogLSBSZXF1aXJlcyB0aGUgYE1BTkFHRV9USFJFQURTYCBwZXJtaXNzaW9uLlxuICAgICAqXG4gICAgICogLSBGaXJlcyBhIF9UaHJlYWQgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAqXG4gICAgICogT3RoZXJ3aXNlOlxuICAgICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiAtIOKaoO+4jyBEZWxldGluZyBhIGNhdGVnb3J5IGNoYW5uZWwgZG9lcyBub3QgZGVsZXRlIGl0cyBjaGlsZCBjaGFubmVscy5cbiAgICAgKiAgIEluc3RlYWQsIHRoZXkgd2lsbCBoYXZlIHRoZWlyIGBwYXJlbnRfaWRgIHByb3BlcnR5IHJlbW92ZWQsIGFuZCBhIGBDaGFubmVsIFVwZGF0ZWAgZ2F0ZXdheSBldmVudCB3aWxsIGZpcmUgZm9yIGVhY2ggb2YgdGhlbS5cbiAgICAgKlxuICAgICAqIC0gRmlyZXMgYSBfQ2hhbm5lbCBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNkZWxldGVjbG9zZS1jaGFubmVsfVxuICAgICAqL1xuICAgIGRlbGV0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAvKipcbiAgICAgKiBFZGl0cyBhIGNoYW5uZWwncyBzZXR0aW5ncy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZWRpdC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgY2hhbm5lbC5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkQ2hhbm5lbH0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIGVkaXRpbmcgYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5Hcm91cERtfTpcbiAgICAgKiAtIEZpcmVzIGEgX0NoYW5uZWwgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAqXG4gICAgICogSWYgZWRpdGluZyBhIHRocmVhZCBjaGFubmVsOlxuICAgICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfVEhSRUFEU2AgcGVybWlzc2lvbiBfX3VubGVzc19fIGlmIHNldHRpbmcgdGhlIGBhcmNoaXZlZGAgcHJvcGVydHkgdG8gYGZhbHNlYCB3aGVuIHRoZSBgbG9ja2VkYCBwcm9wZXJ0eSBpcyBhbHNvIGBmYWxzZWAsIGluIHdoaWNoIGNhc2Ugb25seSB0aGUgYFNFTkRfTUVTU0FHRVNgIHBlcm1pc3Npb24gaXMgcmVxdWlyZWQuXG4gICAgICpcbiAgICAgKiAtIEZpcmVzIGEgX1RocmVhZCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICpcbiAgICAgKiBJZiBlZGl0aW5nIGEgZ3VpbGQgY2hhbm5lbDpcbiAgICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0NIQU5ORUxTYCBwZXJtaXNzaW9uLlxuICAgICAqXG4gICAgICogLSBJZiBtb2RpZnlpbmcgcGVybWlzc2lvbiBvdmVycmlkZXM6XG4gICAgICogICAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1JPTEVTYCBwZXJtaXNzaW9uLlxuICAgICAqXG4gICAgICogICAtIE9ubHkgcGVybWlzc2lvbnMgdGhlIGJvdCB1c2VyIGhhcyBpbiB0aGUgZ3VpbGQgb3IgcGFyZW50IGNoYW5uZWwgY2FuIGJlIGFsbG93ZWQvZGVuaWVkIF9fdW5sZXNzX18gdGhlIGJvdCB1c2VyIGhhcyBhIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24gb3ZlcnJpZGUgaW4gdGhlIGNoYW5uZWwuXG4gICAgICpcbiAgICAgKiAtIElmIG1vZGlmeWluZyBhIGNoYW5uZWwgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkQ2F0ZWdvcnl9OlxuICAgICAqICAgICAtIEZpcmVzIGEgX0NoYW5uZWwgVXBkYXRlXyBnYXRld2F5IGV2ZW50IGZvciBlYWNoIGNoaWxkIGNoYW5uZWwgaW1wYWN0ZWQgaW4gdGhpcyBjaGFuZ2UuXG4gICAgICogLSBPdGhlcndpc2U6XG4gICAgICogICAgIC0gRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICovXG4gICAgZWRpdDogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBNb2RpZnlDaGFubmVsKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgICAvKipcbiAgICAgKiBGb2xsb3dzIGFuIGFubm91bmNlbWVudCBjaGFubmVsLCBhbGxvd2luZyBtZXNzYWdlcyBwb3N0ZWQgd2l0aGluIGl0IHRvIGJlIGNyb3NzLXBvc3RlZCBpbnRvIHRoZSB0YXJnZXQgY2hhbm5lbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzb3VyY2VDaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGFubm91bmNlbWVudCBjaGFubmVsIHRvIGZvbGxvdy5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0Q2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0YXJnZXQgY2hhbm5lbCAtIHRoZSBjaGFubmVsIHRvIGNyb3NzLXBvc3QgdG8uXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRGb2xsb3dlZENoYW5uZWx9LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbiBpbiB0aGUgX190YXJnZXQgY2hhbm5lbF9fLlxuICAgICAqXG4gICAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZm9sbG93LWFubm91bmNlbWVudC1jaGFubmVsfVxuICAgICAqL1xuICAgIGZvbGxvdzogKHNvdXJjZUNoYW5uZWxJZDogQmlnU3RyaW5nLCB0YXJnZXRDaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkRm9sbG93ZWRDaGFubmVsPj5cbiAgICAvKiogRm9ydW0gcmVsYXRlZCBoZWxwZXJzIGluIGEgY2hhbm5lbCAqL1xuICAgIGZvcnVtczoge1xuICAgICAgLyoqXG4gICAgICAgKiBDcmVhdGVzIGEgbmV3IHRocmVhZCBpbiBhIGZvcnVtIGNoYW5uZWwsIGFuZCBzZW5kcyBhIG1lc3NhZ2Ugd2l0aGluIHRoZSBjcmVhdGVkIHRocmVhZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBmb3J1bSBjaGFubmVsIHRvIGNyZWF0ZSB0aGUgdGhyZWFkIHdpdGhpbi5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgdGhyZWFkLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRDaGFubmVsfSB3aXRoIGEgbmVzdGVkIHtAbGluayBNZXNzYWdlfSBvYmplY3QuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgQ1JFQVRFX01FU1NBR0VTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX1RocmVhZCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNzdGFydC10aHJlYWQtaW4tZm9ydW0tY2hhbm5lbH1cbiAgICAgICAqXG4gICAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICAgKi9cbiAgICAgIHBvc3Q6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlRm9ydW1Qb3N0V2l0aE1lc3NhZ2UpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAgIH1cbiAgICAvKiogUGVybWlzc2lvbiByZWxhdGVkIGhlbHBlcnMgaW4gYSBjaGFubmVsICovXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8qKlxuICAgICAgICogRWRpdHMgdGhlIHBlcm1pc3Npb24gb3ZlcnJpZGVzIGZvciBhIHVzZXIgb3Igcm9sZSBpbiBhIGNoYW5uZWwuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBlZGl0IHRoZSBwZXJtaXNzaW9uIG92ZXJyaWRlcyBvZi5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBlcm1pc3Npb24gb3ZlcnJpZGUuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1JPTEVTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIE9ubHkgcGVybWlzc2lvbnMgdGhlIGJvdCB1c2VyIGhhcyBpbiB0aGUgZ3VpbGQgb3IgcGFyZW50IGNoYW5uZWwgY2FuIGJlIGFsbG93ZWQvZGVuaWVkIF9fdW5sZXNzX18gdGhlIGJvdCB1c2VyIGhhcyBhIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24gb3ZlcnJpZGUgaW4gdGhlIGNoYW5uZWwuXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZWRpdC1jaGFubmVsLXBlcm1pc3Npb25zfVxuICAgICAgICovXG4gICAgICBlZGl0OiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IEVkaXRDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlc09wdGlvbnMpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlcyBhIHBlcm1pc3Npb24gb3ZlcnJpZGUgZm9yIGEgdXNlciBvciByb2xlIGluIGEgY2hhbm5lbC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGRlbGV0ZSB0aGUgcGVybWlzc2lvbiBvdmVycmlkZSBvZi5cbiAgICAgICAqIEBwYXJhbSBvdmVyd3JpdGVJZCAtIFRoZSBJRCBvZiB0aGUgcGVybWlzc2lvbiBvdmVycmlkZSB0byBkZWxldGUuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1JPTEVTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0NoYW5uZWwgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2RlbGV0ZS1jaGFubmVsLXBlcm1pc3Npb259XG4gICAgICAgKi9cbiAgICAgIGRlbGV0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvdmVyd3JpdGVJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICB9XG4gICAgdGhyZWFkczoge1xuICAgICAgZ2V0OiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFsbCBhY3RpdmUgdGhyZWFkcyBmb3IgYSBndWlsZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgdGhyZWFkcyBvZi5cbiAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRBY3RpdmVUaHJlYWRzfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogUmV0dXJucyBib3RoIHB1YmxpYyBhbmQgcHJpdmF0ZSB0aHJlYWRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaHJlYWRzIGFyZSBvcmRlcmVkIGJ5IHRoZSBgaWRgIHByb3BlcnR5IGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNsaXN0LWFjdGl2ZS1ndWlsZC10aHJlYWRzfVxuICAgICAgICAgKi9cbiAgICAgICAgYWN0aXZlOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBY3RpdmVUaHJlYWRzPj5cbiAgICAgICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBnZXR0aW5nIGFyY2hpdmVkIHRocmVhZHMuICovXG4gICAgICAgIGFyY2hpdmVkOiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBwcml2YXRlIGFyY2hpdmVkIHRocmVhZHMgZm9yIGEgY2hhbm5lbC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZ2V0IHRoZSBhcmNoaXZlZCB0aHJlYWRzIGZvci5cbiAgICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhyZWFkcy5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEFyY2hpdmVkVGhyZWFkc30uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIFJlcXVpcmVzIHRoZSBgUkVBRF9NRVNTQUdFX0hJU1RPUllgIHBlcm1pc3Npb24uXG4gICAgICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfVEhSRUFEU2AgcGVybWlzc2lvbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIFJldHVybnMgdGhyZWFkcyBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRQcml2YXRlVGhyZWFkfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIFRocmVhZHMgYXJlIG9yZGVyZWQgYnkgdGhlIGBhcmNoaXZlX3RpbWVzdGFtcGAgcHJvcGVydHkgaW5jbHVkZWQgaW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBvYmplY3QgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xpc3QtcHJpdmF0ZS1hcmNoaXZlZC10aHJlYWRzfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHByaXZhdGU6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RBcmNoaXZlZFRocmVhZHMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFyY2hpdmVkVGhyZWFkcz4+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBwcml2YXRlIGFyY2hpdmVkIHRocmVhZHMgdGhlIGJvdCBpcyBhIG1lbWJlciBvZiBmb3IgYSBjaGFubmVsLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBnZXQgdGhlIGFyY2hpdmVkIHRocmVhZHMgZm9yLlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aHJlYWRzLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogUmVxdWlyZXMgdGhlIGBSRUFEX01FU1NBR0VfSElTVE9SWWAgcGVybWlzc2lvbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIFJldHVybnMgdGhyZWFkcyBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRQcml2YXRlVGhyZWFkfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIFRocmVhZHMgYXJlIG9yZGVyZWQgYnkgdGhlIGBpZGAgcHJvcGVydHkgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xpc3Qtam9pbmVkLXByaXZhdGUtYXJjaGl2ZWQtdGhyZWFkc31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBqb2luZWQ6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RBcmNoaXZlZFRocmVhZHMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFyY2hpdmVkVGhyZWFkcz4+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBwdWJsaWMgYXJjaGl2ZWQgdGhyZWFkcyBmb3IgYSBjaGFubmVsLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBnZXQgdGhlIGFyY2hpdmVkIHRocmVhZHMgZm9yLlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aHJlYWRzLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBBcmNoaXZlZFRocmVhZHN9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYFJFQURfTUVTU0FHRV9ISVNUT1JZYCBwZXJtaXNzaW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogSWYgY2FsbGVkIG9uIGEgY2hhbm5lbCBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRUZXh0fSwgcmV0dXJucyB0aHJlYWRzIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFB1YmxpY1RocmVhZH0uXG4gICAgICAgICAgICogSWYgY2FsbGVkIG9uIGEgY2hhbm5lbCBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGROZXdzfSwgcmV0dXJucyB0aHJlYWRzIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZE5ld3NUaHJlYWR9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogVGhyZWFkcyBhcmUgb3JkZXJlZCBieSB0aGUgYGFyY2hpdmVfdGltZXN0YW1wYCBwcm9wZXJ0eSBpbmNsdWRlZCBpbiB0aGUgbWV0YWRhdGEgb2YgdGhlIG9iamVjdCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjbGlzdC1wdWJsaWMtYXJjaGl2ZWQtdGhyZWFkc31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBwdWJsaWM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RBcmNoaXZlZFRocmVhZHMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFyY2hpdmVkVGhyZWFkcz4+XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB0aHJlYWQgbWVtYmVyIGJ5IHRoZWlyIHVzZXIgSUQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHRocmVhZCB0byBnZXQgdGhlIHRocmVhZCBtZW1iZXIgb2YuXG4gICAgICAgICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgdXNlciBJRCBvZiB0aGUgdGhyZWFkIG1lbWJlciB0byBnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkVGhyZWFkTWVtYmVyfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZ2V0LXRocmVhZC1tZW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBtZW1iZXI6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRocmVhZE1lbWJlcj4+XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHRocmVhZCBtZW1iZXJzIGZvciBhIHRocmVhZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIGdldCB0aGUgdGhyZWFkIG1lbWJlcnMgb2YuXG4gICAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZFRocmVhZE1lbWJlcn0gYXNzb3J0ZWQgYnkgdXNlciBJRC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogUmVxdWlyZXMgdGhlIGFwcGxpY2F0aW9uIHRvIGhhdmUgdGhlIGBHVUlMRF9NRU1CRVJTYCBwcml2aWxlZ2VkIGludGVudCBlbmFibGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNsaXN0LXRocmVhZC1tZW1iZXJzfVxuICAgICAgICAgKi9cbiAgICAgICAgbWVtYmVyczogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUaHJlYWRNZW1iZXJbXT4+XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEFkZHMgdGhlIGJvdCB1c2VyIHRvIGEgdGhyZWFkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHRocmVhZCB0byBhZGQgdGhlIGJvdCB1c2VyIHRvLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgdGhyZWFkIG5vdCBiZSBhcmNoaXZlZC5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9UaHJlYWQgTWVtYmVycyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjam9pbi10aHJlYWR9XG4gICAgICAgKi9cbiAgICAgIGpvaW46IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmVzIHRoZSBib3QgdXNlciBmcm9tIGEgdGhyZWFkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHRocmVhZCB0byByZW1vdmUgdGhlIGJvdCB1c2VyIGZyb20uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSB0aHJlYWQgbm90IGJlIGFyY2hpdmVkLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX1RocmVhZCBNZW1iZXJzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNsZWF2ZS10aHJlYWR9XG4gICAgICAgKi9cbiAgICAgIGxlYXZlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlcyBhIG1lbWJlciBmcm9tIGEgdGhyZWFkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHRocmVhZCB0byByZW1vdmUgdGhlIHRocmVhZCBtZW1iZXIgb2YuXG4gICAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXIgSUQgb2YgdGhlIHRocmVhZCBtZW1iZXIgdG8gcmVtb3ZlLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBJZiB0aGUgdGhyZWFkIGlzIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFByaXZhdGVUaHJlYWR9LCByZXF1aXJlcyB0byBiZSB0aGUgY3JlYXRvciBvZiB0aGUgdGhyZWFkLlxuICAgICAgICogT3RoZXJ3aXNlLCByZXF1aXJlcyB0aGUgYE1BTkFHRV9USFJFQURTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIFJlcXVpcmVzIHRoZSB0aHJlYWQgbm90IGJlIGFyY2hpdmVkLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX1RocmVhZCBNZW1iZXJzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNyZW1vdmUtdGhyZWFkLW1lbWJlcn1cbiAgICAgICAqL1xuICAgICAga2ljazogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBjcmVhdGluZyBhIHRocmVhZC4gKi9cbiAgICAgIGNyZWF0ZToge1xuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQ3JlYXRlcyBhIHRocmVhZCwgdXNpbmcgYW4gZXhpc3RpbmcgbWVzc2FnZSBhcyBpdHMgcG9pbnQgb2Ygb3JpZ2luLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCBpbiB3aGljaCB0byBjcmVhdGUgdGhlIHRocmVhZC5cbiAgICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIHVzZSBhcyB0aGUgdGhyZWFkJ3MgcG9pbnQgb2Ygb3JpZ2luLlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHRocmVhZC5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgQ2hhbm5lbCB8IFRocmVhZH0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIElmIGNhbGxlZCBvbiBhIGNoYW5uZWwgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkVGV4dH0sIGNyZWF0ZXMgYSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkUHVibGljVGhyZWFkfS5cbiAgICAgICAgICAgKiBJZiBjYWxsZWQgb24gYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZE5ld3N9LCBjcmVhdGVzIGEge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZE5ld3NUaHJlYWR9LlxuICAgICAgICAgICAqIERvZXMgbm90IHdvcmsgb24gY2hhbm5lbHMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkRm9ydW19LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogVGhlIElEIG9mIHRoZSBjcmVhdGVkIHRocmVhZCB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBJRCBvZiB0aGUgc291cmNlIG1lc3NhZ2UuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBGaXJlcyBhIF9UaHJlYWQgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjc3RhcnQtdGhyZWFkLWZyb20tbWVzc2FnZX1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBtZXNzYWdlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBTdGFydFRocmVhZFdpdGhNZXNzYWdlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgICAgICAgfVxuICAgICAgICB3aXRob3V0OiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQ3JlYXRlcyBhIHRocmVhZCB3aXRob3V0IHVzaW5nIGEgbWVzc2FnZSBhcyB0aGUgdGhyZWFkJ3MgcG9pbnQgb2Ygb3JpZ2luLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCBpbiB3aGljaCB0byBjcmVhdGUgdGhlIHRocmVhZC5cbiAgICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSB0aHJlYWQuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRDaGFubmVsIHwgVGhyZWFkfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogQ3JlYXRpbmcgYSBwcml2YXRlIHRocmVhZCByZXF1aXJlcyB0aGUgc2VydmVyIHRvIGJlIGJvb3N0ZWQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBGaXJlcyBhIF9UaHJlYWQgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjc3RhcnQtdGhyZWFkLXdpdGhvdXQtbWVzc2FnZX1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBtZXNzYWdlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IFN0YXJ0VGhyZWFkV2l0aG91dE1lc3NhZ2UpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVkaXRzIHRoZSBwb3NpdGlvbnMgb2YgYSBzZXQgb2YgY2hhbm5lbHMgaW4gYSBndWlsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCBpbiB3aGljaCB0byBlZGl0IHRoZSBwb3NpdGlvbnMgb2YgdGhlIGNoYW5uZWxzLlxuICAgICAqIEBwYXJhbSBjaGFubmVsUG9zaXRpb25zIC0gQSBzZXQgb2Ygb2JqZWN0cyBkZWZpbmluZyB0aGUgdXBkYXRlZCBwb3NpdGlvbnMgb2YgdGhlIGNoYW5uZWxzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9DSEFOTkVMU2AgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIEZpcmVzIGEgX0NoYW5uZWwgVXBkYXRlXyBnYXRld2F5IGV2ZW50IGZvciBldmVyeSBjaGFubmVsIGltcGFjdGVkIGluIHRoaXMgY2hhbmdlLlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI21vZGlmeS1ndWlsZC1jaGFubmVsLXBvc2l0aW9uc31cbiAgICAgKi9cbiAgICBwb3NpdGlvbnM6IChndWlsZElkOiBCaWdTdHJpbmcsIGNoYW5uZWxQb3NpdGlvbnM6IE1vZGlmeUd1aWxkQ2hhbm5lbFBvc2l0aW9uc1tdKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBvZiBpbnZpdGVzIGZvciBhIGNoYW5uZWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGdldCB0aGUgaW52aXRlcyBvZi5cbiAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRJbnZpdGVNZXRhZGF0YX0gb2JqZWN0cyBhc3NvcnRlZCBieSBpbnZpdGUgY29kZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiBPbmx5IHVzYWJsZSBmb3IgZ3VpbGQgY2hhbm5lbHMuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNnZXQtY2hhbm5lbC1pbnZpdGVzfVxuICAgICAqL1xuICAgIGludml0ZXM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkSW52aXRlTWV0YWRhdGFbXT4+XG4gICAgLyoqIFN0YWdlIHJlbGF0ZWQgaGVscGVycyBmb3IgYSBjaGFubmVsLiAqL1xuICAgIHN0YWdlczoge1xuICAgICAgLyoqXG4gICAgICAgKiBDcmVhdGVzIGEgc3RhZ2UgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGEgc3RhZ2UgY2hhbm5lbC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHN0YWdlIGluc3RhbmNlLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRTdGFnZUluc3RhbmNlfS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIHVzZXIgdG8gYmUgYSBtb2RlcmF0b3Igb2YgdGhlIHN0YWdlIGNoYW5uZWwuXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfU3RhZ2UgSW5zdGFuY2UgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9zdGFnZS1pbnN0YW5jZSNjcmVhdGUtc3RhZ2UtaW5zdGFuY2V9XG4gICAgICAgKi9cbiAgICAgIGNyZWF0ZTogKG9wdGlvbnM6IENyZWF0ZVN0YWdlSW5zdGFuY2UpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFN0YWdlSW5zdGFuY2U+PlxuICAgICAgLyoqXG4gICAgICAgKiBEZWxldGVzIHRoZSBzdGFnZSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzdGFnZSBjaGFubmVsLCBpZiBvbmUgZXhpc3RzLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHN0YWdlIGNoYW5uZWwgdGhlIHN0YWdlIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIHVzZXIgdG8gYmUgYSBtb2RlcmF0b3Igb2YgdGhlIHN0YWdlIGNoYW5uZWwuXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfU3RhZ2UgSW5zdGFuY2UgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9zdGFnZS1pbnN0YW5jZSNkZWxldGUtc3RhZ2UtaW5zdGFuY2V9XG4gICAgICAgKi9cbiAgICAgIGRlbGV0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKlxuICAgICAgICogRWRpdHMgYSBzdGFnZSBpbnN0YW5jZS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBzdGFnZSBjaGFubmVsIHRoZSBzdGFnZSBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgdXBkYXRlZCB7QGxpbmsgRGlzY29yZFN0YWdlSW5zdGFuY2V9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgdXNlciB0byBiZSBhIG1vZGVyYXRvciBvZiB0aGUgc3RhZ2UgY2hhbm5lbC5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9TdGFnZSBJbnN0YW5jZSBVcGRhdGVfIGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9zdGFnZS1pbnN0YW5jZSNtb2RpZnktc3RhZ2UtaW5zdGFuY2V9XG4gICAgICAgKi9cbiAgICAgIGVkaXQ6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgZGF0YTogRWRpdFN0YWdlSW5zdGFuY2VPcHRpb25zKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTdGFnZUluc3RhbmNlPj5cbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgc3RhZ2UgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGEgc3RhZ2UgY2hhbm5lbCwgaWYgb25lIGV4aXN0cy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBzdGFnZSBjaGFubmVsIHRoZSBzdGFnZSBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZFN0YWdlSW5zdGFuY2V9LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9zdGFnZS1pbnN0YW5jZSNnZXQtc3RhZ2UtaW5zdGFuY2V9XG4gICAgICAgKi9cbiAgICAgIGdldDogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTdGFnZUluc3RhbmNlPj5cbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcnMgYSB0eXBpbmcgaW5kaWNhdG9yIGZvciB0aGUgYm90IHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIGluIHdoaWNoIHRvIHRyaWdnZXIgdGhlIHR5cGluZyBpbmRpY2F0b3IuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEdlbmVyYWxseSwgYm90cyBzaG91bGQgX25vdF8gdXNlIHRoaXMgcm91dGUuXG4gICAgICpcbiAgICAgKiBGaXJlcyBhIF9UeXBpbmcgU3RhcnRfIGdhdGV3YXkgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCN0cmlnZ2VyLXR5cGluZy1pbmRpY2F0b3J9XG4gICAgICovXG4gICAgdHlwaW5nOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgfVxuICAvKiogRW1vamkgcmVsYXRlZCBoZWxwZXIgbWV0aG9kcy4gKi9cbiAgZW1vamlzOiB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBlbW9qaSBpbiBhIGd1aWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgZW1vamkuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBlbW9qaS5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZEVtb2ppfS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRU1PSklTX0FORF9TVElDS0VSU2AgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIEVtb2ppcyBoYXZlIGEgbWF4aW11bSBmaWxlIHNpemUgb2YgMjU2IGtpbG9iaXRzLiBBdHRlbXB0aW5nIHRvIHVwbG9hZCBhIGxhcmdlciBlbW9qaSB3aWxsIGNhdXNlIHRoZSByb3V0ZSB0byByZXR1cm4gNDAwIEJhZCBSZXF1ZXN0LlxuICAgICAqXG4gICAgICogRmlyZXMgYSBfR3VpbGQgRW1vamlzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9lbW9qaSNjcmVhdGUtZ3VpbGQtZW1vaml9XG4gICAgICovXG4gICAgY3JlYXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVHdWlsZEVtb2ppKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRFbW9qaT4+XG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBhbiBlbW9qaSBmcm9tIGEgZ3VpbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgZnJvbSB3aGljaCB0byBkZWxldGUgdGhlIGVtb2ppLlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgZW1vamkgdG8gZGVsZXRlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FTU9KSVNfQU5EX1NUSUNLRVJTYCBwZXJtaXNzaW9uLlxuICAgICAqXG4gICAgICogRmlyZXMgYSBfR3VpbGQgRW1vamlzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9lbW9qaSNkZWxldGUtZ3VpbGQtZW1vaml9XG4gICAgICovXG4gICAgZGVsZXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBpZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAvKipcbiAgICAgKiBFZGl0cyBhbiBlbW9qaS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCBpbiB3aGljaCB0byBlZGl0IHRoZSBlbW9qaS5cbiAgICAgKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIGVtb2ppIHRvIGVkaXQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIGVtb2ppLlxuICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSB1cGRhdGVkIHtAbGluayBEaXNjb3JkRW1vaml9LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FTU9KSVNfQU5EX1NUSUNLRVJTYCBwZXJtaXNzaW9uLlxuICAgICAqXG4gICAgICogRmlyZXMgYSBgR3VpbGQgRW1vamlzIFVwZGF0ZWAgZ2F0ZXdheSBldmVudC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9lbW9qaSNtb2RpZnktZ3VpbGQtZW1vaml9XG4gICAgICovXG4gICAgZWRpdDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgaWQ6IEJpZ1N0cmluZywgb3B0aW9uczogTW9kaWZ5R3VpbGRFbW9qaSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkRW1vamk+PlxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gZW1vamkgYnkgaXRzIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBlbW9qaS5cbiAgICAgKiBAcGFyYW0gZW1vamlJZCAtIFRoZSBJRCBvZiB0aGUgZW1vamkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkRW1vaml9LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI2dldC1ndWlsZC1lbW9qaX1cbiAgICAgKi9cbiAgICBnZXQ6IChndWlsZElkOiBCaWdTdHJpbmcsIGVtb2ppSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkRW1vamk+PlxuICB9XG4gIC8qKiBHdWlsZCByZWxhdGVkIGhlbHBlciBtZXRob2RzICovXG4gIGd1aWxkczoge1xuICAgIGF1dG9tb2Q6IHtcbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlcyBhbiBhdXRvbW9kIHJ1bGUgaW4gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gY3JlYXRlIHRoZSBydWxlIGluLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBydWxlLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGV9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhbiBfQXV0byBNb2RlcmF0aW9uIFJ1bGUgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jY3JlYXRlLWF1dG8tbW9kZXJhdGlvbi1ydWxlfVxuICAgICAgICovXG4gICAgICBjcmVhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUF1dG9Nb2RlcmF0aW9uUnVsZU9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4+XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYSBzY2hlZHVsZWQgZXZlbnQgZnJvbSBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBkZWxldGUgdGhlIHNjaGVkdWxlZCBldmVudCBmcm9tLlxuICAgICAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBkZWxldGUuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VWRU5UU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBTY2hlZHVsZWQgRXZlbnQgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjZGVsZXRlLWd1aWxkLXNjaGVkdWxlZC1ldmVudH1cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBldmVudElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKlxuICAgICAgICogRWRpdHMgYW4gYXV0b21vZCBydWxlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBlZGl0IHRoZSBydWxlIGluLlxuICAgICAgICogQHBhcmFtIHJ1bGVJZCAtIFRoZSBJRCBvZiB0aGUgcnVsZSB0byBlZGl0LlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIHJ1bGUuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlfS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYW4gX0F1dG8gTW9kZXJhdGlvbiBSdWxlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvYXV0by1tb2RlcmF0aW9uI21vZGlmeS1hdXRvLW1vZGVyYXRpb24tcnVsZX1cbiAgICAgICAqL1xuICAgICAgZWRpdDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcnVsZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IFBhcnRpYWw8RWRpdEF1dG9Nb2RlcmF0aW9uUnVsZU9wdGlvbnM+KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+PlxuICAgICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBnZXR0aW5nIGF1dG9tb2RlcmF0aW9uIGRhdGEgaW4gYSBndWlsZC4gKi9cbiAgICAgIGdldDoge1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBhbiBhdXRvbW9kIHJ1bGUgYnkgaXRzIElELlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBydWxlIG9mLlxuICAgICAgICAgKiBAcGFyYW0gcnVsZUlkIC0gVGhlIElEIG9mIHRoZSBydWxlIHRvIGdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGV9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2F1dG8tbW9kZXJhdGlvbiNnZXQtYXV0by1tb2RlcmF0aW9uLXJ1bGV9XG4gICAgICAgICAqL1xuICAgICAgICBydWxlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBydWxlSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPj5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgYXV0b21vZCBydWxlcyBmb3IgYSBndWlsZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgcnVsZXMgZnJvbS5cbiAgICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlfSBvYmplY3RzIGFzc29ydGVkIGJ5IHJ1bGUgSUQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvYXV0by1tb2RlcmF0aW9uI2xpc3QtYXV0by1tb2RlcmF0aW9uLXJ1bGVzLWZvci1ndWlsZH1cbiAgICAgICAgICovXG4gICAgICAgIHJ1bGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGVbXT4+XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgY2hhbm5lbHMgZm9yIGEgZ3VpbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBjaGFubmVscyBvZi5cbiAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRDaGFubmVsfSBvYmplY3RzIGFzc29ydGVkIGJ5IGNoYW5uZWwgSUQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEV4Y2x1ZGVzIHRocmVhZHMuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZ2V0LWd1aWxkLWNoYW5uZWxzfVxuICAgICAqL1xuICAgIGNoYW5uZWxzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsW10+PlxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgZW1vamlzIGZvciBhIGd1aWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHdoaWNoIHRvIGdldCB0aGUgZW1vamlzIG9mLlxuICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZEVtb2ppfSBvYmplY3RzIGFzc29ydGVkIGJ5IGVtb2ppIElELlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI2xpc3QtZ3VpbGQtZW1vamlzfVxuICAgICAqL1xuICAgIGVtb2ppczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkRW1vamlbXT4+XG4gICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBhIGd1aWxkJ3Mgc2NoZWR1bGVkIGV2ZW50cy4gKi9cbiAgICBldmVudHM6IHtcbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlcyBhIHNjaGVkdWxlZCBldmVudCBpbiBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIHNjaGVkdWxlZCBldmVudCBpbi5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50LlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIFNjaGVkdWxlZEV2ZW50fS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRVZFTlRTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEEgZ3VpbGQgY2FuIG9ubHkgaGF2ZSBhIG1heGltdW0gb2YgMTAwIGV2ZW50cyB3aXRoIGEgc3RhdHVzIG9mIHtAbGluayBTY2hlZHVsZWRFdmVudFN0YXR1cy5BY3RpdmV9IG9yIHtAbGluayBTY2hlZHVsZWRFdmVudFN0YXR1cy5TY2hlZHVsZWR9IChpbmNsdXNpdmUpLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFNjaGVkdWxlZCBFdmVudCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNjcmVhdGUtZ3VpbGQtc2NoZWR1bGVkLWV2ZW50fVxuICAgICAgICovXG4gICAgICBjcmVhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZVNjaGVkdWxlZEV2ZW50KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTY2hlZHVsZWRFdmVudD4+XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYSBzY2hlZHVsZWQgZXZlbnQgZnJvbSBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBkZWxldGUgdGhlIHNjaGVkdWxlZCBldmVudCBmcm9tLlxuICAgICAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBkZWxldGUuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VWRU5UU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBTY2hlZHVsZWQgRXZlbnQgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjZGVsZXRlLWd1aWxkLXNjaGVkdWxlZC1ldmVudH1cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBldmVudElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKlxuICAgICAgICogRWRpdHMgYSBzY2hlZHVsZWQgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgdGhlIHNjaGVkdWxlZCBldmVudCBpbi5cbiAgICAgICAqIEBwYXJhbSBldmVudElkIC0gVGhlIElEIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQgdG8gZWRpdC5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIFNjaGVkdWxlZEV2ZW50fS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRVZFTlRTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIFRvIHN0YXJ0IG9yIGVuZCBhbiBldmVudCwgbW9kaWZ5IHRoZSBldmVudCdzIGBzdGF0dXNgIHByb3BlcnR5LlxuICAgICAgICpcbiAgICAgICAqIFRoZSBgZW50aXR5X21ldGFkYXRhYCBwcm9wZXJ0eSBpcyBkaXNjYXJkZWQgZm9yIGV2ZW50cyB3aG9zZSBgZW50aXR5X3R5cGVgIGlzIG5vdCB7QGxpbmsgU2NoZWR1bGVkRXZlbnRFbnRpdHlUeXBlLkV4dGVybmFsfS5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBTY2hlZHVsZWQgRXZlbnQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjbW9kaWZ5LWd1aWxkLXNjaGVkdWxlZC1ldmVudH1cbiAgICAgICAqL1xuICAgICAgZWRpdDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgZXZlbnRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBQYXJ0aWFsPEVkaXRTY2hlZHVsZWRFdmVudD4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFNjaGVkdWxlZEV2ZW50Pj5cblxuICAgICAgZ2V0OiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgc2NoZWR1bGVkIGV2ZW50IGJ5IGl0cyBJRC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgc2NoZWR1bGVkIGV2ZW50IGZyb20uXG4gICAgICAgICAqIEBwYXJhbSBldmVudElkIC0gVGhlIElEIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQgdG8gZ2V0LlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIHNjaGVkdWxlZCBldmVudC5cbiAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNjaGVkdWxlZEV2ZW50fS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNnZXQtZ3VpbGQtc2NoZWR1bGVkLWV2ZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgZXZlbnQ6IChndWlsZElkOiBCaWdTdHJpbmcsIGV2ZW50SWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IHsgd2l0aFVzZXJDb3VudD86IGJvb2xlYW4gfSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+PlxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBzY2hlZHVsZWQgZXZlbnRzIGZvciBhIGd1aWxkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBzY2hlZHVsZWQgZXZlbnRzIGZyb20uXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50cy5cbiAgICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBTY2hlZHVsZWRFdmVudH0gb2JqZWN0cyBhc3NvcnRlZCBieSBldmVudCBJRC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNsaXN0LXNjaGVkdWxlZC1ldmVudHMtZm9yLWd1aWxkfVxuICAgICAgICAgKi9cbiAgICAgICAgZXZlbnRzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogR2V0U2NoZWR1bGVkRXZlbnRzKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTY2hlZHVsZWRFdmVudFtdPj5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2Ygc3Vic2NyaWJlcnMgdG8gYSBzY2hlZHVsZWQgZXZlbnQgZnJvbSBhIGd1aWxkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBzdWJzY3JpYmVycyB0byB0aGUgc2NoZWR1bGVkIGV2ZW50IGZyb20uXG4gICAgICAgICAqIEBwYXJhbSBldmVudElkIC0gVGhlIElEIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQgdG8gZ2V0IHRoZSBzdWJzY3JpYmVycyBvZi5cbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBzdWJzY3JpYmVycy5cbiAgICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBVc2VyfSBvYmplY3RzIGFzc29ydGVkIGJ5IHVzZXIgSUQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VWRU5UU2AgcGVybWlzc2lvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogVXNlcnMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgSURzIGluIF9hc2NlbmRpbmdfIG9yZGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2dldC1ndWlsZC1zY2hlZHVsZWQtZXZlbnQtdXNlcnN9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyczogKFxuICAgICAgICAgIGd1aWxkSWQ6IEJpZ1N0cmluZyxcbiAgICAgICAgICBldmVudElkOiBCaWdTdHJpbmcsXG4gICAgICAgICAgb3B0aW9ucz86IEdldFNjaGVkdWxlZEV2ZW50VXNlcnMsXG4gICAgICAgICkgPT4gUHJvbWlzZTxcbiAgICAgICAgICBBcnJheTx7XG4gICAgICAgICAgICB1c2VyOiBDYW1lbGl6ZTxEaXNjb3JkVXNlcj5cbiAgICAgICAgICAgIG1lbWJlcj86IENhbWVsaXplPERpc2NvcmRNZW1iZXI+XG4gICAgICAgICAgfT5cbiAgICAgICAgPlxuICAgICAgfVxuICAgIH1cbiAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGEgZ3VpbGQncyBpbnRlZ3JhdGlvbnMuICovXG4gICAgaW50ZWdyYXRpb25zOiB7XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgaW50ZWdyYXRpb25zIGF0dGFjaGVkIHRvIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiBpbnRlZ3JhdGlvbnMgZnJvbS5cbiAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgSW50ZWdyYXRpb259IG9iamVjdHMgYXNzb3J0ZWQgYnkgaW50ZWdyYXRpb24gSUQuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNnZXQtZ3VpbGQtaW50ZWdyYXRpb25zfVxuICAgICAgICovXG4gICAgICBnZXQ6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEludGVncmF0aW9uW10+PlxuICAgICAgLyoqXG4gICAgICAgKiBEZWxldGVzIGFuIGludGVncmF0aW9uIGF0dGFjaGVkIHRvIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIGZyb20gd2hpY2ggdG8gZGVsZXRlIHRoZSBpbnRlZ3JhdGlvbi5cbiAgICAgICAqIEBwYXJhbSBpbnRlZ3JhdGlvbklkIC0gVGhlIElEIG9mIHRoZSBpbnRlZ3JhdGlvbiB0byBkZWxldGUgZnJvbSB0aGUgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIERlbGV0ZXMgYWxsIHdlYmhvb2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW50ZWdyYXRpb24sIGFuZCBraWNrcyB0aGUgYXNzb2NpYXRlZCBib3QgaWYgdGhlcmUgaXMgb25lLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIEludGVncmF0aW9ucyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKiBGaXJlcyBhIF9JbnRlZ3JhdGlvbiBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2RlbGV0ZS1ndWlsZC1pbnRlZ3JhdGlvbn1cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBpbnRlZ3JhdGlvbklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICB9XG4gICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBhIGd1aWxkJ3MgaW52aXRlcy4gKi9cbiAgICBpbnZpdGVzOiB7XG4gICAgICAvKipcbiAgICAgICAqIENyZWF0ZXMgYW4gaW52aXRlIHRvIGEgY2hhbm5lbCBpbiBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gY3JlYXRlIHRoZSBpbnZpdGUgdG8uXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGludml0ZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkSW52aXRlfS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBDUkVBVEVfSU5TVEFOVF9JTlZJVEVgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYW4gX0ludml0ZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHByaXZhdGVSZW1hcmtzXG4gICAgICAgKiBUaGUgcmVxdWVzdCBib2R5IGlzIG5vdCBvcHRpb25hbCwgYW5kIGFuIGVtcHR5IEpTT04gb2JqZWN0IG11c3QgYmUgc2VudCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IGZpZWxkcyBhcmUgYmVpbmcgdHJhbnNtaXR0ZWQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjY3JlYXRlLWNoYW5uZWwtaW52aXRlfVxuICAgICAgICovXG4gICAgICBjcmVhdGU6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IENyZWF0ZUNoYW5uZWxJbnZpdGUpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEludml0ZT4+XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYW4gaW52aXRlIHRvIGEgY2hhbm5lbC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gaW52aXRlQ29kZSAtIFRoZSBpbnZpdGUgY29kZSBvZiB0aGUgaW52aXRlIHRvIGRlbGV0ZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYW4gX0ludml0ZSBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZGVsZXRlLWNoYW5uZWwtaW52aXRlfVxuICAgICAgICovXG4gICAgICBkZWxldGU6IChpbnZpdGVDb2RlOiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIGFuIGludml0ZSB0byBhIGNoYW5uZWwgYnkgaXRzIGludml0ZSBjb2RlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBpbnZpdGVDb2RlIC0gVGhlIGludml0ZSBjb2RlIG9mIHRoZSBpbnZpdGUgdG8gZ2V0LlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBpbnZpdGUuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEludml0ZU1ldGFkYXRhfS5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvaW52aXRlI2dldC1pbnZpdGV9XG4gICAgICAgKi9cbiAgICAgIGdldDogKGludml0ZUNvZGU6IHN0cmluZywgb3B0aW9ucz86IEdldEludml0ZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkSW52aXRlTWV0YWRhdGE+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGludml0ZXMgZm9yIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgaW52aXRlcyBmcm9tLlxuICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkSW52aXRlTWV0YWRhdGF9IG9iamVjdHMgYXNzb3J0ZWQgYnkgaW52aXRlIGNvZGUuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9pbnZpdGUjZ2V0LWludml0ZXN9XG4gICAgICAgKi9cbiAgICAgIGxpc3Q6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEludml0ZU1ldGFkYXRhW10+PlxuICAgIH1cbiAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGEgZ3VpbGQncyB0ZW1wbGF0ZXMuICovXG4gICAgdGVtcGxhdGVzOiB7XG4gICAgICAvKipcbiAgICAgICAqIENyZWF0ZXMgYSB0ZW1wbGF0ZSBmcm9tIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGNyZWF0ZSB0aGUgdGVtcGxhdGUgZnJvbS5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgdGVtcGxhdGUuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgVGVtcGxhdGV9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI2NyZWF0ZS1ndWlsZC10ZW1wbGF0ZX1cbiAgICAgICAqL1xuICAgICAgY3JlYXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVUZW1wbGF0ZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGVtcGxhdGU+PlxuICAgICAgLyoqXG4gICAgICAgKiBEZWxldGVzIGEgdGVtcGxhdGUgZnJvbSBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBkZWxldGUgdGhlIHRlbXBsYXRlIGZyb20uXG4gICAgICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlIC0gVGhlIGNvZGUgb2YgdGhlIHRlbXBsYXRlIHRvIGRlbGV0ZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC10ZW1wbGF0ZSNkZWxldGUtZ3VpbGQtdGVtcGxhdGV9XG4gICAgICAgKi9cbiAgICAgIGRlbGV0ZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdGVtcGxhdGVDb2RlOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKlxuICAgICAgICogRWRpdHMgYSB0ZW1wbGF0ZSdzIHNldHRpbmdzLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBlZGl0IGEgdGVtcGxhdGUgb2YuXG4gICAgICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlIC0gVGhlIGNvZGUgb2YgdGhlIHRlbXBsYXRlIHRvIGVkaXQuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgdGVtcGxhdGUuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBUZW1wbGF0ZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjbW9kaWZ5LWd1aWxkLXRlbXBsYXRlfVxuICAgICAgICovXG4gICAgICBlZGl0OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB0ZW1wbGF0ZUNvZGU6IHN0cmluZywgb3B0aW9uczogTW9kaWZ5R3VpbGRUZW1wbGF0ZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGVtcGxhdGU+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIGEgdGVtcGxhdGUgYnkgaXRzIGNvZGUuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHRlbXBsYXRlQ29kZSAtIFRoZSBjb2RlIG9mIHRoZSB0ZW1wbGF0ZSB0byBnZXQuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgVGVtcGxhdGV9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjZ2V0LWd1aWxkLXRlbXBsYXRlfVxuICAgICAgICovXG4gICAgICBnZXQ6ICh0ZW1wbGF0ZUNvZGU6IHN0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGVtcGxhdGU+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHRlbXBsYXRlcyBmb3IgYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBsaXN0IG9mIHRlbXBsYXRlcyBmb3IuXG4gICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFRlbXBsYXRlfSBvYmplY3RzIGFzc29ydGVkIGJ5IHRlbXBsYXRlIGNvZGUuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC10ZW1wbGF0ZSNnZXQtZ3VpbGQtdGVtcGxhdGVzfVxuICAgICAgICovXG4gICAgICBsaXN0OiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZVtdPj5cbiAgICAgIC8qKlxuICAgICAgICogU3luY2hyb25pc2VzIGEgdGVtcGxhdGUgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBzeW5jaHJvbmlzZSBhIHRlbXBsYXRlIG9mLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgVGVtcGxhdGV9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI2dldC1ndWlsZC10ZW1wbGF0ZXN9XG4gICAgICAgKi9cbiAgICAgIHN5bmM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlPj5cbiAgICB9XG5cbiAgICAvKiBHdWlsZCBNZW1iZXJzIHJlbGF0ZWQgaGVscGVyIG1ldGhvZHMuICovXG4gICAgbWVtYmVyczoge1xuICAgICAgLyoqXG4gICAgICAgKiBCYW5zIGEgdXNlciBmcm9tIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGJhbiB0aGUgdXNlciBmcm9tLlxuICAgICAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSBJRCBvZiB0aGUgdXNlciB0byBiYW4gZnJvbSB0aGUgZ3VpbGQuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGJhbi5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBCQU5fTUVNQkVSU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBCYW4gQWRkXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNjcmVhdGUtZ3VpbGQtYmFufVxuICAgICAgICovXG4gICAgICBiYW46IChndWlsZElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogQ3JlYXRlR3VpbGRCYW4pID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKlxuICAgICAgICogRWRpdHMgdGhlIG5pY2tuYW1lIG9mIHRoZSBib3QgdXNlci5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZWRpdCB0aGUgbmlja25hbWUgb2YgdGhlIGJvdCB1c2VyIGluLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIG5pY2tuYW1lLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZE1lbWJlcn1cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogRmlyZXMgYSBfR3VpbGQgTWVtYmVyIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWN1cnJlbnQtbWVtYmVyfVxuICAgICAgICovXG4gICAgICBlZGl0U2VsZjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogRWRpdEJvdE1lbWJlck9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcj4+XG4gICAgICAvKipcbiAgICAgICAqIEVkaXRzIGEgbWVtYmVyJ3MgcHJvcGVydGllcy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZWRpdCB0aGUgbWVtYmVyIG9mLlxuICAgICAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSB1c2VyIElEIG9mIHRoZSBtZW1iZXIgdG8gZWRpdC5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSB1c2VyLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBUaGlzIGVuZHBvaW50IHJlcXVpcmVzIHZhcmlvdXMgcGVybWlzc2lvbnMgZGVwZW5kaW5nIG9uIHdoYXQgaXMgZWRpdGVkIGFib3V0IHRoZSBtZW1iZXIuXG4gICAgICAgKiBUbyBmaW5kIG91dCB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbiB0byBlbmFjdCBhIGNoYW5nZSwgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIGVuZHBvaW50J3Mge0BsaW5rIE1vZGlmeUd1aWxkTWVtYmVyIHwgcGFyYW1ldGVyc30uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgTWVtYmVyIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWd1aWxkLW1lbWJlcn1cbiAgICAgICAqL1xuICAgICAgZWRpdDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IE1vZGlmeUd1aWxkTWVtYmVyKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZW1iZXI+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIG9yIGNyZWF0ZXMgYSBETSBjaGFubmVsIHdpdGggYSB1c2VyLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgSUQgb2YgdGhlIHVzZXIgdG8gY3JlYXRlIHRoZSBETSBjaGFubmVsIHdpdGguXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQ2hhbm5lbH0uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3VzZXIjY3JlYXRlLWRtfVxuICAgICAgICovXG4gICAgICBkbTogKHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgbWVtYmVyIG9iamVjdCBieSB1c2VyIElELlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIG1lbWJlciBvYmplY3QgZm9yLlxuICAgICAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSBJRCBvZiB0aGUgdXNlciB0byBnZXQgdGhlIG1lbWJlciBvYmplY3QgZm9yLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRNZW1iZXJXaXRoVXNlcn0uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2dldC1ndWlsZC1tZW1iZXJ9XG4gICAgICAgKi9cbiAgICAgIGdldDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyPj5cbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBtZW1iZXJzIGZvciBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2YgbWVtYmVycyBmb3IuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIG1lbWJlcnMuXG4gICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRNZW1iZXJXaXRoVXNlcn0gb2JqZWN0cyBhc3NvcnRlZCBieSB1c2VyIElELlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYEdVSUxEX01FTUJFUlNgIGludGVudC5cbiAgICAgICAqXG4gICAgICAgKiDimqDvuI8gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIGVuZHBvaW50IHdpdGggdmVyeSBsYXJnZSBib3RzLiBJbnN0ZWFkLCBvcHQgdG8gdXNlIGBmZXRjaE1lbWJlcnMoKWA6XG4gICAgICAgKiBSRVNUIGNvbW11bmljYXRpb24gb25seSBwZXJtaXRzIDUwIHJlcXVlc3RzIHRvIGJlIG1hZGUgcGVyIHNlY29uZCwgd2hpbGUgZ2F0ZXdheXMgYWxsb3cgZm9yIHVwIHRvIDEyMCByZXF1ZXN0c1xuICAgICAgICogcGVyIG1pbnV0ZSBwZXIgc2hhcmQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvcmF0ZS1saW1pdHMjcmF0ZS1saW1pdHN9LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNsaXN0LWd1aWxkLW1lbWJlcnN9XG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNyZXF1ZXN0LWd1aWxkLW1lbWJlcnN9XG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvcmF0ZS1saW1pdHMjcmF0ZS1saW1pdHN9XG4gICAgICAgKi9cbiAgICAgIGxpc3Q6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IExpc3RHdWlsZE1lbWJlcnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PlxuICAgICAgLyoqXG4gICAgICAgKiBLaWNrcyBhIG1lbWJlciBmcm9tIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGtpY2sgdGhlIG1lbWJlciBmcm9tLlxuICAgICAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSB1c2VyIElEIG9mIHRoZSBtZW1iZXIgdG8ga2ljayBmcm9tIHRoZSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBLSUNLX01FTUJFUlNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgTWVtYmVyIFJlbW92ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjcmVtb3ZlLWd1aWxkLW1lbWJlcn1cbiAgICAgICAqL1xuICAgICAga2ljazogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBJbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgcHJ1bmluZyBpbmFjdGl2ZSBtZW1iZXJzLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBwcnVuZSB0aGUgbWVtYmVycyBvZi5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBwcnVuaW5nIG9mIG1lbWJlcnMuXG4gICAgICAgKiBAcmV0dXJucyBBIG51bWJlciBpbmRpY2F0aW5nIGhvdyBtYW55IG1lbWJlcnMgd2VyZSBwcnVuZWQuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgS0lDS19NRU1CRVJTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIOKdlyBSZXF1ZXN0cyB0byB0aGlzIGVuZHBvaW50IHdpbGwgdGltZSBvdXQgZm9yIGxhcmdlIGd1aWxkcy4gVG8gcHJldmVudCB0aGlzIGZyb20gaGFwcGVuaW5nLCBzZXQgdGhlIHtAbGluayBCZWdpbkd1aWxkUHJ1bmUuY29tcHV0ZVBydW5lQ291bnR9IHByb3BlcnR5IG9mIHRoZSB7QGxpbmsgb3B0aW9uc30gb2JqZWN0IHBhcmFtZXRlciB0byBgZmFsc2VgLiBUaGlzIHdpbGwgYmVnaW4gdGhlIHByb2Nlc3Mgb2YgcHJ1bmluZywgYW5kIGltbWVkaWF0ZWx5IHJldHVybiBgdW5kZWZpbmVkYCwgcmF0aGVyIHRoYW4gd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gY29tcGxldGUgYmVmb3JlIHJldHVybmluZyB0aGUgYWN0dWFsIGNvdW50IG9mIG1lbWJlcnMgdGhhdCBoYXZlIGJlZW4ga2lja2VkLlxuICAgICAgICpcbiAgICAgICAqIOKaoO+4jyBCeSBkZWZhdWx0LCB0aGlzIHByb2Nlc3Mgd2lsbCBub3QgcmVtb3ZlIG1lbWJlcnMgd2l0aCBhIHJvbGUuIFRvIGluY2x1ZGUgdGhlIG1lbWJlcnMgd2hvIGhhdmUgYSBfcGFydGljdWxhciBzdWJzZXQgb2Ygcm9sZXNfLCBzcGVjaWZ5IHRoZSByb2xlKHMpIGluIHRoZSB7QGxpbmsgQmVnaW5HdWlsZFBydW5lLmluY2x1ZGVSb2xlcyB8IGluY2x1ZGVSb2xlc30gcHJvcGVydHkgb2YgdGhlIHtAbGluayBvcHRpb25zfSBvYmplY3QgcGFyYW1ldGVyLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIE1lbWJlciBSZW1vdmVfIGdhdGV3YXkgZXZlbnQgZm9yIGV2ZXJ5IG1lbWJlciBraWNrZWQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2JlZ2luLWd1aWxkLXBydW5lfVxuICAgICAgICovXG4gICAgICBwcnVuZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQmVnaW5HdWlsZFBydW5lKSA9PiBQcm9taXNlPHsgcHJ1bmVkOiBudW1iZXIgfCBudWxsIH0+XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgbWVtYmVycyB3aG9zZSB1c2VybmFtZXMgb3Igbmlja25hbWVzIHN0YXJ0IHdpdGggYSBwcm92aWRlZCBzdHJpbmcuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIHNlYXJjaCBpbi5cbiAgICAgICAqIEBwYXJhbSBxdWVyeSAtIFRoZSBzdHJpbmcgdG8gbWF0Y2ggdXNlcm5hbWVzIG9yIG5pY2tuYW1lcyBhZ2FpbnN0LlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3Igc2VhcmNoaW5nIHRocm91Z2ggdGhlIG1lbWJlcnMuXG4gICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRNZW1iZXJ9IG9iamVjdHMgYXNzb3J0ZWQgYnkgdXNlciBJRC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjc2VhcmNoLWd1aWxkLW1lbWJlcnN9XG4gICAgICAgKi9cbiAgICAgIHNlYXJjaDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcXVlcnk6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8U2VhcmNoTWVtYmVycywgJ3F1ZXJ5Jz4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PlxuICAgICAgLyoqXG4gICAgICAgKiBVbmJhbnMgYSB1c2VyIGZyb20gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gdW5iYW4gdGhlIHVzZXIgaW4uXG4gICAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIElEIG9mIHRoZSB1c2VyIHRvIHVuYmFuLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYEJBTl9NRU1CRVJTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIEJhbiBSZW1vdmVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI3JlbW92ZS1ndWlsZC1iYW59XG4gICAgICAgKi9cbiAgICAgIHVuYmFuOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgIH1cbiAgICAvKiogSW50ZXJhY3Rpb24gcmVsYXRlZCBoZWxwZXIgbWV0aG9kcy4gKi9cbiAgICBpbnRlcmFjdGlvbnM6IHtcbiAgICAgIC8qKiBDb21tYW5kIHJlbGF0ZWQgaGVscGVyIG1ldGhvZHMuICovXG4gICAgICBjb21tYW5kczoge1xuICAgICAgICAvKiogTWV0aG9kcyBmb3IgY3JlYXRpbmcgYSBjb21tYW5kLiAqL1xuICAgICAgICBjcmVhdGU6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBDcmVhdGVzIGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgYWNjZXNzaWJsZSBnbG9iYWxseTsgYWNyb3NzIGRpZmZlcmVudCBndWlsZHMgYW5kIGNoYW5uZWxzLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBjcmVhdGUuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIOKaoO+4jyBDcmVhdGluZyBhIGNvbW1hbmQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGFuIGV4aXN0aW5nIGNvbW1hbmQgZm9yIHlvdXIgYXBwbGljYXRpb24gd2lsbCBvdmVyd3JpdGUgdGhlIG9sZCBjb21tYW5kLlxuICAgICAgICAgICAqIOKaoO+4jyBHbG9iYWwgY29tbWFuZHMgb25jZSBjcmVhdGVkIGFyZSBjYWNoZWQgZm9yIHBlcmlvZHMgb2YgX19hbiBob3VyX18sIHNvIGNoYW5nZXMgbWFkZSB0byBleGlzdGluZyBjb21tYW5kcyB3aWxsIHRha2UgYW4gaG91ciB0byBzdXJmYWNlLlxuICAgICAgICAgICAqIOKaoO+4jyBZb3UgY2FuIG9ubHkgY3JlYXRlIHVwIHRvIDIwMCBfbmV3XyBjb21tYW5kcyBkYWlseS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNjcmVhdGUtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2xvYmFsOiAoY29tbWFuZDogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIENyZWF0ZXMgYW4gYXBwbGljYXRpb24gY29tbWFuZCBvbmx5IGFjY2Vzc2libGUgaW4gYSBzcGVjaWZpYyBndWlsZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gY3JlYXRlLlxuICAgICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIGNvbW1hbmQgZm9yLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiDimqDvuI8gQ3JlYXRpbmcgYSBjb21tYW5kIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhbiBleGlzdGluZyBjb21tYW5kIGZvciB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgb3ZlcndyaXRlIHRoZSBvbGQgY29tbWFuZC5cbiAgICAgICAgICAgKiDimqDvuI8gWW91IGNhbiBvbmx5IGNyZWF0ZSB1cCB0byAyMDAgX25ld18gY29tbWFuZHMgZGFpbHkuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjY3JlYXRlLWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ3VpbGQ6IChjb21tYW5kOiBDcmVhdGVBcHBsaWNhdGlvbkNvbW1hbmQsIGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPj5cbiAgICAgICAgfVxuICAgICAgICAvKiogTWV0aG9kcyBmb3IgZGVsZXRpbmcgYSBjb21tYW5kLiAqL1xuICAgICAgICBkZWxldGU6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBEZWxldGVzIGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgcmVnaXN0ZXJlZCBnbG9iYWxseS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZGVsZXRlLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2RlbGV0ZS1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnbG9iYWw6IChjb21tYW5kSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIERlbGV0ZXMgYW4gYXBwbGljYXRpb24gY29tbWFuZCByZWdpc3RlcmVkIGluIGEgZ3VpbGQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZGVsZXRlIHRoZSBjb21tYW5kIGZyb20uXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBkZWxldGUgZnJvbSB0aGUgZ3VpbGQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZGVsZXRlLWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ3VpbGQ6IChjb21tYW5kSWQ6IEJpZ1N0cmluZywgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAgIH1cbiAgICAgICAgLyoqIE1ldGhvZHMgZm9yIGVkaXRpbmcgYSBjb21tYW5kLiAqL1xuICAgICAgICBlZGl0OiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRWRpdHMgYSBnbG9iYWwgYXBwbGljYXRpb24gY29tbWFuZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZWRpdC5cbiAgICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgY29tbWFuZC5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2VkaXQtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2xvYmFsOiAoY29tbWFuZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBFZGl0cyBhbiBhcHBsaWNhdGlvbiBjb21tYW5kIHJlZ2lzdGVyZWQgaW4gYSBndWlsZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZWRpdC5cbiAgICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgY29tbWFuZC5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2VkaXQtZ3VpbGQtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBndWlsZDogKGNvbW1hbmRJZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBFZGl0cyB0aGUgcGVybWlzc2lvbnMgZm9yIGEgZ3VpbGQgYXBwbGljYXRpb24gY29tbWFuZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZWRpdCB0aGUgcGVybWlzc2lvbnMgb2YuXG4gICAgICAgICAgICogQHBhcmFtIGJlYXJlclRva2VuIC0gVGhlIGJlYXJlciB0b2tlbiB0byB1c2UgdG8gbWFrZSB0aGUgcmVxdWVzdC5cbiAgICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgY29tbWFuZCBwZXJtaXNzaW9ucy5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ufS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogVGhlIGJlYXJlciB0b2tlbiByZXF1aXJlcyB0aGUgYGFwcGxpY2F0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9ucy51cGRhdGVgIHNjb3BlIHRvIGJlIGVuYWJsZWQsIGFuZCB0byBoYXZlIGFjY2VzcyB0byB0aGUgZ3VpbGQgd2hvc2UgSUQgaGFzIGJlZW4gcHJvdmlkZWQgaW4gdGhlIHBhcmFtZXRlcnMuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZWRpdC1hcHBsaWNhdGlvbi1jb21tYW5kLXBlcm1pc3Npb25zfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHBlcm1pc3Npb25zOiAoXG4gICAgICAgICAgICBndWlsZElkOiBCaWdTdHJpbmcsXG4gICAgICAgICAgICBjb21tYW5kSWQ6IEJpZ1N0cmluZyxcbiAgICAgICAgICAgIGJlYXJlclRva2VuOiBzdHJpbmcsXG4gICAgICAgICAgICBvcHRpb25zOiBBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uc1tdLFxuICAgICAgICAgICkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM+PlxuICAgICAgICB9XG4gICAgICAgIC8qKiBNZXRob2RzIGZvciBnZXR0aW5nIGEgY29tbWFuZC4gKi9cbiAgICAgICAgZ2V0OiB7XG4gICAgICAgICAgZ2xvYmFsOiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEdldHMgYSBnbG9iYWwgYXBwbGljYXRpb24gY29tbWFuZCBieSBpdHMgSUQuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBnZXQuXG4gICAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBvbmU6IChjb21tYW5kSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPj5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiB5b3VyIGJvdCdzIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kcy5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0gb2JqZWN0cyBhc3NvcnRlZCBieSBjb21tYW5kIElELlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNnZXQtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmRzfVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBhbGw6ICgpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPj5cbiAgICAgICAgICB9XG4gICAgICAgICAgZ3VpbGRzOiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEdldHMgYSBndWlsZCBhcHBsaWNhdGlvbiBjb21tYW5kIGJ5IGl0cyBJRC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCBpbi5cbiAgICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZ2V0LlxuICAgICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBvbmU6IChjb21tYW5kSWQ6IEJpZ1N0cmluZywgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFwcGxpY2F0aW9uIGNvbW1hbmRzIHJlZ2lzdGVyZWQgYnkgeW91ciBib3QgaW4gYSBndWlsZC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIGNvbW1hbmRzIGFyZSByZWdpc3RlcmVkIGluLlxuICAgICAgICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9IG9iamVjdHMgYXNzb3J0ZWQgYnkgY29tbWFuZCBJRC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kc3N9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGFsbDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+PlxuICAgICAgICAgIH1cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBHZXRzIHRoZSBwZXJtaXNzaW9ucyBvZiBhIGd1aWxkIGFwcGxpY2F0aW9uIGNvbW1hbmQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCBpbi5cbiAgICAgICAgICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGdldCB0aGUgcGVybWlzc2lvbnMgb2YuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb259LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1hcHBsaWNhdGlvbi1jb21tYW5kLXBlcm1pc3Npb25zfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHBlcm1pc3Npb246IChndWlsZElkOiBCaWdTdHJpbmcsIGNvbW1hbmRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogR2V0cyB0aGUgcGVybWlzc2lvbnMgb2YgYWxsIGFwcGxpY2F0aW9uIGNvbW1hbmRzIHJlZ2lzdGVyZWQgaW4gYSBndWlsZCBieSB0aGUgSUQgb2YgdGhlIGd1aWxkLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgcGVybWlzc2lvbnMgb2JqZWN0cyBvZi5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb259IG9iamVjdHMgYXNzb3J0ZWQgYnkgY29tbWFuZCBJRC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNnZXQtZ3VpbGQtYXBwbGljYXRpb24tY29tbWFuZC1wZXJtaXNzaW9uc31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBwZXJtaXNzaW9uczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnNbXT4+XG4gICAgICAgIH1cbiAgICAgICAgLyoqIE1ldGhvZHMgZm9yIHJlcGxhY2luZyBleGlzdGluZyBjb21tYW5kcyBpbiBidWxrLiAqL1xuICAgICAgICByZXBsYWNlOiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogUmUtcmVnaXN0ZXJzIHRoZSBsaXN0IG9mIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kcywgb3ZlcndyaXRpbmcgdGhlIHByZXZpb3VzIGNvbW1hbmRzIGNvbXBsZXRlbHkuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gY29tbWFuZHMgLSBUaGUgbGlzdCBvZiBjb21tYW5kcyB0byB1c2UgdG8gb3ZlcndyaXRlIHRoZSBwcmV2aW91cyBsaXN0LlxuICAgICAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfSBvYmplY3RzIGFzc29ydGVkIGJ5IGNvbW1hbmQgSUQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIOKdlyBDb21tYW5kcyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgYGNvbW1hbmRzYCBhcnJheSB3aWxsIGJlIF9fZGVsZXRlZF9fLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICog4pqg77iPIENvbW1hbmRzIHRoYXQgZG8gbm90IGFscmVhZHkgZXhpc3Qgd2lsbCBjb3VudCB0b3dhcmRzIHRoZSBkYWlseSBsaW1pdCBvZiBfMjAwXyBuZXcgY29tbWFuZHMuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjYnVsay1vdmVyd3JpdGUtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmRzfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdsb2JhbDogKGNvbW1hbmRzOiBDcmVhdGVBcHBsaWNhdGlvbkNvbW1hbmRbXSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+PlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFJlLXJlZ2lzdGVycyB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbiBjb21tYW5kcyByZWdpc3RlcmVkIGluIGEgZ3VpbGQsIG92ZXJ3cml0aW5nIHRoZSBwcmV2aW91cyBjb21tYW5kcyBjb21wbGV0ZWx5LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHdob3NlIGxpc3Qgb2YgY29tbWFuZHMgdG8gb3ZlcndyaXRlLlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kcyAtIFRoZSBsaXN0IG9mIGNvbW1hbmRzIHRvIHVzZSB0byBvdmVyd3JpdGUgdGhlIHByZXZpb3VzIGxpc3QuXG4gICAgICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9IG9iamVjdHMgYXNzb3J0ZWQgYnkgY29tbWFuZCBJRC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICog4p2XIENvbW1hbmRzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBgY29tbWFuZHNgIGFycmF5IHdpbGwgYmUgX19kZWxldGVkX18uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiDimqDvuI8gQ29tbWFuZHMgdGhhdCBkbyBub3QgYWxyZWFkeSBleGlzdCB3aWxsIGNvdW50IHRvd2FyZHMgdGhlIGRhaWx5IGxpbWl0IG9mIF8yMDBfIG5ldyBjb21tYW5kcy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNidWxrLW92ZXJ3cml0ZS1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kc31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBndWlsZDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgY29tbWFuZHM6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZFtdKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qKiBSZXNwb25zZSByZWxhdGVkIGhlbHBlciBtZXRob2RzLiAqL1xuICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIC8qKiBIZWxwZXIgbWV0aG9kcyByZWxhdGVkIHRvIGNyZWF0aW5nIGEgcmVzcG9uc2UuICovXG4gICAgICAgIGNyZWF0ZToge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFNlbmRzIGEgZm9sbG93LXVwIG1lc3NhZ2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBNZXNzYWdlfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICog4pqg77iPIEludGVyYWN0aW9uIHRva2VucyBhcmUgb25seSB2YWxpZCBmb3IgXzE1IG1pbnV0ZXNfLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQnkgZGVmYXVsdCwgbWVudGlvbnMgYXJlIHN1cHByZXNzZWQuIFRvIGVuYWJsZSBtZW50aW9ucywgcGFzcyBhIG1lbnRpb24gb2JqZWN0IHdpdGggdGhlIGNhbGxiYWNrIGRhdGEuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBVbmxpa2UgYHNlbmRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQ6XG4gICAgICAgICAgICogLSBOZWVkaW5nIHRvIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGF0IHRoZSBtZXNzYWdlIGlzIGluLiAoYFJFQURfTUVTU0FHRVNgIHBlcm1pc3Npb24uKVxuICAgICAgICAgICAqIC0gUmVxdWlyaW5nIHRoZSBgTUVTU0FHRV9DT05URU5UYCBpbnRlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIENyZWF0ZV8gZXZlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2NyZWF0ZS1mb2xsb3d1cC1tZXNzYWdlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZvbGxvd3VwOiAodG9rZW46IHN0cmluZywgb3B0aW9uczogSW50ZXJhY3Rpb25SZXNwb25zZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogU2VuZHMgYSByZXNwb25zZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBpbnRlcmFjdGlvbklkIC0gVGhlIElEIG9mIHRoZSBpbnRlcmFjdGlvbiB0byByZXNwb25kIHRvLlxuICAgICAgICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIG1lc3NhZ2UuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiDimqDvuI8gSW50ZXJhY3Rpb24gdG9rZW5zIGFyZSBvbmx5IHZhbGlkIGZvciBfMTUgbWludXRlc18uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBCeSBkZWZhdWx0LCBtZW50aW9ucyBhcmUgc3VwcHJlc3NlZC4gVG8gZW5hYmxlIG1lbnRpb25zLCBwYXNzIGEgbWVudGlvbiBvYmplY3Qgd2l0aCB0aGUgY2FsbGJhY2sgZGF0YS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIFVubGlrZSBgc2VuZE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dDpcbiAgICAgICAgICAgKiAtIE5lZWRpbmcgdG8gYmUgYWJsZSB0byBzZWUgdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFubmVsIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaW4uIChgUkVBRF9NRVNTQUdFU2AgcGVybWlzc2lvbi4pXG4gICAgICAgICAgICogLSBSZXF1aXJpbmcgdGhlIGBNRVNTQUdFX0NPTlRFTlRgIGludGVudC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgQ3JlYXRlXyBldmVudC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjY3JlYXRlLWludGVyYWN0aW9uLXJlc3BvbnNlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIG9yaWdpbmFsOiAoaW50ZXJhY3Rpb25JZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBJbnRlcmFjdGlvblJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEhlbHBlciBtZXRob2RzIHJlbGF0ZWQgdG8gZGVsZXRpbmcgYSByZXNwb25zZS4gKi9cbiAgICAgICAgZGVsZXRlOiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRGVsZXRlcyBhIGZvbGxvdy11cCBtZXNzYWdlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZGVsZXRlLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBVbmxpa2UgYGRlbGV0ZU1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dCBuZWVkaW5nIHRvIHNlZSB0aGUgY2hhbm5lbCB0aGUgbWVzc2FnZSBpcyBpbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBldmVudC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZGVsZXRlLWZvbGxvd3VwLW1lc3NhZ2V9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZm9sbG93dXA6ICh0b2tlbjogc3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIERlbGV0ZXMgdGhlIGluaXRpYWwgbWVzc2FnZSByZXNwb25zZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogVW5saWtlIGBkZWxldGVNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQgbmVlZGluZyB0byBzZWUgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgaW4uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIERlbGV0ZV8gZXZlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2RlbGV0ZS1vcmlnaW5hbC1pbnRlcmFjdGlvbi1yZXNwb25zZX1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBvcmlnaW5hbDogKHRva2VuOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgICAgfVxuICAgICAgICAvKiogSGVscGVyIG1ldGhvZHMgcmVsYXRlZCB0byBlZGl0aW5nIGEgcmVzcG9uc2UuICovXG4gICAgICAgIGVkaXQ6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBFZGl0cyBhIGZvbGxvdy11cCBtZXNzYWdlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZWRpdC5cbiAgICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBNZXNzYWdlfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogVW5saWtlIGBlZGl0TWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0IG5lZWRpbmcgdG8gc2VlIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogRG9lcyBub3Qgc3VwcG9ydCBlcGhlbWVyYWwgZm9sbG93LXVwIG1lc3NhZ2VzIGR1ZSB0byB0aGVzZSBiZWluZyBzdGF0ZWxlc3MuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZXZlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2VkaXQtZm9sbG93dXAtbWVzc2FnZX1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBmb2xsb3d1cDogKHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBJbnRlcmFjdGlvbkNhbGxiYWNrRGF0YSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRWRpdHMgdGhlIGluaXRpYWwgbWVzc2FnZSByZXNwb25zZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIFVubGlrZSBgZWRpdE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dCBuZWVkaW5nIHRvIHNlZSB0aGUgY2hhbm5lbCB0aGUgbWVzc2FnZSBpcyBpbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIERvZXMgbm90IHN1cHBvcnQgZXBoZW1lcmFsIGZvbGxvdy11cCBtZXNzYWdlcyBkdWUgdG8gdGhlc2UgYmVpbmcgc3RhdGVsZXNzLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBVcGRhdGVfIGV2ZW50LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNlZGl0LW9yaWdpbmFsLWludGVyYWN0aW9uLXJlc3BvbnNlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIG9yaWdpbmFsOiAodG9rZW46IHN0cmluZywgb3B0aW9uczogSW50ZXJhY3Rpb25DYWxsYmFja0RhdGEpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+IHwgdW5kZWZpbmVkPlxuICAgICAgICB9XG4gICAgICAgIC8qKiBIZWxwZXIgbWV0aG9kcyByZWxhdGVkIHRvIGdldHRpbmcgYSByZXNwb25zZS4gKi9cbiAgICAgICAgZ2V0OiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogR2V0cyBhIGZvbGxvdy11cCBtZXNzYWdlIHRvIGFuIGludGVyYWN0aW9uIGJ5IHRoZSBJRCBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGdldC5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWVzc2FnZX0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIFVubGlrZSBgZ2V0TWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0OlxuICAgICAgICAgICAqIC0gTmVlZGluZyB0byBiZSBhYmxlIHRvIHNlZSB0aGUgY29udGVudHMgb2YgdGhlIGNoYW5uZWwgdGhhdCB0aGUgbWVzc2FnZSBpcyBpbi4gKGBSRUFEX01FU1NBR0VTYCBwZXJtaXNzaW9uLilcbiAgICAgICAgICAgKiAtIFJlcXVpcmluZyB0aGUgYE1FU1NBR0VfQ09OVEVOVGAgaW50ZW50LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogRG9lcyBub3Qgc3VwcG9ydCBlcGhlbWVyYWwgZm9sbG93LXVwIG1lc3NhZ2VzIGR1ZSB0byB0aGVzZSBiZWluZyBzdGF0ZWxlc3MuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2dldC1mb2xsb3d1cC1tZXNzYWdlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZvbGxvd3VwOiAodG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEdldHMgdGhlIGluaXRpYWwgbWVzc2FnZSByZXNwb25zZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWVzc2FnZX0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIFVubGlrZSBgZ2V0TWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0OlxuICAgICAgICAgICAqIC0gTmVlZGluZyB0byBiZSBhYmxlIHRvIHNlZSB0aGUgY29udGVudHMgb2YgdGhlIGNoYW5uZWwgdGhhdCB0aGUgbWVzc2FnZSBpcyBpbi4gKGBSRUFEX01FU1NBR0VTYCBwZXJtaXNzaW9uLilcbiAgICAgICAgICAgKiAtIFJlcXVpcmluZyB0aGUgYE1FU1NBR0VfQ09OVEVOVGAgaW50ZW50LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogRG9lcyBub3Qgc3VwcG9ydCBlcGhlbWVyYWwgZm9sbG93LXVwIG1lc3NhZ2VzIGR1ZSB0byB0aGVzZSBiZWluZyBzdGF0ZWxlc3MuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2dldC1vcmlnaW5hbC1pbnRlcmFjdGlvbi1yZXNwb25zZX1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBvcmlnaW5hbDogKHRva2VuOiBzdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKiBXZWJob29rIHJlbGF0ZWQgaGVscGVyIG1ldGhvZHMuICovXG4gIHdlYmhvb2tzOiB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHdlYmhvb2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGNyZWF0ZSB0aGUgd2ViaG9vayBpbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHdlYmhvb2suXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRXZWJob29rfS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiDimqDvuI8gVGhlIHdlYmhvb2sgbmFtZSBtdXN0IG5vdCBjb250YWluIHRoZSBzdHJpbmcgJ2NseWRlJyAoY2FzZS1pbnNlbnNpdGl2ZSkuXG4gICAgICpcbiAgICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNjcmVhdGUtd2ViaG9va31cbiAgICAgKi9cbiAgICBjcmVhdGU6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlV2ViaG9vaykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gICAgLyoqIE1ldGhvZHMgdG8gZGVsZXRlIGEgd2ViaG9vay4gKi9cbiAgICBkZWxldGU6IHtcbiAgICAgIHdpdGg6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlbGV0ZXMgYSB3ZWJob29rLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZGVsZXRlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNkZWxldGUtd2ViaG9va31cbiAgICAgICAgICovXG4gICAgICAgIGlkOiAoaWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWxldGVzIGEgd2ViaG9vayBtZXNzYWdlIHVzaW5nIHRoZSB3ZWJob29rIHRva2VuLCB0aGVyZWJ5IGJ5cGFzc2luZyB0aGUgbmVlZCBmb3IgYXV0aGVudGljYXRpb24gKyBwZXJtaXNzaW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGlkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGRlbGV0ZSB0aGUgbWVzc2FnZSBiZWxvbmdpbmcgdG8uXG4gICAgICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIGRlbGV0ZSB0aGUgd2ViaG9vay5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2RlbGV0ZS13ZWJob29rLXdpdGgtdG9rZW59XG4gICAgICAgICAqL1xuICAgICAgICB0b2tlbjogKGlkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIH1cbiAgICB9XG4gICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBlZGl0aW5nIGEgd2ViaG9vay4gKi9cbiAgICBlZGl0OiB7XG4gICAgICB3aXRoOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFZGl0cyBhIHdlYmhvb2suXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZWRpdC5cbiAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNlZGl0LXdlYmhvb2t9XG4gICAgICAgICAqL1xuICAgICAgICBpZDogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBNb2RpZnlXZWJob29rKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rPj5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVkaXRzIGEgd2ViaG9vayB1c2luZyB0aGUgd2ViaG9vayB0b2tlbiwgdGhlcmVieSBieXBhc3NpbmcgdGhlIG5lZWQgZm9yIGF1dGhlbnRpY2F0aW9uICsgcGVybWlzc2lvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZWRpdC5cbiAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZWRpdCB0aGUgd2ViaG9vay5cbiAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNtb2RpZnktd2ViaG9vay13aXRoLXRva2VufVxuICAgICAgICAgKi9cbiAgICAgICAgdG9rZW46ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgb3B0aW9uczogT21pdDxNb2RpZnlXZWJob29rLCAnY2hhbm5lbElkJz4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFdlYmhvb2s+PlxuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhIHdlYmhvb2ssIGNhdXNpbmcgYSBtZXNzYWdlIHRvIGJlIHBvc3RlZCBpbiB0aGUgY2hhbm5lbCBjb25maWd1cmVkIGZvciB0aGUgd2ViaG9vay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZXhlY3V0ZS5cbiAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBleGVjdXRlIHRoZSB3ZWJob29rLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIHdlYmhvb2suXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRNZXNzYWdlfSwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIHtAbGluayBFeGVjdXRlV2ViaG9vay53YWl0IHwgd2FpdH0gcHJvcGVydHkgb2YgdGhlIHtAbGluayBvcHRpb25zfSBvYmplY3QgcGFyYW1ldGVyIGlzIHNldCB0byBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiB0aGUgd2ViaG9vayBjaGFubmVsIGlzIGEgZm9ydW0gY2hhbm5lbCwgeW91IG11c3QgcHJvdmlkZSBhIHZhbHVlIGZvciBlaXRoZXIgYHRocmVhZElkYCBvciBgdGhyZWFkTmFtZWAuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNleGVjdXRlLXdlYmhvb2t9XG4gICAgICovXG4gICAgZXhlY3V0ZTogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBFeGVjdXRlV2ViaG9vaykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4gfCB1bmRlZmluZWQ+XG4gICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBnZXR0aW5nIHdlYmhvb2tzLiAqL1xuICAgIGdldDoge1xuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIGEgbGlzdCBvZiB3ZWJob29rcyBmb3IgYSBjaGFubmVsLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgd2hpY2ggdG8gZ2V0IHRoZSB3ZWJob29rcyBvZi5cbiAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZFdlYmhvb2t9IG9iamVjdHMgYXNzb3J0ZWQgYnkgd2ViaG9vayBJRC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZ2V0LWNoYW5uZWwtd2ViaG9va3N9XG4gICAgICAgKi9cbiAgICAgIGNoYW5uZWw6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9va1tdPj5cbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiB3ZWJob29rcyBmb3IgYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBsaXN0IG9mIHdlYmhvb2tzIGZvci5cbiAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZFdlYmhvb2t9IG9iamVjdHMgYXNzb3J0ZWQgYnkgd2ViaG9vayBJRC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZ2V0LWd1aWxkLXdlYmhvb2tzfVxuICAgICAgICovXG4gICAgICBndWlsZDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9va1tdPj5cbiAgICAgIC8qKlxuICAgICAgICogR2V0cyBhIHdlYmhvb2sgbWVzc2FnZSBieSBpdHMgSUQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBnZXQgYSBtZXNzYWdlIG9mLlxuICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZ2V0IHdlYmhvb2sgbWVzc2FnZXMuXG4gICAgICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gdGhlIElEIG9mIHRoZSB3ZWJob29rIG1lc3NhZ2UgdG8gZ2V0LlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRNZXNzYWdlfS5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtd2ViaG9vay1tZXNzYWdlfVxuICAgICAgICovXG4gICAgICBtZXNzYWdlOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogR2V0V2ViaG9va01lc3NhZ2VPcHRpb25zKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgICAgIHdpdGg6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB3ZWJob29rIGJ5IGl0cyBJRC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkV2ViaG9va30uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtd2ViaG9va31cbiAgICAgICAgICovXG4gICAgICAgIGlkOiAod2ViaG9va0lkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFdlYmhvb2s+PlxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBhIHdlYmhvb2sgdXNpbmcgdGhlIHdlYmhvb2sgdG9rZW4sIHRoZXJlYnkgYnlwYXNzaW5nIHRoZSBuZWVkIGZvciBhdXRoZW50aWNhdGlvbiArIHBlcm1pc3Npb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGdldC5cbiAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZ2V0IHRoZSB3ZWJob29rLlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtd2ViaG9vay13aXRoLXRva2VufVxuICAgICAgICAgKi9cbiAgICAgICAgdG9rZW46ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gICAgICB9XG4gICAgfVxuICAgIC8qKiBNZXRob2RzIHJlbGF0ZWQgdG8gbWVzc2FnZSBzZW50IGJ5IGEgd2ViaG9vay4gKi9cbiAgICBtZXNzYWdlczoge1xuICAgICAgLyoqXG4gICAgICAgKiBEZWxldGVzIGEgd2ViaG9vayBtZXNzYWdlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGJlbG9uZ2luZyB0by5cbiAgICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIG1hbmFnZSB0aGUgd2ViaG9vay5cbiAgICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZGVsZXRlLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGRlbGV0aW9uIG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNkZWxldGUtd2ViaG9va31cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogRGVsZXRlV2ViaG9va01lc3NhZ2VPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGVkaXRpbmcgbWVzc2FnZXMgc2VudCBieSBhIHdlYmhvb2suICovXG4gICAgICBlZGl0OiBXZWJob29rTWVzc2FnZUVkaXRvclxuICAgIH1cbiAgfVxuICAvKiogVXNlciByZWxhdGVkIGhlbHBlciBtZXRob2RzLiAqL1xuICB1c2Vyczoge1xuICAgIC8qKlxuICAgICAqIEdldHMgb3IgY3JlYXRlcyBhIERNIGNoYW5uZWwgd2l0aCBhIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIElEIG9mIHRoZSB1c2VyIHRvIGNyZWF0ZSB0aGUgRE0gY2hhbm5lbCB3aXRoLlxuICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQ2hhbm5lbH0uXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvdXNlciNjcmVhdGUtZG19XG4gICAgICovXG4gICAgY2hhbm5lbDogKHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgfVxuICAvKipcbiAgICogQWRkcyBhIG1lbWJlciB0byBhIHRocmVhZC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIGFkZCB0aGUgbWVtYmVyIHRvLlxuICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXIgSUQgb2YgdGhlIG1lbWJlciB0byBhZGQgdG8gdGhlIHRocmVhZC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGFiaWxpdHkgdG8gc2VuZCBtZXNzYWdlcyBpbiB0aGUgdGhyZWFkLlxuICAgKiBSZXF1aXJlcyB0aGUgdGhyZWFkIG5vdCBiZSBhcmNoaXZlZC5cbiAgICpcbiAgICogRmlyZXMgYSBfVGhyZWFkIE1lbWJlcnMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNhZGQtdGhyZWFkLW1lbWJlcn1cbiAgICovXG4gIGFkZFRocmVhZE1lbWJlcjogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBhdXRvbW9kIHJ1bGUgaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGNyZWF0ZSB0aGUgcnVsZSBpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBydWxlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhbiBfQXV0byBNb2RlcmF0aW9uIFJ1bGUgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvYXV0by1tb2RlcmF0aW9uI2NyZWF0ZS1hdXRvLW1vZGVyYXRpb24tcnVsZX1cbiAgICovXG4gIGNyZWF0ZUF1dG9tb2RSdWxlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVBdXRvTW9kZXJhdGlvblJ1bGVPcHRpb25zKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNoYW5uZWwgd2l0aGluIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIGNoYW5uZWwgd2l0aGluLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGNoYW5uZWwuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkQ2hhbm5lbH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0NIQU5ORUxTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBJZiBzZXR0aW5nIHBlcm1pc3Npb24gb3ZlcndyaXRlcywgb25seSB0aGUgcGVybWlzc2lvbnMgdGhlIGJvdCB1c2VyIGhhcyBpbiB0aGUgZ3VpbGQgY2FuIGJlIGFsbG93ZWQgb3IgZGVuaWVkLlxuICAgKlxuICAgKiBTZXR0aW5nIHRoZSBgTUFOQUdFX1JPTEVTYCBwZXJtaXNzaW9uIGlzIG9ubHkgcG9zc2libGUgZm9yIGd1aWxkIGFkbWluaXN0cmF0b3JzLlxuICAgKlxuICAgKiBGaXJlcyBhIF9DaGFubmVsIENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2NyZWF0ZS1ndWlsZC1jaGFubmVsfVxuICAgKi9cbiAgY3JlYXRlQ2hhbm5lbDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlR3VpbGRDaGFubmVsKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gZW1vamkgaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgZW1vamkuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgZW1vamkuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkRW1vaml9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FTU9KSVNfQU5EX1NUSUNLRVJTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBFbW9qaXMgaGF2ZSBhIG1heGltdW0gZmlsZSBzaXplIG9mIDI1NiBraWxvYml0cy4gQXR0ZW1wdGluZyB0byB1cGxvYWQgYSBsYXJnZXIgZW1vamkgd2lsbCBjYXVzZSB0aGUgcm91dGUgdG8gcmV0dXJuIDQwMCBCYWQgUmVxdWVzdC5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgRW1vamlzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI2NyZWF0ZS1ndWlsZC1lbW9qaX1cbiAgICovXG4gIGNyZWF0ZUVtb2ppOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVHdWlsZEVtb2ppKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRFbW9qaT4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHRocmVhZCBpbiBhIGZvcnVtIGNoYW5uZWwsIGFuZCBzZW5kcyBhIG1lc3NhZ2Ugd2l0aGluIHRoZSBjcmVhdGVkIHRocmVhZC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgZm9ydW0gY2hhbm5lbCB0byBjcmVhdGUgdGhlIHRocmVhZCB3aXRoaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgdGhyZWFkLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZENoYW5uZWx9IHdpdGggYSBuZXN0ZWQge0BsaW5rIE1lc3NhZ2V9IG9iamVjdC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBDUkVBVEVfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX1RocmVhZCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNzdGFydC10aHJlYWQtaW4tZm9ydW0tY2hhbm5lbH1cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgY3JlYXRlRm9ydW1UaHJlYWQ6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlRm9ydW1Qb3N0V2l0aE1lc3NhZ2UpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBhcHBsaWNhdGlvbiBjb21tYW5kIGFjY2Vzc2libGUgZ2xvYmFsbHk7IGFjcm9zcyBkaWZmZXJlbnQgZ3VpbGRzIGFuZCBjaGFubmVscy5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBjcmVhdGUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiDimqDvuI8gQ3JlYXRpbmcgYSBjb21tYW5kIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhbiBleGlzdGluZyBjb21tYW5kIGZvciB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgb3ZlcndyaXRlIHRoZSBvbGQgY29tbWFuZC5cbiAgICog4pqg77iPIEdsb2JhbCBjb21tYW5kcyBvbmNlIGNyZWF0ZWQgYXJlIGNhY2hlZCBmb3IgcGVyaW9kcyBvZiBfX2FuIGhvdXJfXywgc28gY2hhbmdlcyBtYWRlIHRvIGV4aXN0aW5nIGNvbW1hbmRzIHdpbGwgdGFrZSBhbiBob3VyIHRvIHN1cmZhY2UuXG4gICAqIOKaoO+4jyBZb3UgY2FuIG9ubHkgY3JlYXRlIHVwIHRvIDIwMCBfbmV3XyBjb21tYW5kcyBkYWlseS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2NyZWF0ZS1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICovXG4gIGNyZWF0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZDogKGNvbW1hbmQ6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPj5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gYXBwbGljYXRpb24gY29tbWFuZCBvbmx5IGFjY2Vzc2libGUgaW4gYSBzcGVjaWZpYyBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIGNvbW1hbmQgZm9yLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICog4pqg77iPIENyZWF0aW5nIGEgY29tbWFuZCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYW4gZXhpc3RpbmcgY29tbWFuZCBmb3IgeW91ciBhcHBsaWNhdGlvbiB3aWxsIG92ZXJ3cml0ZSB0aGUgb2xkIGNvbW1hbmQuXG4gICAqIOKaoO+4jyBZb3UgY2FuIG9ubHkgY3JlYXRlIHVwIHRvIDIwMCBfbmV3XyBjb21tYW5kcyBkYWlseS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2NyZWF0ZS1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgY3JlYXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQ6IChjb21tYW5kOiBDcmVhdGVBcHBsaWNhdGlvbkNvbW1hbmQsIGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPj5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0ZW1wbGF0ZSBmcm9tIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIHRlbXBsYXRlIGZyb20uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgdGVtcGxhdGUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBUZW1wbGF0ZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC10ZW1wbGF0ZSNjcmVhdGUtZ3VpbGQtdGVtcGxhdGV9XG4gICAqL1xuICBjcmVhdGVHdWlsZFRlbXBsYXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVUZW1wbGF0ZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGVtcGxhdGU+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnZpdGUgdG8gYSBjaGFubmVsIGluIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gY3JlYXRlIHRoZSBpbnZpdGUgdG8uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgaW52aXRlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZEludml0ZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgQ1JFQVRFX0lOU1RBTlRfSU5WSVRFYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhbiBfSW52aXRlIENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVSZW1hcmtzXG4gICAqIFRoZSByZXF1ZXN0IGJvZHkgaXMgbm90IG9wdGlvbmFsLCBhbmQgYW4gZW1wdHkgSlNPTiBvYmplY3QgbXVzdCBiZSBzZW50IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgZmllbGRzIGFyZSBiZWluZyB0cmFuc21pdHRlZC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjY3JlYXRlLWNoYW5uZWwtaW52aXRlfVxuICAgKi9cbiAgY3JlYXRlSW52aXRlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBDcmVhdGVDaGFubmVsSW52aXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnZpdGU+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhIHNjaGVkdWxlZCBldmVudCBpbiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gY3JlYXRlIHRoZSBzY2hlZHVsZWQgZXZlbnQgaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgU2NoZWR1bGVkRXZlbnR9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FVkVOVFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEEgZ3VpbGQgY2FuIG9ubHkgaGF2ZSBhIG1heGltdW0gb2YgMTAwIGV2ZW50cyB3aXRoIGEgc3RhdHVzIG9mIHtAbGluayBTY2hlZHVsZWRFdmVudFN0YXR1cy5BY3RpdmV9IG9yIHtAbGluayBTY2hlZHVsZWRFdmVudFN0YXR1cy5TY2hlZHVsZWR9IChpbmNsdXNpdmUpLlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBTY2hlZHVsZWQgRXZlbnQgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2NyZWF0ZS1ndWlsZC1zY2hlZHVsZWQtZXZlbnR9XG4gICAqL1xuICBjcmVhdGVTY2hlZHVsZWRFdmVudDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlU2NoZWR1bGVkRXZlbnQpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFNjaGVkdWxlZEV2ZW50Pj5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzdGFnZSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzdGFnZSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHN0YWdlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZFN0YWdlSW5zdGFuY2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgdXNlciB0byBiZSBhIG1vZGVyYXRvciBvZiB0aGUgc3RhZ2UgY2hhbm5lbC5cbiAgICpcbiAgICogRmlyZXMgYSBfU3RhZ2UgSW5zdGFuY2UgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvc3RhZ2UtaW5zdGFuY2UjY3JlYXRlLXN0YWdlLWluc3RhbmNlfVxuICAgKi9cbiAgY3JlYXRlU3RhZ2VJbnN0YW5jZTogKG9wdGlvbnM6IENyZWF0ZVN0YWdlSW5zdGFuY2UpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFN0YWdlSW5zdGFuY2U+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhIHdlYmhvb2suXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gY3JlYXRlIHRoZSB3ZWJob29rIGluLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHdlYmhvb2suXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkV2ViaG9va30uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiDimqDvuI8gVGhlIHdlYmhvb2sgbmFtZSBtdXN0IG5vdCBjb250YWluIHRoZSBzdHJpbmcgJ2NseWRlJyAoY2FzZS1pbnNlbnNpdGl2ZSkuXG4gICAqXG4gICAqIEZpcmVzIGEgX1dlYmhvb2tzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjY3JlYXRlLXdlYmhvb2t9XG4gICAqL1xuICBjcmVhdGVXZWJob29rOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZVdlYmhvb2spID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFdlYmhvb2s+PlxuICAvKipcbiAgICogRGVsZXRlcyBhbiBhdXRvbW9kIHJ1bGUuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBkZWxldGUgdGhlIHJ1bGUgZnJvbS5cbiAgICogQHBhcmFtIHJ1bGVJZCAtIFRoZSBJRCBvZiB0aGUgYXV0b21vZCBydWxlIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGFuIF9BdXRvIE1vZGVyYXRpb24gUnVsZSBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jZGVsZXRlLWF1dG8tbW9kZXJhdGlvbi1ydWxlfVxuICAgKi9cbiAgZGVsZXRlQXV0b21vZFJ1bGU6IChndWlsZElkOiBCaWdTdHJpbmcsIHJ1bGVJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBjaGFubmVsIGZyb20gd2l0aGluIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZGVsZXRlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlZCB7QGxpbmsgQ2hhbm5lbH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEZvciBjb21tdW5pdHkgZ3VpbGRzLCB0aGUgX1J1bGVzXywgX0d1aWRlbGluZXNfIGFuZCBfQ29tbXVuaXR5IFVwZGF0ZV8gY2hhbm5lbHMgY2Fubm90IGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIElmIHRoZSBjaGFubmVsIGlzIGEgdGhyZWFkOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1RIUkVBRFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIC0gRmlyZXMgYSBfVGhyZWFkIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogT3RoZXJ3aXNlOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0NIQU5ORUxTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiAtIOKaoO+4jyBEZWxldGluZyBhIGNhdGVnb3J5IGNoYW5uZWwgZG9lcyBub3QgZGVsZXRlIGl0cyBjaGlsZCBjaGFubmVscy5cbiAgICogICBJbnN0ZWFkLCB0aGV5IHdpbGwgaGF2ZSB0aGVpciBgcGFyZW50X2lkYCBwcm9wZXJ0eSByZW1vdmVkLCBhbmQgYSBgQ2hhbm5lbCBVcGRhdGVgIGdhdGV3YXkgZXZlbnQgd2lsbCBmaXJlIGZvciBlYWNoIG9mIHRoZW0uXG4gICAqXG4gICAqIC0gRmlyZXMgYSBfQ2hhbm5lbCBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2RlbGV0ZWNsb3NlLWNoYW5uZWx9XG4gICAqL1xuICBkZWxldGVDaGFubmVsOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhIHBlcm1pc3Npb24gb3ZlcnJpZGUgZm9yIGEgdXNlciBvciByb2xlIGluIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBkZWxldGUgdGhlIHBlcm1pc3Npb24gb3ZlcnJpZGUgb2YuXG4gICAqIEBwYXJhbSBvdmVyd3JpdGVJZCAtIFRoZSBJRCBvZiB0aGUgcGVybWlzc2lvbiBvdmVycmlkZSB0byBkZWxldGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1JPTEVTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9DaGFubmVsIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZGVsZXRlLWNoYW5uZWwtcGVybWlzc2lvbn1cbiAgICovXG4gIGRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGU6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3ZlcndyaXRlSWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIGVtb2ppIGZyb20gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIGZyb20gd2hpY2ggdG8gZGVsZXRlIHRoZSBlbW9qaS5cbiAgICogQHBhcmFtIGlkIC0gVGhlIElEIG9mIHRoZSBlbW9qaSB0byBkZWxldGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VNT0pJU19BTkRfU1RJQ0tFUlNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIEVtb2ppcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9lbW9qaSNkZWxldGUtZ3VpbGQtZW1vaml9XG4gICAqL1xuICBkZWxldGVFbW9qaTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgaWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGEgZm9sbG93LXVwIG1lc3NhZ2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBkZWxldGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFVubGlrZSBgZGVsZXRlTWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0IG5lZWRpbmcgdG8gc2VlIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgKlxuICAgKiBGaXJlcyBhIF9NZXNzYWdlIERlbGV0ZV8gZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZGVsZXRlLWZvbGxvd3VwLW1lc3NhZ2V9XG4gICAqL1xuICBkZWxldGVGb2xsb3d1cE1lc3NhZ2U6ICh0b2tlbjogc3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhbiBhcHBsaWNhdGlvbiBjb21tYW5kIHJlZ2lzdGVyZWQgZ2xvYmFsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZGVsZXRlLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZGVsZXRlLWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kOiAoY29tbWFuZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gYXBwbGljYXRpb24gY29tbWFuZCByZWdpc3RlcmVkIGluIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBkZWxldGUgdGhlIGNvbW1hbmQgZnJvbS5cbiAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBkZWxldGUgZnJvbSB0aGUgZ3VpbGQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNkZWxldGUtZ3VpbGQtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICovXG4gIGRlbGV0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kOiAoY29tbWFuZElkOiBCaWdTdHJpbmcsIGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhIHRlbXBsYXRlIGZyb20gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgdGVtcGxhdGUgZnJvbS5cbiAgICogQHBhcmFtIHRlbXBsYXRlQ29kZSAtIFRoZSBjb2RlIG9mIHRoZSB0ZW1wbGF0ZSB0byBkZWxldGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC10ZW1wbGF0ZSNkZWxldGUtZ3VpbGQtdGVtcGxhdGV9XG4gICAqL1xuICBkZWxldGVHdWlsZFRlbXBsYXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB0ZW1wbGF0ZUNvZGU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhbiBpbnRlZ3JhdGlvbiBhdHRhY2hlZCB0byBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgZnJvbSB3aGljaCB0byBkZWxldGUgdGhlIGludGVncmF0aW9uLlxuICAgKiBAcGFyYW0gaW50ZWdyYXRpb25JZCAtIFRoZSBJRCBvZiB0aGUgaW50ZWdyYXRpb24gdG8gZGVsZXRlIGZyb20gdGhlIGd1aWxkLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRGVsZXRlcyBhbGwgd2ViaG9va3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnRlZ3JhdGlvbiwgYW5kIGtpY2tzIHRoZSBhc3NvY2lhdGVkIGJvdCBpZiB0aGVyZSBpcyBvbmUuXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIEludGVncmF0aW9ucyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqIEZpcmVzIGEgX0ludGVncmF0aW9uIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2RlbGV0ZS1ndWlsZC1pbnRlZ3JhdGlvbn1cbiAgICovXG4gIGRlbGV0ZUludGVncmF0aW9uOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBpbnRlZ3JhdGlvbklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gaW52aXRlIHRvIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIGludml0ZUNvZGUgLSBUaGUgaW52aXRlIGNvZGUgb2YgdGhlIGludml0ZSB0byBkZWxldGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0NIQU5ORUxTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhbiBfSW52aXRlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZGVsZXRlLWNoYW5uZWwtaW52aXRlfVxuICAgKi9cbiAgZGVsZXRlSW52aXRlOiAoaW52aXRlQ29kZTogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBtZXNzYWdlIGZyb20gYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGRlbGV0ZSB0aGUgbWVzc2FnZSBmcm9tLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGRlbGV0ZSBmcm9tIHRoZSBjaGFubmVsLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiBub3QgZGVsZXRpbmcgb3duIG1lc3NhZ2U6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNkZWxldGUtbWVzc2FnZX1cbiAgICovXG4gIGRlbGV0ZU1lc3NhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgaW5pdGlhbCBtZXNzYWdlIHJlc3BvbnNlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFVubGlrZSBgZGVsZXRlTWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0IG5lZWRpbmcgdG8gc2VlIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgKlxuICAgKiBGaXJlcyBhIF9NZXNzYWdlIERlbGV0ZV8gZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZGVsZXRlLW9yaWdpbmFsLWludGVyYWN0aW9uLXJlc3BvbnNlfVxuICAgKi9cbiAgZGVsZXRlT3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlOiAodG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhIHNjaGVkdWxlZCBldmVudCBmcm9tIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBkZWxldGUgdGhlIHNjaGVkdWxlZCBldmVudCBmcm9tLlxuICAgKiBAcGFyYW0gZXZlbnRJZCAtIFRoZSBJRCBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50IHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRVZFTlRTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBTY2hlZHVsZWQgRXZlbnQgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2RlbGV0ZS1ndWlsZC1zY2hlZHVsZWQtZXZlbnR9XG4gICAqL1xuICBkZWxldGVTY2hlZHVsZWRFdmVudDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgZXZlbnRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIHRoZSBzdGFnZSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzdGFnZSBjaGFubmVsLCBpZiBvbmUgZXhpc3RzLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBzdGFnZSBjaGFubmVsIHRoZSBzdGFnZSBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSB1c2VyIHRvIGJlIGEgbW9kZXJhdG9yIG9mIHRoZSBzdGFnZSBjaGFubmVsLlxuICAgKlxuICAgKiBGaXJlcyBhIF9TdGFnZSBJbnN0YW5jZSBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9zdGFnZS1pbnN0YW5jZSNkZWxldGUtc3RhZ2UtaW5zdGFuY2V9XG4gICAqL1xuICBkZWxldGVTdGFnZUluc3RhbmNlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhIHdlYmhvb2suXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZGVsZXRlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNkZWxldGUtd2ViaG9va31cbiAgICovXG4gIGRlbGV0ZVdlYmhvb2s6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGEgd2ViaG9vayBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGRlbGV0ZSB0aGUgbWVzc2FnZSBiZWxvbmdpbmcgdG8uXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIG1hbmFnZSB0aGUgd2ViaG9vay5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBkZWxldGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBkZWxldGlvbiBvZiB0aGUgbWVzc2FnZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2RlbGV0ZS13ZWJob29rfVxuICAgKi9cbiAgZGVsZXRlV2ViaG9va01lc3NhZ2U6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBEZWxldGVXZWJob29rTWVzc2FnZU9wdGlvbnMpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSB3ZWJob29rIG1lc3NhZ2UgdXNpbmcgdGhlIHdlYmhvb2sgdG9rZW4sIHRoZXJlYnkgYnlwYXNzaW5nIHRoZSBuZWVkIGZvciBhdXRoZW50aWNhdGlvbiArIHBlcm1pc3Npb25zLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGRlbGV0ZSB0aGUgbWVzc2FnZSBiZWxvbmdpbmcgdG8uXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIGRlbGV0ZSB0aGUgd2ViaG9vay5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2RlbGV0ZS13ZWJob29rLXdpdGgtdG9rZW59XG4gICAqL1xuICBkZWxldGVXZWJob29rV2l0aFRva2VuOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBwZXJtaXNzaW9ucyBmb3IgYSBndWlsZCBhcHBsaWNhdGlvbiBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCBpbi5cbiAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBlZGl0IHRoZSBwZXJtaXNzaW9ucyBvZi5cbiAgICogQHBhcmFtIGJlYXJlclRva2VuIC0gVGhlIGJlYXJlciB0b2tlbiB0byB1c2UgdG8gbWFrZSB0aGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIGNvbW1hbmQgcGVybWlzc2lvbnMuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb259LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGUgYmVhcmVyIHRva2VuIHJlcXVpcmVzIHRoZSBgYXBwbGljYXRpb25zLmNvbW1hbmRzLnBlcm1pc3Npb25zLnVwZGF0ZWAgc2NvcGUgdG8gYmUgZW5hYmxlZCwgYW5kIHRvIGhhdmUgYWNjZXNzIHRvIHRoZSBndWlsZCB3aG9zZSBJRCBoYXMgYmVlbiBwcm92aWRlZCBpbiB0aGUgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2VkaXQtYXBwbGljYXRpb24tY29tbWFuZC1wZXJtaXNzaW9uc31cbiAgICovXG4gIGVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uczogKFxuICAgIGd1aWxkSWQ6IEJpZ1N0cmluZyxcbiAgICBjb21tYW5kSWQ6IEJpZ1N0cmluZyxcbiAgICBiZWFyZXJUb2tlbjogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zW10sXG4gICkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM+PlxuICAvKipcbiAgICogRWRpdHMgYW4gYXV0b21vZCBydWxlLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZWRpdCB0aGUgcnVsZSBpbi5cbiAgICogQHBhcmFtIHJ1bGVJZCAtIFRoZSBJRCBvZiB0aGUgcnVsZSB0byBlZGl0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgcnVsZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhbiBfQXV0byBNb2RlcmF0aW9uIFJ1bGUgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvYXV0by1tb2RlcmF0aW9uI21vZGlmeS1hdXRvLW1vZGVyYXRpb24tcnVsZX1cbiAgICovXG4gIGVkaXRBdXRvbW9kUnVsZTogKFxuICAgIGd1aWxkSWQ6IEJpZ1N0cmluZyxcbiAgICBydWxlSWQ6IEJpZ1N0cmluZyxcbiAgICBvcHRpb25zOiBQYXJ0aWFsPEVkaXRBdXRvTW9kZXJhdGlvblJ1bGVPcHRpb25zPixcbiAgKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+PlxuICAvKipcbiAgICogTW9kaWZpZXMgdGhlIGJvdCdzIHVzZXJuYW1lIG9yIGF2YXRhci5cbiAgICogTk9URTogdXNlcm5hbWU6IGlmIGNoYW5nZWQgbWF5IGNhdXNlIHRoZSBib3QncyBkaXNjcmltaW5hdG9yIHRvIGJlIHJhbmRvbWl6ZWQuXG4gICAqL1xuICBlZGl0Qm90UHJvZmlsZTogKG9wdGlvbnM6IHsgdXNlcm5hbWU/OiBzdHJpbmc7IGJvdEF2YXRhclVSTD86IHN0cmluZyB8IG51bGwgfSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVXNlcj4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIGNoYW5uZWwncyBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBlZGl0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgY2hhbm5lbC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZENoYW5uZWx9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiBlZGl0aW5nIGEgY2hhbm5lbCBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3JvdXBEbX06XG4gICAqIC0gRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIElmIGVkaXRpbmcgYSB0aHJlYWQgY2hhbm5lbDpcbiAgICogLSBSZXF1aXJlcyB0aGUgYE1BTkFHRV9USFJFQURTYCBwZXJtaXNzaW9uIF9fdW5sZXNzX18gaWYgc2V0dGluZyB0aGUgYGFyY2hpdmVkYCBwcm9wZXJ0eSB0byBgZmFsc2VgIHdoZW4gdGhlIGBsb2NrZWRgIHByb3BlcnR5IGlzIGFsc28gYGZhbHNlYCwgaW4gd2hpY2ggY2FzZSBvbmx5IHRoZSBgU0VORF9NRVNTQUdFU2AgcGVybWlzc2lvbiBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogLSBGaXJlcyBhIF9UaHJlYWQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBJZiBlZGl0aW5nIGEgZ3VpbGQgY2hhbm5lbDpcbiAgICogLSBSZXF1aXJlcyB0aGUgYE1BTkFHRV9DSEFOTkVMU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogLSBJZiBtb2RpZnlpbmcgcGVybWlzc2lvbiBvdmVycmlkZXM6XG4gICAqICAgLSBSZXF1aXJlcyB0aGUgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogICAtIE9ubHkgcGVybWlzc2lvbnMgdGhlIGJvdCB1c2VyIGhhcyBpbiB0aGUgZ3VpbGQgb3IgcGFyZW50IGNoYW5uZWwgY2FuIGJlIGFsbG93ZWQvZGVuaWVkIF9fdW5sZXNzX18gdGhlIGJvdCB1c2VyIGhhcyBhIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24gb3ZlcnJpZGUgaW4gdGhlIGNoYW5uZWwuXG4gICAqXG4gICAqIC0gSWYgbW9kaWZ5aW5nIGEgY2hhbm5lbCBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRDYXRlZ29yeX06XG4gICAqICAgICAtIEZpcmVzIGEgX0NoYW5uZWwgVXBkYXRlXyBnYXRld2F5IGV2ZW50IGZvciBlYWNoIGNoaWxkIGNoYW5uZWwgaW1wYWN0ZWQgaW4gdGhpcyBjaGFuZ2UuXG4gICAqIC0gT3RoZXJ3aXNlOlxuICAgKiAgICAgLSBGaXJlcyBhIF9DaGFubmVsIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICovXG4gIGVkaXRDaGFubmVsOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IE1vZGlmeUNoYW5uZWwpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAvKipcbiAgICogRWRpdHMgdGhlIHBlcm1pc3Npb24gb3ZlcnJpZGVzIGZvciBhIHVzZXIgb3Igcm9sZSBpbiBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZWRpdCB0aGUgcGVybWlzc2lvbiBvdmVycmlkZXMgb2YuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBlcm1pc3Npb24gb3ZlcnJpZGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1JPTEVTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBPbmx5IHBlcm1pc3Npb25zIHRoZSBib3QgdXNlciBoYXMgaW4gdGhlIGd1aWxkIG9yIHBhcmVudCBjaGFubmVsIGNhbiBiZSBhbGxvd2VkL2RlbmllZCBfX3VubGVzc19fIHRoZSBib3QgdXNlciBoYXMgYSBgTUFOQUdFX1JPTEVTYCBwZXJtaXNzaW9uIG92ZXJyaWRlIGluIHRoZSBjaGFubmVsLlxuICAgKlxuICAgKiBGaXJlcyBhIF9DaGFubmVsIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZWRpdC1jaGFubmVsLXBlcm1pc3Npb25zfVxuICAgKi9cbiAgZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IEVkaXRDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlc09wdGlvbnMpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBwb3NpdGlvbnMgb2YgYSBzZXQgb2YgY2hhbm5lbHMgaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIGluIHdoaWNoIHRvIGVkaXQgdGhlIHBvc2l0aW9ucyBvZiB0aGUgY2hhbm5lbHMuXG4gICAqIEBwYXJhbSBjaGFubmVsUG9zaXRpb25zIC0gQSBzZXQgb2Ygb2JqZWN0cyBkZWZpbmluZyB0aGUgdXBkYXRlZCBwb3NpdGlvbnMgb2YgdGhlIGNoYW5uZWxzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9DSEFOTkVMU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQgZm9yIGV2ZXJ5IGNoYW5uZWwgaW1wYWN0ZWQgaW4gdGhpcyBjaGFuZ2UuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNtb2RpZnktZ3VpbGQtY2hhbm5lbC1wb3NpdGlvbnN9XG4gICAqL1xuICBlZGl0Q2hhbm5lbFBvc2l0aW9uczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgY2hhbm5lbFBvc2l0aW9uczogTW9kaWZ5R3VpbGRDaGFubmVsUG9zaXRpb25zW10pID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIEVkaXRzIGFuIGVtb2ppLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgaW4gd2hpY2ggdG8gZWRpdCB0aGUgZW1vamkuXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgZW1vamkgdG8gZWRpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIGVtb2ppLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgdXBkYXRlZCB7QGxpbmsgRGlzY29yZEVtb2ppfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRU1PSklTX0FORF9TVElDS0VSU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBgR3VpbGQgRW1vamlzIFVwZGF0ZWAgZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI21vZGlmeS1ndWlsZC1lbW9qaX1cbiAgICovXG4gIGVkaXRFbW9qaTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgaWQ6IEJpZ1N0cmluZywgb3B0aW9uczogTW9kaWZ5R3VpbGRFbW9qaSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkRW1vamk+PlxuICAvKipcbiAgICogRWRpdHMgYSBmb2xsb3ctdXAgbWVzc2FnZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBNZXNzYWdlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVW5saWtlIGBlZGl0TWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0IG5lZWRpbmcgdG8gc2VlIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgKlxuICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICpcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBVcGRhdGVfIGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2VkaXQtZm9sbG93dXAtbWVzc2FnZX1cbiAgICovXG4gIGVkaXRGb2xsb3d1cE1lc3NhZ2U6ICh0b2tlbjogc3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogSW50ZXJhY3Rpb25DYWxsYmFja0RhdGEpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAvKipcbiAgICogRWRpdHMgYSBnbG9iYWwgYXBwbGljYXRpb24gY29tbWFuZC5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBlZGl0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgY29tbWFuZC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2VkaXQtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAqL1xuICBlZGl0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kOiAoY29tbWFuZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPj5cbiAgLyoqXG4gICAqIEVkaXRzIGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgcmVnaXN0ZXJlZCBpbiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCBpbi5cbiAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBlZGl0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgY29tbWFuZC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2VkaXQtZ3VpbGQtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICovXG4gIGVkaXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZDogKFxuICAgIGNvbW1hbmRJZDogQmlnU3RyaW5nLFxuICAgIGd1aWxkSWQ6IEJpZ1N0cmluZyxcbiAgICBvcHRpb25zOiBDcmVhdGVBcHBsaWNhdGlvbkNvbW1hbmQsXG4gICkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPj5cbiAgLyoqXG4gICAqIEVkaXRzIGEgdGVtcGxhdGUncyBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgYSB0ZW1wbGF0ZSBvZi5cbiAgICogQHBhcmFtIHRlbXBsYXRlQ29kZSAtIFRoZSBjb2RlIG9mIHRoZSB0ZW1wbGF0ZSB0byBlZGl0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgdGVtcGxhdGUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIFRlbXBsYXRlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI21vZGlmeS1ndWlsZC10ZW1wbGF0ZX1cbiAgICovXG4gIGVkaXRHdWlsZFRlbXBsYXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB0ZW1wbGF0ZUNvZGU6IHN0cmluZywgb3B0aW9uczogTW9kaWZ5R3VpbGRUZW1wbGF0ZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGVtcGxhdGU+PlxuICAvKipcbiAgICogRWRpdHMgYSBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGVkaXQgdGhlIG1lc3NhZ2UgaW4uXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSURzIG9mIHRoZSBtZXNzYWdlIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBNZXNzYWdlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogSWYgZWRpdGluZyBhbm90aGVyIHVzZXIncyBtZXNzYWdlOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX01FU1NBR0VTYCBwZXJtaXNzaW9uLlxuICAgKiAtIE9ubHkgdGhlIHtAbGluayBFZGl0TWVzc2FnZS5mbGFncyB8IGZsYWdzfSBwcm9wZXJ0eSBvZiB0aGUge0BsaW5rIG9wdGlvbnN9IG9iamVjdCBwYXJhbWV0ZXIgY2FuIGJlIGVkaXRlZC5cbiAgICpcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2VkaXQtbWVzc2FnZX1cbiAgICovXG4gIGVkaXRNZXNzYWdlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBFZGl0TWVzc2FnZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgaW5pdGlhbCBtZXNzYWdlIHJlc3BvbnNlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSByZXNwb25zZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFVubGlrZSBgZWRpdE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dCBuZWVkaW5nIHRvIHNlZSB0aGUgY2hhbm5lbCB0aGUgbWVzc2FnZSBpcyBpbi5cbiAgICpcbiAgICogRG9lcyBub3Qgc3VwcG9ydCBlcGhlbWVyYWwgZm9sbG93LXVwIG1lc3NhZ2VzIGR1ZSB0byB0aGVzZSBiZWluZyBzdGF0ZWxlc3MuXG4gICAqXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgVXBkYXRlXyBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNlZGl0LW9yaWdpbmFsLWludGVyYWN0aW9uLXJlc3BvbnNlfVxuICAgKi9cbiAgZWRpdE9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZTogKHRva2VuOiBzdHJpbmcsIG9wdGlvbnM6IEludGVyYWN0aW9uQ2FsbGJhY2tEYXRhKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPiB8IHVuZGVmaW5lZD5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBvcmlnaW5hbCB3ZWJob29rIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZWRpdCB0aGUgb3JpZ2luYWwgbWVzc2FnZSBvZi5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZWRpdCB0aGUgbWVzc2FnZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRNZXNzYWdlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2VkaXQtd2ViaG9vay1tZXNzYWdlfVxuICAgKi9cbiAgZWRpdE9yaWdpbmFsV2ViaG9va01lc3NhZ2U6IChcbiAgICB3ZWJob29rSWQ6IEJpZ1N0cmluZyxcbiAgICB0b2tlbjogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEludGVyYWN0aW9uQ2FsbGJhY2tEYXRhICYgeyB0aHJlYWRJZD86IEJpZ1N0cmluZyB9LFxuICApID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAvKipcbiAgICogRWRpdHMgYSBzY2hlZHVsZWQgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBlZGl0IHRoZSBzY2hlZHVsZWQgZXZlbnQgaW4uXG4gICAqIEBwYXJhbSBldmVudElkIC0gVGhlIElEIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQgdG8gZWRpdC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgU2NoZWR1bGVkRXZlbnR9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FVkVOVFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIFRvIHN0YXJ0IG9yIGVuZCBhbiBldmVudCwgbW9kaWZ5IHRoZSBldmVudCdzIGBzdGF0dXNgIHByb3BlcnR5LlxuICAgKlxuICAgKiBUaGUgYGVudGl0eV9tZXRhZGF0YWAgcHJvcGVydHkgaXMgZGlzY2FyZGVkIGZvciBldmVudHMgd2hvc2UgYGVudGl0eV90eXBlYCBpcyBub3Qge0BsaW5rIFNjaGVkdWxlZEV2ZW50RW50aXR5VHlwZS5FeHRlcm5hbH0uXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFNjaGVkdWxlZCBFdmVudCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjbW9kaWZ5LWd1aWxkLXNjaGVkdWxlZC1ldmVudH1cbiAgICovXG4gIGVkaXRTY2hlZHVsZWRFdmVudDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgZXZlbnRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBQYXJ0aWFsPEVkaXRTY2hlZHVsZWRFdmVudD4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFNjaGVkdWxlZEV2ZW50Pj5cbiAgLyoqXG4gICAqIEVkaXRzIGEgc3RhZ2UgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHN0YWdlIGNoYW5uZWwgdGhlIHN0YWdlIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIHVwZGF0ZWQge0BsaW5rIERpc2NvcmRTdGFnZUluc3RhbmNlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIHVzZXIgdG8gYmUgYSBtb2RlcmF0b3Igb2YgdGhlIHN0YWdlIGNoYW5uZWwuXG4gICAqXG4gICAqIEZpcmVzIGEgX1N0YWdlIEluc3RhbmNlIFVwZGF0ZV8gZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9zdGFnZS1pbnN0YW5jZSNtb2RpZnktc3RhZ2UtaW5zdGFuY2V9XG4gICAqL1xuICBlZGl0U3RhZ2VJbnN0YW5jZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBkYXRhOiBFZGl0U3RhZ2VJbnN0YW5jZU9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFN0YWdlSW5zdGFuY2U+PlxuICAvKipcbiAgICogRWRpdHMgYSB3ZWJob29rLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGVkaXQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRXZWJob29rfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX1dlYmhvb2tzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZWRpdC13ZWJob29rfVxuICAgKi9cbiAgZWRpdFdlYmhvb2s6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogTW9kaWZ5V2ViaG9vaykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIHdlYmhvb2sgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBlZGl0IHRoZSBtZXNzYWdlIG9mLlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBlZGl0IHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkTWVzc2FnZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNlZGl0LXdlYmhvb2stbWVzc2FnZX1cbiAgICovXG4gIGVkaXRXZWJob29rTWVzc2FnZTogKFxuICAgIHdlYmhvb2tJZDogQmlnU3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgbWVzc2FnZUlkOiBCaWdTdHJpbmcsXG4gICAgb3B0aW9uczogSW50ZXJhY3Rpb25DYWxsYmFja0RhdGEgJiB7IHRocmVhZElkPzogQmlnU3RyaW5nIH0sXG4gICkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIHdlYmhvb2sgdXNpbmcgdGhlIHdlYmhvb2sgdG9rZW4sIHRoZXJlYnkgYnlwYXNzaW5nIHRoZSBuZWVkIGZvciBhdXRoZW50aWNhdGlvbiArIHBlcm1pc3Npb25zLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGVkaXQuXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIGVkaXQgdGhlIHdlYmhvb2suXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRXZWJob29rfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX1dlYmhvb2tzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjbW9kaWZ5LXdlYmhvb2std2l0aC10b2tlbn1cbiAgICovXG4gIGVkaXRXZWJob29rV2l0aFRva2VuOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG9wdGlvbnM6IE9taXQ8TW9kaWZ5V2ViaG9vaywgJ2NoYW5uZWxJZCc+KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rPj5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgd2ViaG9vaywgY2F1c2luZyBhIG1lc3NhZ2UgdG8gYmUgcG9zdGVkIGluIHRoZSBjaGFubmVsIGNvbmZpZ3VyZWQgZm9yIHRoZSB3ZWJob29rLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGV4ZWN1dGUuXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIGV4ZWN1dGUgdGhlIHdlYmhvb2suXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIHdlYmhvb2suXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkTWVzc2FnZX0sIG9yIGB1bmRlZmluZWRgIGlmIHRoZSB7QGxpbmsgRXhlY3V0ZVdlYmhvb2sud2FpdCB8IHdhaXR9IHByb3BlcnR5IG9mIHRoZSB7QGxpbmsgb3B0aW9uc30gb2JqZWN0IHBhcmFtZXRlciBpcyBzZXQgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogSWYgdGhlIHdlYmhvb2sgY2hhbm5lbCBpcyBhIGZvcnVtIGNoYW5uZWwsIHlvdSBtdXN0IHByb3ZpZGUgYSB2YWx1ZSBmb3IgZWl0aGVyIGB0aHJlYWRJZGAgb3IgYHRocmVhZE5hbWVgLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNleGVjdXRlLXdlYmhvb2t9XG4gICAqL1xuICBleGVjdXRlV2ViaG9vazogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBFeGVjdXRlV2ViaG9vaykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4gfCB1bmRlZmluZWQ+XG4gIC8qKlxuICAgKiBGb2xsb3dzIGFuIGFubm91bmNlbWVudCBjaGFubmVsLCBhbGxvd2luZyBtZXNzYWdlcyBwb3N0ZWQgd2l0aGluIGl0IHRvIGJlIGNyb3NzLXBvc3RlZCBpbnRvIHRoZSB0YXJnZXQgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIHNvdXJjZUNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgYW5ub3VuY2VtZW50IGNoYW5uZWwgdG8gZm9sbG93LlxuICAgKiBAcGFyYW0gdGFyZ2V0Q2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0YXJnZXQgY2hhbm5lbCAtIHRoZSBjaGFubmVsIHRvIGNyb3NzLXBvc3QgdG8uXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkRm9sbG93ZWRDaGFubmVsfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24gaW4gdGhlIF9fdGFyZ2V0IGNoYW5uZWxfXy5cbiAgICpcbiAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNmb2xsb3ctYW5ub3VuY2VtZW50LWNoYW5uZWx9XG4gICAqL1xuICBmb2xsb3dBbm5vdW5jZW1lbnQ6IChzb3VyY2VDaGFubmVsSWQ6IEJpZ1N0cmluZywgdGFyZ2V0Q2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEZvbGxvd2VkQ2hhbm5lbD4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFsbCBhY3RpdmUgdGhyZWFkcyBmb3IgYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgdGhyZWFkcyBvZi5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRBY3RpdmVUaHJlYWRzfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmV0dXJucyBib3RoIHB1YmxpYyBhbmQgcHJpdmF0ZSB0aHJlYWRzLlxuICAgKlxuICAgKiBUaHJlYWRzIGFyZSBvcmRlcmVkIGJ5IHRoZSBgaWRgIHByb3BlcnR5IGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNsaXN0LWFjdGl2ZS1ndWlsZC10aHJlYWRzfVxuICAgKi9cbiAgZ2V0QWN0aXZlVGhyZWFkczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQWN0aXZlVGhyZWFkcz4+XG4gIC8qKiBHZXQgdGhlIGFwcGxpY2F0aW9ucyBpbmZvICovXG4gIGdldEFwcGxpY2F0aW9uSW5mbzogKCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb24+PlxuICAvKipcbiAgICogR2V0cyB0aGUgcGVybWlzc2lvbnMgb2YgYSBndWlsZCBhcHBsaWNhdGlvbiBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCBpbi5cbiAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBnZXQgdGhlIHBlcm1pc3Npb25zIG9mLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbn0uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNnZXQtYXBwbGljYXRpb24tY29tbWFuZC1wZXJtaXNzaW9uc31cbiAgICovXG4gIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb246IChndWlsZElkOiBCaWdTdHJpbmcsIGNvbW1hbmRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwZXJtaXNzaW9ucyBvZiBhbGwgYXBwbGljYXRpb24gY29tbWFuZHMgcmVnaXN0ZXJlZCBpbiBhIGd1aWxkIGJ5IHRoZSBJRCBvZiB0aGUgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIHBlcm1pc3Npb25zIG9iamVjdHMgb2YuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbn0gb2JqZWN0cyBhc3NvcnRlZCBieSBjb21tYW5kIElELlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmQtcGVybWlzc2lvbnN9XG4gICAqL1xuICBnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnNbXT4+XG4gIC8qKlxuICAgKiBHZXRzIGFuIGF1dG9tb2QgcnVsZSBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIHJ1bGUgb2YuXG4gICAqIEBwYXJhbSBydWxlSWQgLSBUaGUgSUQgb2YgdGhlIHJ1bGUgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvYXV0by1tb2RlcmF0aW9uI2dldC1hdXRvLW1vZGVyYXRpb24tcnVsZX1cbiAgICovXG4gIGdldEF1dG9tb2RSdWxlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBydWxlSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgYXV0b21vZCBydWxlcyBmb3IgYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgcnVsZXMgZnJvbS5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlfSBvYmplY3RzIGFzc29ydGVkIGJ5IHJ1bGUgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvYXV0by1tb2RlcmF0aW9uI2xpc3QtYXV0by1tb2RlcmF0aW9uLXJ1bGVzLWZvci1ndWlsZH1cbiAgICovXG4gIGdldEF1dG9tb2RSdWxlczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlW10+PlxuICAvKipcbiAgICogR2V0cyBhIGNoYW5uZWwgYnkgaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGdldC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogSWYgdGhlIGNoYW5uZWwgaXMgYSB0aHJlYWQsIGEge0BsaW5rIFRocmVhZE1lbWJlcn0gb2JqZWN0IGlzIGluY2x1ZGVkIGluIHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2dldC1jaGFubmVsfVxuICAgKi9cbiAgZ2V0Q2hhbm5lbDogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgaW52aXRlcyBmb3IgYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGdldCB0aGUgaW52aXRlcyBvZi5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkSW52aXRlTWV0YWRhdGF9IG9iamVjdHMgYXNzb3J0ZWQgYnkgaW52aXRlIGNvZGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0NIQU5ORUxTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBPbmx5IHVzYWJsZSBmb3IgZ3VpbGQgY2hhbm5lbHMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2dldC1jaGFubmVsLWludml0ZXN9XG4gICAqL1xuICBnZXRDaGFubmVsSW52aXRlczogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgY2hhbm5lbHMgZm9yIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGNoYW5uZWxzIG9mLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRDaGFubmVsfSBvYmplY3RzIGFzc29ydGVkIGJ5IGNoYW5uZWwgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEV4Y2x1ZGVzIHRocmVhZHMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNnZXQtZ3VpbGQtY2hhbm5lbHN9XG4gICAqL1xuICBnZXRDaGFubmVsczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQ2hhbm5lbFtdPj5cbiAgLyoqXG4gICAqIEdldHMgYSBsaXN0IG9mIHdlYmhvb2tzIGZvciBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgd2hpY2ggdG8gZ2V0IHRoZSB3ZWJob29rcyBvZi5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkV2ViaG9va30gb2JqZWN0cyBhc3NvcnRlZCBieSB3ZWJob29rIElELlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZ2V0LWNoYW5uZWwtd2ViaG9va3N9XG4gICAqL1xuICBnZXRDaGFubmVsV2ViaG9va3M6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9va1tdPj5cbiAgLyoqXG4gICAqIEdldHMgb3IgY3JlYXRlcyBhIERNIGNoYW5uZWwgd2l0aCBhIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgSUQgb2YgdGhlIHVzZXIgdG8gY3JlYXRlIHRoZSBETSBjaGFubmVsIHdpdGguXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQ2hhbm5lbH0uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy91c2VyI2NyZWF0ZS1kbX1cbiAgICovXG4gIGdldERtQ2hhbm5lbDogKHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgLyoqXG4gICAqIEdldHMgYW4gZW1vamkgYnkgaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgZnJvbSB3aGljaCB0byBnZXQgdGhlIGVtb2ppLlxuICAgKiBAcGFyYW0gZW1vamlJZCAtIFRoZSBJRCBvZiB0aGUgZW1vamkgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEVtb2ppfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI2dldC1ndWlsZC1lbW9qaX1cbiAgICovXG4gIGdldEVtb2ppOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBlbW9qaUlkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEVtb2ppPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgZW1vamlzIGZvciBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgd2hpY2ggdG8gZ2V0IHRoZSBlbW9qaXMgb2YuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZEVtb2ppfSBvYmplY3RzIGFzc29ydGVkIGJ5IGVtb2ppIElELlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZW1vamkjbGlzdC1ndWlsZC1lbW9qaXN9XG4gICAqL1xuICBnZXRFbW9qaXM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEVtb2ppW10+PlxuICAvKipcbiAgICogR2V0cyBhIGZvbGxvdy11cCBtZXNzYWdlIHRvIGFuIGludGVyYWN0aW9uIGJ5IHRoZSBJRCBvZiB0aGUgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGdldC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBVbmxpa2UgYGdldE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dDpcbiAgICogLSBOZWVkaW5nIHRvIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGF0IHRoZSBtZXNzYWdlIGlzIGluLiAoYFJFQURfTUVTU0FHRVNgIHBlcm1pc3Npb24uKVxuICAgKiAtIFJlcXVpcmluZyB0aGUgYE1FU1NBR0VfQ09OVEVOVGAgaW50ZW50LlxuICAgKlxuICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNnZXQtZm9sbG93dXAtbWVzc2FnZX1cbiAgICovXG4gIGdldEZvbGxvd3VwTWVzc2FnZTogKHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgLyoqIEdldCB0aGUgYm90cyBHYXRld2F5IG1ldGFkYXRhIHRoYXQgY2FuIGhlbHAgZHVyaW5nIHRoZSBvcGVyYXRpb24gb2YgbGFyZ2Ugb3Igc2hhcmRlZCBib3RzLiAqL1xuICBnZXRHYXRld2F5Qm90OiAoKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRHZXRHYXRld2F5Qm90Pj5cbiAgLyoqXG4gICAqIEdldHMgYSBnbG9iYWwgYXBwbGljYXRpb24gY29tbWFuZCBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICovXG4gIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZDogKGNvbW1hbmRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiB5b3VyIGJvdCdzIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kcy5cbiAgICpcbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9IG9iamVjdHMgYXNzb3J0ZWQgYnkgY29tbWFuZCBJRC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZHN9XG4gICAqL1xuICBnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzOiAoKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4+XG4gIC8qKlxuICAgKiBHZXRzIGEgZ3VpbGQgYXBwbGljYXRpb24gY29tbWFuZCBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGdldC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNnZXQtZ3VpbGQtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICovXG4gIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kOiAoY29tbWFuZElkOiBCaWdTdHJpbmcsIGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgYXBwbGljYXRpb24gY29tbWFuZHMgcmVnaXN0ZXJlZCBieSB5b3VyIGJvdCBpbiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIGNvbW1hbmRzIGFyZSByZWdpc3RlcmVkIGluLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0gb2JqZWN0cyBhc3NvcnRlZCBieSBjb21tYW5kIElELlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kc3N9XG4gICAqL1xuICBnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPj5cbiAgLyoqXG4gICAqIEdldHMgYSB0ZW1wbGF0ZSBieSBpdHMgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIHRlbXBsYXRlQ29kZSAtIFRoZSBjb2RlIG9mIHRoZSB0ZW1wbGF0ZSB0byBnZXQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBUZW1wbGF0ZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjZ2V0LWd1aWxkLXRlbXBsYXRlfVxuICAgKi9cbiAgZ2V0R3VpbGRUZW1wbGF0ZTogKHRlbXBsYXRlQ29kZTogc3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHRlbXBsYXRlcyBmb3IgYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiB0ZW1wbGF0ZXMgZm9yLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFRlbXBsYXRlfSBvYmplY3RzIGFzc29ydGVkIGJ5IHRlbXBsYXRlIGNvZGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjZ2V0LWd1aWxkLXRlbXBsYXRlc31cbiAgICovXG4gIGdldEd1aWxkVGVtcGxhdGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZVtdPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2Ygd2ViaG9va3MgZm9yIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2Ygd2ViaG9va3MgZm9yLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRXZWJob29rfSBvYmplY3RzIGFzc29ydGVkIGJ5IHdlYmhvb2sgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtZ3VpbGQtd2ViaG9va3N9XG4gICAqL1xuICBnZXRHdWlsZFdlYmhvb2tzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rW10+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBpbnRlZ3JhdGlvbnMgYXR0YWNoZWQgdG8gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiBpbnRlZ3JhdGlvbnMgZnJvbS5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBJbnRlZ3JhdGlvbn0gb2JqZWN0cyBhc3NvcnRlZCBieSBpbnRlZ3JhdGlvbiBJRC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNnZXQtZ3VpbGQtaW50ZWdyYXRpb25zfVxuICAgKi9cbiAgZ2V0SW50ZWdyYXRpb25zOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnRlZ3JhdGlvbltdPj5cbiAgLyoqXG4gICAqIEdldHMgYW4gaW52aXRlIHRvIGEgY2hhbm5lbCBieSBpdHMgaW52aXRlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBpbnZpdGVDb2RlIC0gVGhlIGludml0ZSBjb2RlIG9mIHRoZSBpbnZpdGUgdG8gZ2V0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIGludml0ZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRJbnZpdGVNZXRhZGF0YX0uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9pbnZpdGUjZ2V0LWludml0ZX1cbiAgICovXG4gIGdldEludml0ZTogKGludml0ZUNvZGU6IHN0cmluZywgb3B0aW9ucz86IEdldEludml0ZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkSW52aXRlTWV0YWRhdGE+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBpbnZpdGVzIGZvciBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBpbnZpdGVzIGZyb20uXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgSW52aXRlTWV0YWRhdGEgfCBJbnZpdGV9IG9iamVjdHMgYXNzb3J0ZWQgYnkgaW52aXRlIGNvZGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvaW52aXRlI2dldC1pbnZpdGVzfVxuICAgKi9cbiAgZ2V0SW52aXRlczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkSW52aXRlTWV0YWRhdGFbXT4+XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHN0aWNrZXIgcGFja3MgYXZhaWxhYmxlIHRvIE5pdHJvIHN1YnNjcmliZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gYm90IFRoZSBib3QgaW5zdGFuY2UgdG8gdXNlIHRvIG1ha2UgdGhlIHJlcXVlc3QuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgU3RpY2tlclBhY2t9IG9iamVjdHMgYXNzb3J0ZWQgYnkgc3RpY2tlciBJRC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0aWNrZXIjbGlzdC1uaXRyby1zdGlja2VyLXBhY2tzfVxuICAgKi9cbiAgZ2V0Tml0cm9TdGlja2VyUGFja3M6ICgpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFN0aWNrZXJQYWNrW10+PlxuICAvKipcbiAgICogR2V0cyB0aGUgaW5pdGlhbCBtZXNzYWdlIHJlc3BvbnNlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBNZXNzYWdlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVW5saWtlIGBnZXRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQ6XG4gICAqIC0gTmVlZGluZyB0byBiZSBhYmxlIHRvIHNlZSB0aGUgY29udGVudHMgb2YgdGhlIGNoYW5uZWwgdGhhdCB0aGUgbWVzc2FnZSBpcyBpbi4gKGBSRUFEX01FU1NBR0VTYCBwZXJtaXNzaW9uLilcbiAgICogLSBSZXF1aXJpbmcgdGhlIGBNRVNTQUdFX0NPTlRFTlRgIGludGVudC5cbiAgICpcbiAgICogRG9lcyBub3Qgc3VwcG9ydCBlcGhlbWVyYWwgZm9sbG93LXVwIG1lc3NhZ2VzIGR1ZSB0byB0aGVzZSBiZWluZyBzdGF0ZWxlc3MuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZ2V0LW9yaWdpbmFsLWludGVyYWN0aW9uLXJlc3BvbnNlfVxuICAgKi9cbiAgZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlOiAodG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHByaXZhdGUgYXJjaGl2ZWQgdGhyZWFkcyBmb3IgYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGdldCB0aGUgYXJjaGl2ZWQgdGhyZWFkcyBmb3IuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aHJlYWRzLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEFyY2hpdmVkVGhyZWFkc30uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgUkVBRF9NRVNTQUdFX0hJU1RPUllgIHBlcm1pc3Npb24uXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1RIUkVBRFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIFJldHVybnMgdGhyZWFkcyBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRQcml2YXRlVGhyZWFkfS5cbiAgICpcbiAgICogVGhyZWFkcyBhcmUgb3JkZXJlZCBieSB0aGUgYGFyY2hpdmVfdGltZXN0YW1wYCBwcm9wZXJ0eSBpbmNsdWRlZCBpbiB0aGUgbWV0YWRhdGEgb2YgdGhlIG9iamVjdCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNsaXN0LXByaXZhdGUtYXJjaGl2ZWQtdGhyZWFkc31cbiAgICovXG4gIGdldFByaXZhdGVBcmNoaXZlZFRocmVhZHM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RBcmNoaXZlZFRocmVhZHMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFyY2hpdmVkVGhyZWFkcz4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHByaXZhdGUgYXJjaGl2ZWQgdGhyZWFkcyB0aGUgYm90IGlzIGEgbWVtYmVyIG9mIGZvciBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZ2V0IHRoZSBhcmNoaXZlZCB0aHJlYWRzIGZvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRocmVhZHMuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBSRUFEX01FU1NBR0VfSElTVE9SWWAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogUmV0dXJucyB0aHJlYWRzIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFByaXZhdGVUaHJlYWR9LlxuICAgKlxuICAgKiBUaHJlYWRzIGFyZSBvcmRlcmVkIGJ5IHRoZSBgaWRgIHByb3BlcnR5IGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xpc3Qtam9pbmVkLXByaXZhdGUtYXJjaGl2ZWQtdGhyZWFkc31cbiAgICovXG4gIGdldFByaXZhdGVKb2luZWRBcmNoaXZlZFRocmVhZHM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RBcmNoaXZlZFRocmVhZHMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFyY2hpdmVkVGhyZWFkcz4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHB1YmxpYyBhcmNoaXZlZCB0aHJlYWRzIGZvciBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZ2V0IHRoZSBhcmNoaXZlZCB0aHJlYWRzIGZvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRocmVhZHMuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBBcmNoaXZlZFRocmVhZHN9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYFJFQURfTUVTU0FHRV9ISVNUT1JZYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBJZiBjYWxsZWQgb24gYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFRleHR9LCByZXR1cm5zIHRocmVhZHMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkUHVibGljVGhyZWFkfS5cbiAgICogSWYgY2FsbGVkIG9uIGEgY2hhbm5lbCBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGROZXdzfSwgcmV0dXJucyB0aHJlYWRzIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZE5ld3NUaHJlYWR9LlxuICAgKlxuICAgKiBUaHJlYWRzIGFyZSBvcmRlcmVkIGJ5IHRoZSBgYXJjaGl2ZV90aW1lc3RhbXBgIHByb3BlcnR5IGluY2x1ZGVkIGluIHRoZSBtZXRhZGF0YSBvZiB0aGUgb2JqZWN0IGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xpc3QtcHVibGljLWFyY2hpdmVkLXRocmVhZHN9XG4gICAqL1xuICBnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RBcmNoaXZlZFRocmVhZHMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFyY2hpdmVkVGhyZWFkcz4+XG4gIC8qKlxuICAgKiBHZXRzIGEgc2NoZWR1bGVkIGV2ZW50IGJ5IGl0cyBJRC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgc2NoZWR1bGVkIGV2ZW50IGZyb20uXG4gICAqIEBwYXJhbSBldmVudElkIC0gVGhlIElEIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQgdG8gZ2V0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIHNjaGVkdWxlZCBldmVudC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNjaGVkdWxlZEV2ZW50fS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNnZXQtZ3VpbGQtc2NoZWR1bGVkLWV2ZW50fVxuICAgKi9cbiAgZ2V0U2NoZWR1bGVkRXZlbnQ6IChndWlsZElkOiBCaWdTdHJpbmcsIGV2ZW50SWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IHsgd2l0aFVzZXJDb3VudD86IGJvb2xlYW4gfSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBzY2hlZHVsZWQgZXZlbnRzIGZvciBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBzY2hlZHVsZWQgZXZlbnRzIGZyb20uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50cy5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBTY2hlZHVsZWRFdmVudH0gb2JqZWN0cyBhc3NvcnRlZCBieSBldmVudCBJRC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNsaXN0LXNjaGVkdWxlZC1ldmVudHMtZm9yLWd1aWxkfVxuICAgKi9cbiAgZ2V0U2NoZWR1bGVkRXZlbnRzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogR2V0U2NoZWR1bGVkRXZlbnRzKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTY2hlZHVsZWRFdmVudFtdPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2Ygc3Vic2NyaWJlcnMgdG8gYSBzY2hlZHVsZWQgZXZlbnQgZnJvbSBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBzdWJzY3JpYmVycyB0byB0aGUgc2NoZWR1bGVkIGV2ZW50IGZyb20uXG4gICAqIEBwYXJhbSBldmVudElkIC0gVGhlIElEIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQgdG8gZ2V0IHRoZSBzdWJzY3JpYmVycyBvZi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBzdWJzY3JpYmVycy5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBVc2VyfSBvYmplY3RzIGFzc29ydGVkIGJ5IHVzZXIgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VWRU5UU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogVXNlcnMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgSURzIGluIF9hc2NlbmRpbmdfIG9yZGVyLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2dldC1ndWlsZC1zY2hlZHVsZWQtZXZlbnQtdXNlcnN9XG4gICAqL1xuICBnZXRTY2hlZHVsZWRFdmVudFVzZXJzOiAoXG4gICAgZ3VpbGRJZDogQmlnU3RyaW5nLFxuICAgIGV2ZW50SWQ6IEJpZ1N0cmluZyxcbiAgICBvcHRpb25zPzogR2V0U2NoZWR1bGVkRXZlbnRVc2VycyxcbiAgKSA9PiBQcm9taXNlPEFycmF5PHsgdXNlcjogQ2FtZWxpemU8RGlzY29yZFVzZXI+OyBtZW1iZXI/OiBDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyPiB9Pj5cbiAgLyoqIEdldCB0aGUgYm90cyBHYXRld2F5IG1ldGFkYXRhIHRoYXQgY2FuIGhlbHAgZHVyaW5nIHRoZSBvcGVyYXRpb24gb2YgbGFyZ2Ugb3Igc2hhcmRlZCBib3RzLiAqL1xuICBnZXRTZXNzaW9uSW5mbzogKCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkR2V0R2F0ZXdheUJvdD4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdGFnZSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzdGFnZSBjaGFubmVsLCBpZiBvbmUgZXhpc3RzLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBzdGFnZSBjaGFubmVsIHRoZSBzdGFnZSBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkU3RhZ2VJbnN0YW5jZX0uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9zdGFnZS1pbnN0YW5jZSNnZXQtc3RhZ2UtaW5zdGFuY2V9XG4gICAqL1xuICBnZXRTdGFnZUluc3RhbmNlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFN0YWdlSW5zdGFuY2U+PlxuICAvKipcbiAgICogR2V0cyBhIHRocmVhZCBtZW1iZXIgYnkgdGhlaXIgdXNlciBJRC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIGdldCB0aGUgdGhyZWFkIG1lbWJlciBvZi5cbiAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSB1c2VyIElEIG9mIHRoZSB0aHJlYWQgbWVtYmVyIHRvIGdldC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRUaHJlYWRNZW1iZXJ9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNnZXQtdGhyZWFkLW1lbWJlcn1cbiAgICovXG4gIGdldFRocmVhZE1lbWJlcjogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGhyZWFkTWVtYmVyPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgdGhyZWFkIG1lbWJlcnMgZm9yIGEgdGhyZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0aHJlYWQgdG8gZ2V0IHRoZSB0aHJlYWQgbWVtYmVycyBvZi5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkVGhyZWFkTWVtYmVyfSBhc3NvcnRlZCBieSB1c2VyIElELlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYXBwbGljYXRpb24gdG8gaGF2ZSB0aGUgYEdVSUxEX01FTUJFUlNgIHByaXZpbGVnZWQgaW50ZW50IGVuYWJsZWQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xpc3QtdGhyZWFkLW1lbWJlcnN9XG4gICAqL1xuICBnZXRUaHJlYWRNZW1iZXJzOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRocmVhZE1lbWJlcltdPj5cbiAgLyoqXG4gICAqIEdldCBhIHVzZXIncyBkYXRhIGZyb20gdGhlIGFwaVxuICAgKlxuICAgKiBAcGFyYW0gaWQgVGhlIHVzZXIncyBpZFxuICAgKiBAcmV0dXJucyB7Q2FtZWxpemU8RGlzY29yZFVzZXI+fVxuICAgKi9cbiAgZ2V0VXNlcjogKGlkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFVzZXI+PlxuICAvKipcbiAgICogR2V0cyBhIHdlYmhvb2sgYnkgaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGdldC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRXZWJob29rfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2dldC13ZWJob29rfVxuICAgKi9cbiAgZ2V0V2ViaG9vazogKHdlYmhvb2tJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rPj5cbiAgLyoqXG4gICAqIEdldHMgYSB3ZWJob29rIG1lc3NhZ2UgYnkgaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGdldCBhIG1lc3NhZ2Ugb2YuXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIGdldCB3ZWJob29rIG1lc3NhZ2VzLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gdGhlIElEIG9mIHRoZSB3ZWJob29rIG1lc3NhZ2UgdG8gZ2V0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkTWVzc2FnZX0uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2dldC13ZWJob29rLW1lc3NhZ2V9XG4gICAqL1xuICBnZXRXZWJob29rTWVzc2FnZTogKFxuICAgIHdlYmhvb2tJZDogQmlnU3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgbWVzc2FnZUlkOiBCaWdTdHJpbmcsXG4gICAgb3B0aW9ucz86IEdldFdlYmhvb2tNZXNzYWdlT3B0aW9ucyxcbiAgKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgLyoqXG4gICAqIEdldHMgYSB3ZWJob29rIHVzaW5nIHRoZSB3ZWJob29rIHRva2VuLCB0aGVyZWJ5IGJ5cGFzc2luZyB0aGUgbmVlZCBmb3IgYXV0aGVudGljYXRpb24gKyBwZXJtaXNzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBnZXQuXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIGdldCB0aGUgd2ViaG9vay5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRXZWJob29rfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZ2V0LXdlYmhvb2std2l0aC10b2tlbn1cbiAgICovXG4gIGdldFdlYmhvb2tXaXRoVG9rZW46ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gIC8qKlxuICAgKiBBZGRzIHRoZSBib3QgdXNlciB0byBhIHRocmVhZC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIGFkZCB0aGUgYm90IHVzZXIgdG8uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSB0aHJlYWQgbm90IGJlIGFyY2hpdmVkLlxuICAgKlxuICAgKiBGaXJlcyBhIF9UaHJlYWQgTWVtYmVycyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2pvaW4tdGhyZWFkfVxuICAgKi9cbiAgam9pblRocmVhZDogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBib3QgdXNlciBmcm9tIGEgdGhyZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0aHJlYWQgdG8gcmVtb3ZlIHRoZSBib3QgdXNlciBmcm9tLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgdGhyZWFkIG5vdCBiZSBhcmNoaXZlZC5cbiAgICpcbiAgICogRmlyZXMgYSBfVGhyZWFkIE1lbWJlcnMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNsZWF2ZS10aHJlYWR9XG4gICAqL1xuICBsZWF2ZVRocmVhZDogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBDcm9zcy1wb3N0cyBhIG1lc3NhZ2UgcG9zdGVkIGluIGFuIGFubm91bmNlbWVudCBjaGFubmVsIHRvIHN1YnNjcmliZWQgY2hhbm5lbHMuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGFubm91bmNlbWVudCBjaGFubmVsLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGNyb3NzLXBvc3QuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcm9zcy1wb3N0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYFNFTkRfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIElmIG5vdCBjcm9zcy1wb3N0aW5nIG93biBtZXNzYWdlOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX01FU1NBR0VTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9NZXNzYWdlIENyZWF0ZV8gZXZlbnQgaW4gdGhlIGd1aWxkcyB0aGUgc3Vic2NyaWJlZCBjaGFubmVscyBhcmUgaW4uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2Nyb3NzcG9zdC1tZXNzYWdlfVxuICAgKi9cbiAgcHVibGlzaE1lc3NhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAvKipcbiAgICogUmVtb3ZlcyBhIG1lbWJlciBmcm9tIGEgdGhyZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0aHJlYWQgdG8gcmVtb3ZlIHRoZSB0aHJlYWQgbWVtYmVyIG9mLlxuICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXIgSUQgb2YgdGhlIHRocmVhZCBtZW1iZXIgdG8gcmVtb3ZlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiB0aGUgdGhyZWFkIGlzIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFByaXZhdGVUaHJlYWR9LCByZXF1aXJlcyB0byBiZSB0aGUgY3JlYXRvciBvZiB0aGUgdGhyZWFkLlxuICAgKiBPdGhlcndpc2UsIHJlcXVpcmVzIHRoZSBgTUFOQUdFX1RIUkVBRFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIFJlcXVpcmVzIHRoZSB0aHJlYWQgbm90IGJlIGFyY2hpdmVkLlxuICAgKlxuICAgKiBGaXJlcyBhIF9UaHJlYWQgTWVtYmVycyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI3JlbW92ZS10aHJlYWQtbWVtYmVyfVxuICAgKi9cbiAgcmVtb3ZlVGhyZWFkTWVtYmVyOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgdG8gYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIHNlbmQgdGhlIG1lc3NhZ2UgaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRNZXNzYWdlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhhdCB0aGUgYm90IHVzZXIgYmUgYWJsZSB0byBzZWUgdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIHRvIGJlIHNlbnQgaW4uXG4gICAqXG4gICAqIElmIHNlbmRpbmcgYSBtZXNzYWdlIHRvIGEgZ3VpbGQgY2hhbm5lbDpcbiAgICogLSBSZXF1aXJlcyB0aGUgYFNFTkRfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIElmIHNlbmRpbmcgYSBUVFMgbWVzc2FnZTpcbiAgICogLSBSZXF1aXJlcyB0aGUgYFNFTkRfVFRTX01FU1NBR0VTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBJZiBzZW5kaW5nIGEgbWVzc2FnZSBhcyBhIHJlcGx5IHRvIGFub3RoZXIgbWVzc2FnZTpcbiAgICogLSBSZXF1aXJlcyB0aGUgYFJFQURfTUVTU0FHRV9ISVNUT1JZYCBwZXJtaXNzaW9uLlxuICAgKiAtIFRoZSBtZXNzYWdlIGJlaW5nIHJlcGxpZWQgdG8gY2Fubm90IGJlIGEgc3lzdGVtIG1lc3NhZ2UuXG4gICAqXG4gICAqIOKaoO+4jyBUaGUgbWF4aW11bSBzaXplIG9mIGEgcmVxdWVzdCAoYWNjb3VudGluZyBmb3IgYW55IGF0dGFjaG1lbnRzIGFuZCBtZXNzYWdlIGNvbnRlbnQpIGZvciBib3QgdXNlcnMgaXMgXzggTWlCXy5cbiAgICpcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2NyZWF0ZS1tZXNzYWdlfVxuICAgKi9cbiAgc2VuZE1lc3NhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlTWVzc2FnZU9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAvKipcbiAgICogU2VuZHMgYSBmb2xsb3ctdXAgbWVzc2FnZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBNZXNzYWdlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICog4pqg77iPIEludGVyYWN0aW9uIHRva2VucyBhcmUgb25seSB2YWxpZCBmb3IgXzE1IG1pbnV0ZXNfLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBtZW50aW9ucyBhcmUgc3VwcHJlc3NlZC4gVG8gZW5hYmxlIG1lbnRpb25zLCBwYXNzIGEgbWVudGlvbiBvYmplY3Qgd2l0aCB0aGUgY2FsbGJhY2sgZGF0YS5cbiAgICpcbiAgICogVW5saWtlIGBzZW5kTWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0OlxuICAgKiAtIE5lZWRpbmcgdG8gYmUgYWJsZSB0byBzZWUgdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFubmVsIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaW4uIChgUkVBRF9NRVNTQUdFU2AgcGVybWlzc2lvbi4pXG4gICAqIC0gUmVxdWlyaW5nIHRoZSBgTUVTU0FHRV9DT05URU5UYCBpbnRlbnQuXG4gICAqXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgQ3JlYXRlXyBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNjcmVhdGUtZm9sbG93dXAtbWVzc2FnZX1cbiAgICovXG4gIHNlbmRGb2xsb3d1cE1lc3NhZ2U6ICh0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBJbnRlcmFjdGlvblJlc3BvbnNlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgLyoqXG4gICAqIFNlbmRzIGEgcmVzcG9uc2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBpbnRlcmFjdGlvbklkIC0gVGhlIElEIG9mIHRoZSBpbnRlcmFjdGlvbiB0byByZXNwb25kIHRvLlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiDimqDvuI8gSW50ZXJhY3Rpb24gdG9rZW5zIGFyZSBvbmx5IHZhbGlkIGZvciBfMTUgbWludXRlc18uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIG1lbnRpb25zIGFyZSBzdXBwcmVzc2VkLiBUbyBlbmFibGUgbWVudGlvbnMsIHBhc3MgYSBtZW50aW9uIG9iamVjdCB3aXRoIHRoZSBjYWxsYmFjayBkYXRhLlxuICAgKlxuICAgKiBVbmxpa2UgYHNlbmRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQ6XG4gICAqIC0gTmVlZGluZyB0byBiZSBhYmxlIHRvIHNlZSB0aGUgY29udGVudHMgb2YgdGhlIGNoYW5uZWwgdGhhdCB0aGUgbWVzc2FnZSBpcyBpbi4gKGBSRUFEX01FU1NBR0VTYCBwZXJtaXNzaW9uLilcbiAgICogLSBSZXF1aXJpbmcgdGhlIGBNRVNTQUdFX0NPTlRFTlRgIGludGVudC5cbiAgICpcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBDcmVhdGVfIGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2NyZWF0ZS1pbnRlcmFjdGlvbi1yZXNwb25zZX1cbiAgICovXG4gIHNlbmRJbnRlcmFjdGlvblJlc3BvbnNlOiAoaW50ZXJhY3Rpb25JZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBJbnRlcmFjdGlvblJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdGhyZWFkLCB1c2luZyBhbiBleGlzdGluZyBtZXNzYWdlIGFzIGl0cyBwb2ludCBvZiBvcmlnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSB0aHJlYWQuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gdXNlIGFzIHRoZSB0aHJlYWQncyBwb2ludCBvZiBvcmlnaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHRocmVhZC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIENoYW5uZWwgfCBUaHJlYWR9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiBjYWxsZWQgb24gYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFRleHR9LCBjcmVhdGVzIGEge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFB1YmxpY1RocmVhZH0uXG4gICAqIElmIGNhbGxlZCBvbiBhIGNoYW5uZWwgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkTmV3c30sIGNyZWF0ZXMgYSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkTmV3c1RocmVhZH0uXG4gICAqIERvZXMgbm90IHdvcmsgb24gY2hhbm5lbHMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkRm9ydW19LlxuICAgKlxuICAgKiBUaGUgSUQgb2YgdGhlIGNyZWF0ZWQgdGhyZWFkIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIElEIG9mIHRoZSBzb3VyY2UgbWVzc2FnZS5cbiAgICpcbiAgICogRmlyZXMgYSBfVGhyZWFkIENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjc3RhcnQtdGhyZWFkLWZyb20tbWVzc2FnZX1cbiAgICovXG4gIHN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IFN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRocmVhZCB3aXRob3V0IHVzaW5nIGEgbWVzc2FnZSBhcyB0aGUgdGhyZWFkJ3MgcG9pbnQgb2Ygb3JpZ2luLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgdGhyZWFkLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSB0aHJlYWQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkQ2hhbm5lbCB8IFRocmVhZH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIENyZWF0aW5nIGEgcHJpdmF0ZSB0aHJlYWQgcmVxdWlyZXMgdGhlIHNlcnZlciB0byBiZSBib29zdGVkLlxuICAgKlxuICAgKiBGaXJlcyBhIF9UaHJlYWQgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNzdGFydC10aHJlYWQtd2l0aG91dC1tZXNzYWdlfVxuICAgKi9cbiAgc3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBTdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgLyoqXG4gICAqIFN5bmNocm9uaXNlcyBhIHRlbXBsYXRlIHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIHN5bmNocm9uaXNlIGEgdGVtcGxhdGUgb2YuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIFRlbXBsYXRlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI2dldC1ndWlsZC10ZW1wbGF0ZXN9XG4gICAqL1xuICBzeW5jR3VpbGRUZW1wbGF0ZTogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGVtcGxhdGU+PlxuICAvKipcbiAgICogVHJpZ2dlcnMgYSB0eXBpbmcgaW5kaWNhdG9yIGZvciB0aGUgYm90IHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgaW4gd2hpY2ggdG8gdHJpZ2dlciB0aGUgdHlwaW5nIGluZGljYXRvci5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogR2VuZXJhbGx5LCBib3RzIHNob3VsZCBfbm90XyB1c2UgdGhpcyByb3V0ZS5cbiAgICpcbiAgICogRmlyZXMgYSBfVHlwaW5nIFN0YXJ0XyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCN0cmlnZ2VyLXR5cGluZy1pbmRpY2F0b3J9XG4gICAqL1xuICB0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIFJlLXJlZ2lzdGVycyB0aGUgbGlzdCBvZiBnbG9iYWwgYXBwbGljYXRpb24gY29tbWFuZHMsIG92ZXJ3cml0aW5nIHRoZSBwcmV2aW91cyBjb21tYW5kcyBjb21wbGV0ZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZHMgLSBUaGUgbGlzdCBvZiBjb21tYW5kcyB0byB1c2UgdG8gb3ZlcndyaXRlIHRoZSBwcmV2aW91cyBsaXN0LlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0gb2JqZWN0cyBhc3NvcnRlZCBieSBjb21tYW5kIElELlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiDinZcgQ29tbWFuZHMgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIGBjb21tYW5kc2AgYXJyYXkgd2lsbCBiZSBfX2RlbGV0ZWRfXy5cbiAgICpcbiAgICog4pqg77iPIENvbW1hbmRzIHRoYXQgZG8gbm90IGFscmVhZHkgZXhpc3Qgd2lsbCBjb3VudCB0b3dhcmRzIHRoZSBkYWlseSBsaW1pdCBvZiBfMjAwXyBuZXcgY29tbWFuZHMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNidWxrLW92ZXJ3cml0ZS1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZHN9XG4gICAqL1xuICB1cHNlcnRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzOiAoY29tbWFuZHM6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZFtdKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4+XG4gIC8qKlxuICAgKiBSZS1yZWdpc3RlcnMgdGhlIGxpc3Qgb2YgYXBwbGljYXRpb24gY29tbWFuZHMgcmVnaXN0ZXJlZCBpbiBhIGd1aWxkLCBvdmVyd3JpdGluZyB0aGUgcHJldmlvdXMgY29tbWFuZHMgY29tcGxldGVseS5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHdob3NlIGxpc3Qgb2YgY29tbWFuZHMgdG8gb3ZlcndyaXRlLlxuICAgKiBAcGFyYW0gY29tbWFuZHMgLSBUaGUgbGlzdCBvZiBjb21tYW5kcyB0byB1c2UgdG8gb3ZlcndyaXRlIHRoZSBwcmV2aW91cyBsaXN0LlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0gb2JqZWN0cyBhc3NvcnRlZCBieSBjb21tYW5kIElELlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiDinZcgQ29tbWFuZHMgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIGBjb21tYW5kc2AgYXJyYXkgd2lsbCBiZSBfX2RlbGV0ZWRfXy5cbiAgICpcbiAgICog4pqg77iPIENvbW1hbmRzIHRoYXQgZG8gbm90IGFscmVhZHkgZXhpc3Qgd2lsbCBjb3VudCB0b3dhcmRzIHRoZSBkYWlseSBsaW1pdCBvZiBfMjAwXyBuZXcgY29tbWFuZHMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNidWxrLW92ZXJ3cml0ZS1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kc31cbiAgICovXG4gIHVwc2VydEd1aWxkQXBwbGljYXRpb25Db21tYW5kczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgY29tbWFuZHM6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZFtdKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4+XG4gIC8qKlxuICogQmFucyBhIHVzZXIgZnJvbSBhIGd1aWxkLlxuICpcblxuICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGJhbiB0aGUgdXNlciBmcm9tLlxuICogQHBhcmFtIHVzZXJJZCAtIFRoZSBJRCBvZiB0aGUgdXNlciB0byBiYW4gZnJvbSB0aGUgZ3VpbGQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGJhbi5cbiAqXG4gKiBAcmVtYXJrc1xuICogUmVxdWlyZXMgdGhlIGBCQU5fTUVNQkVSU2AgcGVybWlzc2lvbi5cbiAqXG4gKiBGaXJlcyBhIF9HdWlsZCBCYW4gQWRkXyBnYXRld2F5IGV2ZW50LlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNjcmVhdGUtZ3VpbGQtYmFufVxuICovXG4gIGJhbk1lbWJlcjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBDcmVhdGVHdWlsZEJhbikgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRWRpdHMgdGhlIG5pY2tuYW1lIG9mIHRoZSBib3QgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgdGhlIG5pY2tuYW1lIG9mIHRoZSBib3QgdXNlciBpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIG5pY2tuYW1lLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkTWVtYmVyfVxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXIgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWN1cnJlbnQtbWVtYmVyfVxuICAgKi9cbiAgZWRpdEJvdE1lbWJlcjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogRWRpdEJvdE1lbWJlck9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcj4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIG1lbWJlcidzIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBlZGl0IHRoZSBtZW1iZXIgb2YuXG4gICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgdXNlciBJRCBvZiB0aGUgbWVtYmVyIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGlzIGVuZHBvaW50IHJlcXVpcmVzIHZhcmlvdXMgcGVybWlzc2lvbnMgZGVwZW5kaW5nIG9uIHdoYXQgaXMgZWRpdGVkIGFib3V0IHRoZSBtZW1iZXIuXG4gICAqIFRvIGZpbmQgb3V0IHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uIHRvIGVuYWN0IGEgY2hhbmdlLCByZWFkIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoaXMgZW5kcG9pbnQncyB7QGxpbmsgTW9kaWZ5R3VpbGRNZW1iZXIgfCBwYXJhbWV0ZXJzfS5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgTWVtYmVyIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI21vZGlmeS1ndWlsZC1tZW1iZXJ9XG4gICAqL1xuICBlZGl0TWVtYmVyOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZywgb3B0aW9uczogTW9kaWZ5R3VpbGRNZW1iZXIpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcj4+XG4gIC8qKlxuICogR2V0cyB0aGUgbWVtYmVyIG9iamVjdCBieSB1c2VyIElELlxuICpcblxuICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbWVtYmVyIG9iamVjdCBmb3IuXG4gKiBAcGFyYW0gdXNlcklkIC0gVGhlIElEIG9mIHRoZSB1c2VyIHRvIGdldCB0aGUgbWVtYmVyIG9iamVjdCBmb3IuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZE1lbWJlcldpdGhVc2VyfS5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZ2V0LWd1aWxkLW1lbWJlcn1cbiAqL1xuICBnZXRNZW1iZXI6IChndWlsZElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZW1iZXJXaXRoVXNlcj4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIG1lbWJlcnMgZm9yIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2YgbWVtYmVycyBmb3IuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgbWVtYmVycy5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkTWVtYmVyV2l0aFVzZXJ9IG9iamVjdHMgYXNzb3J0ZWQgYnkgdXNlciBJRC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBHVUlMRF9NRU1CRVJTYCBpbnRlbnQuXG4gICAqXG4gICAqIOKaoO+4jyBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgZW5kcG9pbnQgd2l0aCB2ZXJ5IGxhcmdlIGJvdHMuIEluc3RlYWQsIG9wdCB0byB1c2UgYGZldGNoTWVtYmVycygpYDpcbiAgICogUkVTVCBjb21tdW5pY2F0aW9uIG9ubHkgcGVybWl0cyA1MCByZXF1ZXN0cyB0byBiZSBtYWRlIHBlciBzZWNvbmQsIHdoaWxlIGdhdGV3YXlzIGFsbG93IGZvciB1cCB0byAxMjAgcmVxdWVzdHNcbiAgICogcGVyIG1pbnV0ZSBwZXIgc2hhcmQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvcmF0ZS1saW1pdHMjcmF0ZS1saW1pdHN9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbGlzdC1ndWlsZC1tZW1iZXJzfVxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNyZXF1ZXN0LWd1aWxkLW1lbWJlcnN9XG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9yYXRlLWxpbWl0cyNyYXRlLWxpbWl0c31cbiAgICovXG4gIGdldE1lbWJlcnM6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IExpc3RHdWlsZE1lbWJlcnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PlxuXG4gIC8qKlxuICogS2lja3MgYSBtZW1iZXIgZnJvbSBhIGd1aWxkLlxuICpcblxuICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGtpY2sgdGhlIG1lbWJlciBmcm9tLlxuICogQHBhcmFtIHVzZXJJZCAtIFRoZSB1c2VyIElEIG9mIHRoZSBtZW1iZXIgdG8ga2ljayBmcm9tIHRoZSBndWlsZC5cbiAqXG4gKiBAcmVtYXJrc1xuICogUmVxdWlyZXMgdGhlIGBLSUNLX01FTUJFUlNgIHBlcm1pc3Npb24uXG4gKlxuICogRmlyZXMgYSBfR3VpbGQgTWVtYmVyIFJlbW92ZV8gZ2F0ZXdheSBldmVudC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjcmVtb3ZlLWd1aWxkLW1lbWJlcn1cbiAqL1xuICBraWNrTWVtYmVyOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICogSW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIHBydW5pbmcgaW5hY3RpdmUgbWVtYmVycy5cbiAqXG5cbiAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBwcnVuZSB0aGUgbWVtYmVycyBvZi5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBwcnVuaW5nIG9mIG1lbWJlcnMuXG4gKiBAcmV0dXJucyBBIG51bWJlciBpbmRpY2F0aW5nIGhvdyBtYW55IG1lbWJlcnMgd2VyZSBwcnVuZWQuXG4gKlxuICogQHJlbWFya3NcbiAqIFJlcXVpcmVzIHRoZSBgS0lDS19NRU1CRVJTYCBwZXJtaXNzaW9uLlxuICpcbiAqIOKdlyBSZXF1ZXN0cyB0byB0aGlzIGVuZHBvaW50IHdpbGwgdGltZSBvdXQgZm9yIGxhcmdlIGd1aWxkcy4gVG8gcHJldmVudCB0aGlzIGZyb20gaGFwcGVuaW5nLCBzZXQgdGhlIHtAbGluayBCZWdpbkd1aWxkUHJ1bmUuY29tcHV0ZVBydW5lQ291bnR9IHByb3BlcnR5IG9mIHRoZSB7QGxpbmsgb3B0aW9uc30gb2JqZWN0IHBhcmFtZXRlciB0byBgZmFsc2VgLiBUaGlzIHdpbGwgYmVnaW4gdGhlIHByb2Nlc3Mgb2YgcHJ1bmluZywgYW5kIGltbWVkaWF0ZWx5IHJldHVybiBgdW5kZWZpbmVkYCwgcmF0aGVyIHRoYW4gd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gY29tcGxldGUgYmVmb3JlIHJldHVybmluZyB0aGUgYWN0dWFsIGNvdW50IG9mIG1lbWJlcnMgdGhhdCBoYXZlIGJlZW4ga2lja2VkLlxuICpcbiAqIOKaoO+4jyBCeSBkZWZhdWx0LCB0aGlzIHByb2Nlc3Mgd2lsbCBub3QgcmVtb3ZlIG1lbWJlcnMgd2l0aCBhIHJvbGUuIFRvIGluY2x1ZGUgdGhlIG1lbWJlcnMgd2hvIGhhdmUgYSBfcGFydGljdWxhciBzdWJzZXQgb2Ygcm9sZXNfLCBzcGVjaWZ5IHRoZSByb2xlKHMpIGluIHRoZSB7QGxpbmsgQmVnaW5HdWlsZFBydW5lLmluY2x1ZGVSb2xlcyB8IGluY2x1ZGVSb2xlc30gcHJvcGVydHkgb2YgdGhlIHtAbGluayBvcHRpb25zfSBvYmplY3QgcGFyYW1ldGVyLlxuICpcbiAqIEZpcmVzIGEgX0d1aWxkIE1lbWJlciBSZW1vdmVfIGdhdGV3YXkgZXZlbnQgZm9yIGV2ZXJ5IG1lbWJlciBraWNrZWQuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2JlZ2luLWd1aWxkLXBydW5lfVxuICovXG4gIHBydW5lTWVtYmVyczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQmVnaW5HdWlsZFBydW5lKSA9PiBQcm9taXNlPHsgcHJ1bmVkOiBudW1iZXIgfCBudWxsIH0+XG4gIC8qKlxuICogR2V0cyB0aGUgbGlzdCBvZiBtZW1iZXJzIHdob3NlIHVzZXJuYW1lcyBvciBuaWNrbmFtZXMgc3RhcnQgd2l0aCBhIHByb3ZpZGVkIHN0cmluZy5cbiAqXG5cbiAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBzZWFyY2ggaW4uXG4gKiBAcGFyYW0gcXVlcnkgLSBUaGUgc3RyaW5nIHRvIG1hdGNoIHVzZXJuYW1lcyBvciBuaWNrbmFtZXMgYWdhaW5zdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHNlYXJjaGluZyB0aHJvdWdoIHRoZSBtZW1iZXJzLlxuICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkTWVtYmVyfSBvYmplY3RzIGFzc29ydGVkIGJ5IHVzZXIgSUQuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI3NlYXJjaC1ndWlsZC1tZW1iZXJzfVxuICovXG4gIHNlYXJjaE1lbWJlcnM6IChndWlsZElkOiBCaWdTdHJpbmcsIHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PFNlYXJjaE1lbWJlcnMsICdxdWVyeSc+KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPj5cbiAgLyoqXG4gKiBVbmJhbnMgYSB1c2VyIGZyb20gYSBndWlsZC5cbiAqXG5cbiAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byB1bmJhbiB0aGUgdXNlciBpbi5cbiAqIEBwYXJhbSB1c2VySWQgLSBUaGUgSUQgb2YgdGhlIHVzZXIgdG8gdW5iYW4uXG4gKlxuICogQHJlbWFya3NcbiAqIFJlcXVpcmVzIHRoZSBgQkFOX01FTUJFUlNgIHBlcm1pc3Npb24uXG4gKlxuICogRmlyZXMgYSBfR3VpbGQgQmFuIFJlbW92ZV8gZ2F0ZXdheSBldmVudC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjcmVtb3ZlLWd1aWxkLWJhbn1cbiAqL1xuICB1bmJhbk1lbWJlcjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbn1cblxuZXhwb3J0IHR5cGUgUmVxdWVzdE1ldGhvZHMgPSAnR0VUJyB8ICdQT1NUJyB8ICdERUxFVEUnIHwgJ1BBVENIJyB8ICdQVVQnXG5leHBvcnQgdHlwZSBBcGlWZXJzaW9ucyA9IDkgfCAxMFxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVdlYmhvb2sgZXh0ZW5kcyBXaXRoUmVhc29uIHtcbiAgLyoqIE5hbWUgb2YgdGhlIHdlYmhvb2sgKDEtODAgY2hhcmFjdGVycykgKi9cbiAgbmFtZTogc3RyaW5nXG4gIC8qKiBJbWFnZSB1cmwgZm9yIHRoZSBkZWZhdWx0IHdlYmhvb2sgYXZhdGFyICovXG4gIGF2YXRhcj86IHN0cmluZyB8IG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMge1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBtZXRob2Q6IFJlcXVlc3RNZXRob2RzXG4gIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICB1bmF1dGhvcml6ZWQ/OiBib29sZWFuXG4gIHVybD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RCb2R5IHtcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBib2R5OiBzdHJpbmcgfCBGb3JtRGF0YVxuICBtZXRob2Q6IFJlcXVlc3RNZXRob2RzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VuZFJlcXVlc3RPcHRpb25zIHtcbiAgLyoqIFRoZSB1cmwgdG8gc2VuZCB0aGUgcmVxdWVzdCB0by4gKi9cbiAgdXJsOiBzdHJpbmdcbiAgLyoqIFRoZSBtZXRob2QgdG8gdXNlIHdoZW4gc2VuZGluZyB0aGUgcmVxdWVzdC4gKi9cbiAgbWV0aG9kOiBSZXF1ZXN0TWV0aG9kc1xuICAvKiogVGhlIGJvZHkgdG8gYmUgc2VudCBpbiB0aGUgcmVxdWVzdC4gKi9cbiAgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgLyoqIFRoZSBhbW91bnQgb2YgdGltZXMgdGhpcyByZXF1ZXN0IGhhcyBiZWVuIHJldHJpZWQuICovXG4gIHJldHJ5Q291bnQ6IG51bWJlclxuICAvKiogSGFuZGxlciB0byByZXRyeSBhIHJlcXVlc3Qgc2hvdWxkIGl0IGJlIHJhdGUgbGltaXRlZC4gKi9cbiAgcmV0cnlSZXF1ZXN0PzogKG9wdGlvbnM6IFNlbmRSZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogUmVzb2x2ZSBoYW5kbGVyIHdoZW4gYSByZXF1ZXN0IHN1Y2NlZWRzLiAqL1xuICByZXNvbHZlOiAodmFsdWU6IGFueSB8IFByb21pc2VMaWtlPGFueT4pID0+IHZvaWRcbiAgLyoqIFJlamVjdCBoYW5kbGVyIHdoZW4gYSByZXF1ZXN0IGZhaWxzLiAqL1xuICByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWRcbiAgLyoqIElmIHRoaXMgcmVxdWVzdCBoYXMgYSBidWNrZXQgaWQgd2hpY2ggaXQgZmFsbHMgdW5kZXIgZm9yIHJhdGUgbGltaXQgKi9cbiAgYnVja2V0SWQ/OiBzdHJpbmdcbiAgLyoqIEFkZGl0aW9uYWwgcmVxdWVzdCBvcHRpb25zLCB1c2VkIGZvciB0aGluZ3MgbGlrZSBvdmVycmlkaW5nIGF1dGhvcml6YXRpb24gaGVhZGVyLiAqL1xuICBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55PlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RSYXRlTGltaXRlZFBhdGgge1xuICB1cmw6IHN0cmluZ1xuICByZXNldFRpbWVzdGFtcDogbnVtYmVyXG4gIGJ1Y2tldElkPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va01lc3NhZ2VFZGl0b3Ige1xuICAvKipcbiAgICogRWRpdHMgYSB3ZWJob29rIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZWRpdCB0aGUgbWVzc2FnZSBvZi5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZWRpdCB0aGUgbWVzc2FnZS5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBlZGl0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZWRpdC13ZWJob29rLW1lc3NhZ2V9XG4gICAqL1xuICAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBJbnRlcmFjdGlvbkNhbGxiYWNrRGF0YSAmIHsgdGhyZWFkSWQ/OiBCaWdTdHJpbmcgfSk6IFByb21pc2U8XG4gICAgQ2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+XG4gID5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBvcmlnaW5hbCB3ZWJob29rIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZWRpdCB0aGUgb3JpZ2luYWwgbWVzc2FnZSBvZi5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZWRpdCB0aGUgbWVzc2FnZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRNZXNzYWdlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2VkaXQtd2ViaG9vay1tZXNzYWdlfVxuICAgKi9cbiAgb3JpZ2luYWw6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgb3B0aW9uczogSW50ZXJhY3Rpb25DYWxsYmFja0RhdGEgJiB7IHRocmVhZElkPzogQmlnU3RyaW5nIH0pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxufVxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVUZW1wbGF0ZSB7XG4gIC8qKiBOYW1lIHdoaWNoIHRoZSB0ZW1wbGF0ZSBzaG91bGQgaGF2ZSAqL1xuICBuYW1lOiBzdHJpbmdcbiAgLyoqIERlc2NyaXB0aW9uIG9mIHRoZSB0ZW1wbGF0ZSAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuLyoqIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy90ZW1wbGF0ZSNtb2RpZnktZ3VpbGQtdGVtcGxhdGUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZ5R3VpbGRUZW1wbGF0ZSB7XG4gIC8qKiBOYW1lIG9mIHRoZSB0ZW1wbGF0ZSAoMS0xMDAgY2hhcmFjdGVycykgKi9cbiAgbmFtZT86IHN0cmluZ1xuICAvKiogRGVzY3JpcHRpb24gb2YgdGhlIHRlbXBsYXRlICgwLTEyMCBjaGFyYWN0ZXJzKSAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGxcbn1cbi8qKiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjY3JlYXRlLWd1aWxkLWJhbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVHdWlsZEJhbiBleHRlbmRzIFdpdGhSZWFzb24ge1xuICAvKiogTnVtYmVyIG9mIHNlY29uZHMgdG8gZGVsZXRlIG1lc3NhZ2VzIGZvciwgYmV0d2VlbiAwIGFuZCA2MDQ4MDAgKDcgZGF5cykgKi9cbiAgZGVsZXRlTWVzc2FnZVNlY29uZHM/OiBudW1iZXJcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdEJvdE1lbWJlck9wdGlvbnMgZXh0ZW5kcyBXaXRoUmVhc29uIHtcbiAgbmljaz86IHN0cmluZyB8IG51bGxcbn1cbi8qKiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWd1aWxkLW1lbWJlciAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RpZnlHdWlsZE1lbWJlciB7XG4gIC8qKiBWYWx1ZSB0byBzZXQgdXNlcnMgbmlja25hbWUgdG8uIFJlcXVpcmVzIHRoZSBgTUFOQUdFX05JQ0tOQU1FU2AgcGVybWlzc2lvbiAqL1xuICBuaWNrPzogc3RyaW5nIHwgbnVsbFxuICAvKiogQXJyYXkgb2Ygcm9sZSBpZHMgdGhlIG1lbWJlciBpcyBhc3NpZ25lZC4gUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24gKi9cbiAgcm9sZXM/OiBCaWdTdHJpbmdbXSB8IG51bGxcbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgaXMgbXV0ZWQgaW4gdm9pY2UgY2hhbm5lbHMuIFdpbGwgdGhyb3cgYSA0MDAgaWYgdGhlIHVzZXIgaXMgbm90IGluIGEgdm9pY2UgY2hhbm5lbC4gUmVxdWlyZXMgdGhlIGBNVVRFX01FTUJFUlNgIHBlcm1pc3Npb24gKi9cbiAgbXV0ZT86IGJvb2xlYW4gfCBudWxsXG4gIC8qKiBXaGV0aGVyIHRoZSB1c2VyIGlzIGRlYWZlbmVkIGluIHZvaWNlIGNoYW5uZWxzLiBXaWxsIHRocm93IGEgNDAwIGlmIHRoZSB1c2VyIGlzIG5vdCBpbiBhIHZvaWNlIGNoYW5uZWwuIFJlcXVpcmVzIHRoZSBgTU9WRV9NRU1CRVJTYCBwZXJtaXNzaW9uICovXG4gIGRlYWY/OiBib29sZWFuIHwgbnVsbFxuICAvKiogSWQgb2YgY2hhbm5lbCB0byBtb3ZlIHVzZXIgdG8gKGlmIHRoZXkgYXJlIGNvbm5lY3RlZCB0byB2b2ljZSkuIFJlcXVpcmVzIHRoZSBgTU9WRV9NRU1CRVJTYCBwZXJtaXNzaW9uICovXG4gIGNoYW5uZWxJZD86IEJpZ1N0cmluZyB8IG51bGxcbiAgLyoqIHdoZW4gdGhlIHVzZXIncyB0aW1lb3V0IHdpbGwgZXhwaXJlIGFuZCB0aGUgdXNlciB3aWxsIGJlIGFibGUgdG8gY29tbXVuaWNhdGUgaW4gdGhlIGd1aWxkIGFnYWluICh1cCB0byAyOCBkYXlzIGluIHRoZSBmdXR1cmUpLCBzZXQgdG8gbnVsbCB0byByZW1vdmUgdGltZW91dC4gUmVxdWlyZXMgdGhlIGBNT0RFUkFURV9NRU1CRVJTYCBwZXJtaXNzaW9uICovXG4gIGNvbW11bmljYXRpb25EaXNhYmxlZFVudGlsPzogbnVtYmVyIHwgbnVsbFxufVxuLyoqIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNiZWdpbi1ndWlsZC1wcnVuZSAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWdpbkd1aWxkUHJ1bmUge1xuICAvKiogTnVtYmVyIG9mIGRheXMgdG8gcHJ1bmUgKDEgb3IgbW9yZSksIGRlZmF1bHQ6IDcgKi9cbiAgZGF5cz86IG51bWJlclxuICAvKiogV2hldGhlciAncHJ1bmVkJyBpcyByZXR1cm5lZCwgZGlzY291cmFnZWQgZm9yIGxhcmdlIGd1aWxkcywgZGVmYXVsdDogdHJ1ZSAqL1xuICBjb21wdXRlUHJ1bmVDb3VudD86IGJvb2xlYW5cbiAgLyoqIFJvbGUocykgcm8gaW5jbHVkZSwgZGVmYXVsdDogbm9uZSAqL1xuICBpbmNsdWRlUm9sZXM/OiBzdHJpbmdbXVxufVxuIl0sIm5hbWVzIjpbIkludGVyYWN0aW9uUmVzcG9uc2VUeXBlcyIsImNhbWVsaXplIiwiZGVsYXkiLCJnZXRCb3RJZEZyb21Ub2tlbiIsInVybFRvQmFzZTY0IiwiY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQiLCJRdWV1ZSIsImNyZWF0ZVJlc3RNYW5hZ2VyIiwib3B0aW9ucyIsInJlc3QiLCJ0b2tlbiIsImFwcGxpY2F0aW9uSWQiLCJCaWdJbnQiLCJ2ZXJzaW9uIiwiYmFzZVVybCIsIm1heFJldHJ5Q291bnQiLCJJbmZpbml0eSIsImdsb2JhbGx5UmF0ZUxpbWl0ZWQiLCJwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyIsInF1ZXVlcyIsIk1hcCIsInJhdGVMaW1pdGVkUGF0aHMiLCJpbnZhbGlkQnVja2V0Iiwicm91dGVzIiwid2ViaG9va3MiLCJpZCIsIndlYmhvb2tJZCIsIm1lc3NhZ2UiLCJtZXNzYWdlSWQiLCJ1cmwiLCJ0aHJlYWRJZCIsIm9yaWdpbmFsIiwid2ViaG9vayIsIndhaXQiLCJ1bmRlZmluZWQiLCJ0b1N0cmluZyIsInNlc3Npb25JbmZvIiwiZ2F0ZXdheUJvdCIsImNoYW5uZWxzIiwiZG0iLCJjaGFubmVsSWQiLCJjaGFubmVsIiwiZm9sbG93IiwiZm9ydW0iLCJpbnZpdGVzIiwibWVzc2FnZXMiLCJvdmVyd3JpdGUiLCJvdmVyd3JpdGVJZCIsImNyb3NzcG9zdCIsInN0YWdlcyIsInN0YWdlIiwidGhyZWFkcyIsImFsbCIsImFjdGl2ZSIsImd1aWxkSWQiLCJtZW1iZXJzIiwibWUiLCJ1c2VyIiwidXNlcklkIiwiYXJjaGl2ZWQiLCJwdWJsaWMiLCJiZWZvcmUiLCJEYXRlIiwidG9JU09TdHJpbmciLCJsaW1pdCIsInByaXZhdGUiLCJqb2luZWQiLCJ0eXBpbmciLCJndWlsZHMiLCJhdXRvbW9kIiwicnVsZSIsInJ1bGVJZCIsInJ1bGVzIiwiZW1vamkiLCJlbW9qaUlkIiwiZW1vamlzIiwiZXZlbnRzIiwid2l0aFVzZXJDb3VudCIsImV2ZW50IiwiZXZlbnRJZCIsInVzZXJzIiwid2l0aE1lbWJlciIsImFmdGVyIiwiaW50ZWdyYXRpb24iLCJpbnRlZ3JhdGlvbklkIiwiaW50ZWdyYXRpb25zIiwiaW52aXRlIiwiaW52aXRlQ29kZSIsIndpdGhDb3VudHMiLCJ3aXRoRXhwaXJhdGlvbiIsInNjaGVkdWxlZEV2ZW50SWQiLCJiYW4iLCJib3QiLCJtZW1iZXIiLCJzZWFyY2giLCJxdWVyeSIsImVuY29kZVVSSUNvbXBvbmVudCIsInBydW5lIiwiZGF5cyIsIkFycmF5IiwiaXNBcnJheSIsImluY2x1ZGVSb2xlcyIsImpvaW4iLCJ0ZW1wbGF0ZXMiLCJjb2RlIiwiZ3VpbGQiLCJpbnRlcmFjdGlvbnMiLCJjb21tYW5kcyIsIm9uZSIsImNvbW1hbmRJZCIsIndpdGhMb2NhbGl6YXRpb25zIiwicGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uIiwiY29tbWFuZCIsInJlc3BvbnNlcyIsImNhbGxiYWNrIiwiaW50ZXJhY3Rpb25JZCIsInVzZXJCb3QiLCJvYXV0aDJBcHBsaWNhdGlvbiIsIm5pdHJvU3RpY2tlclBhY2tzIiwiY2hlY2tSYXRlTGltaXRzIiwicmF0ZWxpbWl0ZWQiLCJnZXQiLCJnbG9iYWwiLCJub3ciLCJyZXNldFRpbWVzdGFtcCIsImNyZWF0ZVJlcXVlc3QiLCJoZWFkZXJzIiwidW5hdXRob3JpemVkIiwiYXV0aG9yaXphdGlvbiIsImtleSIsInRvTG93ZXJDYXNlIiwibWV0aG9kIiwiYm9keSIsInJlYXNvbiIsImluY2x1ZGVzIiwiZmlsZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocyIsInZhbHVlIiwiZW50cmllcyIsImRlbGV0ZSIsInNpemUiLCJzZXRUaW1lb3V0IiwicHJvY2Vzc0hlYWRlcnMiLCJyYXRlTGltaXRlZCIsInJlbWFpbmluZyIsInJldHJ5QWZ0ZXIiLCJyZXNldCIsIk51bWJlciIsImJ1Y2tldElkIiwiaGFuZGxlQ29tcGxldGVkUmVxdWVzdCIsImludGVydmFsIiwibWF4Iiwic2V0IiwiZ2xvYmFsUmVzZXQiLCJzZW5kUmVxdWVzdCIsInJlc3BvbnNlIiwiZmV0Y2giLCJzaW1wbGlmeVVybCIsInN0YXR1cyIsInJldHJ5Q291bnQiLCJyZWplY3QiLCJvayIsImVycm9yIiwicmVzZXRBZnRlciIsInJldHJ5UmVxdWVzdCIsInJlc29sdmUiLCJqc29uIiwicm91dGUiLCJyZXBsYWNlIiwibWF0Y2giLCJwIiwic3Vic3RyaW5nIiwiaW5kZXhPZiIsImVuZHNXaXRoIiwicHJvY2Vzc1JlcXVlc3QiLCJyZXF1ZXN0IiwicGFydHMiLCJzcGxpdCIsInNoaWZ0Iiwic3RhcnRzV2l0aCIsInF1ZXVlIiwibWFrZVJlcXVlc3QiLCJidWNrZXRRdWV1ZSIsIlByb21pc2UiLCJwb3N0IiwicGF0Y2giLCJwdXQiLCJkZWxldGVNZXNzYWdlIiwiZWRpdCIsImVkaXRNZXNzYWdlIiwic2VuZCIsInNlbmRNZXNzYWdlIiwicHVibGlzaCIsInB1Ymxpc2hNZXNzYWdlIiwiZ2V0Q2hhbm5lbCIsImNyZWF0ZSIsImNyZWF0ZUNoYW5uZWwiLCJkZWxldGVDaGFubmVsIiwiZWRpdENoYW5uZWwiLCJzb3VyY2VDaGFubmVsSWQiLCJ0YXJnZXRDaGFubmVsSWQiLCJmb2xsb3dBbm5vdW5jZW1lbnQiLCJmb3J1bXMiLCJjcmVhdGVGb3J1bVRocmVhZCIsImVkaXRDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlcyIsImRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUiLCJwb3NpdGlvbnMiLCJjaGFubmVsUG9zaXRpb25zIiwiZWRpdENoYW5uZWxQb3NpdGlvbnMiLCJnZXRDaGFubmVsSW52aXRlcyIsImNyZWF0ZVN0YWdlSW5zdGFuY2UiLCJkZWxldGVTdGFnZUluc3RhbmNlIiwiZGF0YSIsImVkaXRTdGFnZUluc3RhbmNlIiwiZ2V0U3RhZ2VJbnN0YW5jZSIsIndpdGgiLCJzdGFydFRocmVhZFdpdGhNZXNzYWdlIiwid2l0aG91dCIsInN0YXJ0VGhyZWFkV2l0aG91dE1lc3NhZ2UiLCJnZXRBY3RpdmVUaHJlYWRzIiwiZ2V0UHJpdmF0ZUFyY2hpdmVkVGhyZWFkcyIsImdldFByaXZhdGVKb2luZWRBcmNoaXZlZFRocmVhZHMiLCJnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHMiLCJnZXRUaHJlYWRNZW1iZXIiLCJnZXRUaHJlYWRNZW1iZXJzIiwiam9pblRocmVhZCIsImxlYXZlIiwibGVhdmVUaHJlYWQiLCJraWNrIiwicmVtb3ZlVGhyZWFkTWVtYmVyIiwidHJpZ2dlclR5cGluZ0luZGljYXRvciIsImNyZWF0ZUVtb2ppIiwiZGVsZXRlRW1vamkiLCJlZGl0RW1vamkiLCJnZXRFbW9qaSIsImNyZWF0ZUF1dG9tb2RSdWxlIiwiZGVsZXRlQXV0b21vZFJ1bGUiLCJlZGl0QXV0b21vZFJ1bGUiLCJnZXRBdXRvbW9kUnVsZSIsImdldEF1dG9tb2RSdWxlcyIsImdldENoYW5uZWxzIiwiZ2V0RW1vamlzIiwiY3JlYXRlU2NoZWR1bGVkRXZlbnQiLCJkZWxldGVTY2hlZHVsZWRFdmVudCIsImVkaXRTY2hlZHVsZWRFdmVudCIsImdldFNjaGVkdWxlZEV2ZW50IiwiZ2V0U2NoZWR1bGVkRXZlbnRzIiwiZ2V0U2NoZWR1bGVkRXZlbnRVc2VycyIsImdldEludGVncmF0aW9ucyIsImRlbGV0ZUludGVncmF0aW9uIiwiY3JlYXRlSW52aXRlIiwiZGVsZXRlSW52aXRlIiwiZ2V0SW52aXRlIiwibGlzdCIsImdldEludml0ZXMiLCJjcmVhdGVHdWlsZFRlbXBsYXRlIiwidGVtcGxhdGVDb2RlIiwiZGVsZXRlR3VpbGRUZW1wbGF0ZSIsImVkaXRHdWlsZFRlbXBsYXRlIiwiZ2V0R3VpbGRUZW1wbGF0ZSIsImdldEd1aWxkVGVtcGxhdGVzIiwic3luYyIsInN5bmNHdWlsZFRlbXBsYXRlIiwiYmFuTWVtYmVyIiwiZWRpdE1lbWJlciIsImVkaXRTZWxmIiwiZWRpdEJvdE1lbWJlciIsImdldE1lbWJlciIsImdldERtQ2hhbm5lbCIsImtpY2tNZW1iZXIiLCJnZXRNZW1iZXJzIiwicHJ1bmVNZW1iZXJzIiwic2VhcmNoTWVtYmVycyIsInVuYmFuIiwidW5iYW5NZW1iZXIiLCJjcmVhdGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImRlbGV0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZCIsImRlbGV0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZCIsImVkaXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImJlYXJlclRva2VuIiwiZWRpdEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zIiwiZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyIsImdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZCIsImdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyIsImdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbiIsImdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zIiwidXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyIsInVwc2VydEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyIsImZvbGxvd3VwIiwic2VuZEZvbGxvd3VwTWVzc2FnZSIsInNlbmRJbnRlcmFjdGlvblJlc3BvbnNlIiwiZGVsZXRlRm9sbG93dXBNZXNzYWdlIiwiZGVsZXRlT3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiZWRpdEZvbGxvd3VwTWVzc2FnZSIsImVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UiLCJnZXRGb2xsb3d1cE1lc3NhZ2UiLCJnZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UiLCJjcmVhdGVXZWJob29rIiwiZGVsZXRlV2ViaG9vayIsImRlbGV0ZVdlYmhvb2tXaXRoVG9rZW4iLCJlZGl0V2ViaG9vayIsImVkaXRXZWJob29rV2l0aFRva2VuIiwiZXhlY3V0ZSIsImV4ZWN1dGVXZWJob29rIiwiZ2V0Q2hhbm5lbFdlYmhvb2tzIiwiZ2V0R3VpbGRXZWJob29rcyIsImdldFdlYmhvb2tNZXNzYWdlIiwiZ2V0V2ViaG9vayIsImdldFdlYmhvb2tXaXRoVG9rZW4iLCJkZWxldGVXZWJob29rTWVzc2FnZSIsIk9iamVjdCIsImFzc2lnbiIsImVkaXRXZWJob29rTWVzc2FnZSIsImVkaXRPcmlnaW5hbFdlYmhvb2tNZXNzYWdlIiwiYWRkVGhyZWFkTWVtYmVyIiwibmFtZSIsImF2YXRhciIsImVkaXRCb3RQcm9maWxlIiwiYm90QXZhdGFyVVJMIiwidXNlcm5hbWUiLCJ0cmltIiwidHlwZSIsIlVwZGF0ZU1lc3NhZ2UiLCJ0b3BpYyIsIndlYmhvb2tfY2hhbm5lbF9pZCIsImdldEFwcGxpY2F0aW9uSW5mbyIsInJlY2lwaWVudF9pZCIsImdldEdhdGV3YXlCb3QiLCJnZXROaXRyb1N0aWNrZXJQYWNrcyIsImdldFNlc3Npb25JbmZvIiwiZ2V0VXNlciIsIkF1dGhvcml6YXRpb24iXSwibWFwcGluZ3MiOiJBQUFBLE9BQVNBLDRCQUFBQSxDQUF3QixLQUFRLG1CQUFtQixBQUM1RCxRQUFTQyxZQUFBQSxDQUFRLENBQUVDLFNBQUFBLENBQUssQ0FBRUMscUJBQUFBLENBQWlCLENBQUVDLGVBQUFBLENBQVcsS0FBUSxtQkFBbUIsQUFFbkYsUUFBU0MsOEJBQUFBLENBQTBCLEtBQVEsb0JBQW9CLEFBQy9ELFFBQVNDLFNBQUFBLENBQUssS0FBUSxZQUFZLEFBeUVsQyxRQUFPLFNBQVNDLGtCQUFrQkMsQ0FBaUMsQ0FBZSxDQUNoRixJQUFNQyxFQUFvQixDQUN4QkMsTUFBT0YsRUFBUUUsS0FBSyxDQUNwQkMsY0FBZUgsRUFBUUcsYUFBYSxDQUFHQyxPQUFPSixFQUFRRyxhQUFhLEVBQUlSLEVBQWtCSyxFQUFRRSxLQUFLLENBQUMsQ0FDdkdHLFFBQVNMLEVBQVFLLE9BQU8sRUFBSSxHQUM1QkMsUUFBU04sRUFBUU0sT0FBTyxFQUFJLDBCQUM1QkMsY0FBZUMsSUFDZkMsb0JBQXFCLENBQUEsRUFDckJDLDJCQUE0QixDQUFBLEVBQzVCQyxPQUFRLElBQUlDLElBQ1pDLGlCQUFrQixJQUFJRCxJQUN0QkUsY0FBZWpCLEVBQTJCLENBQUMsR0FFM0NrQixPQUFRLENBQ05DLFNBQVUsQ0FDUkMsR0FBSSxBQUFDQyxH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
1
+ /* eslint-disable @typescript-eslint/restrict-template-expressions */ /* eslint-disable no-const-assign */ import { InteractionResponseTypes } from '@discordeno/types';
2
+ import { calculateBits, camelize, camelToSnakeCase, delay, encode, getBotIdFromToken, isGetMessagesAfter, isGetMessagesAround, isGetMessagesBefore, isGetMessagesLimit, logger, processReactionString, urlToBase64 } from '@discordeno/utils';
3
+ import fetch from 'node-fetch';
4
+ import { createInvalidRequestBucket } from './invalidBucket.js';
5
+ import { Queue } from './queue.js';
6
+ // TODO: make dynamic based on package.json file
7
+ const version = '19.0.0-alpha.1';
8
+ export function createRestManager(options) {
9
+ // Falsy token string check
10
+ if (!options.token) throw new Error('You must provide a valid token.');
11
+ const rest = {
12
+ token: options.token,
13
+ applicationId: options.applicationId ? BigInt(options.applicationId) : getBotIdFromToken(options.token),
14
+ version: options.version ?? 10,
15
+ baseUrl: options.proxy?.baseUrl ?? 'https://discord.com/api',
16
+ maxRetryCount: Infinity,
17
+ globallyRateLimited: false,
18
+ processingRateLimitedPaths: false,
19
+ deleteQueueDelay: 60000,
20
+ queues: new Map(),
21
+ rateLimitedPaths: new Map(),
22
+ invalidBucket: createInvalidRequestBucket({}),
23
+ authorization: options.proxy?.authorization,
24
+ routes: {
25
+ webhooks: {
26
+ id: (webhookId)=>{
27
+ return `/webhooks/${webhookId}`;
28
+ },
29
+ message: (webhookId, token, messageId, options)=>{
30
+ let url = `/webhooks/${webhookId}/${token}/messages/${messageId}?`;
31
+ if (options) {
32
+ if (options.threadId) url += `thread_id=${options.threadId}`;
33
+ }
34
+ return url;
35
+ },
36
+ original: (webhookId, token, options)=>{
37
+ let url = `/webhooks/${webhookId}/${token}/messages/@original?`;
38
+ if (options) {
39
+ if (options.threadId) url += `thread_id=${options.threadId}`;
40
+ }
41
+ return url;
42
+ },
43
+ webhook: (webhookId, token, options)=>{
44
+ let url = `/webhooks/${webhookId}/${token}?`;
45
+ if (options) {
46
+ if (options?.wait !== undefined) url += `wait=${options.wait.toString()}`;
47
+ if (options.threadId) url += `thread_id=${options.threadId}`;
48
+ }
49
+ return url;
50
+ }
51
+ },
52
+ // Miscellaneous Endpoints
53
+ sessionInfo: ()=>rest.routes.gatewayBot(),
54
+ // Channel Endpoints
55
+ channels: {
56
+ bulk: (channelId)=>{
57
+ return `/channels/${channelId}/messages/bulk-delete`;
58
+ },
59
+ dm: ()=>{
60
+ return '/users/@me/channels';
61
+ },
62
+ pin: (channelId, messageId)=>{
63
+ return `/channels/${channelId}/pins/${messageId}`;
64
+ },
65
+ pins: (channelId)=>{
66
+ return `/channels/${channelId}/pins`;
67
+ },
68
+ reactions: {
69
+ bot: (channelId, messageId, emoji)=>{
70
+ return `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}/@me`;
71
+ },
72
+ user: (channelId, messageId, emoji, userId)=>{
73
+ return `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}/${userId}`;
74
+ },
75
+ all: (channelId, messageId)=>{
76
+ return `/channels/${channelId}/messages/${messageId}/reactions`;
77
+ },
78
+ emoji: (channelId, messageId, emoji, options)=>{
79
+ let url = `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}?`;
80
+ if (options) {
81
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
82
+ if (options.after) url += `after=${options.after}`;
83
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
84
+ if (options.limit) url += `&limit=${options.limit}`;
85
+ }
86
+ return url;
87
+ },
88
+ message: (channelId, messageId, emoji, options)=>{
89
+ let url = `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}?`;
90
+ if (options) {
91
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
92
+ if (options.after) url += `after=${options.after}`;
93
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
94
+ if (options.limit) url += `&limit=${options.limit}`;
95
+ }
96
+ return url;
97
+ }
98
+ },
99
+ webhooks: (channelId)=>{
100
+ return `/channels/${channelId}/webhooks`;
101
+ },
102
+ channel: (channelId)=>{
103
+ return `/channels/${channelId}`;
104
+ },
105
+ follow: (channelId)=>{
106
+ return `/channels/${channelId}/followers`;
107
+ },
108
+ forum: (channelId)=>{
109
+ return `/channels/${channelId}/threads?has_message=true`;
110
+ },
111
+ invites: (channelId)=>{
112
+ return `/channels/${channelId}/invites`;
113
+ },
114
+ message: (channelId, messageId)=>{
115
+ return `/channels/${channelId}/messages/${messageId}`;
116
+ },
117
+ messages: (channelId, options)=>{
118
+ let url = `/channels/${channelId}/messages?`;
119
+ if (options) {
120
+ if (isGetMessagesAfter(options) && options.after) {
121
+ url += `after=${options.after}`;
122
+ }
123
+ if (isGetMessagesBefore(options) && options.before) {
124
+ url += `&before=${options.before}`;
125
+ }
126
+ if (isGetMessagesAround(options) && options.around) {
127
+ url += `&around=${options.around}`;
128
+ }
129
+ if (isGetMessagesLimit(options) && options.limit) {
130
+ url += `&limit=${options.limit}`;
131
+ }
132
+ }
133
+ return url;
134
+ },
135
+ overwrite: (channelId, overwriteId)=>{
136
+ return `/channels/${channelId}/permissions/${overwriteId}`;
137
+ },
138
+ crosspost: (channelId, messageId)=>{
139
+ return `/channels/${channelId}/messages/${messageId}/crosspost`;
140
+ },
141
+ stages: ()=>{
142
+ return '/stage-instances';
143
+ },
144
+ stage: (channelId)=>{
145
+ return `/stage-instances/${channelId}`;
146
+ },
147
+ // Thread Endpoints
148
+ threads: {
149
+ message: (channelId, messageId)=>{
150
+ return `/channels/${channelId}/messages/${messageId}/threads`;
151
+ },
152
+ all: (channelId)=>{
153
+ return `/channels/${channelId}/threads`;
154
+ },
155
+ active: (guildId)=>{
156
+ return `/guilds/${guildId}/threads/active`;
157
+ },
158
+ members: (channelId)=>{
159
+ return `/channels/${channelId}/thread-members`;
160
+ },
161
+ me: (channelId)=>{
162
+ return `/channels/${channelId}/thread-members/@me`;
163
+ },
164
+ user: (channelId, userId)=>{
165
+ return `/channels/${channelId}/thread-members/${userId}`;
166
+ },
167
+ archived: (channelId)=>{
168
+ return `/channels/${channelId}/threads/archived`;
169
+ },
170
+ public: (channelId, options)=>{
171
+ let url = `/channels/${channelId}/threads/archived/public?`;
172
+ if (options) {
173
+ if (options.before) {
174
+ url += `before=${new Date(options.before).toISOString()}`;
175
+ }
176
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
177
+ if (options.limit) url += `&limit=${options.limit}`;
178
+ }
179
+ return url;
180
+ },
181
+ private: (channelId, options)=>{
182
+ let url = `/channels/${channelId}/threads/archived/private?`;
183
+ if (options) {
184
+ if (options.before) {
185
+ url += `before=${new Date(options.before).toISOString()}`;
186
+ }
187
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
188
+ if (options.limit) url += `&limit=${options.limit}`;
189
+ }
190
+ return url;
191
+ },
192
+ joined: (channelId, options)=>{
193
+ let url = `/channels/${channelId}/users/@me/threads/archived/private?`;
194
+ if (options) {
195
+ if (options.before) {
196
+ url += `before=${new Date(options.before).toISOString()}`;
197
+ }
198
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
199
+ if (options.limit) url += `&limit=${options.limit}`;
200
+ }
201
+ return url;
202
+ }
203
+ },
204
+ typing: (channelId)=>{
205
+ return `/channels/${channelId}/typing`;
206
+ }
207
+ },
208
+ // Guild Endpoints
209
+ guilds: {
210
+ all: ()=>{
211
+ return '/guilds';
212
+ },
213
+ auditlogs: (guildId, options)=>{
214
+ let url = `/guilds/${guildId}/audit-logs?`;
215
+ if (options) {
216
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
217
+ if (options.actionType) url += `action_type=${options.actionType}`;
218
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
219
+ if (options.before) url += `&before=${options.before}`;
220
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
221
+ if (options.after) url += `&after=${options.after}`;
222
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
223
+ if (options.limit) url += `&limit=${options.limit}`;
224
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
225
+ if (options.userId) url += `&user_id=${options.userId}`;
226
+ }
227
+ return url;
228
+ },
229
+ automod: {
230
+ rule: (guildId, ruleId)=>{
231
+ return `/guilds/${guildId}/auto-moderation/rules/${ruleId}`;
232
+ },
233
+ rules: (guildId)=>{
234
+ return `/guilds/${guildId}/auto-moderation/rules`;
235
+ }
236
+ },
237
+ channels: (guildId)=>{
238
+ return `/guilds/${guildId}/channels`;
239
+ },
240
+ emoji: (guildId, emojiId)=>{
241
+ return `/guilds/${guildId}/emojis/${emojiId}`;
242
+ },
243
+ emojis: (guildId)=>{
244
+ return `/guilds/${guildId}/emojis`;
245
+ },
246
+ events: {
247
+ events: (guildId, withUserCount)=>{
248
+ let url = `/guilds/${guildId}/scheduled-events?`;
249
+ if (withUserCount !== undefined) {
250
+ url += `with_user_count=${withUserCount.toString()}`;
251
+ }
252
+ return url;
253
+ },
254
+ event: (guildId, eventId, withUserCount)=>{
255
+ let url = `/guilds/${guildId}/scheduled-events/${eventId}`;
256
+ if (withUserCount !== undefined) {
257
+ url += `with_user_count=${withUserCount.toString()}`;
258
+ }
259
+ return url;
260
+ },
261
+ users: (guildId, eventId, options)=>{
262
+ let url = `/guilds/${guildId}/scheduled-events/${eventId}/users?`;
263
+ if (options) {
264
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
265
+ if (options.limit !== undefined) url += `limit=${options.limit}`;
266
+ if (options.withMember !== undefined) {
267
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
268
+ url += `&with_member=${options.withMember.toString()}`;
269
+ }
270
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
271
+ if (options.after !== undefined) url += `&after=${options.after}`;
272
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
273
+ if (options.before !== undefined) url += `&before=${options.before}`;
274
+ }
275
+ return url;
276
+ }
277
+ },
278
+ guild (guildId, withCounts) {
279
+ let url = `/guilds/${guildId}?`;
280
+ if (withCounts !== undefined) {
281
+ url += `with_counts=${withCounts.toString()}`;
282
+ }
283
+ return url;
284
+ },
285
+ integration (guildId, integrationId) {
286
+ return `/guilds/${guildId}/integrations/${integrationId}`;
287
+ },
288
+ integrations: (guildId)=>{
289
+ return `/guilds/${guildId}/integrations?include_applications=true`;
290
+ },
291
+ invite (inviteCode, options) {
292
+ let url = `/invites/${inviteCode}?`;
293
+ if (options) {
294
+ if (options.withCounts !== undefined) {
295
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
296
+ url += `with_counts=${options.withCounts.toString()}`;
297
+ }
298
+ if (options.withExpiration !== undefined) {
299
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
300
+ url += `&with_expiration=${options.withExpiration.toString()}`;
301
+ }
302
+ if (options.scheduledEventId) {
303
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
304
+ url += `&guild_scheduled_event_id=${options.scheduledEventId}`;
305
+ }
306
+ }
307
+ return url;
308
+ },
309
+ invites: (guildId)=>{
310
+ return `/guilds/${guildId}/invites`;
311
+ },
312
+ leave: (guildId)=>{
313
+ return `/users/@me/guilds/${guildId}`;
314
+ },
315
+ members: {
316
+ ban: (guildId, userId)=>{
317
+ return `/guilds/${guildId}/bans/${userId}`;
318
+ },
319
+ bans: (guildId, options)=>{
320
+ let url = `/guilds/${guildId}/bans?`;
321
+ if (options) {
322
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
323
+ if (options.limit) url += `limit=${options.limit}`;
324
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
325
+ if (options.after) url += `&after=${options.after}`;
326
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
327
+ if (options.before) url += `&before=${options.before}`;
328
+ }
329
+ return url;
330
+ },
331
+ bot: (guildId)=>{
332
+ return `/guilds/${guildId}/members/@me`;
333
+ },
334
+ member: (guildId, userId)=>{
335
+ return `/guilds/${guildId}/members/${userId}`;
336
+ },
337
+ members: (guildId, options)=>{
338
+ let url = `/guilds/${guildId}/members?`;
339
+ if (options !== undefined) {
340
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
341
+ if (options.limit) url += `limit=${options.limit}`;
342
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
343
+ if (options.after) url += `&after=${options.after}`;
344
+ }
345
+ return url;
346
+ },
347
+ search: (guildId, query, options)=>{
348
+ let url = `/guilds/${guildId}/members/search?query=${encodeURIComponent(query)}`;
349
+ if (options) {
350
+ if (options.limit !== undefined) url += `&limit=${options.limit}`;
351
+ }
352
+ return url;
353
+ },
354
+ prune: (guildId, options)=>{
355
+ let url = `/guilds/${guildId}/prune?`;
356
+ if (options) {
357
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
358
+ if (options.days) url += `days=${options.days}`;
359
+ if (Array.isArray(options.includeRoles)) {
360
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
361
+ url += `&include_roles=${options.includeRoles.join(',')}`;
362
+ } else if (options.includeRoles) {
363
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
364
+ url += `&include_roles=${options.includeRoles}`;
365
+ }
366
+ }
367
+ return url;
368
+ }
369
+ },
370
+ mfa: (guildId)=>`/guilds/${guildId}/mfa`,
371
+ preview: (guildId)=>{
372
+ return `/guilds/${guildId}/preview`;
373
+ },
374
+ prune: (guildId, options)=>{
375
+ let url = `/guilds/${guildId}/prune?`;
376
+ if (options) {
377
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
378
+ if (options.days) url += `days=${options.days}`;
379
+ if (Array.isArray(options.includeRoles)) {
380
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
381
+ url += `&include_roles=${options.includeRoles.join(',')}`;
382
+ } else if (options.includeRoles) {
383
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
384
+ url += `&include_roles=${options.includeRoles}`;
385
+ }
386
+ }
387
+ return url;
388
+ },
389
+ roles: {
390
+ one: (guildId, roleId)=>{
391
+ return `/guilds/${guildId}/roles/${roleId}`;
392
+ },
393
+ all: (guildId)=>{
394
+ return `/guilds/${guildId}/roles`;
395
+ },
396
+ member: (guildId, memberId, roleId)=>{
397
+ return `/guilds/${guildId}/members/${memberId}/roles/${roleId}`;
398
+ }
399
+ },
400
+ stickers: (guildId)=>{
401
+ return `/guilds/${guildId}/stickers`;
402
+ },
403
+ sticker: (guildId, stickerId)=>{
404
+ return `/guilds/${guildId}/stickers/${stickerId}`;
405
+ },
406
+ voice: (guildId, userId)=>{
407
+ return `/guilds/${guildId}/voice-states/${userId ?? '@me'}`;
408
+ },
409
+ templates: {
410
+ code: (code)=>{
411
+ return `/guilds/templates/${code}`;
412
+ },
413
+ guild: (guildId, code)=>{
414
+ return `/guilds/${guildId}/templates/${code}`;
415
+ },
416
+ all: (guildId)=>{
417
+ return `/guilds/${guildId}/templates`;
418
+ }
419
+ },
420
+ vanity: (guildId)=>{
421
+ return `/guilds/${guildId}/vanity-url`;
422
+ },
423
+ regions: (guildId)=>{
424
+ return `/guilds/${guildId}/regions`;
425
+ },
426
+ webhooks: (guildId)=>{
427
+ return `/guilds/${guildId}/webhooks`;
428
+ },
429
+ welcome: (guildId)=>{
430
+ return `/guilds/${guildId}/welcome-screen`;
431
+ },
432
+ widget: (guildId)=>{
433
+ return `/guilds/${guildId}/widget`;
434
+ },
435
+ widgetJson: (guildId)=>{
436
+ return `/guilds/${guildId}/widget.json`;
437
+ }
438
+ },
439
+ sticker: (stickerId)=>{
440
+ return `/stickers/${stickerId}`;
441
+ },
442
+ regions: ()=>{
443
+ return '/voice/regions';
444
+ },
445
+ // Interaction Endpoints
446
+ interactions: {
447
+ commands: {
448
+ // Application Endpoints
449
+ commands: (applicationId)=>{
450
+ return `/applications/${applicationId}/commands`;
451
+ },
452
+ guilds: {
453
+ all (applicationId, guildId) {
454
+ return `/applications/${applicationId}/guilds/${guildId}/commands`;
455
+ },
456
+ one (applicationId, guildId, commandId, withLocalizations) {
457
+ let url = `/applications/${applicationId}/guilds/${guildId}/commands/${commandId}?`;
458
+ if (withLocalizations !== undefined) {
459
+ url += `with_localizations=${withLocalizations.toString()}`;
460
+ }
461
+ return url;
462
+ }
463
+ },
464
+ permissions: (applicationId, guildId)=>{
465
+ return `/applications/${applicationId}/guilds/${guildId}/commands/permissions`;
466
+ },
467
+ permission: (applicationId, guildId, commandId)=>{
468
+ return `/applications/${applicationId}/guilds/${guildId}/commands/${commandId}/permissions`;
469
+ },
470
+ command: (applicationId, commandId, withLocalizations)=>{
471
+ let url = `/applications/${applicationId}/commands/${commandId}?`;
472
+ if (withLocalizations !== undefined) {
473
+ url += `withLocalizations=${withLocalizations.toString()}`;
474
+ }
475
+ return url;
476
+ }
477
+ },
478
+ responses: {
479
+ // Interaction Endpoints
480
+ callback: (interactionId, token)=>{
481
+ return `/interactions/${interactionId}/${token}/callback`;
482
+ },
483
+ original: (interactionId, token)=>{
484
+ return `/webhooks/${interactionId}/${token}/messages/@original`;
485
+ },
486
+ message: (applicationId, token, messageId)=>{
487
+ return `/webhooks/${applicationId}/${token}/messages/${messageId}`;
488
+ }
489
+ }
490
+ },
491
+ // User endpoints
492
+ user (userId) {
493
+ return `/users/${userId}`;
494
+ },
495
+ userBot () {
496
+ return '/users/@me';
497
+ },
498
+ oauth2Application () {
499
+ return 'oauth2/applications/@me';
500
+ },
501
+ gatewayBot () {
502
+ return '/gateway/bot';
503
+ },
504
+ nitroStickerPacks () {
505
+ return '/sticker-packs';
506
+ }
507
+ },
508
+ checkRateLimits (url) {
509
+ const ratelimited = rest.rateLimitedPaths.get(url);
510
+ const global = rest.rateLimitedPaths.get('global');
511
+ const now = Date.now();
512
+ if (ratelimited && now < ratelimited.resetTimestamp) {
513
+ return ratelimited.resetTimestamp - now;
514
+ }
515
+ if (global && now < global.resetTimestamp) {
516
+ return global.resetTimestamp - now;
517
+ }
518
+ return false;
519
+ },
520
+ changeToDiscordFormat (obj) {
521
+ if (obj === null) return null;
522
+ if (typeof obj === 'object') {
523
+ if (Array.isArray(obj)) {
524
+ return obj.map((item)=>rest.changeToDiscordFormat(item));
525
+ }
526
+ const newObj = {};
527
+ for (const key of Object.keys(obj)){
528
+ // Keys that dont require snake casing
529
+ if ([
530
+ 'permissions',
531
+ 'allow',
532
+ 'deny'
533
+ ].includes(key)) {
534
+ newObj[key] = calculateBits(obj[key]);
535
+ continue;
536
+ }
537
+ if (key === 'defaultMemberPermissions') {
538
+ newObj.default_member_permissions = calculateBits(obj[key]);
539
+ continue;
540
+ }
541
+ newObj[camelToSnakeCase(key)] = rest.changeToDiscordFormat(obj[key]);
542
+ }
543
+ return newObj;
544
+ }
545
+ if (typeof obj === 'bigint') return obj.toString();
546
+ return obj;
547
+ },
548
+ createRequestBody (method, options) {
549
+ const headers = {
550
+ 'user-agent': `DiscordBot (https://github.com/discordeno/discordeno, v${version})`
551
+ };
552
+ if (!options?.unauthorized) headers.authorization = `Bot ${rest.token}`;
553
+ // IF A REASON IS PROVIDED ENCODE IT IN HEADERS
554
+ if (options?.reason !== undefined) {
555
+ headers['x-audit-log-reason'] = encodeURIComponent(options?.reason);
556
+ }
557
+ let body;
558
+ // TODO: check if we need to add specific check for GET method
559
+ // Since GET does not allow bodies
560
+ // Have to check for attachments first, since body then has to be send in a different way.
561
+ if (options?.files !== undefined) {
562
+ const form = new FormData();
563
+ for(let i = 0; i < options.files.length; ++i){
564
+ form.append(`file${i}`, options.files[i].blob, options.files[i].name);
565
+ }
566
+ form.append('payload_json', JSON.stringify({
567
+ ...options.body,
568
+ files: undefined
569
+ }));
570
+ body = form;
571
+ // No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
572
+ } else if (options?.body !== undefined) {
573
+ if (options.body instanceof FormData) {
574
+ body = options.body;
575
+ // No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
576
+ } else {
577
+ body = JSON.stringify(rest.changeToDiscordFormat(options.body));
578
+ headers['content-type'] = `application/json`;
579
+ }
580
+ }
581
+ // SOMETIMES SPECIAL HEADERS (E.G. CUSTOM AUTHORIZATION) NEED TO BE USED
582
+ if (options?.headers) {
583
+ Object.assign(headers, options.headers);
584
+ }
585
+ return {
586
+ body,
587
+ headers,
588
+ method
589
+ };
590
+ },
591
+ processRateLimitedPaths () {
592
+ const now = Date.now();
593
+ for (const [key, value] of rest.rateLimitedPaths.entries()){
594
+ // rest.debug(
595
+ // `[REST - processRateLimitedPaths] Running for of loop. ${
596
+ // value.resetTimestamp - now
597
+ // }`
598
+ // )
599
+ // If the time has not reached cancel
600
+ if (value.resetTimestamp > now) continue;
601
+ // Rate limit is over, delete the rate limiter
602
+ rest.rateLimitedPaths.delete(key);
603
+ // If it was global, also mark the global value as false
604
+ if (key === 'global') rest.globallyRateLimited = false;
605
+ }
606
+ // ALL PATHS ARE CLEARED CAN CANCEL OUT!
607
+ if (rest.rateLimitedPaths.size === 0) {
608
+ rest.processingRateLimitedPaths = false;
609
+ } else {
610
+ rest.processingRateLimitedPaths = true;
611
+ // RECHECK IN 1 SECOND
612
+ setTimeout(()=>{
613
+ // rest.debug('[REST - processRateLimitedPaths] Running setTimeout.')
614
+ rest.processRateLimitedPaths();
615
+ }, 1000);
616
+ }
617
+ },
618
+ /** Processes the rate limit headers and determines if it needs to be rate limited and returns the bucket id if available */ processHeaders (url, headers) {
619
+ let rateLimited = false;
620
+ // GET ALL NECESSARY HEADERS
621
+ const remaining = headers.get('x-ratelimit-remaining');
622
+ const retryAfter = headers.get('x-ratelimit-reset-after');
623
+ const reset = Date.now() + Number(retryAfter) * 1000;
624
+ const global = headers.get('x-ratelimit-global');
625
+ // undefined override null needed for typings
626
+ const bucketId = headers.get('x-ratelimit-bucket') ?? undefined;
627
+ const limit = headers.get('x-ratelimit-limit');
628
+ rest.queues.get(url)?.handleCompletedRequest({
629
+ remaining: remaining ? Number(remaining) : undefined,
630
+ interval: retryAfter ? Number(retryAfter) * 1000 : undefined,
631
+ max: limit ? Number(limit) : undefined
632
+ });
633
+ // IF THERE IS NO REMAINING RATE LIMIT, MARK IT AS RATE LIMITED
634
+ if (remaining === '0') {
635
+ rateLimited = true;
636
+ // SAVE THE URL AS LIMITED, IMPORTANT FOR NEW REQUESTS BY USER WITHOUT BUCKET
637
+ rest.rateLimitedPaths.set(url, {
638
+ url,
639
+ resetTimestamp: reset,
640
+ bucketId
641
+ });
642
+ // SAVE THE BUCKET AS LIMITED SINCE DIFFERENT URLS MAY SHARE A BUCKET
643
+ if (bucketId) {
644
+ rest.rateLimitedPaths.set(bucketId, {
645
+ url,
646
+ resetTimestamp: reset,
647
+ bucketId
648
+ });
649
+ }
650
+ }
651
+ // IF THERE IS NO REMAINING GLOBAL LIMIT, MARK IT RATE LIMITED GLOBALLY
652
+ if (global) {
653
+ const retryAfter = headers.get('retry-after');
654
+ const globalReset = Date.now() + Number(retryAfter) * 1000;
655
+ // rest.debug(
656
+ // `[REST = Globally Rate Limited] URL: ${url} | Global Rest: ${globalReset}`
657
+ // )
658
+ rest.globallyRateLimited = true;
659
+ rateLimited = true;
660
+ setTimeout(()=>{
661
+ rest.globallyRateLimited = false;
662
+ }, globalReset);
663
+ rest.rateLimitedPaths.set('global', {
664
+ url: 'global',
665
+ resetTimestamp: globalReset,
666
+ bucketId
667
+ });
668
+ if (bucketId) {
669
+ rest.rateLimitedPaths.set(bucketId, {
670
+ url: 'global',
671
+ resetTimestamp: globalReset,
672
+ bucketId
673
+ });
674
+ }
675
+ }
676
+ if (rateLimited && !rest.processingRateLimitedPaths) {
677
+ rest.processRateLimitedPaths();
678
+ }
679
+ return rateLimited ? bucketId : undefined;
680
+ },
681
+ async sendRequest (options) {
682
+ const url = options.url.startsWith('https://') ? options.url : `${rest.baseUrl}/v${rest.version}${options.url}`;
683
+ const payload = rest.createRequestBody(options.method, options.requestBodyOptions);
684
+ logger.debug(`sending request to ${url}`, 'with payload:', {
685
+ ...payload,
686
+ headers: {
687
+ ...payload.headers,
688
+ authorization: 'Bot tokenhere'
689
+ }
690
+ });
691
+ const response = await fetch(url, payload);
692
+ logger.debug(`request fetched from ${url} with status ${response.status} & ${response.statusText}`);
693
+ // Set the bucket id if it was available on the headers
694
+ const bucketId = rest.processHeaders(rest.simplifyUrl(options.url, options.method), response.headers);
695
+ if (bucketId) options.bucketId = bucketId;
696
+ if (response.status < 200 || response.status >= 400) {
697
+ logger.debug(`Request to ${url} failed.`);
698
+ if (response.status === 429) {
699
+ logger.debug(`Request to ${url} was ratelimited.`);
700
+ // Too many attempts, get rid of request from queue.
701
+ if (options.retryCount++ >= rest.maxRetryCount) {
702
+ logger.debug(`Request to ${url} exceeded the maximum allowed retries.`, 'with payload:', payload);
703
+ // rest.debug(`[REST - RetriesMaxed] ${JSON.stringify(options)}`)
704
+ // Remove item from queue to prevent retry
705
+ options.reject({
706
+ ok: false,
707
+ status: response.status,
708
+ error: 'The options was rate limited and it maxed out the retries limit.'
709
+ });
710
+ return;
711
+ }
712
+ // Rate limited, add back to queue
713
+ rest.invalidBucket.handleCompletedRequest(response.status, response.headers.get('X-RateLimit-Scope') === 'shared');
714
+ const resetAfter = response.headers.get('x-ratelimit-reset-after');
715
+ if (resetAfter) await delay(Number(resetAfter) * 1000);
716
+ // process the response to prevent mem leak
717
+ await response.json();
718
+ return await options.retryRequest?.(options);
719
+ }
720
+ options.reject({
721
+ ok: false,
722
+ status: response.status,
723
+ body: JSON.stringify(await response.json())
724
+ });
725
+ return;
726
+ }
727
+ const is204 = response.status === 204;
728
+ const json = is204 ? undefined : await response.json();
729
+ // Discord sometimes sends no response with 204 code
730
+ options.resolve({
731
+ ok: true,
732
+ status: response.status,
733
+ body: JSON.stringify(json)
734
+ });
735
+ },
736
+ simplifyUrl (url, method) {
737
+ const parts = url.split('/');
738
+ const secondLastPart = parts[parts.length - 2];
739
+ if (secondLastPart === 'channels' || secondLastPart === 'guilds') {
740
+ return url;
741
+ }
742
+ if (secondLastPart === 'reactions' || parts[parts.length - 1] === '@me') {
743
+ parts.splice(-2);
744
+ parts.push('reactions');
745
+ } else {
746
+ parts.splice(-1);
747
+ parts.push('x');
748
+ }
749
+ if (parts[parts.length - 3] === 'reactions') {
750
+ parts.splice(-2);
751
+ }
752
+ if (method === 'DELETE' && secondLastPart === 'messages') {
753
+ return `D${parts.join('/')}`;
754
+ }
755
+ return parts.join('/');
756
+ },
757
+ processRequest (request) {
758
+ const route = request.url.substring(request.url.indexOf('api/'));
759
+ const parts = route.split('/');
760
+ // Remove the api/
761
+ parts.shift();
762
+ // Removes the /v#/
763
+ if (parts[0]?.startsWith('v')) parts.shift();
764
+ // Set the full url to discord api in case it was recieved in a proxy rest
765
+ request.url = `${rest.baseUrl}/v${rest.version}/${parts.join('/')}`;
766
+ const url = rest.simplifyUrl(request.url, request.method);
767
+ const queue = rest.queues.get(url);
768
+ if (queue !== undefined) {
769
+ queue.makeRequest(request);
770
+ } else {
771
+ // CREATES A NEW QUEUE
772
+ const bucketQueue = new Queue(rest, {
773
+ url,
774
+ deleteQueueDelay: rest.deleteQueueDelay
775
+ });
776
+ // Add request to queue
777
+ bucketQueue.makeRequest(request);
778
+ // Save queue
779
+ rest.queues.set(url, bucketQueue);
780
+ }
781
+ },
782
+ async makeRequest (method, url, options) {
783
+ if (!rest.baseUrl.startsWith('https://discord.com') && url[0] === '/') {
784
+ // Special handling for sending blobs across http to proxy
785
+ // TODO: fix this hacky handling
786
+ if (!(options?.body instanceof FormData) && !Array.isArray(options?.body) && options?.body?.file) {
787
+ if (!Array.isArray(options.body.file)) {
788
+ options.body.file = [
789
+ options.body.file
790
+ ];
791
+ }
792
+ // convert blobs to string before sending to proxy
793
+ options.body.file = await Promise.all(options.body.file.map(async (f)=>{
794
+ const url = encode(await f.blob.arrayBuffer());
795
+ return {
796
+ name: f.name,
797
+ blob: `data:${f.blob.type};base64,${url}`
798
+ };
799
+ }));
800
+ }
801
+ const headers = {
802
+ Authorization: rest.authorization ?? ''
803
+ };
804
+ if (options?.body) {
805
+ headers['Content-Type'] = 'application/json';
806
+ }
807
+ const result = await fetch(`${rest.baseUrl}${url}`, {
808
+ body: options?.body ? JSON.stringify(options.body) : undefined,
809
+ headers,
810
+ method
811
+ });
812
+ if (!result.ok) {
813
+ const err = await result.json().catch(()=>{});
814
+ // Legacy Handling to not break old code or when body is missing
815
+ if (!err?.body) throw new Error(`Error: ${err.message ?? result.statusText}`);
816
+ throw new Error(JSON.stringify(err));
817
+ }
818
+ return result.status !== 204 ? await result.json() : undefined;
819
+ }
820
+ return await new Promise((resolve, reject)=>{
821
+ const payload = {
822
+ url,
823
+ method,
824
+ requestBodyOptions: options,
825
+ retryCount: 0,
826
+ retryRequest: async function(payload) {
827
+ rest.processRequest(payload);
828
+ },
829
+ resolve: (data)=>{
830
+ resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined);
831
+ },
832
+ reject
833
+ };
834
+ rest.processRequest(payload);
835
+ });
836
+ },
837
+ async get (url, options) {
838
+ return camelize(await rest.makeRequest('GET', url, options));
839
+ },
840
+ async post (url, options) {
841
+ return camelize(await rest.makeRequest('POST', url, options));
842
+ },
843
+ async delete (url, options) {
844
+ camelize(await rest.makeRequest('DELETE', url, options));
845
+ },
846
+ async patch (url, options) {
847
+ return camelize(await rest.makeRequest('PATCH', url, options));
848
+ },
849
+ async put (url, options) {
850
+ return camelize(await rest.makeRequest('PUT', url, options));
851
+ },
852
+ async addReaction (channelId, messageId, reaction) {
853
+ reaction = processReactionString(reaction);
854
+ await rest.put(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
855
+ },
856
+ async addReactions (channelId, messageId, reactions, ordered = false) {
857
+ if (!ordered) {
858
+ await Promise.all(reactions.map(async (reaction)=>{
859
+ await rest.addReaction(channelId, messageId, reaction);
860
+ }));
861
+ return;
862
+ }
863
+ for (const reaction of reactions){
864
+ await rest.addReaction(channelId, messageId, reaction);
865
+ }
866
+ },
867
+ async addRole (guildId, userId, roleId, reason) {
868
+ await rest.put(rest.routes.guilds.roles.member(guildId, userId, roleId), {
869
+ reason
870
+ });
871
+ },
872
+ async addThreadMember (channelId, userId) {
873
+ await rest.put(rest.routes.channels.threads.user(channelId, userId));
874
+ },
875
+ async createAutomodRule (guildId, body) {
876
+ return await rest.post(rest.routes.guilds.automod.rules(guildId), {
877
+ body
878
+ });
879
+ },
880
+ async createChannel (guildId, body) {
881
+ return await rest.post(rest.routes.guilds.channels(guildId), {
882
+ body
883
+ });
884
+ },
885
+ async createEmoji (guildId, body) {
886
+ return await rest.post(rest.routes.guilds.emojis(guildId), {
887
+ body
888
+ });
889
+ },
890
+ async createGlobalApplicationCommand (body) {
891
+ return await rest.post(rest.routes.interactions.commands.commands(rest.applicationId), {
892
+ body
893
+ });
894
+ },
895
+ async createGuild (body) {
896
+ return await rest.post(rest.routes.guilds.all(), {
897
+ body
898
+ });
899
+ },
900
+ async createGuildApplicationCommand (body, guildId) {
901
+ return await rest.post(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), {
902
+ body
903
+ });
904
+ },
905
+ async createGuildFromTemplate (templateCode, body) {
906
+ if (body.icon) {
907
+ body.icon = await urlToBase64(body.icon);
908
+ }
909
+ return await rest.post(rest.routes.guilds.templates.code(templateCode), {
910
+ body
911
+ });
912
+ },
913
+ async createGuildSticker (guildId, options) {
914
+ const form = new FormData();
915
+ form.append('file', options.file.blob, options.file.name);
916
+ form.append('name', options.name);
917
+ form.append('description', options.description);
918
+ form.append('tags', options.tags);
919
+ return await rest.post(rest.routes.guilds.stickers(guildId), {
920
+ body: form
921
+ });
922
+ },
923
+ async createGuildTemplate (guildId, body) {
924
+ return await rest.post(rest.routes.guilds.templates.all(guildId), {
925
+ body
926
+ });
927
+ },
928
+ async createForumThread (channelId, body) {
929
+ return await rest.post(rest.routes.channels.forum(channelId), {
930
+ body,
931
+ files: body.files
932
+ });
933
+ },
934
+ async createInvite (channelId, body = {}) {
935
+ return await rest.post(rest.routes.channels.invites(channelId), {
936
+ body
937
+ });
938
+ },
939
+ async createRole (guildId, body, reason) {
940
+ return await rest.post(rest.routes.guilds.roles.all(guildId), {
941
+ body,
942
+ reason
943
+ });
944
+ },
945
+ async createScheduledEvent (guildId, body) {
946
+ return await rest.post(rest.routes.guilds.events.events(guildId), {
947
+ body
948
+ });
949
+ },
950
+ async createStageInstance (body) {
951
+ return await rest.post(rest.routes.channels.stages(), {
952
+ body
953
+ });
954
+ },
955
+ async createWebhook (channelId, options, reason) {
956
+ return await rest.post(rest.routes.channels.webhooks(channelId), {
957
+ body: {
958
+ name: options.name,
959
+ avatar: options.avatar ? await urlToBase64(options.avatar) : undefined
960
+ },
961
+ reason
962
+ });
963
+ },
964
+ async deleteAutomodRule (guildId, ruleId, reason) {
965
+ await rest.delete(rest.routes.guilds.automod.rule(guildId, ruleId), {
966
+ reason
967
+ });
968
+ },
969
+ async deleteChannel (channelId, reason) {
970
+ await rest.delete(rest.routes.channels.channel(channelId), {
971
+ reason
972
+ });
973
+ },
974
+ async deleteChannelPermissionOverride (channelId, overwriteId, reason) {
975
+ await rest.delete(rest.routes.channels.overwrite(channelId, overwriteId), {
976
+ reason
977
+ });
978
+ },
979
+ async deleteEmoji (guildId, id, reason) {
980
+ await rest.delete(rest.routes.guilds.emoji(guildId, id), {
981
+ reason
982
+ });
983
+ },
984
+ async deleteFollowupMessage (token, messageId) {
985
+ await rest.delete(rest.routes.interactions.responses.message(rest.applicationId, token, messageId));
986
+ },
987
+ async deleteGlobalApplicationCommand (commandId) {
988
+ await rest.delete(rest.routes.interactions.commands.command(rest.applicationId, commandId));
989
+ },
990
+ async deleteGuild (guildId) {
991
+ await rest.delete(rest.routes.guilds.guild(guildId));
992
+ },
993
+ async deleteGuildApplicationCommand (commandId, guildId) {
994
+ await rest.delete(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
995
+ },
996
+ async deleteGuildSticker (guildId, stickerId, reason) {
997
+ await rest.delete(rest.routes.guilds.sticker(guildId, stickerId), {
998
+ reason
999
+ });
1000
+ },
1001
+ async deleteGuildTemplate (guildId, templateCode) {
1002
+ await rest.delete(rest.routes.guilds.templates.guild(guildId, templateCode));
1003
+ },
1004
+ async deleteIntegration (guildId, integrationId) {
1005
+ await rest.delete(rest.routes.guilds.integration(guildId, integrationId));
1006
+ },
1007
+ async deleteInvite (inviteCode, reason) {
1008
+ await rest.delete(rest.routes.guilds.invite(inviteCode), {
1009
+ reason
1010
+ });
1011
+ },
1012
+ async deleteMessage (channelId, messageId, reason) {
1013
+ await rest.delete(rest.routes.channels.message(channelId, messageId), {
1014
+ reason
1015
+ });
1016
+ },
1017
+ async deleteMessages (channelId, messageIds, reason) {
1018
+ await rest.post(rest.routes.channels.bulk(channelId), {
1019
+ body: {
1020
+ messages: messageIds.slice(0, 100).map((id)=>id.toString())
1021
+ },
1022
+ reason
1023
+ });
1024
+ },
1025
+ async deleteOriginalInteractionResponse (token) {
1026
+ await rest.delete(rest.routes.interactions.responses.original(rest.applicationId, token));
1027
+ },
1028
+ async deleteOwnReaction (channelId, messageId, reaction) {
1029
+ reaction = processReactionString(reaction);
1030
+ await rest.delete(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
1031
+ },
1032
+ async deleteReactionsAll (channelId, messageId) {
1033
+ await rest.delete(rest.routes.channels.reactions.all(channelId, messageId));
1034
+ },
1035
+ async deleteReactionsEmoji (channelId, messageId, reaction) {
1036
+ reaction = processReactionString(reaction);
1037
+ await rest.delete(rest.routes.channels.reactions.emoji(channelId, messageId, reaction));
1038
+ },
1039
+ async deleteRole (guildId, roleId) {
1040
+ await rest.delete(rest.routes.guilds.roles.one(guildId, roleId));
1041
+ },
1042
+ async deleteScheduledEvent (guildId, eventId) {
1043
+ await rest.delete(rest.routes.guilds.events.event(guildId, eventId));
1044
+ },
1045
+ async deleteStageInstance (channelId, reason) {
1046
+ await rest.delete(rest.routes.channels.stage(channelId), {
1047
+ reason
1048
+ });
1049
+ },
1050
+ async deleteUserReaction (channelId, messageId, userId, reaction) {
1051
+ reaction = processReactionString(reaction);
1052
+ await rest.delete(rest.routes.channels.reactions.user(channelId, messageId, reaction, userId));
1053
+ },
1054
+ async deleteWebhook (webhookId, reason) {
1055
+ await rest.delete(rest.routes.webhooks.id(webhookId), {
1056
+ reason
1057
+ });
1058
+ },
1059
+ async deleteWebhookMessage (webhookId, token, messageId, options) {
1060
+ await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options));
1061
+ },
1062
+ async deleteWebhookWithToken (webhookId, token) {
1063
+ await rest.delete(rest.routes.webhooks.webhook(webhookId, token));
1064
+ },
1065
+ async editApplicationCommandPermissions (guildId, commandId, bearerToken, permissions) {
1066
+ return await rest.put(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId), {
1067
+ body: {
1068
+ permissions
1069
+ },
1070
+ headers: {
1071
+ authorization: `Bearer ${bearerToken}`
1072
+ }
1073
+ });
1074
+ },
1075
+ async editAutomodRule (guildId, ruleId, body) {
1076
+ return await rest.patch(rest.routes.guilds.automod.rule(guildId, ruleId), {
1077
+ body
1078
+ });
1079
+ },
1080
+ async editBotProfile (options) {
1081
+ const avatar = options?.botAvatarURL ? await urlToBase64(options?.botAvatarURL) : options?.botAvatarURL;
1082
+ return await rest.patch(rest.routes.userBot(), {
1083
+ body: {
1084
+ username: options.username?.trim(),
1085
+ avatar
1086
+ }
1087
+ });
1088
+ },
1089
+ async editChannel (channelId, body) {
1090
+ return await rest.patch(rest.routes.channels.channel(channelId), {
1091
+ body
1092
+ });
1093
+ },
1094
+ async editChannelPermissionOverrides (channelId, body) {
1095
+ await rest.put(rest.routes.channels.overwrite(channelId, body.id), {
1096
+ body
1097
+ });
1098
+ },
1099
+ async editChannelPositions (guildId, body) {
1100
+ await rest.patch(rest.routes.guilds.channels(guildId), {
1101
+ body
1102
+ });
1103
+ },
1104
+ async editEmoji (guildId, id, body) {
1105
+ return await rest.patch(rest.routes.guilds.emoji(guildId, id), {
1106
+ body
1107
+ });
1108
+ },
1109
+ async editFollowupMessage (token, messageId, body) {
1110
+ return await rest.patch(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
1111
+ body,
1112
+ files: body.files
1113
+ });
1114
+ },
1115
+ async editGlobalApplicationCommand (commandId, body) {
1116
+ return await rest.patch(rest.routes.interactions.commands.command(rest.applicationId, commandId), {
1117
+ body
1118
+ });
1119
+ },
1120
+ async editGuild (guildId, body) {
1121
+ return await rest.patch(rest.routes.guilds.guild(guildId), {
1122
+ body
1123
+ });
1124
+ },
1125
+ async editGuildApplicationCommand (commandId, guildId, body) {
1126
+ return await rest.patch(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId), {
1127
+ body
1128
+ });
1129
+ },
1130
+ async editGuildMfaLevel (guildId, mfaLevel, reason) {
1131
+ await rest.post(rest.routes.guilds.mfa(guildId), {
1132
+ body: {
1133
+ level: mfaLevel
1134
+ },
1135
+ reason
1136
+ });
1137
+ },
1138
+ async editGuildSticker (guildId, stickerId, body) {
1139
+ return await rest.patch(rest.routes.guilds.sticker(guildId, stickerId), {
1140
+ body
1141
+ });
1142
+ },
1143
+ async editGuildTemplate (guildId, templateCode, body) {
1144
+ return await rest.patch(rest.routes.guilds.templates.guild(guildId, templateCode), {
1145
+ body
1146
+ });
1147
+ },
1148
+ async editMessage (channelId, messageId, body) {
1149
+ return await rest.patch(rest.routes.channels.message(channelId, messageId), {
1150
+ body
1151
+ });
1152
+ },
1153
+ async editOriginalInteractionResponse (token, body) {
1154
+ return await rest.patch(rest.routes.interactions.responses.original(rest.applicationId, token), {
1155
+ body,
1156
+ files: body.files
1157
+ });
1158
+ },
1159
+ async editOriginalWebhookMessage (webhookId, token, options) {
1160
+ return await rest.patch(rest.routes.webhooks.original(webhookId, token, options), {
1161
+ body: {
1162
+ type: InteractionResponseTypes.UpdateMessage,
1163
+ data: options
1164
+ },
1165
+ files: options.files
1166
+ });
1167
+ },
1168
+ async editOwnVoiceState (guildId, options) {
1169
+ await rest.patch(rest.routes.guilds.voice(guildId), {
1170
+ body: {
1171
+ ...options,
1172
+ request_to_speak_timestamp: options.requestToSpeakTimestamp ? new Date(options.requestToSpeakTimestamp).toISOString() : options.requestToSpeakTimestamp
1173
+ }
1174
+ });
1175
+ },
1176
+ async editScheduledEvent (guildId, eventId, body) {
1177
+ return await rest.patch(rest.routes.guilds.events.event(guildId, eventId), {
1178
+ body
1179
+ });
1180
+ },
1181
+ async editRole (guildId, roleId, body) {
1182
+ return await rest.patch(rest.routes.guilds.roles.one(guildId, roleId), {
1183
+ body
1184
+ });
1185
+ },
1186
+ async editRolePositions (guildId, body) {
1187
+ return await rest.patch(rest.routes.guilds.roles.all(guildId), {
1188
+ body
1189
+ });
1190
+ },
1191
+ async editStageInstance (channelId, topic, reason) {
1192
+ return await rest.patch(rest.routes.channels.stage(channelId), {
1193
+ body: {
1194
+ topic
1195
+ },
1196
+ reason
1197
+ });
1198
+ },
1199
+ async editUserVoiceState (guildId, options) {
1200
+ await rest.patch(rest.routes.guilds.voice(guildId, options.userId), {
1201
+ body: options
1202
+ });
1203
+ },
1204
+ async editWebhook (webhookId, body) {
1205
+ return await rest.patch(rest.routes.webhooks.id(webhookId), {
1206
+ body
1207
+ });
1208
+ },
1209
+ async editWebhookMessage (webhookId, token, messageId, options) {
1210
+ return await rest.patch(rest.routes.webhooks.message(webhookId, token, messageId, options), {
1211
+ body: options,
1212
+ files: options.files
1213
+ });
1214
+ },
1215
+ async editWebhookWithToken (webhookId, token, body) {
1216
+ return await rest.patch(rest.routes.webhooks.webhook(webhookId, token), {
1217
+ body
1218
+ });
1219
+ },
1220
+ async editWelcomeScreen (guildId, body) {
1221
+ return await rest.patch(rest.routes.guilds.welcome(guildId), {
1222
+ body
1223
+ });
1224
+ },
1225
+ async editWidgetSettings (guildId, body) {
1226
+ return await rest.patch(rest.routes.guilds.widget(guildId), {
1227
+ body
1228
+ });
1229
+ },
1230
+ async executeWebhook (webhookId, token, options) {
1231
+ return await rest.post(rest.routes.webhooks.webhook(webhookId, token, options), {
1232
+ body: options
1233
+ });
1234
+ },
1235
+ async followAnnouncement (sourceChannelId, targetChannelId) {
1236
+ return await rest.post(rest.routes.channels.follow(sourceChannelId), {
1237
+ body: {
1238
+ webhook_channel_id: targetChannelId
1239
+ }
1240
+ });
1241
+ },
1242
+ async getActiveThreads (guildId) {
1243
+ return await rest.get(rest.routes.channels.threads.active(guildId));
1244
+ },
1245
+ async getApplicationCommandPermission (guildId, commandId) {
1246
+ return await rest.get(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId));
1247
+ },
1248
+ async getApplicationCommandPermissions (guildId) {
1249
+ return await rest.get(rest.routes.interactions.commands.permissions(rest.applicationId, guildId));
1250
+ },
1251
+ async getApplicationInfo () {
1252
+ return await rest.get(rest.routes.oauth2Application());
1253
+ },
1254
+ async getAuditLog (guildId, options) {
1255
+ return await rest.get(rest.routes.guilds.auditlogs(guildId, options));
1256
+ },
1257
+ async getAutomodRule (guildId, ruleId) {
1258
+ return await rest.get(rest.routes.guilds.automod.rule(guildId, ruleId));
1259
+ },
1260
+ async getAutomodRules (guildId) {
1261
+ return await rest.get(rest.routes.guilds.automod.rules(guildId));
1262
+ },
1263
+ async getAvailableVoiceRegions () {
1264
+ return await rest.get(rest.routes.regions());
1265
+ },
1266
+ async getBan (guildId, userId) {
1267
+ return await rest.get(rest.routes.guilds.members.ban(guildId, userId));
1268
+ },
1269
+ async getBans (guildId, options) {
1270
+ return await rest.get(rest.routes.guilds.members.bans(guildId, options));
1271
+ },
1272
+ async getChannel (id) {
1273
+ return await rest.get(rest.routes.channels.channel(id));
1274
+ },
1275
+ async getChannelInvites (channelId) {
1276
+ return await rest.get(rest.routes.channels.invites(channelId));
1277
+ },
1278
+ async getChannels (guildId) {
1279
+ return await rest.get(rest.routes.guilds.channels(guildId));
1280
+ },
1281
+ async getChannelWebhooks (channelId) {
1282
+ return await rest.get(rest.routes.channels.webhooks(channelId));
1283
+ },
1284
+ async getDmChannel (userId) {
1285
+ return await rest.post(rest.routes.channels.dm(), {
1286
+ body: {
1287
+ recipient_id: userId
1288
+ }
1289
+ });
1290
+ },
1291
+ async getEmoji (guildId, emojiId) {
1292
+ return await rest.get(rest.routes.guilds.emoji(guildId, emojiId));
1293
+ },
1294
+ async getEmojis (guildId) {
1295
+ return await rest.get(rest.routes.guilds.emojis(guildId));
1296
+ },
1297
+ async getFollowupMessage (token, messageId) {
1298
+ return await rest.get(rest.routes.interactions.responses.message(rest.applicationId, token, messageId));
1299
+ },
1300
+ async getGatewayBot () {
1301
+ return await rest.get(rest.routes.gatewayBot());
1302
+ },
1303
+ async getGlobalApplicationCommand (commandId) {
1304
+ return await rest.get(rest.routes.interactions.commands.command(rest.applicationId, commandId));
1305
+ },
1306
+ async getGlobalApplicationCommands () {
1307
+ return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId));
1308
+ },
1309
+ async getGuild (guildId, options = {
1310
+ counts: true
1311
+ }) {
1312
+ return await rest.get(rest.routes.guilds.guild(guildId, options.counts));
1313
+ },
1314
+ async getGuildApplicationCommand (commandId, guildId) {
1315
+ return await rest.get(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
1316
+ },
1317
+ async getGuildApplicationCommands (guildId) {
1318
+ return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId));
1319
+ },
1320
+ async getGuildPreview (guildId) {
1321
+ return await rest.get(rest.routes.guilds.preview(guildId));
1322
+ },
1323
+ async getGuildTemplate (templateCode) {
1324
+ return await rest.get(rest.routes.guilds.templates.code(templateCode));
1325
+ },
1326
+ async getGuildTemplates (guildId) {
1327
+ return await rest.get(rest.routes.guilds.templates.all(guildId));
1328
+ },
1329
+ async getGuildWebhooks (guildId) {
1330
+ return await rest.get(rest.routes.guilds.webhooks(guildId));
1331
+ },
1332
+ async getIntegrations (guildId) {
1333
+ return await rest.get(rest.routes.guilds.integrations(guildId));
1334
+ },
1335
+ async getInvite (inviteCode, options) {
1336
+ return await rest.get(rest.routes.guilds.invite(inviteCode, options));
1337
+ },
1338
+ async getInvites (guildId) {
1339
+ return await rest.get(rest.routes.guilds.invites(guildId));
1340
+ },
1341
+ async getMessage (channelId, messageId) {
1342
+ return await rest.get(rest.routes.channels.message(channelId, messageId));
1343
+ },
1344
+ async getMessages (channelId, options) {
1345
+ return await rest.get(rest.routes.channels.messages(channelId, options));
1346
+ },
1347
+ async getNitroStickerPacks () {
1348
+ return await rest.get(rest.routes.nitroStickerPacks());
1349
+ },
1350
+ async getOriginalInteractionResponse (token) {
1351
+ return await rest.get(rest.routes.interactions.responses.original(rest.applicationId, token));
1352
+ },
1353
+ async getPinnedMessages (channelId) {
1354
+ return await rest.get(rest.routes.channels.pins(channelId));
1355
+ },
1356
+ async getPrivateArchivedThreads (channelId, options) {
1357
+ return await rest.get(rest.routes.channels.threads.private(channelId, options));
1358
+ },
1359
+ async getPrivateJoinedArchivedThreads (channelId, options) {
1360
+ return await rest.get(rest.routes.channels.threads.joined(channelId, options));
1361
+ },
1362
+ async getPruneCount (guildId, options) {
1363
+ return await rest.get(rest.routes.guilds.prune(guildId, options));
1364
+ },
1365
+ async getPublicArchivedThreads (channelId, options) {
1366
+ return await rest.get(rest.routes.channels.threads.public(channelId, options));
1367
+ },
1368
+ async getRoles (guildId) {
1369
+ return await rest.get(rest.routes.guilds.roles.all(guildId));
1370
+ },
1371
+ async getScheduledEvent (guildId, eventId, options) {
1372
+ return await rest.get(rest.routes.guilds.events.event(guildId, eventId, options?.withUserCount));
1373
+ },
1374
+ async getScheduledEvents (guildId, options) {
1375
+ return await rest.get(rest.routes.guilds.events.events(guildId, options?.withUserCount));
1376
+ },
1377
+ async getScheduledEventUsers (guildId, eventId, options) {
1378
+ return await rest.get(rest.routes.guilds.events.users(guildId, eventId, options));
1379
+ },
1380
+ async getSessionInfo () {
1381
+ return await rest.getGatewayBot();
1382
+ },
1383
+ async getStageInstance (channelId) {
1384
+ return await rest.get(rest.routes.channels.stage(channelId));
1385
+ },
1386
+ async getSticker (stickerId) {
1387
+ return await rest.get(rest.routes.sticker(stickerId));
1388
+ },
1389
+ async getGuildSticker (guildId, stickerId) {
1390
+ return await rest.get(rest.routes.guilds.sticker(guildId, stickerId));
1391
+ },
1392
+ async getGuildStickers (guildId) {
1393
+ return await rest.get(rest.routes.guilds.stickers(guildId));
1394
+ },
1395
+ async getThreadMember (channelId, userId) {
1396
+ return await rest.get(rest.routes.channels.threads.user(channelId, userId));
1397
+ },
1398
+ async getThreadMembers (channelId) {
1399
+ return await rest.get(rest.routes.channels.threads.members(channelId));
1400
+ },
1401
+ async getReactions (channelId, messageId, reaction, options) {
1402
+ return await rest.get(rest.routes.channels.reactions.message(channelId, messageId, reaction, options));
1403
+ },
1404
+ async getUser (id) {
1405
+ return await rest.get(rest.routes.user(id));
1406
+ },
1407
+ async getVanityUrl (guildId) {
1408
+ return await rest.get(rest.routes.guilds.vanity(guildId));
1409
+ },
1410
+ async getVoiceRegions (guildId) {
1411
+ return await rest.get(rest.routes.guilds.regions(guildId));
1412
+ },
1413
+ async getWebhook (webhookId) {
1414
+ return await rest.get(rest.routes.webhooks.id(webhookId));
1415
+ },
1416
+ async getWebhookMessage (webhookId, token, messageId, options) {
1417
+ return await rest.get(rest.routes.webhooks.message(webhookId, token, messageId, options));
1418
+ },
1419
+ async getWebhookWithToken (webhookId, token) {
1420
+ return await rest.get(rest.routes.webhooks.webhook(webhookId, token));
1421
+ },
1422
+ async getWelcomeScreen (guildId) {
1423
+ return await rest.get(rest.routes.guilds.welcome(guildId));
1424
+ },
1425
+ async getWidget (guildId) {
1426
+ return await rest.get(rest.routes.guilds.widgetJson(guildId));
1427
+ },
1428
+ async getWidgetSettings (guildId) {
1429
+ return await rest.get(rest.routes.guilds.widget(guildId));
1430
+ },
1431
+ async joinThread (channelId) {
1432
+ await rest.put(rest.routes.channels.threads.me(channelId));
1433
+ },
1434
+ async leaveGuild (guildId) {
1435
+ await rest.delete(rest.routes.guilds.leave(guildId));
1436
+ },
1437
+ async leaveThread (channelId) {
1438
+ await rest.delete(rest.routes.channels.threads.me(channelId));
1439
+ },
1440
+ async publishMessage (channelId, messageId) {
1441
+ return await rest.post(rest.routes.channels.crosspost(channelId, messageId));
1442
+ },
1443
+ async removeRole (guildId, userId, roleId, reason) {
1444
+ await rest.delete(rest.routes.guilds.roles.member(guildId, userId, roleId), {
1445
+ reason
1446
+ });
1447
+ },
1448
+ async removeThreadMember (channelId, userId) {
1449
+ await rest.delete(rest.routes.channels.threads.user(channelId, userId));
1450
+ },
1451
+ // TODO: why that
1452
+ async sendFollowupMessage (token, options) {
1453
+ return await new Promise((resolve, reject)=>{
1454
+ rest.sendRequest({
1455
+ url: rest.routes.webhooks.webhook(rest.applicationId, token),
1456
+ method: 'POST',
1457
+ requestBodyOptions: {
1458
+ body: options,
1459
+ files: options.files
1460
+ },
1461
+ retryCount: 0,
1462
+ retryRequest: async function(options) {
1463
+ // TODO: should change to reprocess queue item
1464
+ await rest.sendRequest(options);
1465
+ },
1466
+ resolve: (data)=>{
1467
+ resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined);
1468
+ },
1469
+ reject
1470
+ });
1471
+ });
1472
+ },
1473
+ // TODO: why that
1474
+ async sendInteractionResponse (interactionId, token, options) {
1475
+ await new Promise((resolve, reject)=>{
1476
+ rest.sendRequest({
1477
+ url: rest.routes.interactions.responses.callback(interactionId, token),
1478
+ method: 'POST',
1479
+ requestBodyOptions: {
1480
+ body: options
1481
+ },
1482
+ retryCount: 0,
1483
+ retryRequest: async function(options) {
1484
+ // TODO: should change to reprocess queue item
1485
+ await rest.sendRequest(options);
1486
+ },
1487
+ resolve: (data)=>{
1488
+ resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined);
1489
+ },
1490
+ reject
1491
+ });
1492
+ });
1493
+ },
1494
+ async sendMessage (channelId, body) {
1495
+ return await rest.post(rest.routes.channels.messages(channelId), {
1496
+ body,
1497
+ files: body.files
1498
+ });
1499
+ },
1500
+ async startThreadWithMessage (channelId, messageId, body) {
1501
+ return await rest.post(rest.routes.channels.threads.message(channelId, messageId), {
1502
+ body
1503
+ });
1504
+ },
1505
+ async startThreadWithoutMessage (channelId, body) {
1506
+ return await rest.post(rest.routes.channels.threads.all(channelId), {
1507
+ body
1508
+ });
1509
+ },
1510
+ async syncGuildTemplate (guildId) {
1511
+ return await rest.put(rest.routes.guilds.templates.all(guildId));
1512
+ },
1513
+ async banMember (guildId, userId, body) {
1514
+ await rest.put(rest.routes.guilds.members.ban(guildId, userId), {
1515
+ body
1516
+ });
1517
+ },
1518
+ async editBotMember (guildId, body) {
1519
+ return await rest.patch(rest.routes.guilds.members.bot(guildId), {
1520
+ body
1521
+ });
1522
+ },
1523
+ async editMember (guildId, userId, body) {
1524
+ return await rest.patch(rest.routes.guilds.members.member(guildId, userId), {
1525
+ body
1526
+ });
1527
+ },
1528
+ async getMember (guildId, userId) {
1529
+ return await rest.get(rest.routes.guilds.members.member(guildId, userId));
1530
+ },
1531
+ async getMembers (guildId, options) {
1532
+ return await rest.get(rest.routes.guilds.members.members(guildId, options));
1533
+ },
1534
+ async kickMember (guildId, userId, reason) {
1535
+ await rest.delete(rest.routes.guilds.members.member(guildId, userId), {
1536
+ reason
1537
+ });
1538
+ },
1539
+ async pinMessage (channelId, messageId, reason) {
1540
+ await rest.put(rest.routes.channels.pin(channelId, messageId), {
1541
+ reason
1542
+ });
1543
+ },
1544
+ async pruneMembers (guildId, body) {
1545
+ return await rest.post(rest.routes.guilds.members.prune(guildId), {
1546
+ body
1547
+ });
1548
+ },
1549
+ async searchMembers (guildId, query, options) {
1550
+ return await rest.get(rest.routes.guilds.members.search(guildId, query, options));
1551
+ },
1552
+ async unbanMember (guildId, userId) {
1553
+ await rest.delete(rest.routes.guilds.members.ban(guildId, userId));
1554
+ },
1555
+ async unpinMessage (channelId, messageId, reason) {
1556
+ await rest.delete(rest.routes.channels.pin(channelId, messageId), {
1557
+ reason
1558
+ });
1559
+ },
1560
+ async triggerTypingIndicator (channelId) {
1561
+ await rest.post(rest.routes.channels.typing(channelId));
1562
+ },
1563
+ async upsertGlobalApplicationCommands (body) {
1564
+ return await rest.put(rest.routes.interactions.commands.commands(rest.applicationId), {
1565
+ body
1566
+ });
1567
+ },
1568
+ async upsertGuildApplicationCommands (guildId, body) {
1569
+ return await rest.put(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), {
1570
+ body
1571
+ });
1572
+ }
1573
+ };
1574
+ return rest;
1575
+ }
1576
+
1577
+ //# sourceMappingURL=manager.js.map