diff --git a/resources/celerity/map.php b/resources/celerity/map.php
index 19f8924555..26aec85659 100644
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -1,2363 +1,2363 @@
 <?php
 
 /**
  * This file is automatically generated. Use 'bin/celerity map' to rebuild it.
  *
  * @generated
  */
 return array(
   'names' => array(
     'conpherence.pkg.css' => '3c8a0668',
     'conpherence.pkg.js' => '020aebcf',
-    'core.pkg.css' => 'f2319e1f',
-    'core.pkg.js' => '5c737607',
+    'core.pkg.css' => '261ee8cf',
+    'core.pkg.js' => '5ace8a1e',
     'differential.pkg.css' => 'b8df73d4',
     'differential.pkg.js' => '67c9ea4c',
     'diffusion.pkg.css' => '42c75c37',
     'diffusion.pkg.js' => '91192d85',
     'maniphest.pkg.css' => '35995d6d',
     'maniphest.pkg.js' => '286955ae',
     'rsrc/audio/basic/alert.mp3' => '17889334',
     'rsrc/audio/basic/bing.mp3' => 'a817a0c3',
     'rsrc/audio/basic/pock.mp3' => '0fa843d0',
     'rsrc/audio/basic/tap.mp3' => '02d16994',
     'rsrc/audio/basic/ting.mp3' => 'a6b6540e',
     'rsrc/css/aphront/aphront-bars.css' => '4a327b4a',
     'rsrc/css/aphront/dark-console.css' => '7f06cda2',
     'rsrc/css/aphront/dialog-view.css' => 'b70c70df',
     'rsrc/css/aphront/list-filter-view.css' => 'feb64255',
     'rsrc/css/aphront/multi-column.css' => 'fbc00ba3',
     'rsrc/css/aphront/notification.css' => '30240bd2',
     'rsrc/css/aphront/panel-view.css' => '46923d46',
     'rsrc/css/aphront/phabricator-nav-view.css' => 'f8a0c1bf',
     'rsrc/css/aphront/table-view.css' => '205053cd',
     'rsrc/css/aphront/tokenizer.css' => 'b52d0668',
     'rsrc/css/aphront/tooltip.css' => 'e3f2412f',
     'rsrc/css/aphront/typeahead-browse.css' => 'b7ed02d2',
     'rsrc/css/aphront/typeahead.css' => '8779483d',
     'rsrc/css/application/almanac/almanac.css' => '2e050f4f',
     'rsrc/css/application/auth/auth.css' => 'add92fd8',
     'rsrc/css/application/base/main-menu-view.css' => '8e2d9a28',
     'rsrc/css/application/base/notification-menu.css' => 'e6962e89',
     'rsrc/css/application/base/phui-theme.css' => '35883b37',
     'rsrc/css/application/base/standard-page-view.css' => '8a295cb9',
     'rsrc/css/application/chatlog/chatlog.css' => 'abdc76ee',
     'rsrc/css/application/conduit/conduit-api.css' => 'ce2cfc41',
     'rsrc/css/application/config/config-options.css' => '16c920ae',
     'rsrc/css/application/config/config-template.css' => '20babf50',
     'rsrc/css/application/config/setup-issue.css' => '5eed85b2',
     'rsrc/css/application/config/unhandled-exception.css' => '9ecfc00d',
     'rsrc/css/application/conpherence/color.css' => 'b17746b0',
     'rsrc/css/application/conpherence/durable-column.css' => '2d57072b',
     'rsrc/css/application/conpherence/header-pane.css' => 'c9a3db8e',
     'rsrc/css/application/conpherence/menu.css' => '67f4680d',
     'rsrc/css/application/conpherence/message-pane.css' => 'd244db1e',
     'rsrc/css/application/conpherence/notification.css' => '6a3d4e58',
     'rsrc/css/application/conpherence/participant-pane.css' => '69e0058a',
     'rsrc/css/application/conpherence/transaction.css' => '3a3f5e7e',
     'rsrc/css/application/contentsource/content-source-view.css' => 'cdf0d579',
     'rsrc/css/application/countdown/timer.css' => 'bff8012f',
     'rsrc/css/application/daemon/bulk-job.css' => '73af99f5',
     'rsrc/css/application/dashboard/dashboard.css' => '4267d6c6',
     'rsrc/css/application/diff/inline-comment-summary.css' => '81eb368d',
     'rsrc/css/application/differential/add-comment.css' => '7e5900d9',
     'rsrc/css/application/differential/changeset-view.css' => '73660575',
     'rsrc/css/application/differential/core.css' => 'bdb93065',
     'rsrc/css/application/differential/phui-inline-comment.css' => '48acce5b',
     'rsrc/css/application/differential/revision-comment.css' => '7dbc8d1d',
     'rsrc/css/application/differential/revision-history.css' => '8aa3eac5',
     'rsrc/css/application/differential/revision-list.css' => '93d2df7d',
     'rsrc/css/application/differential/table-of-contents.css' => '0e3364c7',
     'rsrc/css/application/diffusion/diffusion-icons.css' => '23b31a1b',
     'rsrc/css/application/diffusion/diffusion-readme.css' => 'b68a76e4',
     'rsrc/css/application/diffusion/diffusion-repository.css' => 'b89e8c6c',
     'rsrc/css/application/diffusion/diffusion.css' => 'b54c77b0',
     'rsrc/css/application/feed/feed.css' => 'd8b6e3f8',
     'rsrc/css/application/files/global-drag-and-drop.css' => '1d2713a4',
     'rsrc/css/application/flag/flag.css' => '2b77be8d',
     'rsrc/css/application/harbormaster/harbormaster.css' => '8dfe16b2',
     'rsrc/css/application/herald/herald-test.css' => 'e004176f',
     'rsrc/css/application/herald/herald.css' => '648d39e2',
     'rsrc/css/application/maniphest/report.css' => '3d53188b',
     'rsrc/css/application/maniphest/task-edit.css' => '272daa84',
     'rsrc/css/application/maniphest/task-summary.css' => '61d1667e',
     'rsrc/css/application/objectselector/object-selector.css' => 'ee77366f',
     'rsrc/css/application/owners/owners-path-editor.css' => 'fa7c13ef',
     'rsrc/css/application/paste/paste.css' => 'b37bcd38',
     'rsrc/css/application/people/people-picture-menu-item.css' => 'fe8e07cf',
     'rsrc/css/application/people/people-profile.css' => '2ea2daa1',
     'rsrc/css/application/phame/phame.css' => '799febf9',
     'rsrc/css/application/pholio/pholio-edit.css' => '4df55b3b',
     'rsrc/css/application/pholio/pholio-inline-comments.css' => '722b48c2',
     'rsrc/css/application/pholio/pholio.css' => '88ef5ef1',
     'rsrc/css/application/phortune/phortune-credit-card-form.css' => '3b9868a8',
     'rsrc/css/application/phortune/phortune-invoice.css' => '4436b241',
     'rsrc/css/application/phortune/phortune.css' => '12e8251a',
     'rsrc/css/application/phrequent/phrequent.css' => 'bd79cc67',
     'rsrc/css/application/phriction/phriction-document-css.css' => '03380da0',
     'rsrc/css/application/policy/policy-edit.css' => '8794e2ed',
     'rsrc/css/application/policy/policy-transaction-detail.css' => 'c02b8384',
     'rsrc/css/application/policy/policy.css' => 'ceb56a08',
     'rsrc/css/application/ponder/ponder-view.css' => '05a09d0a',
     'rsrc/css/application/project/project-card-view.css' => '3b1f7b20',
     'rsrc/css/application/project/project-view.css' => '567858b3',
     'rsrc/css/application/releeph/releeph-core.css' => 'f81ff2db',
     'rsrc/css/application/releeph/releeph-preview-branch.css' => '22db5c07',
     'rsrc/css/application/releeph/releeph-request-differential-create-dialog.css' => '0ac1ea31',
     'rsrc/css/application/releeph/releeph-request-typeahead.css' => 'bce37359',
     'rsrc/css/application/search/application-search-view.css' => '0f7c06d8',
     'rsrc/css/application/search/search-results.css' => '9ea70ace',
     'rsrc/css/application/slowvote/slowvote.css' => '1694baed',
     'rsrc/css/application/tokens/tokens.css' => 'ce5a50bd',
     'rsrc/css/application/uiexample/example.css' => 'b4795059',
     'rsrc/css/core/core.css' => '1b29ed61',
     'rsrc/css/core/remarkup.css' => '9e627d41',
     'rsrc/css/core/syntax.css' => '8a16f91b',
     'rsrc/css/core/z-index.css' => '99c0f5eb',
     'rsrc/css/diviner/diviner-shared.css' => '4bd263b0',
     'rsrc/css/font/font-awesome.css' => '3883938a',
     'rsrc/css/font/font-lato.css' => '23631304',
     'rsrc/css/font/phui-font-icon-base.css' => 'd7994e06',
     'rsrc/css/layout/phabricator-filetree-view.css' => '56cdd875',
     'rsrc/css/layout/phabricator-source-code-view.css' => '03d7ac28',
     'rsrc/css/phui/button/phui-button-bar.css' => 'a4aa75c4',
     'rsrc/css/phui/button/phui-button-simple.css' => '1ff278aa',
     'rsrc/css/phui/button/phui-button.css' => 'ea704902',
     'rsrc/css/phui/calendar/phui-calendar-day.css' => '9597d706',
     'rsrc/css/phui/calendar/phui-calendar-list.css' => 'ccd7e4e2',
     'rsrc/css/phui/calendar/phui-calendar-month.css' => 'cb758c42',
     'rsrc/css/phui/calendar/phui-calendar.css' => 'f11073aa',
     'rsrc/css/phui/object-item/phui-oi-big-ui.css' => '9e037c7a',
     'rsrc/css/phui/object-item/phui-oi-color.css' => 'b517bfa0',
     'rsrc/css/phui/object-item/phui-oi-drag-ui.css' => 'da15d3dc',
     'rsrc/css/phui/object-item/phui-oi-flush-ui.css' => '490e2e2e',
     'rsrc/css/phui/object-item/phui-oi-list-view.css' => '909f3844',
     'rsrc/css/phui/object-item/phui-oi-simple-ui.css' => '6a30fa46',
     'rsrc/css/phui/phui-action-list.css' => 'c4972757',
     'rsrc/css/phui/phui-action-panel.css' => '6c386cbf',
     'rsrc/css/phui/phui-badge.css' => '666e25ad',
     'rsrc/css/phui/phui-basic-nav-view.css' => '56ebd66d',
     'rsrc/css/phui/phui-big-info-view.css' => '362ad37b',
     'rsrc/css/phui/phui-box.css' => '5ed3b8cb',
     'rsrc/css/phui/phui-bulk-editor.css' => '374d5e30',
     'rsrc/css/phui/phui-chart.css' => '7853a69b',
     'rsrc/css/phui/phui-cms.css' => '8c05c41e',
     'rsrc/css/phui/phui-comment-form.css' => '68a2d99a',
     'rsrc/css/phui/phui-comment-panel.css' => 'ec4e31c0',
     'rsrc/css/phui/phui-crumbs-view.css' => '614f43cf',
     'rsrc/css/phui/phui-curtain-view.css' => '68c5efb6',
     'rsrc/css/phui/phui-document-pro.css' => 'b9613a10',
     'rsrc/css/phui/phui-document-summary.css' => 'b068eed1',
     'rsrc/css/phui/phui-document.css' => '52b748a5',
     'rsrc/css/phui/phui-feed-story.css' => 'a0c05029',
     'rsrc/css/phui/phui-fontkit.css' => '9b714a5e',
     'rsrc/css/phui/phui-form-view.css' => '01b796c0',
     'rsrc/css/phui/phui-form.css' => '159e2d9c',
     'rsrc/css/phui/phui-head-thing.css' => 'd7f293df',
     'rsrc/css/phui/phui-header-view.css' => '285c9139',
     'rsrc/css/phui/phui-hovercard.css' => '6ca90fa0',
     'rsrc/css/phui/phui-icon-set-selector.css' => '7aa5f3ec',
     'rsrc/css/phui/phui-icon.css' => '4cbc684a',
     'rsrc/css/phui/phui-image-mask.css' => '62c7f4d2',
     'rsrc/css/phui/phui-info-view.css' => '37b8d9ce',
     'rsrc/css/phui/phui-invisible-character-view.css' => 'c694c4a4',
     'rsrc/css/phui/phui-left-right.css' => '68513c34',
     'rsrc/css/phui/phui-lightbox.css' => '4ebf22da',
     'rsrc/css/phui/phui-list.css' => '470b1adb',
     'rsrc/css/phui/phui-object-box.css' => 'f434b6be',
     'rsrc/css/phui/phui-pager.css' => 'd022c7ad',
     'rsrc/css/phui/phui-pinboard-view.css' => '1f08f5d8',
     'rsrc/css/phui/phui-property-list-view.css' => 'cad62236',
     'rsrc/css/phui/phui-remarkup-preview.css' => '91767007',
     'rsrc/css/phui/phui-segment-bar-view.css' => '5166b370',
     'rsrc/css/phui/phui-spacing.css' => 'b05cadc3',
     'rsrc/css/phui/phui-status.css' => 'e5ff8be0',
-    'rsrc/css/phui/phui-tag-view.css' => 'a42fe34f',
+    'rsrc/css/phui/phui-tag-view.css' => '29409667',
     'rsrc/css/phui/phui-timeline-view.css' => '1e348e4b',
     'rsrc/css/phui/phui-two-column-view.css' => '01e6991e',
     'rsrc/css/phui/workboards/phui-workboard-color.css' => 'e86de308',
     'rsrc/css/phui/workboards/phui-workboard.css' => '74fc9d98',
     'rsrc/css/phui/workboards/phui-workcard.css' => '8c536f90',
     'rsrc/css/phui/workboards/phui-workpanel.css' => 'bd546a49',
     'rsrc/css/sprite-login.css' => '18b368a6',
     'rsrc/css/sprite-tokens.css' => 'f1896dc5',
     'rsrc/css/syntax/syntax-default.css' => '055fc231',
     'rsrc/externals/d3/d3.min.js' => 'd67475f5',
     'rsrc/externals/font/fontawesome/fontawesome-webfont.eot' => '23f8c698',
     'rsrc/externals/font/fontawesome/fontawesome-webfont.ttf' => '70983df0',
     'rsrc/externals/font/fontawesome/fontawesome-webfont.woff' => 'cd02f93b',
     'rsrc/externals/font/fontawesome/fontawesome-webfont.woff2' => '351fd46a',
     'rsrc/externals/font/lato/lato-bold.eot' => '7367aa5e',
     'rsrc/externals/font/lato/lato-bold.svg' => '681aa4f5',
     'rsrc/externals/font/lato/lato-bold.ttf' => '66d3c296',
     'rsrc/externals/font/lato/lato-bold.woff' => '89d9fba7',
     'rsrc/externals/font/lato/lato-bold.woff2' => '389fcdb1',
     'rsrc/externals/font/lato/lato-bolditalic.eot' => '03eeb4da',
     'rsrc/externals/font/lato/lato-bolditalic.svg' => 'f56fa11c',
     'rsrc/externals/font/lato/lato-bolditalic.ttf' => '9c3aec21',
     'rsrc/externals/font/lato/lato-bolditalic.woff' => 'bfbd0616',
     'rsrc/externals/font/lato/lato-bolditalic.woff2' => 'bc7d1274',
     'rsrc/externals/font/lato/lato-italic.eot' => '7db5b247',
     'rsrc/externals/font/lato/lato-italic.svg' => 'b1ae496f',
     'rsrc/externals/font/lato/lato-italic.ttf' => '43eed813',
     'rsrc/externals/font/lato/lato-italic.woff' => 'c28975e1',
     'rsrc/externals/font/lato/lato-italic.woff2' => 'fffc0d8c',
     'rsrc/externals/font/lato/lato-regular.eot' => '06e0c291',
     'rsrc/externals/font/lato/lato-regular.svg' => '3ad95f53',
     'rsrc/externals/font/lato/lato-regular.ttf' => 'e2e9c398',
     'rsrc/externals/font/lato/lato-regular.woff' => '0b13d332',
     'rsrc/externals/font/lato/lato-regular.woff2' => '8f846797',
     'rsrc/externals/javelin/core/Event.js' => 'c03f2fb4',
     'rsrc/externals/javelin/core/Stratcom.js' => '0889b835',
     'rsrc/externals/javelin/core/__tests__/event-stop-and-kill.js' => '048472d2',
     'rsrc/externals/javelin/core/__tests__/install.js' => '14a7e671',
     'rsrc/externals/javelin/core/__tests__/stratcom.js' => 'a28464bb',
     'rsrc/externals/javelin/core/__tests__/util.js' => 'e29a4354',
     'rsrc/externals/javelin/core/init.js' => '98e6504a',
     'rsrc/externals/javelin/core/init_node.js' => '16961339',
     'rsrc/externals/javelin/core/install.js' => '5902260c',
     'rsrc/externals/javelin/core/util.js' => '22ae1776',
     'rsrc/externals/javelin/docs/Base.js' => '5a401d7d',
     'rsrc/externals/javelin/docs/onload.js' => 'ee58fb62',
     'rsrc/externals/javelin/ext/fx/Color.js' => '78f811c9',
     'rsrc/externals/javelin/ext/fx/FX.js' => '34450586',
     'rsrc/externals/javelin/ext/reactor/core/DynVal.js' => '202a2e85',
     'rsrc/externals/javelin/ext/reactor/core/Reactor.js' => '1c850a26',
     'rsrc/externals/javelin/ext/reactor/core/ReactorNode.js' => '72960bc1',
     'rsrc/externals/javelin/ext/reactor/core/ReactorNodeCalmer.js' => '225bbb98',
     'rsrc/externals/javelin/ext/reactor/dom/RDOM.js' => '6cfa0008',
     'rsrc/externals/javelin/ext/view/HTMLView.js' => 'f8c4e135',
     'rsrc/externals/javelin/ext/view/View.js' => '289bf236',
     'rsrc/externals/javelin/ext/view/ViewInterpreter.js' => '876506b6',
     'rsrc/externals/javelin/ext/view/ViewPlaceholder.js' => 'a9942052',
     'rsrc/externals/javelin/ext/view/ViewRenderer.js' => '9aae2b66',
     'rsrc/externals/javelin/ext/view/ViewVisitor.js' => '308f9fe4',
     'rsrc/externals/javelin/ext/view/__tests__/HTMLView.js' => '6e50a13f',
     'rsrc/externals/javelin/ext/view/__tests__/View.js' => 'd284be5d',
     'rsrc/externals/javelin/ext/view/__tests__/ViewInterpreter.js' => 'a9f35511',
     'rsrc/externals/javelin/ext/view/__tests__/ViewRenderer.js' => '3a1b81f6',
     'rsrc/externals/javelin/lib/Cookie.js' => '05d290ef',
     'rsrc/externals/javelin/lib/DOM.js' => '94681e22',
     'rsrc/externals/javelin/lib/History.js' => '030b4f7a',
     'rsrc/externals/javelin/lib/JSON.js' => '541f81c3',
     'rsrc/externals/javelin/lib/Leader.js' => '0d2490ce',
     'rsrc/externals/javelin/lib/Mask.js' => '7c4d8998',
     'rsrc/externals/javelin/lib/Quicksand.js' => 'd3799cb4',
     'rsrc/externals/javelin/lib/Request.js' => '91863989',
     'rsrc/externals/javelin/lib/Resource.js' => '740956e1',
     'rsrc/externals/javelin/lib/Routable.js' => '6a18c42e',
     'rsrc/externals/javelin/lib/Router.js' => '32755edb',
     'rsrc/externals/javelin/lib/Scrollbar.js' => 'a43ae2ae',
     'rsrc/externals/javelin/lib/Sound.js' => 'e562708c',
     'rsrc/externals/javelin/lib/URI.js' => '2e255291',
     'rsrc/externals/javelin/lib/Vector.js' => 'e9c80beb',
     'rsrc/externals/javelin/lib/WebSocket.js' => 'fdc13e4e',
     'rsrc/externals/javelin/lib/Workflow.js' => '958e9045',
     'rsrc/externals/javelin/lib/__tests__/Cookie.js' => 'ca686f71',
     'rsrc/externals/javelin/lib/__tests__/DOM.js' => '4566e249',
     'rsrc/externals/javelin/lib/__tests__/JSON.js' => '710377ae',
     'rsrc/externals/javelin/lib/__tests__/URI.js' => '6fff0c2b',
     'rsrc/externals/javelin/lib/__tests__/behavior.js' => '8426ebeb',
     'rsrc/externals/javelin/lib/behavior.js' => 'fce5d170',
     'rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js' => '89a1ae3a',
     'rsrc/externals/javelin/lib/control/typeahead/Typeahead.js' => 'a4356cde',
     'rsrc/externals/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js' => 'a241536a',
     'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js' => '22ee68a5',
     'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js' => '23387297',
     'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js' => '5a79f6c3',
     'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadSource.js' => '8badee71',
     'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js' => '80bff3af',
     'rsrc/favicons/favicon-16x16.png' => '4c51a03a',
     'rsrc/favicons/mask-icon.svg' => 'db699fe1',
     'rsrc/image/BFCFDA.png' => '74b5c88b',
     'rsrc/image/actions/edit.png' => 'fd987dff',
     'rsrc/image/avatar.png' => '0d17c6c4',
     'rsrc/image/checker_dark.png' => '7fc8fa7b',
     'rsrc/image/checker_light.png' => '3157a202',
     'rsrc/image/checker_lighter.png' => 'c45928c1',
     'rsrc/image/controls/checkbox-checked.png' => '1770d7a0',
     'rsrc/image/controls/checkbox-unchecked.png' => 'e1deba0a',
     'rsrc/image/d5d8e1.png' => '6764616e',
     'rsrc/image/darkload.gif' => '5bd41a89',
     'rsrc/image/divot.png' => '0fbe2453',
     'rsrc/image/examples/hero.png' => '5d8c4b21',
     'rsrc/image/grippy_texture.png' => 'a7d222b5',
     'rsrc/image/icon/fatcow/arrow_branch.png' => '98149d9f',
     'rsrc/image/icon/fatcow/arrow_merge.png' => 'e142f4f8',
     'rsrc/image/icon/fatcow/calendar_edit.png' => '5ff44a08',
     'rsrc/image/icon/fatcow/document_black.png' => 'd3515fa5',
     'rsrc/image/icon/fatcow/flag_blue.png' => '54db2e5c',
     'rsrc/image/icon/fatcow/flag_finish.png' => '2953a51b',
     'rsrc/image/icon/fatcow/flag_ghost.png' => '7d9ada92',
     'rsrc/image/icon/fatcow/flag_green.png' => '010f7161',
     'rsrc/image/icon/fatcow/flag_orange.png' => '6c384ca5',
     'rsrc/image/icon/fatcow/flag_pink.png' => '11ac6b12',
     'rsrc/image/icon/fatcow/flag_purple.png' => 'c4f423a4',
     'rsrc/image/icon/fatcow/flag_red.png' => '9e6d8817',
     'rsrc/image/icon/fatcow/flag_yellow.png' => '906733f4',
     'rsrc/image/icon/fatcow/key_question.png' => 'c10c26db',
     'rsrc/image/icon/fatcow/link.png' => '8edbf327',
     'rsrc/image/icon/fatcow/page_white_edit.png' => '17ef5625',
     'rsrc/image/icon/fatcow/page_white_put.png' => '82430c91',
     'rsrc/image/icon/fatcow/source/conduit.png' => '5b55130c',
     'rsrc/image/icon/fatcow/source/email.png' => '8a32b77f',
     'rsrc/image/icon/fatcow/source/fax.png' => '8bc2a49b',
     'rsrc/image/icon/fatcow/source/mobile.png' => '0a918412',
     'rsrc/image/icon/fatcow/source/tablet.png' => 'fc50b050',
     'rsrc/image/icon/fatcow/source/web.png' => '70433af3',
     'rsrc/image/icon/subscribe.png' => '07ef454e',
     'rsrc/image/icon/tango/attachment.png' => 'bac9032d',
     'rsrc/image/icon/tango/edit.png' => 'e6296206',
     'rsrc/image/icon/tango/go-down.png' => '0b903712',
     'rsrc/image/icon/tango/log.png' => '86b6a6f4',
     'rsrc/image/icon/tango/upload.png' => '3fe6b92d',
     'rsrc/image/icon/unsubscribe.png' => 'db04378a',
     'rsrc/image/lightblue-header.png' => 'e6d483c6',
     'rsrc/image/logo/light-eye.png' => '72337472',
     'rsrc/image/main_texture.png' => '894d03c4',
     'rsrc/image/menu_texture.png' => '896c9ade',
     'rsrc/image/people/harding.png' => '95b2db63',
     'rsrc/image/people/jefferson.png' => 'e883a3a2',
     'rsrc/image/people/lincoln.png' => 'be2c07c5',
     'rsrc/image/people/mckinley.png' => '6af510a0',
     'rsrc/image/people/taft.png' => 'b15ab07e',
     'rsrc/image/people/user0.png' => '4bc64b40',
     'rsrc/image/people/user1.png' => '8063f445',
     'rsrc/image/people/user2.png' => 'd28246c0',
     'rsrc/image/people/user3.png' => 'fb1ac12d',
     'rsrc/image/people/user4.png' => 'fe4fac8f',
     'rsrc/image/people/user5.png' => '3d07065c',
     'rsrc/image/people/user6.png' => 'e4bd47c8',
     'rsrc/image/people/user7.png' => '71d8fe8b',
     'rsrc/image/people/user8.png' => '85f86bf7',
     'rsrc/image/people/user9.png' => '523db8aa',
     'rsrc/image/people/washington.png' => '86159e68',
     'rsrc/image/phrequent_active.png' => 'de66dc50',
     'rsrc/image/phrequent_inactive.png' => '79c61baf',
     'rsrc/image/resize.png' => '9cc83373',
     'rsrc/image/sprite-login-X2.png' => '604545f6',
     'rsrc/image/sprite-login.png' => '7a001a9a',
     'rsrc/image/sprite-tokens-X2.png' => '21621dd9',
     'rsrc/image/sprite-tokens.png' => 'bede2580',
     'rsrc/image/texture/card-gradient.png' => 'e6892cb4',
     'rsrc/image/texture/dark-menu-hover.png' => '390a4fa1',
     'rsrc/image/texture/dark-menu.png' => '542f699c',
     'rsrc/image/texture/grip.png' => 'bc80753a',
     'rsrc/image/texture/panel-header-gradient.png' => '65004dbf',
     'rsrc/image/texture/phlnx-bg.png' => '6c9cd31d',
     'rsrc/image/texture/pholio-background.gif' => '84910bfc',
     'rsrc/image/texture/table_header.png' => '7652d1ad',
     'rsrc/image/texture/table_header_hover.png' => '12ea5236',
     'rsrc/image/texture/table_header_tall.png' => '5cc420c4',
     'rsrc/js/application/aphlict/Aphlict.js' => '022516b4',
     'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => 'e9a2940f',
     'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => '4e61fa88',
     'rsrc/js/application/aphlict/behavior-aphlict-status.js' => 'c3703a16',
     'rsrc/js/application/aphlict/behavior-desktop-notifications-control.js' => '070679fe',
     'rsrc/js/application/calendar/behavior-day-view.js' => '727a5a61',
     'rsrc/js/application/calendar/behavior-event-all-day.js' => '0b1bc990',
     'rsrc/js/application/calendar/behavior-month-view.js' => '158c64e0',
     'rsrc/js/application/config/behavior-reorder-fields.js' => '2539f834',
     'rsrc/js/application/conpherence/ConpherenceThreadManager.js' => 'aec8e38c',
     'rsrc/js/application/conpherence/behavior-conpherence-search.js' => '91befbcc',
     'rsrc/js/application/conpherence/behavior-durable-column.js' => 'fa6f30b2',
     'rsrc/js/application/conpherence/behavior-menu.js' => '8c2ed2bf',
     'rsrc/js/application/conpherence/behavior-participant-pane.js' => '43ba89a2',
     'rsrc/js/application/conpherence/behavior-pontificate.js' => '4ae58b5a',
     'rsrc/js/application/conpherence/behavior-quicksand-blacklist.js' => '5a6f6a06',
     'rsrc/js/application/conpherence/behavior-toggle-widget.js' => '8f959ad0',
     'rsrc/js/application/countdown/timer.js' => '6a162524',
     'rsrc/js/application/daemon/behavior-bulk-job-reload.js' => '3829a3cf',
     'rsrc/js/application/dashboard/behavior-dashboard-async-panel.js' => '09ecf50c',
     'rsrc/js/application/dashboard/behavior-dashboard-move-panels.js' => '076bd092',
     'rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js' => '1e413dc9',
     'rsrc/js/application/dashboard/behavior-dashboard-tab-panel.js' => '9b1cbd76',
     'rsrc/js/application/diff/DiffChangeset.js' => 'e7cf10d6',
     'rsrc/js/application/diff/DiffChangesetList.js' => 'b91204e9',
     'rsrc/js/application/diff/DiffInline.js' => 'a4a14a94',
     'rsrc/js/application/diff/behavior-preview-link.js' => 'f51e9c17',
     'rsrc/js/application/differential/behavior-diff-radios.js' => '925fe8cd',
     'rsrc/js/application/differential/behavior-populate.js' => 'dfa1d313',
     'rsrc/js/application/differential/behavior-user-select.js' => 'e18685c0',
     'rsrc/js/application/diffusion/DiffusionLocateFileSource.js' => '94243d89',
     'rsrc/js/application/diffusion/behavior-audit-preview.js' => 'b7b73831',
     'rsrc/js/application/diffusion/behavior-commit-branches.js' => '4b671572',
     'rsrc/js/application/diffusion/behavior-commit-graph.js' => '1c88f154',
     'rsrc/js/application/diffusion/behavior-locate-file.js' => '87428eb2',
     'rsrc/js/application/diffusion/behavior-pull-lastmodified.js' => 'c715c123',
     'rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js' => '6a85bc5a',
     'rsrc/js/application/drydock/drydock-live-operation-status.js' => '47a0728b',
     'rsrc/js/application/files/behavior-document-engine.js' => '243d6c22',
     'rsrc/js/application/files/behavior-icon-composer.js' => '38a6cedb',
     'rsrc/js/application/files/behavior-launch-icon-composer.js' => 'a17b84f1',
     'rsrc/js/application/harbormaster/behavior-harbormaster-log.js' => 'b347a301',
     'rsrc/js/application/herald/HeraldRuleEditor.js' => '27daef73',
     'rsrc/js/application/herald/PathTypeahead.js' => 'ad486db3',
     'rsrc/js/application/herald/herald-rule-editor.js' => '0922e81d',
     'rsrc/js/application/maniphest/behavior-batch-selector.js' => 'cffd39b4',
     'rsrc/js/application/maniphest/behavior-line-chart.js' => 'c8147a20',
     'rsrc/js/application/maniphest/behavior-list-edit.js' => 'c687e867',
     'rsrc/js/application/maniphest/behavior-subpriorityeditor.js' => '8400307c',
     'rsrc/js/application/owners/OwnersPathEditor.js' => '2a8b62d9',
     'rsrc/js/application/owners/owners-path-editor.js' => 'ff688a7a',
     'rsrc/js/application/passphrase/passphrase-credential-control.js' => '48fe33d0',
     'rsrc/js/application/pholio/behavior-pholio-mock-edit.js' => '3eed1f2b',
     'rsrc/js/application/pholio/behavior-pholio-mock-view.js' => '5aa1544e',
     'rsrc/js/application/phortune/behavior-stripe-payment-form.js' => '02cb4398',
     'rsrc/js/application/phortune/behavior-test-payment-form.js' => '4a7fb02b',
     'rsrc/js/application/phortune/phortune-credit-card-form.js' => 'd12d214f',
     'rsrc/js/application/policy/behavior-policy-control.js' => '0eaa33a9',
     'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '9347f172',
     'rsrc/js/application/projects/WorkboardBoard.js' => '45d0b2b1',
     'rsrc/js/application/projects/WorkboardCard.js' => '9a513421',
     'rsrc/js/application/projects/WorkboardColumn.js' => '8573dc1b',
     'rsrc/js/application/projects/WorkboardController.js' => '42c7a5a7',
     'rsrc/js/application/projects/behavior-project-boards.js' => '05c74d65',
     'rsrc/js/application/projects/behavior-project-create.js' => '34c53422',
     'rsrc/js/application/projects/behavior-reorder-columns.js' => '8ac32fd9',
     'rsrc/js/application/releeph/releeph-preview-branch.js' => '75184d68',
     'rsrc/js/application/releeph/releeph-request-state-change.js' => '9f081f05',
     'rsrc/js/application/releeph/releeph-request-typeahead.js' => 'aa3a100c',
     'rsrc/js/application/repository/repository-crossreference.js' => 'db0c0214',
     'rsrc/js/application/search/behavior-reorder-profile-menu-items.js' => 'e5bdb730',
     'rsrc/js/application/search/behavior-reorder-queries.js' => 'b86f297f',
     'rsrc/js/application/transactions/behavior-comment-actions.js' => '4dffaeb2',
     'rsrc/js/application/transactions/behavior-reorder-configs.js' => '4842f137',
     'rsrc/js/application/transactions/behavior-reorder-fields.js' => '0ad8d31f',
     'rsrc/js/application/transactions/behavior-show-older-transactions.js' => '600f440c',
     'rsrc/js/application/transactions/behavior-transaction-comment-form.js' => '2bdadf1a',
     'rsrc/js/application/transactions/behavior-transaction-list.js' => '9cec214e',
     'rsrc/js/application/typeahead/behavior-typeahead-browse.js' => '70245195',
     'rsrc/js/application/typeahead/behavior-typeahead-search.js' => '7b139193',
     'rsrc/js/application/uiexample/gesture-example.js' => '242dedd0',
     'rsrc/js/application/uiexample/notification-example.js' => '29819b75',
     'rsrc/js/core/Busy.js' => '5202e831',
     'rsrc/js/core/DragAndDropFileUpload.js' => '4370900d',
     'rsrc/js/core/DraggableList.js' => '3c6bd549',
     'rsrc/js/core/Favicon.js' => '7930776a',
     'rsrc/js/core/FileUpload.js' => 'ab85e184',
     'rsrc/js/core/Hovercard.js' => '074f0783',
     'rsrc/js/core/KeyboardShortcut.js' => 'c9749dcd',
     'rsrc/js/core/KeyboardShortcutManager.js' => '37b8a04a',
     'rsrc/js/core/MultirowRowManager.js' => '5b54c823',
     'rsrc/js/core/Notification.js' => 'a9b91e3f',
-    'rsrc/js/core/Prefab.js' => 'bf457520',
+    'rsrc/js/core/Prefab.js' => '5793d835',
     'rsrc/js/core/ShapedRequest.js' => 'abf88db8',
     'rsrc/js/core/TextAreaUtils.js' => 'f340a484',
     'rsrc/js/core/Title.js' => '43bc9360',
     'rsrc/js/core/ToolTip.js' => '83754533',
     'rsrc/js/core/behavior-active-nav.js' => '7353f43d',
     'rsrc/js/core/behavior-audio-source.js' => '3dc5ad43',
     'rsrc/js/core/behavior-autofocus.js' => '65bb0011',
     'rsrc/js/core/behavior-badge-view.js' => '92cdd7b6',
     'rsrc/js/core/behavior-bulk-editor.js' => 'aa6d2308',
     'rsrc/js/core/behavior-choose-control.js' => '04f8a1e3',
     'rsrc/js/core/behavior-copy.js' => 'cf32921f',
     'rsrc/js/core/behavior-detect-timezone.js' => '78bc5d94',
     'rsrc/js/core/behavior-device.js' => '0cf79f45',
     'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '7ad020a5',
     'rsrc/js/core/behavior-fancy-datepicker.js' => '956f3eeb',
     'rsrc/js/core/behavior-file-tree.js' => 'ee82cedb',
     'rsrc/js/core/behavior-form.js' => '55d7b788',
     'rsrc/js/core/behavior-gesture.js' => 'b58d1a2a',
     'rsrc/js/core/behavior-global-drag-and-drop.js' => '1cab0e9a',
     'rsrc/js/core/behavior-high-security-warning.js' => 'dae2d55b',
     'rsrc/js/core/behavior-history-install.js' => '6a1583a8',
     'rsrc/js/core/behavior-hovercard.js' => '6c379000',
     'rsrc/js/core/behavior-keyboard-pager.js' => '1325b731',
     'rsrc/js/core/behavior-keyboard-shortcuts.js' => '2cc87f49',
     'rsrc/js/core/behavior-lightbox-attachments.js' => 'c7e748bf',
     'rsrc/js/core/behavior-line-linker.js' => 'e15c8b1f',
     'rsrc/js/core/behavior-linked-container.js' => '74446546',
     'rsrc/js/core/behavior-more.js' => '506aa3f4',
     'rsrc/js/core/behavior-object-selector.js' => 'a4af0b4a',
     'rsrc/js/core/behavior-oncopy.js' => '418f6684',
     'rsrc/js/core/behavior-phabricator-nav.js' => 'f166c949',
     'rsrc/js/core/behavior-phabricator-remarkup-assist.js' => '2f80333f',
     'rsrc/js/core/behavior-read-only-warning.js' => 'b9109f8f',
     'rsrc/js/core/behavior-redirect.js' => '407ee861',
     'rsrc/js/core/behavior-refresh-csrf.js' => '46116c01',
     'rsrc/js/core/behavior-remarkup-load-image.js' => '202bfa3f',
     'rsrc/js/core/behavior-remarkup-preview.js' => 'd8a86cfb',
     'rsrc/js/core/behavior-reorder-applications.js' => 'aa371860',
     'rsrc/js/core/behavior-reveal-content.js' => 'b105a3a6',
     'rsrc/js/core/behavior-scrollbar.js' => '92388bae',
     'rsrc/js/core/behavior-search-typeahead.js' => '1cb7d027',
     'rsrc/js/core/behavior-select-content.js' => 'e8240b50',
     'rsrc/js/core/behavior-select-on-click.js' => '66365ee2',
     'rsrc/js/core/behavior-setup-check-https.js' => '01384686',
     'rsrc/js/core/behavior-time-typeahead.js' => '5803b9e7',
     'rsrc/js/core/behavior-toggle-class.js' => 'f5c78ae3',
     'rsrc/js/core/behavior-tokenizer.js' => '3b4899b0',
     'rsrc/js/core/behavior-tooltip.js' => '73ecc1f8',
     'rsrc/js/core/behavior-user-menu.js' => '60cd9241',
     'rsrc/js/core/behavior-watch-anchor.js' => '0e6d261f',
     'rsrc/js/core/behavior-workflow.js' => '9623adc1',
     'rsrc/js/core/darkconsole/DarkLog.js' => '3b869402',
     'rsrc/js/core/darkconsole/DarkMessage.js' => '26cd4b73',
     'rsrc/js/core/darkconsole/behavior-dark-console.js' => 'f39d968b',
     'rsrc/js/core/phtize.js' => '2f1db1ed',
     'rsrc/js/phui/behavior-phui-dropdown-menu.js' => '5cf0501a',
     'rsrc/js/phui/behavior-phui-file-upload.js' => 'e150bd50',
     'rsrc/js/phui/behavior-phui-selectable-list.js' => 'b26a41e4',
     'rsrc/js/phui/behavior-phui-submenu.js' => 'b5e9bff9',
     'rsrc/js/phui/behavior-phui-tab-group.js' => '242aa08b',
     'rsrc/js/phui/behavior-phui-timer-control.js' => 'f84bcbf4',
     'rsrc/js/phuix/PHUIXActionListView.js' => 'c68f183f',
     'rsrc/js/phuix/PHUIXActionView.js' => 'aaa08f3b',
-    'rsrc/js/phuix/PHUIXAutocomplete.js' => '58cc4ab8',
+    'rsrc/js/phuix/PHUIXAutocomplete.js' => '8f139ef0',
     'rsrc/js/phuix/PHUIXButtonView.js' => '55a24e84',
     'rsrc/js/phuix/PHUIXDropdownMenu.js' => 'bdce4d78',
     'rsrc/js/phuix/PHUIXExample.js' => 'c2c500a7',
     'rsrc/js/phuix/PHUIXFormControl.js' => '38c1f3fb',
     'rsrc/js/phuix/PHUIXIconView.js' => 'a5257c4e',
   ),
   'symbols' => array(
     'almanac-css' => '2e050f4f',
     'aphront-bars' => '4a327b4a',
     'aphront-dark-console-css' => '7f06cda2',
     'aphront-dialog-view-css' => 'b70c70df',
     'aphront-list-filter-view-css' => 'feb64255',
     'aphront-multi-column-view-css' => 'fbc00ba3',
     'aphront-panel-view-css' => '46923d46',
     'aphront-table-view-css' => '205053cd',
     'aphront-tokenizer-control-css' => 'b52d0668',
     'aphront-tooltip-css' => 'e3f2412f',
     'aphront-typeahead-control-css' => '8779483d',
     'application-search-view-css' => '0f7c06d8',
     'auth-css' => 'add92fd8',
     'bulk-job-css' => '73af99f5',
     'conduit-api-css' => 'ce2cfc41',
     'config-options-css' => '16c920ae',
     'conpherence-color-css' => 'b17746b0',
     'conpherence-durable-column-view' => '2d57072b',
     'conpherence-header-pane-css' => 'c9a3db8e',
     'conpherence-menu-css' => '67f4680d',
     'conpherence-message-pane-css' => 'd244db1e',
     'conpherence-notification-css' => '6a3d4e58',
     'conpherence-participant-pane-css' => '69e0058a',
     'conpherence-thread-manager' => 'aec8e38c',
     'conpherence-transaction-css' => '3a3f5e7e',
     'd3' => 'd67475f5',
     'differential-changeset-view-css' => '73660575',
     'differential-core-view-css' => 'bdb93065',
     'differential-revision-add-comment-css' => '7e5900d9',
     'differential-revision-comment-css' => '7dbc8d1d',
     'differential-revision-history-css' => '8aa3eac5',
     'differential-revision-list-css' => '93d2df7d',
     'differential-table-of-contents-css' => '0e3364c7',
     'diffusion-css' => 'b54c77b0',
     'diffusion-icons-css' => '23b31a1b',
     'diffusion-readme-css' => 'b68a76e4',
     'diffusion-repository-css' => 'b89e8c6c',
     'diviner-shared-css' => '4bd263b0',
     'font-fontawesome' => '3883938a',
     'font-lato' => '23631304',
     'global-drag-and-drop-css' => '1d2713a4',
     'harbormaster-css' => '8dfe16b2',
     'herald-css' => '648d39e2',
     'herald-rule-editor' => '27daef73',
     'herald-test-css' => 'e004176f',
     'inline-comment-summary-css' => '81eb368d',
     'javelin-aphlict' => '022516b4',
     'javelin-behavior' => 'fce5d170',
     'javelin-behavior-aphlict-dropdown' => 'e9a2940f',
     'javelin-behavior-aphlict-listen' => '4e61fa88',
     'javelin-behavior-aphlict-status' => 'c3703a16',
     'javelin-behavior-aphront-basic-tokenizer' => '3b4899b0',
     'javelin-behavior-aphront-drag-and-drop-textarea' => '7ad020a5',
     'javelin-behavior-aphront-form-disable-on-submit' => '55d7b788',
     'javelin-behavior-aphront-more' => '506aa3f4',
     'javelin-behavior-audio-source' => '3dc5ad43',
     'javelin-behavior-audit-preview' => 'b7b73831',
     'javelin-behavior-badge-view' => '92cdd7b6',
     'javelin-behavior-bulk-editor' => 'aa6d2308',
     'javelin-behavior-bulk-job-reload' => '3829a3cf',
     'javelin-behavior-calendar-month-view' => '158c64e0',
     'javelin-behavior-choose-control' => '04f8a1e3',
     'javelin-behavior-comment-actions' => '4dffaeb2',
     'javelin-behavior-config-reorder-fields' => '2539f834',
     'javelin-behavior-conpherence-menu' => '8c2ed2bf',
     'javelin-behavior-conpherence-participant-pane' => '43ba89a2',
     'javelin-behavior-conpherence-pontificate' => '4ae58b5a',
     'javelin-behavior-conpherence-search' => '91befbcc',
     'javelin-behavior-countdown-timer' => '6a162524',
     'javelin-behavior-dark-console' => 'f39d968b',
     'javelin-behavior-dashboard-async-panel' => '09ecf50c',
     'javelin-behavior-dashboard-move-panels' => '076bd092',
     'javelin-behavior-dashboard-query-panel-select' => '1e413dc9',
     'javelin-behavior-dashboard-tab-panel' => '9b1cbd76',
     'javelin-behavior-day-view' => '727a5a61',
     'javelin-behavior-desktop-notifications-control' => '070679fe',
     'javelin-behavior-detect-timezone' => '78bc5d94',
     'javelin-behavior-device' => '0cf79f45',
     'javelin-behavior-diff-preview-link' => 'f51e9c17',
     'javelin-behavior-differential-diff-radios' => '925fe8cd',
     'javelin-behavior-differential-populate' => 'dfa1d313',
     'javelin-behavior-differential-user-select' => 'e18685c0',
     'javelin-behavior-diffusion-commit-branches' => '4b671572',
     'javelin-behavior-diffusion-commit-graph' => '1c88f154',
     'javelin-behavior-diffusion-locate-file' => '87428eb2',
     'javelin-behavior-diffusion-pull-lastmodified' => 'c715c123',
     'javelin-behavior-document-engine' => '243d6c22',
     'javelin-behavior-doorkeeper-tag' => '6a85bc5a',
     'javelin-behavior-drydock-live-operation-status' => '47a0728b',
     'javelin-behavior-durable-column' => 'fa6f30b2',
     'javelin-behavior-editengine-reorder-configs' => '4842f137',
     'javelin-behavior-editengine-reorder-fields' => '0ad8d31f',
     'javelin-behavior-event-all-day' => '0b1bc990',
     'javelin-behavior-fancy-datepicker' => '956f3eeb',
     'javelin-behavior-global-drag-and-drop' => '1cab0e9a',
     'javelin-behavior-harbormaster-log' => 'b347a301',
     'javelin-behavior-herald-rule-editor' => '0922e81d',
     'javelin-behavior-high-security-warning' => 'dae2d55b',
     'javelin-behavior-history-install' => '6a1583a8',
     'javelin-behavior-icon-composer' => '38a6cedb',
     'javelin-behavior-launch-icon-composer' => 'a17b84f1',
     'javelin-behavior-lightbox-attachments' => 'c7e748bf',
     'javelin-behavior-line-chart' => 'c8147a20',
     'javelin-behavior-linked-container' => '74446546',
     'javelin-behavior-maniphest-batch-selector' => 'cffd39b4',
     'javelin-behavior-maniphest-list-editor' => 'c687e867',
     'javelin-behavior-maniphest-subpriority-editor' => '8400307c',
     'javelin-behavior-owners-path-editor' => 'ff688a7a',
     'javelin-behavior-passphrase-credential-control' => '48fe33d0',
     'javelin-behavior-phabricator-active-nav' => '7353f43d',
     'javelin-behavior-phabricator-autofocus' => '65bb0011',
     'javelin-behavior-phabricator-clipboard-copy' => 'cf32921f',
     'javelin-behavior-phabricator-file-tree' => 'ee82cedb',
     'javelin-behavior-phabricator-gesture' => 'b58d1a2a',
     'javelin-behavior-phabricator-gesture-example' => '242dedd0',
     'javelin-behavior-phabricator-keyboard-pager' => '1325b731',
     'javelin-behavior-phabricator-keyboard-shortcuts' => '2cc87f49',
     'javelin-behavior-phabricator-line-linker' => 'e15c8b1f',
     'javelin-behavior-phabricator-nav' => 'f166c949',
     'javelin-behavior-phabricator-notification-example' => '29819b75',
     'javelin-behavior-phabricator-object-selector' => 'a4af0b4a',
     'javelin-behavior-phabricator-oncopy' => '418f6684',
     'javelin-behavior-phabricator-remarkup-assist' => '2f80333f',
     'javelin-behavior-phabricator-reveal-content' => 'b105a3a6',
     'javelin-behavior-phabricator-search-typeahead' => '1cb7d027',
     'javelin-behavior-phabricator-show-older-transactions' => '600f440c',
     'javelin-behavior-phabricator-tooltips' => '73ecc1f8',
     'javelin-behavior-phabricator-transaction-comment-form' => '2bdadf1a',
     'javelin-behavior-phabricator-transaction-list' => '9cec214e',
     'javelin-behavior-phabricator-watch-anchor' => '0e6d261f',
     'javelin-behavior-pholio-mock-edit' => '3eed1f2b',
     'javelin-behavior-pholio-mock-view' => '5aa1544e',
     'javelin-behavior-phui-dropdown-menu' => '5cf0501a',
     'javelin-behavior-phui-file-upload' => 'e150bd50',
     'javelin-behavior-phui-hovercards' => '6c379000',
     'javelin-behavior-phui-selectable-list' => 'b26a41e4',
     'javelin-behavior-phui-submenu' => 'b5e9bff9',
     'javelin-behavior-phui-tab-group' => '242aa08b',
     'javelin-behavior-phui-timer-control' => 'f84bcbf4',
     'javelin-behavior-phuix-example' => 'c2c500a7',
     'javelin-behavior-policy-control' => '0eaa33a9',
     'javelin-behavior-policy-rule-editor' => '9347f172',
     'javelin-behavior-project-boards' => '05c74d65',
     'javelin-behavior-project-create' => '34c53422',
     'javelin-behavior-quicksand-blacklist' => '5a6f6a06',
     'javelin-behavior-read-only-warning' => 'b9109f8f',
     'javelin-behavior-redirect' => '407ee861',
     'javelin-behavior-refresh-csrf' => '46116c01',
     'javelin-behavior-releeph-preview-branch' => '75184d68',
     'javelin-behavior-releeph-request-state-change' => '9f081f05',
     'javelin-behavior-releeph-request-typeahead' => 'aa3a100c',
     'javelin-behavior-remarkup-load-image' => '202bfa3f',
     'javelin-behavior-remarkup-preview' => 'd8a86cfb',
     'javelin-behavior-reorder-applications' => 'aa371860',
     'javelin-behavior-reorder-columns' => '8ac32fd9',
     'javelin-behavior-reorder-profile-menu-items' => 'e5bdb730',
     'javelin-behavior-repository-crossreference' => 'db0c0214',
     'javelin-behavior-scrollbar' => '92388bae',
     'javelin-behavior-search-reorder-queries' => 'b86f297f',
     'javelin-behavior-select-content' => 'e8240b50',
     'javelin-behavior-select-on-click' => '66365ee2',
     'javelin-behavior-setup-check-https' => '01384686',
     'javelin-behavior-stripe-payment-form' => '02cb4398',
     'javelin-behavior-test-payment-form' => '4a7fb02b',
     'javelin-behavior-time-typeahead' => '5803b9e7',
     'javelin-behavior-toggle-class' => 'f5c78ae3',
     'javelin-behavior-toggle-widget' => '8f959ad0',
     'javelin-behavior-typeahead-browse' => '70245195',
     'javelin-behavior-typeahead-search' => '7b139193',
     'javelin-behavior-user-menu' => '60cd9241',
     'javelin-behavior-view-placeholder' => 'a9942052',
     'javelin-behavior-workflow' => '9623adc1',
     'javelin-color' => '78f811c9',
     'javelin-cookie' => '05d290ef',
     'javelin-diffusion-locate-file-source' => '94243d89',
     'javelin-dom' => '94681e22',
     'javelin-dynval' => '202a2e85',
     'javelin-event' => 'c03f2fb4',
     'javelin-fx' => '34450586',
     'javelin-history' => '030b4f7a',
     'javelin-install' => '5902260c',
     'javelin-json' => '541f81c3',
     'javelin-leader' => '0d2490ce',
     'javelin-magical-init' => '98e6504a',
     'javelin-mask' => '7c4d8998',
     'javelin-quicksand' => 'd3799cb4',
     'javelin-reactor' => '1c850a26',
     'javelin-reactor-dom' => '6cfa0008',
     'javelin-reactor-node-calmer' => '225bbb98',
     'javelin-reactornode' => '72960bc1',
     'javelin-request' => '91863989',
     'javelin-resource' => '740956e1',
     'javelin-routable' => '6a18c42e',
     'javelin-router' => '32755edb',
     'javelin-scrollbar' => 'a43ae2ae',
     'javelin-sound' => 'e562708c',
     'javelin-stratcom' => '0889b835',
     'javelin-tokenizer' => '89a1ae3a',
     'javelin-typeahead' => 'a4356cde',
     'javelin-typeahead-composite-source' => '22ee68a5',
     'javelin-typeahead-normalizer' => 'a241536a',
     'javelin-typeahead-ondemand-source' => '23387297',
     'javelin-typeahead-preloaded-source' => '5a79f6c3',
     'javelin-typeahead-source' => '8badee71',
     'javelin-typeahead-static-source' => '80bff3af',
     'javelin-uri' => '2e255291',
     'javelin-util' => '22ae1776',
     'javelin-vector' => 'e9c80beb',
     'javelin-view' => '289bf236',
     'javelin-view-html' => 'f8c4e135',
     'javelin-view-interpreter' => '876506b6',
     'javelin-view-renderer' => '9aae2b66',
     'javelin-view-visitor' => '308f9fe4',
     'javelin-websocket' => 'fdc13e4e',
     'javelin-workboard-board' => '45d0b2b1',
     'javelin-workboard-card' => '9a513421',
     'javelin-workboard-column' => '8573dc1b',
     'javelin-workboard-controller' => '42c7a5a7',
     'javelin-workflow' => '958e9045',
     'maniphest-report-css' => '3d53188b',
     'maniphest-task-edit-css' => '272daa84',
     'maniphest-task-summary-css' => '61d1667e',
     'multirow-row-manager' => '5b54c823',
     'owners-path-editor' => '2a8b62d9',
     'owners-path-editor-css' => 'fa7c13ef',
     'paste-css' => 'b37bcd38',
     'path-typeahead' => 'ad486db3',
     'people-picture-menu-item-css' => 'fe8e07cf',
     'people-profile-css' => '2ea2daa1',
     'phabricator-action-list-view-css' => 'c4972757',
     'phabricator-busy' => '5202e831',
     'phabricator-chatlog-css' => 'abdc76ee',
     'phabricator-content-source-view-css' => 'cdf0d579',
     'phabricator-core-css' => '1b29ed61',
     'phabricator-countdown-css' => 'bff8012f',
     'phabricator-darklog' => '3b869402',
     'phabricator-darkmessage' => '26cd4b73',
     'phabricator-dashboard-css' => '4267d6c6',
     'phabricator-diff-changeset' => 'e7cf10d6',
     'phabricator-diff-changeset-list' => 'b91204e9',
     'phabricator-diff-inline' => 'a4a14a94',
     'phabricator-drag-and-drop-file-upload' => '4370900d',
     'phabricator-draggable-list' => '3c6bd549',
     'phabricator-fatal-config-template-css' => '20babf50',
     'phabricator-favicon' => '7930776a',
     'phabricator-feed-css' => 'd8b6e3f8',
     'phabricator-file-upload' => 'ab85e184',
     'phabricator-filetree-view-css' => '56cdd875',
     'phabricator-flag-css' => '2b77be8d',
     'phabricator-keyboard-shortcut' => 'c9749dcd',
     'phabricator-keyboard-shortcut-manager' => '37b8a04a',
     'phabricator-main-menu-view' => '8e2d9a28',
     'phabricator-nav-view-css' => 'f8a0c1bf',
     'phabricator-notification' => 'a9b91e3f',
     'phabricator-notification-css' => '30240bd2',
     'phabricator-notification-menu-css' => 'e6962e89',
     'phabricator-object-selector-css' => 'ee77366f',
     'phabricator-phtize' => '2f1db1ed',
-    'phabricator-prefab' => 'bf457520',
+    'phabricator-prefab' => '5793d835',
     'phabricator-remarkup-css' => '9e627d41',
     'phabricator-search-results-css' => '9ea70ace',
     'phabricator-shaped-request' => 'abf88db8',
     'phabricator-slowvote-css' => '1694baed',
     'phabricator-source-code-view-css' => '03d7ac28',
     'phabricator-standard-page-view' => '8a295cb9',
     'phabricator-textareautils' => 'f340a484',
     'phabricator-title' => '43bc9360',
     'phabricator-tooltip' => '83754533',
     'phabricator-ui-example-css' => 'b4795059',
     'phabricator-zindex-css' => '99c0f5eb',
     'phame-css' => '799febf9',
     'pholio-css' => '88ef5ef1',
     'pholio-edit-css' => '4df55b3b',
     'pholio-inline-comments-css' => '722b48c2',
     'phortune-credit-card-form' => 'd12d214f',
     'phortune-credit-card-form-css' => '3b9868a8',
     'phortune-css' => '12e8251a',
     'phortune-invoice-css' => '4436b241',
     'phrequent-css' => 'bd79cc67',
     'phriction-document-css' => '03380da0',
     'phui-action-panel-css' => '6c386cbf',
     'phui-badge-view-css' => '666e25ad',
     'phui-basic-nav-view-css' => '56ebd66d',
     'phui-big-info-view-css' => '362ad37b',
     'phui-box-css' => '5ed3b8cb',
     'phui-bulk-editor-css' => '374d5e30',
     'phui-button-bar-css' => 'a4aa75c4',
     'phui-button-css' => 'ea704902',
     'phui-button-simple-css' => '1ff278aa',
     'phui-calendar-css' => 'f11073aa',
     'phui-calendar-day-css' => '9597d706',
     'phui-calendar-list-css' => 'ccd7e4e2',
     'phui-calendar-month-css' => 'cb758c42',
     'phui-chart-css' => '7853a69b',
     'phui-cms-css' => '8c05c41e',
     'phui-comment-form-css' => '68a2d99a',
     'phui-comment-panel-css' => 'ec4e31c0',
     'phui-crumbs-view-css' => '614f43cf',
     'phui-curtain-view-css' => '68c5efb6',
     'phui-document-summary-view-css' => 'b068eed1',
     'phui-document-view-css' => '52b748a5',
     'phui-document-view-pro-css' => 'b9613a10',
     'phui-feed-story-css' => 'a0c05029',
     'phui-font-icon-base-css' => 'd7994e06',
     'phui-fontkit-css' => '9b714a5e',
     'phui-form-css' => '159e2d9c',
     'phui-form-view-css' => '01b796c0',
     'phui-head-thing-view-css' => 'd7f293df',
     'phui-header-view-css' => '285c9139',
     'phui-hovercard' => '074f0783',
     'phui-hovercard-view-css' => '6ca90fa0',
     'phui-icon-set-selector-css' => '7aa5f3ec',
     'phui-icon-view-css' => '4cbc684a',
     'phui-image-mask-css' => '62c7f4d2',
     'phui-info-view-css' => '37b8d9ce',
     'phui-inline-comment-view-css' => '48acce5b',
     'phui-invisible-character-view-css' => 'c694c4a4',
     'phui-left-right-css' => '68513c34',
     'phui-lightbox-css' => '4ebf22da',
     'phui-list-view-css' => '470b1adb',
     'phui-object-box-css' => 'f434b6be',
     'phui-oi-big-ui-css' => '9e037c7a',
     'phui-oi-color-css' => 'b517bfa0',
     'phui-oi-drag-ui-css' => 'da15d3dc',
     'phui-oi-flush-ui-css' => '490e2e2e',
     'phui-oi-list-view-css' => '909f3844',
     'phui-oi-simple-ui-css' => '6a30fa46',
     'phui-pager-css' => 'd022c7ad',
     'phui-pinboard-view-css' => '1f08f5d8',
     'phui-property-list-view-css' => 'cad62236',
     'phui-remarkup-preview-css' => '91767007',
     'phui-segment-bar-view-css' => '5166b370',
     'phui-spacing-css' => 'b05cadc3',
     'phui-status-list-view-css' => 'e5ff8be0',
-    'phui-tag-view-css' => 'a42fe34f',
+    'phui-tag-view-css' => '29409667',
     'phui-theme-css' => '35883b37',
     'phui-timeline-view-css' => '1e348e4b',
     'phui-two-column-view-css' => '01e6991e',
     'phui-workboard-color-css' => 'e86de308',
     'phui-workboard-view-css' => '74fc9d98',
     'phui-workcard-view-css' => '8c536f90',
     'phui-workpanel-view-css' => 'bd546a49',
     'phuix-action-list-view' => 'c68f183f',
     'phuix-action-view' => 'aaa08f3b',
-    'phuix-autocomplete' => '58cc4ab8',
+    'phuix-autocomplete' => '8f139ef0',
     'phuix-button-view' => '55a24e84',
     'phuix-dropdown-menu' => 'bdce4d78',
     'phuix-form-control-view' => '38c1f3fb',
     'phuix-icon-view' => 'a5257c4e',
     'policy-css' => 'ceb56a08',
     'policy-edit-css' => '8794e2ed',
     'policy-transaction-detail-css' => 'c02b8384',
     'ponder-view-css' => '05a09d0a',
     'project-card-view-css' => '3b1f7b20',
     'project-view-css' => '567858b3',
     'releeph-core' => 'f81ff2db',
     'releeph-preview-branch' => '22db5c07',
     'releeph-request-differential-create-dialog' => '0ac1ea31',
     'releeph-request-typeahead-css' => 'bce37359',
     'setup-issue-css' => '5eed85b2',
     'sprite-login-css' => '18b368a6',
     'sprite-tokens-css' => 'f1896dc5',
     'syntax-default-css' => '055fc231',
     'syntax-highlighting-css' => '8a16f91b',
     'tokens-css' => 'ce5a50bd',
     'typeahead-browse-css' => 'b7ed02d2',
     'unhandled-exception-css' => '9ecfc00d',
   ),
   'requires' => array(
     '01384686' => array(
       'javelin-behavior',
       'javelin-uri',
       'phabricator-notification',
     ),
     '022516b4' => array(
       'javelin-install',
       'javelin-util',
       'javelin-websocket',
       'javelin-leader',
       'javelin-json',
     ),
     '02cb4398' => array(
       'javelin-behavior',
       'javelin-dom',
       'phortune-credit-card-form',
     ),
     '030b4f7a' => array(
       'javelin-stratcom',
       'javelin-install',
       'javelin-uri',
       'javelin-util',
     ),
     '04f8a1e3' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
       'javelin-workflow',
     ),
     '05c74d65' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-util',
       'javelin-vector',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-workboard-controller',
     ),
     '05d290ef' => array(
       'javelin-install',
       'javelin-util',
     ),
     '070679fe' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
       'javelin-uri',
       'phabricator-notification',
     ),
     '074f0783' => array(
       'javelin-install',
       'javelin-dom',
       'javelin-vector',
       'javelin-request',
       'javelin-uri',
     ),
     '076bd092' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-util',
       'javelin-stratcom',
       'javelin-workflow',
       'phabricator-draggable-list',
     ),
     '0889b835' => array(
       'javelin-install',
       'javelin-event',
       'javelin-util',
       'javelin-magical-init',
     ),
     '0922e81d' => array(
       'herald-rule-editor',
       'javelin-behavior',
     ),
     '09ecf50c' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-workflow',
     ),
     '0ad8d31f' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-dom',
       'phabricator-draggable-list',
     ),
     '0cf79f45' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
       'javelin-vector',
       'javelin-install',
     ),
     '0d2490ce' => array(
       'javelin-install',
     ),
     '0e6d261f' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
       'javelin-vector',
     ),
     '0eaa33a9' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-util',
       'phuix-dropdown-menu',
       'phuix-action-list-view',
       'phuix-action-view',
       'javelin-workflow',
       'phuix-icon-view',
     ),
     '1325b731' => array(
       'javelin-behavior',
       'javelin-uri',
       'phabricator-keyboard-shortcut',
     ),
     '1c850a26' => array(
       'javelin-install',
       'javelin-util',
     ),
     '1c88f154' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
     ),
     '1cab0e9a' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-uri',
       'javelin-mask',
       'phabricator-drag-and-drop-file-upload',
     ),
     '1cb7d027' => array(
       'javelin-behavior',
       'javelin-typeahead-ondemand-source',
       'javelin-typeahead',
       'javelin-dom',
       'javelin-uri',
       'javelin-util',
       'javelin-stratcom',
       'phabricator-prefab',
       'phuix-icon-view',
     ),
     '1e413dc9' => array(
       'javelin-behavior',
       'javelin-dom',
     ),
     '1ff278aa' => array(
       'phui-button-css',
     ),
     '202a2e85' => array(
       'javelin-install',
       'javelin-reactornode',
       'javelin-util',
       'javelin-reactor',
     ),
     '202bfa3f' => array(
       'javelin-behavior',
       'javelin-request',
     ),
     '225bbb98' => array(
       'javelin-install',
       'javelin-reactor',
       'javelin-util',
     ),
     '22ee68a5' => array(
       'javelin-install',
       'javelin-typeahead-source',
       'javelin-util',
     ),
     23387297 => array(
       'javelin-install',
       'javelin-util',
       'javelin-request',
       'javelin-typeahead-source',
     ),
     23631304 => array(
       'phui-fontkit-css',
     ),
     '242aa08b' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
     ),
     '242dedd0' => array(
       'javelin-stratcom',
       'javelin-behavior',
       'javelin-vector',
       'javelin-dom',
     ),
     '243d6c22' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
     ),
     '2539f834' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
       'javelin-json',
       'phabricator-draggable-list',
     ),
     '27daef73' => array(
       'multirow-row-manager',
       'javelin-install',
       'javelin-util',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-json',
       'phabricator-prefab',
     ),
     '289bf236' => array(
       'javelin-install',
       'javelin-util',
     ),
     '29819b75' => array(
       'phabricator-notification',
       'javelin-stratcom',
       'javelin-behavior',
     ),
     '2a8b62d9' => array(
       'multirow-row-manager',
       'javelin-install',
       'path-typeahead',
       'javelin-dom',
       'javelin-util',
       'phabricator-prefab',
       'phuix-form-control-view',
     ),
     '2bdadf1a' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-util',
       'javelin-request',
       'phabricator-shaped-request',
     ),
     '2cc87f49' => array(
       'javelin-behavior',
       'javelin-workflow',
       'javelin-json',
       'javelin-dom',
       'phabricator-keyboard-shortcut',
     ),
     '2e255291' => array(
       'javelin-install',
       'javelin-util',
       'javelin-stratcom',
     ),
     '2f1db1ed' => array(
       'javelin-util',
     ),
     '2f80333f' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
       'phabricator-phtize',
       'phabricator-textareautils',
       'javelin-workflow',
       'javelin-vector',
       'phuix-autocomplete',
       'javelin-mask',
     ),
     '308f9fe4' => array(
       'javelin-install',
       'javelin-util',
     ),
     '32755edb' => array(
       'javelin-install',
       'javelin-util',
     ),
     34450586 => array(
       'javelin-color',
       'javelin-install',
       'javelin-util',
     ),
     '34c53422' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-workflow',
     ),
     '37b8a04a' => array(
       'javelin-install',
       'javelin-util',
       'javelin-stratcom',
       'javelin-dom',
       'javelin-vector',
     ),
     '3829a3cf' => array(
       'javelin-behavior',
       'javelin-uri',
     ),
     '38a6cedb' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
     ),
     '38c1f3fb' => array(
       'javelin-install',
       'javelin-dom',
     ),
     '3b4899b0' => array(
       'javelin-behavior',
       'phabricator-prefab',
     ),
     '3c6bd549' => array(
       'javelin-install',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-util',
       'javelin-vector',
       'javelin-magical-init',
     ),
     '3dc5ad43' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-vector',
       'javelin-dom',
     ),
     '3eed1f2b' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
       'javelin-workflow',
       'javelin-quicksand',
       'phabricator-phtize',
       'phabricator-drag-and-drop-file-upload',
       'phabricator-draggable-list',
     ),
     '407ee861' => array(
       'javelin-behavior',
       'javelin-uri',
     ),
     '418f6684' => array(
       'javelin-behavior',
       'javelin-dom',
     ),
     '42c7a5a7' => array(
       'javelin-install',
       'javelin-dom',
       'javelin-util',
       'javelin-vector',
       'javelin-stratcom',
       'javelin-workflow',
       'phabricator-drag-and-drop-file-upload',
       'javelin-workboard-board',
     ),
     '4370900d' => array(
       'javelin-install',
       'javelin-util',
       'javelin-request',
       'javelin-dom',
       'javelin-uri',
       'phabricator-file-upload',
     ),
     '43ba89a2' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-util',
       'phabricator-notification',
       'conpherence-thread-manager',
     ),
     '43bc9360' => array(
       'javelin-install',
     ),
     '45d0b2b1' => array(
       'javelin-install',
       'javelin-dom',
       'javelin-util',
       'javelin-stratcom',
       'javelin-workflow',
       'phabricator-draggable-list',
       'javelin-workboard-column',
     ),
     '46116c01' => array(
       'javelin-request',
       'javelin-behavior',
       'javelin-dom',
       'javelin-router',
       'javelin-util',
       'phabricator-busy',
     ),
     '47a0728b' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-request',
     ),
     '4842f137' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-dom',
       'phabricator-draggable-list',
     ),
     '48fe33d0' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-util',
       'javelin-uri',
     ),
     '490e2e2e' => array(
       'phui-oi-list-view-css',
     ),
     '4a7fb02b' => array(
       'javelin-behavior',
       'javelin-dom',
       'phortune-credit-card-form',
     ),
     '4ae58b5a' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-util',
       'javelin-workflow',
       'javelin-stratcom',
       'conpherence-thread-manager',
     ),
     '4b671572' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-util',
       'javelin-request',
     ),
     '4dffaeb2' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-dom',
       'phuix-form-control-view',
       'phuix-icon-view',
       'javelin-behavior-phabricator-gesture',
     ),
     '4e61fa88' => array(
       'javelin-behavior',
       'javelin-aphlict',
       'javelin-stratcom',
       'javelin-request',
       'javelin-uri',
       'javelin-dom',
       'javelin-json',
       'javelin-router',
       'javelin-util',
       'javelin-leader',
       'javelin-sound',
       'phabricator-notification',
     ),
     '506aa3f4' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
     ),
     '5202e831' => array(
       'javelin-install',
       'javelin-dom',
       'javelin-fx',
     ),
     '541f81c3' => array(
       'javelin-install',
     ),
     '55a24e84' => array(
       'javelin-install',
       'javelin-dom',
     ),
     '55d7b788' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
     ),
