text:
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [1.3.113] 2018-04-30
### Added
- Added boss frames.

### Changed
- Party frames are now hidden if more than 5 group members exist.

## [1.3.112] 2018-04-29
### Fixed
- Fixed the nil bugs regarding AuraData in the party module.

## [1.3.111] 2018-04-28
### Added
- Added party frames for small groups of max five players. They currently show health, cast bar and some basic short term auras. Work in progress.

### Changed
- Moved the focus frame away from the upper corner. Might make it movable later on, as it's a tricky one.

## [1.3.110] 2018-04-28
### Added
- Added some ruRU localization.

### Fixed
- Fixed a typo in an event check in the Minimap module.

## [1.3.109] 2018-02-24
### Changed
- Added a few more IsForbidden checks to the GameTooltip in the actionbar menu module, as some had slipped through the cracks in the previous round of fixes.
- Made the Paladin class color even more pink, but less dandy.

### Fixed
- Fixed revealed WorldMap textures for the Broken Shores zone in WoW client patch 7.1.5. We should no longer get green textures for the undiscovered areas there.
- Units that become friendly towards the player (like Hymdall in Halls of Valor) will no longer show their previous threat on the nameplates. Friendly units aren't by definition threatening since they can't attack us, so even though the threat info still exists in the client, it makes no sense showing it to the user.
- Fixed capitalization issues relevant to German game clients in the quest tracker.
- Clicking the button to exit vehicles in WotLK and Cata gaming clients should now actually make you exit the vehicle instead of just saying "leavevehicle" out into the open air. Sorry for that one, folks!
- Fixed the issue where the middle and right mouse buttons clicks on the Minimap clock were mixed up as opposed to what the tooltip set.

## [1.3.108] 2018-02-20
### Changed
- Debuffs visible on enemy nameplates will no longer be hidden from the target unitframe.
- Improved the tooltip shown when hovering over the checkbutton to reveal hidden ares of the world map slightly in terms of colors and layout.

### Fixed
- Fixed a typo in the tooltip shown when hovering over the checkbutton to reveal hidden areas of the world map.
- Fixed a display bug in the aforementioned tooltip on the Felsong realm that would only display the level requirement instead of the quest title.
- Fixed wrong year in every patch note prior to this one this year. Guess I was living in the past.

## [1.3.107] 2018-02-18
### Added
- There is now a checkbutton enabled by default located on the (Legion) WorldMap, which when enabled will reveal hidden parts of the map.
- There are now wowhead links added to the (Legion) quest log, the achievement frame and adventure guide.

### Changed
- Elites and Rares now have a silver border on the target frame, while bosses have a gold border. Both have a skull with red eyes as before.
- The pet unitframe has changed to a single orb, and has been moved from its previous position in the top left corner of the screen to a new home on the top left side of the player's own health orb now.
- The pet actionbar is now invisible until you reach level 10 and can actually use it.
- The pet actionbar got some minor styling slapped on it. Not perfect, but was a bit too dull before.
- The WorldMap and Minimaps are now both slightly brighter than before.

### Fixed
- The artifact bar should appear for people with unmaxed artifacts again.
- Your health and power should now remain visible while an override bar is visible.
- Your XP/Artifact/Honor bar should now disappear as intended while an override bar is visible.
- The actionbar backdrop and other actionbar artwork now properly updates while the override bar is visible.
- Hovering over world buttons at the top level part of the WorldMap should no longer look bad.

## [1.3.106] 2018-02-14
### Added
- The Minimap clock can now be right-clicked to toggle 12/24 hour time mode, and middle-clicked to toggle between your local time and game time.

### Fixed
- Changed how the UI checks for whether or not an addon is enabled and will be loaded. Previously it just checked for the enabled checkmark in the addon listing, which would cause crazy issues like the DiabolicUI nameplates not being loaded if you had Goldpaw's NamePlates enabled in your addon listing but the Goldpaw's UI Core disabled. The new behavior makes sure the addon in question will actually be loaded, meaning its dependencies must also be enabled.
- The bottom left corner social button's tooltip now exclude yourself from the count of online guild members, the same way the button's own count does. Because you're well aware you're online, it's who else is there with you that matters.

## [1.3.105] 2018-02-13
### Fixed
- Changed how the actionbars decided whether or not the Artifact or Honor bar should be shown. Artifacts that aren't maxed should be shown as intended when equipped now.

## [1.3.104] 2018-02-12
### Added
- Added professions tabs at the side of the tradeskill frame, to quickly switch from one profession to another.
- Added a "Click to Complete" functionality for auto completable quests in the tracker. Work in progress, missing some opacity updates.

### Changed
- Debuffs and Crowd Control are now only hidden from the target frame if the target is an enemy player with a visible nameplate, not from NPCs. This is because on physically large bosses the nameplate would often be moved to the sides out of sight, and thus you wouldn't be able to see your debuffs on it. Fixed!
- The energy orb color for Druids and Monks has been slighty changed to better fit the rest of their coloring.
- The font size used in the chat bubbles is now +1 larger than the chat frame font size, as they simply need to be a bit larger to be readable. Might increase more, will monitor the situation.
- The Minimap has lost roughly a tenth of its size.
- The Artifact bar should now be hidden for maxed out Artifacts.
- The Honor bar is now visible at max level for characters with maxed out Artifacts and a Prestige level of 1 or higher.
- The Honor bar tooltip now shows the current Prestige rank in brackets after the current Honor level.

### Fixed
- You shouldn't be told you're not in a Guild every 5th second on WotLK realms anymore.

## [1.3.103] 2018-02-09
### Added
- Added styling for the trade skill interface and the merchant frame.

### Changed
- The Nameplate module should now disable itself if people choose to run Goldpaw's NamePlates.

### Fixed
- Fixed the item level displayed on heirlooms in the character frame when you're above their maximum level.

## [1.3.102] 2018-02-08
### Removed
- Removed all AlertFrame filtering for now. Appears what I experienced as spammy and wanted to filter out is a Felsong-only bug, and thus shouldn't even be monitored on retail clients or through this UI in general. Moved that functionality to my Felsong_Companion addon instead.

## [1.3.101] 2018-02-07
### Added
- Started styling the trade skill frame the way some other Blizzard frames have been styled. Unfinished, just the basic backdrop coloring done so far.

### Changed
- Aura timers should now show time values rounded up instead of down, thus making them more consistent with tooltips, Blizzard and other addons in general.
- Loot toasts should once again be visible. Only Ancient Mana in quantities of less than 10 gets its toast removed now.
- Added a few more tracker updates to rememedy item/kill counts sometimes not being updated, as well as quest item buttons getting stuck at the wrong ID thus preventing them from functioning properly.

## [1.3.100] 2018-02-06
### Added
- Added a button in the Blizzard TradeSkillUI for Enchanters to directly enchant vellums in their bags.

### Fixed
- Fixed a bug in the Minimap's new mail notification when hovered over.

## [1.3.99] 2018-02-06
### Added
- Added text based new mail notification to the minimap.

## [1.3.98] 2018-02-05
### Changed
- Changed how the quest tracker handles quest texts to better reformat line breaks.

## [1.3.97] 2018-02-04
### Changed
- Rewrote a lot of the tracker's update cycle to avoid flickering, disappearances and so on.
- Rewrote most of the tracker's internal anchoring, to avoid the weird indendted "tree" view that some users were experiencing.
- Added in an extra set of updates for the tracker's quest item buttons, to avoid them getting the wrong ID and becoming unusable after a while. More might be needed, I will monitor the situation closely on my alts!

## [1.3.96] 2018-02-02
### Changed
- Added new colors for NPCs you have a Honored or higher standing with. From Honored to Exalted the colors move slightly towards cyan.
- Added the same new colors for Friendship standings from Friend to Best Friend as was used for Honored to Exalted reputation standings.
- NPCs that are friendly or neutral to the player now have their nameplates colored in the same color as their unitframes.
- Completed Quests are now displayed in the objective tracker regardless of current map zone.

### Fixed
- Fixed a bug that would occur when scanning the item levels of crucible upgraded Artifact relics from the character window.

## [1.3.95] 2018-02-01
### Fixed
- Added a lot of items to the Minimap's icon whitelist, to allow elements from Gatherer and HandyNotes, Zygor Guides and several others to be shown.

## [1.3.94] 2018-01-31
### Added
- Added new Order Hall follower tooltips to the list of styled tooltips.

### Fixed
- Fixed an issue in Legion clients where the quest tracker's sorting function sometimes would cause an error while trying to figure out the closest one quest.

## [1.3.93] 2018-01-30
### Added
- Added secondary profession quests to the priority list visible in all zones in the quest tracker.

### Fixed
- Changed how the override action bar (vehicles) is hidden to avoid the old bar (though transparent) covering it and causing wrong clicks and tooltips.

## [1.3.92] 2018-01-28
### Fixed
- Added regular Guild Roster updates to keep the online guild member count on the bottom left corner social button properly updated.

## [1.3.91] 2018-01-27
### Fixed
- Fixed an annoying nil bug in the new Battleground Score module that would fire whenever a timer was visible. Oops!

## [1.3.90] 2018-01-27
### Added
- Battleground scores, dungeon waves and similar has been added! Visible at the top of the screen, hidden when a target is selected to keep the UI clean. Not movable. Not optional.

### Changed
- Changed how the unitframes in some places decided whether or not a unit was friendly to decide bar coloring. This was just a visual change to fix the issue with the NPC nameplates sometimes being differently colored from the unitframes.

### Fixed
- Empty actionbuttons in Cata and WotLK clients will no longer have their checked, empty and highlight textures visible all at once until hovered over.
- Trying to work around a Blizzard XP bar text issue causing a nil bug for Starter Edition characters at level 20 when the UI is reloaded.

## [1.3.89] 2018-01-25
### Fixed
- Fixed a tooltip-related actionbar bug in clients prior to Legion.

## [1.3.88] 2018-01-25
### Changed
- Improved the money display in the bottom left corner slightly.

### Fixed
- The UI should once again work for WotLK and Cata, as incompabilities in the tracker and social button modules have been sorted out.

## [1.3.87] 2018-01-21
### Added
- Added Mac'Aree, Antoran Wastes, Krokuun and Argus as Legion zones to the tracker. World Quests should be visible while in Argus now.

### Changed
- Trying some experimental changes to show Highmountain World Quests while inside Thunder Totem.

## [1.3.86] 2018-01-21
### Changed
- Changed how the social button in the bottom left corner displays online Guild Members. It should be updated on first login now.

## [1.3.85] 2018-01-20
### Added
- The Friends & Guild menubutton in the bottom left corner of the screen will now show online guild members and friends in the tooltip, as well as showing a count for total number of online friends and guild members (yourself excluded) on the button itself.
- Added your current money in gold/silver/copper beneath the chat/social menu buttons in the bottom left corner of the screen.

### Changed
- The chat bubble module will now hide its bubbles if the bubble message is nil or empty. This is to allow other addons and modules to filter or hide the DiabolicUI bubbles by modifying the text in the original blizzard bubble.

