-family: 'Noto Sans TC';
  font-style: normal;
  font-weight: 400;
  src: url(/fonts/noto-sans-tc-107-v35.woff2) format('woff2');
  unicode-range: U+a5, U+25ce, U+4e56, U+4e9a, U+4ea8, U+4ead, U+4f3a, U+4f51, U+4f62, U+4faf, U+5098, U+50ac, U+5147, U+5173, U+5187, U+51f8, U+52a1, U+52a8, U+52f8, U+535c, U+53ed, U+541e, U+5435, U+5475, U+54a9, U+54c0, U+54c7, U+5589, U+5605, U+5733, U+5764, U+5782, U+57c3, U+5858, U+5893, U+589c, U+58e2, U+5974, U+599e, U+59a8, U+59ec, U+5b66, U+5b99, U+5b9d, U+5bee, U+5c2c, U+5c65, U+5cfd, U+5d0e, U+5dba, U+5de2, U+5e06, U+5e15, U+5ec1, U+5ed6, U+5f00, U+5f4c, U+5f65, U+6055, U+6070, U+609f, U+60b6, U+6241, U+624e, U+626f, U+6291, U+62cc, U+62d8, U+62da, U+62fe, U+6349, U+6367, U+63ea, U+6435, U+6454, U+64a4, U+64b2, U+64bc, U+64bf, U+64c5, U+64ce, U+6558, U+6572, U+65a5, U+65e8, U+65ed, U+6614, U+6670, U+6688, U+672d, U+673a, U+6770, U+68cb, U+6912, U+6953, U+6a61, U+6aac, U+6aaf, U+6ab8, U+6b20, U+6b96, U+6bbf, U+6bc5, U+6c6a, U+6cbe, U+6d59, U+6d78, U+6dc7, U+6deb, U+6e7e, U+6e9c, U+6f3f, U+6f51, U+6f84, U+704c, U+7051, U+70ab, U+70ad, U+70f9, U+7119, U+7149, U+714e, U+71e6, U+72c4, U+72d0, U+72e0, U+7334, U+744b, U+7455, U+7504, U+75ab, U+75b2, U+766e, U+76c3, U+76fc, U+76fe, U+7891, U+7948, U+7a74, U+7b28, U+7c72, U+7cca, U+7ebf, U+7f55, U+7ff0, U+8154, U+81c2, U+81d8, U+81e3, U+81e5, U+8292, U+8299, U+8302, U+8304, U+8332, U+83c1, U+83c7, U+83ca, U+845b, U+8475, U+8490, U+85af, U+8650, U+8667, U+86d9, U+8774, U+8abc, U+8b0e, U+8b39, U


t context, Map<String, List<String>> params) =>
      PageNotFound(),
);

// 相册页面
var albumHandler = new Handler(
  handlerFunc: (BuildContext context, Map<String, List<String>> params) =>
      AlbumPage(),
);

// 设置页面
var settingHandler = new Handler(
  handlerFunc: (BuildContext context, Map<String, List<String>> params) =>
      SettingPage(),
);

// 上传页面
var preUploadHandler = new Handler(
  handlerFunc: (context, parameters) {
    final assets = context.settings.arguments as List<AssetEntity>;

    return HandleUploadPage(assets);
  },
);

// 图床设置页面
var pbsettingHandler = new Handler(
  handlerFunc: (BuildContext context, Map<String, List<String>> params) =>
      PBSettingPage(),
);

// Github图床设置页面
var pbsettingGithubHandler = new Handler(
  handlerFunc: (BuildContext context, Map<String, List<String>> params) =>
      GithubPage(),
);

// Github仓库列表页面
var pbsettingGithubRepoHandler = new Handler(
  handlerFunc: (BuildContext context, Map<String, List<String>> params) {
    var path = params["path"]?.first;
    var prePath = params["prePath"]?.first;
    return GithubRepoPage(
      path: (path == null || path == '') ? '/' : Uri.decodeComponent(path),
      prePath: (prePath == null || prePath == '')
          ? ''
          : Uri.decodeComponent(prePath),
    );
  },
);

// SM.MS设置页面
var pbsettingSMMSHandler = new Handler(
    handlerFunc: (BuildContext context, Map<String, List<String>> params) =>
        SMMSPage());

// SM.MS 仓库列表页面
var pbsettingSMMSRepoHandler = new Handler(
    handlerFunc: (BuildContext context, Map<String, List<String>> params) =>
        SMMSRepoPage());

// Gitee设置页面
var pbsettingGiteeHandler = new Handler(
  handlerFunc: (BuildContext context, Map<String, List<String>> params) =>
      GiteePage(),
);

// Gitee仓库列表页面
var pbsettingGiteeRepoHandler = new Handler(
  handlerFunc: (BuildContext context, Map<String, List<String>> params) {
    var path = params["path"]?.first;
    var prePath = params["prePath"]?.first;
    return GiteeRepoPage(
      path: (path == null || path == '') ? '/' : Uri.decodeComponent(path),
      prePath: (prePath == null || prePath == '')
          ? ''
          : Uri.decodeComponent(prePath),
    );
  },
);

// 七牛图床设置页面
var pbsettingQiniuHandler = new Handler(
  handlerFunc: (BuildContext context, Map<String, List<String>> params) =>
      QiniuPage(),
);

// 七牛图床管理页面
var pbsettingQiniuRepoHandler = new Handler(
  handlerFunc: (BuildContext context, Map<String, List<String>> params) {
    var prefix = params["path"]?.first;
    return QiniuRepoPage(
      prefix:
          (prefix == null || prefix == '') ? '/' : Uri.decodeComponent(prefix),
    );
  },
);

// 阿里云OSS图床设置页面
var pbsettingAliyunHandler = new Handler(
  handlerFunc: (context, parameters) => AliyunPage(),
);

// 腾讯云COS图床设置页


```l4
§ `Fibonacci function`

GIVEN n IS A NUMBER
GIVETH A NUMBER
DECIDE fibNaive n IS
  IF n EQUALS 0
  THEN 0
  ELSE IF n EQUALS 1
  THEN 1
  ELSE fibNaive (n - 1) + fibNaive (n - 2)

#EVAL fibNaive 20
```

## IDE Affordances

### Jump To Definition and References

Legal drafters may also appreciate VS Code's native "jump to definition" and "jump to references" features, available with a right-click on an expression of interest.

### Decision Logic Visualizer

Click on "visualize" to see a visual representation of a given Boolean function, as a circuit. "OR" disjunctions are represented as parallel circuits. "AND" conjunctions are represented as series circuits.

### Future Features

Asyndetic conjunction operator: `..` instead of "AND" for readability.

Strings to be allowed in Boolean expressions as non-valuatable visible comments.

Three carets together will mean "repeat everything above to the end of the line".

Syntax and semantics for regulative rules.

Syntax and semantics for property assertions and bounded deontics. Transpilation to verification reasoner backends: UPPAAL, NuSMV, SPIN, Maude, Isabelle/HOL, Lean.

Transpilation to automatic web app generation.

Set-theoretic syntax for UNION and INTERSECT. Sometimes set-and means logical-or.

WHEN should not be needed at each line in a CONSIDER.

## Conclusion

This guide provides an overview of the L4 language, including its syntax and semantics. For more detailed examples and advanced features, refer to the sample programs provided in the `examples` directory.
# L4 Language Glossary

## A