+    '5793d835' => array(
+      'javelin-install',
+      'javelin-util',
+      'javelin-dom',
+      'javelin-typeahead',
+      'javelin-tokenizer',
+      'javelin-typeahead-preloaded-source',
+      'javelin-typeahead-ondemand-source',
+      'javelin-dom',
+      'javelin-stratcom',
+      'javelin-util',
+    ),
     '5803b9e7' => array(
       'javelin-behavior',
       'javelin-util',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-vector',
       'javelin-typeahead-static-source',
     ),
-    '58cc4ab8' => array(
-      'javelin-install',
-      'javelin-dom',
-      'phuix-icon-view',
-      'phabricator-prefab',
-    ),
     '5902260c' => array(
       'javelin-util',
       'javelin-magical-init',
     ),
     '5a6f6a06' => array(
       'javelin-behavior',
       'javelin-quicksand',
     ),
     '5a79f6c3' => array(
       'javelin-install',
       'javelin-util',
       'javelin-request',
       'javelin-typeahead-source',
     ),
     '5aa1544e' => array(
       'javelin-behavior',
       'javelin-util',
       'javelin-stratcom',
       'javelin-dom',
       'javelin-vector',
       'javelin-magical-init',
       'javelin-request',
       'javelin-history',
       'javelin-workflow',
       'javelin-mask',
       'javelin-behavior-device',
       'phabricator-keyboard-shortcut',
     ),
     '5b54c823' => array(
       'javelin-install',
       'javelin-stratcom',
       'javelin-dom',
       'javelin-util',
     ),
     '5cf0501a' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
       'phuix-dropdown-menu',
     ),
     '600f440c' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
       'phabricator-busy',
     ),
     '60cd9241' => array(
       'javelin-behavior',
     ),
     '65bb0011' => array(
       'javelin-behavior',
       'javelin-dom',
     ),
     '66365ee2' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
     ),
     '6a1583a8' => array(
       'javelin-behavior',
       'javelin-history',
     ),
     '6a162524' => array(
       'javelin-behavior',
       'javelin-dom',
     ),
     '6a18c42e' => array(
       'javelin-install',
     ),
     '6a30fa46' => array(
       'phui-oi-list-view-css',
     ),
     '6a85bc5a' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-json',
       'javelin-workflow',
       'javelin-magical-init',
     ),
     '6c379000' => array(
       'javelin-behavior',
       'javelin-behavior-device',
       'javelin-stratcom',
       'javelin-vector',
       'phui-hovercard',
     ),
     '6cfa0008' => array(
       'javelin-dom',
       'javelin-dynval',
       'javelin-reactor',
       'javelin-reactornode',
       'javelin-install',
       'javelin-util',
     ),
     70245195 => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-dom',
     ),
     '727a5a61' => array(
       'phuix-icon-view',
     ),
     '72960bc1' => array(
       'javelin-install',
       'javelin-reactor',
       'javelin-util',
       'javelin-reactor-node-calmer',
     ),
     '7353f43d' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-vector',
       'javelin-dom',
       'javelin-uri',
     ),
     73660575 => array(
       'phui-inline-comment-view-css',
     ),
     '73ecc1f8' => array(
       'javelin-behavior',
       'javelin-behavior-device',
       'javelin-stratcom',
       'phabricator-tooltip',
     ),
     '740956e1' => array(
       'javelin-util',
       'javelin-uri',
       'javelin-install',
     ),
     74446546 => array(
       'javelin-behavior',
       'javelin-dom',
     ),
     '75184d68' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-uri',
       'javelin-request',
     ),
     '78bc5d94' => array(
       'javelin-behavior',
       'javelin-uri',
       'phabricator-notification',
     ),
     '78f811c9' => array(
       'javelin-install',
     ),
     '7930776a' => array(
       'javelin-install',
       'javelin-dom',
     ),
     '7ad020a5' => array(
       'javelin-behavior',
       'javelin-dom',
       'phabricator-drag-and-drop-file-upload',
       'phabricator-textareautils',
     ),
     '7b139193' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-dom',
     ),
     '7c4d8998' => array(
       'javelin-install',
       'javelin-dom',
     ),
     '80bff3af' => array(
       'javelin-install',
       'javelin-typeahead-source',
     ),
     83754533 => array(
       'javelin-install',
       'javelin-util',
       'javelin-dom',
       'javelin-vector',
     ),
     '8400307c' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-workflow',
       'phabricator-draggable-list',
     ),
     '8573dc1b' => array(
       'javelin-install',
       'javelin-workboard-card',
     ),
     '87428eb2' => array(
       'javelin-behavior',
       'javelin-diffusion-locate-file-source',
       'javelin-dom',
       'javelin-typeahead',
       'javelin-uri',
     ),
     '876506b6' => array(
       'javelin-view',
       'javelin-install',
       'javelin-dom',
     ),
     '89a1ae3a' => array(
       'javelin-dom',
       'javelin-util',
       'javelin-stratcom',
       'javelin-install',
     ),
     '8a16f91b' => array(
       'syntax-default-css',
     ),
     '8ac32fd9' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-dom',
       'phabricator-draggable-list',
     ),
     '8badee71' => array(
       'javelin-install',
       'javelin-util',
       'javelin-dom',
       'javelin-typeahead-normalizer',
     ),
     '8c2ed2bf' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-util',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-behavior-device',
       'javelin-history',
       'javelin-vector',
       'javelin-scrollbar',
       'phabricator-title',
       'phabricator-shaped-request',
       'conpherence-thread-manager',
     ),
     '8e2d9a28' => array(
       'phui-theme-css',
     ),