## [1.3.84] 2018-01-20
### Added
- The stance bar toggle button should now cancel any non-normal stance or form when right-clicked, while keeping it's normal toggle behavior when left-clicked as before. The tooltip updates dynamically to reflect whether or not there are any active forms or stances to cancel.
- Added a twitter link to the GitHub README file.

### Removed
- Removed the fix for the "Not enough players" spam on the Felsong realm, as this has been moved to a separate addon specifically targeting Felsong bugs and annoyances. Get it at https://github.com/cogwerkz/Felsong_Companion

## [1.3.83] 2018-01-19
### Added
- The WorldMap's map textures are now slightly toned down and colorized to allow the overlay objective icons to stand more out.
- The QueueStatusButton's tooltip in Legion should now be styled similarly to the rest of the UI.

## [1.3.82] 2018-01-18
### Changed
- The DiabolicUI nameplates now also disable themselves if the addon TidyPlates_ThreatPlates is loaded.

## [1.3.81] 2018-01-17
### Changed
- Changed the quest sorting in the custom tracker. Primary Profession Quests in the current map zone will now appear at the top of the list, followed by any normal quests in the current map zone, followed by any World Quests in the current map zone, and finally Emissary and Elite World Quests in the current map zone. The philosophy behind this is that quests you have specifically picked up should have a higher visual priority than repeatable World Quests. Super tracking is not yet affected by this new filtering, but it will be updated in the near future.

## [1.3.80] 2018-01-17
### Fixed
- Added updated Legion 7.3.5 Minimap Blip Textures. All the icons inside the Minimap like quest givers, vendors, mailbox and so on should work again now.

## [1.3.79] 2018-01-15
### Changed
- More fixes to the GameTooltip to work around Blizzard's faulty Legion 7.3 nameplate protected tooltip bug.

## [1.3.78] 2018-01-10
### Changed
- No attempts should be made to show, hide or move the GameTooltip if it's become protected by Blizzard's faulty Legion 7.3 nameplates anymore.

## [1.3.77] 2018-01-07
### Added
- Added /rl /reload and /reloadui as ReloadUI() chat commands to all client versions.

### Changed
- Updated the zhCN localization.

## [1.3.76] 2017-12-19
### Changed
- Changed how the UI deals with the PlaySound changes in the 7.3.0 WoW client patch, to be compatible with the nitwit way Ace3 handles it. They check for the existence of the PlaySoundKitID API call and base their PlaySound usage on that, instead of checking for the client version as they should.

## [1.3.75] 2017-12-09
- Working around the protected GameTooltip bug introduced with secure friendly dungeon nameplates in WoW patch 7.3.0 by Blizzard. This bug mostly occurred on specs with dispel abilities when hovering over friendly auras.

## [1.3.74] 2017-12-05
### Fixed
- Fixed a missing pointer to the addon locales in the nameplate module, which sometimes would cause excessive error spam.

## [1.3.73] 2017-12-05
### Fixed
- Fixed an issue with the LevelUpDisplay on Cata realms that broke the UI.

## [1.3.72] 2017-11-29
### Fixed
- Fixed an issue with the character frame's item level display, which would sometimes bug out with some weapon types.
- Fixed an issue with the character frame's item level display which would leave the background shade of the item level visible even when no item level was displayed.

## [1.3.71] 2017-11-04
### Fixed
- Fixed some color library bugs that caused the UI to break on all WoW clients below Legion.

## [1.3.70] 2017-09-27
### Fixed
- Fixed an issue where some Brewfest dailies would bug out the tracker. The tracker still does not display these quests, but at least it doesn't cause bugs and a big error frame in the middle of the screen anymore.

## [1.3.69] 2017-09-26
### Added
- Added world quest rarity colors to our internal color database

### Fixed
- The tracker should now display a correctly rarity colored plus sign for elite world quests.

## [1.3.68] 2017-09-14
### Fixed
- Fixed an issue where the UI would attempt to load the Artifact bar in WoW clients older than Legion.

## [1.3.67] 2017-09-14
### Added
- Added a Legion honor points bar visible while inside a PvP instance.

### Changed
- Changed when the tracker gathers information about a quest's zone, to work around some major fps drops in certain conditions in Legion.
- Renamed the internal Engine API call 'GetStaticConfig' to 'GetDB' as this better reflected its purpose.

### Fixed
- Fixed an issue that would cause limited starter edition accounts playing at full level on the PTR to not get their Artifact Power displayed as a bar.
- Fixed an internal issue that would give quality colors the wrong index in our custom color table. This issue never affected the player, and was merely a backend fix.

## [1.3.66] 2017-09-09
### Changed
- In Legion Blizzard decided to unload all hidden UI textures from memory. This causes constant disk access and flickering. In an effort to work against this I've changed how textures are displayed in the GameMenu and on the actionbutton styling functions from showing and hiding to changing the opacity instead. This keeps the textures in memory and removes the annoying flickering. The textures use a few kilobytes of ram each, the whole UI a few megabytes, while the game uses several gigabytes. Unloading 2D textures from memory is absolutely idiotic, and does nothing but increase disk access, cause flickering and lag spikes. Good one, Blizzard.

## [1.3.65] 2017-09-07
### Changed
- Rares and elites should get the same target frame artwork as bosses now. Will make separate artwork for rares and elites later, just wanted them to stand more out for the time being.

### Fixed
- Fixed some issues related to the 12-hour clock. Not that the 12-hour clock has been available as a user choice yet, but still... fixed.

## [1.3.64] 2017-09-04
### Changed
- Upgraded itemlevel display in character frame and blizzard bags to perform an extra check for upgraded items.
- Micro menu buttons in the bottom right corner of the screen that are disabled will now appear darker in color instead of being transparent, as this looked really weird when Bagnon was open and its icons and numbers shone through.

### Fixed
- Resetting chat settings through the blizzard options menu shouldn't bug out anymore.

## [1.3.63] 2017-09-01
### Fixed
- Minimap buttons collected by the addon MinimapButtonBag(MBB) should now properly appear at a higher framelevel than the Minimap, and not underneath it where they where unclickable.

## [1.3.62] 2017-08-30
### Fixed
- Added WoW 7.3.0-compatible Minimap blip icons. Blizzard keeps rearranging them on every major and minor patches, so it's probably an autogenerated thing. Should remember to check this for every new content patch from now on.

## [1.3.61] 2017-08-29
### Changed
- Bumped the toc version to patch 7.3.0.

## [1.3.60] 2017-08-26
### Added
- New round Minimap.
- Legion Nameplates now have a large crowd control icon displayed above themselves!
- Added in proper seamless MBB(MinimapButtonBag) support.
- Added in some minor styling of the character frame, talent frame, group finder frame, spellbook, worldmap and containers.
- Added in itemlevel display to the character frame and container frame.
- Added some performance tweaks to prevent other addons misusing or overusing garbage collection and memory usage queries.

### Changed
- The Minimap module will disable itself if the addons Mappy or SexyMap are enabled.
- The UI should no longer enforce no rotation on the Minimap, since the new round one easily can be rotated.
- The Minimap will no longer forcefully change the WorldMap to the current zone when moving between zones when the WorldMap is open. It will instead hide the player coordinates until the WorldMap is closed, and then resume the updates. This will not prevent other third party addons from calling commands that forcefully change the WorldMap zone, though.
- Minimap buttons will now be hidden unless the addon MBB(MinimapButtonBag) is installed and enabled. A built-in button bag for Minimap buttons will be added at a later date, but for now we're letting MBB handle this. It's good at it.
- Changed the layout of the quest tracker to match the new Minimap, and moved usable quest items to the left side of it instead.
- Legion nameplates had their maximum visible distance adjusted to 45 yards while inside an instance, and 30 yards while not.
- Auras displayed in the new Legion nameplate CC display will not be displayed amongst the normal auras below the nameplate.
- Auras displayed anywhere on the Legion nameplates should not be visible on the target unitframe if a nameplate is currently visible for your target. This is a work in progress.
- Changed how auras are displayed on the target frame. A lot of new filters were added, and the old ones optimized. This is a work in progress, and in no way finished.
- Toned down the new item flash texture in the default Blizzard bags for client versions supporting this. It was just too much.
- The player castbar will now be disabled if the addon Quartz is enabled.
- Seriously optimized the performance of the quest tracker. Pimped that Lada of a module into a Lamborghini Sesto Elemento!
- Optimized the Blizzard vehicleseat, durability, ghostframe and player alt power modules to better utilize the Engine methods and systems.
- Prefixed most modules that only slightly modified the look of Blizzard elements with "Blizzard: " in order to reflect their nature better. Most of this UI is custom and built from scratch, but some elements can't be changed, or isn't practical or compatible to change. These modules should now be easier to identify in the code.

### Fixed
- Fixed a tracker issue in WoW clients Cata or higher where quest item buttons would get the wrong quest log index assigned, and either end up being unusable or use the wrong item.
- Fixed a tracker issue in WotLK where the tracker sometimes wouldn't start an no quests were displayed at all.
- Fixed an issue with the micro menu (mostly) in WotLK that would cause taint on every combat ending as a result of a micro button update wrongfully being called upon UnitAffectingCombat("player") returning false instead of InCombatLockdown(). (UnitAffectingCombat returns false until an attack has landed when proximity aggroing creatures, and thus is unreliable when it comes to figuring out if it's safe to move or change protected items, as these are forbidden as long as we're engaged in combat in any shape or form.)
- Fixed a tracker issue where item cooldowns didn't show up.
- Fixed an issue with the tracker's world quest proximity filtering which would assume all zones were perfect squares, and thus end up sorting world quests in a consistent but totally wrong ord. We could go by the aspect ratio of the WorldMapDetailFrame, but choosing to use the Legion API call C_TaskQuest.GetDistanceSqToQuest(questID) instead, since we're only tracking proximity of Legion world quests anyway.

### Removed
- Removed the ability to manually track quests from the Blizzard (WoD and Legion) QuestLog, as our quest tracker overrides this anyway. The ability to manually track specific quests will be added into our own tracker at a later date. For now, though, it was more important to remove useless remnants of non existing functionality to avoid confusion.

## [1.2.59] 2017-07-29
### Changed
- Reduced the maximum visible Legion nameplate distance from 100yd to 30yd, as nameplates of mobs outside buildings were visible through the walls and floors, causing major confusion when trying to target something. An example was when killing Captain Volo'ren in Val'Sharah.

## [1.2.58] 2017-07-26
### Fixed
- Already visible chat bubbles will now be hidden upon entering an instance, instead of remaing visible on the screen.

## [1.2.57] 2017-07-24
### Added
- Added back most of the Blizzard alert frames, except some too spammy loot and currency alerts. Also moved the alert frames slightly higher up on the screen. Note that this is a temporary solution, and custom alerts will be added at a later point. The Blizzard alerts can easily grow too much upwards and prevent us from clicking players and NPCs in the game world, and we simply need a better system than that.

## [1.2.56] 2017-07-24
### Changed
- Added TinyTip and TinyTooltip to the tooltip incompatibility list. This means that when one of these addons are loaded, they'll handle the tooltip, and not DiabolicUI.

## [1.2.55] 2017-07-24
### Changed
- The tooltip modules will now disable themselves if TipTac is loaded.