- [**Algebraic Types**](30-algebraic-types.md#algebraic-types) - Ways to combine and structure data types
- [**Annotations**](20-basic-syntax.md#textual-annotations) - Paratextual information enclosed in `[square brackets]`
- [**AND**](10-boolean-logic.md#boolean-logic) - Logical conjunction operator
- [**ASSUME**](guide-index.md#assume) - Declares a variable with a specific type
- [**AT**](regulative.md#temporal-operators) - Temporal operator for specifying time points
- [**AT LEAST**](default-logic.md#default-reasoning) - Operator for minimum quantity conditions `>=`
- [**AT MOST**](default-logic.md#default-reasoning) - Operator for maximum quantity conditions `<=`

## B

- [**Basic Data Types**](10-data-types.md#basic-data-types) - Core data types including booleans, strings, numbers, and records
- [**Booleans**](10-data-types.md#booleans) - Basic true/false values represented as `TRUE` and `FALSE`
- [**Boolean Logic**](10-boolean-logic.md#boolean-logic) - Logical operators and conditional logic
- [**BY**](regulative.md#regulative-rules) - Specifies the method or means of an action

## C

- [**Comments**](20-basic-syntax.md#comments) - Single-line comments `--` or block comments `{- ... -}`
- [**Conditional Logic**](10-boolean-logic.md#boolean-logic) - IF/THEN/ELSE structures
- [**CONSIDER**](10-data-types.md#destructuring-with-consider) - Pattern matching operator for type matching
- [**DECIDE**](25-functions.md#functions) - Keyword for defining decision functions
- [**DIVIDED BY**](10-data-types.md#numbers) - Division operator for numbers `÷`

## D

- [**Days and Dates**](libraries/daydate.md) - Library with functions for day and date math
- [**Default Logic**](default-logic.md#default-logic) - Predefined values and their handling
- [**Default Reasoning**](default-logic.md#default-re


using System;
using System.Linq;
using Terminal.Gui;
using Terminal.Gui.Views;
using TerminalGuiDesigner;
using TerminalGuiDesigner.Operations.TabOperations;

namespace UnitTests.Operations;

internal class MoveTabOperationTests : Tests
{
    [Test]
    public void TestMoveTab_WrongViewType_Throws()
    {
        // Label is not a TabView so should get Exception
        RoundTrip<Window, Label>((d, v) =>
        {
            ClassicAssert.Throws<ArgumentException>(()=>new MoveTabOperation(d,new Tab(), 1));
        }, out _);
    }

    [Test]
    public void TestMoveTab_OnlyOneTab_IsImpossible()
    {
        RoundTrip<Window, TabView>((d, v) =>
        {
            ClassicAssert.AreEqual(2, v.Tabs.Count, $"Expected {nameof(ViewFactory)} to create a {nameof(TabView)} with 2 example placeholder tabs");
            v.RemoveTab(v.Tabs.ElementAt(1));
            ClassicAssert.AreEqual(1, v.Tabs.Count);

            ClassicAssert.IsTrue(new MoveTabOperation(d, v.SelectedTab, 1).IsImpossible,"Should be impossible to move tab when there is only one of them");
        }, out _);
    }

    [TestCase(3,-8,0,true)] // move left lots
    [TestCase(3, 55, 5, true)] // move right lots
    [TestCase(0, 0, 0, false)] // move 0 nowhere
    [TestCase(0, 1, 1, true


the Airstrip
    .accept 31776 >>Accept Strongarm Tactics
    .target General Nazgrim
step
    .goto 371,31.41,21.77
    >>|Tinterface/worldmap/chatbubble_64grey.blp:20|tTalk to |cRXP_FRIENDLY_Merchant Zin|r.
    .accept 31778 >>Accept Unreliable Allies
    .target Merchant Zin
step
    .goto 371,31.13,21.58
    >>|Tinterface/worldmap/chatbubble_64grey.blp:20|tTalk to |cRXP_FRIENDLY_Rivett Clutchpop|r.
    .accept 31777 >>Accept Choppertunity
    .target Rivett Clutchpop
-- PERMOK: WORK IN PROGRESS
step
    #completewith Cogswing
    #completewith Grimhatchet
    #hidewindow
    #loop
    .goto 371,29.66,23.11,15,0
    .goto 371,30.32,24.38,15,0
    .goto 371,29.66,23.11,0
    .goto 371,30.32,24.38,0
    +1
step
    #completewith MorgusGrimhatchet
    >>Kill |cRXP_ENEMY_Strongarm troop|r.
    .complete 31775,1 --15/15 Strongarm troop slain
    .mob Strongarm troop
step
    #completewith MorgusGrimhatchet
    >>|Tinterface/worldmap/chatbubble_64grey.blp:20|tTalk to |cRXP_FRIENDLY_Pandaren Volunteers|r.
    .skipgossip 65974,1
    .skipgossip 67090,1
    .complete 31778,1 --12/12 Indentured Pandaren freed
    .target Pandaren Volunteer
step
    #completewith next
    #label Cogswing
    >>Kill |cRXP_ENEMY_Master Engineer Cogswing|r and |cRXP_ENEMY_Gyro-Mechanic Lavenderp|r.
    .complete 31776,1 --1/1 Master Engineer Cogswing slain
    .complete 31776,2 --1/1 Gyro-Mechanic Lavenderp slain
    .mob Master Engineer Cogswing
    .mob Gyro-Mechanic Lavenderp
step
    #completewith Cogswing
    #label Grimhatchet
    >>Kill |cRXP_ENEMY_Morgus Grimhatchet|r.
    .complete 31776,3 --1/1 Morgus Grimhatchet slain
    .mob Morgus Grimhatchet
step
    #requires Grimhatchet
    #optional
    >>Kill |cRXP_ENEMY_Master Engineer Cogswing|r and |cRXP_ENEMY_Gyro-Mechanic Lavenderp|r.
    .goto 371,30.32,24.38
    .complete 31776,1 --1/1 Master Engineer Cogswing slain
    .complete 31776,2 --1/1 Gyro-Mechanic Lavenderp slain
    .mob Master Engineer Cogswing
    .mob Gyro-Mechanic Lavenderp
step
    #optional
    #label MorgusGrimhatchet
    >>Kill |cRXP_ENEMY_Morgus Grimhatchet|r.
    .goto 371,29.66,23.11
    .complete 31776,3 --1/1 Morgus Grimhatchet slain
    .mob Morgus Grimhatchet
step
    #completewith CorporalJacksonSilver
    >>Kill |cRXP_ENEMY_Strongarm troop|r.
    .complete 31775,1 --15/15 Strongarm troop slain
    .mob Strongarm troop
step
    #completewith CorporalJacksonSilver
    >>|Tinterface/worldmap/chatbubble_64grey.blp:20|tTalk to |cRXP_FRIENDLY_Pandaren


to contain numbers.");this.coords=t;const r=Math.max(2*n-5,0);this._triangles=new Uint32Array(r*3),this._halfedges=new Int32Array(r*3),this._hashSize=Math.ceil(Math.sqrt(n)),this._hullPrev=new Uint32Array(n),this._hullNext=new Uint32Array(n),this._hullTri=new Uint32Array(n),this._hullHash=new Int32Array(this._hashSize).fill(-1),this._ids=new Uint32Array(n),this._dists=new Float64Array(n),this.update()}update(){const{coords:t,_hullPrev:n,_hullNext:r,_hullTri:l,_hullHash:i}=this,o=t.length>>1;let a=1/0,s=1/0,u=-1/0,c=-1/0;for(let T=0;T<o;T++){const M=t[2*T],O=t[2*T+1];M<a&&(a=M),O<s&&(s=O),M>u&&(u=M),O>c&&(c=O),this._ids[T]=T}const d=(a+u)/2,f=(s+c)/2;let p=1/0,h,g,b;for(let T=0;T<o;T++){const M=uT(d,f,t[2*T],t[2*T+1]);M<p&&(h=T,p=M)}const v=t[2*h],m=t[2*h+1];p=1/0;for(let T=0;T<o;T++){if(T===h)continue;const M=uT(v,m,t[2*T],t[2*T+1]);M<p&&M>0&&(g=T,p=M)}let y=t[2*g],x=t[2*g+1],_=1/0;for(let T=0;T<o;T++){if(T===h||T===g)continue;const M=CXe(v,m,y,x,t[2*T],t[2*T+1]);M<_&&(b=T,_=M)}let w=t[2*b],S=t[2*b+1];if(_===1/0){for(let O=0;O<o;O++)this._dists[O]=t[2*O]-t[0]||t[2*O+1]-t[1];Sd(this._ids,this._dists,0,o-1);const T=new Uint32Array(o);let M=0;for(let O=0,D=-1/0;O<o;O++){const P=this._ids[O];this._dists[P]>D&&(T[M++]=P,D=this._dists[P])}this.hull=T.subarray(0,M),this.triangles=new Uint32Array(0),this.halfedges=new Uint32Array(0);return}if(V0(v,m,y,x,w,S)){const T=g,M=y,O=x;g=b,y=w,x=S,b=T,w=M,S=O}const k=MXe(v,m,y,x,w,S);this._cx=k.x,this._cy=k.y;for(let T=0;T<o;T++)this._dists[T]=uT(t[2*T],t[2*T+1],k.x,k.y);Sd(this._ids,this._dists,0,o-1),this._hullStart=h;let C=3;r[h]=n[b]=g,r[g]=n[h]=b,r[b]=n[g]=h,l[h]=0,l[g]=1,l[b]=2,i.fill(-1),i[this._hash


            y_position = y_position + (child.getTotalSize and ({child:getTotalSize()})[2] or height)
            y_position = y_position + gap
        end
    elseif self.align == "space-evenly" then
        local y_position = 0
        local total_height = self:calculateTotalSize()
        local gap = (self.parent.height - total_height) / (#self:getComponents() + 1)
        for _, child in ipairs(self:getComponents()) do
            y_position = y_position + gap
            child.y = child.y + y_position
            local _, height = child:getScaledSize()
            y_position = y_position + (child.getTotalSize and ({child:getTotalSize()})[2] or height)
            y_position = y_position + gap
        end
    end
end

function VerticalLayout:calculateTotalSize()
    local y_position = 0
    for index, child in ipairs(self:getComponents()) do
        local _, height = child:getScaledSize()
        y_position = y_position + (child.getTotalSize and ({child:getTotalSize()})[2] or height)
        if index ~= #self:getComponents() then
            y_position = y_position + self.gap
        end
    end
    return y_position
end

function VerticalLayout:draw()
    love.graphics.setColor(1,0,1,0.25)
    if self.align == "start" then
        local y_position = self:calculateTotalSize()
        Draw.rectangle("stripes", 0, y_position, self.parent.width, self.parent.height - y_position)
        Draw.rectangle("line", 0, y_position, self.parent.width, self.parent.height - y_position)
    elseif self.align == "end" then
        local y_position = self:calculateTotalSize()
        Draw.rectangle("stripes", 0, 0, self.parent.width, self.parent.height - y_position)
        Draw.rectangle("line", 0, 0, self.parent.width, self.parent.height - y_position)
    elseif self.align == "center" then
        -- top and bottom
        local y_position = self:calculateTotalSize()
        Draw.rectangle("stripes", 0, 0, self.parent.width, (self.parent.height - y_position) / 2)
        Draw.rectangle("line", 0, 0, self.parent.width, (self.parent.height - y_position) / 2)
        Draw.rectangle("stripes", 0, self.parent.height - (self.parent.height - y_position) / 2, self.parent.width, (self.parent.height - y_position) / 2)
        Draw.rectangle("line", 0, self.parent.height - (self.parent.height - y_position) / 2, self.parent.width, (self.parent.height - y_position) / 2)
    end
end

return VerticalLayout


s disposed.
   */
  readonly disposed: ISignal<this, void>;

  /**
   * Get the length of the items in the model.
   */
  get length(): number {
    return this.list ? this.list.length : 0;
  }

  /**
   * Test whether the model is disposed.
   */
  get isDisposed(): boolean {
    return this.list === null;
  }

  /**
   * Dispose of the resources used by the model.
   */
  dispose(): void {
    if (this.isDisposed) {
      return;
    }
    let list = this.list;
    this.list = null;
    list.clear();
    this.disposed.emit(void 0);
    clearSignalData(this);
  }

  /**
   * Get an item at the specified index.
   */
  get(index: number): OutputAreaModel.Output {
    return this.list.at(index);
  }

  /**
   * Add an output, which may be combined with previous output.
   *
   * #### Notes
   * The output bundle is copied.
   * Contiguous stream outputs of the same `name` are combined.
   */
  add(output: OutputAreaModel.Output): number {
    // If we received a delayed clear message, then clear now.
    if (this.clearNext) {
      this.clear();
      this.clearNext = false;
    }
    if (output.output_type === 'input_request') {
      this.list.pushBack(output);
    }

    // Make a copy of the output bundle.
    let value = JSON.parse(JSON.stringify(output)) as nbformat.IOutput;

    // Join multiline text outputs.
    if (value.output_type === 'stream') {
      if (Array.isArray(value.text)) {
        value.text = (value.text as string[]).join('\n');
      }
    }

    // Consolidate outputs if they are stream outputs of the same kind.
    let index = this.length - 1;
    let lastOutput = this.get(index);
    if (value.output_type === 'stream'
        && lastOutput && lastOutput.output_type === 'stream'
        && value.name === lastOutput.name) {
      // In order to get a list change event, we add the previous
      // text to the current item and replace the previous item.
      // This also replaces the metadata of the last item.
      let text = value.text as string;
      value.text = lastOutput.text as string + text;
      this.list.set(index, value);
      return index;
    } else {
      switch (value.output_type) {
      case 'stream':
      case 'execute_result':
      case 'display_data':
      case 'error':
        return this.list.pushBack(value);
      default:
        break;
      }
    }
    return -1;
  }

  /**
   * Clear all of the output.
   *
   * @param wait Delay clearing the output until the next message is added.
   */
  clear(wait: boolean = false): void {
    if (wait) {
      this.clearNext = true;
      return;
    }
    this.list.clear();
  }

  /**
   * Add a mime type to an output data bundle.
   *
   * @param output - The output to augment.
   *
   * @param mimetype - The mimetype to add.
   *
   * @param value - The value to add.
   *
   * #### Notes
   * The output must be contained in the model, or an error will be thrown.
   * Only non-existent types can be added.
   * Types are validated before being added.
   */
  addMimeData(output: nbformat.IDisplayData | nbformat.IExecuteResult, mimetype: string, value: string | JSONObject): void {
    let index = indexOf(this.list, output);
    if (index === -1) {
      throw new Error(`Cannot add data to non-tracked bundle`);
    }
    if (m


.72.72 0 00-.86.3l-2.8 4.85a.71.71 0 00.17.9l2.95 2.32A10.24 10.24 0 0013.5 24a12.44 12.44 0 00.09 1.37l-2.95 2.31a.7.7 0 00-.17.9l2.8 4.85a.7.7 0 00.86.3l3.48-1.41A10 10 0 0020 33.7l.52 3.71a.72.72 0 00.7.59h5.6a.71.71 0 00.69-.59L28 33.7a9.86 9.86 0 002.37-1.38l3.49 1.41a.69.69 0 00.85-.3l2.8-4.85a.7.7 0 00-.17-.9ZM24 28.9a4.9 4.9 0 114.9-4.9 4.9 4.9 0 01-4.9 4.9Z"/></svg>';
  static const String appops =
      '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48"><path fill="currentColor" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="m38.18 11.78 2.45-2.41a2.85 2.85 0 000-4v0a2.87 2.87 0 00-4 0l-2.46 2.41a17.41 17.41 0 00-20.34 0L11.4 5.36a2.88 2.88 0 00-4.06 0v0a2.85 2.85 0 000 4l2.44 2.41A17.39 17.39 0 006.51 22v19.66a1.84 1.84 0 001.84 1.84h31.3a1.84 1.84 0 001.84-1.84V22a17.42 17.42 0 00-3.31-10.22Zm-21.54 13a3.22 3.22 0 113.22-3.22 3.22 3.22 0 01-3.22 3.21Zm14.72 0a3.22 3.22 0 113.22-3.22 3.22 3.22 0 01-3.22 3.21Z"/><path fill="currentColor" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M28.14 34.36a3.31 3.31 0 000-.55 3.27 3.27 0 000-.54l1.19-.92a.29.29 0 00.06-.36l-1.11-1.94a.28.28 0 00-.34-.12l-1.39.57a4.28 4.28 0 00-.95-.5l-.21-1.48a.29.29 0 00-.28-.24h-2.23a.28.28 0 00-.27.24L22.4 30a3.92 3.92 0 00-.95.55l-1.39-.57a.3.3 0 00-.34.12L18.61 32a.29.29 0 00.06.36l1.18.92a3.73 3.73 0 000 1.09l-1.18.92a.29.29 0 00-.06.36l1.11 1.93a.28.28 0 00.34.12l1.39-.56a4.28 4.28 0 00.95.55l.21 1.48a.27.27 0 00.27.23h2.23a.28.28 0 00.28-.23l.21-1.48a3.86 3.86 0 00.94-.55l1.39.56a.27.27 0 00.34-.12l1.12-1.93a.28.28 0 00-.07-.36ZM24 35.77a2 2 0 111.95-2 2 2 0 01-1.95 2Z"/></svg>';
  static const String appopsx =
      '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"


Shadow: [
                      BoxShadow(
                        color: Colors.black26,
                        blurRadius: 8,
                        offset: Offset(0, 2),
                      ),
                    ],
                  ),
                  child: Text(
                    _formatLikeCount(widget.likeCount!),
                    style: TextStyle(
                      color: Colors.white,
                      fontWeight: FontWeight.bold,
                      fontSize: 12,
                    ),
                  ),
                ),
              ),
          ],
        ),
      ),
    );
  }

  /// Format like count for display (e.g., 1.2K, 1.5M)
  String _formatLikeCount(int count) {
    if (count < 1000) return count.toString();
    if (count < 1000000) {
      return '${(count / 1000).toStringAsFixed(1)}K';
    }
    return '${(count / 1000000).toStringAsFixed(1)}M';
  }

  @override
  void dispose() {
    _heartController.dispose();
    _fireworksController.dispose();
    super.dispose();
  }
}

/// 🎆 Firework Particle Model
///
/// Represents a single firework particle with physics properties
class FireworkParticle {
  final double angle;      // Launch angle in radians
  final double velocity;   // Initial velocity
  final Color color;       // Particle color
  final double size;       // Particle size
  final double life;       // Particle lifetime (0.0 to 1.0)

  FireworkParticle({
    required this.angle,
    required this.velocity,
    required this.color,
    required this.size,
    required this.life,
  });
}

/// 🎨 Custom Fireworks Painter
///
/// Renders beautiful firework particles with realistic physics
class FireworksPainter extends CustomPainter {
  final List<FireworkParticle> particles;
  final double progress;

  FireworksPainter({
    required this.particles,
    required this.progress,
  });

  @override
  void paint(Canvas canvas, Size size) {
    final center = Offset(size.width / 2, size.height / 2);

    for (final particle in particles) {
      // Calculate particle position based on physics
      final time = progress * particle.life;
      final distance = particle.velocity * time;

      // Apply gravity effect
      final gravity = 200.0 * time * time;

      final x = center.dx + distance * math.cos(particle.angle);
      final y = center.dy + distance * math.sin(particle.angle) + gravity;

      // Calculate particle opacity (fades out over time)
      final opacity = (1.0 - progress).clamp(0.0, 1.0);

      // Create gradient effect for particles
      final paint = Paint()
        ..shader = RadialGradient(
          colors: [
            particle.color.withOpacity(opacity),
            particle.color.withOpacity(opacity * 0.3),
            Colors.transparent,
          ],
        ).createShader(Rect.fromCircle(
          center: Offset(x, y),
          radius: particle.size,
        ));

      // Draw particle with trail effect
      canvas.drawCircle(
        Offset(x, y),
        particle.size * (1.0 - progress * 0.5),
        paint,
      );

      // Add sparkle effect for extra magic
      if (progress < 0.6 && opacity > 0.5) {
        final sparklePaint = Paint()
          ..color = Colors.white.withOpacity(opacity * 0.8)
          ..strokeWidth = 1.0;

        canvas.drawLine(
          Offset(x - 2, y),
          Offset(x + 2, y),
          sparklePaint,
        );
        canvas.drawLine(
          Offset(x, y - 2),
          Offset(x, y + 2),
          sparklePaint,
        );
      }
    }
  }

  @override
  bool shouldRepaint(FireworksPainter oldDelegate) {
    return oldDelegate.progress != progress;
  }
}im


0,6,0,2

Lme_531:
	.align 2
Lm_532:
m_Mono_Security_Protocol_Tls_RecordProtocol_ProcessAlert_Mono_Security_Protocol_Tls_AlertLevel_Mono_Security_Protocol_Tls_AlertDescription:
_m_532:

	.byte 13,192,160,225,128,64,45,233,13,112,160,225,0,89,45,233,24,208,77,226,13,176,160,225,4,0,139,229,8,16,203,229
	.byte 12,32,203,229,8,0,219,229,0,0,203,229,8,0,219,229,1,0,80,227,13,0,0,10,0,0,219,229,2,0,80,227
	.byte 10,0,0,26,0,0,159,229,0,0,0,234
	.long mono_aot_Mono_Security_got - . + 2412
	.byte 0,0,159,231
bl p_7

	.byte 16,0,139,229,8,16,219,229,12,32,219,229
bl p_593

	.byte 16,0,155,229
bl p_14

	.byte 12,0,219,229,1,0,203,229,12,0,219,229,0,0,80,227,4,0,0,26,4,0,155,229,12,0,144,229,0,224,144,229
	.byte 1,16,160,227,105,16,192,229,24,208,139,226,0,9,189,232,8,112,157,229,0,160,157,232

Lme_532:
	.align 2
Lm_533:
m_Mono_Security_Protocol_Tls_RecordProtocol_SendAlert_Mono_Security_Protocol_Tls_AlertDescription:
_m_533:

	.byte 13,192,160,225,128,64,45,233,13,112,160,225,0,89,45,233,16,208,77,226,13,176,160,225,0,0,139,229,4,16,203,229
	.byte 0,0,159,229,0,0,0,234
	.long mono_aot_Mono_Security_got - . + 2552
	.byte 0,0,159,231
bl p_35

	.byte 8,0,139,229,4,16,219,229
bl _m_46e

	.byte 8,16,155,229,0,0,155,229
bl p_594

	.byte 16,208,139,226,0,9,189,232,8,112,157,229,0,160,157,232

Lme_533:
	.align 2
Lm_534:
m_Mono_Security_Protocol_Tls_RecordProtocol_SendAlert_Mono_Security_Protocol_Tls_AlertLevel_Mono_Security_Protocol_Tls_AlertDescription:
_m_534:

	.byte 13,192,160,225,128,64,45,233,13,112,160,225,0,89,45,233,24,208,77,226,13,176,160,225,0,0,139,229,4,16,203,229
	.byte 8,32,203,229,0,0,159,229,0,0,0,234
	.long mono_aot_Mono_Security_got - . + 2552
	.byte 0,0,159,231
bl p_35

	.byte 16,0,139,229,4,16,219,229,8,32,219,229
bl _m_46f

	.byte 16,16,155,229,0,0,155,229
bl p_


rflDnon_i09", 0.01, "AidlPercMstpSrasWrflDnon_i10", 0.01, "AidlPercMstpSrasWrflDnon_i11", 0.01, "AidlPercMstpSrasWrflDnon_i12", 0.001, "AidlPercMstpSrasWrflDnon_i13", 0.001, "AidlPercMstpSrasWrflDnon_idleSteady01N", 0.22, "AidlPercMstpSrasWrflDnon_idleSteady02N", 0.22, "AidlPercMstpSrasWrflDnon_idleSteady03N", 0.22, "AidlPercMstpSrasWrflDnon_idleSteady04N"};
			variantAfter[] = {0, 0, 0};
			collisionShape = "ca\Anims\Characters\data\Geom\Sdr\Perc_Idle.p3d";
			canPullTrigger = 0;
			ConnectTo[] = {"AidlPercMstpSrasWrflDnon", 0.02, "AidlPercMstpSrasWrflDnon01", 0.01, "AidlPercMstpSrasWrflDnon02", 0.01, "AidlPercMstpSrasWrflDnon03", 0.01, "AidlPercMstpSrasWrflDnon04", 0.01, "AidlPercMstpSrasWrflDnon_i01", 0.01, "AidlPercMstpSrasWrflDnon_i02", 0.01, "AidlPercMstpSrasWrflDnon_i03", 0.01, "AidlPercMstpSrasWrflDnon_i04", 0.01, "AidlPercMstpSrasWrflDnon_i05", 0.01, "AidlPercMstpSrasWrflDnon_i06", 0.01, "AidlPercMstpSrasWrflDnon_i07", 0.01, "AidlPercMstpSrasWrflDnon_i08", 0.01, "AidlPercMstpSrasWrflDnon_i09", 0.01, "AidlPercMstpSrasWrflDnon_i10", 0.01, "AidlPercMstpSrasWrflDnon_i11", 0.01, "AidlPercMstpSrasWrflDnon_i12", 0.01, "AidlPercMstpSrasWrflDnon_i13", 0.01, "AidlPercMstpSrasWrflDnon_idleSteady01N", 0.01, "AidlPercMstpSrasWrflDnon_idleSteady02N", 0.01, "AidlPercMstpSrasWrflDnon_idleSteady03N", 0.01, "AidlPercMstpSrasWrflDnon_idleSteady04N", 0.01, "AidlPercMstpSrasWrflDnon05", 0.01, "AidlPercMstpSrasWrflDnon06", 0.01};
			InterpolateTo[] = {};
		};

		class AidlPercMstpSrasWrflDnon : AidlPercMstpSrasWrflDnon0S {
			ConnectTo[] = {"AmovPercMstpSlowWrflDnon", 0.02, "AidlPercMstpSrasWrflDnon_SaluteIn", 0.02, "AidlPercMstpSrasWrflDnon0S", 0.01, "AidlPercMstpSlowWrflDnon0S", 0.01};
			InterpolateTo[] = {"AmovPercMstpSra


import torch
import torch.fft

def fftshift(x, axes=None):
    """
    Similar to np.fft.fftshift but applies to PyTorch Tensors
    """
    assert torch.is_tensor(x) is True
    if axes is None:
        axes = tuple(range(x.ndim()))
        shift = [dim // 2 for dim in x.shape]
    elif isinstance(axes, int):
        shift = x.shape[axes] // 2
    else:
        shift = [x.shape[axis] // 2 for axis in axes]
    return torch.roll(x, shift, axes)

def ifftshift(x, axes=None):
    """
    Similar to np.fft.ifftshift but applies to PyTorch Tensors
    """
    assert torch.is_tensor(x) is True
    if axes is None:
        axes = tuple(range(x.ndim()))
        shift = [-(dim // 2) for dim in x.shape]
    elif isinstance(axes, int):
        shift = -(x.shape[axes] // 2)
    else:
        shift = [-(x.shape[axis] // 2) for axis in axes]
    return torch.roll(x, shift, axes)

def fft2(data):
    assert data.shape[-1] == 2
    data = torch.view_as_complex(data)
    data = torch.fft.fftn(data, dim=(-2, -1), norm='ortho')
    data = torch.view_as_real(data)
    data = fftshift(data, axes=(-3, -2))
    return data

def ifft2(data):
    assert data.shape[-1] == 2
    data = ifftshift(data, axes=(-3, -2))
    data = torch.view_as_complex(data)
    data = torch.fft.ifftn(data, dim=(-2, -1), norm='ortho')
    data = torch.view_as_real(data)
    return data

def rfft2(data):
    assert data.shape[-1] == 1
    data = torch.cat([data, torch.zeros_like(data)], dim=-1)
    data = fft2(data)
    return data

def rifft2(data):
    assert data.shape[-1] == 2
    data = ifft2(data)
    data = data[..., 0].unsqueeze(-1)
    return data

def rA(data, mask):
    assert data.shape[-1] == 1
    data = torch.cat([data, torch.zeros_like(data)], dim=-1)
    data = fft2(data) * mask
    return data

def rAt(data, mask):
    assert data.shape[-1] == 2
    data = ifft2(data * mask)
    data = data[..., 0].unsqueeze(-1)
    return data

def rAtA(data, mask):
    assert data.shape[-1] == 1
    data = torch.cat([data, torch.zeros_like(data)], dim=-1)
    data = fft2(data) * mask
    data = ifft2(data)
    data = data[..., 0].unsqueeze(-1)
    return data


   ["Min Rank Requirement"] = "0",
    ["MP"] = 0,
    ["MPR"] = 0,
    ["MPS"] = 0,
    ["MR"] = 0,
    ["MRI"] = 0,
    ["Name"] = LSTR("SKILLGROUP.DEVIL"),
    ["Quality"] = 6,
    ["Sell Price"] = 30000,
    ["SILR"] = 0,
    ["SKL"] = 0,
    ["STR"] = 0,
    ["Vitality"] = 0
  }
}


 = 'Jon';

// let length = name.length as number;
//よりベターな書き方
let length = (name as string).length;

//非推奨な書き方
// let length = (<string>name).length;

// length = 'fooo';
// Type 'string' is not assignable to type 'number'.

console.log(length);
import { Injectable } from "@angular/core";
import { Object3D } from "three";
import { ROAD_WIDTH, START_WIDTH } from "../../constants/trackConstant";
import { Car } from "../../car/car";
import { Track3dService } from "../../track/track3d.service";
import { Player } from "../player";
import { TimerService } from "../timer-service/timer.service";

const CAR_RADIUS: number = 2;
const TIMEOUT: number = 50;
const TWO: number = 2;
const CHECKPOINT_RADIUS: number = 50;

@Injectable()
export class LapCountingService {

  public constructor(public track3D: Track3dService, public timerService: TimerService) {
  }

  public startLapCounting( player: Player): void {
    if (!player.onStartingLine) {
      setTimeout(() => {
        this.startLapCounting(player);
      },         TIMEOUT);

      return;
    } else {
      player.completedLap++;
      if (player.completedLap > 1 && player.name === "Human Player") {
        this.timerService.resetLapTimer(player.lapTime);
      }
    }
    this.countCheckpoints(player);
  }

  private countCheckpoints(player: Player): void {
    if ( player.passedCheckpoint < this.track3D.checkpoints.length) {
      if (player.onCheckPoint !== player.passedCheckpoint) {
        setTimeout(() => {
          this.countCheckpoints(player);
        },         TIMEOUT);

        return;
      } else {
        player.passedCheckpoint++;
      }
      this.countCheckpoints(player);
    } else if ( player.passedCheckpoint === this.track3D.checkpoints.length) {
      player.passedCheckpoint = 0;
      this.startLapCounting(player);
    }
  }

  public verifyCheckpointIntersect(player: Player): void {
    for (let i: number = 0; i < this.track3D.checkpoints.length; i++) {
      if (this.intersectCheckPoint(player.car, this.track3D.checkpoints[i])) {
          player.onCheckPoint = i;
      }
    }
    player.onStartingLine = false;
    if (this.intersectStartingLine(player.car, this.track3D.getObjectByName("start"))) {
      player.onStartingLine = true;
    }
  }

  // https://stackoverflow.com/questions/401847/circle-rectangle-collision-detection-intersection
  public intersectStartingLine(car: Car, startingLine: Object3D): boolean {
    const circleDistanceX: number = Math.abs (car.carPosition.x - startingLine.position.x);
    const circleDistanceZ: number = Math.abs (car.carPosition.z - startingLine.position.z);

    if (circleDistanceZ > ROAD_WIDTH / TWO + CAR_RADIUS) { return false; }
    if (circleDistanceX > START_WIDTH / TWO + CAR_RADIUS) { return false; }

    if (circleDistanceZ <= (ROAD_WIDTH / TWO)) { return true; }
    if (circleDistanceX <= (START_WIDTH / TWO)) { return true; }

    const cornerDistance: number = Math.pow ((circleDistanceZ - ROAD_WIDTH / TWO), TWO) +
                                    Math.pow ((circleDistanceX - START_WIDTH / TWO), TWO);

    return (cornerDistance <= (Math.pow (CAR_RADIUS, TWO)));
  }


(fieldDescriptorId)
}/*
 * Lincheck
 *
 * Copyright (C) 2019 - 2025 JetBrains s.r.o.
 *
 * This Source Code Form is subject to the terms of the
 * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed
 * with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

package org.jetbrains.lincheck.util

/**
 * Represents a set of Java Development Kit (JDK) major versions since JDK 6.
 */
enum class JdkVersion {
    JDK_6, JDK_7, JDK_8, JDK_9, JDK_10, JDK_11, JDK_12, JDK_13, JDK_14, JDK_15,
    JDK_16, JDK_17, JDK_18, JDK_19, JDK_20, JDK_21, JDK_22, JDK_23, JDK_24, JDK_25;
    override fun toString(): String {
        return "jdk${name.removePrefix("JDK_")}"
    }
}

val DEFAULT_TEST_JDK_VERSION = JdkVersion.JDK_17

/**
 * Determines the current JDK version based on the `java.specification.version` system property.
 * If the system property indicates an unsupported JDK version, an error is thrown.
 */
val jdkVersion: JdkVersion = run {
    val jdkVersion = System.getProperty("java.specification.version")
    // java.specification.version is "1.x" for Java prior to 8 and "x" for the newer ones
    when {
        jdkVersion.startsWith("1.") ->
            when (jdkVersion.removePrefix("1.")) {
                "6" -> JdkVersion.JDK_6
                "7" -> JdkVersion.JDK_7
                "8" -> JdkVersion.JDK_8
                else -> error("Unsupported JDK version: $jdkVersion")
            }
        jdkVersion == "9"                       -> JdkVersion.JDK_9
        jdkVersion == "10"                      -> JdkVersion.JDK_10
        jdkVersion == "11"                      -> JdkVersion.JDK_11
        jdkVersion == "12"                      -> JdkVersion.JDK_12
        jdkVersion == "13"                      -> JdkVersion.JDK_13
        jdkVersion == "14"                      -> JdkVersion.JDK_14
        jdkVersion == "15"                      -> JdkVersion.JDK_15
        jdkVersion == "16"                      -> JdkVersion.JDK_16
        jdkVersion == "17"                      -> JdkVersion.JDK_17
        jdkVersion == "18"                      -> JdkVersion.JDK_18
        jdkVersion == "19"                      -> JdkVersion.JDK_19
        jdkVersion == "20"                      -> JdkVersion.JDK_20
        jdkVersion == "21"                      -> JdkVersion.JDK_21
        jdkVersion == "22"                      -> JdkVersion.JDK_22
        jdkVersion == "23"                      -> JdkVersion.JDK_23
        jdkVersion == "24"                      -> JdkVersion.JDK_24
        jdkVersion == "25"                      -> JdkVersion.JDK_25
        else ->
            error("Unsupported JDK version: $jdkVersion")
    }
}

/**
 * Indicates whether the current Java Development Kit (JDK) version is JDK 8.
 */
val isJdk8 = (jdkVersion == JdkVersion.JDK_8)
/*
 * Lincheck
 *
 * Copyright (C) 2019 - 2024 JetBrains s.r.o.
 *
 * This Source Code Form is subject to the terms of the
 * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed
 * with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

package org.jetbrains.lincheck.util

fun Boolean.ensureTrue(): Boolean {
    // TODO: add contracts?
    check(this == true)
    return this
}

fun Boolean.ensureFalse(): Boolean {
    // TODO: add contracts?
    check(this == false)
    return this
}

inline fun<T> T.ensure(predicate: (T) -> Boolean): T {
    // TODO:


接 时[，sqlite3_open()](https://www.sqlite.org/c3ref/open.html)接口及其同级接口 返回 SQLITE_CANTOPEN_SYMLINK 结果代码 。[](https://www.sqlite.org/c3ref/c_open_autoproxy.html)

### 【1555】

SQLITE_CONSTRAINT_PRIMARYKEY 错误代码是[SQLITE_CONSTRAINT](https://www.sqlite.org/rescode.html#constraint) 的[扩展错误代码](https://www.sqlite.org/rescode.html#pve)，指示[PRIMARY KEY 约束](https://www.sqlite.org/lang_createtable.html#primkeyconst)失败。[](https://www.sqlite.org/rescode.html#constraint)[](https://www.sqlite.org/lang_createtable.html#primkeyconst)

### 【1802】

SQLITE_IOERR_FSTAT 错误代码是[SQLITE_IOERR](https://www.sqlite.org/rescode.html#ioerr) 的[扩展错误代码](https://www.sqlite.org/rescode.html#pve)，指示在尝试对文件调用 fstat() （或等效函数）以确定文件大小或访问权限等信息时， [VFS](https://www.sqlite.org/vfs.html)层中出现 I/O 错误。[](https://www.sqlite.org/rescode.html#ioerr)[](https://www.sqlite.org/vfs.html)

### 【1811】

The SQLITE_CONSTRAINT_TRIGGER error code is an [extended error code](https://www.sqlite.org/rescode.html#pve) for [SQLITE_CONSTRAINT](https://www.sqlite.org/rescode.html#constraint) indicating that a [RAISE function](https://www.sqlite.org/lang_createtrigger.html#raise) within a [trigger](https://www.sqlite.org/lang_createtrigger.html) fired, causing the SQL statement to abort.

### (2058) SQLITE_IOERR_UNLOCK

The SQLITE_IOERR_UNLOCK error code is an [extended error code](https://www.sqlite.org/rescode.html#pve) for [SQLITE_IOERR](https://www.sqlite.org/rescode.html#ioerr) indicating an I/O error within xUnlock method on the [sqlite3_io_methods](https://www.sqlite.org/c3ref/io_methods.html) object.

### (2067) SQLITE_CONSTRAINT_UNIQUE

The SQLITE_CONSTRAINT_UNIQUE error code is an [extended error code](https://www.sqlite.org/rescode.html#pve) for [SQLITE_CONSTRAINT](https://www.sqlite.org/rescode.html#constraint) indicating that a [UNIQUE constraint](https://www.sqlite.org/lang_createtable.html#uniqueconst) failed.

### (2314) SQLITE_IOERR_RDLOCK

The SQLITE_IOERR_RDLOCK error code is an [extended error code](https://www.sqlite.org/rescode.html#pve) for [SQLITE_IOERR](https://www.sqlite.org/rescode.html#ioerr) indicating an I/O error within xLock method on the [sqlite3_io_methods](https://www.sqlite.org/c3ref/io_methods.html) object while trying to obtain a read lock.

### (2323) SQLITE_CONSTRAINT_VTAB

The SQLITE_CONSTRAINT_VTAB error code is not currently used by the SQLite core. However, this error code is available for use by application-defined [virtual tables](https://www.sqlite.org/vtab.html).

### (2570) SQLITE_IOERR_DELETE

The SQLITE_IOERR_DELETE error code is an [extended error code](https://www.sqlite.org/rescode.html#pve) for [SQLITE_IOERR](https://www.sqlite.org/rescode.html#ioerr) indicating an I/O error within xDelete method on the [sqlite3_vfs](https://www.sqlite.org/c


NoSuchMethodException, InstantiationException, IllegalAccessException {
//		Constructor<?> constructor = null;
//		Object instance = null;
//		try {
//			constructor = implementerClass.getConstructor(PageObject.class, ElementLocator.class, long.class);
//			instance = constructor.newInstance(page, locator, page.getImplicitWaitTimeout(), page.getWaitForTimeout());
//		}
//		catch (NoSuchMethodException e) {
//			try {
//				constructor = implementerClass.getConstructor(PageObject.class, ElementLocator.class, WebElement.class, long.class);
//				instance = constructor.newInstance(page, locator, null,  page.getImplicitWaitTimeout(), page.getWaitForTimeout());
//			}
//			catch (NoSuchMethodException e1) {
//				String className = implementerClass.getSimpleName();
//				throw new RuntimeException(String.format(NO_SUITABLE_CONSTRUCTOR_FOUND_FMT2, className, className));
//			}
//		}
//		return instance;

        Object instance = null;

        if (ElementContructorForm.applicableConstructor(implementerClass).isPresent()) {
            Constructor constructor = ElementContructorForm.applicableConstructorFrom(implementerClass).get();
            switch (ElementContructorForm.applicableConstructor((implementerClass)).get()) {
                case PAGE_LOCATOR_SINGLE_TIMEOUT:
                    instance = constructor.newInstance(page, locator, page.getImplicitWaitTimeout().toMillis());
                    break;
                case PAGE_LOCATOR_TWO_TIMEOUTS:
                    instance = constructor.newInstance(page, locator, page.getImplicitWaitTimeout().toMillis(), page.getWaitForTimeout().toMillis());
                    break;
                case PAGE_LOCATOR_ELEMENT_SINGLE_TIMEOUT:
                    instance = constructor.newInstance(page, locator, null, page.getImplicitWaitTimeout().toMillis());
                    break;
                case PAGE_LOCATOR_ELEMENT_TWO_TIMEOUTS:
                    instance = constructor.newInstance(page, locator, null, page.getImplicitWaitTimeout().toMillis(), page.getWaitForTimeout().toMillis());
                    break;
            }
        }
        return instance;
    }
}
package net.thucydides.core.annotations.locators;

import net.serenitybdd.core.annotations.findby.How;
import net.thucydides.core.annotations.findby.By;
import net.thucydides.core.annotations.findby.FindBy;
import org.openqa.selenium.support.ByIdOrName;
import org.openqa.selenium.support.FindBys;
import org.openqa.selenium.support.pagefactory.Annotations;

import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;

import static org.apache.commons.lang3.StringUtils.isNotEmpty;

public class SmartAnnotations extends Annotations {

    private Field field;

    public SmartAnnotations(Field field) {
        super(field);
        this.field = field;
    }

    protected void assertValidAnnotations() {
        FindBys findBys = field.getAnnotation(FindBys.class);
        FindBy myFindBy = field.getAnnotation(FindBy.class);
        if (findBys != null && myFindBy != null) {
            throw new IllegalArgumentException("If you use a '@FindBys' annotation, "
                    + "you must not also use a '@FindBy' annotation");
        }
    }

    //	@Override
    public org.openqa.selenium.By buildBy() {
        assertValidAnnotations();

        org.openqa.selenium.By ans = null;

        //default implementation in case if org.openqa.selenium.support.FindBy was used
        org.openqa.selenium.support.FindBy findBy =


r scope = this;

    var path = (this.path == '') ? LoaderUtils.extractUrlBase(url) : this.path;

    var loader = new FileLoader(this.manager);
    loader.setPath(this.path);
    loader.setRequestHeader(this.requestHeader);
    loader.setWithCredentials(this.withCredentials);

    loader.load(url, (text) {
      // try {

      if (onLoad != null) onLoad(scope.parse(text, path));

      // } catch ( e ) {

      // 	if ( onError != null ) {

      // 		onError( e );

      // 	} else {

      // 		print( e );

      // 	}

      // 	scope.manager.itemError( url );

      // }
    }, onProgress, onError);
  }

  setMaterialOptions(value) {
    this.materialOptions = value;
    return this;
  }

  /**
	 * Parses a MTL file.
	 *
	 * @param {String} text - Content of MTL file
	 * @return {MaterialCreator}
	 *
	 * @see setPath setResourcePath
	 *
	 * @note In order for relative texture references to resolve correctly
	 * you must call setResourcePath() explicitly prior to parse.
	 */
  parse(text, [String? path, Function? onLoad, Function? onError]) {
    var lines = text.split('\n');
    var info = {};
    var delimiter_pattern = RegExp(r"\s+");
    var materialsInfo = {};

    for (var i = 0; i < lines.length; i++) {
      var line = lines[i];
      line = line.trim();

      if (line.length == 0 || line[0] == '#') {
        // Blank line or comment ignore
        continue;
      }

      var pos = line.indexOf(' ');

      var key = (pos >= 0) ? line.substring(0, pos) : line;
      key = key.toLowerCase();

      String value = (pos >= 0) ? line.substring(pos + 1) : '';
      value = value.trim();

      if (key == 'newmtl') {
        // New material

        info = {"name": value};
        materialsInfo[value] = info;
      } else {
        if (key == 'ka' || key == 'kd' || key == 'ks' || key == 'ke') {
          var ss = value.split(delimiter_pattern);
          info[key] = [parseFloat(ss[0]), parseFloat(ss[1]), parseFloat(ss[2])];
        } else {
          info[key] = value;
        }
      }
    }

    var materialCreator = new MaterialCreator(
        this.resourcePath != "" ? this.resourcePath : path,
        this.materialOptions);
    materialCreator.setCrossOrigin(this.crossOrigin);
    materialCreator.setManager(this.manager);
    materialCreator.setMaterials(materialsInfo);
    return materialCreator;
  }
}

/**
 * Create a new MTLLoader.MaterialCreator
 * @param baseUrl - Url relative to which textures are loaded
 * @param options - Set of options on how to construct the materials
 *                  side: Which side to apply the material
 *                        FrontSide (default), THREE.BackSide, THREE.DoubleSide
 *                  wrap: What type of wrapping to apply for textures
 *                        RepeatWrapping (default), THREE.ClampToEdgeWrapping, THREE.MirroredRepeatWrapping
 *                  normalizeRGB: RGBs need to be normalized to 0-1 from 0-255
 *                                Default: false, assumed to be already normalized
 *                  ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's
 *                                  Default: false
 * @constructor
 */

class MaterialCreator {
  late String baseUrl;
  late Map<String, dynamic> options;
  late Map<String, dynamic


* javax.swing.UIManager}, using the key
   * “AbstractUndoableEdit.undoText”.  This
   * allows the text to be localized.
   */
  public String getUndoPresentationName()
  {
    String msg, pres;

    msg = UIManager.getString("AbstractUndoableEdit.undoText");
    if (msg == null)
      msg = UndoName;

    pres = getPresentationName();
    if ((pres == null) || (pres.length() == 0))
      return msg;
    else
      return msg + ' ' + pres;
  }

  /**
   * Calculates a localized name for presenting the redo action to the
   * user.
   *
   *
The default implementation returns the concatenation of the
   * string “Redo” and the action name, which is
   * determined by calling {@link #getPresentationName()}.
   *
   *
The string “Redo” is retrieved from the {@link
   * javax.swing.UIManager}, using the key
   * “AbstractUndoableEdit.redoText”.  This
   * allows the text to be localized.
   */
  public String getRedoPresentationName()
  {
    String msg, pres;

    msg = UIManager.getString("AbstractUndoableEdit.redoText");
    if (msg == null)
      msg = RedoName;

    pres = getPresentationName();
    if ((pres == null) || (pres.length() == 0))
      return msg;
    else
      return msg + ' ' + pres;
  }

  public String toString()
  {
    return super.toString()
      + " hasBeenDone: " + hasBeenDone
      + " alive: " + alive;
  }
}
/* EtchedBorder.java --
   Copyright (C) 2003 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package javax.swing.border;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;

/**
 * A border that looks like an engraving etched into the background
 * surface, or (in its raised variant) coming out of the surface
 * plane. Using different constructors, it is possible to either
 * explicitly specify the border colors, or to let


x48
	ldmia sp!, {r4, r5, r6, lr}
	bx lr

	arm_func_start ov13_02214A0C
ov13_02214A0C: ; 0x02214A0C
	stmdb sp!, {r4, r5, r6, r7, lr}
	sub sp, sp, #4
	mov r6, r0
	mov r5, r1
	mov r4, r2
	mov r1, r6
	mov r0, #0
	mov r2, #0x4c0
	bl MIi_CpuClear16
	mov r0, #0
	strb r0, [r6, #0x4b2]
	ldr r0, [r5, #0xc]
	mov r1, r6
	mov r2, #1
	bl ov13_02214958
	cmp r0, #0
	moveq r7, #1
	ldr r0, [r5, #0x10]
	mov r1, r6
	mov r2, #0
	movne r7, #0
	bl ov13_02214958
	cmp r0, #0
	moveq r0, #1
	movne r0, #0
	orrs r0, r7, r0
	beq _02214A90
	mov r3, #1
	mov r1, r6
	mov r0, #0
	mov r2, #0x220
	strb r3, [r6, #0x4b2]
	bl MIi_CpuClearFast
_02214A90:
	ldr r0, [r5, #0x14]
	cmp r4, #0
	str r0, [r6, #0x4b8]
	beq _02214AB0
	mov r0, r4
	add r1, r6, #0x220
	mov r2, #0x16
	bl MIi_CpuCopy16
_02214AB0:
	ldrb r0, [r5, #0x18]
	strb r0, [r6, #0x236]
	ldr r0, [r5, #4]
	bl ov13_022148AC
	mov r2, r0, lsl #0x11
	ldr r0, [r5, #4]
	add r1, r6, #0x238
	mov r2, r2, lsr #0x10
	bl MIi_CpuCopy16
	ldr r0, [r5, #8]
	add r1, r6, #0x298
	mov r2, #0xc0
	bl MIi_CpuCopy16
	mov r1, #1
	strb r1, [r6, #0x358]
	add r0, r6, #0x300
	strh r1, [r0, #0x5a]
	add r0, r6, #0x400
	strh r1, [r0, #0xb0]
	add sp, sp, #4
	ldmia sp!, {r4, r5, r6, r7, lr}
	bx lr

	arm_func_start ov13_02214B08
ov13_02214B08: ; 0x02214B08
	stmdb sp!, {lr}
	sub sp, sp, #4
	cmp r1, #2
	addeq sp, sp, #4
	ldmeqia sp!, {lr}
	bxeq lr
	cmp r1, #0
	addeq sp, sp, #4
	ldmeqia sp!, {lr}
	bxeq lr
	ldr r2, _02214B5C ; =0x02240AF8
	strh r0, [sp]
	ldr r0, [r2]
	strh r1, [sp, #2]
	ldr r2, [r0, #0x51c]
	add r1, sp, #0
	mov r0, #0xff
	blx r2
	add sp, sp, #4
	ldmia sp!, {


buggerStepThrough]
    public readonly struct ArgumentInfo<TType>
    {
      /// <summary>
      /// Initializes a new instance of the <see cref="ArgumentInfo{TType}" /> struct.
      /// </summary>
      /// <param name="value">The value.</param>
      /// <param name="name">The name.</param>
      public ArgumentInfo(TType value, string name)
      {
        Value = value;
        Name = name;
      }

      /// <summary>
      /// Gets the value.
      /// </summary>
      public TType Value { get; }

      /// <summary>
      /// Gets the name.
      /// </summary>
      public string Name { get; }

      /// <summary>
      /// Checks whether the argument has a value or not.
      /// </summary>
      /// <returns>True if the argument has a value; otherwise, false.</returns>
      public bool HasValue()
      {
        return !Equals(default(TType), Value);
      }
    }
  }
}


3 28.7 64 64 64h576c35.3 0 64-28.7 64-64V128c0-35.3-28.7-64-64-64zM512 824c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40z")),t.TagFill=l("tag",o,s(i,"M938 458.8l-29.6-312.6c-1.5-16.2-14.4-29-30.6-30.6L565.2 86h-.4c-3.2 0-5.7 1-7.6 2.9L88.9 557.2a9.96 9.96 0 0 0 0 14.1l363.8 363.8c1.9 1.9 4.4 2.9 7.1 2.9s5.2-1 7.1-2.9l468.3-468.3c2-2.1 3-5 2.8-8zM699 387c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64z")),t.TagsFill=l("tags",o,s(i,"M483.2 790.3L861.4 412c1.7-1.7 2.5-4 2.3-6.3l-25.5-301.4c-.7-7.8-6.8-13.9-14.6-14.6L522.2 64.3c-2.3-.2-4.7.6-6.3 2.3L137.7 444.8a8.03 8.03 0 0 0 0 11.3l334.2 334.2c3.1 3.2 8.2 3.2 11.3 0zm122.7-533.4c18.7-18.7 49.1-18.7 67.9 0 18.7 18.7 18.7 49.1 0 67.9-18.7 18.7-49.1 18.7-67.9 0-18.7-18.7-18.7-49.1 0-67.9zm283.8 282.9l-39.6-39.5a8.03 8.03 0 0 0-11.3 0l-362 361.3-237.6-237a8.03 8.03 0 0 0-11.3 0l-39.6 39.5a8.03 8.03 0 0 0 0 11.3l243.2 242.8 39.6 39.5c3.1 3.1 8.2 3.1 11.3 0l407.3-406.6c3.1-3.1 3.1-8.2 0-11.3z")),t.TaobaoCircleFill=l("taobao-circle",o,s(i,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zM315.7 291.5c27.3 0 49.5 22.1 49.5 49.4s-22.1 49.4-49.5 49.4a49.4 49.4 0 1 1 0-98.8zM366.9 578c-13.6 42.3-10.2 26.7-64.4 144.5l-78.5-49s87.7-79.8 105.6-116.2c19.2-38.4-21.1-58.9-21.1-58.9l-60.2-37.5 32.7-50.2c45.4 33.7 48.7 36.6 79.2 67.2 23.8 23.9 20.7 56.8 6.7 100.1zm427.2 55c-15.3 143.8-202.4 90.3-202.4 90.3l10.2-41.1 43.3 9.3c80 5 72.3-64.9 72.3-64.9V423


的主题就是关于Monad，还不是很了解这个概念的可以去他博客看看，或者找视频学习学习。）Promise就是一个盒子里面封装了一堆操作，then对应的就是一组flatmap或map操作。不过缺点也还是有，如果网络用的AFNetWorking，网络请求很有可能会回调多次，这时用PromiseKit，就需要自己封装一个属于自己的promise了。PromiseKit原生的是用的OMGHTTPURLRQ这个网络框架。PromiseKit里面自带的封装的网络请求也还是基于NSURLConnection的。所以用了AFNetWorking的同学，要想再优雅的处理掉网络请求引起的回调地狱的时候，自己还是需要先封装一个自己的Promise，然后优雅的then一下。很多人可能看到这里，觉得我引入一个框架，本来是来解决问题的，但是现在还需要我再次封装才能解决问题，有点不值得。

我自己的看法是，PromiseKit是个解决异步问题很优秀的一个开源库，尤其是解决回调嵌套，回调地狱的问题，效果非常明显。虽然需要自己封装AFNetWorking的promise，但是它的思想非常值得我们学习的！这也是接下来第二篇想和大家一起分享的内容，利用promise的思想，自己来优雅的处理回调地狱！这一篇PromiseKit先分享到这里。

如有错误，还请大家请多多指教。

> GitHub Repo：[Halfrost-Field](https://github.com/halfrost/Halfrost-Field)
>
> Follow: [halfrost · GitHub](https://github.com/halfrost)
>
> Source: [https://halfrost.com/ios\_callback\_hell\_promisekit/](https://halfrost.com/ios_callback_hell_promisekit/)# [124. Binary Tree Maximum Path Sum](https://leetcode.com/problems/binary-tree-maximum-path-sum/)

## 题目

Given a **non-empty** binary tree, find the maximum path sum.

For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path must contain **at least one node** and does not need to go through the root.

**Example 1:**

    Input: [1,2,3]

           1
          / \
         2   3

    Output: 6

**Example 2:**

    Input: [-10,9,20,null,null,15,7]

       -10
       / \
      9  20
        /  \
       15   7

    Output: 42

## 题目大意

给定一个非空二叉树，返回其最大路径和。本题中，路径被定义为一条从树中任意节点出发，达到任意节点的序列。该路径至少包含一个节点，且不一定经过根节点。

## 解题思路

- 给出一个二叉树，要求找一条路径使得路径的和是最大的。
- 这一题思路比较简单，递归维护最大值即可。不过需要比较的对象比较多。`maxPathSum(root) = max(maxPathSum(root.Left), maxPathSum(root.Right), maxPathSumFrom(


程*/
    SYNCHRO_MATERIAL_CUSTOM = 237,
    /**不能做超量素材*/
    CANNOT_BE_XYZ_MATERIAL = 238,
    /**不能做连接素材*/
    CANNOT_BE_LINK_MATERIAL = 239,
    /**做同调素材时的等级*/
    SYNCHRO_LEVEL = 240,
    /**做仪式祭品时的等级*/
    RITUAL_LEVEL = 241,
    /**做超量素材时的等级*/
    XYZ_LEVEL = 242,
    /**在墓地当做仪式祭品*/
    EXTRA_RITUAL_MATERIAL = 243,
    /**同时当作调整以外的怪兽（幻影王 幽骑）*/
    NONTUNER = 244,
    /**代替去除超量素材*/
    OVERLAY_REMOVE_REPLACE = 245,
    /**废铁奇美拉*/
    SCRAP_CHIMERA = 246,
    /**调弦之魔术师超量素材限制*/
    TUNE_MAGICIAN_X = 247,
    /**调弦之魔术师融合素材限制*/
    //TUNE_MAGICIAN_F	=248
    /**可存取怪獸的各項數值(Card.AddMonsterAttribute()專用)*/
    PRE_MONSTER = 250,
    /**检查素材*/
    MATERIAL_CHECK = 251,
    /**无效区域（扰乱王等）*/
    DISABLE_FIELD = 260,
    /**怪兽区域封锁*/
    USE_EXTRA_MZONE = 261,
    /**魔法区域封锁*/
    USE_EXTRA_SZONE = 262,
    /**怪獸区格數上限*/
    MAX_MZONE = 263,
    /**魔陷区格數上限*/
    MAX_SZONE = 264,
    /**必须使用怪兽区的格子*/
    MUST_USE_MZONE = 265,
    /**手牌数量限制*/
    HAND_LIMIT = 270,
    /**抽卡阶段的抽卡数*/
    DRAW_COUNT = 271,
    /**灵魂怪兽不返回手牌*/
    SPIRIT_DONOT_RETURN = 280,
    /**灵魂怪兽可以不返回手牌*/
    SPIRIT_MAYNOT_RETURN = 281,
    /**改变场地*/
    CHANGE_ENVIRONMENT = 290,
    /**王家长眠之谷*/
    NECRO_VALLEY = 291,
    /**不能Play(禁止令)*/
    FORBIDDEN = 292,
    /**不受「王家长眠之谷」的影响*/
    NECRO_VALLEY_IM = 293,
    /**翻转卡组*/
    REVERSE_DECK = 294,
    /**洗脑解除*/
    REMOVE_BRAINWASHING = 295,
    /**2次战斗阶段*/
    BP_TWICE = 296,
    /**場上只能存在1張(Card.SetUniqueOnField()專用)*/
    UNIQUE_CHECK = 297,
    /**Match胜利(胜利龙)*/
    MATCH_KILL = 300,
    /**基因组斗士*/
    SYNCHRO_CHECK = 310,
    /**对方回合从自己手卡发动（失乐的圣


DeleteArr);
    });
  });
}

// firestoreからwhereを使用して、比較する配列が10個以上の場合にドキュメントを取得する関数
// whereでINを使用しているドキュメントの取得
export async function getDocumentByArraysIn<T>(
  arr: string[],
  getQuery: (batch: string[]) => firebaseApp.firestore.Query<firebaseApp.firestore.DocumentData>
): Promise<T[]> {
  // eslint-disable-next-line consistent-return
  return new Promise((resolve) => {
    if (!arr) return resolve([]);

    const spliceArr = [...arr];
    const batches = [];

    while (spliceArr.length) {
      const batch = spliceArr.splice(0, 10);

      batches.push(
        // eslint-disable-next-line no-shadow
        new Promise<T[]>((resolve) => {
          // eslint-disable-next-line no-void
          void getQuery(batch)
            .get()
            .then((results) => {
              const profiles = results.docs.map((result) => ({
                ...(result.data() as T),
                docId: result.id,
              }));
              resolve(profiles);
            });
        })
      );
    }

    // eslint-disable-next-line no-void
    void Promise.all(batches).then((content) => {
      resolve(content.flat());
    });
  });
}

// おすすめのユーザーを取得
export async function getSuggestedProfiles(userId: string, following: string[], maker: string): Promise<responceUserData[]> {
  const collectionPath = firebase.firestore().collection('users');
  let result;
  let profiles;

  if (following.length > 0) {
    const ids = [...following, userId];

    if (ids.length > 10) {
      const getQuery = (batch: string[]) => collectionPath.where('userId', 'not-in', batch).where('maker', '==', maker).limit(100);
      profiles = await getDocumentByArrays(ids, getQuery);
    } else {
      result = await collectionPath
        .where('userId', 'not-in', [...following, userId])
        .where('maker', '==', maker)
        .limit(15)
        .get();

      profiles = result.docs.map((user) => ({
        ...(user.data() as responceUserData),
        docId: user.id,
      }));
    }
  } else {
    result = await collectionPath.where('userId', '!=', userId).where('maker', '==', maker).limit(15).get();

    profiles = result.docs.map((user) => ({
      ...(user.data() as responceUserData),
      docId: user.id,
    }));
  }

  const gettedProfileIds = profiles.map((user) => user.userId);

  if (profiles.length < 15) {
    let addIds;
    let addProfiles;
    if (following.length > 0) {
      addIds = [...following, userId, ...gettedProfileIds];
      const getQuery = (batch: string[]) => collectionPath.where('userId', 'not-in', batch).limit(100);
      addProfiles = await getDocumentByArrays(addIds, getQuery);
    } else {
      addIds = [userId, ...gettedProfileIds];
      const getQuery = (batch: string[]) => collectionPath.where('userId', 'not-in', batch).limit(100);
      addProfiles = await getDocumentByArrays(addIds, getQuery);
    }
    addProfiles.slice(0, result || result !== undefined ? 15 - result.docs.length : 0);
    const sumProfiles = [...addProfiles, ...profiles];
    sumProfiles.sort((a, b) => b.dateCreated - a.dateCreated);

    return sumProfiles;
    // eslin


hlinks">

	作词	夕野ヨシミ

	原曲
感情の摩天楼　～ Cosmic Mind

东方星莲船　～ Undefined Fantastic Object.

12	夏の終わりにワンチャン狙う程度の能力	04:39

	编曲	D.watt

	演唱	岩杉夏，<a href="/index.php?title=%E3%82%A4%E3%82%B6%E3%83%99%E3%83%AB&action=edit&redlink=1" class


t can
  /// be used to, for instance, populate default data from an asset. Note that
  /// migrations might behave differently when populating the database this way.
  /// For instance, a database created by an [creator] will not receive the
  /// [MigrationStrategy.onCreate] callback because it hasn't been created by
  /// moor.
  FlutterQueryExecutor.inDatabaseFolder(
      {required String path,
      bool? logStatements,
      bool singleInstance = true,
      DatabaseCreator? creator})
      : super(
            _SqfliteDelegate(true, path,
                singleInstance: singleInstance, creator: creator),
            logStatements: logStatements);

  /// The underlying sqflite [s.Database] object used by moor to send queries.
  ///
  /// Using the sqflite database can cause unexpected behavior in moor. For
  /// instance, stream queries won't update for updates sent to the [s.Database]
  /// directly.
  /// For this reason, projects shouldn't use this getter unless they absolutely
  /// need to. The database is exposed to make migrating from sqflite to moor
  /// easier.
  ///
  /// Note that this returns null until the moor database has been opened.
  /// A moor database is opened lazily when the first query runs.
  s.Database? get sqfliteDb {
    final sqfliteDelegate = delegate as _SqfliteDelegate;
    return sqfliteDelegate.isOpen ? sqfliteDelegate.db : null;
  }

  @override
  // We're not really required to be sequential since sqflite has an internal
  // lock to bring statements into a sequential order.
  // Setting isSequential here helps with moor cancellations in stream queries
  // though.
  bool get isSequential => true;
}
import 'dart:js_interop';
import 'dart:js_interop_unsafe';

import 'package:drift/wasm.dart';
import 'package:web/web.dart';

void main() async {
  window.setProperty(
      'start_compat_check'.toJS,
      () {
        Future(() async {
          final btn = document.querySelector('#drift-compat-btn')!;
          final results =
              document.querySelector('#drift-compat-results') as HTMLElement;

          btn.attributes['disabled'] = 'true'.toJS;
          results.innerText = '';

          try {
            final db = await WasmDatabase.open(
              databaseName: 'test_db',
              // These URLs need to be absolute because we're serving this JS file
              // under `/web`.
              sqlite3Uri: Uri.parse('/sqlite3.wasm'),
              driftWorkerUri: Uri.parse('/drift_worker.dart.js'),
            );

            results.innerText += '''
Chosen implementation: ${db.chosenImplementation}
Features missing: ${db.missingFeatures}
''';
            await db.resolvedExecutor.close();
          } catch (e, s) {
            results.innerText += 'Error: $e, Trace: \n$s';
          } finally {
            btn.attributes['disabled'] = 'false'.toJS;
          }
        });
      }.toJS);
}
import 'dart:async';
import 'dart:io';

import 'package:drift/drift.dart';
import 'package:drift/native.dart';

import 'dart_api/manager.dart';

// #docregion class
class LogInterceptor extends QueryInterceptor {
  Future<T> _run<T>(
      String description, FutureOr<T> Function() operation) async {
    final stopwatch = Stopwatch()..start();
    print('Running $description');

    try {
      final result = await operation();
      print(' => succeeded after ${stopwatch.elapsedMilliseconds}ms');
      return result;
    } on Object catch (e) {
      print(' => failed after ${stopwatch.elapsedMilliseconds}ms ($e)');
      rethrow;
    }
  }

  @override
  TransactionExecutor beginTransaction(QueryExecutor parent) {


:30:03.970933+00:00","deleted-at":null,"created-at":"2018-10-29T05:48:51.873067+00:00","subtitle":null,"audio-url":null,"ends-at":"2019-03-14T13:00:00+00:00","level":"Beginner","submitted-at":null,"state":"rejected","short-abstract":"
Get hands-on experience with deploying Serverless functions.

In this tutorial we will first look at the available offerings

Cloud providers (AWS Lambda, Google Cloud Functions, Azure Functions, IBM Cloud Functions)

Open Source tools (Serverless.com, Chalice)

Open Source Frameworks (OpenFaaS, OpenWhisk, ...)

We will then create our own functions using one cloud provider (AWS Lambda) and also one open source framework (OpenFaaS).

Attendees will need to use their own AWS account (only requires free tier).

Access to OpenFaaS cloud will be provided.
","signup-url":null,"starts-at":"2019-03-14T12:00:00+00:00","average-rating":null,"language":null,"video-url":null,"slides-url":"https://mjbright.github.io/Talks/2018-Oct-07_Pyconfr_Serverless/","is-mail-sent":false,"title":"Serverless tutorial","comments":"
Based on previous Serverless talks at OSS Europe (2017), DevConf (2018, 2019), FOSS Asia (2018), Pyconf (2018), PyParis (2018) this will be the first time this will be run as a Tutorial session.

","is-locked":false,"id":"4880"},{"complex-field-values":null,"long-abstract":null,"last-modified-at":"2020-04-15T10:19:02.394060+00:00","deleted-at":null,"created-at":"2018-10-29T05:06:21.911997+00:00","subtitle":null,"audio-url":null,"ends-at":"2019-03-16T17:30:00+00:00","level":"Intermediate","submitted-at":"2018-12-29T13:59:40.714000+00:00","state":"confirmed","short-abstract":"
Tutorial session demonstrating the evolution of a software monolith to microservice implementation running on Kubernetes.

We'll look at various design patterns (Strangler, API Gateway, Ingress, Service Mesh, Hybrid app) & operational practicalities of rolling out service upgrades to a Machine Learning app.

Attendees will learn about real Kubernetes use cases supported by *visual* demonstrations showing what's going on at each step to explain the concepts.
","signup-url":null,"starts-at":"2019-03-16T16:45:00+00:00","average-rating":null,"language":null,"video-url":"https://youtu.be/zavjh89thLU","slides-url":"https://mjbright.github.io/Talks/2018-Oct-07-PyConfr-PythonMicroservicesWithKubernetes/","is-mail-sent":false,"title":"From Monolith to Micro-services with Kubernetes","comments":"
Based on successful delivery at CodeEurope (Warsaw and Wroclaw in Poland, Apr 2018) and Pyconf (Lille in France, Oct 2018) extended to new use cases and more complete visualization.

see blog post based on initial Apr 2018 session:

https://medium.com/@mjbrightfr/kubernetes-visualization-at-codeeurope-pl-e53e192dd910

<


prom(value)) AS value FROM instance_cpu_time_ns WHERE time >= '2023-01-06T06:55:00Z' AND time <= '2023-01-06T07:00:00Z' GROUP BY app, proc) WHERE time >= '2023-01-06T06:55:00Z' AND time <= '2023-01-06T07:00:00Z'`),
			wantErr: false,
		},
		{
			name: "26",
			fields: fields{
				Start:    &startTime2,
				End:      &endTime2,
				Step:     step,
				DataType: GRAPH_DATA,
			},
			args: args{
				expr: ParseExpr(`topk(3, sum by (app, proc) (rate(instance_cpu_time_ns[5m])))`),
			},
			want:    parseInfluxqlByYacc(`SELECT top(value, 3) AS value, *::tag FROM (SELECT sum(rate_prom(value)) AS value FROM instance_cpu_time_ns WHERE time >= '2023-01-06T03:55:00Z' AND time <= '2023-01-06T07:00:00Z' GROUP BY app, proc, time(1m, 0s) fill(none)) WHERE time >= '2023-01-06T03:55:00Z' AND time <= '2023-01-06T07:00:00Z' GROUP BY time(1m, 0s) fill(none)`),
			wantErr: false,
		},
		{
			name: "27",
			fields: fields{
				Start:    &startTime2,
				End:      &endTime2,
				Step:     step,
				DataType: GRAPH_DATA,
			},
			args: args{
				expr: ParseExpr(`sum by(group) (http_requests @ 3000.000)`),
			},
			want:    parseInfluxqlByYacc(`SELECT sum(value) AS value FROM http_requests WHERE time >= '1970-01-01T00:45:00Z' AND time <= '1970-01-01T00:50:00Z' GROUP BY "group", time(1m,0s) fill(none)`),
			wantErr: false,
		},
		{
			name: "28",
			fields: fields{
				Start:    &startTime2,
				End:      &endTime2,
				Step:     step,
				DataType: GRAPH_DATA,
			},
			args: args{
				expr: ParseExpr(`avg((3<round(http_requests/60000)<2880)) by (tenantid,envname)`),
			},
			want:    parseInfluxqlByYacc(`SELECT mean(value) AS value FROM (SELECT value AS value FROM (SELECT round_prom((value / 60000)) AS value FROM http_requests WHERE time >= '2023-01-06T03:55:00Z' AND time <= '2023-01-06T07:00:00Z' GROUP BY *) WHERE 3 < value AND time >= '2023-01-06T03:55:00Z' AND time <= '2023-01-06T07:00:00Z' GROUP BY *) WHERE value < 2880 AND time >= '2023-01-06T03:55:00Z' AND time <= '2023-01-06T07:00:00Z' GROUP BY tenantid, envname, time(1m, 0s) fill(none)`),
			wantErr: false,
		},
		{
			name: "29",
			fields: fields{
				Start:    &startTime2,
				End:      &endTime2,
				Step:     step,
				DataType: GRAPH_DATA,
			},
			args: args{

				expr: ParseExpr(`count({__name__="down"} ) by (job)`),
			},
			want:    parseInfluxqlByYacc(`SELECT count_prom(value) AS value FROM down WHERE time >= '2023-01-06T03:55:00Z' AND time <= '2023-01-06T07:00:00Z' GROUP BY job, time(1m, 0s) fill(none)`),
			wantErr: false,
		},
		{
			name: "30",
			fields: fields{


ont-size: 2pt; padding-top: 2.5pt; padding-bottom: 2.5pt;">
Mark Brazeal, Chief Legal Officer

		</


	}

	public NeptusEdgeElement<?>[] getSelectedEdges(boolean includeReferredElements) {
		LinkedHashMap<String, NeptusEdgeElement<?>> selectedElements = new LinkedHashMap<String, NeptusEdgeElement<?>>();

		for (NeptusGraphElement<?> elem : selection) {

			if (elem instanceof NeptusNodeElement && includeReferredElements) {
				NeptusNodeElement<?> node = (NeptusNodeElement<?>) elem;

				selectedElements.putAll(node.getIncomingEdges());
				selectedElements.putAll(node.getOutgoingEdges());
			}

			if (elem instanceof NeptusEdgeElement) {
				selectedElements.put(elem.getID(), (NeptusEdgeElement<?>)elem);
			}
		}

		return selectedElements.values().toArray(new NeptusEdgeElement<?>[] {});
	}

	public NeptusNodeElement[] getSelectedNodes() {

		Vector<NeptusNodeElement> selectedNodes = new Vector<NeptusNodeElement>();

		for (NeptusGraphElement<?> elem : selection) {
			if (elem instanceof NeptusNodeElement) {
				selectedNodes.add((NeptusNodeElement<?>)elem);
			}
		}

		return selectedNodes.toArray(new NeptusNodeElement[] {});
	}

	private void removeSelection() {

		undoSupport.postEdit(new RemoveSelectionEdit(this));

		for (NeptusGraphElement<?> elem : selection) {

			if (elem instanceof NeptusNodeElement && nodes.containsKey(elem.getID())) {
				removeNode(elem.getID());
			}
			if (elem instanceof NeptusEdgeElement && edges.containsKey(elem.getID())) {
				removeEdge(elem.getID());
			}
		}

		selection.clear();
		repaint();
	}

	/**
	 * Removes a node from this graph
	 * @param id The id of the node to be removed
	 */
	public Vector<NeptusEdgeElement> removeNode(String id) {
		Vector<NeptusEdgeElement> edgesToBeRemoved = new Vector<NeptusEdgeElement>();
		for (NeptusEdgeElement<?> edge : edges.values()) {
			if (edge.getTargetNodeID().equals(id)) {
				if (!edgesToBeRemoved.contains(edge))
					edgesToBeRemoved.add(edge);

			}
			if (edge.getSourceNodeID().equals(id)) {
				if (!edgesToBeRemoved.contains(edge))
					edgesToBeRemoved.add(edge);
			}
		}
		for (NeptusEdgeElement<?> edge : edgesToBeRemoved) {
			edge.setSelected(false);
			removeEdge(edge.getID());
		}

		NeptusNodeElement<?> node = nodes.get(id);

		if (node != null)
			nodes.remove(id);

		node.setSelected(false);

		repaint();

		return edgesToBeRemoved;
	}

	/**
	 * Removes an existing edge
	 * @param id The id of the edge to be removed
	 */
	public void removeEdge(String id) {
		NeptusEdgeElement<?> edge = edges.get(id);

		if (edge == null)
			return;

		if (selection.contains(edge)) {
			edge.setSelected(false);
		}

		if (nodes.get(edge.getSourceNodeID()) != null) {
			nodes.get(edge.getSourceNodeID()).removeOutgoingEdge(edge);
		}

		if (nodes.get(edge.getTargetNodeID()) != null) {
			nodes.get(edge.getTargetNodeID()).removeIncomingEdge(edge);
		}

		edges.remove(id);
	}

	public void mouseDragged(MouseEvent arg0) {

		if (!isEditable())
			return;

		if (selection.isEmpty())
			return;

		if (arg0.getPoint().getX() < 0 ||arg0.ge


101FD],
          [0x1D165, 0x1D169],
          [0x1D16D, 0x1D172],
          [0x1D17B, 0x1D18B],
          [0x1D1AA, 0x1D1AD],
          [0x1D242, 0x1D244]
        ])
      )
    )
  }

  /**
   * Generate a random basic multilingual plane character
   */
  static unicodeBMP () {
    return String.fromCodePoint(
      random.range(0x0000, 0xFFFF)
    )
  }

  /**
   * Generate a random supplementary multilingual plane character
   */
  static unicodeSMP () {
    return String.fromCodePoint(
      random.range(
        ...random.item([
          [0x10000, 0x13FFF],
          [0x16000, 0x16FFF],
          [0x1B000, 0x1BFFF],
          [0x1D000, 0x1DFFF],
          [0x1F000, 0x1FFFF]
        ])
      )
    )
  }

  /**
   * Generate a random supplementary ideographic plane character
   */
  static unicodeSIP () {
    return String.fromCodePoint(
      random.range(
        ...random.item([
          [0x20000, 0x2BFFF],
          [0x2F000, 0x2FFFF]
        ])
      )
    )
  }

  /**
   * Generate a random supplementary special-purpose plane character
   */
  static unicodeSSP () {
    return String.fromCodePoint(
      random.range(0xE0000, 0xE0FFF)
    )
  }

  static currency () {
    return random.pick([
      // https://en.wikipedia.org/wiki/ISO_4217
      'USD', 'USS', 'USN', 'EUR', 'CHF', 'GBP', 'XAG', 'XBA', 'XBB', 'XBC',
      'XBD', 'XSU', 'XTS', 'XXX'
    ])
  }

  static fromBlocks (set, maxlen) {
    let s = ''

    for (let i = 0; i < random.number(maxlen || 255); i++) {
      s += random.pick(set)
    }

    return s
  }

  static quotedString () {
    return utils.common.quote(text.any())
  }

  /**
   * Wrapper for all text generators
   * @returns {string}
   */
  static random () {
    return random.choose([
      [1, text.alpha],
      [1, text.alphanum],
      [1, text.arithmeticOperator],
      [1, text.assignmentOperator],
      [1, text.controlChar],
      [1, text.digit],
      [1, text.lineEnd],
      [1, text.token],
      [3, text.layoutCharCodes],
      [3, text.bidiCharCodes],
      [3, text.unicodeCombiningCharacter],
      [3, text.unicodeBMP],
      [3, text.unicodeSMP],
      [3, text.unicodeSIP],
      [3, text.unicodeSSP]
    ])
  }

  /**
   * Generate a single character
   */
  static character () {
    return text.random().charAt(0)
  }

  /**
   * Generate string comprised of random generators
   */
  static any () {
    let s = ''
    let len = random.range(1, 126)

    while (len--) {
      s += make.text.random()
    }

    return s
  }
}

module.exports = text

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.

/* global MersenneTwister19937, Utils */

var Random = {
  twister: null,

  init: function (seed) {
    if (seed == null || seed === undefined) {
      seed = new Date().getTime();


OUTINE',
      details: 'Eius quisquam tempora neque.',
      created_at: '2004-06-15T00:00:00',
    },
    {
      id: 25,
      animal_id: 168,
      type: 'EMERGENCY',
      details: 'Adipisci voluptatem porro etincidunt non.',
      created_at: '2009-11-01T00:00:00',
    },
    {
      id: 26,
      animal_id: 156,
      type: 'RETURN',
      details: 'Modi sit tempora magnam.',
      created_at: '2017-12-27T00:00:00',
    },
    {
      id: 27,
      animal_id: 90,
      type: 'EMERGENCY',
      details: 'Ipsum etincidunt sit quisquam.',
      created_at: '2007-10-07T00:00:00',
    },
    {
      id: 28,
      animal_id: 175,
      type: 'VACCINE',
      details: 'Ipsum sed adipisci ipsum adipisci amet.',
      created_at: '2001-10-14T00:00:00',
    },
    {
      id: 29,
      animal_id: 187,
      type: 'EMERGENCY',
      details: 'Eius porro aliquam modi neque ipsum velit tempora.',
      created_at: '2006-06-21T00:00:00',
    },
    {
      id: 30,
      animal_id: 70,
      type: 'RETURN',
      details: 'Sed ipsum modi adipisci.',
      created_at: '2014-08-28T00:00:00',
    },
    {
      id: 31,
      animal_id: 65,
      type: 'ROUTINE',
      details: 'Ipsum est eius aliquam.',
      created_at: '2006-10-02T00:00:00',
    },
    {
      id: 32,
      animal_id: 78,
      type: 'VACCINE',
      details: 'Porro quisquam porro aliquam amet.',
      created_at: '2009-02-11T00:00:00',
    },
    {
      id: 33,
      animal_id: 138,
      type: 'RETURN',
      details: 'Tempora quaerat modi adipisci magnam.',
      created_at: '2004-08-03T00:00:00',
    },
    {
      id: 34,
      animal_id: 108,
      type: 'RETURN',
      details: 'Amet quisquam quisquam modi sit.',
      created_at: '2003-01-24T00:00:00',
    },
    {
      id: 35,
      animal_id: 104,
      type: 'ROUTINE',
      details: 'Labore adipisci ut voluptatem quiquia modi.',
      created_at: '2014-07-23T00:00:00',
    },
    {
      id: 36,
      animal_id: 16,
      type: 'EMERGENCY',
      details: 'Non ut ut est etincidunt tempora amet modi.',
      created_at: '2002-06-24T00:00:00',
    },
    {
      id: 37,
      animal_id: 187,
      type: 'ROUTINE',
      details:
        'Consectetur dolorem porro quisquam sed tempora quiquia consectetur.',
      created_at: '2013-12-15T00:00:00',
    },
    {
      id: 38,
      animal_id: 181,
      type: 'VACCINE',
      details: 'Dolorem dolor neque sit modi ut porro.',
      created_at: '2002-11-29T00:00:00',
    },
    {
      id: 39,
      animal_id: 132,
      type: 'ROUTINE',


yment/deploymentInDepth/jnlp.html">Java 网络启动协议

    JNLP 文件的结构

部署最佳实践

    减少下载时间

    避免不必要的更新检查

    确保 JRE 软件的存在

    问题和练习：深入部署

部署自包含的应用程序

打包自包含应用程序的先决条件

转换现有应用程序

使用文件关联

    添加外部库

    提供默认参数

    为所有平台使用通用构建文件

使用多个入口点

问题和练习：自包含的应用程序

JAR 文件中的打包程序

使用 JAR 文件：基础知识

    创建 JAR 文件

    查看 JAR 文件的内容

    提取 JAR 文件的内容

    更新 JAR 文件

    运行 JAR 打包的软件

使用清单文件：基础知识

    理解默认清单

    修改清单文件

    设置应


cs() {
        Ok(v) => return Ok(v),
        Err(err) if err.kind() == std::io::ErrorKind::PermissionDenied => (),
        Err(err) => return Err(err),
    }
    get_wsl_vmid_by_reg()
}
<gh_stars>1-10
#[doc = r"Value read from the register"]
pub struct R {
    bits: u8,
}
#[doc = r"Value to write to the register"]
pub struct W {
    bits: u8,
}
impl super::TXCSRL6 {
    #[doc = r"Modifies the contents of the register"]
    #[inline(always)]
    pub fn modify<F>(&self, f: F)
    where
        for<'w> F: FnOnce(&R, &'w mut W) -> &'w mut W,
    {
        let bits = self.register.get();
        self.register.set(f(&R { bits }, &mut W { bits }).bits);
    }
    #[doc = r"Reads the contents of the register"]
    #[inline(always)]
    pub fn read(&self) -> R {
        R {
            bits: self.register.get(),
        }
    }
    #[doc = r"Writes to the register"]
    #[inline(always)]
    pub fn write<F>(&self, f: F)
    where
        F: FnOnce(&mut W) -> &mut W,
    {
        self.register.set(
            f(&mut W {
                bits: Self::reset_value(),
            })
            .bits,
        );
    }
    #[doc = r"Reset value of the register"]
    #[inline(always)]
    pub const fn reset_value() -> u8 {
        0
    }
    #[doc = r"Writes the reset value to the register"]
    #[inline(always)]
    pub fn reset(&self) {
        self.register.set(Self::reset_value())
    }
}
#[doc = r"Value of the field"]
pub struct USB_TXCSRL6_TXRDYR {
    bits: bool,
}
impl USB_TXCSRL6_TXRDYR {
    #[doc = r"Value of the field as raw bits"]
    #[inline(always)]
    pub fn bit(&self) -> bool {
        self.bits
    }
    #[doc = r"Returns `true` if the bit is clear (0)"]
    #[inline(always)]
    pub fn bit_is_clear(&self) -> bool {
        !self.bit()
    }
    #[doc = r"Returns `true` if the bit is set (1)"]
    #[inline(always)]
    pub fn bit_is_set(&self) -> bool {
        self.bit()
    }
}
#[doc = r"Proxy"]
pub struct _USB_TXCSRL6_TXRDYW<'a> {
    w: &'a mut W,
}
impl<'a> _USB_TXCSRL6_TXRDYW<'a> {
    #[doc = r"Sets the field bit"]
    #[inline(always)]
    pub fn set_bit(self) -> &'a mut W {
        self.bit(true)
    }
    #[doc = r"Clears the field bit"]
    #[inline(always)]
    pub fn clear_bit(self) -> &'a mut W {
        self.bit(false)
    }
    #[doc = r"Writes raw bits to the field"]
    #[inline(always)]
    pub fn bit(self, value: bool) -> &'a mut W {
        self.w.bits &= !(1 << 0);
        self.w.bits |= ((value as u8) & 1) << 0;
        self.w
    }
}
#[doc = r"Value of the field"]
pub struct USB_TXCSRL6_FIFONER {


// Copyright (c) 2014 Stanislas Polu. All rights reserved.
// See the LICENSE file.

#ifndef THRUST_SHELL_API_API_H_
#define THRUST_SHELL_API_API_H_

#include <map>

#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/callback.h"

namespace base {
class Thread;
class Value;
class DictionaryValue;
}

namespace thrust_shell {

class APIBinding;
class APIBindingFactory;
class APIBindingRemote;

// ## API
//
// This objects reprensents the ThrustShell API. It lives on the Browser UI thread
// and is used by object there as well as the APIServer.
class API {
public:
  typedef base::Callback<void(const std::string& error,
                              scoped_ptr<base::DictionaryValue> result)> MethodCallback;
  typedef base::Callback<void(scoped_ptr<base::DictionaryValue> event)> EventCallback;

  /****************************************************************************/
  /* PUBLIC INTERFACE */
  /****************************************************************************/
  API();
  virtual ~API();

  static API* Get();

  // ### InstallBinding
  //
  // Installs a new binding for the API
  void InstallBinding(const std::string& type,
                      APIBindingFactory* factory);

  // ### Create
  //
  // Creates a new object and return its `_target` id
  int Create(const std::string type,
             scoped_ptr<base::DictionaryValue> args);

  // ### Delete
  //
  // Deletes the object designated by the target passed
  void Delete(unsigned int target);

  // ### CallMethod
  //
  // Call the method specified on the objcet represented by the provided target
  // id. The result of the call is returnd asynchronously to the callback.
  void CallMethod(unsigned int target,
                  std::string method,
                  scoped_ptr<base::DictionaryValue> args,
                  const API::MethodCallback& callback);

  // ### SetRemote
  //
  // Sets the remote for a given biding represented by its target id. The Remote
  // is not owned by the API and should be nullified on deletion
  void SetRemote(unsigned int target,
                 APIBindingRemote* remote);

  // ### GetBinding
  //
  // Retrieves a binding based on its id
  APIBinding* GetBinding(unsigned int target);

  // ### GetRemote
  //
  // Retrieves a remote binding for this id
  APIBindingRemote* GetRemote(unsigned int target);

private:
  /****************************************************************************/
  /* PRIVATE INTERFACE */
  /****************************************************************************/

  static API*                                         self_;
  unsigned int                                        next_binding_id_;

  std::map<std::string, APIBindingFactory*>           factories_;
  std::map<unsigned int, scoped_refptr<APIBinding> >  bindings_;
  std::map<unsigned int, APIBindingRemote*>           remotes_;
};

} // namespace thrust_shell

#endif // THRUST_SHELL_API_API_H_


Edit_GetConstraints(AObj: usize) -> usize;
  pub fn MaskEdit_SetConstraints(AObj: usize, AValue: usize);
  pub fn MaskEdit_GetDoubleBuffered(AObj: usize) -> bool;
  pub fn MaskEdit_SetDoubleBuffered(AObj: usize, AValue: bool);
  pub fn MaskEdit_GetDragCursor(AObj: usize) -> TCursor;
  pub fn MaskEdit_SetDragCursor(AObj: usize, AValue: TCursor);
  pub fn MaskEdit_GetDragKind(AObj: usize) -> TDragKind;
  pub fn MaskEdit_SetDragKind(AObj: usize, AValue: TDragKind);
  pub fn MaskEdit_GetDragMode(AObj: usize) -> TDragMode;
  pub fn MaskEdit_SetDragMode(AObj: usize, AValue: TDragMode);
  pub fn MaskEdit_GetEnabled(AObj: usize) -> bool;
  pub fn MaskEdit_SetEnabled(AObj: usize, AValue: bool);
  pub fn MaskEdit_GetFont(AObj: usize) -> usize;
  pub fn MaskEdit_SetFont(AObj: usize, AValue: usize);
  pub fn MaskEdit_GetMaxLength(AObj: usize) -> i32;
  pub fn MaskEdit_SetMaxLength(AObj: usize, AValue: i32);
  pub fn MaskEdit_GetParentColor(AObj: usize) -> bool;
  pub fn MaskEdit_SetParentColor(AObj: usize, AValue: bool);
  pub fn MaskEdit_GetParentDoubleBuffered(AObj: usize) -> bool;
  pub fn MaskEdit_SetParentDoubleBuffered(AObj: usize, AValue: bool);
  pub fn MaskEdit_GetParentFont(AObj: usize) -> bool;
  pub fn MaskEdit_SetParentFont(AObj: usize, AValue: bool);
  pub fn MaskEdit_GetParentShowHint(AObj: usize) -> bool;
  pub fn MaskEdit_SetParentShowHint(AObj: usize, AValue: bool);
  pub fn MaskEdit_GetPasswordChar(AObj: usize) -> Char;
  pub fn MaskEdit_SetPasswordChar(AObj: usize, AValue: Char);
  pub fn MaskEdit_GetPopupMenu(AObj: usize) -> usize;
  pub fn MaskEdit_SetPopupMenu(AObj: usize, AValue: usize);
  pub fn MaskEdit_GetReadOnly(AObj: usize) -> bool;
  pub fn MaskEdit_SetReadOnly(AObj: usize, AValue: bool);
  pub fn MaskEdit_GetShowHint(AObj: usize) -> bool;
  pub fn MaskEdit_SetShowHint(AObj: usize, AValue: bool);
  pub fn MaskEdit_GetTabOrder(AObj: usize) -> TTabOrder;
  pub fn MaskEdit_SetTabOrder(AObj: usize, AValue: TTabOrder);
  pub fn MaskEdit_GetTabStop(AObj: usize) -> bool;
  pub fn MaskEdit_SetTabStop(AObj: usize, AValue: bool);
  pub fn MaskEdit_GetText(AObj: usize) -> *const c_char;
  pub fn MaskEdit_SetText(AObj: usize, AValue: *const c_char);
  pub fn MaskEdit_GetTextHint(AObj: usize) -> *const c_char;
  pub fn MaskEdit_SetTextHint(AObj: usize, AValue: *const c_char);
  pub fn MaskEdit_GetVisible(AObj: usize) -> bool;
  pub fn MaskEdit_SetVisible(AObj: usize, AValue: bool);
  pub fn MaskEdit_SetOnChange(AObj: usize, AEventId: usize);
  pub fn MaskEdit_SetOnClick(AObj: usize, AEventId: usize);
  pub fn MaskEdit_SetOnDblClick(AObj: usize,


ng;
    cancelled:boolean;

    safeURL:any; // only on client side

    isImage() {
        if (this.name.toLowerCase().includes(".jpg")
         || this.name.toLowerCase().includes(".jpeg")
         || this.name.toLowerCase().includes(".png")) {
            return true;
        } else {
            return false;
        }
    }

    constructor(_json:Object) {
//        console.dir(_json);
        // console.log("in Country construtor");
        super(_json);
        this.pathFromDataDir = _json['pathFromDataDir']; // path a file (including the )
        this.name = _json['name']; // name of the file when uploaded (just the name, not the path)
        this.cancelled = _json['cancelled'];
    }

}

import { IOrderCondition } from "../request";
import { ESort } from "../request/query.enum";
import { ISort } from "./ISort";

export interface ITableBase {
  /**
   * 列头显示文字
   */
  title?: string;
  /**
   * 对应列内容的字段名
   */
  key?: string;
  /**
   * 插槽
   */
  slot?: string;
}
export interface ITbaleStyle {
  /**
   * 列宽
   */
  width?: number;
  /**
   * 最大列宽
   */
  maxWidth?: number;
  /**
   * 最小列宽
   */
  minWidth?: number;
  /**
   * 对齐方式，可选值为 left 左对齐、right 右对齐和 center 居中对齐
   */
  align?: string;
  /**
   * 列是否固定在左侧或者右侧，可选值为 left 左侧和 right 右侧
   */
  fixed?: string;
  /**
   * 开启后，文本将不换行，超出部分显示为省略号
   */
  ellipsis?: boolean;
  /**
   * 使用 slot 自定义列时，列的渲染模式。可选值为 block、inline、inline-block，当使用树形数据时，建议使用 inline 或 inline-block
   */
  display?: string;
}
/**
 * iview 结构
 */
export interface ITableColumn extends ITableBase, ITbaleStyle {
  /**
   * 开启后，文本将不换行，超出部分显示为省略号，并用 Tooltip 组件显示完整内容
   */
  tooltip?: boolean;
  /**
   * 列类型，可选值为 index、selection、expand、html
   */
  type?: string;
  /**
   * 列的样式名称
   */
  className?: string;
  /**
   * 对应列是否可以排序，如果设置为 custom，则代表用户希望远程排序，需要监听 Table 的 on-sort-change 事件
   */
  sortable?: boolean | string;
  /**
   * 该列是否允许拖拽调整宽度，需开启 border 属性，且设置 width
   */
  resizable?: boolean;
  /**
   *
   */
  render?: Function;
  /**
   * 指定该列为显示展开/收起图标，树形数据时使用
   */
  tree?: boolean;
  /**
   * 表头分组
   */
  children?: Array<ITableColumn>;
  /**
   * 数据过滤的选项是否多选
   */
  filterMultiple?: boolean;

  /**
   * 自定义排序
   */
   sorted?:ISort;

}
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
      name: 'sqrt'
})
export class SqrtPipe implements PipeTransform {
      // The actual logic for the pipe is put in a function called transform on the class, like so:
      // reference https://codecraft.tv/courses/angular/pipes/custom-pipes/
      transform(val: number): number {
            return Math.sqrt(val);
      }
}
import * as Gtk from '../Gtk';
export declare interface FontSelectionDialog extends


3666135219], [956.0, 0.6065430038652124], [957.0, 0.4220313078754927], [958.0, 0.9308039406401107], [959.0, 0.6989708173221061], [960.0, 0.32781512567277105], [961.0, 0.0883225731120838], [962.0, -0.14955178290001125], [963.0, -0.010998847875802298], [964.0, 0.025642772957826798], [965.0, -0.09159743236622298], [966.0, -0.03073929218102789], [967.0, 0.3948150129696586], [968.0, 0.22405132658675697], [969.0, 0.2939096067610336], [970.0, 0.31196493109126777], [971.0, -0.18034255060118554], [972.0, -0.40829338646855007], [973.0, -0.18113492912244045], [974.0, 0.035721770895967175], [975.0, -0.08370753971797207], [976.0, 0.09363926761709074], [977.0, 0.08990658517185324], [978.0, 0.2973055542383385], [979.0, 0.19854467785935626], [980.0, 0.0764666809511807], [981.0, 0.2145661811709978], [982.0, 0.07738762229814], [983.0, 0.11659566182917658], [984.0, 0.2344783207591714], [985.0, 0.036295484819887314], [986.0, 0.25953045686673093], [987.0, 0.09947882232148864], [988.0, 0.07747831894266266], [989.0, -0.10378533810130186], [990.0, -0.2992543503192877], [991.0, -0.3826608067903834], [992.0, -0.3313009331594259], [993.0, -0.41983607368880627], [994.0, -0.1576292106256787], [995.0, -0.11376605609300583], [996.0, -0.11142693730305453], [997.0, 0.06529086684928398], [998.0, 0.07744797315310414], [999.0, 0.0868395667045796]]}});
            })
         });
}
</script>