+    '8f139ef0' => array(
+      'javelin-install',
+      'javelin-dom',
+      'phuix-icon-view',
+      'phabricator-prefab',
+    ),
     '8f959ad0' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-util',
       'javelin-workflow',
       'javelin-stratcom',
     ),
     91863989 => array(
       'javelin-install',
       'javelin-stratcom',
       'javelin-util',
       'javelin-behavior',
       'javelin-json',
       'javelin-dom',
       'javelin-resource',
       'javelin-routable',
     ),
     '91befbcc' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-util',
       'javelin-workflow',
       'javelin-stratcom',
     ),
     '92388bae' => array(
       'javelin-behavior',
       'javelin-scrollbar',
     ),
     '925fe8cd' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
     ),
     '92cdd7b6' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
     ),
     '9347f172' => array(
       'javelin-behavior',
       'multirow-row-manager',
       'javelin-dom',
       'javelin-util',
       'phabricator-prefab',
       'javelin-json',
     ),
     '94243d89' => array(
       'javelin-install',
       'javelin-dom',
       'javelin-typeahead-preloaded-source',
       'javelin-util',
     ),
     '94681e22' => array(
       'javelin-magical-init',
       'javelin-install',
       'javelin-util',
       'javelin-vector',
       'javelin-stratcom',
     ),
     '956f3eeb' => array(
       'javelin-behavior',
       'javelin-util',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-vector',
     ),
     '958e9045' => array(
       'javelin-stratcom',
       'javelin-request',
       'javelin-dom',
       'javelin-vector',
       'javelin-install',
       'javelin-util',
       'javelin-mask',
       'javelin-uri',
       'javelin-routable',
     ),
     '9623adc1' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-dom',
       'javelin-router',
     ),
     '9a513421' => array(
       'javelin-install',
     ),
     '9aae2b66' => array(
       'javelin-install',
       'javelin-util',
     ),
     '9b1cbd76' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
     ),
     '9cec214e' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-dom',
       'javelin-uri',
       'phabricator-textareautils',
     ),
     '9e037c7a' => array(
       'phui-oi-list-view-css',
     ),
     '9f081f05' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-util',
       'phabricator-keyboard-shortcut',
     ),
     'a17b84f1' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-workflow',
     ),
     'a241536a' => array(
       'javelin-install',
     ),
     'a4356cde' => array(
       'javelin-install',
       'javelin-dom',
       'javelin-vector',
       'javelin-util',
     ),
     'a43ae2ae' => array(
       'javelin-install',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-vector',
     ),
     'a4a14a94' => array(
       'javelin-dom',
     ),
     'a4aa75c4' => array(
       'phui-button-css',
       'phui-button-simple-css',
     ),
     'a4af0b4a' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-request',
       'javelin-util',
     ),
     'a5257c4e' => array(
       'javelin-install',
       'javelin-dom',
     ),
     'a9942052' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-view-renderer',
       'javelin-install',
     ),
     'a9b91e3f' => array(
       'javelin-install',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-util',
       'phabricator-notification-css',
     ),
     'aa371860' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-dom',
       'phabricator-draggable-list',
     ),
     'aa3a100c' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-typeahead',
       'javelin-typeahead-ondemand-source',
       'javelin-dom',
     ),
     'aa6d2308' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-util',
       'multirow-row-manager',
       'javelin-json',
       'phuix-form-control-view',
     ),
     'aaa08f3b' => array(
       'javelin-install',
       'javelin-dom',
       'javelin-util',
     ),
     'ab85e184' => array(
       'javelin-install',
       'javelin-dom',
       'phabricator-notification',
     ),
     'abf88db8' => array(
       'javelin-install',
       'javelin-util',
       'javelin-request',
       'javelin-router',
     ),
     'ad486db3' => array(
       'javelin-install',
       'javelin-typeahead',
       'javelin-dom',
       'javelin-request',
       'javelin-typeahead-ondemand-source',
       'javelin-util',
     ),
     'aec8e38c' => array(
       'javelin-dom',
       'javelin-util',
       'javelin-stratcom',
       'javelin-install',
       'javelin-aphlict',
       'javelin-workflow',
       'javelin-router',
       'javelin-behavior-device',
       'javelin-vector',
     ),
     'b105a3a6' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
     ),
     'b26a41e4' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
     ),
     'b347a301' => array(
       'javelin-behavior',
     ),
     'b517bfa0' => array(
       'phui-oi-list-view-css',
     ),
     'b52d0668' => array(
       'aphront-typeahead-control-css',
       'phui-tag-view-css',
     ),
     'b58d1a2a' => array(
       'javelin-behavior',
       'javelin-behavior-device',
       'javelin-stratcom',
       'javelin-vector',
       'javelin-dom',
       'javelin-magical-init',
     ),
     'b5e9bff9' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
     ),
     'b7b73831' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-util',
       'phabricator-shaped-request',
     ),
     'b86f297f' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-dom',
       'phabricator-draggable-list',
     ),
     'b9109f8f' => array(
       'javelin-behavior',
       'javelin-uri',
       'phabricator-notification',
     ),
     'b91204e9' => array(
       'javelin-install',
       'phuix-button-view',
     ),
     'bd546a49' => array(
       'phui-workcard-view-css',
     ),
     'bdce4d78' => array(
       'javelin-install',
       'javelin-util',
       'javelin-dom',
       'javelin-vector',
       'javelin-stratcom',
     ),