## [1.2.54] 2017-07-23
### Changed
- The nameplate module will now disable itself if the addon Kui_Nameplates is enabled.

### Removed
- Removed all Blizzard alert frames. They were excessive, unnecessary, and in the way.

## [1.2.53] 2017-07-23
### Fixed
- Worked around the Blizzard bug causing /framestack to bug out with frames that are numbered indices of their parents by removing all such frame references from the UI. Previously the unitframe and nameplate aura modules used this, but both are now using hashed keys instead. This fix of course only applies to this UI, and there is no way to prevent other addons from causing the same /framestack bug.

### Removed
- Removed auras from the Legion Personal Resource Display (the player nameplate).

## [1.2.52] 2017-07-22
### Added
- Added castbars to Legion nameplates. Protected casts are glowing, regular ones are not.
- Added auras to Legion nameplates. Differs slightly from the Blizzard plate auras, as we amongst other things are showing HoTs and shields also. Will expand on the filtering later.

### Changed
- Enemy NPC nameplates in Legion (unless tap denied) should now get their entire health bar colored in a color reflecting your current threat situation with them. In other words, yellow mobs will turn red when you attack them solo.
- Elevated the framelevel of Legion rare- and boss nameplates to right below that of the target nameplate, in order to make them easier to see while standing in a swarm of other players trying to tag the same rare elite before it's dead. This change doesn't affect the actual clickable framelevel of the actual secure unitframe, it only affects the visual part. The intention is to make it an easier task to see where the rare actually is, and not waste time looking instead of clicking.
- Optimized the Legion nameplate code more.

## [1.2.51] 2017-07-20
### Changed
- Reduced all nameplate update cycles to 1/30 of a second.

### Fixed
- Fixed a bug in the nameplate update cycle that could cause nameplates to instantly fade out instead of in.

## [1.2.50] 2017-07-19
### Added
- Added a Lunar Power color for the orbs. We didn't have one.

### Changed
- Reduced the action button range checker update frequency to 1/5 of a second, down from 1/20 of a second to gain some performance.
- Reduced the nameplate health update frequency from 1/120 to 1/60 of a second.
- Reduced the nameplate opacity update frequency from 1/120 to 1/30 of a second.
- Removed flight coloring from the actionbuttons, as this was unreliable anyway. This applies to taxis and normal flight.
- Made the angry red NPC color a lot angrier and more red, to stand out more from other mobs and from Death Knights.
- Made the Death Knight color slightly more tilted towards blue to stand out more from angry mobs, even though most Death Knight in truth are fairly angry people too.
- Made the Hunter color slightly brighter, to stand out more from NPCs.
- Made the friendly player color green, same as friendly NPCs which is easier to separate from hostile players than the blue which either would look like Mage blue or Shaman blue. Also chose to NOT use the same purple as the default Blizzard nameplates, as this just makes everybody look like Warlocks.

## [1.2.49] 2017-07-18
### Added
- Added the PlaySoundKitID() API call to WoW client versions prior to Cata, to keep the coding consist between client versions.
- Added back the Blizzard cooldown numbers to the actionbuttons for WoD clients and higher.
- Added back the Blizzard interface option to show cooldown numbers on the actionbars for WoD clients and higher.

### Changed
- Changed how cooldowns are displayed on the action buttons. Should be more similar to the default Blizzard UI now, and easier to understand.
- Changed how removed Blizzard interface options were shrunk down, as they would sometimes leave a huge empty space in the interface menu.

### Fixed
- Fixed an issue where buttons on the action bar that had their spell changed after a cast wouldn't update their icons properly.
- Fixed how charges were displayed on the action buttons, as this would sometimes be wrong.
- Fixed an issue in WotLK clients where the PlaySoundKitID API call would cause a nil error as it technically didn't exist until Cata.

## [1.2.48] 2017-07-17
### Fixed
- Fixed a bug with the zone ability buttons that would make the cooldown spiral fill the entire screen.
- Fixed an issue that would keep available spell charges hidden from the actionbuttons.

## [1.2.47] 2017-07-15
### Changed
- Added the combat resource tracking addon Engraved as a recommended addon in the README file.

### Fixed
- Fixed a bug that prevent auras from being shown on the target frame.

## [1.2.46] 2017-07-13
### Changed
- Some code cleanup.
- Added the "Already looted" error message to a new blacklist in the objective module's warnings element. This is mainly a workaround for a known bug on TrinityCore based realms.

### Fixed
- Added in some extra event checks to fix an issue where new quest items needed the world map to be toggled before working properly in our tracker.
- Fixed an issue that could cause both completed objectives and the completed quest message to be visible and overlapping in the tracker.

## [1.2.45] 2017-07-11
### Fixed
- Fixed an issue with the tracker that would sometimes cause objectives to have overlapping (and wrong) messages displayed.

## [1.2.44] 2017-07-11
### Added
- Added back the PlaySoundKitID() API call to WoW client versions 7.3.0 and higher, as Blizzard decided to remove it and have the regular PlaySound() use soundkitIDs as input argument instead. We want consistency.

### Changed
- Changed all the PlaySound() calls to use PlaySoundKitID() instead.
- Actionbuttons should now all be grayed out when the player is dead, similar to when the player is using a taxi.

### Fixed
- Fixed bugs related to when CompactPartyFrames spawn in Legion clients, which was causing bugs and lag in small groups.

## [1.2.43] 2017-07-10
### Changed
- Removed the blizzard tracking of world quests from our own tracker, as it was producing lag and freezes for some people. It's not needed for us to either track the quest or have it's area and objectives visible on the Minimap.
- Player debuff display above the actionbars should now track stackable auras with not timer, like Death Knight's Decomposing Aura.
- Some minor optimizations to the texture display of the target unit frame.

## [1.2.42] 2017-07-09
### Changed
- Tracker is hidden and suspended within instances for the time being. Will re-activate later, and add boss kill tracking, mythic timers and more.
- Minor optimizations to how the tracker shows, hides and updates its quest objectives.

### Fixed
- Attempted to disable more of the default Blizzard objectives tracker functionality to avoid some mythic instance bugs. Untested.
- Fixed a nil bug which would occur in the tracker when changing zones or changing visible world map zone.

## [1.2.41] 2017-07-09
### Changed
- Don't supertrack Emissary quests, as they have no general direction to head in except their zone, which we're probably already in.

### Fixed
- Rearranged levels of breath timer textures, as the bar accidentally ended up behind the backdrop texture.

## [1.2.40] 2017-07-09
### Fixed
- Fixed a tracker bug on WotLK clients, as quests can only be super tracked on Cata clients or higher.
- Fixed a tracker nil bug occurring for some Legion World Quests as they sometimes have hidden, empty objectives. Weird.
- Redid the fracking tracker sorting function again. Am I getting better or worse?

## [1.2.39] 2017-07-08
### Added
- Added support for the addon WorldQuestGroupFinder's middle click functionality to the objective tracker's quest titles.
- Added a PvP emote module that'll hug and do various other things to dead enemy players for achievements and fun.

### Changed
- Changed layer order for battleground opening countdown timers, as the spark sometimes would appear behind the bar texture.
- Changed the custom tracker sorting function in an attempt to have it comply with the strict rules for sorting nested tables and get rid of the "Invalid order function for sorting" bug. Hard issue to fix. Fix not guaranteed.
- Moved custom realm compatibility and fixes into the core folder and made the file standalone.

## [1.2.38] 2017-07-07
### Changed
- Trying a slightly brigher mana orb color for Druids and Monks, to make it fit better with their other resources.

### Fixed
- Fixed an issue where quest items wouldn't be shown in the objectives tracker, and instead return an error. Weird as it may seem, I missed this error since I developed the whole thing on a top level character with no quests with usable quest items in them, and thus only discovered this minor oversight when returning to level a low level alternate character. Sorry! :o

## [1.2.37] 2017-07-07
### Fixed
- The custom objectives tracker sorting function now specifically returns true/false values, and no nil values as these would cause and "invalid sorting function" lua error. Coding for dummies.

## [1.2.36] 2017-07-07
### Fixed
- Added an existance check to the custom objectives tracker sorting function, since it for some reason only receives one element now and then.

## [1.2.35] 2017-07-07
### Added
- Added GitHub templates for issue reports, repository contributors and pull requests. Thanks Kkthnx! :)

### Changed
- Quest super tracking should now for the most parts follow the top entry of the custom objectives tracker. Applies to Cataclysm clients and higher.
- Completed quests in the objectives tracker are now placed at the bottom of the tracker, and had their opacity slightly toned down.
- Elite Legion world quests in the objectives tracker are now placed right before the completed quests at the bottom.
- Legion Emissary quests don't display their redundant level requirement in the objectives tracker anymore, as they're only visible and accessible at the proper level anyway.

### Fixed
- Added a fix for the excessive "Not enough players" chat spam in battlegrounds on the Felsong Legion realm.

## [1.2.34] 2017-07-06
### Fixed
- Attempted to bypass some errors in the objectives tracker by temporarily ignoring invasion quests. Will add them back in when the issue is sorted.

## [1.2.33] 2017-07-06
### Added
- Added PvP Capture Bars. Tested in both outdoors PvP and all battlegrounds that have them.
- Added a Legion Artifact bar that replaces the XP bar for level 110 players.
- Added new internal methods to allow modules to register themselves as incompatible with other addons, to simplify my process of automatically disabling a module based on whether or not the given addons are installed and marked as enabled in the addon listing.

### Changed
- The pet actionbar have been repositioned above the standard actionbars.
- The pet actionbar has a temporary (but viable) placeholder backdrop that will be replaced by a custom one later on.
- Side actionbars have changed layout and position, and are now located next to the angel- and demon statues.
- Side actionbars now hides the grid/backdrop of empty buttons, to look less cluttered on-screen.
- The backdrops/grids of empty buttons on the side bar and the pet bar will now also become visible when holding the Alt+Ctrl+Shift modifier combination down. This is the same combination that allows you to drag/remove spells and abilities from your action buttons.
- The actionbars and actionbuttons now have their own handlers, available to all modules.
- Actionbutton keybind locales have been moved away from the action button handler and into the global locale files.
- Created a unified system for "floating" actionbuttons like the ExtraActionButton, Draenor and Legion zone abilities, our StanceBar togglebutton, Vehicle and Taxi exit buttons, and probably several more to come in the future. The idea is to have all of these handled by a single template, and put into a single smart bar. Clean up the mess! I'm planning to add a Fishing Button like the one in Goldpaw's UI into this system. :)
- Started the work separating secure actionbar drivers into a more hidden backend, and artwork callbacks into a more user oriented space.
- Started the work rewriting the many artwork updates in the UI, with a more unified future artwork callback system in mind.
- Changed how debuffs are tracked on enemy frames. Only debuffs actually cast by the player should be shown now, and not debuffs the player has the ability to cast as previously, which led to damage buffs from other people of the same class being shown also. Note that a fully custom filter list is planned, as neither of these solutions are optimal. An example would be when we wish to apply our own DoTs, but may not wish to apply damage modifiers already present on the target, as this would waste our own resources and lower the overall group DPS. TO BE CONTINUED!
- Toned down the opacity of friendly NPC nameplates, to better focus players and hostiles. Planning to expand on this system later on to make it more intelligent and adjust itself based on the current situation, meaning if we're solo, in a PvP instance, a PvE instance, and so on.
- The nameplate module now disables itself if TidyPlates is enabled. The new auto-disable system mentioned in this update's additions was used.
- The Blizzard TalkingHeadFrame has been moved farther up the screen, not overlapping the actionbars anymore. I chose to keep the talking head frame in the UI, even though it contradicts my design vision of less spam. In Legion the talking head can be really helpful when entering a world quest area. Plus, WoW-Freaks is using it for their own in-game announcements, so better keep it around for that. :)

