~evanj/cms

0307533d3941f3ae7ed100306db58edc1a4d7fa3 — Evan M Jones 4 months ago c896b06
Feat(HTTP): Refactoring HTTP routing/methods. Easier use via cURL -X.
M cms.go => cms.go +9 -0
@@ 12,6 12,7 @@ import (
	"git.sr.ht/~evanj/cms/internal/c/file"
	"git.sr.ht/~evanj/cms/internal/c/hook"
	"git.sr.ht/~evanj/cms/internal/c/ping"
	"git.sr.ht/~evanj/cms/internal/c/redirect"
	"git.sr.ht/~evanj/cms/internal/c/space"
	"git.sr.ht/~evanj/cms/internal/c/user"
	"git.sr.ht/~evanj/cms/internal/s/cache"


@@ 49,6 50,7 @@ type App struct {
	ping        http.Handler
	file        http.Handler
	static      http.Handler
	redirect    http.Handler
}

func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {


@@ 65,6 67,9 @@ func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	case "static":
		a.static.ServeHTTP(w, r)
		return
	case "redirect":
		a.redirect.ServeHTTP(w, r)
		return
	case "ping":
		a.ping.ServeHTTP(w, r)
		return


@@ 156,6 161,10 @@ func init() {
			url,
		),
		static: http.StripPrefix("/static", http.FileServer(http.Dir(staticDir))),
		redirect: redirect.New(
			log.New(w, "[cms:redirect] ", 0),
			cacher,
		),
	}
}