-    'bf457520' => array(
-      'javelin-install',
-      'javelin-util',
-      'javelin-dom',
-      'javelin-typeahead',
-      'javelin-tokenizer',
-      'javelin-typeahead-preloaded-source',
-      'javelin-typeahead-ondemand-source',
-      'javelin-dom',
-      'javelin-stratcom',
-      'javelin-util',
-    ),
     'c03f2fb4' => array(
       'javelin-install',
     ),
     'c2c500a7' => array(
       'javelin-install',
       'javelin-dom',
       'phuix-button-view',
     ),
     'c3703a16' => array(
       'javelin-behavior',
       'javelin-aphlict',
       'phabricator-phtize',
       'javelin-dom',
     ),
     'c687e867' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-fx',
       'javelin-util',
     ),
     'c68f183f' => array(
       'javelin-install',
       'javelin-dom',
     ),
     'c715c123' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-util',
       'javelin-workflow',
       'javelin-json',
     ),
     'c7e748bf' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
       'javelin-mask',
       'javelin-util',
       'phuix-icon-view',
       'phabricator-busy',
     ),
     'c8147a20' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-vector',
       'phui-chart-css',
     ),
     'c9749dcd' => array(
       'javelin-install',
       'javelin-util',
       'phabricator-keyboard-shortcut-manager',
     ),
     'cf32921f' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
     ),
     'cffd39b4' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-util',
     ),
     'd12d214f' => array(
       'javelin-install',
       'javelin-dom',
       'javelin-json',
       'javelin-workflow',
       'javelin-util',
     ),
     'd3799cb4' => array(
       'javelin-install',
     ),
     'd8a86cfb' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-util',
       'phabricator-shaped-request',
     ),
     'da15d3dc' => array(
       'phui-oi-list-view-css',
     ),
     'dae2d55b' => array(
       'javelin-behavior',
       'javelin-uri',
       'phabricator-notification',
     ),
     'db0c0214' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-uri',
     ),
     'dfa1d313' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
       'phabricator-tooltip',
       'phabricator-diff-changeset-list',
       'phabricator-diff-changeset',
     ),
     'e150bd50' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
       'phuix-dropdown-menu',
     ),
     'e15c8b1f' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
       'javelin-history',
     ),
     'e18685c0' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
     ),
     'e562708c' => array(
       'javelin-install',
     ),
     'e5bdb730' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-workflow',
       'javelin-dom',
       'phabricator-draggable-list',
     ),
     'e7cf10d6' => array(
       'javelin-dom',
       'javelin-util',
       'javelin-stratcom',
       'javelin-install',
       'javelin-workflow',
       'javelin-router',
       'javelin-behavior-device',
       'javelin-vector',
       'phabricator-diff-inline',
     ),
     'e8240b50' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
     ),
     'e9a2940f' => array(
       'javelin-behavior',
       'javelin-request',
       'javelin-stratcom',
       'javelin-vector',
       'javelin-dom',
       'javelin-uri',
       'javelin-behavior-device',
       'phabricator-title',
       'phabricator-favicon',
     ),
     'e9c80beb' => array(
       'javelin-install',
       'javelin-event',
     ),
     'ec4e31c0' => array(
       'phui-timeline-view-css',
     ),
     'ee77366f' => array(
       'aphront-dialog-view-css',
     ),
     'ee82cedb' => array(
       'javelin-behavior',
       'phabricator-keyboard-shortcut',
       'javelin-stratcom',
     ),
     'f166c949' => array(
       'javelin-behavior',
       'javelin-behavior-device',
       'javelin-stratcom',
       'javelin-dom',
       'javelin-magical-init',
       'javelin-vector',
       'javelin-request',
       'javelin-util',
     ),
     'f340a484' => array(
       'javelin-install',
       'javelin-dom',
       'javelin-vector',
     ),
     'f39d968b' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-util',
       'javelin-dom',
       'javelin-request',
       'phabricator-keyboard-shortcut',
       'phabricator-darklog',
       'phabricator-darkmessage',
     ),
     'f51e9c17' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
     ),
     'f5c78ae3' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
     ),
     'f84bcbf4' => array(
       'javelin-behavior',
       'javelin-stratcom',
       'javelin-dom',
     ),
     'f8c4e135' => array(
       'javelin-install',
       'javelin-dom',
       'javelin-view-visitor',
       'javelin-util',
     ),
     'fa6f30b2' => array(
       'javelin-behavior',
       'javelin-dom',
       'javelin-stratcom',
       'javelin-behavior-device',
       'javelin-scrollbar',
       'javelin-quicksand',
       'phabricator-keyboard-shortcut',
       'conpherence-thread-manager',
     ),
     'fce5d170' => array(
       'javelin-magical-init',
       'javelin-util',
     ),
     'fdc13e4e' => array(
       'javelin-install',
     ),
     'ff688a7a' => array(
       'owners-path-editor',
       'javelin-behavior',
     ),
   ),
   'packages' => array(
     'conpherence.pkg.css' => array(
       'conpherence-durable-column-view',
       'conpherence-menu-css',
       'conpherence-color-css',
       'conpherence-message-pane-css',
       'conpherence-notification-css',
       'conpherence-transaction-css',
       'conpherence-participant-pane-css',
       'conpherence-header-pane-css',
     ),
     'conpherence.pkg.js' => array(
       'javelin-behavior-conpherence-menu',
       'javelin-behavior-conpherence-participant-pane',
       'javelin-behavior-conpherence-pontificate',
       'javelin-behavior-toggle-widget',
     ),
     'core.pkg.css' => array(
       'phabricator-core-css',
       'phabricator-zindex-css',
       'phui-button-css',
       'phui-button-simple-css',
       'phui-theme-css',
       'phabricator-standard-page-view',
       'aphront-dialog-view-css',
       'phui-form-view-css',
       'aphront-panel-view-css',
       'aphront-table-view-css',
       'aphront-tokenizer-control-css',
       'aphront-typeahead-control-css',
       'aphront-list-filter-view-css',
       'application-search-view-css',
       'phabricator-remarkup-css',
       'syntax-highlighting-css',
       'syntax-default-css',
       'phui-pager-css',
       'aphront-tooltip-css',
       'phabricator-flag-css',
       'phui-info-view-css',
       'phabricator-main-menu-view',
       'phabricator-notification-css',
       'phabricator-notification-menu-css',
       'phui-lightbox-css',
       'phui-comment-panel-css',
       'phui-header-view-css',
       'phabricator-nav-view-css',
       'phui-basic-nav-view-css',
       'phui-crumbs-view-css',
       'phui-oi-list-view-css',
       'phui-oi-color-css',
       'phui-oi-big-ui-css',
       'phui-oi-drag-ui-css',
       'phui-oi-simple-ui-css',
       'phui-oi-flush-ui-css',
       'global-drag-and-drop-css',
       'phui-spacing-css',
       'phui-form-css',
       'phui-icon-view-css',
       'phabricator-action-list-view-css',
       'phui-property-list-view-css',
       'phui-tag-view-css',
       'phui-list-view-css',
       'font-fontawesome',
       'font-lato',
       'phui-font-icon-base-css',
       'phui-fontkit-css',
       'phui-box-css',
       'phui-object-box-css',
       'phui-timeline-view-css',
       'phui-two-column-view-css',
       'phui-curtain-view-css',
       'sprite-login-css',
       'sprite-tokens-css',
       'tokens-css',
       'auth-css',
       'phui-status-list-view-css',
       'phui-feed-story-css',
       'phabricator-feed-css',
       'phabricator-dashboard-css',
       'aphront-multi-column-view-css',
     ),
     'core.pkg.js' => array(
       'javelin-util',
       'javelin-install',
       'javelin-event',
       'javelin-stratcom',
       'javelin-behavior',
       'javelin-resource',
       'javelin-request',
       'javelin-vector',
       'javelin-dom',
       'javelin-json',
       'javelin-uri',
       'javelin-workflow',
       'javelin-mask',
       'javelin-typeahead',
       'javelin-typeahead-normalizer',
       'javelin-typeahead-source',
       'javelin-typeahead-preloaded-source',
       'javelin-typeahead-ondemand-source',
       'javelin-tokenizer',
       'javelin-history',
       'javelin-router',
       'javelin-routable',
       'javelin-behavior-aphront-basic-tokenizer',
       'javelin-behavior-workflow',
       'javelin-behavior-aphront-form-disable-on-submit',
       'phabricator-keyboard-shortcut-manager',
       'phabricator-keyboard-shortcut',
       'javelin-behavior-phabricator-keyboard-shortcuts',
       'javelin-behavior-refresh-csrf',
       'javelin-behavior-phabricator-watch-anchor',
       'javelin-behavior-phabricator-autofocus',
       'phuix-dropdown-menu',
       'phuix-action-list-view',
       'phuix-action-view',
       'phuix-icon-view',
       'phabricator-phtize',
       'javelin-behavior-phabricator-oncopy',
       'phabricator-tooltip',
       'javelin-behavior-phabricator-tooltips',
       'phabricator-prefab',
       'javelin-behavior-device',
       'javelin-behavior-toggle-class',
       'javelin-behavior-lightbox-attachments',
       'phabricator-busy',
       'javelin-sound',
       'javelin-aphlict',
       'phabricator-notification',
       'javelin-behavior-aphlict-listen',
       'javelin-behavior-phabricator-search-typeahead',
       'javelin-behavior-aphlict-dropdown',
       'javelin-behavior-history-install',
       'javelin-behavior-phabricator-gesture',
       'javelin-behavior-phabricator-active-nav',
       'javelin-behavior-phabricator-nav',
       'javelin-behavior-phabricator-remarkup-assist',
       'phabricator-textareautils',
       'phabricator-file-upload',
       'javelin-behavior-global-drag-and-drop',
       'javelin-behavior-phabricator-reveal-content',
       'phui-hovercard',
       'javelin-behavior-phui-hovercards',
       'javelin-color',
       'javelin-fx',
       'phabricator-draggable-list',
       'javelin-behavior-phabricator-transaction-list',
       'javelin-behavior-phabricator-show-older-transactions',
       'javelin-behavior-phui-dropdown-menu',
       'javelin-behavior-doorkeeper-tag',
       'phabricator-title',
       'javelin-leader',
       'javelin-websocket',
       'javelin-behavior-dashboard-async-panel',
       'javelin-behavior-dashboard-tab-panel',
       'javelin-quicksand',
       'javelin-behavior-quicksand-blacklist',
       'javelin-behavior-high-security-warning',
       'javelin-behavior-read-only-warning',
       'javelin-scrollbar',
       'javelin-behavior-scrollbar',
       'javelin-behavior-durable-column',
       'conpherence-thread-manager',
       'javelin-behavior-detect-timezone',
       'javelin-behavior-setup-check-https',
       'javelin-behavior-aphlict-status',
       'javelin-behavior-user-menu',
       'phabricator-favicon',
     ),
     'differential.pkg.css' => array(
       'differential-core-view-css',
       'differential-changeset-view-css',
       'differential-revision-history-css',
       'differential-revision-list-css',
       'differential-table-of-contents-css',
       'differential-revision-comment-css',
       'differential-revision-add-comment-css',
       'phabricator-object-selector-css',
       'phabricator-content-source-view-css',
       'inline-comment-summary-css',
       'phui-inline-comment-view-css',
       'phabricator-filetree-view-css',
     ),
     'differential.pkg.js' => array(
       'phabricator-drag-and-drop-file-upload',
       'phabricator-shaped-request',
       'javelin-behavior-differential-populate',
       'javelin-behavior-differential-diff-radios',
       'javelin-behavior-aphront-drag-and-drop-textarea',
       'javelin-behavior-phabricator-object-selector',
       'javelin-behavior-repository-crossreference',
       'javelin-behavior-differential-user-select',
       'javelin-behavior-aphront-more',
       'phabricator-diff-inline',
       'phabricator-diff-changeset',
       'phabricator-diff-changeset-list',
     ),
     'diffusion.pkg.css' => array(
       'diffusion-icons-css',
     ),
     'diffusion.pkg.js' => array(
       'javelin-behavior-diffusion-pull-lastmodified',
       'javelin-behavior-diffusion-commit-graph',
       'javelin-behavior-audit-preview',
     ),
     'maniphest.pkg.css' => array(
       'maniphest-task-summary-css',
     ),
     'maniphest.pkg.js' => array(
       'javelin-behavior-maniphest-batch-selector',
       'javelin-behavior-maniphest-subpriority-editor',
       'javelin-behavior-maniphest-list-editor',
     ),
   ),
 );