, editor_name2);

		for (var i = 0; i < changes.length; ++i) {
			var change = changes[i];

			if (!this.settings.sidebar && !this._is_change_in_view(vp, change)) {
				// if the change is outside the viewport, skip
				delete change['lhs-y-start'];
				delete change['lhs-y-end'];
				delete change['rhs-y-start'];
				delete change['rhs-y-end'];
				continue;
			}
			var llf = change['lhs-line-from'] >= 0 ? change['lhs-line-from'] : 0;
			var llt = change['lhs-line-to'] >= 0 ? change['lhs-line-to'] : 0;
			var rlf = change['rhs-line-from'] >= 0 ? change['rhs-line-from'] : 0;
			var rlt = change['rhs-line-to'] >= 0 ? change['rhs-line-to'] : 0;

			var ls, le, rs, re, tls, tle, lhseh, lhssh, rhssh, rhseh;
			if (this.editor[editor_name1].getOption('lineWrapping') || this.editor[editor_name2].getOption('lineWrapping')) {
				// If using line-wrapping, we must get the height of the line
				tls = this.editor[editor_name1].cursorCoords({line: llf, ch: 0}, 'page');
				lhssh = this.editor[editor_name1].getLineHandle(llf);
				ls = { top: tls.top, bottom: tls.top + lhssh.height };

				tle = this.editor[editor_name1].cursorCoords({line: llt, ch: 0}, 'page');
				lhseh = this.editor[editor_name1].getLineHandle(llt);
				le = { top: tle.top, bottom: tle.top + lhseh.height };

				tls = this.editor[editor_name2].cursorCoords({line: rlf, ch: 0}, 'page');
				rhssh = this.editor[editor_name2].getLineHandle(rlf);
				rs = { top: tls.top, bottom: tls.top + rhssh.height };

				tle = this.editor[editor_name2].cursorCoords({line: rlt, ch: 0}, 'page');
				rhseh = this.editor[editor_name2].getLineHandle(rlt);
				re = { top: tle.top, bottom: tle.top + rhseh.height };
			}
			else {
				// If not using line-wrapping, we can calculate the line position
				ls = {
					top: lhschc.top + llf * this.em_height,
					bottom: lhschc.bottom + llf * this.em_height + 2
				};
				le = {
					top: lhschc.top + llt * this.em_height,
					bottom: lhschc.bottom + llt * this.em_height + 2
				};
				rs = {
					top: rhschc.top + rlf * this.em_height,
					bottom: rhschc.bottom + rlf * this.em_height + 2
				};
				re = {
					top: rhschc.top + rlt * this.em_height,
					bottom: rhschc.bottom + rlt * this.em_height + 2
				};
			}

			if (change['op'] == 'a') {
				// adds (right), normally start from the end of the lhs,
				// except for the case when the start of the rhs is 0
				if (rlf > 0) {
					ls.top = ls.bottom;
					ls.bottom += this.em_height;
					le = ls;
				}
			}
			else if (change['op'] == 'd') {
				// deletes (left) normally finish from the end of the rhs,
				// except for the case when the start o


.btn-effect-4:hover, .btn.btn-effect-4:focus {
	box-shadow: 0 0.5em 0.5em -0.4em var(--hover);
	transform: translateY(-0.25em);
}

.btn.btn-effect-5 {
	transition: 0.25s;
}

.btn.btn-effect-5:hover, .btn.btn-effect-5:focus {
	box-shadow: inset 0 -3.25em 0 0 var(--hover);
}

.btn.btn-effect-6 {
	transition: 0.25s;
}

.btn.btn-effect-6:hover, .btn.btn-effect-6:focus {
	box-shadow: inset 6.5em 0 0 0 var(--hover);
}

.btn.btn-effect-7 {
	position: relative;
}

.btn.btn-effect-7:before {
	background: var(--hover);
	content: "";
	display: block;
	width: 100%;
	height: 100%;
	margin: auto;
	position: absolute;
	top: 0;
	left: 0;
	bottom: 0;
	right: 0;
	z-index: 0;
	transition: transform 0.2s cubic-bezier(0.4, 0.3, 0.35, 0.9) 0s;
	transform: scaleX(0);
	transform-origin: right center;
}

.btn.btn-effect-7:hover:before, .btn.btn-effect-7:focus:before {
	transform: scale(1);
	transform-origin: left center;
}

.btn.btn-effect-7 span {
	position: relative;
	z-index: 1;
}

@keyframes btn-pulse {
	0% {
		box-shadow: 0 0 0 0 var(--hover);
	}
}

/* Close */
.btn-close:focus {
	box-shadow: none;
}

/* Pagination */
.pagination {
	position: relative;
	z-index: 1;
}

.pagination > li > a,
.pagination > li > span,
.pagination > li > a:hover,
.pagination > li > span:hover,
.pagination > li > a:focus,
.pagination > li > span:focus {
	color: var(--grey-500);
	box-shadow: none !important;
}

.pagination > .active > a,
.pagination > .active > span,
.pagination > .active > a:hover,
.pagination > .active > span:hover,
.pagination > .active > a:focus,
.pagination > .active > span:focus {
	background-color: var(--grey-500);
	border-color: var(--grey-500);
	box-shadow: none !important;
}

.pagination.pagination-rounded .page-item {
	margin-right: .5rem;
}

.pagination.pagination-rounded .page-item:last-child {
	margin-right: 0;
}

.pagination.pagination-rounded .page-link {
	border-radius: 50% !important;
	padding: 0;
	width: 30px;
	text-align: center;
	height: 30px;
	line-height: 30px;
}

.pagination.pagination-rounded.pagination-md .page-link {
	padding: 0;
	width: 40px;
	text-align: center;
	height: 40px;
	line-height: 40px;
	font-size: 1rem;
}

.pagination.pagination-rounded.pagination-lg .page-link {
	padding: 0;
	width: 60px;
	text-align: center;
	height: 60px;
	line-height: 60px;
}

/* Pagination - Skin */
.pagination > a,
.pagination > a:hover,
.pagination > a:focus,
.pagination > li > a,
.pagination > li > span,
.pagination > li > a:hover,
.pagination > li > span:hover,
.pagination > li > a:focus


 usually host provides special functionality to specify config variables, but if it does not, create `.env.production` file and specify all config variables using template above. Then created, execute `npm run start:prod` which will lauch app using `node`.

> **❗Disclamer**: Do not forget to remove `google-credentials.json` from `.gitignore` when deploying your application.

#### Migrations

> Since you DB is not synchronized with server in production, for safety reasons, DB tables wont be automaticaly created on app lauch, so you'll need to use migrations. Execute `npm run migration:generate --name=<migration name>` in root directory of project to create migration.

**⚠do not forget to remove all tables from database before generating migration**

> **❗Disclamer**: `--name` parameter in `npm run migration:*` commands is supported only on Linux in form it is in repo, if you want to make it available on Windows, go to `package.json` and change `$npm_config_name` in all commands to be `%npm_config_name%`, this will allow parameter to work on Windows but not on Linux `¯\_(ツ)_/¯`.

> **❗Also disclamer**: some hosts (if you use app in production) which use PostgreSQL as DB as require special options in `orm.config.ts` to work with migrations. If you will see something like `FATAL: no pg_hba.conf entry for host`, just to to `orm.config.ts` and uncomment these lines:

```json
    "extra": {
       "ssl": {
         "require": true,
         "rejectUnauthorized": false,
       },
  }
```

> then run `npm run migration:run` on your production environment to execute migration.

## Cron

> For reloading customs info from sheet i use `cron`. Period is set in `.env` config files using special `cron` notation. You can formulate yours using [Cron Guru](https://crontab.guru/)website and change it as you wish.

## Interraction

#### Query filtering and sorting

##### Routes

> All `findMany`(those to select objects at all or by some criteria) routes API support special feature `quering`.That means that you can controll count and view of documents route returns.

- example: `http://127.0.0.1:3000/api/v1/customs/?fields=code,name,price&sort=-price&limit=3&page=1`
  Here:
- fields = use `fields` parameter to select only defined fields in each of returned documents.
- sort - use `sort` parameter to sort by any field of Post model `sort=field`. Order of sorting is regulated by `-` at the beginning of `field` what means `reversed`.
- limit - use `limit` parameter to limit the number of posts to be returned.
- page - use `page` to divide returned docs into groups(size of group defined by `limit`).
- Any other fields will be considered as 'filters' , you can user them by passing `field[operator]=value`.

#### Comparison Operators

> We need some how compare values from db with ones we provide. For that there is special notation.

- `[gt]` - greater than value(Number fields)
- `[lt]` - less than value(Number fields)
- `[gte]` - greater that or equal to value(Number fields)
- `[lte]` - less than or equal to value(Number fields)
- `[eq]` - equals
- `[matchesInsensitive]` - checks if provided value is in string field case insensitive
- `[matchesSensitive]` - checks if provided value is in string field case sensitive
- `[containAll]` - checks if array db field contains all values provided in `value`
- `[containedBy]` - checks every value from array field is values provided in `value`
- nothing means `equals`, example `field=value`

#### Creating categories

> One of the most important features of app is to creat


a_

寒松社（同人社团，周边社团） - 한송사 ，于 2022 年成立，主要制作 周边 的中国大陆同人社团，主催是 键山家的逸仙号，近藤莉子，长谷川米沙，当前状态为 活动

## 社团简介

寒松社是立足于中国大陆，致力于促进中韩东方爱好者与东方同人创作交流的社团。其活动内容包括但不限于开展同人制品的交换和组织各种交流活动。

## 成员名单

 **主催**  ：键山家的逸仙号、近藤莉子、长谷川米沙

 **外联**  ：键山家的逸仙号、近藤莉子、zake

 **财务**  ：布拉格的玻璃

 **物流**  ：长谷川米沙

 **代理**  ：悠然、Karjala_RJ、肥皂

 **翻译**  ：Ian vesa（店长）、Ibisa

 **顾问**  ：云霞、Pak长、toufu、ranju、INK

## 作品列表

## 参展信息

活动页面	活动名称	日期	举办地点	摊位编号	宣传页面	备注

魅知幻想博览会#9	魅知幻想博览会 博丽神主特别场	2024-02-03	上海市虹口区沙泾路10号 1933老场坊1号楼4楼空中舞台	U-2

哈尔滨THO#2	哈尔滨THO02