### Fixed
- Fixed a bug that would sometime cause Blizzard tooltips to be styled twice, and get multiple health values layered on top of each other.
- Fixed an issue with vehicles that would sometimes result in an empty, hidden health orb.
- Fixed an issue where the XP/Artifact bar would hover in mid-air while entering a vehicle, while the rest of the bars changed to vehicle layout. The XP/Artifact bar now instantly disappears upon starting the entering process, along with all the other unitframe and actionbar changes.
- Fixed a bug that would cause a player ability from the main actionbar to picked up when trying to pick up a pet ability from the pet bar.
- Fixed an issue in MoP clients and above that would leave the Blizzard background texture on the Group Finder Minimap button.
- Fixed an issue in clients older than Legion where actionbuttons wouldn't be unsaturated while flying or using a taxi at login or reload.
- Fixed the issue with the chat bubble module causing walls of errors when scanning the WorldFrame while being inside instances in Legion 7.2.0-7.2.5 (and beyond) by forcefully disabling turning off chat bubbles inside instances and stopping the chat bubble scanner.

### Removed
- Completely disabled the Blizzard LevelUp display for all WoW client versions that had it. Enough with the on-screen spam. Too much is happening in WoW for all this arcade wannabe in-your-face explosive announcement shit to work. We will however add in our own BETTER system for this later on, and that system will function in all WoW client versions thus giving a more unified experience across expansions.
- Removed the DropDownList framelevel bug fix, as it was producing a "script ran too long" error.

## [1.1.32] 2017-03-06
### Changed
- Minimap coordinates should now be hidden when the WorldMap is visible and set to another zone than the current.

### Fixed
- Spell Activation Overlay Glows should fire more correctly now.

## [1.1.31] 2017-03-01
### Changed
- Quests in some instanced starter zones like the Death Knight one will now automatically be tracked, even though they don't always carry a valid mapID.

## [1.1.30] 2017-03-01
### Changed
- Toggled the player debuff display to only filter away debuffs with a total duration above 5 minutes while currently engaged in combat.
- Whitelisted some important player debuffs to always be shown, like Fatigue, Sated, Insanity, Exhaustion and Resurrection Sickness.
- Cooldown numbers on the aura buttons and action bars are now hidden by default. Custom ones will be added later.

### Fixed
- Fixed a bug that would leave the backdrop of the XP bar visible while using a vehicleUI.
- Fixed a bug that would cause the display of itembuttons in the quest tracker to fail.

## [1.1.29] 2017-03-01
### Changed
- Pixel borders on unfinished quest objectives as well as unitframe aura borders now rescale when resolution, display size or UI scale changes. Will still return faulty sizes if the game window have been manually resized to a size not matching the chosen resolution, though. The same applies to if the user maximizes the window while a different resolution is chosen than the actual one. We simply can't retrieve the actual window size in these case from within the addon API.
- Worked some more on stream lining the custom quest tracker text alignment.

### Fixed
- Fixed a bug where the top left corner of the completion text in the quest tracker was anchored to the bottom center of the quest title instead of the bottom left. Ouch.

## [1.1.28] 2017-02-27
### Changed
- Moved the bag bar to the left side of the bag button, from its old position above it, as it was colliding with the bags.
- Wrote a new text parser for the objective's tracker to better decide number of lines and words per line for all text entries.

### Fixed
- Fixed a bug with the tooltip module that occurred while holding shift and hovering over auras with no available caster unitID.
- Fixed an alignment bug in the custom quest tracker in Legion related to some fontstrings not having a default size, as required in Legion.
- Fixed a bug with the custom tracker that would open empty windows instead of the correct quest log entry when clicking on quest titles.

## [1.1.27] 2017-02-23
### Added
- Hovering over the time display above the Minimap will now show a tooltip with both local and realm time.
- Left-Clicking the time display above the Minimap will now show the in-game event calendar!
- Added the various mirror timer colors (breath, fatigue, etc) to the UIs internal color table.

### Changed
- The custom StatusBar handler now calculates sizes based on points before stored size, leading to less weird bugs and strange results.
- Changed how the UnitFrame handler's Aura element stores and displays things, to reduce incompatibilities with other buff styling addons.
- Did a lot of general code optimizations.

### Removed
- Removed the old combo point system altogether, even for Druids. The upcoming new resource point system will replace it.

## [1.1.26] 2017-02-22
### Added
- Slightly styled the /fstack and /eventtrace frames, mainly because I use them a lot and wanted a look that fit the UI.

### Changed
- The Player NamePlate now has support for the WeakAuras personal resource display attachments by pretending to be a KUINamePlate.
- The Target UnitFrame is now limited to only showing debuffs from the player and bosses. Buff filtering remains unchanged. I'm also working on a better filter.

### Fixed
- Worked around a blizzard bug that would cause frames with no name or hashed reference to break the /fstack.
- Fixed a bug that would prevent friendly auras to be removed by right-clicking, even when out of combat.
- Fixed a startup bug in WotLK clients that would cause the PLAYER\_ENTERING\_WORLD event to be skipped.
- Fixed the issue where NamePlates wouldn't be initialized on the first character login in WotLK, was a result of the above problem.

## [1.1.25] 2017-02-21
### Changed
- The custom DiabolicUI font objects will now change to region specific versions of the Google Noto font for zhCN, zhTW and koKR realms.

## [1.1.24] 2017-02-21
### Changed
- The default scaling of DiabolicUI will now better fit most screen resolutions.
- The target NamePlate (Legion only) will now be kept below the target unitframe and above the bottom actionbars.
- Mirror timers (breath, fatigue, etc) now has a dark background and a spark, and looks more like the castbars and unitframes.

## [1.1.23b] 2017-02-20
### Changed
- Temporarily disabled the combo point display for Rogues in MoP and above, since this turned out to be bugged.

## [1.1.23] 2017-02-20
### Fixed
- Fixed a bug in the QuestTracker that would lock the WorldMapFrame to the current zone

## [1.1.22] 2017-02-19
### Added
- Added Noto fonts for zhCN, zhTW and koKR regions.
- Added a custom and for the time being completely automatic quest tracker. No support for achievements yet, but it's coming!
- Added a new large, square semi-transparent Minimap in true Diablo III style.
- Added text based LFG/PvP/GroupFinder elements to the Minimap.
- Added information about group/solo status, dungeon size or territory PvP status (Contested, Alliance, Horde, Sanctuary etc) to the Minimap.
- Added information about a player's average item level, gear and specialization to the tooltip when holding down the Shift key.
- Added NamePlates. They currently only displays health and level, but more will be added.
- Added buffs and debuffs to the Target frame.
- Added Player buffs and debuffs, placed above the action bars.
- Added health values to the unit tooltip health bar.
- Added spell name and cast timer to the Target cast bar.
- Added cast timer to the Player cast bar.
- Added subtle background shades to the target, tot, focus and pet unitframes, to make them easier to see on both light and dark backgrounds.
- Added subtle background shades to the player castbar and also the warning and objective texts to make them too stand more out when visible.
- Added UI sounds when clicking the chat- and menu buttons in the corners.
- Added UI sounds when showing or hiding action bars.
- Added UI sounds when targeting something and canceling your target.
- Added more methods to our custom Orb- and StatusBar UI widgets.

### Changed
- Health values are visible at all times on the Target Frame now, making it far easier to decide what kind of mob or opponent you are currently facing.
- Health and power values above the Player orbs are now both visible in combat and on mouseover, so you more easily can track your own resources.
- Added a descriptive text (Health, Rage, Mana, etc) to the Player orbs which will be visible on mouseover.
- Power bars on the target frame will now remain visible even when empty if the target is a player.
- Red warnings and yellow quest objective updates are now displayed more centered, closer to the character.
- Minimap rotation is now forcefully turned off, as rotation is incompatible with a square Minimap.
- The Game Menu (Esc) centers itself vertically upon display now (if out of combat), making it centered regardless of number of buttons or game client version.
- The player health orb is now colored by your current character class.
- The player power orb is now split in two for classes and specs that currently have mana in addition to another primary resource.
- Changed, corrected and upgraded a lot of the class- and power colors, both the single bar colors and the multi layered orb colors.
- Changed the git folder structure to treat the root folder as the main addon folder.
- Changed from the DejaVu font family to Noto, as Noto has variations with support for all WoW's client locales.
- Split the static module setups and default user settings into separate folders, to make the addon easier to understand for other developers and enthusiasts.
- Did a lot of performance tweaks both to the core engine and the modules.

### Fixed
- Fixed a bug where the chat bubbles sometimes would bug out if other addons had added child frames to the WorldFrame.
- The XP bar now properly hides when entering player frame vehicles like the chairs at the Pilgrim's Bounty tables.
- Actionbuttons should now properly reflect if the target of the action is out of range.
- Actionbutton icons are now colored by priority: unusable > out of range > usable > not enough mana > unusable for other reasons.
- Fixed a bug in the core Engine that would prevent modules from getting ADDON_LOADED events.

### Removed
- Removed the old, round temporary Minimap that pretty much was just a slightly reskinned version of the Minimap from Goldpaw's UI.
- Removed the Blizzard Order Hall bar (Legion). A custom one will be added later.
- Removed the Blizzard Objectives Tracker (Legion). Our own objective tracker replaces this.
- Removed the Blizzard quest and achievement tracker (pre Legion). Our own objective tracker replaces this.
- Removed the Blizzard player buff and debuff displays, as these now are replaced by our new aura display near the action bars.
- Removed a lot of entries from the Blizzard Interface Options menu which either were replaced by our own, or made no sense in this UI.
- Removed the micro menu's shop button for game clients older than Legion, since they don't really have an in-game shop anyway.
- Removed the micro menu's help button since it's available from the game menu in Legion, and a pointless button in older game clients.

## [1.0.21] 2016-07-24
### Added
- Added zhTW locale by 公孟一文.

### Fixed
- Fixed number abbreviations on the XP bar for zhCN clients.

## [1.0.20] 2016-07-23
### Added
- Added zhCN entry for the stance button tooltip text.

### Changed
- Updated combo points for Rogues in Legion.

## [1.0.19] 2016-07-21
### Fixed
- Fixed some scaling issues in the custom popups.
- Fixed a problem related to figuring out the graphics resolution when UI scaling was enabled in Legion.

## [1.0.18] 2016-07-20
### Added
- Garrison Minimap button is back.
- Added the stance bar button's tooltip text to the enUS locale.
- Added better number abbreviations for zhCN clients.
- Added zhCN localization by 公孟一文.