diff --git a/src/applications/people/typeahead/PhabricatorPeopleDatasource.php b/src/applications/people/typeahead/PhabricatorPeopleDatasource.php
index df146808bb..d4a5ad96c7 100644
--- a/src/applications/people/typeahead/PhabricatorPeopleDatasource.php
+++ b/src/applications/people/typeahead/PhabricatorPeopleDatasource.php
@@ -1,105 +1,114 @@
 <?php
 
 final class PhabricatorPeopleDatasource
   extends PhabricatorTypeaheadDatasource {
 
   public function getBrowseTitle() {
     return pht('Browse Users');
   }
 
   public function getPlaceholderText() {
     return pht('Type a username...');
   }
 
   public function getDatasourceApplicationClass() {
     return 'PhabricatorPeopleApplication';
   }
 
   public function loadResults() {
     $viewer = $this->getViewer();
 
     $query = id(new PhabricatorPeopleQuery())
-      ->setOrderVector(array('username'));
+      ->setOrderVector(array('username'))
+      ->needAvailability(true);
 
     if ($this->getPhase() == self::PHASE_PREFIX) {
       $prefix = $this->getPrefixQuery();
       $query->withNamePrefixes(array($prefix));
     } else {
       $tokens = $this->getTokens();
       if ($tokens) {
         $query->withNameTokens($tokens);
       }
     }
 
     $users = $this->executeQuery($query);
 
     $is_browse = $this->getIsBrowse();
 
     if ($is_browse && $users) {
       $phids = mpull($users, 'getPHID');
       $handles = id(new PhabricatorHandleQuery())
         ->setViewer($viewer)
         ->withPHIDs($phids)
         ->execute();
     }
 
     $results = array();
     foreach ($users as $user) {
       $phid = $user->getPHID();
 
       $closed = null;
       if ($user->getIsDisabled()) {
         $closed = pht('Disabled');
       } else if ($user->getIsSystemAgent()) {
         $closed = pht('Bot');
       } else if ($user->getIsMailingList()) {
         $closed = pht('Mailing List');
       }
 
       $username = $user->getUsername();
 
       $result = id(new PhabricatorTypeaheadResult())
         ->setName($user->getFullName())
         ->setURI('/p/'.$username.'/')
         ->setPHID($phid)
         ->setPriorityString($username)
         ->setPriorityType('user')
         ->setAutocomplete('@'.$username)
         ->setClosed($closed);
 
       if ($user->getIsMailingList()) {
         $result->setIcon('fa-envelope-o');
       }
 
       if ($is_browse) {
         $handle = $handles[$phid];
 
         $result
           ->setIcon($handle->getIcon())
           ->setImageURI($handle->getImageURI())
           ->addAttribute($handle->getSubtitle());
 
         if ($user->getIsAdmin()) {
           $result->addAttribute(
             array(
               id(new PHUIIconView())->setIcon('fa-star'),
               ' ',
               pht('Administrator'),
             ));
         }
 
         if ($user->getIsAdmin()) {
           $display_type = pht('Administrator');
         } else {
           $display_type = pht('User');
         }
         $result->setDisplayType($display_type);
       }
 
+      $until = $user->getAwayUntil();
+      if ($until) {
+        $availability = $user->getDisplayAvailability();
+        $color = PhabricatorCalendarEventInvitee::getAvailabilityColor(
+          $availability);
+        $result->setAvailabilityColor($color);
+      }
+
       $results[] = $result;
     }
 
     return $results;
   }
 
 }