M internal/c/c.go => internal/c/c.go +20 -0
@@ 8,6 8,7 @@ import (
	"io"
	"log"
	"net/http"
	"net/url"
	"strings"

	"git.sr.ht/~evanj/cms/internal/m/user"


@@ 139,3 140,22 @@ func (c *Controller) JSON(w http.ResponseWriter, r *http.Request, data interface
	w.WriteHeader(http.StatusOK)
	w.Write(bytes)
}

func (c *Controller) Method(r *http.Request) string {
	fv := r.FormValue("method")
	if fv != "" {
		return fv
	}
	return r.Method
}

func (c *Controller) Redirect(w http.ResponseWriter, r *http.Request, to string) {
	// Check if we should just spit out URL we're redirecting the user to (useful
	// for cURL users).
	if !strings.Contains(r.Header.Get("Accept"), "text/html") {
		c.JSON(w, r, map[string]interface{}{"redirectURL": to})
		return
	}
	val := url.Values{"url": []string{to}}
	http.Redirect(w, r, fmt.Sprintf("/redirect?%s", val.Encode()), http.StatusTemporaryRedirect)
}

M internal/c/content/content.go => internal/c/content/content.go +29 -18
@@ 130,7 130,7 @@ func (c *Content) create(w http.ResponseWriter, r *http.Request) {

	var params []db.ContentNewParam
	for key := range r.Form {
		if key == "space" || key == "contenttype" {
		if key == "space" || key == "contenttype" || key == "method" {
			continue
		}



@@ 194,10 194,21 @@ func (c *Content) create(w http.ResponseWriter, r *http.Request) {

	url := fmt.Sprintf("/content/%s/%s/%s", space.ID(), ct.ID(), content.ID())
	c.log.Println("successfully created new content for user", user.Name(), "in space", space.Name(), "for contenttype", ct.Name(), "redirecting to", url)
	http.Redirect(w, r, url, http.StatusTemporaryRedirect)
	c.Redirect(w, r, url)
}

func (c *Content) serve(w http.ResponseWriter, r *http.Request, spaceID, contenttypeID, contentID string) {
func (c *Content) serve(w http.ResponseWriter, r *http.Request) {
	spaceID := r.FormValue("space")
	contenttypeID := r.FormValue("contenttype")
	contentID := r.FormValue("content")

	parts := strings.Split(r.URL.Path, "/")
	if len(parts) > 4 {
		spaceID = parts[2]
		contenttypeID = parts[3]
		contentID = parts[4]
	}

	user, err := c.GetCookieUser(w, r)
	if err != nil {
		c.Error(w, r, http.StatusBadRequest, ErrNoLogin.Error())


@@ 247,7 258,7 @@ func (c *Content) update(w http.ResponseWriter, r *http.Request) {
	var updateParams []db.ContentUpdateParam

	for key := range r.Form {
		if key == "space" || key == "contenttype" || key == "content" {
		if key == "space" || key == "contenttype" || key == "content" || key == "method" {
			continue
		}



@@ 360,7 371,7 @@ func (c *Content) update(w http.ResponseWriter, r *http.Request) {

	url := fmt.Sprintf("/content/%s/%s/%s", space.ID(), ct.ID(), content.ID())
	c.log.Println("successfully updated content for user", user.Name(), "in space", space.Name(), "for contenttype", ct.Name(), "redirecting to", url)
	http.Redirect(w, r, url, http.StatusTemporaryRedirect)
	c.Redirect(w, r, url)
}

func (c *Content) delete(w http.ResponseWriter, r *http.Request) {


@@ 385,7 396,7 @@ func (c *Content) delete(w http.ResponseWriter, r *http.Request) {

	url := fmt.Sprintf("/contenttype/%s/%s", space.ID(), ct.ID())
	c.log.Println("successfully deleted content for user", user.Name(), "in space", space.Name(), "for contenttype", ct.Name(), "redirecting to", url)
	http.Redirect(w, r, url, http.StatusTemporaryRedirect)
	c.Redirect(w, r, url)
}

func (c *Content) search(w http.ResponseWriter, r *http.Request) {


@@ 431,24 442,24 @@ func (c *Content) search(w http.ResponseWriter, r *http.Request) {
}

func (c *Content) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	switch r.URL.Path {
	case "/content/new":
	switch c.Method(r) {
	case "POST":
		c.create(w, r)
		return
	case "/content/update":
	case "PATCH":
		c.update(w, r)
		return
	case "/content/delete":
	case "DELETE":
		c.delete(w, r)
		return
	case "/content/search":
		c.search(w, r)
		return
	}

	parts := strings.Split(r.URL.Path, "/")
	if len(parts) > 4 {
		c.serve(w, r, parts[2], parts[3], parts[4])
	case "GET":
		// Either want to serve a contenttype or search for a contenttype... Decide
		// what to do on presence of FormValue.
		if r.FormValue("query") != "" {
			c.search(w, r)
			return
		}
		c.serve(w, r)
		return
	}


M internal/c/contenttype/contenttype.go => internal/c/contenttype/contenttype.go +25 -16
@@ 115,7 115,7 @@ func (c *ContentType) create(w http.ResponseWriter, r *http.Request) {

	url := fmt.Sprintf("/contenttype/%s/%s", space.ID(), ct.ID())
	c.log.Println("successfully created new contenttype for user", user.Name(), "in space", space.Name(), "redirecting to", url)
	http.Redirect(w, r, url, http.StatusTemporaryRedirect)
	c.Redirect(w, r, url)
}

func (c *ContentType) update(w http.ResponseWriter, r *http.Request) {


@@ 218,10 218,19 @@ func (c *ContentType) update(w http.ResponseWriter, r *http.Request) {

	url := fmt.Sprintf("/contenttype/%s/%s", space.ID(), ct.ID())
	c.log.Println("successfully updated contenttype for user", user.Name(), "in space", space.Name(), "redirecting to", url)
	http.Redirect(w, r, url, http.StatusTemporaryRedirect)
	c.Redirect(w, r, url)
}

func (c *ContentType) serve(w http.ResponseWriter, r *http.Request, spaceID, contenttypeID string) {
func (c *ContentType) serve(w http.ResponseWriter, r *http.Request) {
	spaceID := r.FormValue("space")
	contenttypeID := r.FormValue("contenttype")

	parts := strings.Split(r.URL.Path, "/")
	if len(parts) > 3 {
		spaceID = parts[2]
		contenttypeID = parts[3]
	}

	user, err := c.GetCookieUser(w, r)
	if err != nil {
		c.Error(w, r, http.StatusBadRequest, "must be logged in")


@@ 306,7 315,7 @@ func (c *ContentType) delete(w http.ResponseWriter, r *http.Request) {

	url := fmt.Sprintf("/space/%s", space.ID())
	c.log.Println("successfully deleted contenttype for user", user.Name(), "in space", space.Name(), "redirecting to", url)
	http.Redirect(w, r, url, http.StatusTemporaryRedirect)
	c.Redirect(w, r, url)
}

func (c *ContentType) search(w http.ResponseWriter, r *http.Request) {


@@ 336,24 345,24 @@ func (c *ContentType) search(w http.ResponseWriter, r *http.Request) {
}

func (c *ContentType) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	switch r.URL.Path {
	case "/contenttype/new":
	switch c.Method(r) {
	case "POST":
		c.create(w, r)
		return
	case "/contenttype/update":
	case "PATCH":
		c.update(w, r)
		return
	case "/contenttype/delete":
	case "DELETE":
		c.delete(w, r)
		return
	case "/contenttype/search":
		c.search(w, r)
		return
	}

	parts := strings.Split(r.URL.Path, "/")
	if len(parts) > 3 {
		c.serve(w, r, parts[2], parts[3])
	case "GET":
		// Either want to serve a contenttype or search for a contenttype... Decide
		// what to do on presence of FormValue.
		if r.FormValue("query") != "" {
			c.search(w, r)
			return
		}
		c.serve(w, r)
		return
	}


M internal/c/hook/hook.go => internal/c/hook/hook.go +18 -12
@@ 47,9 47,9 @@ func (c *Content) ServeHTTP(w http.ResponseWriter, r *http.Request) {
		return
	}

	switch r.URL.Path {
	switch c.Method(r) {

	case "/hook/new":
	case "POST":
		space, err := c.db.SpaceGet(user, r.FormValue("space"))
		if err != nil {
			c.Error(w, r, http.StatusBadRequest, "failed to find required space")


@@ 63,10 63,10 @@ func (c *Content) ServeHTTP(w http.ResponseWriter, r *http.Request) {
			return
		}

		http.Redirect(w, r, fmt.Sprintf("/hook/%s/%s", space.ID(), hook.ID()), http.StatusTemporaryRedirect)
		c.Redirect(w, r, fmt.Sprintf("/hook/%s/%s", space.ID(), hook.ID()))
		return

	case "/hook/delete":
	case "DELETE":
		space, err := c.db.SpaceGet(user, r.FormValue("space"))
		if err != nil {
			c.log.Println(err)


@@ 87,25 87,28 @@ func (c *Content) ServeHTTP(w http.ResponseWriter, r *http.Request) {
			return
		}

		http.Redirect(w, r, fmt.Sprintf("/space/%s", space.ID()), http.StatusTemporaryRedirect)
		c.Redirect(w, r, fmt.Sprintf("/space/%s", space.ID()))
		return

	default:
	case "GET":
		spaceID := r.FormValue("space")
		hookID := r.FormValue("hook")

		parts := strings.Split(r.URL.Path, "/")
		if len(parts) < 3 {
			http.NotFound(w, r)
			return
		if len(parts) > 2 {
			c.log.Println(parts)
			spaceID = parts[2]
			hookID = parts[3]
		}

		space, err := c.db.SpaceGet(user, parts[2])
		space, err := c.db.SpaceGet(user, spaceID)
		if err != nil {
			c.Error(w, r, http.StatusBadRequest, "failed to find required space")
			return
		}

		hook, err := c.db.HookGet(space, parts[3])
		hook, err := c.db.HookGet(space, hookID)
		if err != nil {
			c.log.Println(err)
			c.Error(w, r, http.StatusBadRequest, "failed to find desired webhook")
			return
		}


@@ 115,6 118,9 @@ func (c *Content) ServeHTTP(w http.ResponseWriter, r *http.Request) {
			"Space": space,
			"Hook":  hook,
		})
		return

	}

	http.NotFound(w, r)
}

A internal/c/redirect/redirect.go => internal/c/redirect/redirect.go +44 -0
@@ 0,0 1,44 @@
package redirect

import (
	"log"
	"net/http"

	"git.sr.ht/~evanj/cms/internal/c"
	"git.sr.ht/~evanj/cms/internal/m/user"
	"git.sr.ht/~evanj/cms/internal/s/tmpl"
)

var (
	redirectHTML = tmpl.MustParse("html/redirect.html")
)

type Redirect struct {
	*c.Controller
	log *log.Logger
}

type dber interface {
	UserGet(username, password string) (user.User, error)
	UserGetFromToken(token string) (user.User, error)
}

func New(log *log.Logger, db dber) *Redirect {
	return &Redirect{
		c.New(log, db),
		log,
	}
}

func (rd *Redirect) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	to := r.FormValue("url")
	if to == "" {
		w.WriteHeader(http.StatusBadRequest)
		w.Write([]byte("no URL found to redirect to"))
		return
	}

	rd.HTML(w, r, redirectHTML, map[string]interface{}{
		"URL": to,
	})
}

A internal/c/redirect/redirect_test.go => internal/c/redirect/redirect_test.go +1 -0
@@ 0,0 1,1 @@
package redirect_test

M internal/c/space/space.go => internal/c/space/space.go +19 -16
@@ 45,7 45,13 @@ func New(log *log.Logger, db dber) *Space {
	}
}

func (s *Space) serve(w http.ResponseWriter, r *http.Request, spaceID string) {
func (s *Space) serve(w http.ResponseWriter, r *http.Request) {
	spaceID := r.FormValue("space")
	parts := strings.Split(r.URL.Path, "/")
	if len(parts) > 2 && spaceID == "" {
		spaceID = parts[2]
	}

	user, err := s.GetCookieUser(w, r)
	if err != nil {
		s.Error(w, r, http.StatusBadRequest, "must be logged in to view space")


@@ 100,7 106,7 @@ func (s *Space) create(w http.ResponseWriter, r *http.Request) {

	url := fmt.Sprintf("/space/%s", space.ID())
	s.log.Println("successfully created new space for user", user.Name(), "redirecting to", url)
	http.Redirect(w, r, url, http.StatusTemporaryRedirect)
	s.Redirect(w, r, url)
}

func (s *Space) copy(w http.ResponseWriter, r *http.Request) {


@@ 129,7 135,7 @@ func (s *Space) copy(w http.ResponseWriter, r *http.Request) {

	url := fmt.Sprintf("/space/%s", spaceNext.ID())
	s.log.Println("successfully created new space for user", user.Name(), "redirecting to", url)
	http.Redirect(w, r, url, http.StatusTemporaryRedirect)
	s.Redirect(w, r, url)
}

func (s *Space) update(w http.ResponseWriter, r *http.Request) {


@@ 158,7 164,7 @@ func (s *Space) update(w http.ResponseWriter, r *http.Request) {

	url := fmt.Sprintf("/space/%s", next.ID())
	s.log.Println("successfully updated space for user", user.Name(), "redirecting to", url)
	http.Redirect(w, r, url, http.StatusTemporaryRedirect)
	s.Redirect(w, r, url)
}

func (s *Space) delete(w http.ResponseWriter, r *http.Request) {


@@ 184,30 190,27 @@ func (s *Space) delete(w http.ResponseWriter, r *http.Request) {

	url := "/"
	s.log.Println("successfully deleted space for user", user.Name(), "redirecting to", url)
	http.Redirect(w, r, url, http.StatusTemporaryRedirect)
	s.Redirect(w, r, url)
}

func (s *Space) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	switch r.URL.Path {
	case "/space/new":
	switch s.Method(r) {
	case "GET":
		s.serve(w, r)
		return
	case "POST":
		s.create(w, r)
		return
	case "/space/copy":
	case "PUT": // PUT is closest to the idea of COPYing an entity.
		s.copy(w, r)
		return
	case "/space/update":
	case "PATCH":
		s.update(w, r)
		return
	case "/space/delete":
	case "DELETE":
		s.delete(w, r)
		return
	}

	parts := strings.Split(r.URL.Path, "/")
	if len(parts) > 2 {
		s.serve(w, r, parts[2])
		return
	}

	http.NotFound(w, r)
}

M internal/s/tmpl/html/_head.html => internal/s/tmpl/html/_head.html +4 -4
@@ 1,4 1,4 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="https://favicon.evanjon.es/0/105/217/32/favicon.ico" />
<link rel="stylesheet" href="/static/css/bootstrap.min.css" />
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link rel='icon' type='image/x-icon' href='https://favicon.evanjon.es/0/105/217/32/favicon.ico' />
<link rel='stylesheet' href='/static/css/bootstrap.min.css' />

M internal/s/tmpl/html/_scripts.html => internal/s/tmpl/html/_scripts.html +2 -2
@@ 1,2 1,2 @@
<script src="/static/js/popper.min.js"></script>
<script src="/static/js/bootstrap.min.js"></script>
<script src='/static/js/popper.min.js'></script>
<script src='/static/js/bootstrap.min.js'></script>

M internal/s/tmpl/html/content.html => internal/s/tmpl/html/content.html +4 -2
@@ 14,7 14,8 @@
    <article class='container'>
      <div class='row'>
        <div class='col-12 col-lg-8 offset-lg-2'>
          <form method=POST action='/content/update' enctype='multipart/form-data'>
          <form method=POST action='/content' enctype='multipart/form-data'>
            <input type=hidden name=method value=PATCH />
            <input required type=hidden name=space value="{{ .Space.ID }}" />
            <input required type=hidden name=contenttype value="{{ .ContentType.ID }}" />
            <input required type=hidden name=content value="{{ .Content.ID }}" />


@@ 213,7 214,8 @@
            </div>
          </form>

          <form method=POST action='/content/delete' enctype='multipart/form-data'>
          <form method=POST action='/content' enctype='multipart/form-data'>
            <input type=hidden name=method value=DELETE />
            <input required type=hidden name=space value="{{ .Space.ID }}" />
            <input required type=hidden name=contenttype value="{{ .ContentType.ID }}" />
            <input required type=hidden name=content value="{{ .Content.ID }}" />

M internal/s/tmpl/html/contenttype.html => internal/s/tmpl/html/contenttype.html +6 -3
@@ 14,7 14,8 @@
      <h1 class="display-4">{{.ContentType.Name}}</h1>
    </div>
    <article>
      <form method=POST action='/contenttype/delete' enctype='multipart/form-data'>
      <form method=POST action='/contenttype' enctype='multipart/form-data'>
        <input type=hidden name=method value=DELETE />
        <input required type=hidden name=space value="{{ .Space.ID }}" />
        <input required type=hidden name=contenttype value="{{ .ContentType.ID }}" />
        <div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteModalLabel" aria-hidden="true">


@@ 35,7 36,8 @@
        </div>
      </form>

      <form method=POST action='/content/new' enctype='multipart/form-data'>
      <form method=POST action='/content' enctype='multipart/form-data'>
        <input type=hidden name=method value=POST />
        <input required type=hidden name=space value="{{ .Space.ID }}" />
        <input required type=hidden name=contenttype value="{{ .ContentType.ID }}" />
        <div class="modal fade" id="createModal" tabindex="-1" role="dialog" aria-labelledby="createModalLabel" aria-hidden="true">


@@ 143,7 145,8 @@
        </div>
      </form>

      <form method=POST action='/contenttype/update' enctype='multipart/form-data'>
      <form method=POST action='/contenttype' enctype='multipart/form-data'>
        <input type=hidden name=method value=PATCH />
        <input required type=hidden name=space value="{{ .Space.ID }}" />
        <input required type=hidden name=contenttype value="{{ .ContentType.ID }}" />
        <div class="modal fade" id="updateModal" tabindex="-1" role="dialog" aria-labelledby="Update {{.ContentType.Name}}" aria-hidden="true">

M internal/s/tmpl/html/hook.html => internal/s/tmpl/html/hook.html +2 -1
@@ 12,7 12,8 @@
      <h1 class="display-4">{{ .Hook.URL }}</h1>
    </div>
    <article class=container>
      <form method=POST action='/hook/delete' enctype='multipart/form-data'>
      <form method=POST action='/hook' enctype='multipart/form-data'>
        <input type=hidden name=method value=DELETE />
        <input required type=hidden name=space value="{{ .Space.ID }}" />
        <input required type=hidden name=hook value="{{ .Hook.ID }}" />
        <div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteModalLabel" aria-hidden="true">

M internal/s/tmpl/html/index.html => internal/s/tmpl/html/index.html +2 -1
@@ 35,7 35,8 @@
    </div>
    <article>
      {{ if .User }}
        <form method=POST action='/space/new' enctype='multipart/form-data'>
        <form method=POST action='/space' enctype='multipart/form-data'>
          <input type=hidden name=method value=POST />
          <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
            <div class="modal-dialog modal-dialog-scrollable">
              <div class="modal-content">

A internal/s/tmpl/html/redirect.html => internal/s/tmpl/html/redirect.html +19 -0
@@ 0,0 1,19 @@
<!DOCTYPE html>
<html lang=en>
<head>
  {{ template "html/_head.html" }}
  <title>CMS</title>
</head>
<body class='index bg-light'>
  <style>{{ template "css/main.css" }}</style>
  <main>
    {{ template "html/_header.html" $ }}
    <div class="pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center">
      <h1 class="display-4">Redirecting to https://cms.evanjon.es{{.URL}}</h1>
    </div>
    {{ template "html/_footer.html" }}
  </main>
  {{ template "html/_scripts.html" }}
  <script>(function(){setTimeout(function(){location.href="{{.URL}}";},750);})();</script>
</body>
</html>

M internal/s/tmpl/html/space.html => internal/s/tmpl/html/space.html +10 -5
@@ 13,7 13,8 @@
      <p class="lead">{{.Space.Desc}}</p>
    </div>
    <article>
      <form method=POST action='/contenttype/new' enctype='multipart/form-data'>
      <form method=POST action='/contenttype' enctype='multipart/form-data'>
        <input type=hidden name=method value=POST />
        <input required type=hidden name=space value="{{ .Space.ID }}" />
        <div class="modal fade" id="create-contenttype" tabindex="-1" role="dialog" aria-labelledby="Create a new content type modal." aria-hidden="true">
          <div class="modal-dialog modal-dialog-scrollable">


@@ 60,7 61,8 @@
        </div>
      </form>

      <form method=POST action='/hook/new' enctype='multipart/form-data'>
      <form method=POST action='/hook' enctype='multipart/form-data'>
        <input type=hidden name=method value=POST />
        <input required type=hidden name=space value="{{ .Space.ID }}" />
        <div class="modal fade" id="hookModal" tabindex="-1" role="dialog" aria-labelledby="hookModalLabel" aria-hidden="true">
          <div class="modal-dialog modal-dialog-scrollable">


@@ 84,7 86,8 @@
        </div>
      </form>

      <form method=POST action='/space/copy' enctype='multipart/form-data'>
      <form method=POST action='/space' enctype='multipart/form-data'>
        <input type=hidden name=method value=PUT />
        <input required type=hidden name=space value="{{ .Space.ID }}" />
        <div class="modal fade" id="copyModal" tabindex="-1" role="dialog" aria-labelledby="copyModalLabel" aria-hidden="true">
          <div class="modal-dialog modal-dialog-scrollable">


@@ 110,7 113,8 @@
        </div>
      </form>

      <form method=POST action='/space/update' enctype='multipart/form-data'>
      <form method=POST action='/space' enctype='multipart/form-data'>
        <input type=hidden name=method value=PATCH />
        <input required type=hidden name=space value="{{ .Space.ID }}" />
        <div class="modal fade" id="updateModal" tabindex="-1" role="dialog" aria-labelledby="updateModalLabel" aria-hidden="true">
          <div class="modal-dialog modal-dialog-scrollable">


@@ 136,7 140,8 @@
        </div>
      </form>
      
      <form method=POST action='/space/delete' enctype='multipart/form-data'>
      <form method=POST action='/space' enctype='multipart/form-data'>
        <input type=hidden name=method value=DELETE />
        <input required type=hidden name=space value="{{ .Space.ID }}" />
        <div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteModalLabel" aria-hidden="true">
          <div class="modal-dialog modal-dialog-scrollable">

M internal/s/tmpl/tmpls_embed.go => internal/s/tmpl/tmpls_embed.go +9 -7
@@ 22,21 22,23 @@ func init() {

	tmpls["html/_footer.html"] = tostring("PGRpdiBjbGFzcz1jb250YWluZXI+CiAgPGZvb3RlciBjbGFzcz0icHQtNCBteS1tZC01IHB0LW1kLTUgYm9yZGVyLXRvcCI+CiAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIgY29sLW1kIj4KICAgICAgICA8c21hbGwgY2xhc3M9ImQtYmxvY2sgdGV4dC1tdXRlZCI+RXZhbiBKb25lczwvc21hbGw+CiAgICAgICAgPHNtYWxsIGNsYXNzPSJkLWJsb2NrIHRleHQtbXV0ZWQiPsKpIDIwMjA8L3NtYWxsPgogICAgICAgIDxzbWFsbCBjbGFzcz0iZC1ibG9jayBtYi0zIHRleHQtbXV0ZWQiPjxhIGhyZWY9J2h0dHBzOi8vZ2l0LnNyLmh0L35ldmFuai9jbXMvYmxvYi9tYXN0ZXIvTElDRU5TRSc+QUdQTDwvYT48L3NtYWxsPgogICAgICA8L2Rpdj4KICAgICAgPCEtLQogICAgICA8ZGl2IGNsYXNzPSJjb2wtNiBjb2wtbWQiPgogICAgICAgIDxoNT5GZWF0dXJlczwvaDU+CiAgICAgICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIHRleHQtc21hbGwiPgogICAgICAgICAgPGxpPjxhIGNsYXNzPSJ0ZXh0LW11dGVkIiBocmVmPSIjIj5Db29sIHN0dWZmPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgY2xhc3M9InRleHQtbXV0ZWQiIGhyZWY9IiMiPlJhbmRvbSBmZWF0dXJlPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgY2xhc3M9InRleHQtbXV0ZWQiIGhyZWY9IiMiPlRlYW0gZmVhdHVyZTwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGNsYXNzPSJ0ZXh0LW11dGVkIiBocmVmPSIjIj5TdHVmZiBmb3IgZGV2ZWxvcGVyczwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGNsYXNzPSJ0ZXh0LW11dGVkIiBocmVmPSIjIj5Bbm90aGVyIG9uZTwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGNsYXNzPSJ0ZXh0LW11dGVkIiBocmVmPSIjIj5MYXN0IHRpbWU8L2E+PC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29sLTYgY29sLW1kIj4KICAgICAgICA8aDU+UmVzb3VyY2VzPC9oNT4KICAgICAgICA8dWwgY2xhc3M9Imxpc3QtdW5zdHlsZWQgdGV4dC1zbWFsbCI+CiAgICAgICAgICA8bGk+PGEgY2xhc3M9InRleHQtbXV0ZWQiIGhyZWY9IiMiPlJlc291cmNlPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgY2xhc3M9InRleHQtbXV0ZWQiIGhyZWY9IiMiPlJlc291cmNlIG5hbWU8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBjbGFzcz0idGV4dC1tdXRlZCIgaHJlZj0iIyI+QW5vdGhlciByZXNvdXJjZTwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGNsYXNzPSJ0ZXh0LW11dGVkIiBocmVmPSIjIj5GaW5hbCByZXNvdXJjZTwvYT48L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb2wtNiBjb2wtbWQiPgogICAgICAgIDxoNT5BYm91dDwvaDU+CiAgICAgICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIHRleHQtc21hbGwiPgogICAgICAgICAgPGxpPjxhIGNsYXNzPSJ0ZXh0LW11dGVkIiBocmVmPSIjIj5UZWFtPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgY2xhc3M9InRleHQtbXV0ZWQiIGhyZWY9IiMiPkxvY2F0aW9uczwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGNsYXNzPSJ0ZXh0LW11dGVkIiBocmVmPSIjIj5Qcml2YWN5PC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgY2xhc3M9InRleHQtbXV0ZWQiIGhyZWY9IiMiPlRlcm1zPC9hPjwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICAgIC0tPgogICAgPC9kaXY+CiAgPC9mb290ZXI+CjwvZGl2Pgo=")

	tmpls["html/_head.html"] = tostring("PG1ldGEgY2hhcnNldD0idXRmLTgiPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iaHR0cHM6Ly9mYXZpY29uLmV2YW5qb24uZXMvMC8xMDUvMjE3LzMyL2Zhdmljb24uaWNvIiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9zdGF0aWMvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiAvPgo=")
	tmpls["html/_head.html"] = tostring("PG1ldGEgY2hhcnNldD0ndXRmLTgnPgo8bWV0YSBuYW1lPSd2aWV3cG9ydCcgY29udGVudD0nd2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEnPgo8bGluayByZWw9J2ljb24nIHR5cGU9J2ltYWdlL3gtaWNvbicgaHJlZj0naHR0cHM6Ly9mYXZpY29uLmV2YW5qb24uZXMvMC8xMDUvMjE3LzMyL2Zhdmljb24uaWNvJyAvPgo8bGluayByZWw9J3N0eWxlc2hlZXQnIGhyZWY9Jy9zdGF0aWMvY3NzL2Jvb3RzdHJhcC5taW4uY3NzJyAvPgo=")

	tmpls["html/_header.html"] = tostring("PGhlYWRlciBjbGFzcz0nYmctcHJpbWFyeSc+CiAgPG5hdiBjbGFzcz0nY29udGFpbmVyIG5hdmJhciBuYXZiYXItZXhwYW5kLWxnIG5hdmJhci1kYXJrJz4KICAgIDxhIGNsYXNzPSduYXZiYXItYnJhbmQnIGhyZWY9Jy8nPkNNUzwvYT4KICAgIDxidXR0b24gY2xhc3M9J25hdmJhci10b2dnbGVyJyB0eXBlPSdidXR0b24nIGRhdGEtdG9nZ2xlPSdjb2xsYXBzZScgZGF0YS10YXJnZXQ9JyNuYXZiYXJTdXBwb3J0ZWRDb250ZW50JyBhcmlhLWNvbnRyb2xzPSduYXZiYXJTdXBwb3J0ZWRDb250ZW50JyBhcmlhLWV4cGFuZGVkPSdmYWxzZScgYXJpYS1sYWJlbD0nVG9nZ2xlIG5hdmlnYXRpb24nPgogICAgICA8c3BhbiBjbGFzcz0nbmF2YmFyLXRvZ2dsZXItaWNvbic+PC9zcGFuPgogICAgPC9idXR0b24+CiAgICA8ZGl2IGNsYXNzPSdjb2xsYXBzZSBuYXZiYXItY29sbGFwc2UnIGlkPSduYXZiYXJTdXBwb3J0ZWRDb250ZW50Jz4KICAgICAgPHVsIGNsYXNzPSduYXZiYXItbmF2IG1sLWF1dG8nPgogICAgICAgIHt7IGlmIC5TcGFjZSB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nLyc+SG9tZTwvYT48L2xpPgogICAgICAgIHt7IGVuZCB9fQogICAgICAgIHt7IGlmIC5Db250ZW50VHlwZSB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL3NwYWNlL3t7IC5TcGFjZS5JRCB9fSc+e3sgLlNwYWNlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuSG9vayB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL3NwYWNlL3t7IC5TcGFjZS5JRCB9fSc+e3sgLlNwYWNlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuQ29udGVudCB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL2NvbnRlbnR0eXBlL3t7IC5TcGFjZS5JRH19L3t7IC5Db250ZW50VHlwZS5JRCB9fSc+e3sgLkNvbnRlbnRUeXBlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiBhbmQgLlNwYWNlIChub3QgLkNvbnRlbnRUeXBlKSAobm90IC5Ib29rKSB9fQogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2NvcHlNb2RhbCIgY2xhc3M9J25hdi1saW5rJyBocmVmPScjJz5Db3B5PC9hPjwvbGk+CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjdXBkYXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+VXBkYXRlPC9hPjwvbGk+CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+RGVsZXRlPC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgYW5kIC5Db250ZW50VHlwZSAobm90IC5Db250ZW50KSB9fQogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI3VwZGF0ZU1vZGFsIiBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9JyMnPlVwZGF0ZTwvYT48L2xpPgogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2RlbGV0ZU1vZGFsIiBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9JyMnPkRlbGV0ZTwvYT48L2xpPgogICAgICAgIHt7IGVuZCB9fQogICAgICAgIHt7IGlmIC5Db250ZW50IH19CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48aW5wdXQgdHlwZT1zdWJtaXQgY2xhc3M9ImJ0biBidG4tbGluayBuYXYtbGluayBib3JkZXItMCIgdmFsdWU9U2F2ZSAvPjwvbGk+CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+RGVsZXRlPC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgLkhvb2sgfX0KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNkZWxldGVNb2RhbCIgY2xhc3M9J25hdi1saW5rJyBocmVmPScjJz5EZWxldGU8L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuVXNlciB9fQogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+CiAgICAgICAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL3VzZXIvbG9nb3V0JyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgY2xhc3M9ImJ0biBidG4tbGluayBuYXYtbGluayBib3JkZXItMCIgdmFsdWU9TG9nb3V0IC8+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgIDwvbGk+CiAgICAgICAge3sgZW5kfX0KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy8vZ2l0LnNyLmh0L35ldmFuai9jbXMnPlNvdXJjZTwvYT48L2xpPgogICAgICA8L3VsPgogICAgPC9kaXY+CiAgPC9uYXY+CjwvaGVhZGVyPgo=")

	tmpls["html/_scripts.html"] = tostring("PHNjcmlwdCBzcmM9Ii9zdGF0aWMvanMvcG9wcGVyLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL2Jvb3RzdHJhcC5taW4uanMiPjwvc2NyaXB0Pgo=")
	tmpls["html/_scripts.html"] = tostring("PHNjcmlwdCBzcmM9Jy9zdGF0aWMvanMvcG9wcGVyLm1pbi5qcyc+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPScvc3RhdGljL2pzL2Jvb3RzdHJhcC5taW4uanMnPjwvc2NyaXB0Pgo=")

	tmpls["html/content.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPkNNUyB8IHt7IC5TcGFjZS5OYW1lIH19IHwge3sgLkNvbnRlbnRUeXBlLk5hbWUgfX0gfCB7eyAoLkNvbnRlbnQuTXVzdFZhbHVlQnlOYW1lICJuYW1lIikuVmFsdWUgfX08L3RpdGxlPgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSdjb250ZW50IGJnLWxpZ2h0Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8ZGl2IGNsYXNzPSJwcmljaW5nLWhlYWRlciBweC0zIHB5LTMgcHQtbWQtNSBwYi1tZC00IG14LWF1dG8gdGV4dC1jZW50ZXIiPgogICAgICA8aDEgY2xhc3M9ImRpc3BsYXktNCI+e3sgKC5Db250ZW50Lk11c3RWYWx1ZUJ5TmFtZSAibmFtZSIpLlZhbHVlIH19PC9oMT4KICAgIDwvZGl2PgogICAgPGFydGljbGUgY2xhc3M9J2NvbnRhaW5lcic+CiAgICAgIDxkaXYgY2xhc3M9J3Jvdyc+CiAgICAgICAgPGRpdiBjbGFzcz0nY29sLTEyIGNvbC1sZy04IG9mZnNldC1sZy0yJz4KICAgICAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2NvbnRlbnQvdXBkYXRlJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Y29udGVudHR5cGUgdmFsdWU9Int7IC5Db250ZW50VHlwZS5JRCB9fSIgLz4KICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Y29udGVudCB2YWx1ZT0ie3sgLkNvbnRlbnQuSUQgfX0iIC8+CgogICAgICAgICAgICB7eyByYW5nZSAkaW5kZXgsICRpdGVtIDo9IC5Db250ZW50VHlwZS5GaWVsZHMgfX0KICAgICAgICAgICAgICB7eyAkdmFsIDo9ICQuQ29udGVudC5NdXN0VmFsdWVCeU5hbWUgKCAkaXRlbS5OYW1lICkgfX0KCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nZm9ybS1ncm91cCc+CiAgICAgICAgICAgICAge3sgaWYgJHZhbCB9fSAKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSI+e3sgdGl0bGUgJHZhbC5OYW1lIH19PC9sYWJlbD4KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAkdmFsLlR5cGUgIlN0cmluZ1NtYWxsIiB9fQogICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCIge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiB2YWx1ZT0ie3sgJHZhbC5WYWx1ZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgcGxhY2Vob2xkZXI9Int7ICR2YWwuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxICR2YWwuVHlwZSAiU3RyaW5nQmlnIiB9fQogICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCIge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBwbGFjZWhvbGRlcj0ie3sgJHZhbC5OYW1lIH19Ij57eyAkdmFsLlZhbHVlIH19PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxICR2YWwuVHlwZSAiSW5wdXRIVE1MIiB9fQogICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1odG1sIiB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIHZhbHVlPSJ7eyAkdmFsLlZhbHVlIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBwbGFjZWhvbGRlcj0ie3sgJHZhbC5OYW1lIH19Ij57eyAkdmFsLlZhbHVlIH19PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxICR2YWwuVHlwZSAiSW5wdXRNYXJrZG93biIgfX0KICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtbWFya2Rvd24iIHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgdmFsdWU9Int7ICR2YWwuVmFsdWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIHBsYWNlaG9sZGVyPSJ7eyAkdmFsLk5hbWUgfX0iPnt7ICR2YWwuVmFsdWUgfX08L3RleHRhcmVhPgogICAgICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICAgICAge3sgaWYgZXEgJHZhbC5UeXBlICJGaWxlIiB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWZpbGUgbWItMyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gbmFtZT0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiB2YWx1ZT0ie3sgJHZhbC5WYWx1ZSB9fSIgcmVxdWlyZWQgbXVsdGlwbGU9ZmFsc2UgdHlwZT0iZmlsZSIgY2xhc3M9ImZvcm0tZmlsZS1pbnB1dCI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWZpbGUtbGFiZWwiIGZvcj0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19Ij4KICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb3JtLWZpbGUtdGV4dCI+Q2hvb3NlIGZpbGUuLi48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZm9ybS1maWxlLWJ1dHRvbiI+QnJvd3NlPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICAgICAge3sgaWYgZXEgJHZhbC5UeXBlICJEYXRlIiB9fQogICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCIge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiB2YWx1ZT0ie3sgJHZhbC5WYWx1ZSB9fSIgcmVxdWlyZWQgdHlwZT1kYXRlIG5hbWU9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgcGxhY2Vob2xkZXI9Int7ICR2YWwuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxICR2YWwuVHlwZSAiUmVmZXJlbmNlIiB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdyZWYtbW9kYWwnPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIGNsYXNzPSdvdXRwdXQtcmVmJyByZXF1aXJlZCB0eXBlPWhpZGRlbiB2YWx1ZT0ie3sgJHZhbC5WYWx1ZSB9fSIgbmFtZT0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNtb2RhbF92YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtcmVmIHctYXV0byIgdHlwZT1idXR0b24gdmFsdWU9Int7IGlmICAkdmFsLlJlZk5hbWUgfX17eyAkdmFsLlJlZk5hbWUgfX17eyBlbHNlIH19T3Blbnt7IGVuZH19Ii8+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibW9kYWxfdmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBkYXRhLWZvY3VzPSJmYWxzZSIgY2xhc3M9Im1vZGFsIGZhZGUiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9InJlZk1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSI+RmluZCBDb250ZW50IGZvciBSZWZlcmVuY2U8L2g1PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzLWlubmVyPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWJvZHkgb3ZlcmZsb3ctaW5pdGlhbCc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9J2QtYmxvY2snPkNvbnRlbnQgVHlwZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnR0eXBlJyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IFR5cGUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9J2QtYmxvY2snPkNvbnRlbnQgTmFtZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGlzYWJsZWQgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnQnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgTmFtZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSBidG4tY2xlYXIiPkNsZWFyPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgZGF0YS1kaXNtaXNzLWlubmVyPSJtb2RhbCI+R288L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAkdmFsLlR5cGUgIlJlZmVyZW5jZUxpc3QiIH19CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J3JlZi1tb2RhbCByZWYtbGlzdCc+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgY2xhc3M9J291dHB1dC1yZWYnIHJlcXVpcmVkIHR5cGU9aGlkZGVuIHZhbHVlPSJ7eyAkdmFsLlZhbHVlIH19IiBuYW1lPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNtb2RhbF92YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtcmVmIHctYXV0byIgdHlwZT1idXR0b24gdmFsdWU9Int7IGlmICAkdmFsLlJlZkxpc3ROYW1lcyB9fXt7ICR2YWwuUmVmTGlzdE5hbWVzIH19e3sgZWxzZSB9fU9wZW57eyBlbmR9fSIvPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1vZGFsX3ZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgZGF0YS1mb2N1cz0iZmFsc2UiIGNsYXNzPSJtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJyZWZNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiPkZpbmQgQ29udGVudCBmb3IgUmVmZXJlbmNlIExpc3Q8L2g1PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzLWlubmVyPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWJvZHkgb3ZlcmZsb3ctaW5pdGlhbCc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9J2QtYmxvY2snPkNvbnRlbnQgVHlwZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnR0eXBlJyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IFR5cGUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9J2QtYmxvY2snPkNvbnRlbnQgTmFtZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGlzYWJsZWQgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnQnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgTmFtZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSBidG4tY2xlYXIiPkNsZWFyPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgZGF0YS1kaXNtaXNzLWlubmVyPSJtb2RhbCI+R288L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1iLTMiPjwvZGl2PgogICAgICAgICAgICAgIHt7IGVsc2UgfX0KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuTmFtZSB9fSI+e3sgdGl0bGUgLk5hbWUgfX08L2xhYmVsPgoKICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdTbWFsbCIgfX0KICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiU3RyaW5nQmlnIiB9fQogICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCIge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHBsYWNlaG9sZGVyPSJ7eyAuTmFtZSB9fSIgPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiSW5wdXRIVE1MIiB9fQogICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1odG1sIiB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IC5OYW1lIH19IiA+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJJbnB1dE1hcmtkb3duIiB9fQogICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1tYXJrZG93biIge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHBsYWNlaG9sZGVyPSJ7eyAuTmFtZSB9fSIgPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiRmlsZSIgfX0KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1maWxlIG1iLTMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCBtdWx0aXBsZT1mYWxzZSB0eXBlPSJmaWxlIiBjbGFzcz0iZm9ybS1maWxlLWlucHV0Ij4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tZmlsZS1sYWJlbCIgZm9yPSJ2YWx1ZV91cGRhdGVfe3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iPgogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZvcm0tZmlsZS10ZXh0Ij5DaG9vc2UgZmlsZS4uLjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb3JtLWZpbGUtYnV0dG9uIj5Ccm93c2U8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiRGF0ZSIgfX0KICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT1kYXRlIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiUmVmZXJlbmNlIiB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdyZWYtbW9kYWwnPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIGNsYXNzPSdvdXRwdXQtcmVmJyByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI21vZGFsX3ZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuSUQgfX0iIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtcmVmIHctYXV0byIgdHlwZT1idXR0b24gdmFsdWU9T3BlbiAvPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1vZGFsX3ZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuSUQgfX0iIGRhdGEtZm9jdXM9ImZhbHNlIiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0icmVmTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIj5GaW5kIENvbnRlbnQgZm9yIFJlZmVyZW5jZTwvaDU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nbW9kYWwtYm9keSBvdmVyZmxvdy1pbml0aWFsJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0nZC1ibG9jayc+Q29udGVudCBUeXBlPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0nbWItMyBmb3JtLWNvbnRyb2wgaW5wdXQtY29udGVudHR5cGUnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgVHlwZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0nZC1ibG9jayc+Q29udGVudCBOYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBkaXNhYmxlZCBjbGFzcz0nbWItMyBmb3JtLWNvbnRyb2wgaW5wdXQtY29udGVudCcgdHlwZT10ZXh0IHBsYWNlaG9sZGVyPSdTZWFyY2ggYnkgQ29udGVudCBOYW1lJyAvPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1jbGVhciI+Q2xlYXI8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIj5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJSZWZlcmVuY2VMaXN0IiB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdyZWYtbW9kYWwgcmVmLWxpc3QnPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIGNsYXNzPSdvdXRwdXQtcmVmJyByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI21vZGFsX3ZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuSUQgfX0iIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtcmVmIHctYXV0byIgdHlwZT1idXR0b24gdmFsdWU9T3BlbiAvPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1vZGFsX3ZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuSUQgfX0iIGRhdGEtZm9jdXM9ImZhbHNlIiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0icmVmTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIj5GaW5kIENvbnRlbnQgZm9yIFJlZmVyZW5jZSBMaXN0PC9oNT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdtb2RhbC1ib2R5IG92ZXJmbG93LWluaXRpYWwnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSdkLWJsb2NrJz5Db250ZW50IFR5cGU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSdtYi0zIGZvcm0tY29udHJvbCBpbnB1dC1jb250ZW50dHlwZScgdHlwZT10ZXh0IHBsYWNlaG9sZGVyPSdTZWFyY2ggYnkgQ29udGVudCBUeXBlJyAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSdkLWJsb2NrJz5Db250ZW50IE5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRpc2FibGVkIGNsYXNzPSdtYi0zIGZvcm0tY29udHJvbCBpbnB1dC1jb250ZW50JyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IE5hbWUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLWNsZWFyIj5DbGVhcjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIGRhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J3JlZi1tb2RhbCc+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1iLTMiPjwvZGl2PgogICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICB7eyBlbmR9fQogICAgICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zJz4KICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+U2F2ZTwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZm9ybT4KCiAgICAgICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy9jb250ZW50L2RlbGV0ZScgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPWNvbnRlbnR0eXBlIHZhbHVlPSJ7eyAuQ29udGVudFR5cGUuSUQgfX0iIC8+CiAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPWNvbnRlbnQgdmFsdWU9Int7IC5Db250ZW50LklEIH19IiAvPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iZGVsZXRlTW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9ImRlbGV0ZU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImRlbGV0ZU1vZGFsTGFiZWwiPkRlbGV0ZSB7eyAoLkNvbnRlbnQuTXVzdFZhbHVlQnlOYW1lICJuYW1lIikuVmFsdWUgfX08L2g1PgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZm9ybT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2FydGljbGU+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9fZm9vdGVyLmh0bWwiIH19CiAgPC9tYWluPgogIHt7IHRlbXBsYXRlICJodG1sL19zY3JpcHRzLmh0bWwiIH19CiAgPHNjcmlwdCBzcmM9Ii9zdGF0aWMvanMvdGlueW1jZS5taW4uanMiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPScvc3RhdGljL2pzL2F1dG9jb21wbGV0ZS5taW4uanMnPjwvc2NyaXB0PgogIDxzY3JpcHQ+e3sgdGVtcGxhdGUgImpzL21haW4uanMiICQgfX08L3NjcmlwdD4KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9jb250ZW50LmpzIiAkIH19PC9zY3JpcHQ+CjwvYm9keT4KCjwvaHRtbD4K")
	tmpls["html/content.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPkNNUyB8IHt7IC5TcGFjZS5OYW1lIH19IHwge3sgLkNvbnRlbnRUeXBlLk5hbWUgfX0gfCB7eyAoLkNvbnRlbnQuTXVzdFZhbHVlQnlOYW1lICJuYW1lIikuVmFsdWUgfX08L3RpdGxlPgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSdjb250ZW50IGJnLWxpZ2h0Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8ZGl2IGNsYXNzPSJwcmljaW5nLWhlYWRlciBweC0zIHB5LTMgcHQtbWQtNSBwYi1tZC00IG14LWF1dG8gdGV4dC1jZW50ZXIiPgogICAgICA8aDEgY2xhc3M9ImRpc3BsYXktNCI+e3sgKC5Db250ZW50Lk11c3RWYWx1ZUJ5TmFtZSAibmFtZSIpLlZhbHVlIH19PC9oMT4KICAgIDwvZGl2PgogICAgPGFydGljbGUgY2xhc3M9J2NvbnRhaW5lcic+CiAgICAgIDxkaXYgY2xhc3M9J3Jvdyc+CiAgICAgICAgPGRpdiBjbGFzcz0nY29sLTEyIGNvbC1sZy04IG9mZnNldC1sZy0yJz4KICAgICAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2NvbnRlbnQnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1tZXRob2QgdmFsdWU9UEFUQ0ggLz4KICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Y29udGVudHR5cGUgdmFsdWU9Int7IC5Db250ZW50VHlwZS5JRCB9fSIgLz4KICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Y29udGVudCB2YWx1ZT0ie3sgLkNvbnRlbnQuSUQgfX0iIC8+CgogICAgICAgICAgICB7eyByYW5nZSAkaW5kZXgsICRpdGVtIDo9IC5Db250ZW50VHlwZS5GaWVsZHMgfX0KICAgICAgICAgICAgICB7eyAkdmFsIDo9ICQuQ29udGVudC5NdXN0VmFsdWVCeU5hbWUgKCAkaXRlbS5OYW1lICkgfX0KCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nZm9ybS1ncm91cCc+CiAgICAgICAgICAgICAge3sgaWYgJHZhbCB9fSAKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSI+e3sgdGl0bGUgJHZhbC5OYW1lIH19PC9sYWJlbD4KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAkdmFsLlR5cGUgIlN0cmluZ1NtYWxsIiB9fQogICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCIge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiB2YWx1ZT0ie3sgJHZhbC5WYWx1ZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgcGxhY2Vob2xkZXI9Int7ICR2YWwuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxICR2YWwuVHlwZSAiU3RyaW5nQmlnIiB9fQogICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCIge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBwbGFjZWhvbGRlcj0ie3sgJHZhbC5OYW1lIH19Ij57eyAkdmFsLlZhbHVlIH19PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxICR2YWwuVHlwZSAiSW5wdXRIVE1MIiB9fQogICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1odG1sIiB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIHZhbHVlPSJ7eyAkdmFsLlZhbHVlIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBwbGFjZWhvbGRlcj0ie3sgJHZhbC5OYW1lIH19Ij57eyAkdmFsLlZhbHVlIH19PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxICR2YWwuVHlwZSAiSW5wdXRNYXJrZG93biIgfX0KICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtbWFya2Rvd24iIHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgdmFsdWU9Int7ICR2YWwuVmFsdWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIHBsYWNlaG9sZGVyPSJ7eyAkdmFsLk5hbWUgfX0iPnt7ICR2YWwuVmFsdWUgfX08L3RleHRhcmVhPgogICAgICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICAgICAge3sgaWYgZXEgJHZhbC5UeXBlICJGaWxlIiB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWZpbGUgbWItMyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gbmFtZT0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiB2YWx1ZT0ie3sgJHZhbC5WYWx1ZSB9fSIgcmVxdWlyZWQgbXVsdGlwbGU9ZmFsc2UgdHlwZT0iZmlsZSIgY2xhc3M9ImZvcm0tZmlsZS1pbnB1dCI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWZpbGUtbGFiZWwiIGZvcj0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19Ij4KICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb3JtLWZpbGUtdGV4dCI+Q2hvb3NlIGZpbGUuLi48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZm9ybS1maWxlLWJ1dHRvbiI+QnJvd3NlPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICAgICAge3sgaWYgZXEgJHZhbC5UeXBlICJEYXRlIiB9fQogICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCIge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiB2YWx1ZT0ie3sgJHZhbC5WYWx1ZSB9fSIgcmVxdWlyZWQgdHlwZT1kYXRlIG5hbWU9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgcGxhY2Vob2xkZXI9Int7ICR2YWwuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxICR2YWwuVHlwZSAiUmVmZXJlbmNlIiB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdyZWYtbW9kYWwnPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIGNsYXNzPSdvdXRwdXQtcmVmJyByZXF1aXJlZCB0eXBlPWhpZGRlbiB2YWx1ZT0ie3sgJHZhbC5WYWx1ZSB9fSIgbmFtZT0idmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNtb2RhbF92YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtcmVmIHctYXV0byIgdHlwZT1idXR0b24gdmFsdWU9Int7IGlmICAkdmFsLlJlZk5hbWUgfX17eyAkdmFsLlJlZk5hbWUgfX17eyBlbHNlIH19T3Blbnt7IGVuZH19Ii8+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibW9kYWxfdmFsdWVfdXBkYXRlX3t7ICR2YWwuVHlwZSB9fS17eyAkdmFsLklEIH19IiBkYXRhLWZvY3VzPSJmYWxzZSIgY2xhc3M9Im1vZGFsIGZhZGUiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9InJlZk1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSI+RmluZCBDb250ZW50IGZvciBSZWZlcmVuY2U8L2g1PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzLWlubmVyPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWJvZHkgb3ZlcmZsb3ctaW5pdGlhbCc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9J2QtYmxvY2snPkNvbnRlbnQgVHlwZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnR0eXBlJyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IFR5cGUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9J2QtYmxvY2snPkNvbnRlbnQgTmFtZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGlzYWJsZWQgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnQnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgTmFtZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSBidG4tY2xlYXIiPkNsZWFyPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgZGF0YS1kaXNtaXNzLWlubmVyPSJtb2RhbCI+R288L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAkdmFsLlR5cGUgIlJlZmVyZW5jZUxpc3QiIH19CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J3JlZi1tb2RhbCByZWYtbGlzdCc+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgY2xhc3M9J291dHB1dC1yZWYnIHJlcXVpcmVkIHR5cGU9aGlkZGVuIHZhbHVlPSJ7eyAkdmFsLlZhbHVlIH19IiBuYW1lPSJ2YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNtb2RhbF92YWx1ZV91cGRhdGVfe3sgJHZhbC5UeXBlIH19LXt7ICR2YWwuSUQgfX0iIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtcmVmIHctYXV0byIgdHlwZT1idXR0b24gdmFsdWU9Int7IGlmICAkdmFsLlJlZkxpc3ROYW1lcyB9fXt7ICR2YWwuUmVmTGlzdE5hbWVzIH19e3sgZWxzZSB9fU9wZW57eyBlbmR9fSIvPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1vZGFsX3ZhbHVlX3VwZGF0ZV97eyAkdmFsLlR5cGUgfX0te3sgJHZhbC5JRCB9fSIgZGF0YS1mb2N1cz0iZmFsc2UiIGNsYXNzPSJtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJyZWZNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiPkZpbmQgQ29udGVudCBmb3IgUmVmZXJlbmNlIExpc3Q8L2g1PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzLWlubmVyPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWJvZHkgb3ZlcmZsb3ctaW5pdGlhbCc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9J2QtYmxvY2snPkNvbnRlbnQgVHlwZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnR0eXBlJyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IFR5cGUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9J2QtYmxvY2snPkNvbnRlbnQgTmFtZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGlzYWJsZWQgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnQnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgTmFtZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSBidG4tY2xlYXIiPkNsZWFyPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgZGF0YS1kaXNtaXNzLWlubmVyPSJtb2RhbCI+R288L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1iLTMiPjwvZGl2PgogICAgICAgICAgICAgIHt7IGVsc2UgfX0KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuTmFtZSB9fSI+e3sgdGl0bGUgLk5hbWUgfX08L2xhYmVsPgoKICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdTbWFsbCIgfX0KICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiU3RyaW5nQmlnIiB9fQogICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCIge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHBsYWNlaG9sZGVyPSJ7eyAuTmFtZSB9fSIgPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiSW5wdXRIVE1MIiB9fQogICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1odG1sIiB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IC5OYW1lIH19IiA+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJJbnB1dE1hcmtkb3duIiB9fQogICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1tYXJrZG93biIge3sgaWYgZXEgJGluZGV4IDAgfX0gYXV0b2ZvY3VzIHt7IGVuZCB9fSBpZD0idmFsdWVfdXBkYXRlX3t7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHBsYWNlaG9sZGVyPSJ7eyAuTmFtZSB9fSIgPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiRmlsZSIgfX0KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1maWxlIG1iLTMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCBtdWx0aXBsZT1mYWxzZSB0eXBlPSJmaWxlIiBjbGFzcz0iZm9ybS1maWxlLWlucHV0Ij4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tZmlsZS1sYWJlbCIgZm9yPSJ2YWx1ZV91cGRhdGVfe3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iPgogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZvcm0tZmlsZS10ZXh0Ij5DaG9vc2UgZmlsZS4uLjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb3JtLWZpbGUtYnV0dG9uIj5Ccm93c2U8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiRGF0ZSIgfX0KICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIHt7IGlmIGVxICRpbmRleCAwIH19IGF1dG9mb2N1cyB7eyBlbmQgfX0gaWQ9InZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT1kYXRlIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KCiAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiUmVmZXJlbmNlIiB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdyZWYtbW9kYWwnPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIGNsYXNzPSdvdXRwdXQtcmVmJyByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI21vZGFsX3ZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuSUQgfX0iIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtcmVmIHctYXV0byIgdHlwZT1idXR0b24gdmFsdWU9T3BlbiAvPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1vZGFsX3ZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuSUQgfX0iIGRhdGEtZm9jdXM9ImZhbHNlIiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0icmVmTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIj5GaW5kIENvbnRlbnQgZm9yIFJlZmVyZW5jZTwvaDU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nbW9kYWwtYm9keSBvdmVyZmxvdy1pbml0aWFsJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0nZC1ibG9jayc+Q29udGVudCBUeXBlPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0nbWItMyBmb3JtLWNvbnRyb2wgaW5wdXQtY29udGVudHR5cGUnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgVHlwZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0nZC1ibG9jayc+Q29udGVudCBOYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBkaXNhYmxlZCBjbGFzcz0nbWItMyBmb3JtLWNvbnRyb2wgaW5wdXQtY29udGVudCcgdHlwZT10ZXh0IHBsYWNlaG9sZGVyPSdTZWFyY2ggYnkgQ29udGVudCBOYW1lJyAvPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1jbGVhciI+Q2xlYXI8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIj5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJSZWZlcmVuY2VMaXN0IiB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdyZWYtbW9kYWwgcmVmLWxpc3QnPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB7eyBpZiBlcSAkaW5kZXggMCB9fSBhdXRvZm9jdXMge3sgZW5kIH19IGlkPSJ2YWx1ZV91cGRhdGVfe3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIGNsYXNzPSdvdXRwdXQtcmVmJyByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI21vZGFsX3ZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuSUQgfX0iIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtcmVmIHctYXV0byIgdHlwZT1idXR0b24gdmFsdWU9T3BlbiAvPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1vZGFsX3ZhbHVlX3VwZGF0ZV97eyAuVHlwZSB9fS17eyAuSUQgfX0iIGRhdGEtZm9jdXM9ImZhbHNlIiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0icmVmTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIj5GaW5kIENvbnRlbnQgZm9yIFJlZmVyZW5jZSBMaXN0PC9oNT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdtb2RhbC1ib2R5IG92ZXJmbG93LWluaXRpYWwnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSdkLWJsb2NrJz5Db250ZW50IFR5cGU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSdtYi0zIGZvcm0tY29udHJvbCBpbnB1dC1jb250ZW50dHlwZScgdHlwZT10ZXh0IHBsYWNlaG9sZGVyPSdTZWFyY2ggYnkgQ29udGVudCBUeXBlJyAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSdkLWJsb2NrJz5Db250ZW50IE5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRpc2FibGVkIGNsYXNzPSdtYi0zIGZvcm0tY29udHJvbCBpbnB1dC1jb250ZW50JyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IE5hbWUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLWNsZWFyIj5DbGVhcjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIGRhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J3JlZi1tb2RhbCc+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1iLTMiPjwvZGl2PgogICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICB7eyBlbmR9fQogICAgICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zJz4KICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+U2F2ZTwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZm9ybT4KCiAgICAgICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy9jb250ZW50JyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9bWV0aG9kIHZhbHVlPURFTEVURSAvPgogICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1zcGFjZSB2YWx1ZT0ie3sgLlNwYWNlLklEIH19IiAvPgogICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1jb250ZW50dHlwZSB2YWx1ZT0ie3sgLkNvbnRlbnRUeXBlLklEIH19IiAvPgogICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1jb250ZW50IHZhbHVlPSJ7eyAuQ29udGVudC5JRCB9fSIgLz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImRlbGV0ZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJkZWxldGVNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJkZWxldGVNb2RhbExhYmVsIj5EZWxldGUge3sgKC5Db250ZW50Lk11c3RWYWx1ZUJ5TmFtZSAibmFtZSIpLlZhbHVlIH19PC9oNT4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9hcnRpY2xlPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQogIDxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL3RpbnltY2UubWluLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0nL3N0YXRpYy9qcy9hdXRvY29tcGxldGUubWluLmpzJz48L3NjcmlwdD4KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9tYWluLmpzIiAkIH19PC9zY3JpcHQ+CiAgPHNjcmlwdD57eyB0ZW1wbGF0ZSAianMvY29udGVudC5qcyIgJCB9fTwvc2NyaXB0Pgo8L2JvZHk+Cgo8L2h0bWw+Cg==")

	tmpls["html/contenttype.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+Cgo8aGVhZD4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZC5odG1sIiB9fQogIDx0aXRsZT5DTVMgfCB7eyAuU3BhY2UuTmFtZSB9fSB8IHt7IC5Db250ZW50VHlwZS5OYW1lIH19PC90aXRsZT4KPC9oZWFkPgoKPGJvZHkgY2xhc3M9J2NvbnRlbnR0eXBlIGJnLWxpZ2h0Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8ZGl2IGNsYXNzPSJwcmljaW5nLWhlYWRlciBweC0zIHB5LTMgcHQtbWQtNSBwYi1tZC00IG14LWF1dG8gdGV4dC1jZW50ZXIiPgogICAgICA8aDEgY2xhc3M9ImRpc3BsYXktNCI+e3suQ29udGVudFR5cGUuTmFtZX19PC9oMT4KICAgIDwvZGl2PgogICAgPGFydGljbGU+CiAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2NvbnRlbnR0eXBlL2RlbGV0ZScgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1jb250ZW50dHlwZSB2YWx1ZT0ie3sgLkNvbnRlbnRUeXBlLklEIH19IiAvPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJkZWxldGVNb2RhbCIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0iZGVsZXRlTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJkZWxldGVNb2RhbExhYmVsIj5EZWxldGUge3suQ29udGVudFR5cGUuTmFtZX19PC9oNT4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Zvcm0+CgogICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy9jb250ZW50L25ldycgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1jb250ZW50dHlwZSB2YWx1ZT0ie3sgLkNvbnRlbnRUeXBlLklEIH19IiAvPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJjcmVhdGVNb2RhbCIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0iY3JlYXRlTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtbGcgbW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJjcmVhdGVNb2RhbExhYmVsIj5DcmVhdGUgYSBuZXcge3suQ29udGVudFR5cGUuTmFtZX19IGNvbnRlbnQ8L2g1PgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAge3sgcmFuZ2UgJGluZGV4IDo9IC5Db250ZW50VHlwZS5GaWVsZHMgfX0KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nZm9ybS1ncm91cCBtYi0zJz4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iPnt7dGl0bGUgLk5hbWV9fTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIlN0cmluZ1NtYWxsIiB9fQogICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IHRpdGxlIC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdCaWciIH19CiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgdGl0bGUgLk5hbWUgfX0iID48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJJbnB1dEhUTUwiIH19CiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1odG1sIiBpZD0iY3JlYXRlLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHBsYWNlaG9sZGVyPSJ7eyB0aXRsZSAuTmFtZSB9fSIgPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIklucHV0TWFya2Rvd24iIH19CiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1tYXJrZG93biIgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgdGl0bGUgLk5hbWUgfX0iID48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJGaWxlIiB9fQogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1maWxlIG1iLTMiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIG11bHRpcGxlPWZhbHNlIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9ImZpbGUiIGNsYXNzPSJmb3JtLWZpbGUtaW5wdXQiIGlkPSJpbnB1dEdyb3VwRmlsZUFkZG9ue3sgJGluZGV4IH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWZpbGUtbGFiZWwiIGZvcj0iaW5wdXRHcm91cEZpbGVBZGRvbnt7ICRpbmRleCB9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZvcm0tZmlsZS10ZXh0Ij5DaG9vc2UgZmlsZS4uLjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZm9ybS1maWxlLWJ1dHRvbiI+QnJvd3NlPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIkRhdGUiIH19CiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT1kYXRlIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgdGl0bGUgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIlJlZmVyZW5jZSIgfX0KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J3JlZi1tb2RhbCc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iY3JlYXRlLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBjbGFzcz0nb3V0cHV0LXJlZicgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjcmVmLW1vZGFsLXt7IC5UeXBlIH19LXt7IC5JRCB9fSIgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1yZWYgdy1hdXRvIiB0eXBlPWJ1dHRvbiB2YWx1ZT1PcGVuIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1mb2N1cz0iZmFsc2UiIGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0icmVmLW1vZGFsLXt7IC5UeXBlIH19LXt7IC5JRCB9fSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0icmVmTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9InJlZi1tb2RhbC1sYWJlbC17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSI+RmluZCBDb250ZW50IGZvciBSZWZlcmVuY2U8L2g1PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nbW9kYWwtYm9keSBvdmVyZmxvdy1pbml0aWFsJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSdzZWFyY2gtY3Qte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0nIGNsYXNzPSdkLWJsb2NrJz5Db250ZW50IFR5cGU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0nc2VhcmNoLWN0LXt7IC5UeXBlIH19LXt7IC5OYW1lIH19JyBjbGFzcz0nbWItMyBmb3JtLWNvbnRyb2wgaW5wdXQtY29udGVudHR5cGUnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgVHlwZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSdzZWFyY2gtYy17eyAuVHlwZSB9fS17eyAuTmFtZSB9fScgY2xhc3M9J2QtYmxvY2snPkNvbnRlbnQgTmFtZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSdzZWFyY2gtYy17eyAuVHlwZSB9fS17eyAuTmFtZSB9fScgZGlzYWJsZWQgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnQnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgTmFtZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSBidG4tY2xlYXIiPkNsZWFyPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIGRhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICAgICAge3sgaWYgZXEgLlR5cGUgIlJlZmVyZW5jZUxpc3QiIH19CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdyZWYtbW9kYWwgcmVmLWxpc3QnPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgY2xhc3M9J291dHB1dC1yZWYnIHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI3JlZi1tb2RhbC17eyAuVHlwZSB9fS17eyAuSUQgfX0iIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtcmVmIHctYXV0byIgdHlwZT1idXR0b24gdmFsdWU9T3BlbiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtZm9jdXM9ImZhbHNlIiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9InJlZi1tb2RhbC17eyAuVHlwZSB9fS17eyAuSUQgfX0iIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9InJlZk1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJyZWYtbW9kYWwtbGFiZWwte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iPkZpbmQgQ29udGVudCBmb3IgUmVmZXJlbmNlIExpc3Q8L2g1PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nbW9kYWwtYm9keSBvdmVyZmxvdy1pbml0aWFsJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSdzZWFyY2gtY3Qte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0nIGNsYXNzPSdkLWJsb2NrJz5Db250ZW50IFR5cGU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0nc2VhcmNoLWN0LXt7IC5UeXBlIH19LXt7IC5OYW1lIH19JyBjbGFzcz0nbWItMyBmb3JtLWNvbnRyb2wgaW5wdXQtY29udGVudHR5cGUnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgVHlwZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSdzZWFyY2gtYy17eyAuVHlwZSB9fS17eyAuTmFtZSB9fScgY2xhc3M9J2QtYmxvY2snPkNvbnRlbnQgTmFtZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSdzZWFyY2gtYy17eyAuVHlwZSB9fS17eyAuTmFtZSB9fScgZGlzYWJsZWQgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnQnIHR5cGU9dGV4dCBwbGFjZWhvbGRlcj0nU2VhcmNoIGJ5IENvbnRlbnQgTmFtZScgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSBidG4tY2xlYXIiPkNsZWFyPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIGRhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9mb3JtPgoKICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvY29udGVudHR5cGUvdXBkYXRlJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1zcGFjZSB2YWx1ZT0ie3sgLlNwYWNlLklEIH19IiAvPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPWNvbnRlbnR0eXBlIHZhbHVlPSJ7eyAuQ29udGVudFR5cGUuSUQgfX0iIC8+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9InVwZGF0ZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJVcGRhdGUge3suQ29udGVudFR5cGUuTmFtZX19IiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImNvbnRlbnR0eXBlTW9kYWxMYWJlbCI+VXBkYXRlIHt7LkNvbnRlbnRUeXBlLk5hbWV9fTwvaDU+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjb250ZW50dHlwZU5hbWUiPk5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IHZhbHVlPSJ7ey5Db250ZW50VHlwZS5OYW1lfX0iIG5hbWU9bmFtZSB0eXBlPXRleHQgaWQ9ImNvbnRlbnR0eXBlTmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iTmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICB7eyByYW5nZSAkaW5kZXgsICRpdGVtIDo9IC5Db250ZW50VHlwZS5GaWVsZHMgfX0KICAgICAgICAgICAgICAgICAgICB7eyBpZiBlcSAkaW5kZXggMCB9fQogICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0nZmlyc3QtZmllbGRzZXQnIGNsYXNzPSdjb250YWluZXItZmx1aWQgcHgtMCBtYi0zJz4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZmllbGRzZXRGaXJzdCI+RmllbGRzPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9ImZpZWxkX3VwZGF0ZV9pZF97eyBpbmMgJGluZGV4IH19IiB2YWx1ZT0ie3sgLklEIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiByZWFkb25seT0icmVhZG9ubHkiIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJmaWVsZF91cGRhdGVfbmFtZV97eyBpbmMgJGluZGV4IH19IiB2YWx1ZT0ie3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAgcm93Jz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtNic+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJ3LTEwMCBmb3JtLWNvbnRyb2wiIHZhbHVlPSJ7eyAuVHlwZSB9fSIgcmVhZG9ubHk9InJlYWRvbmx5IiByZXF1aXJlZCBuYW1lPSJmaWVsZF91cGRhdGVfdHlwZV97eyBpbmMgJGluZGV4IH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT5GaWVsZCBUeXBlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gc2VsZWN0ZWQgdmFsdWU9IlN0cmluZ1NtYWxsIj5TdHJpbmcgU21hbGw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iU3RyaW5nQmlnIj5TdHJpbmcgQmlnPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IklucHV0SFRNTCI+SFRNTDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJJbnB1dE1hcmtkb3duIj5NYXJrZG93bjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJGaWxlIj5GaWxlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IkRhdGUiPkRhdGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iUmVmZXJlbmNlIj5SZWZlcmVuY2U8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iUmVmZXJlbmNlTGlzdCI+UmVmZXJlbmNlTGlzdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nY29sLTYnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ndy0xMDAgYnRuIGJ0bi1wcmltYXJ5JyBkaXNhYmxlZCB0eXBlPWJ1dHRvbj5SZW1vdmUgRmllbGQ8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICB7eyBlbHNlIH19CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb250YWluZXItZmx1aWQgcHgtMCBtYi0zJz4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9ImZpZWxkX3VwZGF0ZV9pZF97eyBpbmMgJGluZGV4IH19IiB2YWx1ZT0ie3sgLklEIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0iZmllbGRfdXBkYXRlX25hbWVfe3sgaW5jICRpbmRleCB9fSIgdmFsdWU9Int7IC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdmb3JtLWdyb3VwIHJvdyc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nY29sLTYnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0idy0xMDAgZm9ybS1jb250cm9sIiB2YWx1ZT0ie3sgLlR5cGUgfX0iIHJlYWRvbmx5PSJyZWFkb25seSIgcmVxdWlyZWQgbmFtZT0iZmllbGRfdXBkYXRlX3R5cGVfe3sgaW5jICRpbmRleCB9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU+RmllbGQgVHlwZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdTbWFsbCIgfX0gICBzZWxlY3RlZCB7eyBlbHNlIH19IGRpc2FibGVkIHt7IGVuZCB9fSB2YWx1ZT0iU3RyaW5nU21hbGwiPlN0cmluZyBTbWFsbDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdCaWciIH19ICAgICBzZWxlY3RlZCB7eyBlbHNlIH19IGRpc2FibGVkIHt7IGVuZCB9fSB2YWx1ZT0iU3RyaW5nQmlnIj5TdHJpbmcgQmlnPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIklucHV0SFRNTCIgfX0gICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJJbnB1dEhUTUwiPkhUTUw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiSW5wdXRNYXJrZG93biIgfX0gc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IklucHV0TWFya2Rvd24iPk1hcmtkb3duPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIkZpbGUiIH19ICAgICAgICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJGaWxlIj5GaWxlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIkRhdGUiIH19ICAgICAgICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJEYXRlIj5EYXRlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIlJlZmVyZW5jZSIgfX0gICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJSZWZlcmVuY2UiPlJlZmVyZW5jZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHt7IGlmIGVxIC5UeXBlICJSZWZlcmVuY2VMaXN0IiB9fSBzZWxlY3RlZCB7eyBlbHNlIH19IGRpc2FibGVkIHt7IGVuZCB9fSB2YWx1ZT0iUmVmZXJlbmNlTGlzdCI+UmVmZXJlbmNlTGlzdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nY29sLTYnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ndy0xMDAgYnRuIGJ0bi1wcmltYXJ5IGJ0bi1yZW1vdmUnIHR5cGU9YnV0dG9uPlJlbW92ZSBGaWVsZDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxhIGhyZWY9JyMnIGNsYXNzPSdidG4gYnRuLWxpbmsnIGlkPSdhZGQtZmllbGRidG4nPkFkZCBBbm90aGVyIEZpZWxkPC9hPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KCiAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0ncm93Jz4KICAgICAgICAgIDxkaXYgY2xhc3M9J29mZnNldC1sZy0zIGNvbC1sZy02Jz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibXktMyBwLTMgYmctd2hpdGUgcm91bmRlZCBzaGFkb3ctc20iPgogICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPSJkLWJsb2NrIHRleHQtcmlnaHQgZmxvYXQtcmlnaHQiIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNjcmVhdGVNb2RhbCI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPkNyZWF0ZSBhIG5ldyBjb250ZW50PC9hPgogICAgICAgICAgICAgICAgPC9zbWFsbD4KICAgICAgICAgICAgICAgIDxoNiBjbGFzcz0iYm9yZGVyLWJvdHRvbSBib3JkZXItZ3JheSBwYi0yIG1iLTAiPllvdXIge3suQ29udGVudFR5cGUuTmFtZX19IGNvbnRlbnQ8L2g2PgogICAgICAgICAgICAgIHt7IGlmIC5Db250ZW50TGlzdC5MaXN0IH19CiAgICAgICAgICAgICAgICB7eyByYW5nZSAuQ29udGVudExpc3QuTGlzdCB9fQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVkaWEgdGV4dC1tdXRlZCBwdC0zIj4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0nL2NvbnRlbnQve3sgJC5TcGFjZS5JRCB9fS97eyAkLkNvbnRlbnRUeXBlLklEIH19L3t7IC5JRCB9fScgIGNsYXNzPSJkLWJsb2NrIG1lZGlhLWJvZHkgcGItMyBtYi0wIHNtYWxsIGxoLTEyNSBib3JkZXItYm90dG9tIGJvcmRlci1ncmF5Ij4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJkLWJsb2NrIHRleHQtZ3JheS1kYXJrIj4KICAgICAgICAgICAgICAgICAgICAgIHt7ICguTXVzdFZhbHVlQnlOYW1lICJuYW1lIikuVmFsdWUgfX0KICAgICAgICAgICAgICAgICAgICA8L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgIHt7IGlmIC5Db250ZW50TGlzdC5Nb3JlIH19CiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9ImQtYmxvY2sgdGV4dC1yaWdodCBtdC0zIj4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL2NvbnRlbnR0eXBlL3t7IC5TcGFjZS5JRCB9fS97eyAuQ29udGVudFR5cGUuSUQgfX0/YmVmb3JlPXt7IC5Db250ZW50TGlzdC5CZWZvcmUgfX0iPkxvYWQgbW9yZTwvYT4KICAgICAgICAgICAgICAgIDwvc21hbGw+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICB7eyBlbHNlIH19CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtdC0zIGFsZXJ0IGFsZXJ0LXByaW1hcnkiIHJvbGU9ImFsZXJ0Ij4KICAgICAgICAgICAgICAgICAgWW91IGhhdmVuJ3QgY3JlYXRlZCBhbnkgY29udGVudCB5ZXQuIAogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9hcnRpY2xlPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQogIDxzY3JpcHQgc3JjPScvc3RhdGljL2pzL3RpbnltY2UubWluLmpzJz48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0nL3N0YXRpYy9qcy9hdXRvY29tcGxldGUubWluLmpzJz48L3NjcmlwdD4KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9tYWluLmpzIiAkIH19PC9zY3JpcHQ+CiAgPHNjcmlwdD57eyB0ZW1wbGF0ZSAianMvc3BhY2UuanMiICQgfX08L3NjcmlwdD4KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9jb250ZW50LmpzIiAkIH19PC9zY3JpcHQ+CjwvYm9keT4KCjwvaHRtbD4K")
	tmpls["html/contenttype.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+Cgo8aGVhZD4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZC5odG1sIiB9fQogIDx0aXRsZT5DTVMgfCB7eyAuU3BhY2UuTmFtZSB9fSB8IHt7IC5Db250ZW50VHlwZS5OYW1lIH19PC90aXRsZT4KPC9oZWFkPgoKPGJvZHkgY2xhc3M9J2NvbnRlbnR0eXBlIGJnLWxpZ2h0Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8ZGl2IGNsYXNzPSJwcmljaW5nLWhlYWRlciBweC0zIHB5LTMgcHQtbWQtNSBwYi1tZC00IG14LWF1dG8gdGV4dC1jZW50ZXIiPgogICAgICA8aDEgY2xhc3M9ImRpc3BsYXktNCI+e3suQ29udGVudFR5cGUuTmFtZX19PC9oMT4KICAgIDwvZGl2PgogICAgPGFydGljbGU+CiAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2NvbnRlbnR0eXBlJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1tZXRob2QgdmFsdWU9REVMRVRFIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1jb250ZW50dHlwZSB2YWx1ZT0ie3sgLkNvbnRlbnRUeXBlLklEIH19IiAvPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJkZWxldGVNb2RhbCIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0iZGVsZXRlTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJkZWxldGVNb2RhbExhYmVsIj5EZWxldGUge3suQ29udGVudFR5cGUuTmFtZX19PC9oNT4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Zvcm0+CgogICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy9jb250ZW50JyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1tZXRob2QgdmFsdWU9UE9TVCAvPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Y29udGVudHR5cGUgdmFsdWU9Int7IC5Db250ZW50VHlwZS5JRCB9fSIgLz4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iY3JlYXRlTW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9ImNyZWF0ZU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWxnIG1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0iY3JlYXRlTW9kYWxMYWJlbCI+Q3JlYXRlIGEgbmV3IHt7LkNvbnRlbnRUeXBlLk5hbWV9fSBjb250ZW50PC9oNT4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgIHt7IHJhbmdlICRpbmRleCA6PSAuQ29udGVudFR5cGUuRmllbGRzIH19CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAgbWItMyc+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY3JlYXRlLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19Ij57e3RpdGxlIC5OYW1lfX08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdTbWFsbCIgfX0KICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iZm9ybS1jb250cm9sIiBpZD0iY3JlYXRlLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHBsYWNlaG9sZGVyPSJ7eyB0aXRsZSAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiU3RyaW5nQmlnIiB9fQogICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IHRpdGxlIC5OYW1lIH19IiA+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiSW5wdXRIVE1MIiB9fQogICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtaHRtbCIgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgdGl0bGUgLk5hbWUgfX0iID48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJJbnB1dE1hcmtkb3duIiB9fQogICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtbWFya2Rvd24iIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IHRpdGxlIC5OYW1lIH19IiA+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiRmlsZSIgfX0KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZmlsZSBtYi0zIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBtdWx0aXBsZT1mYWxzZSBpZD0iY3JlYXRlLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPSJmaWxlIiBjbGFzcz0iZm9ybS1maWxlLWlucHV0IiBpZD0iaW5wdXRHcm91cEZpbGVBZGRvbnt7ICRpbmRleCB9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1maWxlLWxhYmVsIiBmb3I9ImlucHV0R3JvdXBGaWxlQWRkb257eyAkaW5kZXggfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb3JtLWZpbGUtdGV4dCI+Q2hvb3NlIGZpbGUuLi48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZvcm0tZmlsZS1idXR0b24iPkJyb3dzZTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJEYXRlIiB9fQogICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9ZGF0ZSBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IHRpdGxlIC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJSZWZlcmVuY2UiIH19CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdyZWYtbW9kYWwnPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgY2xhc3M9J291dHB1dC1yZWYnIHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI3JlZi1tb2RhbC17eyAuVHlwZSB9fS17eyAuSUQgfX0iIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtcmVmIHctYXV0byIgdHlwZT1idXR0b24gdmFsdWU9T3BlbiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtZm9jdXM9ImZhbHNlIiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9InJlZi1tb2RhbC17eyAuVHlwZSB9fS17eyAuSUQgfX0iIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9InJlZk1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJyZWYtbW9kYWwtbGFiZWwte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iPkZpbmQgQ29udGVudCBmb3IgUmVmZXJlbmNlPC9oNT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWJvZHkgb3ZlcmZsb3ctaW5pdGlhbCc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0nc2VhcmNoLWN0LXt7IC5UeXBlIH19LXt7IC5OYW1lIH19JyBjbGFzcz0nZC1ibG9jayc+Q29udGVudCBUeXBlPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9J3NlYXJjaC1jdC17eyAuVHlwZSB9fS17eyAuTmFtZSB9fScgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnR0eXBlJyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IFR5cGUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0nc2VhcmNoLWMte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0nIGNsYXNzPSdkLWJsb2NrJz5Db250ZW50IE5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0nc2VhcmNoLWMte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0nIGRpc2FibGVkIGNsYXNzPSdtYi0zIGZvcm0tY29udHJvbCBpbnB1dC1jb250ZW50JyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IE5hbWUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLWNsZWFyIj5DbGVhcjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIj5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJSZWZlcmVuY2VMaXN0IiB9fQogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ncmVmLW1vZGFsIHJlZi1saXN0Jz4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIGNsYXNzPSdvdXRwdXQtcmVmJyByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNyZWYtbW9kYWwte3sgLlR5cGUgfX0te3sgLklEIH19IiBjbGFzcz0iZm9ybS1jb250cm9sIGlucHV0LXJlZiB3LWF1dG8iIHR5cGU9YnV0dG9uIHZhbHVlPU9wZW4gLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWZvY3VzPSJmYWxzZSIgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJyZWYtbW9kYWwte3sgLlR5cGUgfX0te3sgLklEIH19IiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJyZWZNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0icmVmLW1vZGFsLWxhYmVsLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19Ij5GaW5kIENvbnRlbnQgZm9yIFJlZmVyZW5jZSBMaXN0PC9oNT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWJvZHkgb3ZlcmZsb3ctaW5pdGlhbCc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0nc2VhcmNoLWN0LXt7IC5UeXBlIH19LXt7IC5OYW1lIH19JyBjbGFzcz0nZC1ibG9jayc+Q29udGVudCBUeXBlPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9J3NlYXJjaC1jdC17eyAuVHlwZSB9fS17eyAuTmFtZSB9fScgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnR0eXBlJyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IFR5cGUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0nc2VhcmNoLWMte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0nIGNsYXNzPSdkLWJsb2NrJz5Db250ZW50IE5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0nc2VhcmNoLWMte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0nIGRpc2FibGVkIGNsYXNzPSdtYi0zIGZvcm0tY29udHJvbCBpbnB1dC1jb250ZW50JyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IE5hbWUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLWNsZWFyIj5DbGVhcjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIj5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KCiAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2NvbnRlbnR0eXBlJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1tZXRob2QgdmFsdWU9UEFUQ0ggLz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1zcGFjZSB2YWx1ZT0ie3sgLlNwYWNlLklEIH19IiAvPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPWNvbnRlbnR0eXBlIHZhbHVlPSJ7eyAuQ29udGVudFR5cGUuSUQgfX0iIC8+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9InVwZGF0ZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJVcGRhdGUge3suQ29udGVudFR5cGUuTmFtZX19IiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImNvbnRlbnR0eXBlTW9kYWxMYWJlbCI+VXBkYXRlIHt7LkNvbnRlbnRUeXBlLk5hbWV9fTwvaDU+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjb250ZW50dHlwZU5hbWUiPk5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IHZhbHVlPSJ7ey5Db250ZW50VHlwZS5OYW1lfX0iIG5hbWU9bmFtZSB0eXBlPXRleHQgaWQ9ImNvbnRlbnR0eXBlTmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iTmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICB7eyByYW5nZSAkaW5kZXgsICRpdGVtIDo9IC5Db250ZW50VHlwZS5GaWVsZHMgfX0KICAgICAgICAgICAgICAgICAgICB7eyBpZiBlcSAkaW5kZXggMCB9fQogICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0nZmlyc3QtZmllbGRzZXQnIGNsYXNzPSdjb250YWluZXItZmx1aWQgcHgtMCBtYi0zJz4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZmllbGRzZXRGaXJzdCI+RmllbGRzPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9ImZpZWxkX3VwZGF0ZV9pZF97eyBpbmMgJGluZGV4IH19IiB2YWx1ZT0ie3sgLklEIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiByZWFkb25seT0icmVhZG9ubHkiIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJmaWVsZF91cGRhdGVfbmFtZV97eyBpbmMgJGluZGV4IH19IiB2YWx1ZT0ie3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAgcm93Jz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtNic+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJ3LTEwMCBmb3JtLWNvbnRyb2wiIHZhbHVlPSJ7eyAuVHlwZSB9fSIgcmVhZG9ubHk9InJlYWRvbmx5IiByZXF1aXJlZCBuYW1lPSJmaWVsZF91cGRhdGVfdHlwZV97eyBpbmMgJGluZGV4IH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT5GaWVsZCBUeXBlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gc2VsZWN0ZWQgdmFsdWU9IlN0cmluZ1NtYWxsIj5TdHJpbmcgU21hbGw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iU3RyaW5nQmlnIj5TdHJpbmcgQmlnPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IklucHV0SFRNTCI+SFRNTDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJJbnB1dE1hcmtkb3duIj5NYXJrZG93bjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJGaWxlIj5GaWxlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IkRhdGUiPkRhdGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iUmVmZXJlbmNlIj5SZWZlcmVuY2U8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iUmVmZXJlbmNlTGlzdCI+UmVmZXJlbmNlTGlzdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nY29sLTYnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ndy0xMDAgYnRuIGJ0bi1wcmltYXJ5JyBkaXNhYmxlZCB0eXBlPWJ1dHRvbj5SZW1vdmUgRmllbGQ8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICB7eyBlbHNlIH19CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb250YWluZXItZmx1aWQgcHgtMCBtYi0zJz4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9ImZpZWxkX3VwZGF0ZV9pZF97eyBpbmMgJGluZGV4IH19IiB2YWx1ZT0ie3sgLklEIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0iZmllbGRfdXBkYXRlX25hbWVfe3sgaW5jICRpbmRleCB9fSIgdmFsdWU9Int7IC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdmb3JtLWdyb3VwIHJvdyc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nY29sLTYnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0idy0xMDAgZm9ybS1jb250cm9sIiB2YWx1ZT0ie3sgLlR5cGUgfX0iIHJlYWRvbmx5PSJyZWFkb25seSIgcmVxdWlyZWQgbmFtZT0iZmllbGRfdXBkYXRlX3R5cGVfe3sgaW5jICRpbmRleCB9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU+RmllbGQgVHlwZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdTbWFsbCIgfX0gICBzZWxlY3RlZCB7eyBlbHNlIH19IGRpc2FibGVkIHt7IGVuZCB9fSB2YWx1ZT0iU3RyaW5nU21hbGwiPlN0cmluZyBTbWFsbDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdCaWciIH19ICAgICBzZWxlY3RlZCB7eyBlbHNlIH19IGRpc2FibGVkIHt7IGVuZCB9fSB2YWx1ZT0iU3RyaW5nQmlnIj5TdHJpbmcgQmlnPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIklucHV0SFRNTCIgfX0gICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJJbnB1dEhUTUwiPkhUTUw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiSW5wdXRNYXJrZG93biIgfX0gc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IklucHV0TWFya2Rvd24iPk1hcmtkb3duPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIkZpbGUiIH19ICAgICAgICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJGaWxlIj5GaWxlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIkRhdGUiIH19ICAgICAgICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJEYXRlIj5EYXRlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIlJlZmVyZW5jZSIgfX0gICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJSZWZlcmVuY2UiPlJlZmVyZW5jZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHt7IGlmIGVxIC5UeXBlICJSZWZlcmVuY2VMaXN0IiB9fSBzZWxlY3RlZCB7eyBlbHNlIH19IGRpc2FibGVkIHt7IGVuZCB9fSB2YWx1ZT0iUmVmZXJlbmNlTGlzdCI+UmVmZXJlbmNlTGlzdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nY29sLTYnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ndy0xMDAgYnRuIGJ0bi1wcmltYXJ5IGJ0bi1yZW1vdmUnIHR5cGU9YnV0dG9uPlJlbW92ZSBGaWVsZDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxhIGhyZWY9JyMnIGNsYXNzPSdidG4gYnRuLWxpbmsnIGlkPSdhZGQtZmllbGRidG4nPkFkZCBBbm90aGVyIEZpZWxkPC9hPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KCiAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0ncm93Jz4KICAgICAgICAgIDxkaXYgY2xhc3M9J29mZnNldC1sZy0zIGNvbC1sZy02Jz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibXktMyBwLTMgYmctd2hpdGUgcm91bmRlZCBzaGFkb3ctc20iPgogICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPSJkLWJsb2NrIHRleHQtcmlnaHQgZmxvYXQtcmlnaHQiIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNjcmVhdGVNb2RhbCI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPkNyZWF0ZSBhIG5ldyBjb250ZW50PC9hPgogICAgICAgICAgICAgICAgPC9zbWFsbD4KICAgICAgICAgICAgICAgIDxoNiBjbGFzcz0iYm9yZGVyLWJvdHRvbSBib3JkZXItZ3JheSBwYi0yIG1iLTAiPllvdXIge3suQ29udGVudFR5cGUuTmFtZX19IGNvbnRlbnQ8L2g2PgogICAgICAgICAgICAgIHt7IGlmIC5Db250ZW50TGlzdC5MaXN0IH19CiAgICAgICAgICAgICAgICB7eyByYW5nZSAuQ29udGVudExpc3QuTGlzdCB9fQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVkaWEgdGV4dC1tdXRlZCBwdC0zIj4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0nL2NvbnRlbnQve3sgJC5TcGFjZS5JRCB9fS97eyAkLkNvbnRlbnRUeXBlLklEIH19L3t7IC5JRCB9fScgIGNsYXNzPSJkLWJsb2NrIG1lZGlhLWJvZHkgcGItMyBtYi0wIHNtYWxsIGxoLTEyNSBib3JkZXItYm90dG9tIGJvcmRlci1ncmF5Ij4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJkLWJsb2NrIHRleHQtZ3JheS1kYXJrIj4KICAgICAgICAgICAgICAgICAgICAgIHt7ICguTXVzdFZhbHVlQnlOYW1lICJuYW1lIikuVmFsdWUgfX0KICAgICAgICAgICAgICAgICAgICA8L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgIHt7IGlmIC5Db250ZW50TGlzdC5Nb3JlIH19CiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9ImQtYmxvY2sgdGV4dC1yaWdodCBtdC0zIj4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL2NvbnRlbnR0eXBlL3t7IC5TcGFjZS5JRCB9fS97eyAuQ29udGVudFR5cGUuSUQgfX0/YmVmb3JlPXt7IC5Db250ZW50TGlzdC5CZWZvcmUgfX0iPkxvYWQgbW9yZTwvYT4KICAgICAgICAgICAgICAgIDwvc21hbGw+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICB7eyBlbHNlIH19CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtdC0zIGFsZXJ0IGFsZXJ0LXByaW1hcnkiIHJvbGU9ImFsZXJ0Ij4KICAgICAgICAgICAgICAgICAgWW91IGhhdmVuJ3QgY3JlYXRlZCBhbnkgY29udGVudCB5ZXQuIAogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9hcnRpY2xlPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQogIDxzY3JpcHQgc3JjPScvc3RhdGljL2pzL3RpbnltY2UubWluLmpzJz48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0nL3N0YXRpYy9qcy9hdXRvY29tcGxldGUubWluLmpzJz48L3NjcmlwdD4KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9tYWluLmpzIiAkIH19PC9zY3JpcHQ+CiAgPHNjcmlwdD57eyB0ZW1wbGF0ZSAianMvc3BhY2UuanMiICQgfX08L3NjcmlwdD4KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9jb250ZW50LmpzIiAkIH19PC9zY3JpcHQ+CjwvYm9keT4KCjwvaHRtbD4K")

	tmpls["html/hook.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPkNNUyB8IHt7IC5TcGFjZS5OYW1lIH19IHwge3sgLkhvb2suVVJMIH19PC90aXRsZT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0naG9vayBiZy1saWdodCc+CiAgPHN0eWxlPnt7IHRlbXBsYXRlICJjc3MvbWFpbi5jc3MiIH19PC9zdHlsZT4KICA8bWFpbj4KICAgIHt7IHRlbXBsYXRlICJodG1sL19oZWFkZXIuaHRtbCIgJCB9fQogICAgPGRpdiBjbGFzcz0icHJpY2luZy1oZWFkZXIgcHgtMyBweS0zIHB0LW1kLTUgcGItbWQtNCBteC1hdXRvIHRleHQtY2VudGVyIj4KICAgICAgPGgxIGNsYXNzPSJkaXNwbGF5LTQiPnt7IC5Ib29rLlVSTCB9fTwvaDE+CiAgICA8L2Rpdj4KICAgIDxhcnRpY2xlIGNsYXNzPWNvbnRhaW5lcj4KICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvaG9vay9kZWxldGUnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9aG9vayB2YWx1ZT0ie3sgLkhvb2suSUQgfX0iIC8+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImRlbGV0ZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJkZWxldGVNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImRlbGV0ZU1vZGFsTGFiZWwiPkRlbGV0ZSB7eyAuSG9vay5VUkwgfX08L2g1PgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQogIDxzY3JpcHQ+e3sgdGVtcGxhdGUgImpzL21haW4uanMiICQgfX08L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==")
	tmpls["html/hook.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPkNNUyB8IHt7IC5TcGFjZS5OYW1lIH19IHwge3sgLkhvb2suVVJMIH19PC90aXRsZT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0naG9vayBiZy1saWdodCc+CiAgPHN0eWxlPnt7IHRlbXBsYXRlICJjc3MvbWFpbi5jc3MiIH19PC9zdHlsZT4KICA8bWFpbj4KICAgIHt7IHRlbXBsYXRlICJodG1sL19oZWFkZXIuaHRtbCIgJCB9fQogICAgPGRpdiBjbGFzcz0icHJpY2luZy1oZWFkZXIgcHgtMyBweS0zIHB0LW1kLTUgcGItbWQtNCBteC1hdXRvIHRleHQtY2VudGVyIj4KICAgICAgPGgxIGNsYXNzPSJkaXNwbGF5LTQiPnt7IC5Ib29rLlVSTCB9fTwvaDE+CiAgICA8L2Rpdj4KICAgIDxhcnRpY2xlIGNsYXNzPWNvbnRhaW5lcj4KICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvaG9vaycgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9bWV0aG9kIHZhbHVlPURFTEVURSAvPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9aG9vayB2YWx1ZT0ie3sgLkhvb2suSUQgfX0iIC8+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImRlbGV0ZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJkZWxldGVNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImRlbGV0ZU1vZGFsTGFiZWwiPkRlbGV0ZSB7eyAuSG9vay5VUkwgfX08L2g1PgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQogIDxzY3JpcHQ+e3sgdGVtcGxhdGUgImpzL21haW4uanMiICQgfX08L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==")

	tmpls["html/index.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPkNNUzwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgY2xhc3M9J2luZGV4IGJnLWxpZ2h0Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8ZGl2IGNsYXNzPSJwcmljaW5nLWhlYWRlciBweC0zIHB5LTMgcHQtbWQtNSBwYi1tZC00IG14LWF1dG8gdGV4dC1jZW50ZXIiPgogICAgICA8aDEgY2xhc3M9ImRpc3BsYXktNCI+Q01TPC9oMT4KICAgICAgPHAgY2xhc3M9ImxlYWQiPkFuIG9sZC1zY2hvb2wgY29udGVudCBtYW5hZ2VtZW50IDxtYXJrPmluZnJhc3RydWN0dXJlPC9tYXJrPiBmb3IgbW9zdC48L3A+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9J2NvbnRhaW5lcic+CiAgICAgIDxkaXYgY2xhc3M9J3Jvdyc+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sLTEyIG9mZnNldC0wIGNvbC1sZy04IG9mZnNldC1sZy0yIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciIHJvbGU9ImFsZXJ0Ij4KICAgICAgICAgICAgPHA+PHN0cm9uZz5XQVJOSU5HOjwvc3Ryb25nPiBUaGlzIHNpdGUgaXMgaW4gPHN0cm9uZz5BTFBIQTwvc3Ryb25nPi4gCiAgICAgICAgICAgIFRoaXMgc2l0ZSBpcyBhIGNvbnRlbnQgbWFuYWdlbWVudCBzeXN0ZW0vaW5mcmFzdHJ1Y3R1cmUuIE1lYW5pbmc6IAogICAgICAgICAgICBpdCdzIHB1cnBvc2UgaXMgdG8gYWxsb3cgdXNlcnMgdG8gZ2VuZXJhdGUgY29udGVudC4gVGhhdCdzIGEgCiAgICAgICAgICAgIGRhbmdlcm91cyB0aGluZy4gSW5zdGVhZCBvZiBmb2N1c2luZyBvbiBmaWdodGluZyBhYnVzZSBJJ2xsIGJlIGF1dG8gCiAgICAgICAgICAgIGRlbGV0aW5nIGFsbCBjb250ZW50IChleGNlcHQgZm9yIG15IG93bikgb24gYSByZWd1bGFyIGFuZCB0aWdodCAKICAgICAgICAgICAgaW50ZXJ2YWwuIFlvdSBzdGlsbCBtaWdodCBoYXZlIGZ1biBwb2tpbmcgYXJvdW5kIG9uIHRoaXMgc2l0ZS4gSXQncyAKICAgICAgICAgICAgYWxzbyA8YSBocmVmPSdodHRwczovL3d3dy5nbnUub3JnL3BoaWxvc29waHkvZmxvc3MtYW5kLWZvc3MuZW4uaHRtbCc+RkxPU1MsPC9hPgogICAgICAgICAgICBzbyB5b3UgY2FuIGVuam95IHNlbGYtaG9zdGluZyB5b3Vyc2VsZiBpZiB5b3UgYXJlIHNvIGluY2xpbmVkLiBJZiB5b3UKICAgICAgICAgICAgZmluZCBidWdzICh5b3UgbW9zdCBsaWtlbHkgd2lsbCkgb3IgaGF2ZSBmZWF0dXJlIHJlcXVlc3RzIHBsZWFzZSBzZW5kIAogICAgICAgICAgICB0aGVtIG15IHdheS4gSXQgaXMgYXBwcmVjaWF0ZWQuIFRoYW5rIHlvdS48L3A+CiAgICAgICAgICAgIDxwPklmIHlvdSBuZWVkIHRvIGhpdCB0aGUgQVBJIHRyeSBjVVJMJ2luZyBhbnkgcGFnZSB5b3Ugc2VlIGluIHRoZSAKICAgICAgICAgICAgVVJMIGJhciAoaW5jbHVkZSBiYXNpYyBhdXRoKS4gQSBzaW1wbGUgdXNlIGNhc2Ugb2YgY29uc3VtaW5nIHRoaXMgc2l0ZSBjYW4gYmUgZm91bmQgb24gbXkgCiAgICAgICAgICAgIDxhIGhyZWY9J2h0dHBzOi8vZ2l0LnNyLmh0L35ldmFuai9ldmFuam9uLmVzL3RyZWUvbWFzdGVyL3BrZy9jbXMvY21zLmdvJz5wZXJzb25hbCBzaXRlPC9hPi48L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxhcnRpY2xlPgogICAgICB7eyBpZiAuVXNlciB9fQogICAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL3NwYWNlL25ldycgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iZXhhbXBsZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJleGFtcGxlTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImV4YW1wbGVNb2RhbExhYmVsIj5DcmVhdGUgYSBuZXcgc3BhY2U8L2g1PgogICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic3BhY2VOYW1lIj5OYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9bmFtZSB0eXBlPXRleHQgaWQ9InNwYWNlTmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iTmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InNwYWNlRGVzYyI+RGVzY3JpcHRpb248L2xhYmVsPgogICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT1kZXNjIHR5cGU9dGV4dCBpZD0ic3BhY2VEZXNjIiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJEZXNjcmlwdGlvbiIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdyb3cnPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSdvZmZzZXQtbGctMyBjb2wtbGctNic+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibXktMyBwLTMgYmctd2hpdGUgcm91bmRlZCBzaGFkb3ctc20iPgogICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9ImQtYmxvY2sgdGV4dC1yaWdodCBmbG9hdC1yaWdodCIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2V4YW1wbGVNb2RhbCI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyI+Q3JlYXRlIGEgbmV3IHNwYWNlPC9hPgogICAgICAgICAgICAgICAgICA8L3NtYWxsPgogICAgICAgICAgICAgICAgPGg2IGNsYXNzPSJib3JkZXItYm90dG9tIGJvcmRlci1ncmF5IHBiLTIgbWItMCI+WW91ciBzcGFjZXM8L2g2PgogICAgICAgICAgICAgICAge3sgaWYgLlNwYWNlcy5MaXN0IH19CiAgICAgICAgICAgICAgICAgIHt7IHJhbmdlIC5TcGFjZXMuTGlzdCB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZWRpYSB0ZXh0LW11dGVkIHB0LTMiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9zcGFjZS97eyAuSUQgfX0nICBjbGFzcz0iZC1ibG9jayBtZWRpYS1ib2R5IHBiLTMgbWItMCBzbWFsbCBsaC0xMjUgYm9yZGVyLWJvdHRvbSBib3JkZXItZ3JheSI+CiAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJkLWJsb2NrIHRleHQtZ3JheS1kYXJrIj57eyAuTmFtZSB9fTwvc3Ryb25nPgogICAgICAgICAgICAgICAgICAgICAge3sgLkRlc2MgfX0KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgICAge3sgaWYgLlNwYWNlcy5Nb3JlIH19CiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz0iZC1ibG9jayB0ZXh0LXJpZ2h0IG10LTMiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii8/YmVmb3JlPXt7IC5TcGFjZXMuQmVmb3JlIH19Ij5Mb2FkIG1vcmU8L2E+CiAgICAgICAgICAgICAgICAgIDwvc21hbGw+CiAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAge3sgZWxzZSB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtdC0zIGFsZXJ0IGFsZXJ0LXByaW1hcnkiIHJvbGU9ImFsZXJ0Ij4KICAgICAgICAgICAgICAgICAgICBZb3UgaGF2ZW4ndCBjcmVhdGVkIGFueSBzcGFjZXMgeWV0LiAKICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAge3sgZWxzZSB9fQogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdyb3cganVzdGlmeS1jb250ZW50LWNlbnRlcic+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC0xMiBjb2wtbWQtNiBjb2wtbGctNCBvZmZzZXQtY29sLWxnLTIgY29sLXhsLTMgb2Zmc2V0LWNvbC14bC0zIGQtZmxleCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZCBtYi00IHNoYWRvdy1zbSBmbGV4LWZpbGwiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im15LTAgZm9udC13ZWlnaHQtbm9ybWFsIj5TaWdudXA8L2g0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPgogICAgICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy91c2VyL3NpZ251cCcgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic2lnbnVwSW5wdXRVc2VybmFtZSIgY2xhc3M9InNyLW9ubHkiPkVtYWlsIGFkZHJlc3M8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPXVzZXJuYW1lIHR5cGU9InRleHQiIGlkPSJzaWdudXBJbnB1dFVzZXJuYW1lIiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJVc2VybmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic2lnbnVwSW5wdXRQYXNzd29yZCIgY2xhc3M9InNyLW9ubHkiPlBhc3N3b3JkPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT1wYXNzd29yZCB0eXBlPSJwYXNzd29yZCIgaWQ9InNpZ251cElucHV0UGFzc3dvcmQiIGNsYXNzPSJtYi0zIGZvcm0tY29udHJvbCIgcGxhY2Vob2xkZXI9IlBhc3N3b3JkIiByZXF1aXJlZD4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzaWdudXBJbnB1dFZlcmlmeSIgY2xhc3M9InNyLW9ubHkiPkNvbmZpcm0gUGFzc3dvcmQ8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPXZlcmlmeSB0eXBlPSJwYXNzd29yZCIgaWQ9InNpZ251cElucHV0VmVyaWZ5IiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJDb25maXJtIFBhc3N3b3JkIiByZXF1aXJlZD4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWxnIGJ0bi1wcmltYXJ5IGJ0bi1ibG9jayIgdHlwZT0ic3VibWl0Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC0xMiBjb2wtbWQtNiBjb2wtbGctNCBjb2wteGwtMyBkLWZsZXgiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQgbWItNCBzaGFkb3ctc20gZmxleC1maWxsIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJteS0wIGZvbnQtd2VpZ2h0LW5vcm1hbCI+TG9naW48L2g0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkgZC1mbGV4Ij4KICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9J2QtZmxleCBmbGV4LWdyb3ctMSBmbGV4LWNvbHVtbicgbWV0aG9kPVBPU1QgYWN0aW9uPScvdXNlci9sb2dpbicgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibG9naW5JbnB1dFVzZXJuYW1lIiBjbGFzcz0ic3Itb25seSI+RW1haWwgYWRkcmVzczwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9dXNlcm5hbWUgdHlwZT0idGV4dCIgaWQ9ImxvZ2luSW5wdXRVc2VybmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iVXNlcm5hbWUiIHJlcXVpcmVkPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImxvZ2luSW5wdXRQYXNzd29yZCIgY2xhc3M9InNyLW9ubHkiPlBhc3N3b3JkPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT1wYXNzd29yZCB0eXBlPSJwYXNzd29yZCIgaWQ9ImxvZ2luSW5wdXRQYXNzd29yZCIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iUGFzc3dvcmQiIHJlcXVpcmVkPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im10LWF1dG8gYnRuIGJ0bi1sZyBidG4tcHJpbWFyeSBidG4tYmxvY2siIHR5cGU9InN1Ym1pdCI+R288L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIHt7IGVuZCB9fQogICAgPC9hcnRpY2xlPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQogIHt7IGlmIC5Vc2VyIH19CiAgICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9tYWluLmpzIiAkIH19PC9zY3JpcHQ+CiAge3sgZW5kIH19CjwvYm9keT4KPC9odG1sPgo=")
	tmpls["html/index.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPkNNUzwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgY2xhc3M9J2luZGV4IGJnLWxpZ2h0Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8ZGl2IGNsYXNzPSJwcmljaW5nLWhlYWRlciBweC0zIHB5LTMgcHQtbWQtNSBwYi1tZC00IG14LWF1dG8gdGV4dC1jZW50ZXIiPgogICAgICA8aDEgY2xhc3M9ImRpc3BsYXktNCI+Q01TPC9oMT4KICAgICAgPHAgY2xhc3M9ImxlYWQiPkFuIG9sZC1zY2hvb2wgY29udGVudCBtYW5hZ2VtZW50IDxtYXJrPmluZnJhc3RydWN0dXJlPC9tYXJrPiBmb3IgbW9zdC48L3A+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9J2NvbnRhaW5lcic+CiAgICAgIDxkaXYgY2xhc3M9J3Jvdyc+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sLTEyIG9mZnNldC0wIGNvbC1sZy04IG9mZnNldC1sZy0yIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciIHJvbGU9ImFsZXJ0Ij4KICAgICAgICAgICAgPHA+PHN0cm9uZz5XQVJOSU5HOjwvc3Ryb25nPiBUaGlzIHNpdGUgaXMgaW4gPHN0cm9uZz5BTFBIQTwvc3Ryb25nPi4gCiAgICAgICAgICAgIFRoaXMgc2l0ZSBpcyBhIGNvbnRlbnQgbWFuYWdlbWVudCBzeXN0ZW0vaW5mcmFzdHJ1Y3R1cmUuIE1lYW5pbmc6IAogICAgICAgICAgICBpdCdzIHB1cnBvc2UgaXMgdG8gYWxsb3cgdXNlcnMgdG8gZ2VuZXJhdGUgY29udGVudC4gVGhhdCdzIGEgCiAgICAgICAgICAgIGRhbmdlcm91cyB0aGluZy4gSW5zdGVhZCBvZiBmb2N1c2luZyBvbiBmaWdodGluZyBhYnVzZSBJJ2xsIGJlIGF1dG8gCiAgICAgICAgICAgIGRlbGV0aW5nIGFsbCBjb250ZW50IChleGNlcHQgZm9yIG15IG93bikgb24gYSByZWd1bGFyIGFuZCB0aWdodCAKICAgICAgICAgICAgaW50ZXJ2YWwuIFlvdSBzdGlsbCBtaWdodCBoYXZlIGZ1biBwb2tpbmcgYXJvdW5kIG9uIHRoaXMgc2l0ZS4gSXQncyAKICAgICAgICAgICAgYWxzbyA8YSBocmVmPSdodHRwczovL3d3dy5nbnUub3JnL3BoaWxvc29waHkvZmxvc3MtYW5kLWZvc3MuZW4uaHRtbCc+RkxPU1MsPC9hPgogICAgICAgICAgICBzbyB5b3UgY2FuIGVuam95IHNlbGYtaG9zdGluZyB5b3Vyc2VsZiBpZiB5b3UgYXJlIHNvIGluY2xpbmVkLiBJZiB5b3UKICAgICAgICAgICAgZmluZCBidWdzICh5b3UgbW9zdCBsaWtlbHkgd2lsbCkgb3IgaGF2ZSBmZWF0dXJlIHJlcXVlc3RzIHBsZWFzZSBzZW5kIAogICAgICAgICAgICB0aGVtIG15IHdheS4gSXQgaXMgYXBwcmVjaWF0ZWQuIFRoYW5rIHlvdS48L3A+CiAgICAgICAgICAgIDxwPklmIHlvdSBuZWVkIHRvIGhpdCB0aGUgQVBJIHRyeSBjVVJMJ2luZyBhbnkgcGFnZSB5b3Ugc2VlIGluIHRoZSAKICAgICAgICAgICAgVVJMIGJhciAoaW5jbHVkZSBiYXNpYyBhdXRoKS4gQSBzaW1wbGUgdXNlIGNhc2Ugb2YgY29uc3VtaW5nIHRoaXMgc2l0ZSBjYW4gYmUgZm91bmQgb24gbXkgCiAgICAgICAgICAgIDxhIGhyZWY9J2h0dHBzOi8vZ2l0LnNyLmh0L35ldmFuai9ldmFuam9uLmVzL3RyZWUvbWFzdGVyL3BrZy9jbXMvY21zLmdvJz5wZXJzb25hbCBzaXRlPC9hPi48L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxhcnRpY2xlPgogICAgICB7eyBpZiAuVXNlciB9fQogICAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL3NwYWNlJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW1ldGhvZCB2YWx1ZT1QT1NUIC8+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iZXhhbXBsZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJleGFtcGxlTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImV4YW1wbGVNb2RhbExhYmVsIj5DcmVhdGUgYSBuZXcgc3BhY2U8L2g1PgogICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic3BhY2VOYW1lIj5OYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9bmFtZSB0eXBlPXRleHQgaWQ9InNwYWNlTmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iTmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InNwYWNlRGVzYyI+RGVzY3JpcHRpb248L2xhYmVsPgogICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT1kZXNjIHR5cGU9dGV4dCBpZD0ic3BhY2VEZXNjIiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJEZXNjcmlwdGlvbiIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdyb3cnPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSdvZmZzZXQtbGctMyBjb2wtbGctNic+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibXktMyBwLTMgYmctd2hpdGUgcm91bmRlZCBzaGFkb3ctc20iPgogICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9ImQtYmxvY2sgdGV4dC1yaWdodCBmbG9hdC1yaWdodCIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2V4YW1wbGVNb2RhbCI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyI+Q3JlYXRlIGEgbmV3IHNwYWNlPC9hPgogICAgICAgICAgICAgICAgICA8L3NtYWxsPgogICAgICAgICAgICAgICAgPGg2IGNsYXNzPSJib3JkZXItYm90dG9tIGJvcmRlci1ncmF5IHBiLTIgbWItMCI+WW91ciBzcGFjZXM8L2g2PgogICAgICAgICAgICAgICAge3sgaWYgLlNwYWNlcy5MaXN0IH19CiAgICAgICAgICAgICAgICAgIHt7IHJhbmdlIC5TcGFjZXMuTGlzdCB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZWRpYSB0ZXh0LW11dGVkIHB0LTMiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9zcGFjZS97eyAuSUQgfX0nICBjbGFzcz0iZC1ibG9jayBtZWRpYS1ib2R5IHBiLTMgbWItMCBzbWFsbCBsaC0xMjUgYm9yZGVyLWJvdHRvbSBib3JkZXItZ3JheSI+CiAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJkLWJsb2NrIHRleHQtZ3JheS1kYXJrIj57eyAuTmFtZSB9fTwvc3Ryb25nPgogICAgICAgICAgICAgICAgICAgICAge3sgLkRlc2MgfX0KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgICAge3sgaWYgLlNwYWNlcy5Nb3JlIH19CiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz0iZC1ibG9jayB0ZXh0LXJpZ2h0IG10LTMiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii8/YmVmb3JlPXt7IC5TcGFjZXMuQmVmb3JlIH19Ij5Mb2FkIG1vcmU8L2E+CiAgICAgICAgICAgICAgICAgIDwvc21hbGw+CiAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAge3sgZWxzZSB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtdC0zIGFsZXJ0IGFsZXJ0LXByaW1hcnkiIHJvbGU9ImFsZXJ0Ij4KICAgICAgICAgICAgICAgICAgICBZb3UgaGF2ZW4ndCBjcmVhdGVkIGFueSBzcGFjZXMgeWV0LiAKICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAge3sgZWxzZSB9fQogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdyb3cganVzdGlmeS1jb250ZW50LWNlbnRlcic+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC0xMiBjb2wtbWQtNiBjb2wtbGctNCBvZmZzZXQtY29sLWxnLTIgY29sLXhsLTMgb2Zmc2V0LWNvbC14bC0zIGQtZmxleCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZCBtYi00IHNoYWRvdy1zbSBmbGV4LWZpbGwiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im15LTAgZm9udC13ZWlnaHQtbm9ybWFsIj5TaWdudXA8L2g0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPgogICAgICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy91c2VyL3NpZ251cCcgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic2lnbnVwSW5wdXRVc2VybmFtZSIgY2xhc3M9InNyLW9ubHkiPkVtYWlsIGFkZHJlc3M8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPXVzZXJuYW1lIHR5cGU9InRleHQiIGlkPSJzaWdudXBJbnB1dFVzZXJuYW1lIiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJVc2VybmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic2lnbnVwSW5wdXRQYXNzd29yZCIgY2xhc3M9InNyLW9ubHkiPlBhc3N3b3JkPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT1wYXNzd29yZCB0eXBlPSJwYXNzd29yZCIgaWQ9InNpZ251cElucHV0UGFzc3dvcmQiIGNsYXNzPSJtYi0zIGZvcm0tY29udHJvbCIgcGxhY2Vob2xkZXI9IlBhc3N3b3JkIiByZXF1aXJlZD4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzaWdudXBJbnB1dFZlcmlmeSIgY2xhc3M9InNyLW9ubHkiPkNvbmZpcm0gUGFzc3dvcmQ8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPXZlcmlmeSB0eXBlPSJwYXNzd29yZCIgaWQ9InNpZ251cElucHV0VmVyaWZ5IiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJDb25maXJtIFBhc3N3b3JkIiByZXF1aXJlZD4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWxnIGJ0bi1wcmltYXJ5IGJ0bi1ibG9jayIgdHlwZT0ic3VibWl0Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC0xMiBjb2wtbWQtNiBjb2wtbGctNCBjb2wteGwtMyBkLWZsZXgiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQgbWItNCBzaGFkb3ctc20gZmxleC1maWxsIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJteS0wIGZvbnQtd2VpZ2h0LW5vcm1hbCI+TG9naW48L2g0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkgZC1mbGV4Ij4KICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9J2QtZmxleCBmbGV4LWdyb3ctMSBmbGV4LWNvbHVtbicgbWV0aG9kPVBPU1QgYWN0aW9uPScvdXNlci9sb2dpbicgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibG9naW5JbnB1dFVzZXJuYW1lIiBjbGFzcz0ic3Itb25seSI+RW1haWwgYWRkcmVzczwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9dXNlcm5hbWUgdHlwZT0idGV4dCIgaWQ9ImxvZ2luSW5wdXRVc2VybmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iVXNlcm5hbWUiIHJlcXVpcmVkPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImxvZ2luSW5wdXRQYXNzd29yZCIgY2xhc3M9InNyLW9ubHkiPlBhc3N3b3JkPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT1wYXNzd29yZCB0eXBlPSJwYXNzd29yZCIgaWQ9ImxvZ2luSW5wdXRQYXNzd29yZCIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iUGFzc3dvcmQiIHJlcXVpcmVkPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im10LWF1dG8gYnRuIGJ0bi1sZyBidG4tcHJpbWFyeSBidG4tYmxvY2siIHR5cGU9InN1Ym1pdCI+R288L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIHt7IGVuZCB9fQogICAgPC9hcnRpY2xlPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQogIHt7IGlmIC5Vc2VyIH19CiAgICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9tYWluLmpzIiAkIH19PC9zY3JpcHQ+CiAge3sgZW5kIH19CjwvYm9keT4KPC9odG1sPgo=")

	tmpls["html/space.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPkNNUyB8IHt7IC5TcGFjZS5OYW1lIH19PC90aXRsZT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0nc3BhY2UgYmctbGlnaHQnPgogIDxzdHlsZT57eyB0ZW1wbGF0ZSAiY3NzL21haW4uY3NzIiB9fTwvc3R5bGU+CiAgPG1haW4+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZGVyLmh0bWwiICQgfX0KICAgIDxkaXYgY2xhc3M9InByaWNpbmctaGVhZGVyIHB4LTMgcHktMyBwdC1tZC01IHBiLW1kLTQgbXgtYXV0byB0ZXh0LWNlbnRlciI+CiAgICAgIDxoMSBjbGFzcz0iZGlzcGxheS00Ij57ey5TcGFjZS5OYW1lfX08L2gxPgogICAgICA8cCBjbGFzcz0ibGVhZCI+e3suU3BhY2UuRGVzY319PC9wPgogICAgPC9kaXY+CiAgICA8YXJ0aWNsZT4KICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvY29udGVudHR5cGUvbmV3JyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1zcGFjZSB2YWx1ZT0ie3sgLlNwYWNlLklEIH19IiAvPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJjcmVhdGUtY29udGVudHR5cGUiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9IkNyZWF0ZSBhIG5ldyBjb250ZW50IHR5cGUgbW9kYWwuIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImNvbnRlbnR0eXBlTW9kYWxMYWJlbCI+Q3JlYXRlIGEgbmV3IGNvbnRlbnQgdHlwZTwvaDU+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjb250ZW50dHlwZU5hbWUiPk5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9bmFtZSB0eXBlPXRleHQgaWQ9ImNvbnRlbnR0eXBlTmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iTmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSdmaXJzdC1maWVsZHNldCcgY2xhc3M9J2NvbnRhaW5lci1mbHVpZCBweC0wIG1iLTMnPgogICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJmaWVsZHNldEZpcnN0Ij5GaWVsZHM8L2xhYmVsPgogICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9ImZpZWxkc2V0Rmlyc3QiIGNsYXNzPSJtYi0zIGZvcm0tY29udHJvbCIgcmVhZG9ubHk9InJlYWRvbmx5IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0iZmllbGRfbmFtZV8xIiB2YWx1ZT0ibmFtZSIgLz4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nZm9ybS1ncm91cCByb3cnPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC02Jz4KICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9InctMTAwIGZvcm0tY29udHJvbCIgcmVhZG9ubHk9InJlYWRvbmx5IiByZXF1aXJlZCBuYW1lPSJmaWVsZF90eXBlXzEiPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPkZpZWxkIFR5cGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBzZWxlY3RlZCB2YWx1ZT0iU3RyaW5nU21hbGwiPlN0cmluZyBTbWFsbDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJTdHJpbmdCaWciPlN0cmluZyBCaWc8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iSW5wdXRIVE1MIj5IVE1MPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IklucHV0TWFya2Rvd24iPk1hcmtkb3duPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IkZpbGUiPkZpbGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iRGF0ZSI+RGF0ZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJSZWZlcmVuY2UiPlJlZmVyZW5jZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJSZWZlcmVuY2VMaXN0Ij5SZWZlcmVuY2VMaXN0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtNic+CiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSd3LTEwMCBidG4gYnRuLXByaW1hcnknIGRpc2FibGVkIHR5cGU9YnV0dG9uPlJlbW92ZSBGaWVsZDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGEgaHJlZj0nIycgY2xhc3M9J2J0biBidG4tbGluaycgaWQ9J2FkZC1maWVsZGJ0bic+QWRkIEFub3RoZXIgRmllbGQ8L2E+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9mb3JtPgoKICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvaG9vay9uZXcnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9Imhvb2tNb2RhbCIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0iaG9va01vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0iaG9va01vZGFsTGFiZWwiPkNyZWF0ZSBhIG5ldyBob29rPC9oNT4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Imhvb2tVUkwiPlVSTDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT11cmwgdHlwZT11cmwgaWQ9Imhvb2tVUkwiIGNsYXNzPSJtYi0zIGZvcm0tY29udHJvbCIgcGxhY2Vob2xkZXI9Ik11c3QgZW50ZXIgZnVsbCBVUkwgb2YgdGFyZ2V0IiByZXF1aXJlZD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Zvcm0+CgogICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy9zcGFjZS9jb3B5JyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1zcGFjZSB2YWx1ZT0ie3sgLlNwYWNlLklEIH19IiAvPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJjb3B5TW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9ImNvcHlNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImNvcHlNb2RhbExhYmVsIj5Db3B5IHt7LlNwYWNlLk5hbWV9fTwvaDU+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzcGFjZU5hbWUiPk5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9bmFtZSB0eXBlPXRleHQgaWQ9InNwYWNlTmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iTmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzcGFjZURlc2MiPkRlc2NyaXB0aW9uPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPWRlc2MgdHlwZT10ZXh0IGlkPSJzcGFjZURlc2MiIGNsYXNzPSJtYi0zIGZvcm0tY29udHJvbCIgcGxhY2Vob2xkZXI9IkRlc2NyaXB0aW9uIiByZXF1aXJlZD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Zvcm0+CgogICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy9zcGFjZS91cGRhdGUnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9InVwZGF0ZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJ1cGRhdGVNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9InVwZGF0ZU1vZGFsTGFiZWwiPlVwZGF0ZSB7ey5TcGFjZS5OYW1lfX08L2g1PgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic3BhY2VOYW1lIj5OYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCB2YWx1ZT0ie3sgLlNwYWNlLk5hbWUgfX0iIG5hbWU9bmFtZSB0eXBlPXRleHQgaWQ9InNwYWNlTmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iTmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzcGFjZURlc2MiPkRlc2NyaXB0aW9uPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCB2YWx1ZT0ie3sgLlNwYWNlLkRlc2MgfX0iIG5hbWU9ZGVzYyB0eXBlPXRleHQgaWQ9InNwYWNlRGVzYyIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iRGVzY3JpcHRpb24iIHJlcXVpcmVkPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KICAgICAgCiAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL3NwYWNlL2RlbGV0ZScgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iZGVsZXRlTW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9ImRlbGV0ZU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0iZGVsZXRlTW9kYWxMYWJlbCI+RGVsZXRlIHt7LlNwYWNlLk5hbWV9fTwvaDU+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9mb3JtPgoKICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSdyb3cnPgogICAgICAgICAgPGRpdiBjbGFzcz0nY29sLWxnLTYnPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJteS0zIHAtMyBiZy13aGl0ZSByb3VuZGVkIHNoYWRvdy1zbSI+CiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9ImQtYmxvY2sgdGV4dC1yaWdodCBmbG9hdC1yaWdodCIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2NyZWF0ZS1jb250ZW50dHlwZSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPkNyZWF0ZSBhIG5ldyBjb250ZW50IHR5cGU8L2E+CiAgICAgICAgICAgICAgICA8L3NtYWxsPgogICAgICAgICAgICAgIDxoNiBjbGFzcz0iYm9yZGVyLWJvdHRvbSBib3JkZXItZ3JheSBwYi0yIG1iLTAiPllvdXIgY29udGVudCB0eXBlczwvaDY+CiAgICAgICAgICAgICAge3sgaWYgLkNvbnRlbnRUeXBlcy5MaXN0IH19CiAgICAgICAgICAgICAgICB7eyByYW5nZSAuQ29udGVudFR5cGVzLkxpc3QgfX0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lZGlhIHRleHQtbXV0ZWQgcHQtMyI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9jb250ZW50dHlwZS97eyAkLlNwYWNlLklEIH19L3t7IC5JRCB9fScgIGNsYXNzPSJkLWJsb2NrIG1lZGlhLWJvZHkgcGItMyBtYi0wIHNtYWxsIGxoLTEyNSBib3JkZXItYm90dG9tIGJvcmRlci1ncmF5Ij4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJkLWJsb2NrIHRleHQtZ3JheS1kYXJrIj57eyAuTmFtZSB9fTwvc3Ryb25nPgogICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAge3sgaWYgLkNvbnRlbnRUeXBlcy5Nb3JlIH19CiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9ImQtYmxvY2sgdGV4dC1yaWdodCBtdC0zIj4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL3NwYWNlL3t7IC5TcGFjZS5JRCB9fT9iZWZvcmVjdD17eyAuQ29udGVudFR5cGVzLkJlZm9yZSB9fSI+TG9hZCBtb3JlPC9hPgogICAgICAgICAgICAgICAgPC9zbWFsbD4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgIHt7IGVsc2UgfX0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im10LTMgYWxlcnQgYWxlcnQtcHJpbWFyeSIgcm9sZT0iYWxlcnQiPgogICAgICAgICAgICAgICAgICBZb3UgaGF2ZW4ndCBjcmVhdGVkIGFueSBjb250ZW50IHR5cGVzIHlldC4gCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC1sZy02Jz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibXktMyBwLTMgYmctd2hpdGUgcm91bmRlZCBzaGFkb3ctc20iPgogICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPSJkLWJsb2NrIHRleHQtcmlnaHQgZmxvYXQtcmlnaHQiIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNob29rTW9kYWwiPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIj5DcmVhdGUgYSBuZXcgd2ViaG9vazwvYT4KICAgICAgICAgICAgICAgIDwvc21hbGw+CiAgICAgICAgICAgICAgPGg2IGNsYXNzPSJib3JkZXItYm90dG9tIGJvcmRlci1ncmF5IHBiLTIgbWItMCI+WW91ciB3ZWJob29rczwvaDY+CiAgICAgICAgICAgICAge3sgaWYgLkhvb2tzLkxpc3QgfX0KICAgICAgICAgICAgICAgIHt7IHJhbmdlIC5Ib29rcy5MaXN0IH19CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZWRpYSB0ZXh0LW11dGVkIHB0LTMiPgogICAgICAgICAgICAgICAgICA8YSBocmVmPScvaG9vay97eyAkLlNwYWNlLklEIH19L3t7IC5JRCB9fScgIGNsYXNzPSJkLWJsb2NrIG1lZGlhLWJvZHkgcGItMyBtYi0wIHNtYWxsIGxoLTEyNSBib3JkZXItYm90dG9tIGJvcmRlci1ncmF5Ij4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJkLWJsb2NrIHRleHQtZ3JheS1kYXJrIj57eyAuVVJMIH19PC9zdHJvbmc+CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICB7eyBpZiAuSG9va3MuTW9yZSB9fQogICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPSJkLWJsb2NrIHRleHQtcmlnaHQgbXQtMyI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9zcGFjZS97eyAuU3BhY2UuSUQgfX0/YmVmb3JlaG9vaz17eyAuSG9va3MuQmVmb3JlIH19Ij5Mb2FkIG1vcmU8L2E+CiAgICAgICAgICAgICAgICA8L3NtYWxsPgogICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAge3sgZWxzZSB9fQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibXQtMyBhbGVydCBhbGVydC1wcmltYXJ5IiByb2xlPSJhbGVydCI+CiAgICAgICAgICAgICAgICAgIFlvdSBoYXZlbid0IGNyZWF0ZWQgYW55IHdlYmhvb2tzIHlldC4gCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgPC9hcnRpY2xlPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQogIDxzY3JpcHQ+e3sgdGVtcGxhdGUgImpzL21haW4uanMiICQgfX08L3NjcmlwdD4KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9zcGFjZS5qcyIgJCB9fTwvc2NyaXB0Pgo8L2JvZHk+Cgo8L2h0bWw+Cg==")
	tmpls["html/redirect.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPkNNUzwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgY2xhc3M9J2luZGV4IGJnLWxpZ2h0Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8ZGl2IGNsYXNzPSJwcmljaW5nLWhlYWRlciBweC0zIHB5LTMgcHQtbWQtNSBwYi1tZC00IG14LWF1dG8gdGV4dC1jZW50ZXIiPgogICAgICA8aDEgY2xhc3M9ImRpc3BsYXktNCI+UmVkaXJlY3RpbmcgdG8gaHR0cHM6Ly9jbXMuZXZhbmpvbi5lc3t7LlVSTH19PC9oMT4KICAgIDwvZGl2PgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQogIDxzY3JpcHQ+KGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe2xvY2F0aW9uLmhyZWY9Int7LlVSTH19Ijt9LDc1MCk7fSkoKTs8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==")

	tmpls["html/space.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPkNNUyB8IHt7IC5TcGFjZS5OYW1lIH19PC90aXRsZT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0nc3BhY2UgYmctbGlnaHQnPgogIDxzdHlsZT57eyB0ZW1wbGF0ZSAiY3NzL21haW4uY3NzIiB9fTwvc3R5bGU+CiAgPG1haW4+CiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZGVyLmh0bWwiICQgfX0KICAgIDxkaXYgY2xhc3M9InByaWNpbmctaGVhZGVyIHB4LTMgcHktMyBwdC1tZC01IHBiLW1kLTQgbXgtYXV0byB0ZXh0LWNlbnRlciI+CiAgICAgIDxoMSBjbGFzcz0iZGlzcGxheS00Ij57ey5TcGFjZS5OYW1lfX08L2gxPgogICAgICA8cCBjbGFzcz0ibGVhZCI+e3suU3BhY2UuRGVzY319PC9wPgogICAgPC9kaXY+CiAgICA8YXJ0aWNsZT4KICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvY29udGVudHR5cGUnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW1ldGhvZCB2YWx1ZT1QT1NUIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iY3JlYXRlLWNvbnRlbnR0eXBlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJDcmVhdGUgYSBuZXcgY29udGVudCB0eXBlIG1vZGFsLiIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJjb250ZW50dHlwZU1vZGFsTGFiZWwiPkNyZWF0ZSBhIG5ldyBjb250ZW50IHR5cGU8L2g1PgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY29udGVudHR5cGVOYW1lIj5OYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPW5hbWUgdHlwZT10ZXh0IGlkPSJjb250ZW50dHlwZU5hbWUiIGNsYXNzPSJtYi0zIGZvcm0tY29udHJvbCIgcGxhY2Vob2xkZXI9Ik5hbWUiIHJlcXVpcmVkPgogICAgICAgICAgICAgICAgPGRpdiBpZD0nZmlyc3QtZmllbGRzZXQnIGNsYXNzPSdjb250YWluZXItZmx1aWQgcHgtMCBtYi0zJz4KICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZmllbGRzZXRGaXJzdCI+RmllbGRzPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJmaWVsZHNldEZpcnN0IiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHJlYWRvbmx5PSJyZWFkb25seSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9ImZpZWxkX25hbWVfMSIgdmFsdWU9Im5hbWUiIC8+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAgcm93Jz4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtNic+CiAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJ3LTEwMCBmb3JtLWNvbnRyb2wiIHJlYWRvbmx5PSJyZWFkb25seSIgcmVxdWlyZWQgbmFtZT0iZmllbGRfdHlwZV8xIj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT5GaWVsZCBUeXBlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gc2VsZWN0ZWQgdmFsdWU9IlN0cmluZ1NtYWxsIj5TdHJpbmcgU21hbGw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iU3RyaW5nQmlnIj5TdHJpbmcgQmlnPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IklucHV0SFRNTCI+SFRNTDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJJbnB1dE1hcmtkb3duIj5NYXJrZG93bjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJGaWxlIj5GaWxlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IkRhdGUiPkRhdGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iUmVmZXJlbmNlIj5SZWZlcmVuY2U8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iUmVmZXJlbmNlTGlzdCI+UmVmZXJlbmNlTGlzdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nY29sLTYnPgogICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ndy0xMDAgYnRuIGJ0bi1wcmltYXJ5JyBkaXNhYmxlZCB0eXBlPWJ1dHRvbj5SZW1vdmUgRmllbGQ8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxhIGhyZWY9JyMnIGNsYXNzPSdidG4gYnRuLWxpbmsnIGlkPSdhZGQtZmllbGRidG4nPkFkZCBBbm90aGVyIEZpZWxkPC9hPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KCiAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2hvb2snIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW1ldGhvZCB2YWx1ZT1QT1NUIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iaG9va01vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJob29rTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJob29rTW9kYWxMYWJlbCI+Q3JlYXRlIGEgbmV3IGhvb2s8L2g1PgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iaG9va1VSTCI+VVJMPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPXVybCB0eXBlPXVybCBpZD0iaG9va1VSTCIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iTXVzdCBlbnRlciBmdWxsIFVSTCBvZiB0YXJnZXQiIHJlcXVpcmVkPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KCiAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL3NwYWNlJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1tZXRob2QgdmFsdWU9UFVUIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iY29weU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJjb3B5TW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJjb3B5TW9kYWxMYWJlbCI+Q29weSB7ey5TcGFjZS5OYW1lfX08L2g1PgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic3BhY2VOYW1lIj5OYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPW5hbWUgdHlwZT10ZXh0IGlkPSJzcGFjZU5hbWUiIGNsYXNzPSJtYi0zIGZvcm0tY29udHJvbCIgcGxhY2Vob2xkZXI9Ik5hbWUiIHJlcXVpcmVkPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic3BhY2VEZXNjIj5EZXNjcmlwdGlvbjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT1kZXNjIHR5cGU9dGV4dCBpZD0ic3BhY2VEZXNjIiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJEZXNjcmlwdGlvbiIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9mb3JtPgoKICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvc3BhY2UnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW1ldGhvZCB2YWx1ZT1QQVRDSCAvPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9InVwZGF0ZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJ1cGRhdGVNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9InVwZGF0ZU1vZGFsTGFiZWwiPlVwZGF0ZSB7ey5TcGFjZS5OYW1lfX08L2g1PgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic3BhY2VOYW1lIj5OYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCB2YWx1ZT0ie3sgLlNwYWNlLk5hbWUgfX0iIG5hbWU9bmFtZSB0eXBlPXRleHQgaWQ9InNwYWNlTmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iTmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzcGFjZURlc2MiPkRlc2NyaXB0aW9uPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCB2YWx1ZT0ie3sgLlNwYWNlLkRlc2MgfX0iIG5hbWU9ZGVzYyB0eXBlPXRleHQgaWQ9InNwYWNlRGVzYyIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iRGVzY3JpcHRpb24iIHJlcXVpcmVkPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KICAgICAgCiAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL3NwYWNlJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1tZXRob2QgdmFsdWU9REVMRVRFIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iZGVsZXRlTW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9ImRlbGV0ZU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0iZGVsZXRlTW9kYWxMYWJlbCI+RGVsZXRlIHt7LlNwYWNlLk5hbWV9fTwvaDU+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+R288L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9mb3JtPgoKICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSdyb3cnPgogICAgICAgICAgPGRpdiBjbGFzcz0nY29sLWxnLTYnPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJteS0zIHAtMyBiZy13aGl0ZSByb3VuZGVkIHNoYWRvdy1zbSI+CiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9ImQtYmxvY2sgdGV4dC1yaWdodCBmbG9hdC1yaWdodCIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2NyZWF0ZS1jb250ZW50dHlwZSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPkNyZWF0ZSBhIG5ldyBjb250ZW50IHR5cGU8L2E+CiAgICAgICAgICAgICAgICA8L3NtYWxsPgogICAgICAgICAgICAgIDxoNiBjbGFzcz0iYm9yZGVyLWJvdHRvbSBib3JkZXItZ3JheSBwYi0yIG1iLTAiPllvdXIgY29udGVudCB0eXBlczwvaDY+CiAgICAgICAgICAgICAge3sgaWYgLkNvbnRlbnRUeXBlcy5MaXN0IH19CiAgICAgICAgICAgICAgICB7eyByYW5nZSAuQ29udGVudFR5cGVzLkxpc3QgfX0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lZGlhIHRleHQtbXV0ZWQgcHQtMyI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9jb250ZW50dHlwZS97eyAkLlNwYWNlLklEIH19L3t7IC5JRCB9fScgIGNsYXNzPSJkLWJsb2NrIG1lZGlhLWJvZHkgcGItMyBtYi0wIHNtYWxsIGxoLTEyNSBib3JkZXItYm90dG9tIGJvcmRlci1ncmF5Ij4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJkLWJsb2NrIHRleHQtZ3JheS1kYXJrIj57eyAuTmFtZSB9fTwvc3Ryb25nPgogICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAge3sgaWYgLkNvbnRlbnRUeXBlcy5Nb3JlIH19CiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9ImQtYmxvY2sgdGV4dC1yaWdodCBtdC0zIj4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL3NwYWNlL3t7IC5TcGFjZS5JRCB9fT9iZWZvcmVjdD17eyAuQ29udGVudFR5cGVzLkJlZm9yZSB9fSI+TG9hZCBtb3JlPC9hPgogICAgICAgICAgICAgICAgPC9zbWFsbD4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgIHt7IGVsc2UgfX0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im10LTMgYWxlcnQgYWxlcnQtcHJpbWFyeSIgcm9sZT0iYWxlcnQiPgogICAgICAgICAgICAgICAgICBZb3UgaGF2ZW4ndCBjcmVhdGVkIGFueSBjb250ZW50IHR5cGVzIHlldC4gCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC1sZy02Jz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibXktMyBwLTMgYmctd2hpdGUgcm91bmRlZCBzaGFkb3ctc20iPgogICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPSJkLWJsb2NrIHRleHQtcmlnaHQgZmxvYXQtcmlnaHQiIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNob29rTW9kYWwiPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIj5DcmVhdGUgYSBuZXcgd2ViaG9vazwvYT4KICAgICAgICAgICAgICAgIDwvc21hbGw+CiAgICAgICAgICAgICAgPGg2IGNsYXNzPSJib3JkZXItYm90dG9tIGJvcmRlci1ncmF5IHBiLTIgbWItMCI+WW91ciB3ZWJob29rczwvaDY+CiAgICAgICAgICAgICAge3sgaWYgLkhvb2tzLkxpc3QgfX0KICAgICAgICAgICAgICAgIHt7IHJhbmdlIC5Ib29rcy5MaXN0IH19CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZWRpYSB0ZXh0LW11dGVkIHB0LTMiPgogICAgICAgICAgICAgICAgICA8YSBocmVmPScvaG9vay97eyAkLlNwYWNlLklEIH19L3t7IC5JRCB9fScgIGNsYXNzPSJkLWJsb2NrIG1lZGlhLWJvZHkgcGItMyBtYi0wIHNtYWxsIGxoLTEyNSBib3JkZXItYm90dG9tIGJvcmRlci1ncmF5Ij4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJkLWJsb2NrIHRleHQtZ3JheS1kYXJrIj57eyAuVVJMIH19PC9zdHJvbmc+CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAgICB7eyBpZiAuSG9va3MuTW9yZSB9fQogICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPSJkLWJsb2NrIHRleHQtcmlnaHQgbXQtMyI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9zcGFjZS97eyAuU3BhY2UuSUQgfX0/YmVmb3JlaG9vaz17eyAuSG9va3MuQmVmb3JlIH19Ij5Mb2FkIG1vcmU8L2E+CiAgICAgICAgICAgICAgICA8L3NtYWxsPgogICAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgICAge3sgZWxzZSB9fQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibXQtMyBhbGVydCBhbGVydC1wcmltYXJ5IiByb2xlPSJhbGVydCI+CiAgICAgICAgICAgICAgICAgIFlvdSBoYXZlbid0IGNyZWF0ZWQgYW55IHdlYmhvb2tzIHlldC4gCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgPC9hcnRpY2xlPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQogIDxzY3JpcHQ+e3sgdGVtcGxhdGUgImpzL21haW4uanMiICQgfX08L3NjcmlwdD4KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9zcGFjZS5qcyIgJCB9fTwvc2NyaXB0Pgo8L2JvZHk+Cgo8L2h0bWw+Cg==")

	tmpls["js/bootstrap.js"] = tostring("LyohCiAgKiBCb290c3RyYXAgdjUuMC4wLWFscGhhMSAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLykKICAqIENvcHlyaWdodCAyMDExLTIwMjAgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycykKICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKQogICovCiFmdW5jdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKCJwb3BwZXIuanMiKSk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJwb3BwZXIuanMiXSxlKToodD10fHxzZWxmKS5ib290c3RyYXA9ZSh0LlBvcHBlcil9KHRoaXMsKGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19ZnVuY3Rpb24gbih0LG4saSl7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksaSYmZSh0LGkpLHR9ZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9ZnVuY3Rpb24gbyh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKGk9aS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4saSl9cmV0dXJuIG59ZnVuY3Rpb24gcyh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9vKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aSh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6byhPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH10PXQmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJkZWZhdWx0Iik/dC5kZWZhdWx0OnQ7dmFyIHIsYSxsLGMsdT1mdW5jdGlvbih0KXtkb3t0Kz1NYXRoLmZsb29yKDFlNipNYXRoLnJhbmRvbSgpKX13aGlsZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KSk7cmV0dXJuIHR9LGg9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGFyZ2V0Iik7aWYoIWV8fCIjIj09PWUpe3ZhciBuPXQuZ2V0QXR0cmlidXRlKCJocmVmIik7ZT1uJiYiIyIhPT1uP24udHJpbSgpOm51bGx9cmV0dXJuIGV9LGY9ZnVuY3Rpb24odCl7dmFyIGU9aCh0KTtyZXR1cm4gZSYmZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKT9lOm51bGx9LGQ9ZnVuY3Rpb24odCl7dmFyIGU9aCh0KTtyZXR1cm4gZT9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpOm51bGx9LGc9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIDA7dmFyIGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodCksbj1lLnRyYW5zaXRpb25EdXJhdGlvbixpPWUudHJhbnNpdGlvbkRlbGF5LG89cGFyc2VGbG9hdChuKSxzPXBhcnNlRmxvYXQoaSk7cmV0dXJuIG98fHM/KG49bi5zcGxpdCgiLCIpWzBdLGk9aS5zcGxpdCgiLCIpWzBdLDFlMyoocGFyc2VGbG9hdChuKStwYXJzZUZsb2F0KGkpKSk6MH0scD1mdW5jdGlvbih0KXt0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJ0cmFuc2l0aW9uZW5kIikpfSxtPWZ1bmN0aW9uKHQpe3JldHVybih0WzBdfHx0KS5ub2RlVHlwZX0sXz1mdW5jdGlvbih0LGUpe3ZhciBuPSExLGk9ZSs1O3QuYWRkRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsKGZ1bmN0aW9uIGUoKXtuPSEwLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsZSl9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtufHxwKHQpfSksaSl9LHY9ZnVuY3Rpb24odCxlLG4pe09iamVjdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKGkpe3ZhciBvLHM9bltpXSxyPWVbaV0sYT1yJiZtKHIpPyJlbGVtZW50IjpudWxsPT0obz1yKT8iIitvOnt9LnRvU3RyaW5nLmNhbGwobykubWF0Y2goL1xzKFthLXpdKykvaSlbMV0udG9Mb3dlckNhc2UoKTtpZighbmV3IFJlZ0V4cChzKS50ZXN0KGEpKXRocm93IG5ldyBFcnJvcih0LnRvVXBwZXJDYXNlKCkrJzogT3B0aW9uICInK2krJyIgcHJvdmlkZWQgdHlwZSAiJythKyciIGJ1dCBleHBlY3RlZCB0eXBlICInK3MrJyIuJyl9KSl9LGI9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuITE7aWYodC5zdHlsZSYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc3R5bGUpe3ZhciBlPWdldENvbXB1dGVkU3R5bGUodCksbj1nZXRDb21wdXRlZFN0eWxlKHQucGFyZW50Tm9kZSk7cmV0dXJuIm5vbmUiIT09ZS5kaXNwbGF5JiYibm9uZSIhPT1uLmRpc3BsYXkmJiJoaWRkZW4iIT09ZS52aXNpYmlsaXR5fXJldHVybiExfSx5PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7fX0sdz1mdW5jdGlvbih0KXtyZXR1cm4gdC5vZmZzZXRIZWlnaHR9LEU9ZnVuY3Rpb24oKXt2YXIgdD13aW5kb3cualF1ZXJ5O3JldHVybiB0JiYhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoImRhdGEtbm8tanF1ZXJ5Iik/dDpudWxsfSxrPShyPXt9LGE9MSx7c2V0OmZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT10LmtleSYmKHQua2V5PXtrZXk6ZSxpZDphfSxhKyspLHJbdC5rZXkuaWRdPW59LGdldDpmdW5jdGlvbih0LGUpe2lmKCF0fHx2b2lkIDA9PT10LmtleSlyZXR1cm4gbnVsbDt2YXIgbj10LmtleTtyZXR1cm4gbi5rZXk9PT1lP3Jbbi5pZF06bnVsbH0sZGVsZXRlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09dC5rZXkpe3ZhciBuPXQua2V5O24ua2V5PT09ZSYmKGRlbGV0ZSByW24uaWRdLGRlbGV0ZSB0LmtleSl9fX0pLFQ9ZnVuY3Rpb24odCxlLG4pe2suc2V0KHQsZSxuKX0sTD1mdW5jdGlvbih0LGUpe3JldHVybiBrLmdldCh0LGUpfSxDPWZ1bmN0aW9uKHQsZSl7ay5kZWxldGUodCxlKX0sQT1FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLFM9RWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvcixPPShsPW5ldyBDdXN0b21FdmVudCgiQm9vdHN0cmFwIix7Y2FuY2VsYWJsZTohMH0pLChjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5hZGRFdmVudExpc3RlbmVyKCJCb290c3RyYXAiLChmdW5jdGlvbigpe3JldHVybiBudWxsfSkpLGwucHJldmVudERlZmF1bHQoKSxjLmRpc3BhdGNoRXZlbnQobCksbC5kZWZhdWx0UHJldmVudGVkKSxEPS86c2NvcGVcYi87KGZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3QucXVlcnlTZWxlY3RvckFsbCgiOnNjb3BlICoiKX1jYXRjaCh0KXtyZXR1cm4hMX1yZXR1cm4hMH0pKCl8fChBPWZ1bmN0aW9uKHQpe2lmKCFELnRlc3QodCkpcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KTt2YXIgZT1Cb29sZWFuKHRoaXMuaWQpO2V8fCh0aGlzLmlkPXUoInNjb3BlIikpO3ZhciBuPW51bGw7dHJ5e3Q9dC5yZXBsYWNlKEQsIiMiK3RoaXMuaWQpLG49dGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfWZpbmFsbHl7ZXx8dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImlkIil9cmV0dXJuIG59LFM9ZnVuY3Rpb24odCl7aWYoIUQudGVzdCh0KSlyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpO3ZhciBlPUEuY2FsbCh0aGlzLHQpO3JldHVybiB2b2lkIDAhPT1lWzBdP2VbMF06bnVsbH0pO3ZhciBJPUUoKSxOPS9bXi5dKig/PVwuLiopXC58LiovLGo9L1wuLiovLFA9Lzo6XGQrJC8seD17fSxSPTEsSD17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LEI9WyJjbGljayIsImRibGNsaWNrIiwibW91c2V1cCIsIm1vdXNlZG93biIsImNvbnRleHRtZW51IiwibW91c2V3aGVlbCIsIkRPTU1vdXNlU2Nyb2xsIiwibW91c2VvdmVyIiwibW91c2VvdXQiLCJtb3VzZW1vdmUiLCJzZWxlY3RzdGFydCIsInNlbGVjdGVuZCIsImtleWRvd24iLCJrZXlwcmVzcyIsImtleXVwIiwib3JpZW50YXRpb25jaGFuZ2UiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIiwidG91Y2hlbmQiLCJ0b3VjaGNhbmNlbCIsInBvaW50ZXJkb3duIiwicG9pbnRlcm1vdmUiLCJwb2ludGVydXAiLCJwb2ludGVybGVhdmUiLCJwb2ludGVyY2FuY2VsIiwiZ2VzdHVyZXN0YXJ0IiwiZ2VzdHVyZWNoYW5nZSIsImdlc3R1cmVlbmQiLCJmb2N1cyIsImJsdXIiLCJjaGFuZ2UiLCJyZXNldCIsInNlbGVjdCIsInN1Ym1pdCIsImZvY3VzaW4iLCJmb2N1c291dCIsImxvYWQiLCJ1bmxvYWQiLCJiZWZvcmV1bmxvYWQiLCJyZXNpemUiLCJtb3ZlIiwiRE9NQ29udGVudExvYWRlZCIsInJlYWR5c3RhdGVjaGFuZ2UiLCJlcnJvciIsImFib3J0Iiwic2Nyb2xsIl07ZnVuY3Rpb24gTSh0LGUpe3JldHVybiBlJiZlKyI6OiIrUisrfHx0LnVpZEV2ZW50fHxSKyt9ZnVuY3Rpb24gUSh0KXt2YXIgZT1NKHQpO3JldHVybiB0LnVpZEV2ZW50PWUseFtlXT14W2VdfHx7fSx4W2VdfWZ1bmN0aW9uIFUodCxlLG4pe3ZvaWQgMD09PW4mJihuPW51bGwpO2Zvcih2YXIgaT1PYmplY3Qua2V5cyh0KSxvPTAscz1pLmxlbmd0aDtvPHM7bysrKXt2YXIgcj10W2lbb11dO2lmKHIub3JpZ2luYWxIYW5kbGVyPT09ZSYmci5kZWxlZ2F0aW9uU2VsZWN0b3I9PT1uKXJldHVybiByfXJldHVybiBudWxsfWZ1bmN0aW9uIEYodCxlLG4pe3ZhciBpPSJzdHJpbmciPT10eXBlb2YgZSxvPWk/bjplLHM9dC5yZXBsYWNlKGosIiIpLHI9SFtzXTtyZXR1cm4gciYmKHM9ciksQi5pbmRleE9mKHMpPi0xfHwocz10KSxbaSxvLHNdfWZ1bmN0aW9uIFcodCxlLG4saSxvKXtpZigic3RyaW5nIj09dHlwZW9mIGUmJnQpe258fChuPWksaT1udWxsKTt2YXIgcz1GKGUsbixpKSxyPXNbMF0sYT1zWzFdLGw9c1syXSxjPVEodCksdT1jW2xdfHwoY1tsXT17fSksaD1VKHUsYSxyP246bnVsbCk7aWYoaCloLm9uZU9mZj1oLm9uZU9mZiYmbztlbHNle3ZhciBmPU0oYSxlLnJlcGxhY2UoTiwiIikpLGQ9cj9mdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uIGkobyl7Zm9yKHZhciBzPXQucXVlcnlTZWxlY3RvckFsbChlKSxyPW8udGFyZ2V0O3ImJnIhPT10aGlzO3I9ci5wYXJlbnROb2RlKWZvcih2YXIgYT1zLmxlbmd0aDthLS07KWlmKHNbYV09PT1yKXJldHVybiBpLm9uZU9mZiYmcS5vZmYodCxvLnR5cGUsbiksbi5hcHBseShyLFtvXSk7cmV0dXJuIG51bGx9fSh0LG4saSk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24gbihpKXtyZXR1cm4gbi5vbmVPZmYmJnEub2ZmKHQsaS50eXBlLGUpLGUuYXBwbHkodCxbaV0pfX0odCxuKTtkLmRlbGVnYXRpb25TZWxlY3Rvcj1yP246bnVsbCxkLm9yaWdpbmFsSGFuZGxlcj1hLGQub25lT2ZmPW8sZC51aWRFdmVudD1mLHVbZl09ZCx0LmFkZEV2ZW50TGlzdGVuZXIobCxkLHIpfX19ZnVuY3Rpb24gVih0LGUsbixpLG8pe3ZhciBzPVUoZVtuXSxpLG8pO3MmJih0LnJlbW92ZUV2ZW50TGlzdGVuZXIobixzLEJvb2xlYW4obykpLGRlbGV0ZSBlW25dW3MudWlkRXZlbnRdKX12YXIgcT17b246ZnVuY3Rpb24odCxlLG4saSl7Vyh0LGUsbixpLCExKX0sb25lOmZ1bmN0aW9uKHQsZSxuLGkpe1codCxlLG4saSwhMCl9LG9mZjpmdW5jdGlvbih0LGUsbixpKXtpZigic3RyaW5nIj09dHlwZW9mIGUmJnQpe3ZhciBvPUYoZSxuLGkpLHM9b1swXSxyPW9bMV0sYT1vWzJdLGw9YSE9PWUsYz1RKHQpLHU9Ii4iPT09ZS5jaGFyQXQoMCk7aWYodm9pZCAwPT09cil7dSYmT2JqZWN0LmtleXMoYykuZm9yRWFjaCgoZnVuY3Rpb24obil7IWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciBvPWVbbl18fHt9O09iamVjdC5rZXlzKG8pLmZvckVhY2goKGZ1bmN0aW9uKHMpe2lmKHMuaW5kZXhPZihpKT4tMSl7dmFyIHI9b1tzXTtWKHQsZSxuLHIub3JpZ2luYWxIYW5kbGVyLHIuZGVsZWdhdGlvblNlbGVjdG9yKX19KSl9KHQsYyxuLGUuc2xpY2UoMSkpfSkpO3ZhciBoPWNbYV18fHt9O09iamVjdC5rZXlzKGgpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPW4ucmVwbGFjZShQLCIiKTtpZighbHx8ZS5pbmRleE9mKGkpPi0xKXt2YXIgbz1oW25dO1YodCxjLGEsby5vcmlnaW5hbEhhbmRsZXIsby5kZWxlZ2F0aW9uU2VsZWN0b3IpfX0pKX1lbHNle2lmKCFjfHwhY1thXSlyZXR1cm47Vih0LGMsYSxyLHM/bjpudWxsKX19fSx0cmlnZ2VyOmZ1bmN0aW9uKHQsZSxuKXtpZigic3RyaW5nIiE9dHlwZW9mIGV8fCF0KXJldHVybiBudWxsO3ZhciBpLG89ZS5yZXBsYWNlKGosIiIpLHM9ZSE9PW8scj1CLmluZGV4T2Yobyk+LTEsYT0hMCxsPSEwLGM9ITEsdT1udWxsO3JldHVybiBzJiZJJiYoaT1JLkV2ZW50KGUsbiksSSh0KS50cmlnZ2VyKGkpLGE9IWkuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSxsPSFpLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCksYz1pLmlzRGVmYXVsdFByZXZlbnRlZCgpKSxyPyh1PWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIikpLmluaXRFdmVudChvLGEsITApOnU9bmV3IEN1c3RvbUV2ZW50KGUse2J1YmJsZXM6YSxjYW5jZWxhYmxlOiEwfSksdm9pZCAwIT09biYmT2JqZWN0LmtleXMobikuZm9yRWFjaCgoZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHUsdCx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5bdF19fSl9KSksYyYmKHUucHJldmVudERlZmF1bHQoKSxPfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodSwiZGVmYXVsdFByZXZlbnRlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiEwfX0pKSxsJiZ0LmRpc3BhdGNoRXZlbnQodSksdS5kZWZhdWx0UHJldmVudGVkJiZ2b2lkIDAhPT1pJiZpLnByZXZlbnREZWZhdWx0KCksdX19LHo9ImFsZXJ0IixLPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fZWxlbWVudCYmVCh0LCJicy5hbGVydCIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUuY2xvc2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZWxlbWVudDt0JiYoZT10aGlzLl9nZXRSb290RWxlbWVudCh0KSk7dmFyIG49dGhpcy5fdHJpZ2dlckNsb3NlRXZlbnQoZSk7bnVsbD09PW58fG4uZGVmYXVsdFByZXZlbnRlZHx8dGhpcy5fcmVtb3ZlRWxlbWVudChlKX0sZS5kaXNwb3NlPWZ1bmN0aW9uKCl7Qyh0aGlzLl9lbGVtZW50LCJicy5hbGVydCIpLHRoaXMuX2VsZW1lbnQ9bnVsbH0sZS5fZ2V0Um9vdEVsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGQodCl8fHQuY2xvc2VzdCgiLmFsZXJ0Iil9LGUuX3RyaWdnZXJDbG9zZUV2ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBxLnRyaWdnZXIodCwiY2xvc2UuYnMuYWxlcnQiKX0sZS5fcmVtb3ZlRWxlbWVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKHQuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIikpe3ZhciBuPWcodCk7cS5vbmUodCwidHJhbnNpdGlvbmVuZCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2Rlc3Ryb3lFbGVtZW50KHQpfSkpLF8odCxuKX1lbHNlIHRoaXMuX2Rlc3Ryb3lFbGVtZW50KHQpfSxlLl9kZXN0cm95RWxlbWVudD1mdW5jdGlvbih0KXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSxxLnRyaWdnZXIodCwiY2xvc2VkLmJzLmFsZXJ0Iil9LHQualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49TCh0aGlzLCJicy5hbGVydCIpO258fChuPW5ldyB0KHRoaXMpKSwiY2xvc2UiPT09ZSYmbltlXSh0aGlzKX0pKX0sdC5oYW5kbGVEaXNtaXNzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtlJiZlLnByZXZlbnREZWZhdWx0KCksdC5jbG9zZSh0aGlzKX19LHQuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIEwodCwiYnMuYWxlcnQiKX0sbih0LG51bGwsW3trZXk6IlZFUlNJT04iLGdldDpmdW5jdGlvbigpe3JldHVybiI1LjAuMC1hbHBoYTEifX1dKSx0fSgpO3Eub24oZG9jdW1lbnQsImNsaWNrLmJzLmFsZXJ0LmRhdGEtYXBpIiwnW2RhdGEtZGlzbWlzcz0iYWxlcnQiXScsSy5oYW5kbGVEaXNtaXNzKG5ldyBLKSk7dmFyIFg9RSgpO2lmKFgpe3ZhciBZPVguZm5bel07WC5mblt6XT1LLmpRdWVyeUludGVyZmFjZSxYLmZuW3pdLkNvbnN0cnVjdG9yPUssWC5mblt6XS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIFguZm5bel09WSxLLmpRdWVyeUludGVyZmFjZX19dmFyICQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX2VsZW1lbnQ9dCxUKHQsImJzLmJ1dHRvbiIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUudG9nZ2xlPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIsdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUiKSl9LGUuZGlzcG9zZT1mdW5jdGlvbigpe0ModGhpcy5fZWxlbWVudCwiYnMuYnV0dG9uIiksdGhpcy5fZWxlbWVudD1udWxsfSx0LmpRdWVyeUludGVyZmFjZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBuPUwodGhpcywiYnMuYnV0dG9uIik7bnx8KG49bmV3IHQodGhpcykpLCJ0b2dnbGUiPT09ZSYmbltlXSgpfSkpfSx0LmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLmJ1dHRvbiIpfSxuKHQsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjUuMC4wLWFscGhhMSJ9fV0pLHR9KCk7cS5vbihkb2N1bWVudCwiY2xpY2suYnMuYnV0dG9uLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJidXR0b24iXScsKGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKTt2YXIgZT10LnRhcmdldC5jbG9zZXN0KCdbZGF0YS10b2dnbGU9ImJ1dHRvbiJdJyksbj1MKGUsImJzLmJ1dHRvbiIpO258fChuPW5ldyAkKGUpKSxuLnRvZ2dsZSgpfSkpO3ZhciBHPUUoKTtpZihHKXt2YXIgWj1HLmZuLmJ1dHRvbjtHLmZuLmJ1dHRvbj0kLmpRdWVyeUludGVyZmFjZSxHLmZuLmJ1dHRvbi5Db25zdHJ1Y3Rvcj0kLEcuZm4uYnV0dG9uLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gRy5mbi5idXR0b249WiwkLmpRdWVyeUludGVyZmFjZX19ZnVuY3Rpb24gSih0KXtyZXR1cm4idHJ1ZSI9PT10fHwiZmFsc2UiIT09dCYmKHQ9PT1OdW1iZXIodCkudG9TdHJpbmcoKT9OdW1iZXIodCk6IiI9PT10fHwibnVsbCI9PT10P251bGw6dCl9ZnVuY3Rpb24gdHQodCl7cmV0dXJuIHQucmVwbGFjZSgvW0EtWl0vZywoZnVuY3Rpb24odCl7cmV0dXJuIi0iK3QudG9Mb3dlckNhc2UoKX0pKX12YXIgZXQ9e3NldERhdGFBdHRyaWJ1dGU6ZnVuY3Rpb24odCxlLG4pe3Quc2V0QXR0cmlidXRlKCJkYXRhLSIrdHQoZSksbil9LHJlbW92ZURhdGFBdHRyaWJ1dGU6ZnVuY3Rpb24odCxlKXt0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS0iK3R0KGUpKX0sZ2V0RGF0YUF0dHJpYnV0ZXM6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJue307dmFyIGU9cyh7fSx0LmRhdGFzZXQpO3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3RdPUooZVt0XSl9KSksZX0sZ2V0RGF0YUF0dHJpYnV0ZTpmdW5jdGlvbih0LGUpe3JldHVybiBKKHQuZ2V0QXR0cmlidXRlKCJkYXRhLSIrdHQoZSkpKX0sb2Zmc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3RvcDplLnRvcCtkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCxsZWZ0OmUubGVmdCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnR9fSxwb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm57dG9wOnQub2Zmc2V0VG9wLGxlZnQ6dC5vZmZzZXRMZWZ0fX0sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24odCxlKXt0JiYodC5jbGFzc0xpc3QuY29udGFpbnMoZSk/dC5jbGFzc0xpc3QucmVtb3ZlKGUpOnQuY2xhc3NMaXN0LmFkZChlKSl9fSxudD17bWF0Y2hlczpmdW5jdGlvbih0LGUpe3JldHVybiB0Lm1hdGNoZXMoZSl9LGZpbmQ6ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSwobj1bXSkuY29uY2F0LmFwcGx5KG4sQS5jYWxsKGUsdCkpfSxmaW5kT25lOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCksUy5jYWxsKGUsdCl9LGNoaWxkcmVuOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT0obj1bXSkuY29uY2F0LmFwcGx5KG4sdC5jaGlsZHJlbik7cmV0dXJuIGkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaGVzKGUpfSkpfSxwYXJlbnRzOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLGk9dC5wYXJlbnROb2RlO2kmJmkubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmMyE9PWkubm9kZVR5cGU7KXRoaXMubWF0Y2hlcyhpLGUpJiZuLnB1c2goaSksaT1pLnBhcmVudE5vZGU7cmV0dXJuIG59LHByZXY6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO247KXtpZihuLm1hdGNoZXMoZSkpcmV0dXJuW25dO249bi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nfXJldHVybltdfSxuZXh0OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubmV4dEVsZW1lbnRTaWJsaW5nO247KXtpZih0aGlzLm1hdGNoZXMobixlKSlyZXR1cm5bbl07bj1uLm5leHRFbGVtZW50U2libGluZ31yZXR1cm5bXX19LGl0PSJjYXJvdXNlbCIsb3Q9Ii5icy5jYXJvdXNlbCIsc3Q9e2ludGVydmFsOjVlMyxrZXlib2FyZDohMCxzbGlkZTohMSxwYXVzZToiaG92ZXIiLHdyYXA6ITAsdG91Y2g6ITB9LHJ0PXtpbnRlcnZhbDoiKG51bWJlcnxib29sZWFuKSIsa2V5Ym9hcmQ6ImJvb2xlYW4iLHNsaWRlOiIoYm9vbGVhbnxzdHJpbmcpIixwYXVzZToiKHN0cmluZ3xib29sZWFuKSIsd3JhcDoiYm9vbGVhbiIsdG91Y2g6ImJvb2xlYW4ifSxhdD17VE9VQ0g6InRvdWNoIixQRU46InBlbiJ9LGx0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMuX2l0ZW1zPW51bGwsdGhpcy5faW50ZXJ2YWw9bnVsbCx0aGlzLl9hY3RpdmVFbGVtZW50PW51bGwsdGhpcy5faXNQYXVzZWQ9ITEsdGhpcy5faXNTbGlkaW5nPSExLHRoaXMudG91Y2hUaW1lb3V0PW51bGwsdGhpcy50b3VjaFN0YXJ0WD0wLHRoaXMudG91Y2hEZWx0YVg9MCx0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMuX2VsZW1lbnQ9dCx0aGlzLl9pbmRpY2F0b3JzRWxlbWVudD1udC5maW5kT25lKCIuY2Fyb3VzZWwtaW5kaWNhdG9ycyIsdGhpcy5fZWxlbWVudCksdGhpcy5fdG91Y2hTdXBwb3J0ZWQ9Im9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cz4wLHRoaXMuX3BvaW50ZXJFdmVudD1Cb29sZWFuKHdpbmRvdy5Qb2ludGVyRXZlbnQpLHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCksVCh0LCJicy5jYXJvdXNlbCIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUubmV4dD1mdW5jdGlvbigpe3RoaXMuX2lzU2xpZGluZ3x8dGhpcy5fc2xpZGUoIm5leHQiKX0sZS5uZXh0V2hlblZpc2libGU9ZnVuY3Rpb24oKXshZG9jdW1lbnQuaGlkZGVuJiZiKHRoaXMuX2VsZW1lbnQpJiZ0aGlzLm5leHQoKX0sZS5wcmV2PWZ1bmN0aW9uKCl7dGhpcy5faXNTbGlkaW5nfHx0aGlzLl9zbGlkZSgicHJldiIpfSxlLnBhdXNlPWZ1bmN0aW9uKHQpe3R8fCh0aGlzLl9pc1BhdXNlZD0hMCksbnQuZmluZE9uZSgiLmNhcm91c2VsLWl0ZW0tbmV4dCwgLmNhcm91c2VsLWl0ZW0tcHJldiIsdGhpcy5fZWxlbWVudCkmJihwKHRoaXMuX2VsZW1lbnQpLHRoaXMuY3ljbGUoITApKSxjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKSx0aGlzLl9pbnRlcnZhbD1udWxsfSxlLmN5Y2xlPWZ1bmN0aW9uKHQpe3R8fCh0aGlzLl9pc1BhdXNlZD0hMSksdGhpcy5faW50ZXJ2YWwmJihjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKSx0aGlzLl9pbnRlcnZhbD1udWxsKSx0aGlzLl9jb25maWcmJnRoaXMuX2NvbmZpZy5pbnRlcnZhbCYmIXRoaXMuX2lzUGF1c2VkJiYodGhpcy5faW50ZXJ2YWw9c2V0SW50ZXJ2YWwoKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZT90aGlzLm5leHRXaGVuVmlzaWJsZTp0aGlzLm5leHQpLmJpbmQodGhpcyksdGhpcy5fY29uZmlnLmludGVydmFsKSl9LGUudG89ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLl9hY3RpdmVFbGVtZW50PW50LmZpbmRPbmUoIi5hY3RpdmUuY2Fyb3VzZWwtaXRlbSIsdGhpcy5fZWxlbWVudCk7dmFyIG49dGhpcy5fZ2V0SXRlbUluZGV4KHRoaXMuX2FjdGl2ZUVsZW1lbnQpO2lmKCEodD50aGlzLl9pdGVtcy5sZW5ndGgtMXx8dDwwKSlpZih0aGlzLl9pc1NsaWRpbmcpcS5vbmUodGhpcy5fZWxlbWVudCwic2xpZC5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGUudG8odCl9KSk7ZWxzZXtpZihuPT09dClyZXR1cm4gdGhpcy5wYXVzZSgpLHZvaWQgdGhpcy5jeWNsZSgpO3ZhciBpPXQ+bj8ibmV4dCI6InByZXYiO3RoaXMuX3NsaWRlKGksdGhpcy5faXRlbXNbdF0pfX0sZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cS5vZmYodGhpcy5fZWxlbWVudCxvdCksQyh0aGlzLl9lbGVtZW50LCJicy5jYXJvdXNlbCIpLHRoaXMuX2l0ZW1zPW51bGwsdGhpcy5fY29uZmlnPW51bGwsdGhpcy5fZWxlbWVudD1udWxsLHRoaXMuX2ludGVydmFsPW51bGwsdGhpcy5faXNQYXVzZWQ9bnVsbCx0aGlzLl9pc1NsaWRpbmc9bnVsbCx0aGlzLl9hY3RpdmVFbGVtZW50PW51bGwsdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQ9bnVsbH0sZS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiB0PXMocyh7fSxzdCksdCksdihpdCx0LHJ0KSx0fSxlLl9oYW5kbGVTd2lwZT1mdW5jdGlvbigpe3ZhciB0PU1hdGguYWJzKHRoaXMudG91Y2hEZWx0YVgpO2lmKCEodDw9NDApKXt2YXIgZT10L3RoaXMudG91Y2hEZWx0YVg7dGhpcy50b3VjaERlbHRhWD0wLGU+MCYmdGhpcy5wcmV2KCksZTwwJiZ0aGlzLm5leHQoKX19LGUuX2FkZEV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9jb25maWcua2V5Ym9hcmQmJnEub24odGhpcy5fZWxlbWVudCwia2V5ZG93bi5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9rZXlkb3duKGUpfSkpLCJob3ZlciI9PT10aGlzLl9jb25maWcucGF1c2UmJihxLm9uKHRoaXMuX2VsZW1lbnQsIm1vdXNlZW50ZXIuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbihlKXtyZXR1cm4gdC5wYXVzZShlKX0pKSxxLm9uKHRoaXMuX2VsZW1lbnQsIm1vdXNlbGVhdmUuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbihlKXtyZXR1cm4gdC5jeWNsZShlKX0pKSksdGhpcy5fY29uZmlnLnRvdWNoJiZ0aGlzLl90b3VjaFN1cHBvcnRlZCYmdGhpcy5fYWRkVG91Y2hFdmVudExpc3RlbmVycygpfSxlLl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWZ1bmN0aW9uKGUpe3QuX3BvaW50ZXJFdmVudCYmYXRbZS5wb2ludGVyVHlwZS50b1VwcGVyQ2FzZSgpXT90LnRvdWNoU3RhcnRYPWUuY2xpZW50WDp0Ll9wb2ludGVyRXZlbnR8fCh0LnRvdWNoU3RhcnRYPWUudG91Y2hlc1swXS5jbGllbnRYKX0sbj1mdW5jdGlvbihlKXt0Ll9wb2ludGVyRXZlbnQmJmF0W2UucG9pbnRlclR5cGUudG9VcHBlckNhc2UoKV0mJih0LnRvdWNoRGVsdGFYPWUuY2xpZW50WC10LnRvdWNoU3RhcnRYKSx0Ll9oYW5kbGVTd2lwZSgpLCJob3ZlciI9PT10Ll9jb25maWcucGF1c2UmJih0LnBhdXNlKCksdC50b3VjaFRpbWVvdXQmJmNsZWFyVGltZW91dCh0LnRvdWNoVGltZW91dCksdC50b3VjaFRpbWVvdXQ9c2V0VGltZW91dCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuY3ljbGUoZSl9KSw1MDArdC5fY29uZmlnLmludGVydmFsKSl9O250LmZpbmQoIi5jYXJvdXNlbC1pdGVtIGltZyIsdGhpcy5fZWxlbWVudCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cS5vbih0LCJkcmFnc3RhcnQuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbih0KXtyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpfSkpfSkpLHRoaXMuX3BvaW50ZXJFdmVudD8ocS5vbih0aGlzLl9lbGVtZW50LCJwb2ludGVyZG93bi5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfSkpLHEub24odGhpcy5fZWxlbWVudCwicG9pbnRlcnVwLmJzLmNhcm91c2VsIiwoZnVuY3Rpb24odCl7cmV0dXJuIG4odCl9KSksdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJwb2ludGVyLWV2ZW50IikpOihxLm9uKHRoaXMuX2VsZW1lbnQsInRvdWNoc3RhcnQuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbih0KXtyZXR1cm4gZSh0KX0pKSxxLm9uKHRoaXMuX2VsZW1lbnQsInRvdWNobW92ZS5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXtlLnRvdWNoZXMmJmUudG91Y2hlcy5sZW5ndGg+MT90LnRvdWNoRGVsdGFYPTA6dC50b3VjaERlbHRhWD1lLnRvdWNoZXNbMF0uY2xpZW50WC10LnRvdWNoU3RhcnRYfShlKX0pKSxxLm9uKHRoaXMuX2VsZW1lbnQsInRvdWNoZW5kLmJzLmNhcm91c2VsIiwoZnVuY3Rpb24odCl7cmV0dXJuIG4odCl9KSkpfSxlLl9rZXlkb3duPWZ1bmN0aW9uKHQpe2lmKCEvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KHQudGFyZ2V0LnRhZ05hbWUpKXN3aXRjaCh0LmtleSl7Y2FzZSJBcnJvd0xlZnQiOnQucHJldmVudERlZmF1bHQoKSx0aGlzLnByZXYoKTticmVhaztjYXNlIkFycm93UmlnaHQiOnQucHJldmVudERlZmF1bHQoKSx0aGlzLm5leHQoKX19LGUuX2dldEl0ZW1JbmRleD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXRlbXM9dCYmdC5wYXJlbnROb2RlP250LmZpbmQoIi5jYXJvdXNlbC1pdGVtIix0LnBhcmVudE5vZGUpOltdLHRoaXMuX2l0ZW1zLmluZGV4T2YodCl9LGUuX2dldEl0ZW1CeURpcmVjdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBuPSJuZXh0Ij09PXQsaT0icHJldiI9PT10LG89dGhpcy5fZ2V0SXRlbUluZGV4KGUpLHM9dGhpcy5faXRlbXMubGVuZ3RoLTE7aWYoKGkmJjA9PT1vfHxuJiZvPT09cykmJiF0aGlzLl9jb25maWcud3JhcClyZXR1cm4gZTt2YXIgcj0obysoInByZXYiPT09dD8tMToxKSkldGhpcy5faXRlbXMubGVuZ3RoO3JldHVybi0xPT09cj90aGlzLl9pdGVtc1t0aGlzLl9pdGVtcy5sZW5ndGgtMV06dGhpcy5faXRlbXNbcl19LGUuX3RyaWdnZXJTbGlkZUV2ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fZ2V0SXRlbUluZGV4KHQpLGk9dGhpcy5fZ2V0SXRlbUluZGV4KG50LmZpbmRPbmUoIi5hY3RpdmUuY2Fyb3VzZWwtaXRlbSIsdGhpcy5fZWxlbWVudCkpO3JldHVybiBxLnRyaWdnZXIodGhpcy5fZWxlbWVudCwic2xpZGUuYnMuY2Fyb3VzZWwiLHtyZWxhdGVkVGFyZ2V0OnQsZGlyZWN0aW9uOmUsZnJvbTppLHRvOm59KX0sZS5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudD1mdW5jdGlvbih0KXtpZih0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCl7Zm9yKHZhciBlPW50LmZpbmQoIi5hY3RpdmUiLHRoaXMuX2luZGljYXRvcnNFbGVtZW50KSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKTt2YXIgaT10aGlzLl9pbmRpY2F0b3JzRWxlbWVudC5jaGlsZHJlblt0aGlzLl9nZXRJdGVtSW5kZXgodCldO2kmJmkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIil9fSxlLl9zbGlkZT1mdW5jdGlvbih0LGUpe3ZhciBuLGksbyxzPXRoaXMscj1udC5maW5kT25lKCIuYWN0aXZlLmNhcm91c2VsLWl0ZW0iLHRoaXMuX2VsZW1lbnQpLGE9dGhpcy5fZ2V0SXRlbUluZGV4KHIpLGw9ZXx8ciYmdGhpcy5fZ2V0SXRlbUJ5RGlyZWN0aW9uKHQsciksYz10aGlzLl9nZXRJdGVtSW5kZXgobCksdT1Cb29sZWFuKHRoaXMuX2ludGVydmFsKTtpZigibmV4dCI9PT10PyhuPSJjYXJvdXNlbC1pdGVtLWxlZnQiLGk9ImNhcm91c2VsLWl0ZW0tbmV4dCIsbz0ibGVmdCIpOihuPSJjYXJvdXNlbC1pdGVtLXJpZ2h0IixpPSJjYXJvdXNlbC1pdGVtLXByZXYiLG89InJpZ2h0IiksbCYmbC5jbGFzc0xpc3QuY29udGFpbnMoImFjdGl2ZSIpKXRoaXMuX2lzU2xpZGluZz0hMTtlbHNlIGlmKCF0aGlzLl90cmlnZ2VyU2xpZGVFdmVudChsLG8pLmRlZmF1bHRQcmV2ZW50ZWQmJnImJmwpe2lmKHRoaXMuX2lzU2xpZGluZz0hMCx1JiZ0aGlzLnBhdXNlKCksdGhpcy5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChsKSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygic2xpZGUiKSl7bC5jbGFzc0xpc3QuYWRkKGkpLHcobCksci5jbGFzc0xpc3QuYWRkKG4pLGwuY2xhc3NMaXN0LmFkZChuKTt2YXIgaD1wYXJzZUludChsLmdldEF0dHJpYnV0ZSgiZGF0YS1pbnRlcnZhbCIpLDEwKTtoPyh0aGlzLl9jb25maWcuZGVmYXVsdEludGVydmFsPXRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWx8fHRoaXMuX2NvbmZpZy5pbnRlcnZhbCx0aGlzLl9jb25maWcuaW50ZXJ2YWw9aCk6dGhpcy5fY29uZmlnLmludGVydmFsPXRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWx8fHRoaXMuX2NvbmZpZy5pbnRlcnZhbDt2YXIgZj1nKHIpO3Eub25lKHIsInRyYW5zaXRpb25lbmQiLChmdW5jdGlvbigpe2wuY2xhc3NMaXN0LnJlbW92ZShuLGkpLGwuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIiksci5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiLGksbikscy5faXNTbGlkaW5nPSExLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cS50cmlnZ2VyKHMuX2VsZW1lbnQsInNsaWQuYnMuY2Fyb3VzZWwiLHtyZWxhdGVkVGFyZ2V0OmwsZGlyZWN0aW9uOm8sZnJvbTphLHRvOmN9KX0pLDApfSkpLF8ocixmKX1lbHNlIHIuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIiksbC5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKSx0aGlzLl9pc1NsaWRpbmc9ITEscS50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsInNsaWQuYnMuY2Fyb3VzZWwiLHtyZWxhdGVkVGFyZ2V0OmwsZGlyZWN0aW9uOm8sZnJvbTphLHRvOmN9KTt1JiZ0aGlzLmN5Y2xlKCl9fSx0LmNhcm91c2VsSW50ZXJmYWNlPWZ1bmN0aW9uKGUsbil7dmFyIGk9TChlLCJicy5jYXJvdXNlbCIpLG89cyhzKHt9LHN0KSxldC5nZXREYXRhQXR0cmlidXRlcyhlKSk7Im9iamVjdCI9PXR5cGVvZiBuJiYobz1zKHMoe30sbyksbikpO3ZhciByPSJzdHJpbmciPT10eXBlb2Ygbj9uOm8uc2xpZGU7aWYoaXx8KGk9bmV3IHQoZSxvKSksIm51bWJlciI9PXR5cGVvZiBuKWkudG8obik7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIHIpe2lmKHZvaWQgMD09PWlbcl0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK3IrJyInKTtpW3JdKCl9ZWxzZSBvLmludGVydmFsJiZvLnJpZGUmJihpLnBhdXNlKCksaS5jeWNsZSgpKX0sdC5qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt0LmNhcm91c2VsSW50ZXJmYWNlKHRoaXMsZSl9KSl9LHQuZGF0YUFwaUNsaWNrSGFuZGxlcj1mdW5jdGlvbihlKXt2YXIgbj1kKHRoaXMpO2lmKG4mJm4uY2xhc3NMaXN0LmNvbnRhaW5zKCJjYXJvdXNlbCIpKXt2YXIgaT1zKHMoe30sZXQuZ2V0RGF0YUF0dHJpYnV0ZXMobikpLGV0LmdldERhdGFBdHRyaWJ1dGVzKHRoaXMpKSxvPXRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLXRvIik7byYmKGkuaW50ZXJ2YWw9ITEpLHQuY2Fyb3VzZWxJbnRlcmZhY2UobixpKSxvJiZMKG4sImJzLmNhcm91c2VsIikudG8obyksZS5wcmV2ZW50RGVmYXVsdCgpfX0sdC5nZXRJbnN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gTCh0LCJicy5jYXJvdXNlbCIpfSxuKHQsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjUuMC4wLWFscGhhMSJ9fSx7a2V5OiJEZWZhdWx0IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gc3R9fV0pLHR9KCk7cS5vbihkb2N1bWVudCwiY2xpY2suYnMuY2Fyb3VzZWwuZGF0YS1hcGkiLCJbZGF0YS1zbGlkZV0sIFtkYXRhLXNsaWRlLXRvXSIsbHQuZGF0YUFwaUNsaWNrSGFuZGxlcikscS5vbih3aW5kb3csImxvYWQuYnMuY2Fyb3VzZWwuZGF0YS1hcGkiLChmdW5jdGlvbigpe2Zvcih2YXIgdD1udC5maW5kKCdbZGF0YS1yaWRlPSJjYXJvdXNlbCJdJyksZT0wLG49dC5sZW5ndGg7ZTxuO2UrKylsdC5jYXJvdXNlbEludGVyZmFjZSh0W2VdLEwodFtlXSwiYnMuY2Fyb3VzZWwiKSl9KSk7dmFyIGN0PUUoKTtpZihjdCl7dmFyIHV0PWN0LmZuW2l0XTtjdC5mbltpdF09bHQualF1ZXJ5SW50ZXJmYWNlLGN0LmZuW2l0XS5Db25zdHJ1Y3Rvcj1sdCxjdC5mbltpdF0ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBjdC5mbltpdF09dXQsbHQualF1ZXJ5SW50ZXJmYWNlfX12YXIgaHQ9ImNvbGxhcHNlIixmdD17dG9nZ2xlOiEwLHBhcmVudDoiIn0sZHQ9e3RvZ2dsZToiYm9vbGVhbiIscGFyZW50OiIoc3RyaW5nfGVsZW1lbnQpIn0sZ3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5faXNUcmFuc2l0aW9uaW5nPSExLHRoaXMuX2VsZW1lbnQ9dCx0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMuX3RyaWdnZXJBcnJheT1udC5maW5kKCdbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl1baHJlZj0iIycrdC5pZCsnIl0sW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2RhdGEtdGFyZ2V0PSIjJyt0LmlkKyciXScpO2Zvcih2YXIgbj1udC5maW5kKCdbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl0nKSxpPTAsbz1uLmxlbmd0aDtpPG87aSsrKXt2YXIgcz1uW2ldLHI9ZihzKSxhPW50LmZpbmQocikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9KSk7bnVsbCE9PXImJmEubGVuZ3RoJiYodGhpcy5fc2VsZWN0b3I9cix0aGlzLl90cmlnZ2VyQXJyYXkucHVzaChzKSl9dGhpcy5fcGFyZW50PXRoaXMuX2NvbmZpZy5wYXJlbnQ/dGhpcy5fZ2V0UGFyZW50KCk6bnVsbCx0aGlzLl9jb25maWcucGFyZW50fHx0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModGhpcy5fZWxlbWVudCx0aGlzLl90cmlnZ2VyQXJyYXkpLHRoaXMuX2NvbmZpZy50b2dnbGUmJnRoaXMudG9nZ2xlKCksVCh0LCJicy5jb2xsYXBzZSIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUudG9nZ2xlPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKT90aGlzLmhpZGUoKTp0aGlzLnNob3coKX0sZS5zaG93PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighdGhpcy5faXNUcmFuc2l0aW9uaW5nJiYhdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7dmFyIG4saTt0aGlzLl9wYXJlbnQmJjA9PT0obj1udC5maW5kKCIuc2hvdywgLmNvbGxhcHNpbmciLHRoaXMuX3BhcmVudCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUuX2NvbmZpZy5wYXJlbnQ/dC5nZXRBdHRyaWJ1dGUoImRhdGEtcGFyZW50Iik9PT1lLl9jb25maWcucGFyZW50OnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJjb2xsYXBzZSIpfSkpKS5sZW5ndGgmJihuPW51bGwpO3ZhciBvPW50LmZpbmRPbmUodGhpcy5fc2VsZWN0b3IpO2lmKG4pe3ZhciBzPW4uZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbyE9PXR9KSk7aWYoKGk9c1swXT9MKHNbMF0sImJzLmNvbGxhcHNlIik6bnVsbCkmJmkuX2lzVHJhbnNpdGlvbmluZylyZXR1cm59aWYoIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLmNvbGxhcHNlIikuZGVmYXVsdFByZXZlbnRlZCl7biYmbi5mb3JFYWNoKChmdW5jdGlvbihlKXtvIT09ZSYmdC5jb2xsYXBzZUludGVyZmFjZShlLCJoaWRlIiksaXx8VChlLCJicy5jb2xsYXBzZSIsbnVsbCl9KSk7dmFyIHI9dGhpcy5fZ2V0RGltZW5zaW9uKCk7dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJjb2xsYXBzZSIpLHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgiY29sbGFwc2luZyIpLHRoaXMuX2VsZW1lbnQuc3R5bGVbcl09MCx0aGlzLl90cmlnZ2VyQXJyYXkubGVuZ3RoJiZ0aGlzLl90cmlnZ2VyQXJyYXkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJjb2xsYXBzZWQiKSx0LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsITApfSkpLHRoaXMuc2V0VHJhbnNpdGlvbmluZyghMCk7dmFyIGE9InNjcm9sbCIrKHJbMF0udG9VcHBlckNhc2UoKStyLnNsaWNlKDEpKSxsPWcodGhpcy5fZWxlbWVudCk7cS5vbmUodGhpcy5fZWxlbWVudCwidHJhbnNpdGlvbmVuZCIsKGZ1bmN0aW9uKCl7ZS5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJjb2xsYXBzaW5nIiksZS5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJjb2xsYXBzZSIsInNob3ciKSxlLl9lbGVtZW50LnN0eWxlW3JdPSIiLGUuc2V0VHJhbnNpdGlvbmluZyghMSkscS50cmlnZ2VyKGUuX2VsZW1lbnQsInNob3duLmJzLmNvbGxhcHNlIil9KSksXyh0aGlzLl9lbGVtZW50LGwpLHRoaXMuX2VsZW1lbnQuc3R5bGVbcl09dGhpcy5fZWxlbWVudFthXSsicHgifX19LGUuaGlkZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoIXRoaXMuX2lzVHJhbnNpdGlvbmluZyYmdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSYmIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJoaWRlLmJzLmNvbGxhcHNlIikuZGVmYXVsdFByZXZlbnRlZCl7dmFyIGU9dGhpcy5fZ2V0RGltZW5zaW9uKCk7dGhpcy5fZWxlbWVudC5zdHlsZVtlXT10aGlzLl9lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2VdKyJweCIsdyh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoImNvbGxhcHNpbmciKSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoImNvbGxhcHNlIiwic2hvdyIpO3ZhciBuPXRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGg7aWYobj4wKWZvcih2YXIgaT0wO2k8bjtpKyspe3ZhciBvPXRoaXMuX3RyaWdnZXJBcnJheVtpXSxzPWQobyk7cyYmIXMuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikmJihvLmNsYXNzTGlzdC5hZGQoImNvbGxhcHNlZCIpLG8uc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwhMSkpfXRoaXMuc2V0VHJhbnNpdGlvbmluZyghMCk7dGhpcy5fZWxlbWVudC5zdHlsZVtlXT0iIjt2YXIgcj1nKHRoaXMuX2VsZW1lbnQpO3Eub25lKHRoaXMuX2VsZW1lbnQsInRyYW5zaXRpb25lbmQiLChmdW5jdGlvbigpe3Quc2V0VHJhbnNpdGlvbmluZyghMSksdC5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJjb2xsYXBzaW5nIiksdC5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJjb2xsYXBzZSIpLHEudHJpZ2dlcih0Ll9lbGVtZW50LCJoaWRkZW4uYnMuY29sbGFwc2UiKX0pKSxfKHRoaXMuX2VsZW1lbnQscil9fSxlLnNldFRyYW5zaXRpb25pbmc9ZnVuY3Rpb24odCl7dGhpcy5faXNUcmFuc2l0aW9uaW5nPXR9LGUuZGlzcG9zZT1mdW5jdGlvbigpe0ModGhpcy5fZWxlbWVudCwiYnMuY29sbGFwc2UiKSx0aGlzLl9jb25maWc9bnVsbCx0aGlzLl9wYXJlbnQ9bnVsbCx0aGlzLl9lbGVtZW50PW51bGwsdGhpcy5fdHJpZ2dlckFycmF5PW51bGwsdGhpcy5faXNUcmFuc2l0aW9uaW5nPW51bGx9LGUuX2dldENvbmZpZz1mdW5jdGlvbih0KXtyZXR1cm4odD1zKHMoe30sZnQpLHQpKS50b2dnbGU9Qm9vbGVhbih0LnRvZ2dsZSksdihodCx0LGR0KSx0fSxlLl9nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoIndpZHRoIik/IndpZHRoIjoiaGVpZ2h0In0sZS5fZ2V0UGFyZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX2NvbmZpZy5wYXJlbnQ7bShlKT92b2lkIDA9PT1lLmpxdWVyeSYmdm9pZCAwPT09ZVswXXx8KGU9ZVswXSk6ZT1udC5maW5kT25lKGUpO3ZhciBuPSdbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl1bZGF0YS1wYXJlbnQ9IicrZSsnIl0nO3JldHVybiBudC5maW5kKG4sZSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZChlKTt0Ll9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MobixbZV0pfSkpLGV9LGUuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcz1mdW5jdGlvbih0LGUpe2lmKHQpe3ZhciBuPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93Iik7ZS5sZW5ndGgmJmUuZm9yRWFjaCgoZnVuY3Rpb24odCl7bj90LmNsYXNzTGlzdC5yZW1vdmUoImNvbGxhcHNlZCIpOnQuY2xhc3NMaXN0LmFkZCgiY29sbGFwc2VkIiksdC5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLG4pfSkpfX0sdC5jb2xsYXBzZUludGVyZmFjZT1mdW5jdGlvbihlLG4pe3ZhciBpPUwoZSwiYnMuY29sbGFwc2UiKSxvPXMocyhzKHt9LGZ0KSxldC5nZXREYXRhQXR0cmlidXRlcyhlKSksIm9iamVjdCI9PXR5cGVvZiBuJiZuP246e30pO2lmKCFpJiZvLnRvZ2dsZSYmInN0cmluZyI9PXR5cGVvZiBuJiYvc2hvd3xoaWRlLy50ZXN0KG4pJiYoby50b2dnbGU9ITEpLGl8fChpPW5ldyB0KGUsbykpLCJzdHJpbmciPT10eXBlb2Ygbil7aWYodm9pZCAwPT09aVtuXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrbisnIicpO2lbbl0oKX19LHQualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dC5jb2xsYXBzZUludGVyZmFjZSh0aGlzLGUpfSkpfSx0LmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLmNvbGxhcHNlIil9LG4odCxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBmdH19XSksdH0oKTtxLm9uKGRvY3VtZW50LCJjbGljay5icy5jb2xsYXBzZS5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0iY29sbGFwc2UiXScsKGZ1bmN0aW9uKHQpeyJBIj09PXQudGFyZ2V0LnRhZ05hbWUmJnQucHJldmVudERlZmF1bHQoKTt2YXIgZT1ldC5nZXREYXRhQXR0cmlidXRlcyh0aGlzKSxuPWYodGhpcyk7bnQuZmluZChuKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbixpPUwodCwiYnMuY29sbGFwc2UiKTtpPyhudWxsPT09aS5fcGFyZW50JiYic3RyaW5nIj09dHlwZW9mIGUucGFyZW50JiYoaS5fY29uZmlnLnBhcmVudD1lLnBhcmVudCxpLl9wYXJlbnQ9aS5fZ2V0UGFyZW50KCkpLG49InRvZ2dsZSIpOm49ZSxndC5jb2xsYXBzZUludGVyZmFjZSh0LG4pfSkpfSkpO3ZhciBwdD1FKCk7aWYocHQpe3ZhciBtdD1wdC5mbltodF07cHQuZm5baHRdPWd0LmpRdWVyeUludGVyZmFjZSxwdC5mbltodF0uQ29uc3RydWN0b3I9Z3QscHQuZm5baHRdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gcHQuZm5baHRdPW10LGd0LmpRdWVyeUludGVyZmFjZX19dmFyIF90PSJkcm9wZG93biIsdnQ9bmV3IFJlZ0V4cCgiQXJyb3dVcHxBcnJvd0Rvd258RXNjYXBlIiksYnQ9e29mZnNldDowLGZsaXA6ITAsYm91bmRhcnk6InNjcm9sbFBhcmVudCIscmVmZXJlbmNlOiJ0b2dnbGUiLGRpc3BsYXk6ImR5bmFtaWMiLHBvcHBlckNvbmZpZzpudWxsfSx5dD17b2Zmc2V0OiIobnVtYmVyfHN0cmluZ3xmdW5jdGlvbikiLGZsaXA6ImJvb2xlYW4iLGJvdW5kYXJ5OiIoc3RyaW5nfGVsZW1lbnQpIixyZWZlcmVuY2U6IihzdHJpbmd8ZWxlbWVudCkiLGRpc3BsYXk6InN0cmluZyIscG9wcGVyQ29uZmlnOiIobnVsbHxvYmplY3QpIn0sd3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsZSl7dGhpcy5fZWxlbWVudD10LHRoaXMuX3BvcHBlcj1udWxsLHRoaXMuX2NvbmZpZz10aGlzLl9nZXRDb25maWcoZSksdGhpcy5fbWVudT10aGlzLl9nZXRNZW51RWxlbWVudCgpLHRoaXMuX2luTmF2YmFyPXRoaXMuX2RldGVjdE5hdmJhcigpLHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCksVCh0LCJicy5kcm9wZG93biIsdGhpcyl9dmFyIGk9ZS5wcm90b3R5cGU7cmV0dXJuIGkudG9nZ2xlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2VsZW1lbnQuZGlzYWJsZWQmJiF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZGlzYWJsZWQiKSl7dmFyIHQ9dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKTtlLmNsZWFyTWVudXMoKSx0fHx0aGlzLnNob3coKX19LGkuc2hvdz1mdW5jdGlvbigpe2lmKCEodGhpcy5fZWxlbWVudC5kaXNhYmxlZHx8dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoImRpc2FibGVkIil8fHRoaXMuX21lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpKXt2YXIgbj1lLmdldFBhcmVudEZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpLGk9e3JlbGF0ZWRUYXJnZXQ6dGhpcy5fZWxlbWVudH07aWYoIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLmRyb3Bkb3duIixpKS5kZWZhdWx0UHJldmVudGVkKXtpZighdGhpcy5faW5OYXZiYXIpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQm9vdHN0cmFwJ3MgZHJvcGRvd25zIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpIik7dmFyIG89dGhpcy5fZWxlbWVudDsicGFyZW50Ij09PXRoaXMuX2NvbmZpZy5yZWZlcmVuY2U/bz1uOm0odGhpcy5fY29uZmlnLnJlZmVyZW5jZSkmJihvPXRoaXMuX2NvbmZpZy5yZWZlcmVuY2Usdm9pZCAwIT09dGhpcy5fY29uZmlnLnJlZmVyZW5jZS5qcXVlcnkmJihvPXRoaXMuX2NvbmZpZy5yZWZlcmVuY2VbMF0pKSwic2Nyb2xsUGFyZW50IiE9PXRoaXMuX2NvbmZpZy5ib3VuZGFyeSYmbi5jbGFzc0xpc3QuYWRkKCJwb3NpdGlvbi1zdGF0aWMiKSx0aGlzLl9wb3BwZXI9bmV3IHQobyx0aGlzLl9tZW51LHRoaXMuX2dldFBvcHBlckNvbmZpZygpKX12YXIgcztpZigib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmIW4uY2xvc2VzdCgiLm5hdmJhci1uYXYiKSkocz1bXSkuY29uY2F0LmFwcGx5KHMsZG9jdW1lbnQuYm9keS5jaGlsZHJlbikuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHEub24odCwibW91c2VvdmVyIixudWxsLChmdW5jdGlvbigpe30pKX0pKTt0aGlzLl9lbGVtZW50LmZvY3VzKCksdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLCEwKSxldC50b2dnbGVDbGFzcyh0aGlzLl9tZW51LCJzaG93IiksZXQudG9nZ2xlQ2xhc3ModGhpcy5fZWxlbWVudCwic2hvdyIpLHEudHJpZ2dlcihuLCJzaG93bi5icy5kcm9wZG93biIsaSl9fX0saS5oaWRlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2VsZW1lbnQuZGlzYWJsZWQmJiF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZGlzYWJsZWQiKSYmdGhpcy5fbWVudS5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7dmFyIHQ9ZS5nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KSxuPXtyZWxhdGVkVGFyZ2V0OnRoaXMuX2VsZW1lbnR9O3EudHJpZ2dlcih0LCJoaWRlLmJzLmRyb3Bkb3duIixuKS5kZWZhdWx0UHJldmVudGVkfHwodGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIuZGVzdHJveSgpLGV0LnRvZ2dsZUNsYXNzKHRoaXMuX21lbnUsInNob3ciKSxldC50b2dnbGVDbGFzcyh0aGlzLl9lbGVtZW50LCJzaG93IikscS50cmlnZ2VyKHQsImhpZGRlbi5icy5kcm9wZG93biIsbikpfX0saS5kaXNwb3NlPWZ1bmN0aW9uKCl7Qyh0aGlzLl9lbGVtZW50LCJicy5kcm9wZG93biIpLHEub2ZmKHRoaXMuX2VsZW1lbnQsIi5icy5kcm9wZG93biIpLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl9tZW51PW51bGwsdGhpcy5fcG9wcGVyJiYodGhpcy5fcG9wcGVyLmRlc3Ryb3koKSx0aGlzLl9wb3BwZXI9bnVsbCl9LGkudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5faW5OYXZiYXI9dGhpcy5fZGV0ZWN0TmF2YmFyKCksdGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKX0saS5fYWRkRXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3Eub24odGhpcy5fZWxlbWVudCwiY2xpY2suYnMuZHJvcGRvd24iLChmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSx0LnRvZ2dsZSgpfSkpfSxpLl9nZXRDb25maWc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9cyhzKHMoe30sdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0KSxldC5nZXREYXRhQXR0cmlidXRlcyh0aGlzLl9lbGVtZW50KSksdCksdihfdCx0LHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpLHR9LGkuX2dldE1lbnVFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIG50Lm5leHQodGhpcy5fZWxlbWVudCwiLmRyb3Bkb3duLW1lbnUiKVswXX0saS5fZ2V0UGxhY2VtZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLGU9ImJvdHRvbS1zdGFydCI7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wdXAiKT8oZT0idG9wLXN0YXJ0Iix0aGlzLl9tZW51LmNsYXNzTGlzdC5jb250YWlucygiZHJvcGRvd24tbWVudS1yaWdodCIpJiYoZT0idG9wLWVuZCIpKTp0LmNsYXNzTGlzdC5jb250YWlucygiZHJvcHJpZ2h0Iik/ZT0icmlnaHQtc3RhcnQiOnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wbGVmdCIpP2U9ImxlZnQtc3RhcnQiOnRoaXMuX21lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wZG93bi1tZW51LXJpZ2h0IikmJihlPSJib3R0b20tZW5kIiksZX0saS5fZGV0ZWN0TmF2YmFyPWZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5fZWxlbWVudC5jbG9zZXN0KCIubmF2YmFyIikpfSxpLl9nZXRPZmZzZXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9e307cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX2NvbmZpZy5vZmZzZXQ/ZS5mbj1mdW5jdGlvbihlKXtyZXR1cm4gZS5vZmZzZXRzPXMocyh7fSxlLm9mZnNldHMpLHQuX2NvbmZpZy5vZmZzZXQoZS5vZmZzZXRzLHQuX2VsZW1lbnQpfHx7fSksZX06ZS5vZmZzZXQ9dGhpcy5fY29uZmlnLm9mZnNldCxlfSxpLl9nZXRQb3BwZXJDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD17cGxhY2VtZW50OnRoaXMuX2dldFBsYWNlbWVudCgpLG1vZGlmaWVyczp7b2Zmc2V0OnRoaXMuX2dldE9mZnNldCgpLGZsaXA6e2VuYWJsZWQ6dGhpcy5fY29uZmlnLmZsaXB9LHByZXZlbnRPdmVyZmxvdzp7Ym91bmRhcmllc0VsZW1lbnQ6dGhpcy5fY29uZmlnLmJvdW5kYXJ5fX19O3JldHVybiJzdGF0aWMiPT09dGhpcy5fY29uZmlnLmRpc3BsYXkmJih0Lm1vZGlmaWVycy5hcHBseVN0eWxlPXtlbmFibGVkOiExfSkscyhzKHt9LHQpLHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcpfSxlLmRyb3Bkb3duSW50ZXJmYWNlPWZ1bmN0aW9uKHQsbil7dmFyIGk9TCh0LCJicy5kcm9wZG93biIpO2lmKGl8fChpPW5ldyBlKHQsIm9iamVjdCI9PXR5cGVvZiBuP246bnVsbCkpLCJzdHJpbmciPT10eXBlb2Ygbil7aWYodm9pZCAwPT09aVtuXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrbisnIicpO2lbbl0oKX19LGUualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7ZS5kcm9wZG93bkludGVyZmFjZSh0aGlzLHQpfSkpfSxlLmNsZWFyTWVudXM9ZnVuY3Rpb24odCl7aWYoIXR8fDIhPT10LmJ1dHRvbiYmKCJrZXl1cCIhPT10LnR5cGV8fCJUYWIiPT09dC5rZXkpKWZvcih2YXIgbj1udC5maW5kKCdbZGF0YS10b2dnbGU9ImRyb3Bkb3duIl0nKSxpPTAsbz1uLmxlbmd0aDtpPG87aSsrKXt2YXIgcz1lLmdldFBhcmVudEZyb21FbGVtZW50KG5baV0pLHI9TChuW2ldLCJicy5kcm9wZG93biIpLGE9e3JlbGF0ZWRUYXJnZXQ6bltpXX07aWYodCYmImNsaWNrIj09PXQudHlwZSYmKGEuY2xpY2tFdmVudD10KSxyKXt2YXIgbD1yLl9tZW51O2lmKG5baV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpaWYoISh0JiYoImNsaWNrIj09PXQudHlwZSYmL2lucHV0fHRleHRhcmVhL2kudGVzdCh0LnRhcmdldC50YWdOYW1lKXx8ImtleXVwIj09PXQudHlwZSYmIlRhYiI9PT10LmtleSkmJmwuY29udGFpbnModC50YXJnZXQpKSlpZighcS50cmlnZ2VyKHMsImhpZGUuYnMuZHJvcGRvd24iLGEpLmRlZmF1bHRQcmV2ZW50ZWQpe3ZhciBjO2lmKCJvbnRvdWNoc3RhcnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KShjPVtdKS5jb25jYXQuYXBwbHkoYyxkb2N1bWVudC5ib2R5LmNoaWxkcmVuKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gcS5vZmYodCwibW91c2VvdmVyIixudWxsLChmdW5jdGlvbigpe30pKX0pKTtuW2ldLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsImZhbHNlIiksci5fcG9wcGVyJiZyLl9wb3BwZXIuZGVzdHJveSgpLGwuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLG5baV0uY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHEudHJpZ2dlcihzLCJoaWRkZW4uYnMuZHJvcGRvd24iLGEpfX19fSxlLmdldFBhcmVudEZyb21FbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiBkKHQpfHx0LnBhcmVudE5vZGV9LGUuZGF0YUFwaUtleWRvd25IYW5kbGVyPWZ1bmN0aW9uKHQpe2lmKCEoL2lucHV0fHRleHRhcmVhL2kudGVzdCh0LnRhcmdldC50YWdOYW1lKT8iU3BhY2UiPT09dC5rZXl8fCJFc2NhcGUiIT09dC5rZXkmJigiQXJyb3dEb3duIiE9PXQua2V5JiYiQXJyb3dVcCIhPT10LmtleXx8dC50YXJnZXQuY2xvc2VzdCgiLmRyb3Bkb3duLW1lbnUiKSk6IXZ0LnRlc3QodC5rZXkpKSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLCF0aGlzLmRpc2FibGVkJiYhdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoImRpc2FibGVkIikpKXt2YXIgbj1lLmdldFBhcmVudEZyb21FbGVtZW50KHRoaXMpLGk9dGhpcy5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKTtpZigiRXNjYXBlIj09PXQua2V5KXJldHVybih0aGlzLm1hdGNoZXMoJ1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScpP3RoaXM6bnQucHJldih0aGlzLCdbZGF0YS10b2dnbGU9ImRyb3Bkb3duIl0nKVswXSkuZm9jdXMoKSx2b2lkIGUuY2xlYXJNZW51cygpO2lmKGkmJiJTcGFjZSIhPT10LmtleSl7dmFyIG89bnQuZmluZCgiLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWl0ZW06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCkiLG4pLmZpbHRlcihiKTtpZihvLmxlbmd0aCl7dmFyIHM9by5pbmRleE9mKHQudGFyZ2V0KTsiQXJyb3dVcCI9PT10LmtleSYmcz4wJiZzLS0sIkFycm93RG93biI9PT10LmtleSYmczxvLmxlbmd0aC0xJiZzKyssb1tzPS0xPT09cz8wOnNdLmZvY3VzKCl9fWVsc2UgZS5jbGVhck1lbnVzKCl9fSxlLmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLmRyb3Bkb3duIil9LG4oZSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBidH19LHtrZXk6IkRlZmF1bHRUeXBlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geXR9fV0pLGV9KCk7cS5vbihkb2N1bWVudCwia2V5ZG93bi5icy5kcm9wZG93bi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScsd3QuZGF0YUFwaUtleWRvd25IYW5kbGVyKSxxLm9uKGRvY3VtZW50LCJrZXlkb3duLmJzLmRyb3Bkb3duLmRhdGEtYXBpIiwiLmRyb3Bkb3duLW1lbnUiLHd0LmRhdGFBcGlLZXlkb3duSGFuZGxlcikscS5vbihkb2N1bWVudCwiY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGkiLHd0LmNsZWFyTWVudXMpLHEub24oZG9jdW1lbnQsImtleXVwLmJzLmRyb3Bkb3duLmRhdGEtYXBpIix3dC5jbGVhck1lbnVzKSxxLm9uKGRvY3VtZW50LCJjbGljay5icy5kcm9wZG93bi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScsKGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLHd0LmRyb3Bkb3duSW50ZXJmYWNlKHRoaXMsInRvZ2dsZSIpfSkpLHEub24oZG9jdW1lbnQsImNsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpIiwiLmRyb3Bkb3duIGZvcm0iLChmdW5jdGlvbih0KXtyZXR1cm4gdC5zdG9wUHJvcGFnYXRpb24oKX0pKTt2YXIgRXQ9RSgpO2lmKEV0KXt2YXIga3Q9RXQuZm5bX3RdO0V0LmZuW190XT13dC5qUXVlcnlJbnRlcmZhY2UsRXQuZm5bX3RdLkNvbnN0cnVjdG9yPXd0LEV0LmZuW190XS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIEV0LmZuW190XT1rdCx3dC5qUXVlcnlJbnRlcmZhY2V9fXZhciBUdD17YmFja2Ryb3A6ITAsa2V5Ym9hcmQ6ITAsZm9jdXM6ITAsc2hvdzohMH0sTHQ9e2JhY2tkcm9wOiIoYm9vbGVhbnxzdHJpbmcpIixrZXlib2FyZDoiYm9vbGVhbiIsZm9jdXM6ImJvb2xlYW4iLHNob3c6ImJvb2xlYW4ifSxDdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMuX2VsZW1lbnQ9dCx0aGlzLl9kaWFsb2c9bnQuZmluZE9uZSgiLm1vZGFsLWRpYWxvZyIsdCksdGhpcy5fYmFja2Ryb3A9bnVsbCx0aGlzLl9pc1Nob3duPSExLHRoaXMuX2lzQm9keU92ZXJmbG93aW5nPSExLHRoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9ITEsdGhpcy5faXNUcmFuc2l0aW9uaW5nPSExLHRoaXMuX3Njcm9sbGJhcldpZHRoPTAsVCh0LCJicy5tb2RhbCIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUudG9nZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pc1Nob3duP3RoaXMuaGlkZSgpOnRoaXMuc2hvdyh0KX0sZS5zaG93PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoIXRoaXMuX2lzU2hvd24mJiF0aGlzLl9pc1RyYW5zaXRpb25pbmcpe3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIikmJih0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITApO3ZhciBuPXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLm1vZGFsIix7cmVsYXRlZFRhcmdldDp0fSk7dGhpcy5faXNTaG93bnx8bi5kZWZhdWx0UHJldmVudGVkfHwodGhpcy5faXNTaG93bj0hMCx0aGlzLl9jaGVja1Njcm9sbGJhcigpLHRoaXMuX3NldFNjcm9sbGJhcigpLHRoaXMuX2FkanVzdERpYWxvZygpLHRoaXMuX3NldEVzY2FwZUV2ZW50KCksdGhpcy5fc2V0UmVzaXplRXZlbnQoKSxxLm9uKHRoaXMuX2VsZW1lbnQsImNsaWNrLmRpc21pc3MuYnMubW9kYWwiLCdbZGF0YS1kaXNtaXNzPSJtb2RhbCJdJywoZnVuY3Rpb24odCl7cmV0dXJuIGUuaGlkZSh0KX0pKSxxLm9uKHRoaXMuX2RpYWxvZywibW91c2Vkb3duLmRpc21pc3MuYnMubW9kYWwiLChmdW5jdGlvbigpe3Eub25lKGUuX2VsZW1lbnQsIm1vdXNldXAuZGlzbWlzcy5icy5tb2RhbCIsKGZ1bmN0aW9uKHQpe3QudGFyZ2V0PT09ZS5fZWxlbWVudCYmKGUuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9ITApfSkpfSkpLHRoaXMuX3Nob3dCYWNrZHJvcCgoZnVuY3Rpb24oKXtyZXR1cm4gZS5fc2hvd0VsZW1lbnQodCl9KSkpfX0sZS5oaWRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoKHQmJnQucHJldmVudERlZmF1bHQoKSx0aGlzLl9pc1Nob3duJiYhdGhpcy5faXNUcmFuc2l0aW9uaW5nKSYmIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJoaWRlLmJzLm1vZGFsIikuZGVmYXVsdFByZXZlbnRlZCl7dGhpcy5faXNTaG93bj0hMTt2YXIgbj10aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZmFkZSIpO2lmKG4mJih0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITApLHRoaXMuX3NldEVzY2FwZUV2ZW50KCksdGhpcy5fc2V0UmVzaXplRXZlbnQoKSxxLm9mZihkb2N1bWVudCwiZm9jdXNpbi5icy5tb2RhbCIpLHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHEub2ZmKHRoaXMuX2VsZW1lbnQsImNsaWNrLmRpc21pc3MuYnMubW9kYWwiKSxxLm9mZih0aGlzLl9kaWFsb2csIm1vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsIiksbil7dmFyIGk9Zyh0aGlzLl9lbGVtZW50KTtxLm9uZSh0aGlzLl9lbGVtZW50LCJ0cmFuc2l0aW9uZW5kIiwoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2hpZGVNb2RhbCh0KX0pKSxfKHRoaXMuX2VsZW1lbnQsaSl9ZWxzZSB0aGlzLl9oaWRlTW9kYWwoKX19LGUuZGlzcG9zZT1mdW5jdGlvbigpe1t3aW5kb3csdGhpcy5fZWxlbWVudCx0aGlzLl9kaWFsb2ddLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBxLm9mZih0LCIuYnMubW9kYWwiKX0pKSxxLm9mZihkb2N1bWVudCwiZm9jdXNpbi5icy5tb2RhbCIpLEModGhpcy5fZWxlbWVudCwiYnMubW9kYWwiKSx0aGlzLl9jb25maWc9bnVsbCx0aGlzLl9lbGVtZW50PW51bGwsdGhpcy5fZGlhbG9nPW51bGwsdGhpcy5fYmFja2Ryb3A9bnVsbCx0aGlzLl9pc1Nob3duPW51bGwsdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmc9bnVsbCx0aGlzLl9pZ25vcmVCYWNrZHJvcENsaWNrPW51bGwsdGhpcy5faXNUcmFuc2l0aW9uaW5nPW51bGwsdGhpcy5fc2Nyb2xsYmFyV2lkdGg9bnVsbH0sZS5oYW5kbGVVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9hZGp1c3REaWFsb2coKX0sZS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiB0PXMocyh7fSxUdCksdCksdigibW9kYWwiLHQsTHQpLHR9LGUuX3Nob3dFbGVtZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZmFkZSIpLGk9bnQuZmluZE9uZSgiLm1vZGFsLWJvZHkiLHRoaXMuX2RpYWxvZyk7dGhpcy5fZWxlbWVudC5wYXJlbnROb2RlJiZ0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERXx8ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKSx0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1tb2RhbCIsITApLHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCJyb2xlIiwiZGlhbG9nIiksdGhpcy5fZWxlbWVudC5zY3JvbGxUb3A9MCxpJiYoaS5zY3JvbGxUb3A9MCksbiYmdyh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoInNob3ciKSx0aGlzLl9jb25maWcuZm9jdXMmJnRoaXMuX2VuZm9yY2VGb2N1cygpO3ZhciBvPWZ1bmN0aW9uKCl7ZS5fY29uZmlnLmZvY3VzJiZlLl9lbGVtZW50LmZvY3VzKCksZS5faXNUcmFuc2l0aW9uaW5nPSExLHEudHJpZ2dlcihlLl9lbGVtZW50LCJzaG93bi5icy5tb2RhbCIse3JlbGF0ZWRUYXJnZXQ6dH0pfTtpZihuKXt2YXIgcz1nKHRoaXMuX2RpYWxvZyk7cS5vbmUodGhpcy5fZGlhbG9nLCJ0cmFuc2l0aW9uZW5kIixvKSxfKHRoaXMuX2RpYWxvZyxzKX1lbHNlIG8oKX0sZS5fZW5mb3JjZUZvY3VzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztxLm9mZihkb2N1bWVudCwiZm9jdXNpbi5icy5tb2RhbCIpLHEub24oZG9jdW1lbnQsImZvY3VzaW4uYnMubW9kYWwiLChmdW5jdGlvbihlKXtkb2N1bWVudD09PWUudGFyZ2V0fHx0Ll9lbGVtZW50PT09ZS50YXJnZXR8fHQuX2VsZW1lbnQuY29udGFpbnMoZS50YXJnZXQpfHx0Ll9lbGVtZW50LmZvY3VzKCl9KSl9LGUuX3NldEVzY2FwZUV2ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9pc1Nob3duP3Eub24odGhpcy5fZWxlbWVudCwia2V5ZG93bi5kaXNtaXNzLmJzLm1vZGFsIiwoZnVuY3Rpb24oZSl7dC5fY29uZmlnLmtleWJvYXJkJiYiRXNjYXBlIj09PWUua2V5PyhlLnByZXZlbnREZWZhdWx0KCksdC5oaWRlKCkpOnQuX2NvbmZpZy5rZXlib2FyZHx8IkVzY2FwZSIhPT1lLmtleXx8dC5fdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpfSkpOnEub2ZmKHRoaXMuX2VsZW1lbnQsImtleWRvd24uZGlzbWlzcy5icy5tb2RhbCIpfSxlLl9zZXRSZXNpemVFdmVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5faXNTaG93bj9xLm9uKHdpbmRvdywicmVzaXplLmJzLm1vZGFsIiwoZnVuY3Rpb24oKXtyZXR1cm4gdC5fYWRqdXN0RGlhbG9nKCl9KSk6cS5vZmYod2luZG93LCJyZXNpemUuYnMubW9kYWwiKX0sZS5faGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsITApLHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLW1vZGFsIiksdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKSx0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITEsdGhpcy5fc2hvd0JhY2tkcm9wKChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgibW9kYWwtb3BlbiIpLHQuX3Jlc2V0QWRqdXN0bWVudHMoKSx0Ll9yZXNldFNjcm9sbGJhcigpLHEudHJpZ2dlcih0Ll9lbGVtZW50LCJoaWRkZW4uYnMubW9kYWwiKX0pKX0sZS5fcmVtb3ZlQmFja2Ryb3A9ZnVuY3Rpb24oKXt0aGlzLl9iYWNrZHJvcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2JhY2tkcm9wKSx0aGlzLl9iYWNrZHJvcD1udWxsfSxlLl9zaG93QmFja2Ryb3A9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIik/ImZhZGUiOiIiO2lmKHRoaXMuX2lzU2hvd24mJnRoaXMuX2NvbmZpZy5iYWNrZHJvcCl7aWYodGhpcy5fYmFja2Ryb3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fYmFja2Ryb3AuY2xhc3NOYW1lPSJtb2RhbC1iYWNrZHJvcCIsbiYmdGhpcy5fYmFja2Ryb3AuY2xhc3NMaXN0LmFkZChuKSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2JhY2tkcm9wKSxxLm9uKHRoaXMuX2VsZW1lbnQsImNsaWNrLmRpc21pc3MuYnMubW9kYWwiLChmdW5jdGlvbih0KXtlLl9pZ25vcmVCYWNrZHJvcENsaWNrP2UuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9ITE6dC50YXJnZXQ9PT10LmN1cnJlbnRUYXJnZXQmJmUuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKX0pKSxuJiZ3KHRoaXMuX2JhY2tkcm9wKSx0aGlzLl9iYWNrZHJvcC5jbGFzc0xpc3QuYWRkKCJzaG93IiksIW4pcmV0dXJuIHZvaWQgdCgpO3ZhciBpPWcodGhpcy5fYmFja2Ryb3ApO3Eub25lKHRoaXMuX2JhY2tkcm9wLCJ0cmFuc2l0aW9uZW5kIix0KSxfKHRoaXMuX2JhY2tkcm9wLGkpfWVsc2UgaWYoIXRoaXMuX2lzU2hvd24mJnRoaXMuX2JhY2tkcm9wKXt0aGlzLl9iYWNrZHJvcC5jbGFzc0xpc3QucmVtb3ZlKCJzaG93Iik7dmFyIG89ZnVuY3Rpb24oKXtlLl9yZW1vdmVCYWNrZHJvcCgpLHQoKX07aWYodGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoImZhZGUiKSl7dmFyIHM9Zyh0aGlzLl9iYWNrZHJvcCk7cS5vbmUodGhpcy5fYmFja2Ryb3AsInRyYW5zaXRpb25lbmQiLG8pLF8odGhpcy5fYmFja2Ryb3Ascyl9ZWxzZSBvKCl9ZWxzZSB0KCl9LGUuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKCJzdGF0aWMiPT09dGhpcy5fY29uZmlnLmJhY2tkcm9wKXtpZihxLnRyaWdnZXIodGhpcy5fZWxlbWVudCwiaGlkZVByZXZlbnRlZC5icy5tb2RhbCIpLmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuO3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgibW9kYWwtc3RhdGljIik7dmFyIGU9Zyh0aGlzLl9lbGVtZW50KTtxLm9uZSh0aGlzLl9lbGVtZW50LCJ0cmFuc2l0aW9uZW5kIiwoZnVuY3Rpb24oKXt0Ll9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoIm1vZGFsLXN0YXRpYyIpfSkpLF8odGhpcy5fZWxlbWVudCxlKSx0aGlzLl9lbGVtZW50LmZvY3VzKCl9ZWxzZSB0aGlzLmhpZGUoKX0sZS5fYWRqdXN0RGlhbG9nPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDshdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcmJnQmJih0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0PXRoaXMuX3Njcm9sbGJhcldpZHRoKyJweCIpLHRoaXMuX2lzQm9keU92ZXJmbG93aW5nJiYhdCYmKHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0PXRoaXMuX3Njcm9sbGJhcldpZHRoKyJweCIpfSxlLl9yZXNldEFkanVzdG1lbnRzPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdD0iIix0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodD0iIn0sZS5fY2hlY2tTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuX2lzQm9keU92ZXJmbG93aW5nPU1hdGgucm91bmQodC5sZWZ0K3QucmlnaHQpPHdpbmRvdy5pbm5lcldpZHRoLHRoaXMuX3Njcm9sbGJhcldpZHRoPXRoaXMuX2dldFNjcm9sbGJhcldpZHRoKCl9LGUuX3NldFNjcm9sbGJhcj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcpe250LmZpbmQoIi5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AiKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLnN0eWxlLnBhZGRpbmdSaWdodCxpPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpWyJwYWRkaW5nLXJpZ2h0Il07ZXQuc2V0RGF0YUF0dHJpYnV0ZShlLCJwYWRkaW5nLXJpZ2h0IixuKSxlLnN0eWxlLnBhZGRpbmdSaWdodD1wYXJzZUZsb2F0KGkpK3QuX3Njcm9sbGJhcldpZHRoKyJweCJ9KSksbnQuZmluZCgiLnN0aWNreS10b3AiKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLnN0eWxlLm1hcmdpblJpZ2h0LGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSlbIm1hcmdpbi1yaWdodCJdO2V0LnNldERhdGFBdHRyaWJ1dGUoZSwibWFyZ2luLXJpZ2h0IixuKSxlLnN0eWxlLm1hcmdpblJpZ2h0PXBhcnNlRmxvYXQoaSktdC5fc2Nyb2xsYmFyV2lkdGgrInB4In0pKTt2YXIgZT1kb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCxuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpWyJwYWRkaW5nLXJpZ2h0Il07ZXQuc2V0RGF0YUF0dHJpYnV0ZShkb2N1bWVudC5ib2R5LCJwYWRkaW5nLXJpZ2h0IixlKSxkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1wYXJzZUZsb2F0KG4pK3RoaXMuX3Njcm9sbGJhcldpZHRoKyJweCJ9ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJtb2RhbC1vcGVuIil9LGUuX3Jlc2V0U2Nyb2xsYmFyPWZ1bmN0aW9uKCl7bnQuZmluZCgiLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcCIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPWV0LmdldERhdGFBdHRyaWJ1dGUodCwicGFkZGluZy1yaWdodCIpO3ZvaWQgMCE9PWUmJihldC5yZW1vdmVEYXRhQXR0cmlidXRlKHQsInBhZGRpbmctcmlnaHQiKSx0LnN0eWxlLnBhZGRpbmdSaWdodD1lKX0pKSxudC5maW5kKCIuc3RpY2t5LXRvcCIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPWV0LmdldERhdGFBdHRyaWJ1dGUodCwibWFyZ2luLXJpZ2h0Iik7dm9pZCAwIT09ZSYmKGV0LnJlbW92ZURhdGFBdHRyaWJ1dGUodCwibWFyZ2luLXJpZ2h0IiksdC5zdHlsZS5tYXJnaW5SaWdodD1lKX0pKTt2YXIgdD1ldC5nZXREYXRhQXR0cmlidXRlKGRvY3VtZW50LmJvZHksInBhZGRpbmctcmlnaHQiKTt2b2lkIDA9PT10P2RvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PSIiOihldC5yZW1vdmVEYXRhQXR0cmlidXRlKGRvY3VtZW50LmJvZHksInBhZGRpbmctcmlnaHQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD10KX0sZS5fZ2V0U2Nyb2xsYmFyV2lkdGg9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT0ibW9kYWwtc2Nyb2xsYmFyLW1lYXN1cmUiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCk7dmFyIGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aC10LmNsaWVudFdpZHRoO3JldHVybiBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHQpLGV9LHQualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt2YXIgaT1MKHRoaXMsImJzLm1vZGFsIiksbz1zKHMocyh7fSxUdCksZXQuZ2V0RGF0YUF0dHJpYnV0ZXModGhpcykpLCJvYmplY3QiPT10eXBlb2YgZSYmZT9lOnt9KTtpZihpfHwoaT1uZXcgdCh0aGlzLG8pKSwic3RyaW5nIj09dHlwZW9mIGUpe2lmKHZvaWQgMD09PWlbZV0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK2UrJyInKTtpW2VdKG4pfWVsc2Ugby5zaG93JiZpLnNob3cobil9KSl9LHQuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIEwodCwiYnMubW9kYWwiKX0sbih0LG51bGwsW3trZXk6IlZFUlNJT04iLGdldDpmdW5jdGlvbigpe3JldHVybiI1LjAuMC1hbHBoYTEifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFR0fX1dKSx0fSgpO3Eub24oZG9jdW1lbnQsImNsaWNrLmJzLm1vZGFsLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJtb2RhbCJdJywoZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWQodGhpcyk7IkEiIT09dGhpcy50YWdOYW1lJiYiQVJFQSIhPT10aGlzLnRhZ05hbWV8fHQucHJldmVudERlZmF1bHQoKSxxLm9uZShuLCJzaG93LmJzLm1vZGFsIiwoZnVuY3Rpb24odCl7dC5kZWZhdWx0UHJldmVudGVkfHxxLm9uZShuLCJoaWRkZW4uYnMubW9kYWwiLChmdW5jdGlvbigpe2IoZSkmJmUuZm9jdXMoKX0pKX0pKTt2YXIgaT1MKG4sImJzLm1vZGFsIik7aWYoIWkpe3ZhciBvPXMocyh7fSxldC5nZXREYXRhQXR0cmlidXRlcyhuKSksZXQuZ2V0RGF0YUF0dHJpYnV0ZXModGhpcykpO2k9bmV3IEN0KG4sbyl9aS5zaG93KHRoaXMpfSkpO3ZhciBBdD1FKCk7aWYoQXQpe3ZhciBTdD1BdC5mbi5tb2RhbDtBdC5mbi5tb2RhbD1DdC5qUXVlcnlJbnRlcmZhY2UsQXQuZm4ubW9kYWwuQ29uc3RydWN0b3I9Q3QsQXQuZm4ubW9kYWwubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBBdC5mbi5tb2RhbD1TdCxDdC5qUXVlcnlJbnRlcmZhY2V9fXZhciBPdD1bImJhY2tncm91bmQiLCJjaXRlIiwiaHJlZiIsIml0ZW10eXBlIiwibG9uZ2Rlc2MiLCJwb3N0ZXIiLCJzcmMiLCJ4bGluazpocmVmIl0sRHQ9L14oPzooPzpodHRwcz98bWFpbHRvfGZ0cHx0ZWx8ZmlsZSk6fFteIyYvOj9dKig/OlsjLz9dfCQpKS9naSxJdD0vXmRhdGE6KD86aW1hZ2VcLyg/OmJtcHxnaWZ8anBlZ3xqcGd8cG5nfHRpZmZ8d2VicCl8dmlkZW9cLyg/Om1wZWd8bXA0fG9nZ3x3ZWJtKXxhdWRpb1wvKD86bXAzfG9nYXxvZ2d8b3B1cykpO2Jhc2U2NCxbXGQrL2Etel0rPSokL2ksTnQ9eyIqIjpbImNsYXNzIiwiZGlyIiwiaWQiLCJsYW5nIiwicm9sZSIsL15hcmlhLVtcdy1dKiQvaV0sYTpbInRhcmdldCIsImhyZWYiLCJ0aXRsZSIsInJlbCJdLGFyZWE6W10sYjpbXSxicjpbXSxjb2w6W10sY29kZTpbXSxkaXY6W10sZW06W10saHI6W10saDE6W10saDI6W10saDM6W10saDQ6W10saDU6W10saDY6W10saTpbXSxpbWc6WyJzcmMiLCJzcmNzZXQiLCJhbHQiLCJ0aXRsZSIsIndpZHRoIiwiaGVpZ2h0Il0sbGk6W10sb2w6W10scDpbXSxwcmU6W10sczpbXSxzbWFsbDpbXSxzcGFuOltdLHN1YjpbXSxzdXA6W10sc3Ryb25nOltdLHU6W10sdWw6W119O2Z1bmN0aW9uIGp0KHQsZSxuKXt2YXIgaTtpZighdC5sZW5ndGgpcmV0dXJuIHQ7aWYobiYmImZ1bmN0aW9uIj09dHlwZW9mIG4pcmV0dXJuIG4odCk7Zm9yKHZhciBvPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsInRleHQvaHRtbCIpLHM9T2JqZWN0LmtleXMoZSkscj0oaT1bXSkuY29uY2F0LmFwcGx5KGksby5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSksYT1mdW5jdGlvbih0LG4pe3ZhciBpLG89clt0XSxhPW8ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigtMT09PXMuaW5kZXhPZihhKSlyZXR1cm4gby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pLCJjb250aW51ZSI7dmFyIGw9KGk9W10pLmNvbmNhdC5hcHBseShpLG8uYXR0cmlidXRlcyksYz1bXS5jb25jYXQoZVsiKiJdfHxbXSxlW2FdfHxbXSk7bC5mb3JFYWNoKChmdW5jdGlvbih0KXsoZnVuY3Rpb24odCxlKXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoLTEhPT1lLmluZGV4T2YobikpcmV0dXJuLTE9PT1PdC5pbmRleE9mKG4pfHxCb29sZWFuKHQubm9kZVZhbHVlLm1hdGNoKER0KXx8dC5ub2RlVmFsdWUubWF0Y2goSXQpKTtmb3IodmFyIGk9ZS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgUmVnRXhwfSkpLG89MCxzPWkubGVuZ3RoO288cztvKyspaWYobi5tYXRjaChpW29dKSlyZXR1cm4hMDtyZXR1cm4hMX0pKHQsYyl8fG8ucmVtb3ZlQXR0cmlidXRlKHQubm9kZU5hbWUpfSkpfSxsPTAsYz1yLmxlbmd0aDtsPGM7bCsrKWEobCk7cmV0dXJuIG8uYm9keS5pbm5lckhUTUx9dmFyIFB0PSJ0b29sdGlwIix4dD1uZXcgUmVnRXhwKCIoXnxcXHMpYnMtdG9vbHRpcFxcUysiLCJnIiksUnQ9WyJzYW5pdGl6ZSIsIndoaXRlTGlzdCIsInNhbml0aXplRm4iXSxIdD17YW5pbWF0aW9uOiJib29sZWFuIix0ZW1wbGF0ZToic3RyaW5nIix0aXRsZToiKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKSIsdHJpZ2dlcjoic3RyaW5nIixkZWxheToiKG51bWJlcnxvYmplY3QpIixodG1sOiJib29sZWFuIixzZWxlY3RvcjoiKHN0cmluZ3xib29sZWFuKSIscGxhY2VtZW50OiIoc3RyaW5nfGZ1bmN0aW9uKSIsb2Zmc2V0OiIobnVtYmVyfHN0cmluZ3xmdW5jdGlvbikiLGNvbnRhaW5lcjoiKHN0cmluZ3xlbGVtZW50fGJvb2xlYW4pIixmYWxsYmFja1BsYWNlbWVudDoiKHN0cmluZ3xhcnJheSkiLGJvdW5kYXJ5OiIoc3RyaW5nfGVsZW1lbnQpIixzYW5pdGl6ZToiYm9vbGVhbiIsc2FuaXRpemVGbjoiKG51bGx8ZnVuY3Rpb24pIix3aGl0ZUxpc3Q6Im9iamVjdCIscG9wcGVyQ29uZmlnOiIobnVsbHxvYmplY3QpIn0sQnQ9e0FVVE86ImF1dG8iLFRPUDoidG9wIixSSUdIVDoicmlnaHQiLEJPVFRPTToiYm90dG9tIixMRUZUOiJsZWZ0In0sTXQ9e2FuaW1hdGlvbjohMCx0ZW1wbGF0ZTonPGRpdiBjbGFzcz0idG9vbHRpcCIgcm9sZT0idG9vbHRpcCI+PGRpdiBjbGFzcz0idG9vbHRpcC1hcnJvdyI+PC9kaXY+PGRpdiBjbGFzcz0idG9vbHRpcC1pbm5lciI+PC9kaXY+PC9kaXY+Jyx0cmlnZ2VyOiJob3ZlciBmb2N1cyIsdGl0bGU6IiIsZGVsYXk6MCxodG1sOiExLHNlbGVjdG9yOiExLHBsYWNlbWVudDoidG9wIixvZmZzZXQ6MCxjb250YWluZXI6ITEsZmFsbGJhY2tQbGFjZW1lbnQ6ImZsaXAiLGJvdW5kYXJ5OiJzY3JvbGxQYXJlbnQiLHNhbml0aXplOiEwLHNhbml0aXplRm46bnVsbCx3aGl0ZUxpc3Q6TnQscG9wcGVyQ29uZmlnOm51bGx9LFF0PXtISURFOiJoaWRlLmJzLnRvb2x0aXAiLEhJRERFTjoiaGlkZGVuLmJzLnRvb2x0aXAiLFNIT1c6InNob3cuYnMudG9vbHRpcCIsU0hPV046InNob3duLmJzLnRvb2x0aXAiLElOU0VSVEVEOiJpbnNlcnRlZC5icy50b29sdGlwIixDTElDSzoiY2xpY2suYnMudG9vbHRpcCIsRk9DVVNJTjoiZm9jdXNpbi5icy50b29sdGlwIixGT0NVU09VVDoiZm9jdXNvdXQuYnMudG9vbHRpcCIsTU9VU0VFTlRFUjoibW91c2VlbnRlci5icy50b29sdGlwIixNT1VTRUxFQVZFOiJtb3VzZWxlYXZlLmJzLnRvb2x0aXAifSxVdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSxuKXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkJvb3RzdHJhcCdzIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpIik7dGhpcy5faXNFbmFibGVkPSEwLHRoaXMuX3RpbWVvdXQ9MCx0aGlzLl9ob3ZlclN0YXRlPSIiLHRoaXMuX2FjdGl2ZVRyaWdnZXI9e30sdGhpcy5fcG9wcGVyPW51bGwsdGhpcy5lbGVtZW50PWUsdGhpcy5jb25maWc9dGhpcy5fZ2V0Q29uZmlnKG4pLHRoaXMudGlwPW51bGwsdGhpcy5fc2V0TGlzdGVuZXJzKCksVChlLHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVksdGhpcyl9dmFyIGk9ZS5wcm90b3R5cGU7cmV0dXJuIGkuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5faXNFbmFibGVkPSEwfSxpLmRpc2FibGU9ZnVuY3Rpb24oKXt0aGlzLl9pc0VuYWJsZWQ9ITF9LGkudG9nZ2xlRW5hYmxlZD1mdW5jdGlvbigpe3RoaXMuX2lzRW5hYmxlZD0hdGhpcy5faXNFbmFibGVkfSxpLnRvZ2dsZT1mdW5jdGlvbih0KXtpZih0aGlzLl9pc0VuYWJsZWQpaWYodCl7dmFyIGU9dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSxuPUwodC50YXJnZXQsZSk7bnx8KG49bmV3IHRoaXMuY29uc3RydWN0b3IodC50YXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSksVCh0LnRhcmdldCxlLG4pKSxuLl9hY3RpdmVUcmlnZ2VyLmNsaWNrPSFuLl9hY3RpdmVUcmlnZ2VyLmNsaWNrLG4uX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKT9uLl9lbnRlcihudWxsLG4pOm4uX2xlYXZlKG51bGwsbil9ZWxzZXtpZih0aGlzLmdldFRpcEVsZW1lbnQoKS5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSlyZXR1cm4gdm9pZCB0aGlzLl9sZWF2ZShudWxsLHRoaXMpO3RoaXMuX2VudGVyKG51bGwsdGhpcyl9fSxpLmRpc3Bvc2U9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCksQyh0aGlzLmVsZW1lbnQsdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSkscS5vZmYodGhpcy5lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKSxxLm9mZih0aGlzLmVsZW1lbnQuY2xvc2VzdCgiLm1vZGFsIiksImhpZGUuYnMubW9kYWwiLHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpLHRoaXMudGlwJiZ0aGlzLnRpcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMudGlwKSx0aGlzLl9pc0VuYWJsZWQ9bnVsbCx0aGlzLl90aW1lb3V0PW51bGwsdGhpcy5faG92ZXJTdGF0ZT1udWxsLHRoaXMuX2FjdGl2ZVRyaWdnZXI9bnVsbCx0aGlzLl9wb3BwZXImJnRoaXMuX3BvcHBlci5kZXN0cm95KCksdGhpcy5fcG9wcGVyPW51bGwsdGhpcy5lbGVtZW50PW51bGwsdGhpcy5jb25maWc9bnVsbCx0aGlzLnRpcD1udWxsfSxpLnNob3c9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKCJub25lIj09PXRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5KXRocm93IG5ldyBFcnJvcigiUGxlYXNlIHVzZSBzaG93IG9uIHZpc2libGUgZWxlbWVudHMiKTtpZih0aGlzLmlzV2l0aENvbnRlbnQoKSYmdGhpcy5faXNFbmFibGVkKXt2YXIgbj1xLnRyaWdnZXIodGhpcy5lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuRXZlbnQuU0hPVyksaT1mdW5jdGlvbiB0KGUpe2lmKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KXJldHVybiBudWxsO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldFJvb3ROb2RlKXt2YXIgbj1lLmdldFJvb3ROb2RlKCk7cmV0dXJuIG4gaW5zdGFuY2VvZiBTaGFkb3dSb290P246bnVsbH1yZXR1cm4gZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q/ZTplLnBhcmVudE5vZGU/dChlLnBhcmVudE5vZGUpOm51bGx9KHRoaXMuZWxlbWVudCksbz1udWxsPT09aT90aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnModGhpcy5lbGVtZW50KTppLmNvbnRhaW5zKHRoaXMuZWxlbWVudCk7aWYobi5kZWZhdWx0UHJldmVudGVkfHwhbylyZXR1cm47dmFyIHM9dGhpcy5nZXRUaXBFbGVtZW50KCkscj11KHRoaXMuY29uc3RydWN0b3IuTkFNRSk7cy5zZXRBdHRyaWJ1dGUoImlkIixyKSx0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixyKSx0aGlzLnNldENvbnRlbnQoKSx0aGlzLmNvbmZpZy5hbmltYXRpb24mJnMuY2xhc3NMaXN0LmFkZCgiZmFkZSIpO3ZhciBhPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNvbmZpZy5wbGFjZW1lbnQ/dGhpcy5jb25maWcucGxhY2VtZW50LmNhbGwodGhpcyxzLHRoaXMuZWxlbWVudCk6dGhpcy5jb25maWcucGxhY2VtZW50LGw9dGhpcy5fZ2V0QXR0YWNobWVudChhKTt0aGlzLl9hZGRBdHRhY2htZW50Q2xhc3MobCk7dmFyIGMsaD10aGlzLl9nZXRDb250YWluZXIoKTtpZihUKHMsdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSx0aGlzKSx0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnModGhpcy50aXApfHxoLmFwcGVuZENoaWxkKHMpLHEudHJpZ2dlcih0aGlzLmVsZW1lbnQsdGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5JTlNFUlRFRCksdGhpcy5fcG9wcGVyPW5ldyB0KHRoaXMuZWxlbWVudCxzLHRoaXMuX2dldFBvcHBlckNvbmZpZyhsKSkscy5jbGFzc0xpc3QuYWRkKCJzaG93IiksIm9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKGM9W10pLmNvbmNhdC5hcHBseShjLGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Eub24odCwibW91c2VvdmVyIiwoZnVuY3Rpb24oKXt9KSl9KSk7dmFyIGY9ZnVuY3Rpb24oKXtlLmNvbmZpZy5hbmltYXRpb24mJmUuX2ZpeFRyYW5zaXRpb24oKTt2YXIgdD1lLl9ob3ZlclN0YXRlO2UuX2hvdmVyU3RhdGU9bnVsbCxxLnRyaWdnZXIoZS5lbGVtZW50LGUuY29uc3RydWN0b3IuRXZlbnQuU0hPV04pLCJvdXQiPT09dCYmZS5fbGVhdmUobnVsbCxlKX07aWYodGhpcy50aXAuY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIikpe3ZhciBkPWcodGhpcy50aXApO3Eub25lKHRoaXMudGlwLCJ0cmFuc2l0aW9uZW5kIixmKSxfKHRoaXMudGlwLGQpfWVsc2UgZigpfX0saS5oaWRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuZ2V0VGlwRWxlbWVudCgpLG49ZnVuY3Rpb24oKXsic2hvdyIhPT10Ll9ob3ZlclN0YXRlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSx0Ll9jbGVhblRpcENsYXNzKCksdC5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIpLHEudHJpZ2dlcih0LmVsZW1lbnQsdC5jb25zdHJ1Y3Rvci5FdmVudC5ISURERU4pLHQuX3BvcHBlci5kZXN0cm95KCl9O2lmKCFxLnRyaWdnZXIodGhpcy5lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuRXZlbnQuSElERSkuZGVmYXVsdFByZXZlbnRlZCl7dmFyIGk7aWYoZS5jbGFzc0xpc3QucmVtb3ZlKCJzaG93IiksIm9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKGk9W10pLmNvbmNhdC5hcHBseShpLGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBxLm9mZih0LCJtb3VzZW92ZXIiLHkpfSkpO2lmKHRoaXMuX2FjdGl2ZVRyaWdnZXIuY2xpY2s9ITEsdGhpcy5fYWN0aXZlVHJpZ2dlci5mb2N1cz0hMSx0aGlzLl9hY3RpdmVUcmlnZ2VyLmhvdmVyPSExLHRoaXMudGlwLmNsYXNzTGlzdC5jb250YWlucygiZmFkZSIpKXt2YXIgbz1nKGUpO3Eub25lKGUsInRyYW5zaXRpb25lbmQiLG4pLF8oZSxvKX1lbHNlIG4oKTt0aGlzLl9ob3ZlclN0YXRlPSIifX0saS51cGRhdGU9ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKX0saS5pc1dpdGhDb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5nZXRUaXRsZSgpKX0saS5nZXRUaXBFbGVtZW50PWZ1bmN0aW9uKCl7aWYodGhpcy50aXApcmV0dXJuIHRoaXMudGlwO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiB0LmlubmVySFRNTD10aGlzLmNvbmZpZy50ZW1wbGF0ZSx0aGlzLnRpcD10LmNoaWxkcmVuWzBdLHRoaXMudGlwfSxpLnNldENvbnRlbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKTt0aGlzLnNldEVsZW1lbnRDb250ZW50KG50LmZpbmRPbmUoIi50b29sdGlwLWlubmVyIix0KSx0aGlzLmdldFRpdGxlKCkpLHQuY2xhc3NMaXN0LnJlbW92ZSgiZmFkZSIsInNob3ciKX0saS5zZXRFbGVtZW50Q29udGVudD1mdW5jdGlvbih0LGUpe2lmKG51bGwhPT10KXJldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbShlKT8oZS5qcXVlcnkmJihlPWVbMF0pLHZvaWQodGhpcy5jb25maWcuaHRtbD9lLnBhcmVudE5vZGUhPT10JiYodC5pbm5lckhUTUw9IiIsdC5hcHBlbmRDaGlsZChlKSk6dC50ZXh0Q29udGVudD1lLnRleHRDb250ZW50KSk6dm9pZCh0aGlzLmNvbmZpZy5odG1sPyh0aGlzLmNvbmZpZy5zYW5pdGl6ZSYmKGU9anQoZSx0aGlzLmNvbmZpZy53aGl0ZUxpc3QsdGhpcy5jb25maWcuc2FuaXRpemVGbikpLHQuaW5uZXJIVE1MPWUpOnQudGV4dENvbnRlbnQ9ZSl9LGkuZ2V0VGl0bGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIik7cmV0dXJuIHR8fCh0PSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNvbmZpZy50aXRsZT90aGlzLmNvbmZpZy50aXRsZS5jYWxsKHRoaXMuZWxlbWVudCk6dGhpcy5jb25maWcudGl0bGUpLHR9LGkuX2dldFBvcHBlckNvbmZpZz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiBzKHMoe30se3BsYWNlbWVudDp0LG1vZGlmaWVyczp7b2Zmc2V0OnRoaXMuX2dldE9mZnNldCgpLGZsaXA6e2JlaGF2aW9yOnRoaXMuY29uZmlnLmZhbGxiYWNrUGxhY2VtZW50fSxhcnJvdzp7ZWxlbWVudDoiLiIrdGhpcy5jb25zdHJ1Y3Rvci5OQU1FKyItYXJyb3cifSxwcmV2ZW50T3ZlcmZsb3c6e2JvdW5kYXJpZXNFbGVtZW50OnRoaXMuY29uZmlnLmJvdW5kYXJ5fX0sb25DcmVhdGU6ZnVuY3Rpb24odCl7dC5vcmlnaW5hbFBsYWNlbWVudCE9PXQucGxhY2VtZW50JiZlLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UodCl9LG9uVXBkYXRlOmZ1bmN0aW9uKHQpe3JldHVybiBlLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UodCl9fSksdGhpcy5jb25maWcucG9wcGVyQ29uZmlnKX0saS5fYWRkQXR0YWNobWVudENsYXNzPWZ1bmN0aW9uKHQpe3RoaXMuZ2V0VGlwRWxlbWVudCgpLmNsYXNzTGlzdC5hZGQoImJzLXRvb2x0aXAtIit0KX0saS5fZ2V0T2Zmc2V0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXt9O3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNvbmZpZy5vZmZzZXQ/ZS5mbj1mdW5jdGlvbihlKXtyZXR1cm4gZS5vZmZzZXRzPXMocyh7fSxlLm9mZnNldHMpLHQuY29uZmlnLm9mZnNldChlLm9mZnNldHMsdC5lbGVtZW50KXx8e30pLGV9OmUub2Zmc2V0PXRoaXMuY29uZmlnLm9mZnNldCxlfSxpLl9nZXRDb250YWluZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuY29uZmlnLmNvbnRhaW5lcj9kb2N1bWVudC5ib2R5Om0odGhpcy5jb25maWcuY29udGFpbmVyKT90aGlzLmNvbmZpZy5jb250YWluZXI6bnQuZmluZE9uZSh0aGlzLmNvbmZpZy5jb250YWluZXIpfSxpLl9nZXRBdHRhY2htZW50PWZ1bmN0aW9uKHQpe3JldHVybiBCdFt0LnRvVXBwZXJDYXNlKCldfSxpLl9zZXRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuY29uZmlnLnRyaWdnZXIuc3BsaXQoIiAiKS5mb3JFYWNoKChmdW5jdGlvbihlKXtpZigiY2xpY2siPT09ZSlxLm9uKHQuZWxlbWVudCx0LmNvbnN0cnVjdG9yLkV2ZW50LkNMSUNLLHQuY29uZmlnLnNlbGVjdG9yLChmdW5jdGlvbihlKXtyZXR1cm4gdC50b2dnbGUoZSl9KSk7ZWxzZSBpZigibWFudWFsIiE9PWUpe3ZhciBuPSJob3ZlciI9PT1lP3QuY29uc3RydWN0b3IuRXZlbnQuTU9VU0VFTlRFUjp0LmNvbnN0cnVjdG9yLkV2ZW50LkZPQ1VTSU4saT0iaG92ZXIiPT09ZT90LmNvbnN0cnVjdG9yLkV2ZW50Lk1PVVNFTEVBVkU6dC5jb25zdHJ1Y3Rvci5FdmVudC5GT0NVU09VVDtxLm9uKHQuZWxlbWVudCxuLHQuY29uZmlnLnNlbGVjdG9yLChmdW5jdGlvbihlKXtyZXR1cm4gdC5fZW50ZXIoZSl9KSkscS5vbih0LmVsZW1lbnQsaSx0LmNvbmZpZy5zZWxlY3RvciwoZnVuY3Rpb24oZSl7cmV0dXJuIHQuX2xlYXZlKGUpfSkpfX0pKSx0aGlzLl9oaWRlTW9kYWxIYW5kbGVyPWZ1bmN0aW9uKCl7dC5lbGVtZW50JiZ0LmhpZGUoKX0scS5vbih0aGlzLmVsZW1lbnQuY2xvc2VzdCgiLm1vZGFsIiksImhpZGUuYnMubW9kYWwiLHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpLHRoaXMuY29uZmlnLnNlbGVjdG9yP3RoaXMuY29uZmlnPXMocyh7fSx0aGlzLmNvbmZpZykse30se3RyaWdnZXI6Im1hbnVhbCIsc2VsZWN0b3I6IiJ9KTp0aGlzLl9maXhUaXRsZSgpfSxpLl9maXhUaXRsZT1mdW5jdGlvbigpe3ZhciB0PXR5cGVvZiB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIik7KHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoInRpdGxlIil8fCJzdHJpbmciIT09dCkmJih0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIix0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfHwiIiksdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgidGl0bGUiLCIiKSl9LGkuX2VudGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTsoZT1lfHxMKHQudGFyZ2V0LG4pKXx8KGU9bmV3IHRoaXMuY29uc3RydWN0b3IodC50YXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSksVCh0LnRhcmdldCxuLGUpKSx0JiYoZS5fYWN0aXZlVHJpZ2dlclsiZm9jdXNpbiI9PT10LnR5cGU/ImZvY3VzIjoiaG92ZXIiXT0hMCksZS5nZXRUaXBFbGVtZW50KCkuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93Iil8fCJzaG93Ij09PWUuX2hvdmVyU3RhdGU/ZS5faG92ZXJTdGF0ZT0ic2hvdyI6KGNsZWFyVGltZW91dChlLl90aW1lb3V0KSxlLl9ob3ZlclN0YXRlPSJzaG93IixlLmNvbmZpZy5kZWxheSYmZS5jb25maWcuZGVsYXkuc2hvdz9lLl90aW1lb3V0PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7InNob3ciPT09ZS5faG92ZXJTdGF0ZSYmZS5zaG93KCl9KSxlLmNvbmZpZy5kZWxheS5zaG93KTplLnNob3coKSl9LGkuX2xlYXZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTsoZT1lfHxMKHQudGFyZ2V0LG4pKXx8KGU9bmV3IHRoaXMuY29uc3RydWN0b3IodC50YXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSksVCh0LnRhcmdldCxuLGUpKSx0JiYoZS5fYWN0aXZlVHJpZ2dlclsiZm9jdXNvdXQiPT09dC50eXBlPyJmb2N1cyI6ImhvdmVyIl09ITEpLGUuX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKXx8KGNsZWFyVGltZW91dChlLl90aW1lb3V0KSxlLl9ob3ZlclN0YXRlPSJvdXQiLGUuY29uZmlnLmRlbGF5JiZlLmNvbmZpZy5kZWxheS5oaWRlP2UuX3RpbWVvdXQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXsib3V0Ij09PWUuX2hvdmVyU3RhdGUmJmUuaGlkZSgpfSksZS5jb25maWcuZGVsYXkuaGlkZSk6ZS5oaWRlKCkpfSxpLl9pc1dpdGhBY3RpdmVUcmlnZ2VyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2FjdGl2ZVRyaWdnZXIpaWYodGhpcy5fYWN0aXZlVHJpZ2dlclt0XSlyZXR1cm4hMDtyZXR1cm4hMX0saS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3ZhciBlPWV0LmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuZWxlbWVudCk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpey0xIT09UnQuaW5kZXhPZih0KSYmZGVsZXRlIGVbdF19KSksdCYmIm9iamVjdCI9PXR5cGVvZiB0LmNvbnRhaW5lciYmdC5jb250YWluZXIuanF1ZXJ5JiYodC5jb250YWluZXI9dC5jb250YWluZXJbMF0pLCJudW1iZXIiPT10eXBlb2YodD1zKHMocyh7fSx0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHQpLGUpLCJvYmplY3QiPT10eXBlb2YgdCYmdD90Ont9KSkuZGVsYXkmJih0LmRlbGF5PXtzaG93OnQuZGVsYXksaGlkZTp0LmRlbGF5fSksIm51bWJlciI9PXR5cGVvZiB0LnRpdGxlJiYodC50aXRsZT10LnRpdGxlLnRvU3RyaW5nKCkpLCJudW1iZXIiPT10eXBlb2YgdC5jb250ZW50JiYodC5jb250ZW50PXQuY29udGVudC50b1N0cmluZygpKSx2KFB0LHQsdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSksdC5zYW5pdGl6ZSYmKHQudGVtcGxhdGU9anQodC50ZW1wbGF0ZSx0LndoaXRlTGlzdCx0LnNhbml0aXplRm4pKSx0fSxpLl9nZXREZWxlZ2F0ZUNvbmZpZz1mdW5jdGlvbigpe3ZhciB0PXt9O2lmKHRoaXMuY29uZmlnKWZvcih2YXIgZSBpbiB0aGlzLmNvbmZpZyl0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRbZV0hPT10aGlzLmNvbmZpZ1tlXSYmKHRbZV09dGhpcy5jb25maWdbZV0pO3JldHVybiB0fSxpLl9jbGVhblRpcENsYXNzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRUaXBFbGVtZW50KCksZT10LmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5tYXRjaCh4dCk7bnVsbCE9PWUmJmUubGVuZ3RoPjAmJmUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuY2xhc3NMaXN0LnJlbW92ZShlKX0pKX0saS5faGFuZGxlUG9wcGVyUGxhY2VtZW50Q2hhbmdlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5zdGFuY2U7dGhpcy50aXA9ZS5wb3BwZXIsdGhpcy5fY2xlYW5UaXBDbGFzcygpLHRoaXMuX2FkZEF0dGFjaG1lbnRDbGFzcyh0aGlzLl9nZXRBdHRhY2htZW50KHQucGxhY2VtZW50KSl9LGkuX2ZpeFRyYW5zaXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKSxlPXRoaXMuY29uZmlnLmFuaW1hdGlvbjtudWxsPT09dC5nZXRBdHRyaWJ1dGUoIngtcGxhY2VtZW50IikmJih0LmNsYXNzTGlzdC5yZW1vdmUoImZhZGUiKSx0aGlzLmNvbmZpZy5hbmltYXRpb249ITEsdGhpcy5oaWRlKCksdGhpcy5zaG93KCksdGhpcy5jb25maWcuYW5pbWF0aW9uPWUpfSxlLmpRdWVyeUludGVyZmFjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBuPUwodGhpcywiYnMudG9vbHRpcCIpLGk9Im9iamVjdCI9PXR5cGVvZiB0JiZ0O2lmKChufHwhL2Rpc3Bvc2V8aGlkZS8udGVzdCh0KSkmJihufHwobj1uZXcgZSh0aGlzLGkpKSwic3RyaW5nIj09dHlwZW9mIHQpKXtpZih2b2lkIDA9PT1uW3RdKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJyt0KyciJyk7blt0XSgpfX0pKX0sZS5nZXRJbnN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gTCh0LCJicy50b29sdGlwIil9LG4oZSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBNdH19LHtrZXk6Ik5BTUUiLGdldDpmdW5jdGlvbigpe3JldHVybiBQdH19LHtrZXk6IkRBVEFfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iYnMudG9vbHRpcCJ9fSx7a2V5OiJFdmVudCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF0fX0se2tleToiRVZFTlRfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iLmJzLnRvb2x0aXAifX0se2tleToiRGVmYXVsdFR5cGUiLGdldDpmdW5jdGlvbigpe3JldHVybiBIdH19XSksZX0oKSxGdD1FKCk7aWYoRnQpe3ZhciBXdD1GdC5mbltQdF07RnQuZm5bUHRdPVV0LmpRdWVyeUludGVyZmFjZSxGdC5mbltQdF0uQ29uc3RydWN0b3I9VXQsRnQuZm5bUHRdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gRnQuZm5bUHRdPVd0LFV0LmpRdWVyeUludGVyZmFjZX19dmFyIFZ0PSJwb3BvdmVyIixxdD1uZXcgUmVnRXhwKCIoXnxcXHMpYnMtcG9wb3ZlclxcUysiLCJnIiksenQ9cyhzKHt9LFV0LkRlZmF1bHQpLHt9LHtwbGFjZW1lbnQ6InJpZ2h0Iix0cmlnZ2VyOiJjbGljayIsY29udGVudDoiIix0ZW1wbGF0ZTonPGRpdiBjbGFzcz0icG9wb3ZlciIgcm9sZT0idG9vbHRpcCI+PGRpdiBjbGFzcz0icG9wb3Zlci1hcnJvdyI+PC9kaXY+PGgzIGNsYXNzPSJwb3BvdmVyLWhlYWRlciI+PC9oMz48ZGl2IGNsYXNzPSJwb3BvdmVyLWJvZHkiPjwvZGl2PjwvZGl2Pid9KSxLdD1zKHMoe30sVXQuRGVmYXVsdFR5cGUpLHt9LHtjb250ZW50OiIoc3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pIn0pLFh0PXtISURFOiJoaWRlLmJzLnBvcG92ZXIiLEhJRERFTjoiaGlkZGVuLmJzLnBvcG92ZXIiLFNIT1c6InNob3cuYnMucG9wb3ZlciIsU0hPV046InNob3duLmJzLnBvcG92ZXIiLElOU0VSVEVEOiJpbnNlcnRlZC5icy5wb3BvdmVyIixDTElDSzoiY2xpY2suYnMucG9wb3ZlciIsRk9DVVNJTjoiZm9jdXNpbi5icy5wb3BvdmVyIixGT0NVU09VVDoiZm9jdXNvdXQuYnMucG9wb3ZlciIsTU9VU0VFTlRFUjoibW91c2VlbnRlci5icy5wb3BvdmVyIixNT1VTRUxFQVZFOiJtb3VzZWxlYXZlLmJzLnBvcG92ZXIifSxZdD1mdW5jdGlvbih0KXt2YXIgZSxpO2Z1bmN0aW9uIG8oKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9aT10LChlPW8pLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGkucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUuX19wcm90b19fPWk7dmFyIHM9by5wcm90b3R5cGU7cmV0dXJuIHMuaXNXaXRoQ29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpdGxlKCl8fHRoaXMuX2dldENvbnRlbnQoKX0scy5zZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRUaXBFbGVtZW50KCk7dGhpcy5zZXRFbGVtZW50Q29udGVudChudC5maW5kT25lKCIucG9wb3Zlci1oZWFkZXIiLHQpLHRoaXMuZ2V0VGl0bGUoKSk7dmFyIGU9dGhpcy5fZ2V0Q29udGVudCgpOyJmdW5jdGlvbiI9PXR5cGVvZiBlJiYoZT1lLmNhbGwodGhpcy5lbGVtZW50KSksdGhpcy5zZXRFbGVtZW50Q29udGVudChudC5maW5kT25lKCIucG9wb3Zlci1ib2R5Iix0KSxlKSx0LmNsYXNzTGlzdC5yZW1vdmUoImZhZGUiLCJzaG93Iil9LHMuX2FkZEF0dGFjaG1lbnRDbGFzcz1mdW5jdGlvbih0KXt0aGlzLmdldFRpcEVsZW1lbnQoKS5jbGFzc0xpc3QuYWRkKCJicy1wb3BvdmVyLSIrdCl9LHMuX2dldENvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1jb250ZW50Iil8fHRoaXMuY29uZmlnLmNvbnRlbnR9LHMuX2NsZWFuVGlwQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKSxlPXQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLm1hdGNoKHF0KTtudWxsIT09ZSYmZS5sZW5ndGg+MCYmZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKX0pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gdC5jbGFzc0xpc3QucmVtb3ZlKGUpfSkpfSxvLmpRdWVyeUludGVyZmFjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBlPUwodGhpcywiYnMucG9wb3ZlciIpLG49Im9iamVjdCI9PXR5cGVvZiB0P3Q6bnVsbDtpZigoZXx8IS9kaXNwb3NlfGhpZGUvLnRlc3QodCkpJiYoZXx8KGU9bmV3IG8odGhpcyxuKSxUKHRoaXMsImJzLnBvcG92ZXIiLGUpKSwic3RyaW5nIj09dHlwZW9mIHQpKXtpZih2b2lkIDA9PT1lW3RdKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJyt0KyciJyk7ZVt0XSgpfX0pKX0sby5nZXRJbnN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gTCh0LCJicy5wb3BvdmVyIil9LG4obyxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiB6dH19LHtrZXk6Ik5BTUUiLGdldDpmdW5jdGlvbigpe3JldHVybiBWdH19LHtrZXk6IkRBVEFfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iYnMucG9wb3ZlciJ9fSx7a2V5OiJFdmVudCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFh0fX0se2tleToiRVZFTlRfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iLmJzLnBvcG92ZXIifX0se2tleToiRGVmYXVsdFR5cGUiLGdldDpmdW5jdGlvbigpe3JldHVybiBLdH19XSksb30oVXQpLCR0PUUoKTtpZigkdCl7dmFyIEd0PSR0LmZuW1Z0XTskdC5mbltWdF09WXQualF1ZXJ5SW50ZXJmYWNlLCR0LmZuW1Z0XS5Db25zdHJ1Y3Rvcj1ZdCwkdC5mbltWdF0ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiAkdC5mbltWdF09R3QsWXQualF1ZXJ5SW50ZXJmYWNlfX12YXIgWnQ9InNjcm9sbHNweSIsSnQ9e29mZnNldDoxMCxtZXRob2Q6ImF1dG8iLHRhcmdldDoiIn0sdGU9e29mZnNldDoibnVtYmVyIixtZXRob2Q6InN0cmluZyIsdGFyZ2V0OiIoc3RyaW5nfGVsZW1lbnQpIn0sZWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dmFyIG49dGhpczt0aGlzLl9lbGVtZW50PXQsdGhpcy5fc2Nyb2xsRWxlbWVudD0iQk9EWSI9PT10LnRhZ05hbWU/d2luZG93OnQsdGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyhlKSx0aGlzLl9zZWxlY3Rvcj10aGlzLl9jb25maWcudGFyZ2V0KyIgLm5hdi1saW5rLCIrdGhpcy5fY29uZmlnLnRhcmdldCsiIC5saXN0LWdyb3VwLWl0ZW0sIit0aGlzLl9jb25maWcudGFyZ2V0KyIgLmRyb3Bkb3duLWl0ZW0iLHRoaXMuX29mZnNldHM9W10sdGhpcy5fdGFyZ2V0cz1bXSx0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx0aGlzLl9zY3JvbGxIZWlnaHQ9MCxxLm9uKHRoaXMuX3Njcm9sbEVsZW1lbnQsInNjcm9sbC5icy5zY3JvbGxzcHkiLChmdW5jdGlvbih0KXtyZXR1cm4gbi5fcHJvY2Vzcyh0KX0pKSx0aGlzLnJlZnJlc2goKSx0aGlzLl9wcm9jZXNzKCksVCh0LCJicy5zY3JvbGxzcHkiLHRoaXMpfXZhciBlPXQucHJvdG90eXBlO3JldHVybiBlLnJlZnJlc2g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fc2Nyb2xsRWxlbWVudD09PXRoaXMuX3Njcm9sbEVsZW1lbnQud2luZG93PyJvZmZzZXQiOiJwb3NpdGlvbiIsbj0iYXV0byI9PT10aGlzLl9jb25maWcubWV0aG9kP2U6dGhpcy5fY29uZmlnLm1ldGhvZCxpPSJwb3NpdGlvbiI9PT1uP3RoaXMuX2dldFNjcm9sbFRvcCgpOjA7dGhpcy5fb2Zmc2V0cz1bXSx0aGlzLl90YXJnZXRzPVtdLHRoaXMuX3Njcm9sbEhlaWdodD10aGlzLl9nZXRTY3JvbGxIZWlnaHQoKSxudC5maW5kKHRoaXMuX3NlbGVjdG9yKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlLG89Zih0KTtpZihvJiYoZT1udC5maW5kT25lKG8pKSxlKXt2YXIgcz1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKHMud2lkdGh8fHMuaGVpZ2h0KXJldHVybltldFtuXShlKS50b3AraSxvXX1yZXR1cm4gbnVsbH0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF0tZVswXX0pKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0Ll9vZmZzZXRzLnB1c2goZVswXSksdC5fdGFyZ2V0cy5wdXNoKGVbMV0pfSkpfSxlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtDKHRoaXMuX2VsZW1lbnQsImJzLnNjcm9sbHNweSIpLHEub2ZmKHRoaXMuX3Njcm9sbEVsZW1lbnQsIi5icy5zY3JvbGxzcHkiKSx0aGlzLl9lbGVtZW50PW51bGwsdGhpcy5fc2Nyb2xsRWxlbWVudD1udWxsLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX3NlbGVjdG9yPW51bGwsdGhpcy5fb2Zmc2V0cz1udWxsLHRoaXMuX3RhcmdldHM9bnVsbCx0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx0aGlzLl9zY3JvbGxIZWlnaHQ9bnVsbH0sZS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciIT10eXBlb2YodD1zKHMoe30sSnQpLCJvYmplY3QiPT10eXBlb2YgdCYmdD90Ont9KSkudGFyZ2V0JiZtKHQudGFyZ2V0KSl7dmFyIGU9dC50YXJnZXQuaWQ7ZXx8KGU9dShadCksdC50YXJnZXQuaWQ9ZSksdC50YXJnZXQ9IiMiK2V9cmV0dXJuIHYoWnQsdCx0ZSksdH0sZS5fZ2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQ9PT13aW5kb3c/dGhpcy5fc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldDp0aGlzLl9zY3JvbGxFbGVtZW50LnNjcm9sbFRvcH0sZS5fZ2V0U2Nyb2xsSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQuc2Nyb2xsSGVpZ2h0fHxNYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0KX0sZS5fZ2V0T2Zmc2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQ9PT13aW5kb3c/d2luZG93LmlubmVySGVpZ2h0OnRoaXMuX3Njcm9sbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0fSxlLl9wcm9jZXNzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0U2Nyb2xsVG9wKCkrdGhpcy5fY29uZmlnLm9mZnNldCxlPXRoaXMuX2dldFNjcm9sbEhlaWdodCgpLG49dGhpcy5fY29uZmlnLm9mZnNldCtlLXRoaXMuX2dldE9mZnNldEhlaWdodCgpO2lmKHRoaXMuX3Njcm9sbEhlaWdodCE9PWUmJnRoaXMucmVmcmVzaCgpLHQ+PW4pe3ZhciBpPXRoaXMuX3RhcmdldHNbdGhpcy5fdGFyZ2V0cy5sZW5ndGgtMV07dGhpcy5fYWN0aXZlVGFyZ2V0IT09aSYmdGhpcy5fYWN0aXZhdGUoaSl9ZWxzZXtpZih0aGlzLl9hY3RpdmVUYXJnZXQmJnQ8dGhpcy5fb2Zmc2V0c1swXSYmdGhpcy5fb2Zmc2V0c1swXT4wKXJldHVybiB0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx2b2lkIHRoaXMuX2NsZWFyKCk7Zm9yKHZhciBvPXRoaXMuX29mZnNldHMubGVuZ3RoO28tLTspe3RoaXMuX2FjdGl2ZVRhcmdldCE9PXRoaXMuX3RhcmdldHNbb10mJnQ+PXRoaXMuX29mZnNldHNbb10mJih2b2lkIDA9PT10aGlzLl9vZmZzZXRzW28rMV18fHQ8dGhpcy5fb2Zmc2V0c1tvKzFdKSYmdGhpcy5fYWN0aXZhdGUodGhpcy5fdGFyZ2V0c1tvXSl9fX0sZS5fYWN0aXZhdGU9ZnVuY3Rpb24odCl7dGhpcy5fYWN0aXZlVGFyZ2V0PXQsdGhpcy5fY2xlYXIoKTt2YXIgZT10aGlzLl9zZWxlY3Rvci5zcGxpdCgiLCIpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUrJ1tkYXRhLXRhcmdldD0iJyt0KyciXSwnK2UrJ1tocmVmPSInK3QrJyJdJ30pKSxuPW50LmZpbmRPbmUoZS5qb2luKCIsIikpO24uY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wZG93bi1pdGVtIik/KG50LmZpbmRPbmUoIi5kcm9wZG93bi10b2dnbGUiLG4uY2xvc2VzdCgiLmRyb3Bkb3duIikpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpLG4uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikpOihuLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpLG50LnBhcmVudHMobiwiLm5hdiwgLmxpc3QtZ3JvdXAiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtudC5wcmV2KHQsIi5uYXYtbGluaywgLmxpc3QtZ3JvdXAtaXRlbSIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpfSkpLG50LnByZXYodCwiLm5hdi1pdGVtIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7bnQuY2hpbGRyZW4odCwiLm5hdi1saW5rIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIil9KSl9KSl9KSkpLHEudHJpZ2dlcih0aGlzLl9zY3JvbGxFbGVtZW50LCJhY3RpdmF0ZS5icy5zY3JvbGxzcHkiLHtyZWxhdGVkVGFyZ2V0OnR9KX0sZS5fY2xlYXI9ZnVuY3Rpb24oKXtudC5maW5kKHRoaXMuX3NlbGVjdG9yKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygiYWN0aXZlIil9KSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIil9KSl9LHQualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49TCh0aGlzLCJicy5zY3JvbGxzcHkiKTtpZihufHwobj1uZXcgdCh0aGlzLCJvYmplY3QiPT10eXBlb2YgZSYmZSkpLCJzdHJpbmciPT10eXBlb2YgZSl7aWYodm9pZCAwPT09bltlXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrZSsnIicpO25bZV0oKX19KSl9LHQuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIEwodCwiYnMuc2Nyb2xsc3B5Iil9LG4odCxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBKdH19XSksdH0oKTtxLm9uKHdpbmRvdywibG9hZC5icy5zY3JvbGxzcHkuZGF0YS1hcGkiLChmdW5jdGlvbigpe250LmZpbmQoJ1tkYXRhLXNweT0ic2Nyb2xsIl0nKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGVlKHQsZXQuZ2V0RGF0YUF0dHJpYnV0ZXModCkpfSkpfSkpO3ZhciBuZT1FKCk7aWYobmUpe3ZhciBpZT1uZS5mbltadF07bmUuZm5bWnRdPWVlLmpRdWVyeUludGVyZmFjZSxuZS5mbltadF0uQ29uc3RydWN0b3I9ZWUsbmUuZm5bWnRdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmUuZm5bWnRdPWllLGVlLmpRdWVyeUludGVyZmFjZX19dmFyIG9lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9lbGVtZW50PXQsVCh0aGlzLl9lbGVtZW50LCJicy50YWIiLHRoaXMpfXZhciBlPXQucHJvdG90eXBlO3JldHVybiBlLnNob3c9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKCEodGhpcy5fZWxlbWVudC5wYXJlbnROb2RlJiZ0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoImFjdGl2ZSIpfHx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZGlzYWJsZWQiKSkpe3ZhciBlLG49ZCh0aGlzLl9lbGVtZW50KSxpPXRoaXMuX2VsZW1lbnQuY2xvc2VzdCgiLm5hdiwgLmxpc3QtZ3JvdXAiKTtpZihpKXt2YXIgbz0iVUwiPT09aS5ub2RlTmFtZXx8Ik9MIj09PWkubm9kZU5hbWU/IjpzY29wZSA+IGxpID4gLmFjdGl2ZSI6Ii5hY3RpdmUiO2U9KGU9bnQuZmluZChvLGkpKVtlLmxlbmd0aC0xXX12YXIgcz1udWxsO2lmKGUmJihzPXEudHJpZ2dlcihlLCJoaWRlLmJzLnRhYiIse3JlbGF0ZWRUYXJnZXQ6dGhpcy5fZWxlbWVudH0pKSwhKHEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLnRhYiIse3JlbGF0ZWRUYXJnZXQ6ZX0pLmRlZmF1bHRQcmV2ZW50ZWR8fG51bGwhPT1zJiZzLmRlZmF1bHRQcmV2ZW50ZWQpKXt0aGlzLl9hY3RpdmF0ZSh0aGlzLl9lbGVtZW50LGkpO3ZhciByPWZ1bmN0aW9uKCl7cS50cmlnZ2VyKGUsImhpZGRlbi5icy50YWIiLHtyZWxhdGVkVGFyZ2V0OnQuX2VsZW1lbnR9KSxxLnRyaWdnZXIodC5fZWxlbWVudCwic2hvd24uYnMudGFiIix7cmVsYXRlZFRhcmdldDplfSl9O24/dGhpcy5fYWN0aXZhdGUobixuLnBhcmVudE5vZGUscik6cigpfX19LGUuZGlzcG9zZT1mdW5jdGlvbigpe0ModGhpcy5fZWxlbWVudCwiYnMudGFiIiksdGhpcy5fZWxlbWVudD1udWxsfSxlLl9hY3RpdmF0ZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcyxvPSghZXx8IlVMIiE9PWUubm9kZU5hbWUmJiJPTCIhPT1lLm5vZGVOYW1lP250LmNoaWxkcmVuKGUsIi5hY3RpdmUiKTpudC5maW5kKCI6c2NvcGUgPiBsaSA+IC5hY3RpdmUiLGUpKVswXSxzPW4mJm8mJm8uY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIikscj1mdW5jdGlvbigpe3JldHVybiBpLl90cmFuc2l0aW9uQ29tcGxldGUodCxvLG4pfTtpZihvJiZzKXt2YXIgYT1nKG8pO28uY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHEub25lKG8sInRyYW5zaXRpb25lbmQiLHIpLF8obyxhKX1lbHNlIHIoKX0sZS5fdHJhbnNpdGlvbkNvbXBsZXRlPWZ1bmN0aW9uKHQsZSxuKXtpZihlKXtlLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpO3ZhciBpPW50LmZpbmRPbmUoIjpzY29wZSA+IC5kcm9wZG93bi1tZW51IC5hY3RpdmUiLGUucGFyZW50Tm9kZSk7aSYmaS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSwidGFiIj09PWUuZ2V0QXR0cmlidXRlKCJyb2xlIikmJmUuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwhMSl9KHQuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIiksInRhYiI9PT10LmdldEF0dHJpYnV0ZSgicm9sZSIpJiZ0LnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsITApLHcodCksdC5jbGFzc0xpc3QuY29udGFpbnMoImZhZGUiKSYmdC5jbGFzc0xpc3QuYWRkKCJzaG93IiksdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wZG93bi1tZW51IikpJiYodC5jbG9zZXN0KCIuZHJvcGRvd24iKSYmbnQuZmluZCgiLmRyb3Bkb3duLXRvZ2dsZSIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpfSkpLHQuc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwhMCkpO24mJm4oKX0sdC5qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt2YXIgbj1MKHRoaXMsImJzLnRhYiIpfHxuZXcgdCh0aGlzKTtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKHZvaWQgMD09PW5bZV0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK2UrJyInKTtuW2VdKCl9fSkpfSx0LmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLnRhYiIpfSxuKHQsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjUuMC4wLWFscGhhMSJ9fV0pLHR9KCk7cS5vbihkb2N1bWVudCwiY2xpY2suYnMudGFiLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJ0YWIiXSwgW2RhdGEtdG9nZ2xlPSJwaWxsIl0sIFtkYXRhLXRvZ2dsZT0ibGlzdCJdJywoZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLChMKHRoaXMsImJzLnRhYiIpfHxuZXcgb2UodGhpcykpLnNob3coKX0pKTt2YXIgc2U9RSgpO2lmKHNlKXt2YXIgcmU9c2UuZm4udGFiO3NlLmZuLnRhYj1vZS5qUXVlcnlJbnRlcmZhY2Usc2UuZm4udGFiLkNvbnN0cnVjdG9yPW9lLHNlLmZuLnRhYi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHNlLmZuLnRhYj1yZSxvZS5qUXVlcnlJbnRlcmZhY2V9fXZhciBhZT17YW5pbWF0aW9uOiJib29sZWFuIixhdXRvaGlkZToiYm9vbGVhbiIsZGVsYXk6Im51bWJlciJ9LGxlPXthbmltYXRpb246ITAsYXV0b2hpZGU6ITAsZGVsYXk6NTAwfSxjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyhlKSx0aGlzLl90aW1lb3V0PW51bGwsdGhpcy5fc2V0TGlzdGVuZXJzKCksVCh0LCJicy50b2FzdCIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUuc2hvdz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLnRvYXN0IikuZGVmYXVsdFByZXZlbnRlZCl7dGhpcy5fY29uZmlnLmFuaW1hdGlvbiYmdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJmYWRlIik7dmFyIGU9ZnVuY3Rpb24oKXt0Ll9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoInNob3dpbmciKSx0Ll9lbGVtZW50LmNsYXNzTGlzdC5hZGQoInNob3ciKSxxLnRyaWdnZXIodC5fZWxlbWVudCwic2hvd24uYnMudG9hc3QiKSx0Ll9jb25maWcuYXV0b2hpZGUmJih0Ll90aW1lb3V0PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5oaWRlKCl9KSx0Ll9jb25maWcuZGVsYXkpKX07aWYodGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJoaWRlIiksdyh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoInNob3dpbmciKSx0aGlzLl9jb25maWcuYW5pbWF0aW9uKXt2YXIgbj1nKHRoaXMuX2VsZW1lbnQpO3Eub25lKHRoaXMuX2VsZW1lbnQsInRyYW5zaXRpb25lbmQiLGUpLF8odGhpcy5fZWxlbWVudCxuKX1lbHNlIGUoKX19LGUuaGlkZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSYmIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJoaWRlLmJzLnRvYXN0IikuZGVmYXVsdFByZXZlbnRlZCl7dmFyIGU9ZnVuY3Rpb24oKXt0Ll9lbGVtZW50LmNsYXNzTGlzdC5hZGQoImhpZGUiKSxxLnRyaWdnZXIodC5fZWxlbWVudCwiaGlkZGVuLmJzLnRvYXN0Iil9O2lmKHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHRoaXMuX2NvbmZpZy5hbmltYXRpb24pe3ZhciBuPWcodGhpcy5fZWxlbWVudCk7cS5vbmUodGhpcy5fZWxlbWVudCwidHJhbnNpdGlvbmVuZCIsZSksXyh0aGlzLl9lbGVtZW50LG4pfWVsc2UgZSgpfX0sZS5kaXNwb3NlPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLHRoaXMuX3RpbWVvdXQ9bnVsbCx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpJiZ0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoInNob3ciKSxxLm9mZih0aGlzLl9lbGVtZW50LCJjbGljay5kaXNtaXNzLmJzLnRvYXN0IiksQyh0aGlzLl9lbGVtZW50LCJicy50b2FzdCIpLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl9jb25maWc9bnVsbH0sZS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiB0PXMocyhzKHt9LGxlKSxldC5nZXREYXRhQXR0cmlidXRlcyh0aGlzLl9lbGVtZW50KSksIm9iamVjdCI9PXR5cGVvZiB0JiZ0P3Q6e30pLHYoInRvYXN0Iix0LHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpLHR9LGUuX3NldExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cS5vbih0aGlzLl9lbGVtZW50LCJjbGljay5kaXNtaXNzLmJzLnRvYXN0IiwnW2RhdGEtZGlzbWlzcz0idG9hc3QiXScsKGZ1bmN0aW9uKCl7cmV0dXJuIHQuaGlkZSgpfSkpfSx0LmpRdWVyeUludGVyZmFjZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBuPUwodGhpcywiYnMudG9hc3QiKTtpZihufHwobj1uZXcgdCh0aGlzLCJvYmplY3QiPT10eXBlb2YgZSYmZSkpLCJzdHJpbmciPT10eXBlb2YgZSl7aWYodm9pZCAwPT09bltlXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrZSsnIicpO25bZV0odGhpcyl9fSkpfSx0LmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLnRvYXN0Iil9LG4odCxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHRUeXBlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYWV9fSx7a2V5OiJEZWZhdWx0IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbGV9fV0pLHR9KCksdWU9RSgpO2lmKHVlKXt2YXIgaGU9dWUuZm4udG9hc3Q7dWUuZm4udG9hc3Q9Y2UualF1ZXJ5SW50ZXJmYWNlLHVlLmZuLnRvYXN0LkNvbnN0cnVjdG9yPWNlLHVlLmZuLnRvYXN0Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZm4udG9hc3Q9aGUsY2UualF1ZXJ5SW50ZXJmYWNlfX1yZXR1cm57QWxlcnQ6SyxCdXR0b246JCxDYXJvdXNlbDpsdCxDb2xsYXBzZTpndCxEcm9wZG93bjp3dCxNb2RhbDpDdCxQb3BvdmVyOll0LFNjcm9sbFNweTplZSxUYWI6b2UsVG9hc3Q6Y2UsVG9vbHRpcDpVdH19KSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb3RzdHJhcC5taW4uanMubWFw")