### Fixed
- Fixed the mirrortimers and timertrackers. turns out blizzard had changed the names and keys of some of the textures.
- Fixed a tooltip bug when hovering over the stance button.
- Attempted to fix a bug that would occur when other addons used blizzard's TimerTracker system.
- Fixed a tooltip incompatibility with the addon SavedInstances.
- Fixed some problems with the locale handler that would prevent other locales than enUS from functioning.
- Fixed the "big bar in the middle of the screen" bug.
- Fixed an issue that would display a number instead of the red error messages on-screen.
- Fixed the zone ability button.

### Changed
- Bumped interface version to 7.0.3.

## [1.0.17] 2016-07-18
### Fixed
- Fixed a localization bug that would cause pre-Cata clients to malfunction if the UI scale was "incorrect".

## [1.0.16] 2016-07-17
### Added
- Added a popup to request whether or not you prefer to have the main chat window automatically sized and positioned.
- Added the chat commands "/diabolic autoscale", "/diabolic autoposition" and "/diabolic resetsetup".

## [1.0.15] 2016-07-16
### Changed
- Toned down the glare on the minimap overlay texture.
- Added frequent updates for unitframes whose unit didn't fire in events, such as ToT.

### Fixed
- Fixed a weird bug that sometimes would occur in the unitframe threat element.

### Removed
- Removed some debug output from the actionbar module that would show up at the start of pet battles
- Removed the annoying green paw texture that would appear on pet battle chat output frames

## [1.0.14] 2016-07-15
### Added
- Added stack size / spell charges to the actionbuttons.
- Added more updates to ToT unit names.

### Changed
- Moved the player's alternate power down, as it often was in the way of the target frame (for example when the blood moon event was active).

### Fixed
- Fixed action keybind in pet battles.

## [1.0.13] 2016-07-14
### Fixed
- Trying to work around a nil bug in the chat window module related to the chat icons. Unable to reproduce it so far, though.

## [1.0.12] 2016-07-13
### Added
- Added combopoints and anticipation.

### Changed
- Doubled the brightness of the threat texture.

### Removed
- Removed the autominimizing of the quest tracker in combat, as this was causing a taint if the user moved from one subzone to another while having quest objectives visible on the WorldMap and opening it. Now THAT took some time to figure out!

## [1.0.11] 2016-07-12
### Added
- Added threat coloring for all existing units with the exception of the player (that's coming later!).

### Changed
- Moved the durability frame, ghost release frame and vehicle seat indicators.

### Fixed
- Fixed issues that prevented new buttons in the stance bar from being clicked when learning new forms or changing talent specialization.
- Updated the Warrior action paging, which seems to have been wrong. New abilities will properly appear on the action bar after this change.
- Fixed a typo that caused the UI not to load.

## [1.0.10] 2016-07-11
### Added
- Added some temporary statusbar texts for the targetframe and player orbs.

### Changed
- Restyled and repositioned the ExtraActionButton1 and the Draenor Zone ability button.

## [1.0.9] 2016-07-9
### Changed
- Stance (and other) buttons should now properly get a gold border to indicate when they are checked.

### Fixed
- Fixed an issue that would produce a bug if more than one mirrortimer (breath, fatigue, etc) was visible on-screen at once. Also adjusted the coloring to be darker and easier to see.

## [1.0.8] 2016-07-8
### Changed
- Moved the mirrortimer (breath, fatigue, feign death etc) slightly downwards, to make room for the upcoming targetframe auras.
- Moved the warning text ("You can't do that yet" etc) slightly down, to not be in the way of the mirror timer or the target frame.
- Slightly lowered the padding between the buttons on the side bars, pet bar and stance bar.

### Fixed
- Fixed a problem with the actionbutton overlay glows.

## [1.0.7] 2016-07-7
### Added
- Added a stance bar...'ish.

### Fixed
- Fixed a bug in the tracker module that would sometimes taint the worldmap's POI buttons if the worldmap was opened during combat.
- Fixed a bug that would sometimes cause the focus frame powerbar to become stupid long instead of disappearing.

## [1.0.6] 2016-07-6
### Added
- Added MoveAnything's game menu button to our styled game menu. I highly recommend NOT using MoveAnything, though, as it causes taint and breaks UI and game functionality.

## [1.0.5] 2016-07-5
### Fixed
- Fixed an issue in Legion/WoD where the focus frame wouldn't reposition itself when the pet frame was shown.
- Fixed an issue in Legion where the castbar texture would be pure green, instead of light transparent white.

## [1.0.4] 2016-07-4
### Added
- Added ToT and Focus unitframes.

### Changed
- Chat should be visible for 15 seconds before fading, up from 5.

### Fixed
- Fixed some issues with the unitframe castbars where they sometime wouldn't update properly.
- Fixed a framelevel issue with the unitframe castbars that would render them above their border.
- Fixed a problem that sometimes would occur with female unitframe portraits.
- Fixed an issue where the chat window module would disable itself if Prat-3.0 was in the addon list, even if it wasn't enabled.

## [1.0.3] 2016-07-2
### Added
- Added a pet action bar.

### Changed
- Adjusted how the side bars resize and move themselves.
- Made the actionbar menu's backdrop darker, to make it less confusing when shown over an open quest tracker.
- All unitframe elements (like the portraits) should now be updated also when first shown.

### Fixed
- Fixed a bug that would make it impossible to dismiss or rename a pet through its unitframe after a /reload.

## [1.0.2] 2016-06-23
### Added
- Added the XP bar.
- Added some methods to the custom StatusBar object to accomodate the new XP bar.

### Changed
- Changed the shadow on the chat font to match the UIs general light direction.

### Fixed
- Removed some debugging output that would appear when clicking on the chat button with the mouse.

## [1.0.1] 2016-06-22
### Added
- The FriendsMicroButton is now forcefully hidden.

### Changed
- Updated the readme file.
- Chat module disabled if Prat-3.0 is loaded.
- Reverted the build number used to recognize the Legion expansion to a lower value.

### Fixed
- Fixed an issue where the chat button would sometimes become disabled after the input box was automatically hidden in classic style mode.
- The "canexitvehicle" macro option doesn't exist before MoP.
- Settings should now save properly between sessions for all clients.

### Removed
- Removed flash animations from chat bubbles, as this was causing client crashes for some users.

## [1.0.0] 2016-06-21
- Initial commit.


text:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using AutoPoco.Configuration;
using AutoPoco.Testing;

namespace AutoPoco.Tests.Unit.Configuration
{
    [TestFixture]
    public class DataSourceFactoryTests
    {
        [Test]
        public void Build_ReturnsNewFactory()
        {
            DatasourceFactory factory = new DatasourceFactory(typeof(BlankDataSource));
            BlankDataSource source = factory.Build() as BlankDataSource;

            Assert.NotNull(source);
        }
    }
}

redpajama_set_name: RedPajamaGithub


text:
Pluribus
========

Cluster manager for NodeJS. Pluribus allows you to run multiple workers, handles automatic respawns, graceful restarts and graceful shutdowns.

Pluribus accepts an option flag instructing it to watch for file changes in the directories you specify, during development.

Workers run with reduced privileges by default, and the number of workers is configurable (but defaults to the number of CPU cores).

Installation
============

$ npm install --save pluribus

Simple example
==============

```javascript

const pluribus = require("pluribus");

function worker() {
    console.log("I'm a worker");
}

function master() {
    console.log("I'm the master");
}

const options = {
    master: master,
    worker: worker,
    silent: false,
    privs: {user: "nobody", group: "nogroup"}
};

pluribus.execute("Example", options);
```

This example in use:

$ node example.js
2014-10-09T15:39:04.748Z [30589]: (master) Starting
2014-10-09T15:39:04.768Z [30589]: (master) Running Example master method
I'm the master
2014-10-09T15:39:04.914Z [30590]: (worker) Starting
I'm a worker
2014-10-09T15:39:04.929Z [30592]: (worker) Starting
I'm a worker
2014-10-09T15:39:04.936Z [30591]: (worker) Starting
I'm a worker
2014-10-09T15:39:04.951Z [30593]: (worker) Starting
I'm a worker

Killing and Restarting
======================

Pluribus automatically spawns replacements for dead workers.

# When a worker dies or is killed another will be spawned in its place
$ kill 30592
2014-10-09T15:40:29.019Z [30589]: (master) Spawning new worker to replace 30592
2014-10-09T15:40:29.116Z [30602]: (worker) Starting
I'm a worker

# Sending a SIGHUP to the master causes all workers finish what they are doing and respawn, e.g. to reload config
$ kill -HUP 30589
2014-10-09T15:41:43.990Z [30589]: (master) Got SIGHUP - reloading all workers
2014-10-09T15:41:44.000Z [30589]: (master) Spawning new worker to replace 30590
2014-10-09T15:41:44.002Z [30589]: (master) Worker 30590 exited
2014-10-09T15:41:44.003Z [30589]: (master) Spawning new worker to replace 30602
2014-10-09T15:41:44.004Z [30589]: (master) Worker 30602 exited
2014-10-09T15:41:44.004Z [30589]: (master) Spawning new worker to replace 30593
2014-10-09T15:41:44.007Z [30589]: (master) Worker 30593 exited
2014-10-09T15:41:44.007Z [30589]: (master) Spawning new worker to replace 30591
2014-10-09T15:41:44.011Z [30589]: (master) Worker 30591 exited
2014-10-09T15:41:44.165Z [30609]: (worker) Starting
I'm a worker
2014-10-09T15:41:44.169Z [30610]: (worker) Starting
I'm a worker
2014-10-09T15:41:44.172Z [30611]: (worker) Starting
I'm a worker
2014-10-09T15:41:44.174Z [30612]: (worker) Starting
I'm a worker

# Sending a SIGINT to the master causes all workers to gracefully die, followed by the master
$ kill -SIGINT 30589
2014-10-09T15:42:41.935Z [30589]: (master) Got SIGINT - closing down
2014-10-09T15:42:41.943Z [30589]: (master) Worker 30612 exited
2014-10-09T15:42:41.943Z [30589]: (master) Worker 30609 exited
2014-10-09T15:42:41.943Z [30589]: (master) Worker 30611 exited
2014-10-09T15:42:41.945Z [30589]: (master) Worker 30610 exited
$

Watching for Changes and Manual Restart
=======================================

If you send a `--pluribus-watch` flag to your application as a command line argument, it will watch for
file changes in the directories specified in your configuration object. If you do not list any globs
in your configuration, a default globs array will be used.

You can also watch for changes by including a `watch: true` property in your config object and running
your application without the `--pluribus-watch` flag.

See the API documentation section of this readme for details of how to set up your configuration.

While watching for changes, you can manually restart your application by typing `rs` at the command line.

$ node example.js --pluribus-watch
2015-05-12T09:42:04.420Z [5561]: (master) Starting
2015-05-12T09:42:04.748Z [5561]: (master) Type 'rs' to restart
2015-05-12T09:42:04.751Z [5561]: (master) Watching for changes...
2015-05-12T09:42:09.062Z [5561]: (master) Running Example master method
I'm the master
2015-05-12T09:42:09.577Z [5569]: (worker) Starting
2015-05-12T09:42:09.601Z [5568]: (worker) Starting
I'm a worker
2015-05-12T09:42:09.634Z [5570]: (worker) Starting
I'm a worker
2015-05-12T09:42:09.660Z [5571]: (worker) Starting
I'm a worker
I'm a worker

Specify a Custom Logger
=======================

If you provide a logging function in your configuration object, it will be used.
For example, `config.logger = require("winston").info`.

API Documentation
=================

Pluribus exports one method, called execute.

The execute method takes two arguments.

First is a string used for logging. Can be anything. We suggest the name of your app.

Second is a config object with the following format. All the values are optional, but the defaults may not suit you.

```javascript
const config = {};

config.master = function () {};   // Function to execute as the master.
                                  //   Default: none defined

config.worker = function () {};   // Function to execute as the workers.
                                  //   Default: none defined
                                  //   (though optional, its kinda the whole point)

config.silent = true;             // If true pluribus will log nothing.
                                  //   Default: true

config.watch  = false;            // If true pluribus will watch for changes
                                  //   Default: false

config.workers = 2;               // How many workers to spawn.
                                  //   Default: number of CPUs

config.globs = [                  // Globs to watch.
    "/path/*",                    // Specify absolute paths, or pass each
    "/path/lib/*.js"              // element to path.resolve() (path = require("path")).
];                                // If path.resolve() is used, take care
                                  // to remove leading slashes from each relative path.
                                  // If watch is specified but globs is not,
                                  // it defaults to [ path.resolve("**/*.js"),
                                  // "!" + path.resolve(".", "node_modules", "**/*") ]

config.privs = {};                // Affects the privileges of workers.
config.privs.user  = "userName";  // The username to run workers as.
config.privs.group = "groupName"; // The group to run workers as.
                                  //    Default: nobody:nogroup

config.waitTimeout = 30000;       // The time (in ms) to wait for workers to drop
                                  // out before being forced to.
                                  //    Default: 30000 (30s)
```


text:
@interface HSQLParameterValue : NSObject <HSQLValue>
{
    sqlite3_value *_value;
}
- (instancetype)initWithValue:(sqlite3_value *)value;
@end


text:
package org.jboss.weld.tests.instance.destroy.normal;

import jakarta.enterprise.context.spi.AlterableContext;
import jakarta.enterprise.context.spi.Contextual;

public class CustomAlterableContext extends CustomNonAlterableContext implements AlterableContext {

    private static boolean destroyCalled;

    @Override
    public void destroy(Contextual<?> contextual) {
        destroyCalled = true;
        super.destroy(contextual);
    }

    public static void reset() {
        destroyCalled = false;
    }

    public static boolean isDestroyCalled() {
        return destroyCalled;
    }
}


text:
package org.jadira.usertype.dateandtime.joda.columnmapper;

import org.jadira.usertype.spi.shared.AbstractStringColumnMapper;
import org.joda.time.Duration;

public class StringColumnDurationMapper extends AbstractStringColumnMapper<Duration> {

    private static final long serialVersionUID = -5741261927204773374L;

    @Override
    public Duration fromNonNullValue(String s) {
        return new Duration(s);
    }

    @Override
    public String toNonNullValue(Duration value) {
        return value.toString();
    }
}


text:
export declare class MdCardModule {
}
export * from './card';


text:
FactoryGirl.define do
  factory :page_factory, class: OrdinaryCms::Factories::Page  do
    sequence(:name) {|n| "page-#{n}" }

    sections {[FactoryGirl.build(:section_factory)]}
  end
end


text:
from django.contrib import admin

from .models import Job, Field
# Register your models here.

class FieldAdmin(admin.ModelAdmin):

    fieldsets = [(None, {'fields': ['job', 'field_name', 'field_text', 'required_for_full_submission', 'text_is_operator_editable', 'name_is_operator_editable', 'field_has_been_set']}),]

class JobAdmin(admin.ModelAdmin):
    # readonly_fields = ['date_created', 'has_process_outline_been_modified_for_this_operation', 'date_submitted', 'has_job_name_been_set', 'completed', 'process_outline']

    fieldsets = [
        (None,          {'fields': ['jmojobid','jmojobassemblyid', 'jmojoboperationid']}),
        ('Date Information', {'fields': ['jmocreateddate',]}),
        # ('Process Information', {'fields': ['process_outline', 'has_process_outline_been_modified_for_this_operation',]}),
        # ('Submission Information', {'fields': ['has_job_name_been_set', 'completed', 'date_submitted',]})
    ]
    search_fields = ['jmojobid', 'jmojobassemblyid', 'jmojoboperationid',]
    list_display = ('jmojobid', 'jmojobassemblyid', 'jmojoboperationid', 'jmocreateddate',)
    list_filter = []

admin.site.register(Job, JobAdmin)
admin.site.register(Field, FieldAdmin)


text:
import React, { Component } from 'react';
import { Jumbotron } from 'react-bootstrap';
import { connect } from 'react-redux';

class Home extends Component {
  render() {
    return (

        <Jumbotron className="text-center">

            audio-automator

            A better way to change AudioParam values

            To find out more about this library, please visit the

              About Page
            .
            You can also log feature requests and bugs on the

              Github Issues Page
            .
            To check out a demo off the library in action, please visit the

              Demo Page
            .

        </Jumbotron>

    );
  }
}

export default connect()(Home);


text:
namespace MouseCursorHelpers
{
    extern NSImage* createNSImage (const Image&);
}

class SystemTrayIconComponent::Pimpl
{
public:
    Pimpl (SystemTrayIconComponent& iconComp, const Image& im)
        : owner (iconComp), statusItem (nil),
          statusIcon (MouseCursorHelpers::createNSImage (im)),
          isHighlighted (false)
    {
        static SystemTrayViewClass cls;
        view = [cls.createInstance() init];
        SystemTrayViewClass::setOwner (view, this);
        SystemTrayViewClass::setImage (view, statusIcon);

        setIconSize();

        statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength: NSSquareStatusItemLength] retain];
        [statusItem setView: view];

        [[NSNotificationCenter defaultCenter]  addObserver: view
                                                  selector: @selector (frameChanged:)
                                                      name: NSWindowDidMoveNotification
                                                    object: nil];
    }

    ~Pimpl()
    {
        [[NSStatusBar systemStatusBar] removeStatusItem: statusItem];
        [statusItem release];
        [view release];
        [statusIcon release];
    }

    void updateIcon (const Image& newImage)
    {
        [statusIcon release];
        statusIcon = MouseCursorHelpers::createNSImage (newImage);
        setIconSize();
        SystemTrayViewClass::setImage (view, statusIcon);
    }

    void setHighlighted (bool shouldHighlight)
    {
        isHighlighted = shouldHighlight;
        [view setNeedsDisplay: true];
    }

    void handleStatusItemAction (NSEvent* e)
    {
        NSEventType type = [e type];

        const bool isLeft  = (type == NSLeftMouseDown  || type == NSLeftMouseUp);
        const bool isRight = (type == NSRightMouseDown || type == NSRightMouseUp);

        if (owner.isCurrentlyBlockedByAnotherModalComponent())
        {
            if (isLeft || isRight)
                if (Component* const current = Component::getCurrentlyModalComponent())
                    current->inputAttemptWhenModal();
        }
        else
        {
            ModifierKeys eventMods (ModifierKeys::getCurrentModifiersRealtime());

            if (([e modifierFlags] & NSCommandKeyMask) != 0)
                eventMods = eventMods.withFlags (ModifierKeys::commandModifier);

            const Time now (Time::getCurrentTime());

            MouseInputSource mouseSource = Desktop::getInstance().getMainMouseSource();

            if (isLeft || isRight)  // Only mouse up is sent by the OS, so simulate a down/up
            {
                owner.mouseDown (MouseEvent (mouseSource, Point<int>(),
                                             eventMods.withFlags (isLeft ? ModifierKeys::leftButtonModifier
                                                                         : ModifierKeys::rightButtonModifier),
                                             &owner, &owner, now,
                                             Point<int>(), now, 1, false));

                owner.mouseUp (MouseEvent (mouseSource, Point<int>(), eventMods.withoutMouseButtons(),
                                           &owner, &owner, now,
                                           Point<int>(), now, 1, false));
            }
            else if (type == NSMouseMoved)
            {
                owner.mouseMove (MouseEvent (mouseSource, Point<int>(), eventMods,
                                             &owner, &owner, now,
                                             Point<int>(), now, 1, false));
            }
        }
    }

    SystemTrayIconComponent& owner;
    NSStatusItem* statusItem;