diff --git a/src/applications/typeahead/storage/PhabricatorTypeaheadResult.php b/src/applications/typeahead/storage/PhabricatorTypeaheadResult.php
index 14cbe726dc..b13cf351b1 100644
--- a/src/applications/typeahead/storage/PhabricatorTypeaheadResult.php
+++ b/src/applications/typeahead/storage/PhabricatorTypeaheadResult.php
@@ -1,225 +1,236 @@
 <?php
 
 final class PhabricatorTypeaheadResult extends Phobject {
 
   private $name;
   private $uri;
   private $phid;
   private $priorityString;
   private $displayName;
   private $displayType;
   private $imageURI;
   private $priorityType;
   private $imageSprite;
   private $icon;
   private $color;
   private $closed;
   private $tokenType;
   private $unique;
   private $autocomplete;
   private $attributes = array();
   private $phase;
+  private $availabilityColor;
 
   public function setIcon($icon) {
     $this->icon = $icon;
     return $this;
   }
 
   public function setName($name) {
     $this->name = $name;
     return $this;
   }
 
   public function setURI($uri) {
     $this->uri = $uri;
     return $this;
   }
 
   public function setPHID($phid) {
     $this->phid = $phid;
     return $this;
   }
 
   public function setPriorityString($priority_string) {
     $this->priorityString = $priority_string;
     return $this;
   }
 
   public function setDisplayName($display_name) {
     $this->displayName = $display_name;
     return $this;
   }
 
   public function setDisplayType($display_type) {
     $this->displayType = $display_type;
     return $this;
   }
 
   public function setImageURI($image_uri) {
     $this->imageURI = $image_uri;
     return $this;
   }
 
   public function setPriorityType($priority_type) {
     $this->priorityType = $priority_type;
     return $this;
   }
 
   public function setImageSprite($image_sprite) {
     $this->imageSprite = $image_sprite;
     return $this;
   }
 
   public function setClosed($closed) {
     $this->closed = $closed;
     return $this;
   }
 
   public function getName() {
     return $this->name;
   }
 
   public function getDisplayName() {
     return coalesce($this->displayName, $this->getName());
   }
 
   public function getIcon() {
     return nonempty($this->icon, $this->getDefaultIcon());
   }
 
   public function getPHID() {
     return $this->phid;
   }
 
   public function setUnique($unique) {
     $this->unique = $unique;
     return $this;
   }
 
   public function setTokenType($type) {
     $this->tokenType = $type;
     return $this;
   }
 
   public function getTokenType() {
     if ($this->closed && !$this->tokenType) {
       return PhabricatorTypeaheadTokenView::TYPE_DISABLED;
     }
     return $this->tokenType;
   }
 
   public function setColor($color) {
     $this->color = $color;
     return $this;
   }
 
   public function getColor() {
     return $this->color;
   }
 
   public function setAutocomplete($autocomplete) {
     $this->autocomplete = $autocomplete;
     return $this;
   }
 
   public function getAutocomplete() {
     return $this->autocomplete;
   }
 
   public function getSortKey() {
     // Put unique results (special parameter functions) ahead of other
     // results.
     if ($this->unique) {
       $prefix = 'A';
     } else {
       $prefix = 'B';
     }
 
     return $prefix.phutil_utf8_strtolower($this->getName());
   }
 
   public function getWireFormat() {
     $data = array(
       $this->name,
       $this->uri ? (string)$this->uri : null,
       $this->phid,
       $this->priorityString,
       $this->displayName,
       $this->displayType,
       $this->imageURI ? (string)$this->imageURI : null,
       $this->priorityType,
       $this->getIcon(),
       $this->closed,
       $this->imageSprite ? (string)$this->imageSprite : null,
       $this->color,
       $this->tokenType,
       $this->unique ? 1 : null,
       $this->autocomplete,
       $this->phase,
+      $this->availabilityColor,
     );
     while (end($data) === null) {
       array_pop($data);
     }
     return $data;
   }
 
   /**
    * If the datasource did not specify an icon explicitly, try to select a
    * default based on PHID type.
    */
   private function getDefaultIcon() {
     static $icon_map;
     if ($icon_map === null) {
       $types = PhabricatorPHIDType::getAllTypes();
 
       $map = array();
       foreach ($types as $type) {
         $icon = $type->getTypeIcon();
         if ($icon !== null) {
           $map[$type->getTypeConstant()] = $icon;
         }
       }
 
       $icon_map = $map;
     }
 
     $phid_type = phid_get_type($this->phid);
     if (isset($icon_map[$phid_type])) {
       return $icon_map[$phid_type];
     }
 
     return null;
   }
 
   public function getImageURI() {
     return $this->imageURI;
   }
 
   public function getClosed() {
     return $this->closed;
   }
 
   public function resetAttributes() {
     $this->attributes = array();
     return $this;
   }
 
   public function getAttributes() {
     return $this->attributes;
   }
 
   public function addAttribute($attribute) {
     $this->attributes[] = $attribute;
     return $this;
   }
 
   public function setPhase($phase) {
     $this->phase = $phase;
     return $this;
   }
 
   public function getPhase() {
     return $this->phase;
   }
 
+  public function setAvailabilityColor($availability_color) {
+    $this->availabilityColor = $availability_color;
+    return $this;
+  }
+
+  public function getAvailabilityColor() {
+    return $this->availabilityColor;
+  }
+
 }
diff --git a/src/applications/typeahead/view/PhabricatorTypeaheadTokenView.php b/src/applications/typeahead/view/PhabricatorTypeaheadTokenView.php
index 56867d8278..e0a5270e84 100644
--- a/src/applications/typeahead/view/PhabricatorTypeaheadTokenView.php
+++ b/src/applications/typeahead/view/PhabricatorTypeaheadTokenView.php
@@ -1,167 +1,204 @@
 <?php
 
 final class PhabricatorTypeaheadTokenView
   extends AphrontTagView {
 
   const TYPE_OBJECT = 'object';
   const TYPE_DISABLED = 'disabled';
   const TYPE_FUNCTION = 'function';
   const TYPE_INVALID = 'invalid';
 
   private $key;
   private $icon;
   private $color;
   private $inputName;
   private $value;
   private $tokenType = self::TYPE_OBJECT;
+  private $availabilityColor;
 
   public static function newFromTypeaheadResult(
     PhabricatorTypeaheadResult $result) {
 
     return id(new PhabricatorTypeaheadTokenView())
       ->setKey($result->getPHID())
       ->setIcon($result->getIcon())
       ->setColor($result->getColor())
       ->setValue($result->getDisplayName())
       ->setTokenType($result->getTokenType());
   }
 
   public static function newFromHandle(
     PhabricatorObjectHandle $handle) {
 
     $token = id(new PhabricatorTypeaheadTokenView())
       ->setKey($handle->getPHID())
       ->setValue($handle->getFullName())
       ->setIcon($handle->getTokenIcon());
 
     if ($handle->isDisabled() ||
         $handle->getStatus() == PhabricatorObjectHandle::STATUS_CLOSED) {
       $token->setTokenType(self::TYPE_DISABLED);
     } else {
       $token->setColor($handle->getTagColor());
     }
 
+    $availability = $handle->getAvailability();
+    $color = null;
+    switch ($availability) {
+      case PhabricatorObjectHandle::AVAILABILITY_PARTIAL:
+        $color = PHUITagView::COLOR_ORANGE;
+        break;
+      case PhabricatorObjectHandle::AVAILABILITY_NONE:
+        $color = PHUITagView::COLOR_RED;
+        break;
+    }
+
+    if ($color !== null) {
+      $token->setAvailabilityColor($color);
+    }
+
     return $token;
   }
 
   public function isInvalid() {
     return ($this->getTokenType() == self::TYPE_INVALID);
   }
 
   public function setKey($key) {
     $this->key = $key;
     return $this;
   }
 
   public function getKey() {
     return $this->key;
   }
 
   public function setTokenType($token_type) {
     $this->tokenType = $token_type;
     return $this;
   }
 
   public function getTokenType() {
     return $this->tokenType;
   }
 
   public function setInputName($input_name) {
     $this->inputName = $input_name;
     return $this;
   }
 
   public function getInputName() {
     return $this->inputName;
   }
 
   public function setIcon($icon) {
     $this->icon = $icon;
     return $this;
   }
 
   public function getIcon() {
     return $this->icon;
   }
 
   public function setColor($color) {
     $this->color = $color;
     return $this;
   }
 
   public function getColor() {
     return $this->color;
   }
 
   public function setValue($value) {
     $this->value = $value;
     return $this;
   }
 
   public function getValue() {
     return $this->value;
   }
 
   protected function getTagName() {
     return 'a';
   }
 
+  public function setAvailabilityColor($availability_color) {
+    $this->availabilityColor = $availability_color;
+    return $this;
+  }
+
+  public function getAvailabilityColor() {
+    return $this->availabilityColor;
+  }
+
   protected function getTagAttributes() {
     $classes = array();
     $classes[] = 'jx-tokenizer-token';
     switch ($this->getTokenType()) {
       case self::TYPE_FUNCTION:
         $classes[] = 'jx-tokenizer-token-function';
         break;
       case self::TYPE_INVALID:
         $classes[] = 'jx-tokenizer-token-invalid';
         break;
       case self::TYPE_DISABLED:
         $classes[] = 'jx-tokenizer-token-disabled';
         break;
       case self::TYPE_OBJECT:
       default:
         break;
     }
 
     $classes[] = $this->getColor();
 
     return array(
       'class' => $classes,
     );
   }
 
   protected function getTagContent() {
     $input_name = $this->getInputName();
     if ($input_name) {
       $input_name .= '[]';
     }
 
     $value = $this->getValue();
 
+    $availability = null;
+    $availability_color = $this->getAvailabilityColor();
+    if ($availability_color) {
+      $availability = phutil_tag(
+        'span',
+        array(
+          'class' => 'phui-tag-dot phui-tag-color-'.$availability_color,
+        ));
+    }
+
+    $icon_view = null;
     $icon = $this->getIcon();
     if ($icon) {
-      $value = array(
-        phutil_tag(
-          'span',
-          array(
-            'class' => 'phui-icon-view phui-font-fa '.$icon,
-          )),
-        $value,
-      );
+      $icon_view = phutil_tag(
+        'span',
+        array(
+          'class' => 'phui-icon-view phui-font-fa '.$icon,
+        ));
     }
 
     return array(
-      $value,
+      array(
+        $icon_view,
+        $availability,
+        $value,
+      ),
       phutil_tag(
         'input',
         array(
           'type'  => 'hidden',
           'name'  => $input_name,
           'value' => $this->getKey(),
         )),
       phutil_tag('span', array('class' => 'jx-tokenizer-x-placeholder'), ''),
     );
   }
 
 }
diff --git a/src/view/form/control/AphrontFormTokenizerControl.php b/src/view/form/control/AphrontFormTokenizerControl.php
index 3d65c4e525..fe80c86f81 100644
--- a/src/view/form/control/AphrontFormTokenizerControl.php
+++ b/src/view/form/control/AphrontFormTokenizerControl.php
@@ -1,150 +1,154 @@
 <?php
 
 final class AphrontFormTokenizerControl extends AphrontFormControl {
 
   private $datasource;
   private $disableBehavior;
   private $limit;
   private $placeholder;
   private $handles;
   private $initialValue;
 
   public function setDatasource(PhabricatorTypeaheadDatasource $datasource) {
     $this->datasource = $datasource;
     return $this;
   }
 
   public function setDisableBehavior($disable) {
     $this->disableBehavior = $disable;
     return $this;
   }
 
   protected function getCustomControlClass() {
     return 'aphront-form-control-tokenizer';
   }
 
   public function setLimit($limit) {
     $this->limit = $limit;
     return $this;
   }
 
   public function setPlaceholder($placeholder) {
     $this->placeholder = $placeholder;
     return $this;
   }
 
   public function setInitialValue(array $initial_value) {
     $this->initialValue = $initial_value;
     return $this;
   }
 
   public function getInitialValue() {
     return $this->initialValue;
   }
 
   public function willRender() {
     // Load the handles now so we'll get a bulk load later on when we actually
     // render them.
     $this->loadHandles();
   }
 
   protected function renderInput() {
     $name = $this->getName();
 
     $handles = $this->loadHandles();
     $handles = iterator_to_array($handles);
 
     if ($this->getID()) {
       $id = $this->getID();
     } else {
       $id = celerity_generate_unique_node_id();
     }
 
     $datasource = $this->datasource;
     if (!$datasource) {
       throw new Exception(
         pht('You must set a datasource to use a TokenizerControl.'));
     }
     $datasource->setViewer($this->getUser());
 
     $placeholder = null;
     if (!strlen($this->placeholder)) {
       $placeholder = $datasource->getPlaceholderText();
     }
 
     $values = nonempty($this->getValue(), array());
     $tokens = $datasource->renderTokens($values);
 
     foreach ($tokens as $token) {
       $token->setInputName($this->getName());
     }
 
     $template = id(new AphrontTokenizerTemplateView())
       ->setName($name)
       ->setID($id)
       ->setValue($tokens);
 
     $initial_value = $this->getInitialValue();
     if ($initial_value !== null) {
       $template->setInitialValue($initial_value);
     }
 
     $username = null;
     if ($this->hasViewer()) {
       $username = $this->getViewer()->getUsername();
     }
 
     $datasource_uri = $datasource->getDatasourceURI();
     $browse_uri = $datasource->getBrowseURI();
     if ($browse_uri) {
       $template->setBrowseURI($browse_uri);
     }
 
     if (!$this->disableBehavior) {
       Javelin::initBehavior('aphront-basic-tokenizer', array(
         'id' => $id,
         'src' => $datasource_uri,
         'value' => mpull($tokens, 'getValue', 'getKey'),
         'icons' => mpull($tokens, 'getIcon', 'getKey'),
         'types' => mpull($tokens, 'getTokenType', 'getKey'),
         'colors' => mpull($tokens, 'getColor', 'getKey'),
+        'availabilityColors' => mpull(
+          $tokens,
+          'getAvailabilityColor',
+          'getKey'),
         'limit' => $this->limit,
         'username' => $username,
         'placeholder' => $placeholder,
         'browseURI' => $browse_uri,
         'disabled' => $this->getDisabled(),
       ));
     }
 
     return $template->render();
   }
 
   private function loadHandles() {
     if ($this->handles === null) {
       $viewer = $this->getUser();
       if (!$viewer) {
         throw new Exception(
           pht(
             'Call %s before rendering tokenizers. '.
             'Use %s on %s to do this easily.',
             'setUser()',
             'appendControl()',
             'AphrontFormView'));
       }
 
       $values = nonempty($this->getValue(), array());
 
       $phids = array();
       foreach ($values as $value) {
         if (!PhabricatorTypeaheadDatasource::isFunctionToken($value)) {
           $phids[] = $value;
         }
       }
 
       $this->handles = $viewer->loadHandles($phids);
     }
 
     return $this->handles;
   }
 
 }
diff --git a/webroot/rsrc/css/phui/phui-tag-view.css b/webroot/rsrc/css/phui/phui-tag-view.css
index 73675a44d6..57529645a7 100644
--- a/webroot/rsrc/css/phui/phui-tag-view.css
+++ b/webroot/rsrc/css/phui/phui-tag-view.css
@@ -1,519 +1,527 @@
 /**
  * @provides phui-tag-view-css
  */
 
 .phui-tag-view {
   font-weight: bold;
   text-decoration: none;
   position: relative;
   -webkit-font-smoothing: antialiased;
   white-space: nowrap;
 }
 
 a.phui-tag-view:hover {
   text-decoration: none;
 }
 
 .phui-tag-core-closed {
   text-decoration: line-through;
   color: rgba({$alphablack},0.5);
 }
 
 .phui-tag-core-closed:hover {
   text-decoration: none;
 }
 
 .phui-tag-core {
   color: inherit;
   border: 1px solid transparent;
   border-radius: 3px;
   padding: 0 4px;
 }
 
 .phui-tag-type-state .phui-tag-core {
   padding: 1px 6px;
 }
 
 .phui-tag-view.phui-tag-type-state .phui-icon-view {
   margin: 0 6px 0 0;
 }
 
 .phui-tag-view .phui-icon-view {
   display: inline-block;
   margin: 0 4px 0 2px;
 }
 
 .phui-tag-dot {
   position: relative;
   display: inline-block;
   width: 5px;
   height: 5px;
   margin-right: 4px;
   top: -1px;
   border-radius: 5px;
   border: 1px solid transparent;
 }
 