private:
    NSImage* statusIcon;
    NSControl* view;
    bool isHighlighted;

    void setIconSize()
    {
        [statusIcon setSize: NSMakeSize (20.0f, 20.0f)];
    }

    struct SystemTrayViewClass : public ObjCClass <NSControl>
    {
        SystemTrayViewClass()  : ObjCClass <NSControl> ("JUCESystemTrayView_")
        {
            addIvar<Pimpl*> ("owner");
            addIvar<NSImage*> ("image");

            addMethod (@selector (mouseDown:),      handleEventDown, "v@:@");
            addMethod (@selector (rightMouseDown:), handleEventDown, "v@:@");
            addMethod (@selector (drawRect:),       drawRect,        "v@:@");
            addMethod (@selector (frameChanged:),   frameChanged,    "v@:@");

            registerClass();
        }

        static Pimpl* getOwner (id self)                { return getIvar<Pimpl*> (self, "owner"); }
        static NSImage* getImage (id self)              { return getIvar<NSImage*> (self, "image"); }
        static void setOwner (id self, Pimpl* owner)    { object_setInstanceVariable (self, "owner", owner); }
        static void setImage (id self, NSImage* image)  { object_setInstanceVariable (self, "image", image); }

    private:
        static void handleEventDown (id self, SEL, NSEvent* e)
        {
            if (Pimpl* const owner = getOwner (self))
            {
                owner->setHighlighted (! owner->isHighlighted);
                owner->handleStatusItemAction (e);
            }
        }

        static void drawRect (id self, SEL, NSRect)
        {
            NSRect bounds = [self bounds];

            if (Pimpl* const owner = getOwner (self))
                [owner->statusItem drawStatusBarBackgroundInRect: bounds
                                                   withHighlight: owner->isHighlighted];

            if (NSImage* const im = getImage (self))
            {
                NSSize imageSize = [im size];

                [im drawInRect: NSMakeRect (bounds.origin.x + ((bounds.size.width  - imageSize.width)  / 2.0f),
                                            bounds.origin.y + ((bounds.size.height - imageSize.height) / 2.0f),
                                            imageSize.width, imageSize.height)
                      fromRect: NSZeroRect
                     operation: NSCompositeSourceOver
                      fraction: 1.0f];
            }
        }

        static void frameChanged (id self, SEL, NSNotification*)
        {
            if (Pimpl* const owner = getOwner (self))
            {
                NSRect r = [[[owner->statusItem view] window] frame];
                NSRect sr = [[[NSScreen screens] objectAtIndex: 0] frame];
                r.origin.y = sr.size.height - r.origin.y - r.size.height;
                owner->owner.setBounds (convertToRectInt (r));
            }
        }
    };

    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl)
};

//==============================================================================
void SystemTrayIconComponent::setIconImage (const Image& newImage)
{
    if (newImage.isValid())
    {
        if (pimpl == nullptr)
            pimpl = new Pimpl (*this, newImage);
        else
            pimpl->updateIcon (newImage);
    }
    else
    {
        pimpl = nullptr;
    }
}

void SystemTrayIconComponent::setIconTooltip (const String&)
{
    // xxx not yet implemented!
}

void SystemTrayIconComponent::setHighlighted (bool highlight)
{
    if (pimpl != nullptr)
        pimpl->setHighlighted (highlight);
}

void SystemTrayIconComponent::showInfoBubble (const String& /*title*/, const String& /*content*/)
{
    // xxx Not implemented!
}

void SystemTrayIconComponent::hideInfoBubble()
{
    // xxx Not implemented!
}

void* SystemTrayIconComponent::getNativeHandle() const
{
    return pimpl != nullptr ? pimpl->statusItem : nullptr;
}


text:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.galagosearch.core.parse;

import org.galagosearch.core.parse.IndexReaderSplitParser;
import org.galagosearch.core.parse.Document;
import org.galagosearch.core.parse.DocumentIndexWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import junit.framework.TestCase;
import org.galagosearch.tupleflow.Parameters;
import org.galagosearch.core.index.IndexWriter;
import org.galagosearch.core.index.GenericElement;
import org.galagosearch.core.index.IndexReader;
import org.galagosearch.tupleflow.FakeParameters;
import org.galagosearch.tupleflow.Utility;
import org.galagosearch.core.types.DocumentSplit;

/**
 *
 * @author trevor
 */
public class IndexReaderSplitParserTest extends TestCase {
    Document document;
    String temporaryName;

    public IndexReaderSplitParserTest(String testName) {
        super(testName);
    }

    @Override
    public void tearDown() {
        if (temporaryName.length() != 0)
            new File(temporaryName).delete();
    }

    public void buildIndex() throws FileNotFoundException, IOException {
        File temporary = Utility.createTemporary();

        // Build an encoded document:
        document = new Document();
        document.identifier = "doc-identifier";
        document.text = "This is the text part.";
        document.metadata.put("Key", "Value");
        document.metadata.put("Something", "Else");

        Parameters parameters = new Parameters();
        parameters.add("filename", temporary.getAbsolutePath());
        DocumentIndexWriter writer = new DocumentIndexWriter(new FakeParameters(parameters));
        writer.process(document);
        writer.close();

        temporaryName = temporary.getAbsolutePath();
        assertTrue(IndexReader.isIndexFile(temporaryName));
    }

    /**
     * Test of nextDocument method, of class IndexReaderSplitParser.
     */
    public void testNextDocument() throws Exception {
        buildIndex();

        DocumentSplit split = new DocumentSplit();
        split.fileName = temporaryName;
        split.fileType = "corpus";
        split.startKey = new byte[0];
        split.endKey = new byte[0];

        // Open up the file:
        IndexReaderSplitParser parser = new IndexReaderSplitParser(split);

        // Check the document:
        Document actual = parser.nextDocument();
        assertNotNull(actual);
        assertEquals(document.identifier, actual.identifier);
        assertEquals(document.text, actual.text);
        assertEquals(2, actual.metadata.size());
        assertNotNull(document.metadata.get("Key"));
        assertNotNull(document.metadata.get("Something"));
        assertEquals("Value", document.metadata.get("Key"));
        assertEquals("Else", document.metadata.get("Something"));

        // Make sure there aren't any left:
        assertNull(parser.nextDocument());
    }

    public void testStartKey() throws FileNotFoundException, IOException {
        buildIndex();

        DocumentSplit split = new DocumentSplit();
        split.fileName = temporaryName;
        split.fileType = "corpus";
        split.startKey = new byte[] { (byte) 'z' };
        split.endKey = new byte[0];

        // Open up the file:
        IndexReaderSplitParser parser = new IndexReaderSplitParser(split);
        assertNull(parser.nextDocument());
    }

    public void testEndKey() throws FileNotFoundException, IOException {
        buildIndex();

        DocumentSplit split = new DocumentSplit();
        split.fileName = temporaryName;
        split.fileType = "corpus";
        split.startKey = new byte[0];
        split.endKey = new byte[] { (byte) 'a' };

        // Open up the file:
        IndexReaderSplitParser parser = new IndexReaderSplitParser(split);
        assertNull(parser.nextDocument());
    }
}


text:
/* to run: babel-node albums.js */

global.fetch = require('node-fetch');

import SpotifyWrapper from '../src/index';

const spotify = new SpotifyWrapper({
  token: 'BQAvnfpiNS3Jw8NA8VT56xtmHmIwyLVd9S1qLu6-zDN-hARckKKcqbsFc8U2BmDM05sjC9uulBKPLNG7mZpnDdtVw4YO13UB6R5TfOEaUbh-NteOruBzJVBRH-whR0aPTTaQvMjsM7AAuqgYRAs'
});

const albums = spotify.search.albums('Incubus');

albums.then(data => data.albums.items.map(item => console.log(item.name)));


text:
package org.jetbrains.plugins.scala.lang.structureView

import com.intellij.ide.util.FileStructureNodeProvider
import com.intellij.openapi.actionSystem.Shortcut
import elements.impl._
import com.intellij.ide.IdeBundle
import com.intellij.openapi.keymap.KeymapManager
import com.intellij.ide.util.treeView.smartTree.{ActionPresentationData, TreeElement, ActionPresentation}
import com.intellij.openapi.util.IconLoader
import org.jetbrains.plugins.scala.lang.psi.types.PhysicalSignature
import com.intellij.psi.PsiMethod
import com.intellij.ide.structureView.impl.java.PsiMethodTreeElement
import org.jetbrains.plugins.scala.lang.psi.api.toplevel.ScNamedElement
import org.jetbrains.plugins.scala.lang.psi.ScalaPsiUtil
import org.jetbrains.plugins.scala.lang.psi.api.statements.{ScTypeAlias, ScVariable, ScValue, ScFunction}
import com.intellij.openapi.project.IndexNotReadyException
import org.jetbrains.plugins.scala.extensions.{toPsiClassExt, toPsiMemberExt, toPsiNamedElementExt}
import java.util

/**
 * @author Alefas
 * @since 04.05.12
 */

class ScalaInheritedMembersNodeProvider extends FileStructureNodeProvider[TreeElement] {
  def provideNodes(node: TreeElement): util.Collection[TreeElement] = {
    node match {
      case td: ScalaTypeDefinitionStructureViewElement =>
        val children = new util.ArrayList[TreeElement]()
        val clazz = td.element
        try {
          if (!clazz.isValid) return children
          val signs = clazz.allSignatures
          for (sign <- signs) {
            sign match {
              case sign: PhysicalSignature =>
                sign.method match {
                  case x if x.name == "$tag" || x.name == "$init$" =>
                  case x if x.containingClass.qualifiedName == "java.lang.Object" =>
                  case x if x.containingClass == clazz =>
                  case x: ScFunction => children.add(new ScalaFunctionStructureViewElement(x, true))
                  case x: PsiMethod => children.add(new PsiMethodTreeElement(x, true))
                }
              case _ =>
                sign.namedElement match {
                  case named: ScNamedElement => ScalaPsiUtil.nameContext(named) match {
                    case x: ScValue if x.containingClass != clazz => children.add(new ScalaValueStructureViewElement(named.nameId, true))
                    case x: ScVariable if x.containingClass != clazz => children.add(new ScalaVariableStructureViewElement(named.nameId, true))
                    case _ =>
                  }
                  case _ =>
                }
            }
          }
          val types = clazz.allTypeAliases
          for {
            typex <- types
            t = typex._1
            if t.isInstanceOf[ScTypeAlias]
            alias = t.asInstanceOf[ScTypeAlias]
            if alias.containingClass != clazz
          } children.add(new ScalaTypeAliasStructureViewElement(alias, true))

          children
        }
        catch {
          case e: IndexNotReadyException => new util.ArrayList[TreeElement]()
        }
      case _ => new util.ArrayList[TreeElement]()
    }
  }

  def getCheckBoxText: String = IdeBundle.message("file.structure.toggle.show.inherited")

  def getShortcut: Array[Shortcut] = KeymapManager.getInstance.getActiveKeymap.getShortcuts("FileStructurePopup")

  def getPresentation: ActionPresentation = new ActionPresentationData(
    IdeBundle.message("action.structureview.show.inherited"), null, IconLoader.getIcon("/hierarchy/supertypes.png"))

  def getName: String = "SCALA_SHOW_INHERITED"
}


text:
import { mode, Styles } from "../../theme-tools"

const styles: Styles = {
  global: (props) => ({
    body: {
      fontFamily: "body",
      color: mode("neutral.900", "whiteAlpha.900")(props),
      bg: mode("white", "gray.800")(props),
      transition: "background-color 0.2s",
      lineHeight: "base",
    },
    "*::placeholder": {
      color: mode("gray.400", "whiteAlpha.400")(props),
    },
    "*, *::before, &::after": {
      borderColor: mode("gray.200", "whiteAlpha.300")(props),
      wordWrap: "break-word",
    },
  }),
}

export default styles


text:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _08EmployeeData
{
    class EmployeeData
    {
        static void Main(string[] args)
        {
            string firstName = "Amanda";
            string lastName = "Jonson";
            int age = 27;
            string gender = "f";
            long ID = 8306112507;
            int employeeNumber = 27563571;

            Console.WriteLine($"First name: {firstName}");
            Console.WriteLine($"Last name: {lastName}");
            Console.WriteLine($"Age: {age}");
            Console.WriteLine($"Gender: {gender}");
            Console.WriteLine($"Personal ID: {ID}");
            Console.WriteLine($"Unique Employee number: {employeeNumber}");
        }
    }
}


text:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
    <meta name="keywords" content="" />
    <meta name="description" content="" />

    <title>test gMoney</title>
    <meta name="link-referer" content="">
    <link href="./mocha.css" rel="stylesheet" />

</head>
<body>
    <div id="mocha">

    </div>
</body>
<script src="./chai.js"></script>
<script src="./mocha.js"></script>
<script src="../dist/1.2.0/util/G-date.js"></script>
<script src="../dist/1.2.0/util/G-num.js"></script>
<script src="../dist/1.2.0/util/G-format.js"></script>

<script type="text/javascript">
    var assert = chai.assert;
    mocha.setup('bdd');
</script>
<script src="./test.gFormat.js"></script>
<script src="./test.gNum.js"></script>
<script src="./test.gDate.js"></script>
<script type="text/javascript">
    mocha.run();
</script>
</html>


text:
__all__ = [
    'js', 'http', 'json', 'args', 'error', 'random', 'do', 'row', 'branch',
    'union', 'map', 'object', 'binary', 'uuid', 'type_of', 'info', 'range',
    'literal', 'asc', 'desc',
    'db', 'db_create', 'db_drop', 'db_list',
    'table', 'table_create', 'table_drop', 'table_list', 'grant',
    'group', 'reduce', 'count', 'sum', 'avg', 'min', 'max', 'distinct',
    'contains', 'eq', 'ne', 'le', 'ge', 'lt', 'gt', 'and_', 'or_', 'not_',
    'add', 'sub', 'mul', 'div', 'mod', 'floor', 'ceil', 'round',
    'time', 'iso8601', 'epoch_time', 'now', 'make_timezone',
    'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday',
    'sunday',
    'january', 'february', 'march', 'april', 'may', 'june',
    'july', 'august', 'september', 'october', 'november', 'december',
    'minval', 'maxval',
    'geojson', 'point', 'line', 'polygon', 'distance', 'intersects', 'circle'
]