+.tokenizer-result .phui-tag-dot {
+  margin-right: 6px;
+}
+
+.jx-tokenizer-token .phui-tag-dot {
+  margin-left: 2px;
+}
+
 .phui-tag-type-state {
   color: #ffffff;
   text-shadow: rgba(100, 100, 100, 0.40) 0px -1px 1px;
 }
 
 .phui-tag-type-object,
 a.phui-tag-type-object,
 a.phui-tag-type-object:link,
 .phui-tag-core-closed .phui-tag-color-object {
   color: {$blacktext};
 }
 
 .phui-tag-type-person {
   white-space: nowrap;
   color: {$anchor};
 }
 
 .phui-tag-color-red {
   background-color: {$red};
   border-color: {$red};
 }
 
 .phui-tag-color-orange {
   background-color: {$orange};
   border-color: {$orange};
 }
 
 .phui-tag-color-yellow {
   background-color: {$yellow};
   border-color: {$yellow};
 }
 
 .phui-tag-color-blue {
   background-color: {$blue};
   border-color: {$blue};
 }
 
 .phui-tag-color-indigo {
   background-color: {$indigo};
   border-color: {$indigo};
 }
 
 .phui-tag-color-green {
   background-color: {$green};
   border-color: {$green};
 }
 
 .phui-tag-color-violet {
   background-color: {$violet};
   border-color: {$violet};
 }
 
 .phui-tag-color-black {
   background-color: {$darkgreybackground};
   border-color: {$darkgreybackground};
 }
 
 .phui-tag-color-grey {
   background-color: {$lightgreytext};
   border-color: {$lightgreytext};
 }
 
 .phui-tag-color-white {
   background-color: {$lightgreybackground};
   border-color: {$lightgreybackground};
 }
 
 .phui-tag-color-object {
   background-color: {$greybackground};
   border-color: {$lightgreyborder};
 }
 
 .phui-tag-color-person {
   background-color: {$bluebackground};
   border-color: {$thinblueborder};
 }
 
 a.phui-tag-view:hover
   .phui-tag-core.phui-tag-color-person {
   border-color: {$lightblueborder};
 }
 
 a.phui-tag-view:hover
   .phui-tag-core.phui-tag-color-object {
   border-color: {$greyborder};
 }
 
 .phabricator-handle-tag-list-item + .phabricator-handle-tag-list-item {
   margin-top: 4px;
 }
 
 .phui-oi .phabricator-handle-tag-list {
   display: inline;
 }
 
 .phui-oi .phabricator-handle-tag-list-item {
   display: inline-block;
   margin: 0 4px 2px 0;
 }
 
 .phui-tag-view.phui-tag-border-none .phui-tag-core {
   border-color: transparent;
 }
 
 a.phui-tag-view:hover.phui-tag-border-none .phui-tag-core {
   border-color: transparent !important;
   text-decoration: underline;
 }
 
 
 /* - Shaded Tags ---------------------------------------------------------------
 
   For object representation inside text areas and lists.
 
 */
 
 .phui-tag-view.phui-tag-type-shade {
   font-weight: normal;
 }
 
 .phui-tag-view.phui-tag-type-shade .phui-icon-view {
   font-size: 12px;
 }
 
 
 /* - Slim Tags -----------------------------------------------------------------
 
   A thinner tag for object list, workboards.
 
 */
 
 .phui-tag-slim .phui-icon-view {
   font-size: 11px;
 }
 
 .phui-tag-slim .phui-tag-core {
   font-size: {$smallerfontsize};
 }
 
 
 /* - Red -------------------------------------------------------------------- */
 
 .phui-tag-red .phui-tag-core,
 .jx-tokenizer-token.red {
   background: {$sh-redbackground};
   border-color: {$sh-lightredborder};
   color: {$sh-redtext};
 }
 
 .phui-tag-red .phui-icon-view,
 .jx-tokenizer-token.red .phui-icon-view,
 .jx-tokenizer-token.red .jx-tokenizer-x {
   color: {$sh-redicon};
 }
 
 a.phui-tag-view:hover.phui-tag-red .phui-tag-core,
 .jx-tokenizer-token.red:hover {
   border-color: {$sh-redborder};
 }
 
 /* - Orange ----------------------------------------------------------------- */
 
 .phui-tag-orange .phui-tag-core,
 .jx-tokenizer-token.orange {
   background: {$sh-orangebackground};
   border-color: {$sh-lightorangeborder};
   color: {$sh-orangetext};
 }
 
 .phui-tag-orange .phui-icon-view,
 .jx-tokenizer-token.orange .phui-icon-view,
 .jx-tokenizer-token.orange .jx-tokenizer-x {
   color: {$sh-orangeicon};
 }
 
 a.phui-tag-view:hover.phui-tag-orange .phui-tag-core,
 .jx-tokenizer-token.orange:hover {
   border-color: {$sh-orangeborder};
 }
 
 /* - Yellow ----------------------------------------------------------------- */
 
 .phui-tag-yellow .phui-tag-core,
 .jx-tokenizer-token.yellow {
   background: {$sh-yellowbackground};
   border-color: {$sh-lightyellowborder};
   color: {$sh-yellowtext};
 }
 
 .phui-tag-yellow .phui-icon-view,
 .jx-tokenizer-token.yellow .phui-icon-view,
 .jx-tokenizer-token.yellow .jx-tokenizer-x {
   color: {$sh-yellowicon};
 }
 
 a.phui-tag-view:hover.phui-tag-yellow .phui-tag-core,
 .jx-tokenizer-token.yellow:hover {
   border-color: {$sh-yellowborder};
 }
 
 /* - Blue ------------------------------------------------------------------- */
 
 .phui-tag-blue .phui-tag-core,
 .jx-tokenizer-token.blue {
   background: {$sh-bluebackground};
   border-color: {$sh-lightblueborder};
   color: {$sh-bluetext};
 }
 
 .phui-tag-blue .phui-icon-view,
 .jx-tokenizer-token.blue .phui-icon-view,
 .jx-tokenizer-token.blue .jx-tokenizer-x {
   color: {$sh-blueicon};
 }
 
 a.phui-tag-view:hover.phui-tag-blue .phui-tag-core,
 .jx-tokenizer-token.blue:hover {
   border-color: {$sh-blueborder};
 }
 
 /* - Sky ------------------------------------------------------------------- */
 
 .phui-tag-sky .phui-tag-core,
 .jx-tokenizer-token.sky {
   background: #E0F0FA;
   border-color: {$sh-lightblueborder};
   color: {$sh-bluetext};
 }
 
 .phui-tag-sky .phui-icon-view,
 .jx-tokenizer-token.sky .phui-icon-view,
 .jx-tokenizer-token.sky .jx-tokenizer-x {
   color: {$sh-blueicon};
 }
 
 a.phui-tag-view:hover.phui-tag-sky .phui-tag-core,
 .jx-tokenizer-token.sky:hover {
   border-color: {$sh-blueborder};
 }
 
 /* - Indigo ----------------------------------------------------------------- */
 
 .phui-tag-indigo .phui-tag-core,
 .jx-tokenizer-token.indigo {
   background: {$sh-indigobackground};
   border-color: {$sh-lightindigoborder};
   color: {$sh-indigotext};
 }
 
 .phui-tag-indigo .phui-icon-view,
 .jx-tokenizer-token.indigo .phui-icon-view,
 .jx-tokenizer-token.indigo .jx-tokenizer-x {
   color: {$sh-indigoicon};
 }
 
 a.phui-tag-view:hover.phui-tag-indigo .phui-tag-core,
 .jx-tokenizer-token.indigo:hover {
   border-color: {$sh-indigoborder};
 }
 
 /* - Green ------------------------------------------------------------------ */
 
 .phui-tag-green .phui-tag-core,
 .jx-tokenizer-token.green {
   background: {$sh-greenbackground};
   border-color: {$sh-lightgreenborder};
   color: {$sh-greentext};
 }
 
 .phui-tag-green .phui-icon-view,
 .jx-tokenizer-token.green .phui-icon-view,
 .jx-tokenizer-token.green .jx-tokenizer-x {
   color: {$sh-greenicon};
 }
 
 a.phui-tag-view:hover.phui-tag-green .phui-tag-core,
 .jx-tokenizer-token.green:hover {
   border-color: {$sh-greenborder};
 }
 
 /* - Violet ----------------------------------------------------------------- */
 
 .phui-tag-violet .phui-tag-core,
 .jx-tokenizer-token.violet {
   background: {$sh-violetbackground};
   border-color: {$sh-lightvioletborder};
   color: {$sh-violettext};
 }
 
 .phui-tag-violet .phui-icon-view,
 .jx-tokenizer-token.violet .phui-icon-view,
 .jx-tokenizer-token.violet .jx-tokenizer-x {
   color: {$sh-violeticon};
 }
 
 a.phui-tag-view:hover.phui-tag-violet .phui-tag-core,
 .jx-tokenizer-token.violet:hover {
   border-color: {$sh-violetborder};
 }
 
 /* - Pink ------------------------------------------------------------------- */
 
 .phui-tag-pink .phui-tag-core,
 .jx-tokenizer-token.pink {
   background: {$sh-pinkbackground};
   border-color: {$sh-lightpinkborder};
   color: {$sh-pinktext};
 }
 
 .phui-tag-pink .phui-icon-view,
 .jx-tokenizer-token.pink .phui-icon-view,
 .jx-tokenizer-token.pink .jx-tokenizer-x {
   color: {$sh-pinkicon};
 }
 
 a.phui-tag-view:hover.phui-tag-pink .phui-tag-core,
 .jx-tokenizer-token.pink:hover {
   border-color: {$sh-pinkborder};
 }
 
 /* - Grey ------------------------------------------------------------------- */
 
 .phui-tag-grey .phui-tag-core,
 .jx-tokenizer-token.grey {
   background: {$sh-greybackground};
   border-color: {$sh-lightgreyborder};
   color: {$sh-greytext};
 }
 
 .phui-tag-grey .phui-icon-view,
 .jx-tokenizer-token.grey .phui-icon-view,
 .jx-tokenizer-token.grey .jx-tokenizer-x {
   color: {$sh-greyicon};
 }
 
 a.phui-tag-view:hover.phui-tag-grey .phui-tag-core,
 .jx-tokenizer-token.grey:hover {
   border-color: {$sh-greyborder};
 }
 
 /* - Checkered -------------------------------------------------------------- */
 
 .phui-tag-checkered .phui-tag-core,
 .jx-tokenizer-token.checkered {
   background: url(/rsrc/image/checker_lighter.png);
   border-style: dashed;
   border-color: {$sh-greyborder};
   color: {$sh-greytext};
   text-shadow: 1px 1px #fff;
 }
 
 .phui-tag-checkered .phui-icon-view,
 .jx-tokenizer-token.checkered .phui-icon-view,
 .jx-tokenizer-token.checkered .jx-tokenizer-x {
   color: {$sh-greyicon};
 }
 
 a.phui-tag-view:hover.phui-tag-checkered .phui-tag-core,
 .jx-tokenizer-token.checkered:hover {
   border-style: solid;
   border-color: {$sh-greyborder};
 }
 
 /* - Disabled --------------------------------------------------------------- */
 
 .phui-tag-disabled .phui-tag-core {
   background-color: {$sh-disabledbackground};
   border-color: {$sh-lightdisabledborder};
   color: {$sh-disabledtext};
 }
 
 .phui-tag-disabled .phui-icon-view {
   color: {$sh-disabledicon};
 }
 
 a.phui-tag-view:hover.phui-tag-disabled .phui-tag-core {
   border-color: {$sh-disabledborder};
 }
 
 /* - Outline Tags --------------------------------------------------------------
 
   Basic Tag with a bold border and white background
 
 */
 
 .phui-tag-type-outline {
   text-transform: uppercase;
   font-weight: normal;
 }
 
 .phui-tag-view.phui-tag-type-outline .phui-tag-core {
   background: #fff;
   padding: 0 6px 1px 6px;
 }
 
 .phui-tag-slim.phui-tag-type-outline .phui-tag-core {
   font-size: {$smallestfontsize};
 }
 
 .phui-tag-type-outline.phui-tag-red .phui-tag-core {
   color: {$red};
   border-color: {$red};
 }
 
 .phui-tag-type-outline.phui-tag-orange .phui-tag-core {
   color: {$orange};
   border-color: {$orange};
 }
 
 .phui-tag-type-outline.phui-tag-yellow .phui-tag-core {
   color: {$yellow};
   border-color: {$yellow};
 }
 
 .phui-tag-type-outline.phui-tag-green .phui-tag-core {
   color: {$green};
   border-color: {$green};
 }
 
 .phui-tag-type-outline.phui-tag-blue .phui-tag-core {
   color: {$blue};
   border-color: {$blue};
 }
 
 .phui-tag-type-outline.phui-tag-indigo .phui-tag-core {
   color: {$indigo};
   border-color: {$indigo};
 }
 
 .phui-tag-type-outline.phui-tag-violet .phui-tag-core {
   color: {$violet};
   border-color: {$violet};
 }
 
 .phui-tag-type-outline.phui-tag-grey .phui-tag-core {
   color: {$bluetext};
   border-color: {$bluetext};
 }
 
 .phui-tag-type-outline.phui-tag-disabled .phui-tag-core {
   color: {$lightgreytext};
   border-color: {$lightgreytext};
 }
 
 .phui-tag-type-outline.phui-tag-pink .phui-tag-core {
   color: {$pink};
   border-color: {$pink};
 }
 
 .phui-tag-type-outline.phui-tag-sky .phui-tag-core {
   color: {$sky};
   border-color: {$sky};
 }
 
 .phui-tag-type-outline.phui-tag-fire .phui-tag-core {
   color: {$fire};
   border-color: {$fire};
 }
 
 .phui-tag-type-outline.phui-tag-black .phui-tag-core {
   color: {$blacktext};
   border-color: {$blacktext};
 }
diff --git a/webroot/rsrc/js/core/Prefab.js b/webroot/rsrc/js/core/Prefab.js
index 979ad3473b..ff4467881b 100644
--- a/webroot/rsrc/js/core/Prefab.js
+++ b/webroot/rsrc/js/core/Prefab.js
@@ -1,315 +1,338 @@
 /**
  * @provides phabricator-prefab
  * @requires javelin-install
  *           javelin-util
  *           javelin-dom
  *           javelin-typeahead
  *           javelin-tokenizer
  *           javelin-typeahead-preloaded-source
  *           javelin-typeahead-ondemand-source
  *           javelin-dom
  *           javelin-stratcom
  *           javelin-util
  * @javelin
  */
 
 /**
  * Utilities for client-side rendering (the greatest thing in the world).
  */
 JX.install('Prefab', {
 
   statics : {
     renderSelect : function(map, selected, attrs, order) {
       var select = JX.$N('select', attrs || {});
 
       // Callers may optionally pass "order" to force options into a specific
       // order. Although most browsers do retain order, maps in Javascript
       // aren't technically ordered. Safari, at least, will reorder maps with
       // numeric keys.
 
       order = order || JX.keys(map);
 
       var k;
       for (var ii = 0; ii < order.length; ii++) {
         k = order[ii];
         select.options[select.options.length] = new Option(map[k], k);
         if (k == selected) {
           select.value = k;
         }
       }
 
       select.value = select.value || order[0];
 
       return select;
     },
 
     newTokenizerFromTemplate: function(markup, config) {
       var template = JX.$H(markup).getFragment().firstChild;
       var container = JX.DOM.find(template, 'div', 'tokenizer-container');
 
       container.id = '';
       config.root = container;
 
       var build = JX.Prefab.buildTokenizer(config);
       build.node = template;
       return build;
     },
 
     /**
      * Build a Phabricator tokenizer out of a configuration with application
      * sorting, datasource and placeholder rules.
      *
      *   - `id` Root tokenizer ID (alternatively, pass `root`).
      *   - `root` Root tokenizer node (replaces `id`).
      *   - `src` Datasource URI.
      *   - `ondemand` Optional, use an ondemand source.
      *   - `value` Optional, initial value.
      *   - `limit` Optional, token limit.
      *   - `placeholder` Optional, placeholder text.
      *   - `username` Optional, username to sort first (i.e., viewer).
      *   - `icons` Optional, map of icons.
      *
      */
     buildTokenizer : function(config) {
       config.icons = config.icons || {};
 
       var root;
 
       try {
         root = config.root || JX.$(config.id);
       } catch (ex) {
         // If the root element does not exist, just return without building
         // anything. This happens in some cases -- like Conpherence -- where we
         // may load a tokenizer but not put it in the document.
         return;
       }
 
       var datasource;
 
       // Default to an ondemand source if no alternate configuration is
       // provided.
       var ondemand = true;
       if ('ondemand' in config) {
         ondemand = config.ondemand;
       }
 
       if (ondemand) {
         datasource = new JX.TypeaheadOnDemandSource(config.src);
       } else {
         datasource = new JX.TypeaheadPreloadedSource(config.src);
       }
 
       datasource.setSortHandler(
         JX.bind(datasource, JX.Prefab.sortHandler, config));
       datasource.setTransformer(JX.Prefab.transformDatasourceResults);
 
       var typeahead = new JX.Typeahead(
         root,
         JX.DOM.find(root, 'input', 'tokenizer-input'));
       typeahead.setDatasource(datasource);
 
       var tokenizer = new JX.Tokenizer(root);
       tokenizer.setTypeahead(typeahead);
       tokenizer.setRenderTokenCallback(function(value, key, container) {
         var result;
         if (value && (typeof value == 'object') && ('id' in value)) {
           // TODO: In this case, we've been passed the decoded wire format
           // dictionary directly. Token rendering is kind of a huge mess that
           // should be cleaned up and made more consistent. Just force our
           // way through for now.
           result = value;
         } else {
           result = datasource.getResult(key);
         }
 
         var icon;
         var type;
         var color;
+        var availability_color;
         if (result) {
           icon = result.icon;
           value = result.displayName;
           type = result.tokenType;
           color = result.color;
+          availability_color = result.availabilityColor;
         } else {
           icon = (config.icons || {})[key];
           type = (config.types || {})[key];
           color = (config.colors || {})[key];
+          availability_color = (config.availabilityColors || {})[key];
         }
 
         if (icon) {
           icon = JX.Prefab._renderIcon(icon);
         }
 
         type = type || 'object';
         JX.DOM.alterClass(container, 'jx-tokenizer-token-' + type, true);
 
         if (color) {
           JX.DOM.alterClass(container, color, true);
         }
 
-        return [icon, value];
+        var dot;
+        if (availability_color) {
+          dot = JX.$N(
+            'span',
+            {
+              className: 'phui-tag-dot phui-tag-color-' + availability_color
+            });
+        }
+
+        return [icon, dot, value];
       });
 
       if (config.placeholder) {
         tokenizer.setPlaceholder(config.placeholder);
       }
 
       if (config.limit) {
         tokenizer.setLimit(config.limit);
       }
 
       if (config.value) {
         tokenizer.setInitialValue(config.value);
       }
 
       if (config.browseURI) {
         tokenizer.setBrowseURI(config.browseURI);
       }
 
       if (config.disabled) {
         tokenizer.setDisabled(true);
       }
 
       JX.Stratcom.addData(root, {'tokenizer' : tokenizer});
 
       return {
         tokenizer: tokenizer
       };
     },
 
     sortHandler: function(config, value, list, cmp) {
       // Sort results so that the viewing user always comes up first; after
       // that, prefer unixname matches to realname matches.
       var priority_hits = {};
       var self_hits = {};
 
       // We'll put matches where the user's input is a prefix of the name
       // above matches where that isn't true.
       var prefix_hits = {};
 
       var tokens = this.tokenize(value);
       var normal = this.normalize(value);
 
       for (var ii = 0; ii < list.length; ii++) {
         var item = list[ii];
 
         if (this.normalize(item.name).indexOf(normal) === 0) {
           prefix_hits[item.id] = true;
         }
 
         if (!item.priority) {
           continue;
         }
 
         if (config.username && item.priority == config.username) {
           self_hits[item.id] = true;
         }
       }
 
       list.sort(function(u, v) {
         if (self_hits[u.id] != self_hits[v.id]) {
           return self_hits[v.id] ? 1 : -1;
         }
 
         // If one result is open and one is closed, show the open result
         // first. The "!" tricks here are because closed values are display
         // strings, so the value is either `null` or some truthy string. If
         // we compare the values directly, we'll apply this rule to two
         // objects which are both closed but for different reasons, like
         // "Archived" and "Disabled".
 
         var u_open = !u.closed;
         var v_open = !v.closed;
 
         if (u_open != v_open) {
           if (u_open) {
             return -1;
           } else {
             return 1;
           }
         }
 
         if (prefix_hits[u.id] != prefix_hits[v.id]) {
           return prefix_hits[v.id] ? 1 : -1;
         }
 
         // Sort users ahead of other result types.
         if (u.priorityType != v.priorityType) {
           if (u.priorityType == 'user') {
             return -1;
           }
           if (v.priorityType == 'user') {
             return 1;
           }
         }
 
         // Sort functions after other result types.
         var uf = (u.tokenType == 'function');
         var vf = (v.tokenType == 'function');
         if (uf != vf) {
           return uf ? 1 : -1;
         }
 
         return cmp(u, v);
       });
     },
 
 
     /**
      * Transform results from a wire format into a usable format in a standard
      * way.
      */
     transformDatasourceResults: function(fields) {
       var closed = fields[9];
       var closed_ui;
       if (closed) {
         closed_ui = JX.$N(
           'div',
           {className: 'tokenizer-closed'},
           closed);
       }
 
       var icon = fields[8];
       var icon_ui;
       if (icon) {
         icon_ui = JX.Prefab._renderIcon(icon);
       }
 
+      var availability_ui;
+      var availability_color = fields[16];
+      if (availability_color) {
+        availability_ui = JX.$N(
+          'span',
+          {
+            className: 'phui-tag-dot phui-tag-color-' + availability_color
+          });
+      }
+
       var display = JX.$N(
         'div',
         {className: 'tokenizer-result'},
-        [icon_ui, fields[4] || fields[0], closed_ui]);
+        [icon_ui, availability_ui, fields[4] || fields[0], closed_ui]);
       if (closed) {
         JX.DOM.alterClass(display, 'tokenizer-result-closed', true);
       }
 
       return {
         name: fields[0],
         displayName: fields[4] || fields[0],
         display: display,
         uri: fields[1],
         id: fields[2],
         priority: fields[3],
         priorityType: fields[7],
         imageURI: fields[6],
         icon: icon,
         closed: closed,
         type: fields[5],
         sprite: fields[10],
         color: fields[11],
         tokenType: fields[12],
         unique: fields[13] || false,
         autocomplete: fields[14],
-        sort: JX.TypeaheadNormalizer.normalize(fields[0])
+        sort: JX.TypeaheadNormalizer.normalize(fields[0]),
+        availabilityColor: availability_color
       };
     },
 
     _renderIcon: function(icon) {
       return JX.$N(
         'span',
         {className: 'phui-icon-view phui-font-fa ' + icon});
     }
 
   }
 
 });