from . import ast
from . import ql2_pb2 as p

pTerm = p.Term.TermType

#
# All top level functions defined here are the starting points for RQL queries
#

def json(*args):
    return ast.Json(*args)

def js(*args, **kwargs):
    return ast.JavaScript(*args, **kwargs)

def args(*args):
    return ast.Args(*args)

def http(url, **kwargs):
    return ast.Http(ast.func_wrap(url), **kwargs)

def error(*msg):
    return ast.UserError(*msg)

def random(*args, **kwargs):
    return ast.Random(*args, **kwargs)

def do(*args):
    return ast.FunCall(*args)

row = ast.ImplicitVar()

def table(*args, **kwargs):
    return ast.Table(*args, **kwargs)

def db(*args):
    return ast.DB(*args)

def db_create(*args):
    return ast.DbCreate(*args)

def db_drop(*args):
    return ast.DbDrop(*args)

def db_list(*args):
    return ast.DbList(*args)

def db_config(*args):
    return ast.DbConfig(*args)

def table_create(*args, **kwargs):
    return ast.TableCreateTL(*args, **kwargs)

def table_drop(*args):
    return ast.TableDropTL(*args)

def table_list(*args):
    return ast.TableListTL(*args)

def grant(*args, **kwargs):
    return ast.GrantTL(*args, **kwargs)

def branch(*args):
    return ast.Branch(*args)

def union(*args):
    return ast.Union(*args)

def map(*args):
    if len(args) > 0:
        # `func_wrap` only the last argument
        return ast.Map(*(args[:-1] + (ast.func_wrap(args[-1]), )))
    else:
        return ast.Map()

# aggregation
def group(*args):
    return ast.Group(*[ast.func_wrap(arg) for arg in args])

def reduce(*args):
    return ast.Reduce(*[ast.func_wrap(arg) for arg in args])

def count(*args):
    return ast.Count(*[ast.func_wrap(arg) for arg in args])

def sum(*args):
    return ast.Sum(*[ast.func_wrap(arg) for arg in args])

def avg(*args):
    return ast.Avg(*[ast.func_wrap(arg) for arg in args])

def min(*args):
    return ast.Min(*[ast.func_wrap(arg) for arg in args])

def max(*args):
    return ast.Max(*[ast.func_wrap(arg) for arg in args])

def distinct(*args):
    return ast.Distinct(*[ast.func_wrap(arg) for arg in args])

def contains(*args):
    return ast.Contains(*[ast.func_wrap(arg) for arg in args])

# orderBy orders
def asc(*args):
    return ast.Asc(*[ast.func_wrap(arg) for arg in args])

def desc(*args):
    return ast.Desc(*[ast.func_wrap(arg) for arg in args])

# math and logic
def eq(*args):
    return ast.Eq(*args)

def ne(*args):
    return ast.Ne(*args)

def lt(*args):
    return ast.Lt(*args)

def le(*args):
    return ast.Le(*args)

def gt(*args):
    return ast.Gt(*args)

def ge(*args):
    return ast.Ge(*args)

def add(*args):
    return ast.Add(*args)

def sub(*args):
    return ast.Sub(*args)

def mul(*args):
    return ast.Mul(*args)

def div(*args):
    return ast.Div(*args)

def mod(*args):
    return ast.Mod(*args)

def floor(*args):
    return ast.Floor(*args)

def ceil(*args):
    return ast.Ceil(*args)

def round(*args):
    return ast.Round(*args)

def not_(*args):
    return ast.Not(*args)

def and_(*args):
    return ast.And(*args)

def or_(*args):
    return ast.Or(*args)

def type_of(*args):
    return ast.TypeOf(*args)

def info(*args):
    return ast.Info(*args)

def binary(data):
    return ast.Binary(data)

def range(*args):
    return ast.Range(*args)

def time(*args):
    return ast.Time(*args)

def iso8601(*args, **kwargs):
    return ast.ISO8601(*args, **kwargs)

def epoch_time(*args):
    return ast.EpochTime(*args)

def now(*args):
    return ast.Now(*args)

class RqlConstant(ast.RqlQuery):
    def compose(self, args, optargs):
        return 'r.'+self.st

# Time enum values
monday      = type('monday', (RqlConstant,), {'tt':pTerm.MONDAY, 'st': 'monday'})()
tuesday     = type('tuesday', (RqlConstant,), {'tt':pTerm.TUESDAY, 'st': 'tuesday'})()
wednesday   = type('wednesday', (RqlConstant,), {'tt':pTerm.WEDNESDAY, 'st': 'wednesday'})()
thursday    = type('thursday', (RqlConstant,), {'tt':pTerm.THURSDAY, 'st': 'thursday'})()
friday      = type('friday', (RqlConstant,), {'tt':pTerm.FRIDAY, 'st': 'friday'})()
saturday    = type('saturday', (RqlConstant,), {'tt':pTerm.SATURDAY, 'st': 'saturday'})()
sunday      = type('sunday', (RqlConstant,), {'tt':pTerm.SUNDAY, 'st': 'sunday'})()

january     = type('january', (RqlConstant,), {'tt':pTerm.JANUARY, 'st': 'january'})()
february    = type('february', (RqlConstant,), {'tt':pTerm.FEBRUARY, 'st': 'february'})()
march       = type('march', (RqlConstant,), {'tt': pTerm.MARCH, 'st': 'march'})()
april       = type('april', (RqlConstant,), {'tt': pTerm.APRIL, 'st': 'april'})()
may         = type('may', (RqlConstant,), {'tt': pTerm.MAY, 'st': 'may'})()
june        = type('june', (RqlConstant,), {'tt': pTerm.JUNE, 'st': 'june'})()
july        = type('july', (RqlConstant,), {'tt': pTerm.JULY, 'st': 'july'})()
august      = type('august', (RqlConstant,), {'tt': pTerm.AUGUST, 'st': 'august'})()
september   = type('september', (RqlConstant,), {'tt': pTerm.SEPTEMBER, 'st': 'september'})()
october     = type('october', (RqlConstant,), {'tt': pTerm.OCTOBER, 'st': 'october'})()
november    = type('november', (RqlConstant,), {'tt': pTerm.NOVEMBER, 'st': 'november'})()
december    = type('december', (RqlConstant,), {'tt': pTerm.DECEMBER, 'st': 'december'})()

minval      = type('minval', (RqlConstant,), {'tt': pTerm.MINVAL, 'st': 'minval'})()
maxval      = type('maxval', (RqlConstant,), {'tt': pTerm.MAXVAL, 'st': 'maxval'})()

def make_timezone(*args):
    return ast.RqlTzinfo(*args)

# Merge values
def literal(*args):
    return ast.Literal(*args)

def object(*args):
    return ast.Object(*args)

def uuid(*args):
    return ast.UUID(*args)

# Global geospatial operations
def geojson(*args):
    return ast.GeoJson(*args)

def point(*args):
    return ast.Point(*args)

def line(*args):
    return ast.Line(*args)

def polygon(*args):
    return ast.Polygon(*args)

def distance(*args, **kwargs):
    return ast.Distance(*args, **kwargs)

def intersects(*args):
    return ast.Intersects(*args)

def circle(*args, **kwargs):
    return ast.Circle(*args, **kwargs)


text:
module(..., package.seeall)

local util     = require "tundra.util"
local nodegen  = require "tundra.nodegen"
local depgraph = require "tundra.depgraph"

local _csbase_mt = nodegen.create_eval_subclass {
  DeclToEnvMappings = {
    References = "CSLIBS",
    RefPaths = "CSLIBPATH",
  },
}

local _csexe_mt = nodegen.create_eval_subclass({
  Label = "CSharpExe $(@)",
  Suffix = "$(CSPROGSUFFIX)",
  Action = "$(CSCEXECOM)"
}, _csbase_mt)

local _cslib_mt = nodegen.create_eval_subclass({
  Label = "CSharpLib $(@)",
  Suffix = "$(CSLIBSUFFIX)",
  Action = "$(CSCLIBCOM)"
}, _csbase_mt)

local csSourceExts = { ".cs" }
local csResXExts = { ".resx" }

local function setup_refs_from_dependencies(env, dep_nodes, deps)
  local dll_exts = { env:interpolate("$(CSLIBSUFFIX)") }
  local refs = {}
  local parent_env = env:get_parent()
  for _, x in util.nil_ipairs(dep_nodes) do
    if x.Keyword == "CSharpLib" then
      local outputs = {}
      local dag = x:get_dag(parent_env)
      deps[#deps + 1] = dag
      dag:insert_output_files(refs, dll_exts)
    end
  end
  for _, r in ipairs(refs) do
    env:append("CSLIBS", r)
  end
end

local function setup_resources(generator, env, assembly_name, resx_files, pass)
  local result_files = {}
  local deps = {}
  local i = 1
  for _, resx in util.nil_ipairs(resx_files) do
    local basename = path.get_filename_base(resx)
    local result_file = string.format("$(OBJECTDIR)/_rescompile/%s.%s.resources", assembly_name, basename)
    result_files[i] = result_file
    deps[i] = depgraph.make_node {
      Env         = env,
      Pass        = pass,
      Label       = "resgen $(@)",
      Action      = "$(CSRESGEN)",
      InputFiles  = { resx },
      OutputFiles = { result_file },
    }
    env:append("CSRESOURCES", result_file)
    i = i + 1
  end
  return result_files, deps
end

function _csbase_mt:create_dag(env, data, deps)
  local sources = data.Sources
  local resources = data.Resources or {}
  for _, r in util.nil_ipairs(resources) do
    env:append("CSRESOURCES", r)
  end

  sources = util.merge_arrays_2(sources, resources)

  setup_refs_from_dependencies(env, data.Depends, deps)

  return depgraph.make_node {
    Env          = env,
    Pass         = data.Pass,
    Label        = self.Label,
    Action       = self.Action,
    InputFiles   = sources,
    OutputFiles  = { nodegen.get_target(data, self.Suffix, self.Prefix) },
    Dependencies = util.uniq(deps),
  }
end

do
  local csblueprint = {
    Name = {
      Required = true,
      Help = "Set output (base) filename",
      Type = "string",
    },
    Sources = {
      Required = true,
      Help = "List of source files",
      Type = "source_list",
      ExtensionKey = "DOTNET_SUFFIXES",
    },
    Resources = {
      Help = "List of resource files",
      Type = "source_list",
      ExtensionKey = "DOTNET_SUFFIXES_RESOURCE",
    },
    Target = {
      Help = "Override target location",
      Type = "string",
    },
  }

  nodegen.add_evaluator("CSharpExe", _csexe_mt, csblueprint)
  nodegen.add_evaluator("CSharpLib", _cslib_mt, csblueprint)
end