diff --git a/webroot/rsrc/js/phuix/PHUIXAutocomplete.js b/webroot/rsrc/js/phuix/PHUIXAutocomplete.js
index f46e7666e2..deb9f9d100 100644
--- a/webroot/rsrc/js/phuix/PHUIXAutocomplete.js
+++ b/webroot/rsrc/js/phuix/PHUIXAutocomplete.js
@@ -1,766 +1,775 @@
 /**
  * @provides phuix-autocomplete
  * @requires javelin-install
  *           javelin-dom
  *           phuix-icon-view
  *           phabricator-prefab
  */
 
 JX.install('PHUIXAutocomplete', {
 
   construct: function() {
     this._map = {};
     this._datasources = {};
     this._listNodes = [];
     this._resultMap = {};
   },
 
   members: {
     _area: null,
     _active: false,
     _cursorHead: null,
     _cursorTail: null,
     _pixelHead: null,
     _pixelTail: null,
     _map: null,
     _datasource: null,
     _datasources: null,
     _value: null,
     _node: null,
     _echoNode: null,
     _listNode: null,
     _promptNode: null,
     _focus: null,
     _focusRef: null,
     _listNodes: null,
     _x: null,
     _y: null,
     _visible: false,
     _resultMap: null,
 
     setArea: function(area) {
       this._area = area;
       return this;
     },
 
     addAutocomplete: function(code, spec) {
       this._map[code] = spec;
       return this;
     },
 
     start: function() {
       var area = this._area;
 
       JX.DOM.listen(area, 'keypress', null, JX.bind(this, this._onkeypress));
 
       JX.DOM.listen(
         area,
         ['click', 'keyup', 'keydown', 'keypress'],
         null,
         JX.bind(this, this._update));
 
       var select = JX.bind(this, this._onselect);
       JX.DOM.listen(this._getNode(), 'mousedown', 'typeahead-result', select);
 
       var device = JX.bind(this, this._ondevice);
       JX.Stratcom.listen('phabricator-device-change', null, device);
 
       // When the user clicks away from the textarea, deactivate.
       var deactivate = JX.bind(this, this._deactivate);
       JX.DOM.listen(area, 'blur', null, deactivate);
     },
 
     _getSpec: function() {
       return this._map[this._active];
     },
 
     _ondevice: function() {
       if (JX.Device.getDevice() != 'desktop') {
         this._deactivate();
       }
     },
 
     _activate: function(code) {
       if (JX.Device.getDevice() != 'desktop') {
         return;
       }
 
       if (!this._map[code]) {
         return;
       }
 
       var area = this._area;
       var range = JX.TextAreaUtils.getSelectionRange(area);
 
       // Check the character immediately before the trigger character. We'll
       // only activate the typeahead if it's something that we think a user
       // might reasonably want to autocomplete after, like a space, newline,
       // or open parenthesis. For example, if a user types "alincoln@",
       // the prior letter will be the last "n" in "alincoln". They are probably
       // typing an email address, not a username, so we don't activate the
       // autocomplete.
       var head = range.start;
       var prior;
       if (head > 1) {
         prior = area.value.substring(head - 2, head - 1);
       } else {
         prior = '<start>';
       }
 
       // If this is a repeating sequence and the previous character is the
       // same as the one the user just typed, like "((", don't reactivate.
       if (prior === String.fromCharCode(code)) {
         return;
       }
 
       switch (prior) {
         case '<start>':
         case ' ':
         case '\n':
         case '\t':
         case '(': // Might be "(@username, what do you think?)".
         case '-': // Might be an unnumbered list.
         case '.': // Might be a numbered list.
         case '|': // Might be a table cell.
         case '>': // Might be a blockquote.
         case '!': // Might be a blockquote attribution line.
           // We'll let these autocomplete.
           break;
         default:
           // We bail out on anything else, since the user is probably not
           // typing a username or project tag.
           return;
       }
 
       // Get all the text on the current line. If the line only contains
       // whitespace, don't activate: the user is probably typing code or a
       // numbered list.
       var line = area.value.substring(0, head - 1);
       line = line.split('\n');
       line = line[line.length - 1];
       if (line.match(/^\s+$/)) {
         return;
       }
 
       this._cursorHead = head;
       this._cursorTail = range.end;
       this._pixelHead = JX.TextAreaUtils.getPixelDimensions(
         area,
         range.start,
         range.end);
 
       var spec = this._map[code];
       if (!this._datasources[code]) {
         var datasource = new JX.TypeaheadOnDemandSource(spec.datasourceURI);
         datasource.listen(
           'resultsready',
           JX.bind(this, this._onresults, code));
 
         datasource.setTransformer(JX.bind(this, this._transformresult));
         datasource.setSortHandler(
           JX.bind(datasource, JX.Prefab.sortHandler, {}));
 
         this._datasources[code] = datasource;
       }
 
       this._datasource = this._datasources[code];
       this._active = code;
 
       var head_icon = new JX.PHUIXIconView()
         .setIcon(spec.headerIcon)
         .getNode();
       var head_text = spec.headerText;
 
       var node = this._getPromptNode();
       JX.DOM.setContent(node, [head_icon, head_text]);
     },
 
     _transformresult: function(fields) {
       var map = JX.Prefab.transformDatasourceResults(fields);
 
       var icon;
       if (map.icon) {
         icon = new JX.PHUIXIconView()
           .setIcon(map.icon)
           .getNode();
       }
 
-      var display = JX.$N('span', {}, [icon, map.displayName]);
+      var dot;
+      if (map.availabilityColor) {
+        dot = JX.$N(
+          'span',
+          {
+            className: 'phui-tag-dot phui-tag-color-' + map.availabilityColor
+          });
+      }
+
+      var display = JX.$N('span', {}, [icon, dot, map.displayName]);
       JX.DOM.alterClass(display, 'tokenizer-result-closed', !!map.closed);
 
       map.display = display;
 
       return map;
     },
 
     _deactivate: function() {
       var node = this._getNode();
       JX.DOM.hide(node);
 
       this._active = false;
       this._visible = false;
     },
 
     _onkeypress: function(e) {
       var r = e.getRawEvent();
 
       // NOTE: We allow events to continue with "altKey", because you need
       // to press Alt to type characters like "@" on a German keyboard layout.
       // The cost of misfiring autocompleters is very small since we do not
       // eat the keystroke. See T10252.
       if (r.metaKey || (r.ctrlKey && !r.altKey)) {
         return;
       }
 
       var code = r.charCode;
       if (this._map[code]) {
         setTimeout(JX.bind(this, this._activate, code), 0);
       }
     },
 
     _onresults: function(code, nodes, value, partial) {
       // Even if these results are out of date, we still want to fill in the
       // result map so we can terminate things later.
       if (!partial) {
         if (!this._resultMap[code]) {
           this._resultMap[code] = {};
         }
 
         var hits = [];
         for (var ii = 0; ii < nodes.length; ii++) {
           var result = this._datasources[code].getResult(nodes[ii].rel);
           if (!result) {
             hits = null;
             break;
           }
 
           if (!result.autocomplete || !result.autocomplete.length) {
             hits = null;
             break;
           }
 
           hits.push(result.autocomplete);
         }
 
         if (hits !== null) {
           this._resultMap[code][value] = hits;
         }
       }
 
       if (code !== this._active) {
         return;
       }
 
       if (value !== this._value) {
         return;
       }
 
       if (this._isTerminatedString(value)) {
         if (this._hasUnrefinableResults(value)) {
           this._deactivate();
           return;
         }
       }
 
       var list = this._getListNode();
       JX.DOM.setContent(list, nodes);
 
       this._listNodes = nodes;
 
       var old_ref = this._focusRef;
       this._clearFocus();
 
       for (var ii = 0; ii < nodes.length; ii++) {
         if (nodes[ii].rel == old_ref) {
           this._setFocus(ii);
           break;
         }
       }
 
       if (this._focus === null && nodes.length) {
         this._setFocus(0);
       }
 
       this._redraw();
     },
 
     _setFocus: function(idx) {
       if (!this._listNodes[idx]) {
         this._clearFocus();
         return false;
       }
 
       if (this._focus !== null) {
         JX.DOM.alterClass(this._listNodes[this._focus], 'focused', false);
       }
 
       this._focus = idx;
       this._focusRef = this._listNodes[idx].rel;
       JX.DOM.alterClass(this._listNodes[idx], 'focused', true);
 
       return true;
     },
 
     _changeFocus: function(delta) {
       if (this._focus === null) {
         return false;
       }
 
       return this._setFocus(this._focus + delta);
     },
 
     _clearFocus: function() {
       this._focus = null;
       this._focusRef = null;
     },
 
     _onselect: function (e) {
       if (!e.isNormalMouseEvent()) {
         // Eat right clicks, control clicks, etc., on the results. These can
         // not do anything meaningful and if we let them through they'll blur
         // the field and dismiss the results.
         e.kill();
         return;
       }
 
       var target = e.getNode('typeahead-result');
 
       for (var ii = 0; ii < this._listNodes.length; ii++) {
         if (this._listNodes[ii] === target) {
           this._setFocus(ii);
           this._autocomplete();
           break;
         }
       }
 
       this._deactivate();
       e.kill();
     },
 
     _getSuffixes: function() {
       return [' ', ':', ',', ')'];
     },
 
     _getCancelCharacters: function() {
       // The "." character does not cancel because of projects named
       // "node.js" or "blog.mycompany.com".
       var defaults = ['#', '@', ',', '!', '?', '{', '}'];
 
       return this._map[this._active].cancel || defaults;
     },
 
     _getTerminators: function() {
       return [' ', ':', ',', '.', '!', '?'];
     },
 
     _getIgnoreList: function() {
       return this._map[this._active].ignore || [];
     },
 
     _isTerminatedString: function(string) {
       var terminators = this._getTerminators();
       for (var ii = 0; ii < terminators.length; ii++) {
         var term = terminators[ii];
         if (string.substring(string.length - term.length) == term) {
           return true;
         }
       }
 
       return false;
     },
 
     _hasUnrefinableResults: function(query) {
       if (!this._resultMap[this._active]) {
         return false;
       }
 
       var map = this._resultMap[this._active];
 
       for (var ii = 1; ii < query.length; ii++) {
         var prefix = query.substring(0, ii);
         if (map.hasOwnProperty(prefix)) {
           var results = map[prefix];
 
           // If any prefix of the query has no results, the full query also
           // has no results so we can not refine them.
           if (!results.length) {
             return true;
           }
 
           // If there is exactly one match and the it is a prefix of the query,
           // we can safely assume the user just typed out the right result
           // from memory and doesn't need to refine it.
           if (results.length == 1) {
             // Strip the first character off, like a "#" or "@".
             var result = results[0].substring(1);
 
             if (query.length >= result.length) {
               if (query.substring(0, result.length) === result) {
                 return true;
               }
             }
           }
         }
       }
 
       return false;
     },
 
     _trim: function(str) {
       var suffixes = this._getSuffixes();
       for (var ii = 0; ii < suffixes.length; ii++) {
         if (str.substring(str.length - suffixes[ii].length) == suffixes[ii]) {
           str = str.substring(0, str.length - suffixes[ii].length);
         }
       }
       return str;
     },
 
     _update: function(e) {
       if (!this._active) {
         return;
       }
 
       var special = e.getSpecialKey();
 
       // Deactivate if the user types escape.
       if (special == 'esc') {
         this._deactivate();
         e.kill();
         return;
       }
 
       var area = this._area;
 
       if (e.getType() == 'keydown') {
         if (special == 'up' || special == 'down') {
           var delta = (special == 'up') ? -1 : +1;
           if (!this._changeFocus(delta)) {
             this._deactivate();
           }
           e.kill();
           return;
         }
       }
 
       // Deactivate if the user moves the cursor to the left of the assist
       // range. For example, they might press the "left" arrow to move the
       // cursor to the left, or click in the textarea prior to the active
       // range.
       var range = JX.TextAreaUtils.getSelectionRange(area);
       if (range.start < this._cursorHead) {
         this._deactivate();
         return;
       }
 
       if (special == 'tab' || special == 'return') {
         var r = e.getRawEvent();
         if (r.shiftKey && special == 'tab') {
           // Don't treat "Shift + Tab" as an autocomplete action. Instead,
           // let it through normally so the focus shifts to the previous
           // control.
           this._deactivate();
           return;
         }
 
         // If the user hasn't typed any text yet after typing the character
         // which can summon the autocomplete, deactivate and let the keystroke
         // through. For example, we hit this when a line ends with an
         // autocomplete character and the user is trying to type a newline.
         if (range.start == this._cursorHead) {
           this._deactivate();
           return;
         }
 
         // If we autocomplete, we're done. Otherwise, just eat the event. This
         // happens if you type too fast and try to tab complete before results
         // load.
         if (this._autocomplete()) {
           this._deactivate();
         }
 
         e.kill();
         return;
       }
 
       // Deactivate if the user moves the cursor to the right of the assist
       // range. For example, they might click later in the document. If the user
       // is pressing the "right" arrow key, they are not allowed to move the
       // cursor beyond the existing end of the text range. If they are pressing
       // other keys, assume they're typing and allow the tail to move forward
       // one character.
       var margin;
       if (special == 'right') {
         margin = 0;
       } else {
         margin = 1;
       }
 
       var tail = this._cursorTail;
 
       if ((range.start > tail + margin) || (range.end > tail + margin)) {
         this._deactivate();
         return;
       }
 
       this._cursorTail = Math.max(this._cursorTail, range.end);
 
       var text = area.value.substring(
         this._cursorHead,
         this._cursorTail);
 
       var pixels = JX.TextAreaUtils.getPixelDimensions(
         area,
         range.start,
         range.end);
 
       var x = this._pixelHead.start.x;
       var y = Math.max(this._pixelHead.end.y, pixels.end.y) + 24;
 
       // If the first character after the trigger is a space, just deactivate
       // immediately. This occurs if a user types a numbered list using "#".
       if (text.length && text[0] == ' ') {
         this._deactivate();
         return;
       }
 
       // Deactivate immediately if a user types a character that we are
       // reasonably sure means they don't want to use the autocomplete. For
       // example, "##" is almost certainly a header or monospaced text, not
       // a project autocompletion.
       var cancels = this._getCancelCharacters();
       for (var ii = 0; ii < cancels.length; ii++) {
         if (text.indexOf(cancels[ii]) !== -1) {
           this._deactivate();
           return;
         }
       }
 
       var trim = this._trim(text);
 
       // If this rule has a prefix pattern, like the "[[ document ]]" rule,
       // require it match and throw it away before we begin suggesting
       // results. The autocomplete remains active, it's just dormant until
       // the user gives us more to work with.
       var prefix = this._map[this._active].prefix;
       if (prefix) {
         var pattern = new RegExp(prefix);
         if (!trim.match(pattern)) {
           return;
         }
         trim = trim.replace(pattern, '');
         trim = trim.trim();
       }
 
       // Store the current value now that we've finished mutating the text.
       // This needs to match what we pass to the typeahead datasource.
       this._value = trim;
 
       // Deactivate immediately if the user types an ignored token like ":)",
       // the smiley face emoticon. Note that we test against "text", not
       // "trim", because the ignore list and suffix list can otherwise
       // interact destructively.
       var ignore = this._getIgnoreList();
       for (ii = 0; ii < ignore.length; ii++) {
         if (text.indexOf(ignore[ii]) === 0) {
           this._deactivate();
           return;
         }
       }
 
       // If the input is terminated by a space or another word-terminating
       // punctuation mark, we're going to deactivate if the results can not
       // be refined by adding more words.
 
       // The idea is that if you type "@alan ab", you're allowed to keep
       // editing "ab" until you type a space, period, or other terminator,
       // since you might not be sure how to spell someone's last name or the
       // second word of a project.
 
       // Once you do terminate a word, if the words you have have entered match
       // nothing or match only one exact match, we can safely deactivate and
       // assume you're just typing text because further words could never
       // refine the result set.
 
       var force;
       if (this._isTerminatedString(text)) {
         if (this._hasUnrefinableResults(text)) {
           this._deactivate();
           return;
         }
         force = true;
       } else {
         force = false;
       }
 
       this._datasource.didChange(trim, force);
 
       this._x = x;
       this._y = y;
 
       var hint = trim;
       if (hint.length) {
         // We only show the autocompleter after the user types at least one
         // character. For example, "@" does not trigger it, but "@d" does.
         this._visible = true;
       } else {
         hint = this._getSpec().hintText;
       }
 
       var echo = this._getEchoNode();
       JX.DOM.setContent(echo, hint);
 
       this._redraw();
     },
 
     _redraw: function() {
       if (!this._visible) {
         return;
       }
 
       var node = this._getNode();
       JX.DOM.show(node);
 
       var p = new JX.Vector(this._x, this._y);
       var s = JX.Vector.getScroll();
       var v = JX.Vector.getViewport();
 
       // If the menu would run off the bottom of the screen when showing the
       // maximum number of possible choices, put it above instead. We're doing
       // this based on the maximum size so the menu doesn't jump up and down
       // as results arrive.
 
       var option_height = 30;
       var extra_margin = 24;
       if ((s.y + v.y) < (p.y + (5 * option_height) + extra_margin)) {
         var d = JX.Vector.getDim(node);
         p.y = p.y - d.y - 36;
       }
 
       p.setPos(node);
     },
 
     _autocomplete: function() {
       if (this._focus === null) {
         return false;
       }
 
       var area = this._area;
       var head = this._cursorHead;
       var tail = this._cursorTail;
 
       var text = area.value;
 
       var ref = this._focusRef;
       var result = this._datasource.getResult(ref);
       if (!result) {
         return false;
       }
 
       ref = result.autocomplete;
       if (!ref || !ref.length) {
         return false;
       }
 
       // If the user types a string like "@username:" (with a trailing colon),
       // then presses tab or return to pick the completion, don't destroy the
       // trailing character.
       var suffixes = this._getSuffixes();
       var value = this._value;
       var found_suffix = false;
       for (var ii = 0; ii < suffixes.length; ii++) {
         var last = value.substring(value.length - suffixes[ii].length);
         if (last == suffixes[ii]) {
           ref += suffixes[ii];
           found_suffix = true;
           break;
         }
       }
 
       // If we didn't find an existing suffix, add a space.
       if (!found_suffix) {
         ref = ref + ' ';
       }
 
       area.value = text.substring(0, head - 1) + ref + text.substring(tail);
 
       var end = head + ref.length;
       JX.TextAreaUtils.setSelectionRange(area, end, end);
 
       return true;
     },
 
     _getNode: function() {
       if (!this._node) {
         var head = this._getHeadNode();
         var list = this._getListNode();
 
         this._node = JX.$N(
           'div',
           {
             className: 'phuix-autocomplete',
             style: {
               display: 'none'
             }
           },
           [head, list]);
 
         JX.DOM.hide(this._node);
 
         document.body.appendChild(this._node);
       }
       return this._node;
     },
 
     _getHeadNode: function() {
       if (!this._headNode) {
         this._headNode = JX.$N(
           'div',
           {
             className: 'phuix-autocomplete-head'
           },
           [
             this._getPromptNode(),
             this._getEchoNode()
           ]);
       }
 
       return this._headNode;
     },
 
     _getPromptNode: function() {
       if (!this._promptNode) {
         this._promptNode = JX.$N(
           'span',
           {
             className: 'phuix-autocomplete-prompt',
           });
       }
       return this._promptNode;
     },
 
     _getEchoNode: function() {
       if (!this._echoNode) {
         this._echoNode = JX.$N(
           'span',
           {
             className: 'phuix-autocomplete-echo'
           });
       }
       return this._echoNode;
     },
 
     _getListNode: function() {
       if (!this._listNode) {
         this._listNode = JX.$N(
           'div',
           {
             className: 'phuix-autocomplete-list'
           });
       }
       return this._listNode;
     }
 
   }
 
 });